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) 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 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.fini) 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 _onTaskV2Init(self, link, mesg): # t2:init is used by the pool sockets on the client name = mesg[1].get('name') sidn = mesg[1].get('sess') todo = mesg[1].get('todo') try: if sidn is None or todo is None: raise s_exc.NoSuchObj(name=name) sess = self.sessions.get(sidn) if sess is None: raise s_exc.NoSuchObj(name=name) item = sess.getSessItem(name) if item is None: raise s_exc.NoSuchObj(name=name) s_scope.set('sess', sess) # TODO set user.... methname, args, kwargs = todo if methname[0] == '_': raise s_exc.NoSuchMeth(name=methname) meth = getattr(item, methname, None) if meth is None: logger.warning(f'{item!r} has no method: {methname}') raise s_exc.NoSuchMeth(name=methname) valu = meth(*args, **kwargs) if s_coro.iscoro(valu): valu = await valu try: if isinstance(valu, types.AsyncGeneratorType): desc = 'async generator' await link.tx(('t2:genr', {})) async for item in valu: await link.tx(('t2:yield', {'retn': (True, item)})) await link.tx(('t2:yield', {'retn': None})) return elif isinstance(valu, types.GeneratorType): desc = 'generator' await link.tx(('t2:genr', {})) for item in valu: await link.tx(('t2:yield', {'retn': (True, item)})) await link.tx(('t2:yield', {'retn': None})) return except Exception as e: logger.exception(f'error during {desc} task: {methname}') if not link.isfini: retn = s_common.retnexc(e) await link.tx(('t2:yield', {'retn': retn})) return if isinstance(valu, s_share.Share): sess.onfini(valu) iden = s_common.guid() sess.setSessItem(iden, valu) info = s_reflect.getShareInfo(valu) await link.tx(('t2:share', {'iden': iden, 'sharinfo': info})) return await link.tx(('t2:fini', {'retn': (True, valu)})) except Exception as e: logger.exception('on t2:init: %r' % (mesg,)) if not link.isfini: retn = s_common.retnexc(e) await link.tx(('t2:fini', {'retn': retn}))
async def t2call(link, meth, args, kwargs): ''' Call the given ``meth(*args, **kwargs)`` and handle the response to provide telepath task v2 events to the given link. ''' try: valu = meth(*args, **kwargs) if s_coro.iscoro(valu): valu = await valu try: first = True if isinstance(valu, types.AsyncGeneratorType): async for item in valu: if first: await link.tx(('t2:genr', {})) first = False await link.tx(('t2:yield', {'retn': (True, item)})) if first: await link.tx(('t2:genr', {})) await link.tx(('t2:yield', {'retn': None})) return elif isinstance(valu, types.GeneratorType): for item in valu: if first: await link.tx(('t2:genr', {})) first = False await link.tx(('t2:yield', {'retn': (True, item)})) if first: await link.tx(('t2:genr', {})) await link.tx(('t2:yield', {'retn': None})) return except s_exc.DmonSpawn as e: context = e.__context__ if context: if not isinstance(context, asyncio.CancelledError): logger.error('Error during DmonSpawn call: %r', context) await link.fini() return except (asyncio.CancelledError, Exception) as e: if isinstance(e, asyncio.CancelledError): logger.info('t2call task %s cancelled', meth.__name__) else: logger.exception('error during task %s', meth.__name__) if isinstance(valu, types.AsyncGeneratorType): await valu.aclose() elif isinstance(valu, types.GeneratorType): valu.close() if not link.isfini: if first: await link.tx(('t2:genr', {})) retn = s_common.retnexc(e) await link.tx(('t2:yield', {'retn': retn})) return if isinstance(valu, s_share.Share): info = s_reflect.getShareInfo(valu) await link.tx(('t2:share', {'iden': valu.iden, 'sharinfo': info})) return valu await link.tx(('t2:fini', {'retn': (True, valu)})) except s_exc.DmonSpawn as e: context = e.__context__ if context: logger.error('Error during DmonSpawn call: %r', context) await link.fini() return except (asyncio.CancelledError, Exception) as e: logger.exception('error during task: %s', meth.__name__) if not link.isfini: retn = s_common.retnexc(e) await link.tx(('t2:fini', {'retn': retn}))
async def _onTaskV2Init(self, link, mesg): # t2:init is used by the pool sockets on the client name = mesg[1].get('name') sidn = mesg[1].get('sess') todo = mesg[1].get('todo') try: if sidn is None or todo is None: raise s_exc.NoSuchObj(name=name) sess = self.sessions.get(sidn) if sess is None: raise s_exc.NoSuchObj(name=name) item = sess.getSessItem(name) if item is None: raise s_exc.NoSuchObj(name=name) s_scope.set('sess', sess) # TODO set user.... methname, args, kwargs = todo if methname[0] == '_': raise s_exc.NoSuchMeth(name=methname) meth = getattr(item, methname, None) if meth is None: logger.warning(f'{item!r} has no method: {methname}') raise s_exc.NoSuchMeth(name=methname) valu = meth(*args, **kwargs) if s_coro.iscoro(valu): valu = await valu try: if isinstance(valu, types.AsyncGeneratorType): desc = 'async generator' await link.tx(('t2:genr', {})) async for item in valu: await link.tx(('t2:yield', {'retn': (True, item)})) await link.tx(('t2:yield', {'retn': None})) return elif isinstance(valu, types.GeneratorType): desc = 'generator' await link.tx(('t2:genr', {})) for item in valu: await link.tx(('t2:yield', {'retn': (True, item)})) await link.tx(('t2:yield', {'retn': None})) return except Exception as e: logger.exception(f'error during {desc} task: {methname}') if not link.isfini: retn = s_common.retnexc(e) await link.tx(('t2:yield', {'retn': retn})) return if isinstance(valu, s_share.Share): sess.onfini(valu) info = s_reflect.getShareInfo(valu) await link.tx(('t2:share', { 'iden': valu.iden, 'sharinfo': info })) return await link.tx(('t2:fini', {'retn': (True, valu)})) except Exception as e: logger.exception('on t2:init: %r' % (mesg, )) if not link.isfini: retn = s_common.retnexc(e) await link.tx(('t2:fini', {'retn': retn}))