예제 #1
0
    async def task(self, todo, name=None):

        if self.isfini:
            raise s_exc.IsFini(mesg='Telepath Proxy isfini')

        if self.sess is not None:
            return await self.taskv2(todo, name=name)

        task = Task()

        mesg = ('task:init', {
                'task': task.iden,
                'todo': todo,
                'name': name, })

        self.tasks[task.iden] = task

        try:

            await self.link.tx(mesg)
            retn = await task.result()
            return s_common.result(retn)

        finally:
            self.tasks.pop(task.iden, None)
예제 #2
0
            async def genrloop():

                try:

                    while True:

                        mesg = await link.rx()
                        if mesg is None:
                            return

                        assert mesg[0] == 't2:yield'

                        retn = mesg[1].get('retn')
                        if retn is None:
                            await self._putPoolLink(link)
                            return

                        # if this is an exception, it's the end...
                        if not retn[0]:
                            await self._putPoolLink(link)

                        yield s_common.result(retn)

                except GeneratorExit:
                    # if they bail early on the genr, fini the link
                    await link.fini()
예제 #3
0
            async def genrloop():

                try:

                    while True:

                        mesg = await link.rx()
                        if mesg is None:
                            raise s_exc.LinkShutDown(mesg=mesg)

                        if mesg[0] != 't2:yield':  # pragma: no cover
                            info = 'Telepath protocol violation:  unexpected message received'
                            raise s_exc.BadMesgFormat(mesg=info)

                        retn = mesg[1].get('retn')
                        if retn is None:
                            await self._putPoolLink(link)
                            return

                        # if this is an exception, it's the end...
                        if not retn[0]:
                            await self._putPoolLink(link)

                        yield s_common.result(retn)

                except GeneratorExit:
                    # if they bail early on the genr, fini the link
                    await link.fini()
예제 #4
0
    async def task(self, todo, name=None):

        if self.isfini:
            raise s_exc.IsFini()

        if self.sess is not None:
            return await self.taskv2(todo, name=name)

        task = Task()

        mesg = ('task:init', {
                    'task': task.iden,
                    'todo': todo,
                    'name': name,
        })

        self.tasks[task.iden] = task

        try:

            await self.link.tx(mesg)
            retn = await task.result()
            return s_common.result(retn)

        finally:
            self.tasks.pop(task.iden, None)
예제 #5
0
            async def genrloop():

                try:

                    while True:

                        mesg = await link.rx()
                        if mesg is None:
                            return

                        assert mesg[0] == 't2:yield'

                        retn = mesg[1].get('retn')
                        if retn is None:
                            await self._putPoolLink(link)
                            return

                        # if this is an exception, it's the end...
                        if not retn[0]:
                            await self._putPoolLink(link)

                        yield s_common.result(retn)

                except GeneratorExit:
                    # if they bail early on the genr, fini the link
                    await link.fini()
예제 #6
0
    async def taskv2(self, todo, name=None):

        mesg = ('t2:init', {
                'todo': todo,
                'name': name,
                'sess': self.sess})

        link = await self.getPoolLink()

        await link.tx(mesg)

        mesg = await link.rx()
        if mesg is None:
            raise s_exc.LinkShutDown(mesg='Remote peer disconnected')

        if mesg[0] == 't2:fini':
            await self._putPoolLink(link)
            retn = mesg[1].get('retn')
            return s_common.result(retn)

        if mesg[0] == 't2:genr':

            async def genrloop():

                try:

                    while True:

                        mesg = await link.rx()
                        if mesg is None:
                            raise s_exc.LinkShutDown(mesg=mesg)

                        if mesg[0] != 't2:yield':  # pragma: no cover
                            info = 'Telepath protocol violation:  unexpected message received'
                            raise s_exc.BadMesgFormat(mesg=info)

                        retn = mesg[1].get('retn')
                        if retn is None:
                            await self._putPoolLink(link)
                            return

                        # if this is an exception, it's the end...
                        if not retn[0]:
                            await self._putPoolLink(link)

                        yield s_common.result(retn)

                except GeneratorExit:
                    # if they bail early on the genr, fini the link
                    await link.fini()

            return s_coro.GenrHelp(genrloop())

        if mesg[0] == 't2:share':
            iden = mesg[1].get('iden')
            sharinfo = mesg[1].get('sharinfo')
            await self._putPoolLink(link)
            return await Share.anit(self, iden, sharinfo)
예제 #7
0
    async def taskv2(self, todo, name=None):

        mesg = ('t2:init', {
                    'todo': todo,
                    'name': name,
                    'sess': self.sess,
        })

        link = await self.getPoolLink()

        await link.tx(mesg)

        mesg = await link.rx()
        if mesg is None:
            return

        if mesg[0] == 't2:fini':
            await self._putPoolLink(link)
            retn = mesg[1].get('retn')
            return s_common.result(retn)

        if mesg[0] == 't2:genr':

            async def genrloop():

                try:

                    while True:

                        mesg = await link.rx()
                        if mesg is None:
                            return

                        assert mesg[0] == 't2:yield'

                        retn = mesg[1].get('retn')
                        if retn is None:
                            await self._putPoolLink(link)
                            return

                        # if this is an exception, it's the end...
                        if not retn[0]:
                            await self._putPoolLink(link)

                        yield s_common.result(retn)

                except GeneratorExit:
                    # if they bail early on the genr, fini the link
                    await link.fini()

            return s_coro.GenrHelp(genrloop())

        if mesg[0] == 't2:share':
            iden = mesg[1].get('iden')
            sharinfo = mesg[1].get('sharinfo')
            await self._putPoolLink(link)
            return await Share.anit(self, iden, sharinfo)
예제 #8
0
    async def taskv2(self, todo, name=None):

        mesg = ('t2:init', {
            'todo': todo,
            'name': name,
            'sess': self.sess,
        })

        link = await self.getPoolLink()

        await link.tx(mesg)

        mesg = await link.rx()
        if mesg is None:
            return

        if mesg[0] == 't2:fini':
            await self._putPoolLink(link)
            retn = mesg[1].get('retn')
            return s_common.result(retn)

        if mesg[0] == 't2:genr':

            async def genrloop():

                try:

                    while True:

                        mesg = await link.rx()
                        if mesg is None:
                            return

                        assert mesg[0] == 't2:yield'

                        retn = mesg[1].get('retn')
                        if retn is None:
                            await self._putPoolLink(link)
                            return

                        # if this is an exception, it's the end...
                        if not retn[0]:
                            await self._putPoolLink(link)

                        yield s_common.result(retn)

                except GeneratorExit:
                    # if they bail early on the genr, fini the link
                    await link.fini()

            return s_coro.GenrHelp(genrloop())

        if mesg[0] == 't2:share':
            iden = mesg[1].get('iden')
            sharinfo = mesg[1].get('sharinfo')
            await self._putPoolLink(link)
            return await Share.anit(self, iden, sharinfo)
예제 #9
0
    async def test_telepath_pipeline(self):

        foo = Foo()
        async with self.getTestDmon() as dmon:

            dmon.share('foo', foo)

            async def genr():
                yield s_common.todo('bar', 10, 30)
                yield s_common.todo('bar', 20, 30)
                yield s_common.todo('bar', 30, 30)

            url = f'tcp://127.0.0.1:{dmon.addr[1]}/foo'
            async with await s_telepath.openurl(url) as proxy:

                self.eq(20, await proxy.bar(10, 10))
                self.eq(1, len(proxy.links))

                vals = []
                async for retn in proxy.getPipeline(genr()):
                    vals.append(s_common.result(retn))

                self.eq(vals, (40, 50, 60))

                self.eq(1, len(proxy.links))
                self.eq(160, await proxy.bar(80, 80))

                async def boomgenr():
                    yield s_common.todo('bar', 10, 30)
                    raise s_exc.NoSuchIden()

                with self.raises(s_exc.NoSuchIden):
                    async for retn in proxy.getPipeline(boomgenr()):
                        pass

                # This test must remain at the end of the with block
                async def sleeper():
                    yield s_common.todo('bar', 10, 30)
                    await asyncio.sleep(3)

                with self.raises(s_exc.LinkShutDown):
                    async for retn in proxy.getPipeline(sleeper()):
                        vals.append(s_common.result(retn))
                        await proxy.fini()
예제 #10
0
    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
예제 #11
0
    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
예제 #12
0
    def __iter__(self):

        try:
            while not self.isfini:

                for retn in s_glob.sync(self.queue.slice()):

                    if retn is None:
                        return

                    yield s_common.result(retn)

        finally:
            s_glob.sync(self.fini())
예제 #13
0
    def __iter__(self):

        try:
            while not self.isfini:

                for retn in s_glob.sync(self.queue.slice()):

                    if retn is None:
                        return

                    yield s_common.result(retn)

        finally:
            s_glob.sync(self.fini())
예제 #14
0
    async def __aiter__(self):

        try:

            while not self.isfini:

                for retn in await self.queue.slice():
                    if retn is None:
                        return

                    yield s_common.result(retn)

        finally:
            await self.fini()
예제 #15
0
    async def __aiter__(self):

        try:

            while not self.isfini:

                for retn in await self.queue.slice():
                    if retn is None:
                        return

                    yield s_common.result(retn)

        finally:
            await self.fini()
예제 #16
0
    async def __aiter__(self):

        try:
            while not self.isfini:

                for retn in await self.queue.slice():
                    if retn is None:
                        return

                    yield s_common.result(retn)

            raise s_exc.LinkShutDown(mesg='Remote peer disconnected')

        finally:
            await self.fini()