Beispiel #1
0
    def test_telepath_push(self):

        # override default timeout=None for tests
        with s_scope.enter({'syntimeout': 3}):

            env = self.getFooEnv()

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

            prox0 = s_telepath.openurl('tcp://127.0.0.1/',
                                       port=port)  # type: s_telepath.Proxy

            prox0.push('foo1', Foo())

            prox1 = s_telepath.openurl('tcp://127.0.0.1/foo1',
                                       port=port)  # type: s_telepath.Proxy

            self.eq(prox1.bar(10, 20), 30)

            wait0 = env.dmon.waiter(1, 'tele:push:fini')

            prox0.fini()

            self.nn(wait0.wait(timeout=2))

            self.raises(NoSuchObj, prox1.bar, 10, 20)

            prox1.fini()

            env.fini()
    def test_lib_scope_enter(self):

        with s_scope.enter({'woot': 10}):
            self.eq(s_scope.get('woot'), 10)
            self.assertIsNone(s_scope.get('newp'))

        self.assertIsNone(s_scope.get('woot'))
        self.assertIsNone(s_scope.get('newp'))
Beispiel #3
0
    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')))
Beispiel #4
0
    def loadDmonConf(self, conf):
        '''
        {
            'title':'The Foo Thing',

            'vars':{
                'foo':10,
                'bar':["baz","faz"]
            }

            'forks':(
                ('name',{
                    # nested config for forked dmon
                },
            ),

            'includes':(
                '~/foo/config.json',
            ),

            'cells':(
                (<dirn>, <conf>),
            ),

            'ctors':(
                ('baz', 'ctor://foo.bar.Baz()'),
                ('faz', 'ctor://foo.bar.Baz()', {'config':'woot'}),
                ('mybus', 'tcp://host.com/syn.svcbus'),
            ),

            'services':(
                ('mybus',(
                    ('baz',{'tags':('foo.bar','baz')}),
                ),
            ),

            'addons':(
                ('auth','tcp://host.com:8899/synauth'),
                ('logging','ctor://mypkg.mymod.MyLogger()'),
            ),

            'configs':{
                'woot':{
                    'fooopt':10,
                },
            },
        }
        '''
        with s_scope.enter({'dmon': self}):
            return self._loadDmonConf(conf)
Beispiel #5
0
def runas(user):
    '''
    Construct and return a with-block object which runs as the given
    synapse user name.

    Example:

        import synapse.lib.auth as s_auth

        s_auth.runas('visi@localhost'):
            # calls from here down may use check user/perms
            dostuff()

    '''
    with s_scope.enter({'syn:user': user}):
        yield
Beispiel #6
0
def asSynUser(user, auth=None, **locs):
    '''
    Construct and return a with-block object which runs as the given
    synapse user name. Locs may be optionally populated with additional
    items to be added to the LocalScope instance.

    Example:

        import synapse.lib.userauth as s_userauth

        s_userauth.asSynUser('visi@localhost'):
            # calls from here down may use check user/perms
            dostuff()

    '''
    with s_scope.enter({'syn:user': user, 'syn:auth': auth}):
        yield
Beispiel #7
0
    def test_async_wait_syntimeout(self):
        def longtime():
            time.sleep(0.1)

        boss = s_async.Boss()
        boss.runBossPool(1)

        jid = s_async.jobid()
        task = s_async.newtask(longtime)

        boss.initJob(jid, task=task)

        with s_scope.enter({'syntimeout': 0.01}):
            self.assertFalse(boss.wait(jid))

        self.assertTrue(boss.wait(jid, timeout=1))

        boss.fini()
Beispiel #8
0
    async def test_lib_scope_enter(self):

        with s_scope.enter({'woot': 10}):
            self.eq(s_scope.get('woot'), 10)
            self.none(s_scope.get('newp'))

        self.none(s_scope.get('woot'))
        self.none(s_scope.get('newp'))

        scope = s_scope.Scope()
        scope.enter({'yes': 1})
        self.eq(scope.get('yes'), 1)
        scope.set('no', 0)
        frame = scope.leave()
        self.eq(frame, {'yes': 1, 'no': 0})
        self.none(scope.get('yes'))
        self.none(scope.get('no'))
        self.raises(IndexError, scope.leave)
Beispiel #9
0
    async def test_lib_scope_enter(self):

        with s_scope.enter({'woot': 10}):
            self.eq(s_scope.get('woot'), 10)
            self.none(s_scope.get('newp'))

        self.none(s_scope.get('woot'))
        self.none(s_scope.get('newp'))

        scope = s_scope.Scope()
        scope.enter({'yes': 1})
        self.eq(scope.get('yes'), 1)
        scope.set('no', 0)
        frame = scope.leave()
        self.eq(frame, {'yes': 1, 'no': 0})
        self.none(scope.get('yes'))
        self.none(scope.get('no'))
        self.raises(IndexError, scope.leave)
    def test_telepath_push(self):

        # override default timeout=None for tests
        with s_scope.enter({'syntimeout': 5}):

            env = self.getFooEnv()
            port = env.link[1].get('port')

            prox0 = s_telepath.openurl('tcp://127.0.0.1/', port=port)
            prox0.push('foo1', Foo())

            prox1 = s_telepath.openurl('tcp://127.0.0.1/foo1', port=port)

            self.eq(prox1.bar(10, 20), 30)

            prox0.fini()

            self.assertRaises(s_async.JobErr, prox1.bar, 10, 20)

            prox1.fini()

            env.fini()
Beispiel #11
0
    def _onTeleCallMesg(self, sock, mesg):

        # tele:call - call a method on a shared object

        jid = mesg[1].get('jid')
        sid = mesg[1].get('sid')

        # check if the socket knows about their auth
        # ( most likely via SSL client cert )
        user = sock.get('syn:user')

        with s_scope.enter({
                'dmon': self,
                'sock': sock,
                'syn:user': user,
                'syn:auth': self.auth
        }):

            try:

                name = mesg[1].get('name')

                item = self.shared.get(name)
                if item is None:
                    # is it a pushed object?
                    pushsock = self.pushed.get(name)
                    if pushsock is not None:
                        # pass along how to reply
                        mesg[1]['suid'] = sock.iden
                        return pushsock.tx(mesg)
                    raise s_common.NoSuchObj(name)

                task = mesg[1].get('task')
                meth, args, kwargs = task

                self._reqUserAllowed(user, 'tele:call', name, meth)

                func = getattr(item, meth, None)
                if func is None:
                    raise s_common.NoSuchMeth(meth)

                if getattr(func, '_tele_clientside', False):
                    name = s_reflect.getMethName(func)
                    raise s_common.TeleClientSide(name=name)

                ret = func(*args, **kwargs)

                # handle generator returns specially
                if isinstance(ret, types.GeneratorType):

                    iden = s_common.guid()

                    txwait = threading.Event()
                    # start off set...
                    txwait.set()

                    self._dmon_yields.add(iden)
                    sock.tx(
                        s_common.tufo('tele:yield:init', jid=jid, iden=iden))

                    # FIXME opt
                    maxsize = 100000000

                    def ontxsize(m):
                        size = m[1].get('size')
                        if size >= maxsize:
                            txwait.clear()
                        else:
                            txwait.set()

                    try:

                        sock.onfini(txwait.set)
                        sock.on('sock:tx:size', ontxsize)

                        for item in ret:

                            txwait.wait()

                            # check if we woke due to fini
                            if sock.isfini:
                                break

                            sock.tx(
                                s_common.tufo('tele:yield:item',
                                              iden=iden,
                                              item=item))
                            if iden not in self._dmon_yields:
                                break

                    finally:
                        sock.off('sock:tx:size', ontxsize)
                        self._dmon_yields.discard(iden)
                        sock.tx(s_common.tufo('tele:yield:fini', iden=iden))

                    return

                sock.tx(s_common.tufo('job:done', jid=jid, ret=ret))

            except Exception as e:
                sock.tx(
                    s_common.tufo('job:done', jid=jid, **s_common.excinfo(e)))