async def _onTeleSyn(self, link, mesg): reply = ('tele:syn', { 'vers': self.televers, 'retn': (True, None), }) try: vers = mesg[1].get('vers') if vers[0] != s_telepath.televers[0]: raise s_exc.BadMesgVers(vers=vers, myvers=s_telepath.televers) path = () name = mesg[1].get('name') if not name: name = '*' if '/' in name: name, rest = name.split('/', 1) if rest: path = rest.split('/') item = self.shared.get(name) if item is None: raise s_exc.NoSuchName(name=name) sess = await Sess.anit() async def sessfini(): self.sessions.pop(sess.iden, None) sess.onfini(sessfini) link.onfini(sess.fini) self.sessions[sess.iden] = sess sess.conninfo = link.getAddrInfo() link.set('sess', sess) if isinstance(item, s_telepath.Aware): item = await s_coro.ornot(item.getTeleApi, link, mesg, path) if isinstance(item, s_base.Base): link.onfini(item) reply[1]['sharinfo'] = s_reflect.getShareInfo(item) sess.setSessItem(None, item) reply[1]['sess'] = sess.iden except Exception as e: logger.exception('tele:syn error') reply[1]['retn'] = s_common.retnexc(e) await link.tx(reply)
async def _onTeleSyn(self, link, mesg): reply = ('tele:syn', { 'vers': self.televers, 'retn': (True, None), }) try: vers = mesg[1].get('vers') if vers[0] != s_telepath.televers[0]: raise s_exc.BadMesgVers(vers=vers, myvers=s_telepath.televers) name = mesg[1].get('name') item = self.shared.get(name) # allow a telepath aware object a shot at dynamic share names if item is None and name.find('/') != -1: path = name.split('/') base = self.shared.get(path[0]) if base is not None and isinstance(base, s_telepath.Aware): item = await s_coro.ornot(base.onTeleOpen, link, path) if item is None: raise s_exc.NoSuchName(name=name) sess = await Sess.anit() async def sessfini(): self.sessions.pop(sess.iden, None) sess.onfini(sessfini) link.onfini(sess.fini) self.sessions[sess.iden] = sess link.set('sess', sess) if isinstance(item, s_telepath.Aware): item = await s_coro.ornot(item.getTeleApi, link, mesg) if isinstance(item, s_base.Base): link.onfini(item.fini) sess.setSessItem(None, item) reply[1]['sess'] = sess.iden except Exception as e: logger.exception('tele:syn error') reply[1]['retn'] = s_common.retnexc(e) await link.tx(reply)
async def handshake(self, auth=None): mesg = ('tele:syn', { 'auth': auth, 'vers': televers, 'name': self.name, }) await self.link.tx(mesg) self.synack = await self.link.rx() if self.synack is None: mesg = 'socket closed by server before handshake' raise s_exc.LinkShutDown(mesg=mesg) self.sess = self.synack[1].get('sess') self.sharinfo = self.synack[1].get('sharinfo', {}) self.methinfo = self.sharinfo.get('meths', {}) vers = self.synack[1].get('vers') if vers[0] != televers[0]: raise s_exc.BadMesgVers(myver=televers, hisver=vers) async def rxloop(): while not self.link.isfini: mesg = await self.link.rx() if mesg is None: return try: func = self.handlers.get(mesg[0]) if func is None: logger.warning('Proxy.rxloop: Invalid Message: %r' % (mesg, )) return await func(mesg) except asyncio.CancelledError: # pragma: no cover raise except Exception: logger.exception('Proxy.rxloop for %r' % (mesg, )) retn = self.synack[1].get('retn') valu = s_common.result(retn) self.schedCoro(rxloop()) return valu