def getDmonCore(self): ''' Context manager to make a ram:/// cortex which has test models loaded into it and shared via daemon. Yields: s_cores_common.Cortex: A proxy object to the Ram backed cortex with test models. ''' dmon = s_daemon.Daemon() core = s_cortex.openurl('ram:///') self.addTstForms(core) link = dmon.listen('tcp://127.0.0.1:0/') dmon.share('core00', core) port = link[1].get('port') prox = s_telepath.openurl('tcp://127.0.0.1/core00', port=port) s_scope.set('syn:test:link', link) s_scope.set('syn:cmd:core', prox) try: yield prox except: # pragma: no cover raise finally: prox.fini() core.fini() dmon.fini()
async def test_lib_scope_task(self): s_scope.set('test:foo', 10) self.eq(s_scope.get('test:foo'), 10) self.eq(s_scope.pop('test:foo'), 10) self.none(s_scope.get('test:foo')) s_scope.update([('test:hehe', 1), ('test:haha', 'wow')]) self.eq(s_scope.get('test:hehe'), 1) self.eq(s_scope.get('test:haha'), 'wow')
def xact(self): xact = s_scope.get(self.iden) if xact is not None: return xact xact = self.dbque.get() s_scope.set(self.iden, xact) return xact
def test_socket_glob_plex(self): plex0 = s_scope.get('plex') self.nn(plex0) with s_scope.enter(): plex1 = s_socket.Plex() s_scope.set('plex', plex1) self.ne(id(plex0), id(s_scope.get('plex'))) plex1.fini() self.eq(id(plex0), id(s_scope.get('plex')))
def getDirCore(self, conf=None): ''' Context manager to make a dir:/// cortex which has test models loaded into it. Args: conf (dict): Optional cortex config Yields: s_cores_common.Cortex: Dir backed Cortex ''' with self.getTestDir() as dirn: s_scope.set('dirn', dirn) with s_cortex.fromdir(dirn, conf=conf) as core: self.addTstForms(core) yield core
async def _run(self): name = self.ddef.get('name', 'storm dmon') await self.core.boss.promote('storm:dmon', user=self.user.iden, info={ 'iden': self.iden, 'name': name }) s_scope.set('storm:dmon', self.iden) text = self.ddef.get('storm') opts = self.ddef.get('stormopts') dmoniden = self.ddef.get('iden') while not self.isfini: try: self.status = 'running' async with await self.core.snap(user=self.user) as snap: async for nodepath in snap.storm(text, opts=opts, user=self.user): # all storm tasks yield often to prevent latency self.count += 1 await asyncio.sleep(0) logger.warning(f'dmon query exited: {dmoniden}') self.status = 'exited' await self.waitfini(timeout=1) except asyncio.CancelledError as e: raise except Exception as e: logger.exception(f'dmon error ({self.iden}): {e}') self.status = f'error: {e}' await self.waitfini(timeout=1)
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) s_scope.set('link', link) methname, args, kwargs = todo if methname[0] == '_': raise s_exc.NoSuchMeth(name=methname) meth = getattr(item, methname, None) if meth is None: logger.warning('%r has no method: %r', item, methname) raise s_exc.NoSuchMeth(name=methname) sessitem = await t2call(link, meth, args, kwargs) if sessitem is not None: sess.onfini(sessitem) 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}))
def subtask(job): jid = job[0] slot = job[1].get('slot') meld = job[1].get('meld') if meld is not None: s_mindmeld.loadMindMeld(meld) hive = slot[1].get('hive') queen = s_telepath.openurl(job[1].get('queen')) s_scope.set('syn.queen', queen) try: dyntask = job[1].get('dyntask') ret = s_dyndeps.runDynTask(dyntask) queen.tell(hive, 'job:done', jid=jid, ret=ret) except Exception as e: queen.tell(hive, 'job:done', jid=jid, **s_common.excinfo(e))
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 if isinstance(valu, types.AsyncGeneratorType): try: 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})) except Exception as e: if not link.isfini: retn = s_common.retnexc(e) await link.tx(('t2:yield', {'retn': retn})) return if isinstance(valu, types.GeneratorType): try: await link.tx(('t2:genr', {})) for item in valu: await link.tx(('t2:yield', {'retn': (True, item)})) await link.tx(('t2:yield', {'retn': None})) except Exception as e: if not link.isfini: retn = s_common.retnexc(e) await link.tx(('t2:yield', {'retn': (False, retn)})) return if isinstance(valu, s_share.Share): iden = s_common.guid() sess.setSessItem(iden, valu) await link.tx(('t2:share', {'iden': iden})) return await link.tx(('t2:fini', {'retn': (True, valu)})) except Exception as e: logger.exception('on task:init: %r' % (mesg, )) 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) 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}))
def getSslCore(self, conf=None, configure_roles=False): dconf = { 'auth:admin': 'root@localhost', 'auth:en': 1, } if conf: conf.update(dconf) conf = dconf amesgs = ( ('auth:add:user', { 'user': '******' }), ('auth:add:role', { 'role': 'creator' }), ('auth:add:rrule', { 'role': 'creator', 'rule': ('node:add', { 'form': '*' }) }), ('auth:add:rrule', { 'role': 'creator', 'rule': ('node:tag:add', { 'tag': '*' }) }), ('auth:add:rrule', { 'role': 'creator', 'rule': ('node:prop:set', { 'form': '*', 'prop': '*' }) }), ('auth:add:role', { 'role': 'deleter' }), ('auth:add:rrule', { 'role': 'deleter', 'rule': ('node:del', { 'form': '*' }) }), ('auth:add:rrule', { 'role': 'deleter', 'rule': ('node:del', { 'form': '*' }) }), ('auth:add:rrule', { 'role': 'deleter', 'rule': ('node:tag:del', { 'tag': '*' }) }), ('auth:add:rrule', { 'role': 'deleter', 'rule': ('node:prop:set', { 'form': '*', 'prop': '*' }) }), ('auth:add:urole', { 'user': '******', 'role': 'creator' }), ('auth:add:urole', { 'user': '******', 'role': 'deleter' }), ) with self.getDirCore(conf=conf) as core: s_scope.set('syn:core', core) dirn = s_scope.get('dirn') writeCerts(dirn) cafile = os.path.join(dirn, 'ca.crt') keyfile = os.path.join(dirn, 'server.key') certfile = os.path.join(dirn, 'server.crt') userkey = os.path.join(dirn, 'user.key') usercrt = os.path.join(dirn, 'user.crt') rootkey = os.path.join(dirn, 'root.key') rootcrt = os.path.join(dirn, 'root.crt') with s_daemon.Daemon() as dmon: s_scope.set('syn:dmon', dmon) dmon.share('core', core) link = dmon.listen( 'ssl://*****:*****@localhost/core' user_prox = s_telepath.openurl( url, port=port, cafile=cafile, keyfile=userkey, certfile=usercrt) # type: s_cores_common.CoreApi root_prox = s_telepath.openurl( url, port=port, cafile=cafile, keyfile=rootkey, certfile=rootcrt) # type: s_cores_common.CoreApi if configure_roles: for mesg in amesgs: isok, retn = root_prox.authReact(mesg) s_common.reqok(isok, retn) try: yield user_prox, root_prox finally: user_prox.fini() root_prox.fini()