コード例 #1
0
ファイル: test_tspeed.py プロジェクト: zhangjd0411/telnetlib3
def test_telnet_client_send_tspeed(event_loop, bind_host, unused_tcp_port):
    """Test Client's callback method send_tspeed()."""
    # given
    _waiter = asyncio.Future()
    given_rx, given_tx = 1337, 1919

    class ServerTestTspeed(telnetlib3.TelnetServer):
        def on_tspeed(self, rx, tx):
            super().on_tspeed(rx, tx)
            _waiter.set_result((rx, tx))

        def begin_advanced_negotiation(self):
            from telnetlib3.telopt import DO, TSPEED
            super().begin_advanced_negotiation()
            self.writer.iac(DO, TSPEED)

    yield from telnetlib3.create_server(protocol_factory=ServerTestTspeed,
                                        host=bind_host,
                                        port=unused_tcp_port,
                                        loop=event_loop)

    reader, writer = yield from telnetlib3.open_connection(
        host=bind_host,
        port=unused_tcp_port,
        loop=event_loop,
        tspeed=(given_rx, given_tx),
        connect_minwait=0.05)

    recv_rx, recv_tx = yield from asyncio.wait_for(_waiter, 0.5)
    assert recv_rx == given_rx
    assert recv_tx == given_tx
コード例 #2
0
def test_telnet_server_on_xdisploc(event_loop, bind_host, unused_tcp_port):
    """Test Server's callback method on_xdisploc()."""
    # given
    from telnetlib3.telopt import (IAC, WILL, SB, SE, IS, XDISPLOC)
    _waiter = asyncio.Future()
    given_xdisploc = 'alpha:0'

    class ServerTestXdisploc(telnetlib3.TelnetServer):
        def on_xdisploc(self, xdisploc):
            super().on_xdisploc(xdisploc)
            _waiter.set_result(self)

    yield from telnetlib3.create_server(protocol_factory=ServerTestXdisploc,
                                        host=bind_host,
                                        port=unused_tcp_port,
                                        loop=event_loop)

    reader, writer = yield from asyncio.open_connection(host=bind_host,
                                                        port=unused_tcp_port,
                                                        loop=event_loop)

    # exercise,
    writer.write(IAC + WILL + XDISPLOC)
    writer.write(IAC + SB + XDISPLOC + IS + given_xdisploc.encode('ascii') +
                 IAC + SE)

    # verify,
    srv_instance = yield from asyncio.wait_for(_waiter, 0.5)
    assert srv_instance.get_extra_info('xdisploc') == 'alpha:0'
コード例 #3
0
def main():
    global game
    props = Properties()
    props.init_props('properties.yml')

    configure_log_file(props.get('log.prefix'))
    logging.info('******************')

    connect(props.get('db.database'),
            host='mongodb://' + props.get('db.user') + ':' +
            props.get('db.password') + '@' + props.get('db.host'))
    logging.info('Connected to database')
    logging.info('Host: %s', props.get('db.host'))
    logging.info('Database: %s', props.get('db.database'))
    logging.info('User: %s', props.get('db.user'))

    props.load_config()

    game = Game()
    game_manager = GameManager()

    loop = asyncio.get_event_loop()
    coro = telnetlib3.create_server(port=props.get('server.port'),
                                    log=logging.getLogger(),
                                    shell=shell,
                                    timeout=0)
    server = loop.run_until_complete(coro)
    logging.info('Server started on 127.0.0.1:' +
                 str(props.get('server.port')))
    loop.call_later(1, game_manager.execute_timed_actions)
    loop.run_until_complete(server.wait_closed())
コード例 #4
0
ファイル: test_tspeed.py プロジェクト: zhangjd0411/telnetlib3
def test_telnet_server_on_tspeed(event_loop, bind_host, unused_tcp_port):
    """Test Server's callback method on_tspeed()."""
    # given
    from telnetlib3.telopt import IAC, WILL, SB, SE, IS, TSPEED
    _waiter = asyncio.Future()

    class ServerTestTspeed(telnetlib3.TelnetServer):
        def on_tspeed(self, rx, tx):
            super().on_tspeed(rx, tx)
            _waiter.set_result(self)

    yield from telnetlib3.create_server(protocol_factory=ServerTestTspeed,
                                        host=bind_host,
                                        port=unused_tcp_port,
                                        loop=event_loop)

    reader, writer = yield from asyncio.open_connection(host=bind_host,
                                                        port=unused_tcp_port,
                                                        loop=event_loop)

    # exercise,
    writer.write(IAC + WILL + TSPEED)
    writer.write(IAC + SB + TSPEED + IS + b'123,456' + IAC + SE)

    # verify,
    srv_instance = yield from asyncio.wait_for(_waiter, 0.5)
    assert srv_instance.get_extra_info('tspeed') == '123,456'
コード例 #5
0
def test_telnet_client_send_naws(event_loop, bind_host, unused_tcp_port):
    """Test Client's NAWS of callback method send_naws()."""
    # given a server
    _waiter = asyncio.Future()
    given_cols, given_rows = 40, 20

    class ServerTestNaws(telnetlib3.TelnetServer):
        def on_naws(self, width, height):
            super().on_naws(width, height)
            _waiter.set_result((height, width))

    yield from telnetlib3.create_server(protocol_factory=ServerTestNaws,
                                        host=bind_host,
                                        port=unused_tcp_port,
                                        loop=event_loop,
                                        connect_maxwait=0.05)

    reader, writer = yield from telnetlib3.open_connection(
        host=bind_host,
        port=unused_tcp_port,
        loop=event_loop,
        cols=given_cols,
        rows=given_rows,
        connect_minwait=0.05)

    recv_cols, recv_rows = yield from asyncio.wait_for(_waiter, 0.5)
    assert recv_cols == given_cols
    assert recv_rows == given_rows
コード例 #6
0
def test_telnet_client_send_tty_naws(event_loop, bind_host, unused_tcp_port):
    """Test Client's NAWS of callback method send_naws()."""
    # given a client,
    _waiter = asyncio.Future()
    given_cols, given_rows = 40, 20
    prog, args = 'telnetlib3-client', [
        bind_host,
        str(unused_tcp_port), '--loglevel=warn', '--connect-minwait=0.005',
        '--connect-maxwait=0.010'
    ]

    # a server,
    class ServerTestNaws(telnetlib3.TelnetServer):
        def on_naws(self, width, height):
            super().on_naws(width, height)
            _waiter.set_result((height, width))
            event_loop.call_soon(self.connection_lost, None)

    yield from telnetlib3.create_server(protocol_factory=ServerTestNaws,
                                        host=bind_host,
                                        port=unused_tcp_port,
                                        loop=event_loop,
                                        connect_maxwait=0.05)

    proc = pexpect.spawn(prog, args, dimensions=(given_rows, given_cols))
    yield from proc.expect(pexpect.EOF, async=True, timeout=5)
    assert proc.match == pexpect.EOF

    recv_cols, recv_rows = yield from asyncio.wait_for(_waiter, 0.5)
    assert recv_cols == given_cols
    assert recv_rows == given_rows
コード例 #7
0
ファイル: test_writer.py プロジェクト: zhangjd0411/telnetlib3
def test_send_eor(event_loop, bind_host, unused_tcp_port):
    """Writer sends IAC + EOR if client requests by DO."""
    from telnetlib3.telopt import IAC, DO, WILL, CMD_EOR, EOR
    given = IAC + DO + EOR
    expected = IAC + WILL + EOR + b'<' + IAC + CMD_EOR + b'>'

    # just verify rfc constants are used appropriately in this context
    assert EOR == bytes([25])
    assert CMD_EOR == bytes([239])

    @asyncio.coroutine
    def shell(reader, writer):
        writer.write('<')
        result = writer.send_eor()
        assert result is True
        writer.write('>')
        writer.close()

    yield from telnetlib3.create_server(
        protocol_factory=telnetlib3.BaseServer, host=bind_host, shell=shell,
        port=unused_tcp_port, loop=event_loop, connect_maxwait=0.05)

    client_reader, client_writer = yield from asyncio.open_connection(
        host=bind_host, port=unused_tcp_port, loop=event_loop)

    # verify,
    client_writer.write(given)
    result = yield from asyncio.wait_for(client_reader.read(), 0.5)

    assert result == expected
コード例 #8
0
ファイル: test_charset.py プロジェクト: jquast/telnetlib3
async def test_telnet_client_send_charset(event_loop, bind_host, unused_tcp_port):
    """Test Client's callback method send_charset() selection for illegals."""
    # given
    _waiter = asyncio.Future()

    class ServerTestCharset(telnetlib3.TelnetServer):
        def on_request_charset(self):
            return ['illegal', 'cp437']

    class ClientTestCharset(telnetlib3.TelnetClient):
        def send_charset(self, offered):
            selected = super().send_charset(offered)
            _waiter.set_result(selected)
            return selected

    await asyncio.wait_for(
        telnetlib3.create_server(
            protocol_factory=ServerTestCharset,
            host=bind_host, port=unused_tcp_port,
            loop=event_loop),
        0.15)

    reader, writer = await asyncio.wait_for(
        telnetlib3.open_connection(
            client_factory=ClientTestCharset,
            host=bind_host, port=unused_tcp_port, loop=event_loop,
            encoding='latin1', connect_minwait=0.05),
        0.15)

    val = await asyncio.wait_for(_waiter, 1.5)
    assert val == 'cp437'
    assert writer.get_extra_info('charset') == 'cp437'
コード例 #9
0
ファイル: test_writer.py プロジェクト: zhangjd0411/telnetlib3
def test_send_iac_dont_dont(event_loop, bind_host, unused_tcp_port):
    """Try a DONT and ensure it cannot be sent twice."""
    from telnetlib3.telopt import DONT, ECHO
    _waiter = asyncio.Future()

    yield from telnetlib3.create_server(
        protocol_factory=telnetlib3.BaseServer, host=bind_host,
        port=unused_tcp_port, loop=event_loop, connect_maxwait=0.05,
        _waiter_connected=_waiter)

    _, client_writer = yield from telnetlib3.open_connection(
        host=bind_host, port=unused_tcp_port, loop=event_loop,
        connect_minwait=0.05)

    # say it once,
    result = client_writer.iac(DONT, ECHO)
    assert result == True

    # say it again, suppressed
    result = client_writer.iac(DONT, ECHO)
    assert result == False

    server_writer = (yield from asyncio.wait_for(_waiter, 0.5)).writer

    assert client_writer.remote_option[ECHO] is False
    assert server_writer.local_option[ECHO] is False
コード例 #10
0
ファイル: test_writer.py プロジェクト: zhangjd0411/telnetlib3
def test_not_send_ga(event_loop, bind_host, unused_tcp_port):
    """Writer does not send IAC + GA when SGA is negotiated."""
    from telnetlib3.telopt import IAC, DO, WILL, SGA

    # we requires IAC + DO + SGA, and expect a confirming reply.  We also
    # call writer.send_ga() from the shell, whose result should be False
    # (not sent).  The reader never receives an IAC + GA.
    expected = IAC + WILL + SGA

    @asyncio.coroutine
    def shell(reader, writer):
        result = writer.send_ga()
        assert result is False
        writer.close()

    yield from telnetlib3.create_server(
        protocol_factory=telnetlib3.BaseServer, host=bind_host, shell=shell,
        port=unused_tcp_port, loop=event_loop, connect_maxwait=0.05)

    client_reader, client_writer = yield from asyncio.open_connection(
        host=bind_host, port=unused_tcp_port, loop=event_loop)

    client_writer.write(IAC + DO + SGA)

    # verify,
    result = yield from asyncio.wait_for(client_reader.read(), 0.5)
    assert result == expected
コード例 #11
0
ファイル: test_writer.py プロジェクト: zhangjd0411/telnetlib3
def test_iac_dont_dont(event_loop, bind_host, unused_tcp_port):
    """WILL/WONT replied only once for repeated DO."""
    from telnetlib3.telopt import IAC, DONT, ECHO

    @asyncio.coroutine
    def shell(reader, writer):
        writer.close()

    # given,
    given_from_client = IAC + DONT + ECHO + IAC + DONT + ECHO
    expect_from_server = b''

    yield from telnetlib3.create_server(
        protocol_factory=telnetlib3.BaseServer, host=bind_host, shell=shell,
        port=unused_tcp_port, loop=event_loop, connect_maxwait=0.05)

    client_reader, client_writer = yield from asyncio.open_connection(
        host=bind_host, port=unused_tcp_port, loop=event_loop)

    # exercise,
    client_writer.write(given_from_client)

    # verify,
    result_from_server = yield from asyncio.wait_for(client_reader.read(), 0.5)

    assert result_from_server == expect_from_server
コード例 #12
0
def test_telnet_server_encoding_client_will(event_loop, bind_host,
                                            unused_tcp_port):
    """Server Default encoding (utf8) incoming when client WILL."""
    from telnetlib3.telopt import IAC, WONT, WILL, TTYPE, BINARY
    # given
    _waiter = asyncio.Future()

    yield from telnetlib3.create_server(host=bind_host,
                                        port=unused_tcp_port,
                                        _waiter_connected=_waiter,
                                        loop=event_loop)

    reader, writer = yield from asyncio.open_connection(host=bind_host,
                                                        port=unused_tcp_port,
                                                        loop=event_loop)

    # exercise, quickly failing negotiation/encoding.
    writer.write(IAC + WILL + BINARY)
    writer.write(IAC + WONT + TTYPE)

    # verify,
    srv_instance = yield from asyncio.wait_for(_waiter, 0.5)
    assert srv_instance.encoding(incoming=True) == 'utf8'
    assert srv_instance.encoding(outgoing=True) == 'US-ASCII'
    assert srv_instance.encoding(incoming=True, outgoing=True) == 'US-ASCII'
コード例 #13
0
def test_telnet_client_and_server_escape_iac_binary(event_loop, bind_host,
                                                    unused_tcp_port):
    """Ensure that IAC (byte 255) may be sent across the wire in binary."""
    # given
    _waiter = asyncio.Future()
    given_string = bytes(range(256)) * 2

    yield from telnetlib3.create_server(host=bind_host,
                                        port=unused_tcp_port,
                                        _waiter_connected=_waiter,
                                        loop=event_loop,
                                        encoding=False,
                                        connect_maxwait=0.05)

    client_reader, client_writer = yield from telnetlib3.open_connection(
        host=bind_host,
        port=unused_tcp_port,
        loop=event_loop,
        encoding=False,
        connect_minwait=0.05)

    server = yield from asyncio.wait_for(_waiter, 0.5)

    server.writer.write(given_string)
    result = yield from client_reader.read(len(given_string))
    assert result == given_string
    server.writer.close()
    eof = yield from asyncio.wait_for(client_reader.read(), 0.5)
    assert eof == b''
コード例 #14
0
def test_telnet_client_send_xdisploc(event_loop, bind_host, unused_tcp_port):
    """Test Client's callback method send_xdisploc()."""
    # given
    _waiter = asyncio.Future()
    given_xdisploc = 'alpha'

    class ServerTestXdisploc(telnetlib3.TelnetServer):
        def on_xdisploc(self, xdisploc):
            super().on_xdisploc(xdisploc)
            _waiter.set_result(xdisploc)

        def begin_advanced_negotiation(self):
            from telnetlib3.telopt import DO, XDISPLOC
            super().begin_advanced_negotiation()
            self.writer.iac(DO, XDISPLOC)

    yield from telnetlib3.create_server(protocol_factory=ServerTestXdisploc,
                                        host=bind_host,
                                        port=unused_tcp_port,
                                        loop=event_loop)

    reader, writer = yield from telnetlib3.open_connection(
        host=bind_host,
        port=unused_tcp_port,
        loop=event_loop,
        xdisploc=given_xdisploc,
        connect_minwait=0.05)

    recv_xdisploc = yield from asyncio.wait_for(_waiter, 0.5)
    assert recv_xdisploc == given_xdisploc
コード例 #15
0
def test_telnet_server_on_naws(event_loop, bind_host, unused_tcp_port):
    """Test Server's Negotiate about window size (NAWS)."""
    # given
    from telnetlib3.telopt import IAC, WILL, SB, SE, NAWS
    _waiter = asyncio.Future()
    given_cols, given_rows = 40, 20

    class ServerTestNaws(telnetlib3.TelnetServer):
        def on_naws(self, width, height):
            super().on_naws(width, height)
            _waiter.set_result(self)

    yield from telnetlib3.create_server(protocol_factory=ServerTestNaws,
                                        host=bind_host,
                                        port=unused_tcp_port,
                                        loop=event_loop,
                                        connect_maxwait=0.05)

    reader, writer = yield from asyncio.open_connection(host=bind_host,
                                                        port=unused_tcp_port,
                                                        loop=event_loop)

    # exercise,
    writer.write(IAC + WILL + NAWS)
    writer.write(IAC + SB + NAWS + struct.pack('!HH', given_cols, given_rows) +
                 IAC + SE)

    srv_instance = yield from asyncio.wait_for(_waiter, 0.5)
    assert srv_instance.get_extra_info('cols') == given_cols
    assert srv_instance.get_extra_info('rows') == given_rows
コード例 #16
0
def test_telnet_server_reject_environ(event_loop, bind_host,
                                      unused_tcp_port):
    """Test Client's callback method send_environ() for specific requests."""
    from telnetlib3.telopt import SB, NEW_ENVIRON
    # given
    given_cols = 19
    given_rows = 84
    given_encoding = 'cp437'
    given_term = 'vt220'

    class ServerTestEnviron(telnetlib3.TelnetServer):
        def on_request_environ(self):
            return None

    yield from telnetlib3.create_server(
        protocol_factory=ServerTestEnviron,
        host=bind_host, port=unused_tcp_port,
        loop=event_loop)

    reader, writer = yield from telnetlib3.open_connection(
        host=bind_host, port=unused_tcp_port, loop=event_loop,
        cols=given_cols, rows=given_rows, encoding=given_encoding,
        term=given_term, connect_minwait=0.05, connect_maxwait=0.05)

    # this causes the client to expect the server to have demanded environment
    # values, since it did, of course demand DO NEW_ENVIRON! However, our API
    # choice here has chosen not to -- the client then indicates this as a
    # failed sub-negotiation (SB + NEW_ENVIRON).
    _failed = {key: val for key, val in writer.pending_option.items() if val}
    assert _failed == {SB + NEW_ENVIRON: True}
コード例 #17
0
def test_telnet_client_send_environ(event_loop, bind_host,
                                    unused_tcp_port):
    """Test Client's callback method send_environ() for specific requests."""
    # given
    _waiter = asyncio.Future()
    given_cols = 19
    given_rows = 84
    given_encoding = 'cp437'
    given_term = 'vt220'

    class ServerTestEnviron(telnetlib3.TelnetServer):
        def on_environ(self, mapping):
            super().on_environ(mapping)
            _waiter.set_result(mapping)

    yield from telnetlib3.create_server(
        protocol_factory=ServerTestEnviron,
        host=bind_host, port=unused_tcp_port,
        loop=event_loop)

    reader, writer = yield from telnetlib3.open_connection(
        host=bind_host, port=unused_tcp_port, loop=event_loop,
        cols=given_cols, rows=given_rows, encoding=given_encoding,
        term=given_term, connect_minwait=0.05)

    mapping = yield from asyncio.wait_for(_waiter, 0.5)
    assert mapping == {
        'COLUMNS': str(given_cols),
        'LANG': 'en_US.' + given_encoding,
        'LINES': str(given_rows),
        'TERM': 'vt220'
    }
コード例 #18
0
    def setup():
        if (len(sys.argv) > 1) and sys.argv[1] == "cli":
            try:
                import telnetlib3
            except:
                print("Please run 'pip install telnetlib3' to use remote CLI")
                ConfigUtil.save()
                exit(0)

            try:
                import telnetlib3
                import asyncio
                from util.RemoteCliHandler import RemoteCliHandler

                port = 8888
                if (len(sys.argv) > 2):
                    port = int(sys.argv[2])
                print("Running in remote CLI Mode on port {0}".format(port))
                print("Access by 'telnet {0} {1}'".format(RemoteCliHandler.get_ip(), port))
                print("Press Ctrl-C to stop the server")
                loop = asyncio.get_event_loop()
                coro = telnetlib3.create_server(port=port, shell=RemoteCliHandler.shell)
                server = loop.run_until_complete(coro)
                loop.run_until_complete(server.wait_closed())
                exit(0)
            except KeyboardInterrupt:
                exit(0)
            except Exception as e:
                print(str(e))
                exit(-1)
コード例 #19
0
ファイル: conftest.py プロジェクト: JPHutchins/pyavreceiver
def mock_telnet_echo(event_loop: asyncio.AbstractEventLoop):
    """Mock a silent telnet server."""
    async def shell(reader: telnetlib3.TelnetReader,
                    writer: telnetlib3.TelnetWriter):
        await reader.readuntil(separator=b"\r")
        writer.write("PWON\ra1\r")
        await writer.drain()

        await asyncio.sleep(1)
        writer.write("a\r")
        await writer.drain()

        await asyncio.sleep(0.25)
        writer.write("a\r")
        await writer.drain()

        await asyncio.sleep(0.25)
        writer.write("a\r")
        await writer.drain()

    coro = telnetlib3.create_server(port=4000, shell=shell)
    server = event_loop.run_until_complete(coro)
    yield
    server.close()
    event_loop.run_until_complete(server.wait_closed())
コード例 #20
0
def test_telnet_server_on_charset(event_loop, bind_host, unused_tcp_port):
    """Test Server's callback method on_charset()."""
    # given
    from telnetlib3.telopt import (IAC, WILL, WONT, SB, SE, TTYPE, CHARSET,
                                   ACCEPTED)
    _waiter = asyncio.Future()
    given_charset = 'KOI8-U'

    class ServerTestCharset(telnetlib3.TelnetServer):
        def on_charset(self, charset):
            super().on_charset(charset)
            _waiter.set_result(self)

    yield from telnetlib3.create_server(protocol_factory=ServerTestCharset,
                                        host=bind_host,
                                        port=unused_tcp_port,
                                        loop=event_loop)

    reader, writer = yield from asyncio.open_connection(host=bind_host,
                                                        port=unused_tcp_port,
                                                        loop=event_loop)

    val = yield from asyncio.wait_for(reader.readexactly(3), 0.5)
    # exercise,
    writer.write(IAC + WILL + CHARSET)
    writer.write(IAC + WONT + TTYPE)
    writer.write(IAC + SB + CHARSET + ACCEPTED +
                 given_charset.encode('ascii') + IAC + SE)

    # verify,
    srv_instance = yield from asyncio.wait_for(_waiter, 2.0)
    assert srv_instance.get_extra_info('charset') == given_charset
コード例 #21
0
def test_telnet_client_no_charset(event_loop, bind_host, unused_tcp_port):
    """Test Client's callback method send_charset() does not select."""
    # given
    _waiter = asyncio.Future()

    class ServerTestCharset(telnetlib3.TelnetServer):
        def on_request_charset(self):
            return ['illegal', 'this-is-no-good-either']

    class ClientTestCharset(telnetlib3.TelnetClient):
        def send_charset(self, offered):
            selected = super().send_charset(offered)
            _waiter.set_result(selected)
            return selected

    yield from telnetlib3.create_server(protocol_factory=ServerTestCharset,
                                        host=bind_host,
                                        port=unused_tcp_port,
                                        loop=event_loop)

    reader, writer = yield from telnetlib3.open_connection(
        client_factory=ClientTestCharset,
        host=bind_host,
        port=unused_tcp_port,
        loop=event_loop,
        encoding='latin1',
        connect_minwait=0.05)

    # charset remains latin1
    val = yield from asyncio.wait_for(_waiter, 0.5)
    assert val == ''
    assert writer.get_extra_info('charset') == 'latin1'
コード例 #22
0
ファイル: test_ttype.py プロジェクト: zhangjd0411/telnetlib3
def test_telnet_server_on_ttype_empty(
        event_loop, bind_host, unused_tcp_port):
    """Test Server's callback method on_ttype(): empty value is ignored. """
    # given
    from telnetlib3.telopt import IAC, WILL, SB, SE, IS, TTYPE
    _waiter = asyncio.Future()
    given_ttypes = ('ALPHA', '', 'BETA')

    class ServerTestTtype(telnetlib3.TelnetServer):
        def on_ttype(self, ttype):
            super().on_ttype(ttype)
            if ttype == given_ttypes[-1]:
                _waiter.set_result(self)

    yield from telnetlib3.create_server(
        protocol_factory=ServerTestTtype,
        host=bind_host, port=unused_tcp_port,
        loop=event_loop)

    reader, writer = yield from asyncio.open_connection(
        host=bind_host, port=unused_tcp_port, loop=event_loop)

    # exercise,
    writer.write(IAC + WILL + TTYPE)
    for send_ttype in given_ttypes:
        writer.write(IAC + SB + TTYPE + IS +
                     send_ttype.encode('ascii') +
                     IAC + SE)

    # verify,
    srv_instance = yield from asyncio.wait_for(_waiter, 0.5)
    assert srv_instance.get_extra_info('ttype1') == 'ALPHA'
    assert srv_instance.get_extra_info('ttype2') == 'BETA'
    assert srv_instance.get_extra_info('TERM') == 'BETA'
コード例 #23
0
ファイル: test_ttype.py プロジェクト: zhangjd0411/telnetlib3
def test_telnet_server_on_ttype(event_loop, bind_host, unused_tcp_port):
    """Test Server's callback method on_ttype()."""
    # given
    from telnetlib3.telopt import IAC, WILL, SB, SE, IS, TTYPE
    _waiter = asyncio.Future()

    class ServerTestTtype(telnetlib3.TelnetServer):
        def on_ttype(self, ttype):
            super().on_ttype(ttype)
            _waiter.set_result(self)

    yield from telnetlib3.create_server(
        protocol_factory=ServerTestTtype,
        host=bind_host, port=unused_tcp_port,
        loop=event_loop)

    reader, writer = yield from asyncio.open_connection(
        host=bind_host, port=unused_tcp_port, loop=event_loop)

    # exercise,
    writer.write(IAC + WILL + TTYPE)
    writer.write(IAC + SB + TTYPE + IS + b'ALPHA' + IAC + SE)
    writer.write(IAC + SB + TTYPE + IS + b'ALPHA' + IAC + SE)

    # verify,
    srv_instance = yield from asyncio.wait_for(_waiter, 0.5)
    assert 'ALPHA' == srv_instance.get_extra_info('ttype1')
    assert 'ALPHA' == srv_instance.get_extra_info('ttype2')
    assert 'ALPHA' == srv_instance.get_extra_info('TERM')
コード例 #24
0
def test_telnet_server_default_timeout(event_loop, bind_host, unused_tcp_port):
    """Test callback on_timeout() as coroutine of create_server()."""
    from telnetlib3.telopt import IAC, WONT, TTYPE
    # given,
    _waiter = asyncio.Future()
    given_timeout = 19.29

    yield from telnetlib3.create_server(_waiter_connected=_waiter,
                                        host=bind_host,
                                        port=unused_tcp_port,
                                        loop=event_loop,
                                        timeout=given_timeout)

    reader, writer = yield from asyncio.open_connection(host=bind_host,
                                                        port=unused_tcp_port,
                                                        loop=event_loop)

    writer.write(IAC + WONT + TTYPE)

    server = yield from asyncio.wait_for(_waiter, 0.5)
    assert server.get_extra_info('timeout') == given_timeout

    # exercise, calling set_timeout remains the default given_value.
    server.set_timeout()
    assert server.get_extra_info('timeout') == given_timeout
コード例 #25
0
async def test_telnet_client_send_charset(event_loop, bind_host,
                                          unused_tcp_port):
    """Test Client's callback method send_charset() selection for illegals."""
    # given
    _waiter = asyncio.Future()

    class ServerTestCharset(telnetlib3.TelnetServer):
        def on_request_charset(self):
            return ['illegal', 'cp437']

    class ClientTestCharset(telnetlib3.TelnetClient):
        def send_charset(self, offered):
            selected = super().send_charset(offered)
            _waiter.set_result(selected)
            return selected

    await asyncio.wait_for(
        telnetlib3.create_server(protocol_factory=ServerTestCharset,
                                 host=bind_host,
                                 port=unused_tcp_port,
                                 loop=event_loop), 0.15)

    reader, writer = await asyncio.wait_for(
        telnetlib3.open_connection(client_factory=ClientTestCharset,
                                   host=bind_host,
                                   port=unused_tcp_port,
                                   loop=event_loop,
                                   encoding='latin1',
                                   connect_minwait=0.05), 0.15)

    val = await asyncio.wait_for(_waiter, 1.5)
    assert val == 'cp437'
    assert writer.get_extra_info('charset') == 'cp437'
コード例 #26
0
ファイル: test_core.py プロジェクト: zhangjd0411/telnetlib3
def test_telnet_server_closed_by_error(event_loop, bind_host, unused_tcp_port):
    """Exercise TelnetServer.connection_lost by exception."""
    from telnetlib3.telopt import IAC, DO, WONT, TTYPE

    # given
    _waiter_connected = asyncio.Future()
    _waiter_closed = asyncio.Future()

    yield from telnetlib3.create_server(_waiter_connected=_waiter_connected,
                                        _waiter_closed=_waiter_closed,
                                        host=bind_host,
                                        port=unused_tcp_port,
                                        loop=event_loop)

    reader, writer = yield from asyncio.open_connection(host=bind_host,
                                                        port=unused_tcp_port,
                                                        loop=event_loop)

    writer.write(IAC + WONT + TTYPE)
    server = yield from asyncio.wait_for(_waiter_connected, 0.5)

    class CustomException(Exception):
        pass

    # exercise, by connection_lost(exc=Exception())..
    server.writer.write('Bye!')
    server.connection_lost(CustomException('blah!'))

    # verify, custom exception is thrown into any yielding reader
    with pytest.raises(CustomException):
        yield from server.reader.read()
コード例 #27
0
ファイル: test_core.py プロジェクト: zhangjd0411/telnetlib3
def test_telnet_server_negotiation_fail(event_loop, bind_host,
                                        unused_tcp_port):
    """Test telnetlib3.TelnetServer() negotiation failure with client."""
    from telnetlib3.telopt import DO, TTYPE
    # given
    _waiter_connected = asyncio.Future()

    yield from telnetlib3.create_server(_waiter_connected=_waiter_connected,
                                        host=bind_host,
                                        port=unused_tcp_port,
                                        loop=event_loop,
                                        connect_maxwait=0.05)

    reader, writer = yield from asyncio.open_connection(host=bind_host,
                                                        port=unused_tcp_port,
                                                        loop=event_loop)

    # exercise,
    reader.readexactly(3)  # IAC DO TTYPE, we ignore it!

    # negotiation then times out, deferring to waiter_connected.
    server = yield from asyncio.wait_for(_waiter_connected, 1.0)

    # verify,
    assert server.negotiation_should_advance() is False
    assert server.writer.pending_option[DO + TTYPE] == True

    assert repr(server.writer) == ('<TelnetWriter server '
                                   'mode:local +lineflow -xon_any +slc_sim '
                                   'failed-reply:DO TTYPE>')
コード例 #28
0
ファイル: test_core.py プロジェクト: zhangjd0411/telnetlib3
def test_telnet_server_closed_by_client(event_loop, bind_host,
                                        unused_tcp_port):
    """Exercise TelnetServer.connection_lost."""
    # given
    _waiter = asyncio.Future()

    yield from telnetlib3.create_server(_waiter_closed=_waiter,
                                        host=bind_host,
                                        port=unused_tcp_port,
                                        loop=event_loop)

    reader, writer = yield from asyncio.open_connection(host=bind_host,
                                                        port=unused_tcp_port,
                                                        loop=event_loop)

    # exercise,
    writer.close()

    # verify,
    srv_instance = yield from asyncio.wait_for(_waiter, 0.5)
    assert srv_instance._closing

    # exercise, a 2nd call to .connection_lost() returns early,
    # allowing callbacks the freedom to call it at any time from
    # the server-end to dump the client.
    srv_instance.connection_lost(exc=None)
コード例 #29
0
ファイル: test_reader.py プロジェクト: zhangjd0411/telnetlib3
def test_telnet_reader_read_beyond_limit_bytes(
        event_loop, bind_host, unused_tcp_port):
    """Ensure ability to read(-1) beyond segment sizes of reader._limit."""
    # given
    _waiter = asyncio.Future()

    limit = 10

    def shell(reader, writer):
        assert reader._limit == limit
        given = b'x' * (limit + 1)
        writer.write(given)
        writer.close()

    yield from telnetlib3.create_server(
        host=bind_host, port=unused_tcp_port, loop=event_loop,
        connect_maxwait=0.05, shell=shell, encoding=False, limit=limit)

    client_reader, client_writer = yield from telnetlib3.open_connection(
        host=bind_host, port=unused_tcp_port, loop=event_loop,
        connect_minwait=0.05, encoding=False, limit=limit)

    assert client_reader._limit == limit
    value = yield from asyncio.wait_for(client_reader.read(), 0.5)
    assert value == b'x' * (limit + 1)
コード例 #30
0
ファイル: test_reader.py プロジェクト: zhangjd0411/telnetlib3
def test_telnet_reader_read_exactly_bytes(
        event_loop, bind_host, unused_tcp_port):
    """Ensure TelnetReader.readexactly, especially IncompleteReadError."""
    # given
    _waiter = asyncio.Future()
    given = string.ascii_letters.encode('ascii')
    given_partial = b'zzz'

    def shell(reader, writer):
        writer.write(given + given_partial)
        writer.close()

    yield from telnetlib3.create_server(
        host=bind_host, port=unused_tcp_port, loop=event_loop,
        connect_maxwait=0.05, shell=shell, encoding=False)

    client_reader, client_writer = yield from telnetlib3.open_connection(
        host=bind_host, port=unused_tcp_port, loop=event_loop,
        connect_minwait=0.05, encoding=False)

    # exercise, readexactly # bytes of given
    result = yield from asyncio.wait_for(
        client_reader.readexactly(len(given)), 0.5)

    # verify,
    assert result == given

    # exercise, read 1 byte beyond given_partial
    given_readsize = len(given_partial) + 1
    with pytest.raises(asyncio.IncompleteReadError) as exc_info:
        result = yield from asyncio.wait_for(
            client_reader.readexactly(given_readsize), 0.5)

    assert exc_info.value.partial == given_partial
    assert exc_info.value.expected == given_readsize
コード例 #31
0
def test_telnet_server_set_timeout(event_loop, bind_host, unused_tcp_port):
    """Test callback on_timeout() as coroutine of create_server()."""
    from telnetlib3.telopt import IAC, WONT, TTYPE
    # given,
    _waiter = asyncio.Future()

    # exercise,
    yield from telnetlib3.create_server(_waiter_connected=_waiter,
                                        host=bind_host,
                                        port=unused_tcp_port,
                                        loop=event_loop)

    reader, writer = yield from asyncio.open_connection(host=bind_host,
                                                        port=unused_tcp_port,
                                                        loop=event_loop)

    writer.write(IAC + WONT + TTYPE)

    server = yield from asyncio.wait_for(_waiter, 0.5)
    for value in (19.29, 0):
        server.set_timeout(value)
        assert server.get_extra_info('timeout') == value

    # calling with no arguments does nothing, only resets
    # the timer. value remains the last-most value from
    # previous loop
    server.set_timeout()
    assert server.get_extra_info('timeout') == 0
コード例 #32
0
def test_extended(server_factory, event_loop, bind_host, unused_tcp_port, log):
    """Using coupled connections, exercise extended telnet options."""
    event_loop.set_debug(True)
    waiter_server_connected = asyncio.Future()
    waiter_client_connected = asyncio.Future()
    waiter_client_closed = asyncio.Future()

    server = yield from telnetlib3.create_server(
        host=bind_host, port=unused_tcp_port,
        waiter_connected=waiter_server_connected,
        log=log)

    log.info('Listening on {0}'.format(server.sockets[0].getsockname()))

    _, client = yield from event_loop.create_connection(
        protocol_factory=lambda: TestTelnetClient(
            waiter_connected=waiter_client_connected,
            waiter_closed=waiter_client_closed,
            encoding='utf8', log=log),
        host=bind_host, port=unused_tcp_port)

    wait_for = [waiter_client_connected, waiter_server_connected]
    done, pending = yield from asyncio.wait(wait_for,
                                            loop=event_loop,
                                            timeout=1)

    assert not pending, (done, pending, wait_for)

    from telnetlib3.telopt import WILL, TSPEED
    client.writer.iac(WILL, TSPEED)
    client.writer.write(u'quit\r')
    wait_for = [waiter_client_closed]
    done, pending = yield from asyncio.wait(wait_for,
                                            loop=event_loop,
                                            timeout=1)
    assert not pending, (done, pending, wait_for)

    server.close()
    yield from server.wait_closed()
コード例 #33
0
def test_telnet_coupled(server_factory, event_loop, bind_host, unused_tcp_port, log):
    """Couple TelnetClient to TelnetServer as standard protocol connection."""
    event_loop.set_debug(True)
    waiter_server_connected = asyncio.Future()
    waiter_client_connected = asyncio.Future()
    waiter_client_closed = asyncio.Future()

    server = yield from telnetlib3.create_server(
        host=bind_host, port=unused_tcp_port,
        waiter_connected=waiter_server_connected,
        log=log)

    log.info('Listening on {0}'.format(server.sockets[0].getsockname()))

    _, client = yield from event_loop.create_connection(
        protocol_factory=lambda: TestTelnetClient(
            waiter_connected=waiter_client_connected,
            waiter_closed=waiter_client_closed,
            encoding='utf8', log=log),
        host=bind_host, port=unused_tcp_port)

    wait_for = [waiter_client_connected, waiter_server_connected]
    done, pending = yield from asyncio.wait(wait_for,
                                            loop=event_loop,
                                            timeout=1)

    assert not pending, wait_for

    client.writer.write(u'quit\r')
    server.close()
    wait_for = [waiter_client_closed, server.wait_closed()]
    done, pending = yield from asyncio.wait(wait_for,
                                            loop=event_loop,
                                            timeout=1)

    assert not pending, (done, pending, wait_for)
コード例 #34
0
ファイル: wargame.py プロジェクト: paytonrules/wargames
import asyncio, telnetlib3

@asyncio.coroutine
def shell(reader, writer):
    writer.write('Would you like to play a game? ')
    inp = yield from reader.read(1)
    if inp:
        writer.echo(inp)
        writer.write('\r\nThey say the only way to win '
                     'is to not play at all.\r\n')
        yield from writer.drain()
    writer.close()

loop = asyncio.get_event_loop()
coro = telnetlib3.create_server(port=6023, shell=shell)
server = loop.run_until_complete(coro)
loop.run_until_complete(server.wait_closed())
コード例 #35
0
ファイル: test_bsdtelnet.py プロジェクト: jquast/telnetlib3
def test_bsdtelnet(server_factory, event_loop, bind_host, unused_tcp_port, log):
    """Simple telnet(1) as client (issues 'quit' command)."""
    # if the event loop is not set in debug mode, pexpect blows up !
    # https://github.com/pexpect/pexpect/issues/294
    event_loop.set_debug(True)

    server_connected = asyncio.Future()
    server_closed = asyncio.Future()

    server = yield from telnetlib3.create_server(
        host=bind_host, port=unused_tcp_port,
        waiter_connected=server_connected,
        waiter_closed=server_closed,
        log=log)

    log.info('Listening on {0}'.format(server.sockets[0].getsockname()))

    child = pexpect.spawn(command='telnet', encoding='utf8',
                          echo=False, maxread=65534,
                          searchwindowsize=1024, timeout=1)

    child.delaybeforesend = 0.0
    child.delayafterterminate = 0.0
    child.delayafterclose = 0.0

    # set client-side debugging of telnet negotiation
    yield from child.expect("telnet> ", async=True)
    child.sendline(u"set options")

    # and connect,
    yield from child.expect(u"telnet> ", async=True)
    child.sendline(u"open {0} {1}".format(bind_host, unused_tcp_port))

    # await connection banner,
    yield from child.expect_exact("Trying {0}...\r\n".format(bind_host),
                                  timeout=5,
                                  async=True)

    # find the prompt, '%'
    client_connected = child.expect('.* % ', async=True, timeout=None)

    done, pending = yield from asyncio.wait(
        [client_connected, server_connected],
        loop=event_loop, timeout=1,
        return_when=asyncio.ALL_COMPLETED)

    assert not pending, (client_connected, server_connected)

    cancelled = {future for future in done if future.cancelled()}
    log.debug('done {0}'.format(done))
    log.debug('pending {0}'.format(pending))
    log.debug('cancelled {0}'.format(cancelled))

    assert not cancelled, (done, pending, cancelled, child.buffer)

    child.sendline(u"quit")
    telnet_closed = child.expect(pexpect.EOF, async=True, timeout=None)
    done, pending = yield from asyncio.wait(
        [telnet_closed, server_closed],
        loop=event_loop, timeout=1,
        return_when=asyncio.ALL_COMPLETED)

    assert not any(future.cancelled() for future in done), done

    assert not pending, (telnet_closed, server_closed)