Ejemplo n.º 1
0
    def test_eventbus_link(self):

        bus1 = s_eventbus.EventBus()
        bus2 = s_eventbus.EventBus()
        bus3 = s_eventbus.EventBus()

        # gotta hold a reference
        bus3dist = bus3.dist

        bus1.link(bus2.dist)
        bus2.link(bus3dist, weak=True)

        data = {}

        def woot(event):
            data['woot'] = True

        def weakwoot(event):
            data['weak'] = True

        bus2.on('woot', woot)
        bus3.on('woot', weakwoot)

        bus1.fire('woot')

        self.assertTrue(data.get('woot'))
        self.assertTrue(data.get('weak'))
Ejemplo n.º 2
0
    def test_eventbus_busref_items(self):

        bref = s_eventbus.BusRef()

        bus0 = s_eventbus.EventBus()
        bus1 = s_eventbus.EventBus()
        bus2 = s_eventbus.EventBus()

        bref.put('foo', bus0)
        bref.put('bar', bus1)
        bref.put('baz', bus2)

        items = bref.items()
        self.isin(('foo', bus0), items)
        self.isin(('bar', bus1), items)
        self.isin(('baz', bus2), items)

        bus1.fini()
        items = bref.items()
        self.isin(('foo', bus0), items)
        self.isin(('baz', bus2), items)

        bus2.fini()
        items = bref.items()
        self.isin(('foo', bus0), items)

        bus0.fini()
        items = bref.items()
        self.eq(items, [])

        bref.fini()
        items = bref.items()
        self.eq(items, [])
Ejemplo n.º 3
0
    def __init__(self, core, form='plugin'):

        s_eventbus.EventBus.__init__(self)

        self.core = core
        self.form = form

        self.plugs = {}
        self.plugmods = {}
        self.plugfuncs = {}

        self.plugbus = s_eventbus.EventBus()

        model = core.genDataModel()

        model.addTufoForm(form, ptype='guid')
        model.addTufoProp(form, 'en', ptype='bool')
        model.addTufoProp(form, 'name', ptype='str')
        model.addTufoProp(form, 'source', ptype='str')

        self.core.on('tufo:add:%s' % (form, ), self._onPlugAdd)
        self.core.on('tufo:set:%s:en' % (form, ), self._onPlugSetEn)
        self.core.on('tufo:set:%s:source' % (form, ), self._onPlugSetSource)

        [
            self._runInitPlug(plug)
            for plug in core.getTufosByProp('%s:en' % form, 1)
        ]

        self.onfini(self._onPlugsFini)
Ejemplo n.º 4
0
    def test_daemon_on(self):

        class Foo:
            def bar(self):
                return 'baz'

        dmon = s_daemon.Daemon()
        link = dmon.listen('tcp://127.0.0.1:0/')

        bus = s_eventbus.EventBus()
        foo = Foo()

        dmon.share('bus', bus)
        dmon.share('foo', foo)

        port = link[1].get('port')

        bprox = s_telepath.openurl('tcp://127.0.0.1/bus', port=port)
        fprox = s_telepath.openurl('tcp://127.0.0.1/foo', port=port)

        evt = threading.Event()
        def woot(mesg):
            evt.set()

        bprox.on('woot', woot)
        fprox.on('woot', woot)

        bus.fire('woot')

        evt.wait(timeout=2)

        fprox.off('woot', woot)

        self.true(evt.is_set())
Ejemplo n.º 5
0
    def test_eventbus_link(self):

        bus1 = s_eventbus.EventBus()
        bus2 = s_eventbus.EventBus()

        bus1.link(bus2.dist)

        data = {}

        def woot(event):
            data['woot'] = True

        bus2.on('woot', woot)

        bus1.fire('woot')

        self.true(data.get('woot'))
Ejemplo n.º 6
0
    def test_eventbus_refcount(self):
        ebus = s_eventbus.EventBus()

        self.eq(ebus.incref(), 2)

        self.eq(ebus.fini(), 1)
        self.false(ebus.isfini)

        self.eq(ebus.fini(), 0)
        self.true(ebus.isfini)
Ejemplo n.º 7
0
    def test_eventbus_withfini(self):

        data = {'count': 0}

        def onfini():
            data['count'] += 1

        with s_eventbus.EventBus() as bus:
            bus.onfini(onfini)

        self.eq(data['count'], 1)
Ejemplo n.º 8
0
    def test_eventbus_basics(self):
        bus = s_eventbus.EventBus()

        def foo(event):
            x = event[1].get('x')
            y = event[1].get('y')
            event[1]['ret'] = x + y

        bus.on('woot', foo)

        event = bus.fire('woot', x=3, y=5, ret=[])
        self.eq(event[1]['ret'], 8)
Ejemplo n.º 9
0
    def test_eventbus_log(self):

        logs = []
        with s_eventbus.EventBus() as ebus:
            ebus.on('log', logs.append)

            ebus.log(100, 'omg woot', foo=10)

        mesg = logs[0]
        self.eq(mesg[0], 'log')
        self.eq(mesg[1].get('foo'), 10)
        self.eq(mesg[1].get('mesg'), 'omg woot')
        self.eq(mesg[1].get('level'), 100)
Ejemplo n.º 10
0
    def test_eventbus_exc(self):

        logs = []
        with s_eventbus.EventBus() as ebus:
            ebus.on('log', logs.append)

            try:
                raise NoSuchObj(name='hehe')
            except Exception as e:
                ebus.exc(e)

        mesg = logs[0]
        self.eq(mesg[1].get('err'), 'NoSuchObj')
Ejemplo n.º 11
0
    def test_eventbus_busref(self):

        bref = s_eventbus.BusRef()

        bus0 = s_eventbus.EventBus()
        bus1 = s_eventbus.EventBus()
        bus2 = s_eventbus.EventBus()

        bref.put('foo', bus0)
        bref.put('bar', bus1)
        bref.put('baz', bus2)

        bus1.fini()
        self.nn(bref.get('foo'))
        self.none(bref.get('bar'))

        self.len(2, list(bref))

        self.true(bref.pop('baz') is bus2)
        self.len(1, list(bref))

        bref.fini()
        self.true(bus0.isfini)
Ejemplo n.º 12
0
    def test_eventbus_finionce(self):

        data = {'count': 0}

        def onfini():
            data['count'] += 1

        bus = s_eventbus.EventBus()
        bus.onfini(onfini)

        bus.fini()
        bus.fini()

        self.eq(data['count'], 1)
Ejemplo n.º 13
0
    def test_eventbus_waiter(self):
        bus0 = s_eventbus.EventBus()

        wait0 = bus0.waiter(3, 'foo:bar')

        bus0.fire('foo:bar')
        bus0.fire('foo:bar')
        bus0.fire('foo:bar')

        evts = wait0.wait(timeout=3)
        self.eq(len(evts), 3)

        wait1 = bus0.waiter(3, 'foo:baz')
        evts = wait1.wait(timeout=0.1)
        self.none(evts)
Ejemplo n.º 14
0
    def test_eventbus_waitfini(self):

        ebus = s_eventbus.EventBus()

        self.false(ebus.waitfini(timeout=0.1))

        def callfini():
            time.sleep(0.1)
            ebus.fini()

        thr = s_threads.worker(callfini)
        # actually wait...
        self.true(ebus.waitfini(timeout=0.3))

        # bounce off the isfini block
        self.true(ebus.waitfini(timeout=0.3))
Ejemplo n.º 15
0
    def test_eventbus_basics(self):
        bus = s_eventbus.EventBus()

        def foo(event):
            x = event[1].get('x')
            y = event[1].get('y')
            return event[1]['ret'].append(x + y)

        def bar(event):
            x = event[1].get('x')
            y = event[1].get('y')
            return event[1]['ret'].append(x * y)

        bus.on('woot', foo)
        bus.on('woot', bar, weak=True)

        event = bus.fire('woot', x=3, y=5, ret=[])
        self.assertEqual(tuple(event[1]['ret']), (8, 15))
Ejemplo n.º 16
0
    def test_eventbus_off_weak(self):
        bus = s_eventbus.EventBus()

        data = {'count': 0}

        def woot(mesg):
            data['count'] += 1

        bus.on('hehe', woot, weak=True)

        bus.fire('hehe')

        bus.off('hehe', woot)

        bus.fire('hehe')

        bus.fini()

        self.assertEqual(data['count'], 1)
Ejemplo n.º 17
0
    def test_evenbus_unlink(self):

        bus = s_eventbus.EventBus()

        mesgs = []

        def woot(mesg):
            mesgs.append(mesg)

        bus.link(woot)

        bus.fire('haha')
        self.eq(len(mesgs), 1)

        bus.unlink(woot)

        bus.fire('haha')
        self.eq(len(mesgs), 1)

        bus.fini()
Ejemplo n.º 18
0
def block_processing(evt1, evt2):
    '''
    Function to make an eventbus and call main().  Used as a Process target.

    Args:
        evt1 (multiprocessing.Event): event to twiddle
        evt2 (multiprocessing.Event): event to twiddle
    '''
    bus = s_eventbus.EventBus()

    def onMain(mesg):
        evt1.set()

    def onFini():
        evt2.set()

    bus.on('ebus:main', onMain)
    bus.onfini(onFini)

    bus.main()
    sys.exit(137)
Ejemplo n.º 19
0
    def test_eventbus_filt(self):

        bus = s_eventbus.EventBus()

        def wootfunc(mesg):
            mesg[1]['woot'] = True

        bus.on('lol', wootfunc)

        bus.on('rofl', wootfunc, foo=10)

        mesg = bus.fire('lol')
        self.true(mesg[1].get('woot'))

        mesg = bus.fire('rofl')
        self.false(mesg[1].get('woot'))

        mesg = bus.fire('rofl', foo=20)
        self.false(mesg[1].get('woot'))

        mesg = bus.fire('rofl', foo=10)
        self.true(mesg[1].get('woot'))
Ejemplo n.º 20
0
    def test_eventbus_onwith(self):
        ebus = s_eventbus.EventBus()
        l0 = []
        l1 = []

        def onHehe0(mesg):
            l0.append(mesg)

        def onHehe1(mesg):
            l1.append(mesg)

        ebus.on('hehe', onHehe0)

        # Temporarily set the 'hehe' callback
        with ebus.onWith('hehe', onHehe1) as e:
            self.true(e is ebus)
            ebus.fire('hehe')
            self.len(1, l0)
            self.len(1, l1)

        # subsequent fires do not call onHehe1
        ebus.fire('hehe')
        self.len(2, l0)
        self.len(1, l1)

        # onWith works across Telepath Proxy's and with filts
        l2 = []

        def onNodeForm(mesg):
            l2.append(mesg)

        with self.getDmonCore() as core:
            with core.onWith('node:form', onNodeForm, form='strform'):
                t0 = core.formTufoByProp('strform', 'hehe')
                self.nn(t0)
                t1 = core.formTufoByProp('intform', 1234)
                self.nn(t1)
        self.len(1, l2)
Ejemplo n.º 21
0
    def test_eventbus_onwith(self):
        ebus = s_eventbus.EventBus()
        l0 = []
        l1 = []

        def onHehe0(mesg):
            l0.append(mesg)

        def onHehe1(mesg):
            l1.append(mesg)

        ebus.on('hehe', onHehe0)

        # Temporarily set the 'hehe' callback
        with ebus.onWith('hehe', onHehe1) as e:
            self.true(e is ebus)
            ebus.fire('hehe')
            self.len(1, l0)
            self.len(1, l1)

        # subsequent fires do not call onHehe1
        ebus.fire('hehe')
        self.len(2, l0)
        self.len(1, l1)
Ejemplo n.º 22
0
 def ctor(name):
     return s_eventbus.EventBus()
Ejemplo n.º 23
0
    def __init__(self, link, **conf):
        s_config.Config.__init__(self)
        if conf:
            self.setConfOpts(conf)

        #############################################################
        # buses to save/load *raw* save events
        #############################################################
        self.savebus = s_eventbus.EventBus()
        self.loadbus = s_eventbus.EventBus()

        self._link = link

        self.onfini(self._defaultFiniCoreStor)

        # Various locks
        self.xlock = threading.Lock()
        # Transactions are a storage-layer concept
        self._store_xacts = {}

        # Dicts for storing retrieval methods
        self.sizebymeths = {}
        self.rowsbymeths = {}
        self.joinsbymeths = {}

        # Register handlers for lifting rows/sizes/joins
        self.initRowsBy('gt', self.rowsByGt)
        self.initRowsBy('lt', self.rowsByLt)
        self.initRowsBy('ge', self.rowsByGe)
        self.initRowsBy('le', self.rowsByLe)
        self.initRowsBy('range', self.rowsByRange)

        self.initSizeBy('ge', self.sizeByGe)
        self.initSizeBy('le', self.sizeByLe)
        self.initSizeBy('range', self.sizeByRange)

        self.initJoinsBy('ge', self._joinsByGe)
        self.initJoinsBy('gt', self._joinsByGt)
        self.initJoinsBy('le', self._joinsByLe)
        self.initJoinsBy('lt', self._joinsByLt)
        self.initJoinsBy('in', self._joinsByIn)
        self.initJoinsBy('range', self._joinsByRange)

        # Events for handling savefile loads/saves
        self.loadbus.on('core:save:add:rows', self._loadAddRows)
        self.loadbus.on('core:save:del:rows:by:iden', self._loadDelRowsById)
        self.loadbus.on('core:save:del:rows:by:prop', self._loadDelRowsByProp)
        self.loadbus.on('core:save:set:rows:by:idprop',
                        self._loadSetRowsByIdProp)
        self.loadbus.on('core:save:del:rows:by:idprop',
                        self._loadDelRowsByIdProp)
        self.loadbus.on('core:save:set:up:prop', self._loadUpdateProperty)
        self.loadbus.on('core:save:set:up:propvalu',
                        self._loadUpdatePropertyValu)
        self.loadbus.on('syn:core:blob:set', self._onSetBlobValu)
        self.loadbus.on('syn:core:blob:del', self._onDelBlobValu)

        # Cache blob save mesgs which may be fired during storage layer init
        _blobMesgCache = []
        self.savebus.on('syn:core:blob:set', _blobMesgCache.append)
        self.savebus.on('syn:core:blob:del', _blobMesgCache.append)

        # Perform storage layer initializations
        self._initCoreStor()

        # Disable the blob message caching
        self.savebus.off('syn:core:blob:set', _blobMesgCache.append)
        self.savebus.off('syn:core:blob:del', _blobMesgCache.append)

        # process a savefile/savefd if we have one (but only one of the two)
        savefd = self._link[1].get('savefd')
        if savefd is not None:
            self.setSaveFd(savefd)
        else:
            savefile = self._link[1].get('savefile')
            if savefile is not None:
                savefd = s_common.genfile(savefile)
                self.setSaveFd(savefd, fini=True)

        # The storage layer initialization blob events then trump anything
        # which may have been set during the savefile load and make sure they
        # get saved as well
        if 'savefd' in link[1] or 'savefile' in link[1]:
            for evtname, info in _blobMesgCache:
                self.savebus.fire(evtname, **info)
                self.loadbus.fire(evtname, **info)

        if not self.hasBlobValu('syn:core:created'):
            self.setBlobValu('syn:core:created', s_common.now())

        self.onfini(self._finiCoreStore)
Ejemplo n.º 24
0
    def __init__(self, statefd=None):

        self.sched = s_threads.Sched()
        self.asyncpool = s_async.AsyncBoss()

        self.peerbus = s_eventbus.EventBus()

        self.peersocks = {}  # sockets directly connected to peers
        self.peergraph = collections.defaultdict(set)
        self.routecache = {}

        # persistant data in these...
        self.neuinfo = {
            'poolsize': 10,  # default to 10 neuron threads
        }
        self.neucores = {}
        self.neusocks = {}  # <guid> : NeuSock()
        self.neushares = {}

        self.runinfo = collections.defaultdict(dict)
        self.peerinfo = collections.defaultdict(dict)

        self.metacore = s_cortex.MetaCortex()

        s_daemon.Daemon.__init__(self)

        self.onfini(self.sched.fini)
        self.onfini(self.peerbus.fini)
        self.onfini(self.asyncpool.fini)

        self.on('link:sock:init', self._onNeuSockInit)

        self.on('neu:peer:init', self._onNeuPeerInit)
        self.on('neu:peer:fini', self._onNeuPeerFini)

        # application layer peer messages...
        self.peerbus.on('ping', self._onPeerBusPing)
        self.peerbus.on('pong', self._onPeerBusPong)

        self.setMesgMethod('neu:data', self._onMesgNeuData)

        self.setMesgMethod('neu:link:syn', self._onMesgNeuLinkSyn)
        self.setMesgMethod('neu:link:synack', self._onMesgNeuLinkSynAck)
        self.setMesgMethod('neu:link:ack', self._onMesgNeuLinkAck)

        self.setMesgMethod('neu:peer:link:up', self._onMesgNeuPeerLinkUp)
        self.setMesgMethod('neu:peer:link:down', self._onMesgNeuPeerLinkDown)

        def setrsakey(event):
            valu = event[1].get('valu')
            self.rsakey = RSA.importKey(valu)
            self.pubkey = self.rsakey.publickey()
            self.pkcs15 = PKCS15.PKCS115_SigScheme(self.rsakey)

        def setauthmod(event):
            valu = event[1].get('valu')
            if valu == None:
                self.setAuthModule(None)
                return

            name, args, kwargs = valu

            auth = s_dyndeps.getDynLocal(name)(*args, **kwargs)
            self.setAuthModule(auth)

        def setpoolsize(event):
            valu = event[1].get('valu')
            self.asyncpool.setPoolSize(valu)

        self.on('neu:info:rsakey', setrsakey)
        self.on('neu:info:authmod', setauthmod)
        self.on('neu:info:poolsize', setpoolsize)

        if statefd:
            self.loadStateFd(statefd)

        #self._loadNeuAuthModule()
        self._loadNeuMetaCortex()
        #self._loadNeuSharedObjects()

        # check if we're brand new...
        if self.neuinfo.get('ident') == None:
            # making a shiney new neuron!
            self.setNeuInfo('ident', guid())

        self.ident = self.getNeuInfo('ident')

        poolsize = self.getNeuInfo('poolsize')
        self.asyncpool.setPoolSize(poolsize)