예제 #1
0
class CogLineConsole:
    def __init__(self, cog_h, orb, engine):
        self.cog_h = cog_h
        self.orb = orb
        self.engine = engine

        self.track_prime = self.orb.track(TrackPrime)

        self.rail_line_console = RailLineConsole()
        self.bulk_send_count = 0

    def on_init(self):
        rail_h = '%s/line_console' % (self.cog_h)
        self.rail_line_console.zero(
            rail_h=rail_h,
            cb_line_console_connect=self.cb_line_console_connect,
            cb_line_console_condrop=self.cb_line_console_condrop,
            cb_line_console_command=self.cb_line_console_command,
            engine=self.engine)

        self.rail_line_console.start(ip=self.track_prime.cons_addr,
                                     port=self.track_prime.cons_port)

    def on_please_queue_for_send(self, enqueue_h, filename):
        self.rail_line_console.send('queued %s (%s)\n' % (enqueue_h, filename))

    def on_failed_queue_for_send(self, enqueue_h, msg):
        self.rail_line_console.send('failed %s (%s)\n' % (enqueue_h, msg))

    def on_okdone_queue_for_send(self, enqueue_h, filename):
        self.rail_line_console.send('okdone %s (%s)\n' % (enqueue_h, filename))

    def cb_line_console_connect(self, cs_line_console_connect):
        addr = cs_line_console_connect.addr
        port = cs_line_console_connect.port

        pass

    def cb_line_console_condrop(self, cs_line_console_condrop):
        msg = cs_line_console_condrop.msg

        pass

    def cb_line_console_command(self, cs_line_console_command):
        tokens = cs_line_console_command.tokens

        if 1 != len(tokens):
            self.rail_line_console.send('error: expected a filename.')
            return

        filename = tokens[0]
        if not os.path.exists(filename):
            self.rail_line_console.send('error: no file %s' % (filename))
            return

        enqueue_h = self.bulk_send_count
        self.bulk_send_count += 1

        self.nearcast.please_queue_for_send(enqueue_h=enqueue_h,
                                            filename=filename)
예제 #2
0
class CogLineConsole:
    def __init__(self, cog_h, orb, engine):
        self.cog_h = cog_h
        self.orb = orb
        self.engine = engine
        #
        self.rail_line_console = RailLineConsole()

    #
    def on_init(self):
        rail_h = '%s/line_console' % (self.cog_h)
        self.rail_line_console.zero(
            rail_h=rail_h,
            cb_line_console_connect=lambda cs_line_console_connect: None,
            cb_line_console_condrop=lambda cs_line_console_condrop: None,
            cb_line_console_command=self.cb_line_console_command,
            engine=self.engine)
        self.rail_line_console.start(ip=LC_ADDR, port=LC_PORT)

    def on_note(self, msg):
        col = cformat(string=msg, fg='yellow', bg='trans')
        self.rail_line_console.send(msg='%s\n' % (col))

    #
    def cb_line_console_command(self, cs_line_console_command):
        tokens = cs_line_console_command.tokens
        #
        if 0 == len(tokens):
            return
        self.nearcast.ex_lc(tokens=tokens)
예제 #3
0
class CogToLineConsole:
    def __init__(self, cog_h, orb, engine):
        self.cog_h = cog_h
        self.orb = orb
        self.engine = engine
        #
        self.track_prime = orb.track(TrackPrime)
        #
        self.rail_line_console = RailLineConsole()

    def on_init(self):
        rail_h = '%s/line_console' % (self.cog_h)
        self.rail_line_console.zero(
            rail_h=rail_h,
            cb_line_console_connect=self.cb_line_console_connect,
            cb_line_console_condrop=self.cb_line_console_condrop,
            cb_line_console_command=self.cb_line_console_command,
            engine=self.engine)
        #
        ip = self.track_prime.lc_addr
        port = self.track_prime.lc_port
        self.rail_line_console.start(ip=ip, port=port)

    def cb_line_console_connect(self, cs_line_console_connect):
        rail_h = cs_line_console_connect.rail_h
        #
        pass

    def cb_line_console_condrop(self, cs_line_console_condrop):
        rail_h = cs_line_console_condrop.rail_h
        #
        pass

    def cb_line_console_command(self, cs_line_console_command):
        rail_h = cs_line_console_command.rail_h
        tokens = cs_line_console_command.tokens
        #
        cmd = tokens[0]
        rest = tokens[1:]
        if cmd == 'q':
            raise SolentQuitException()
        else:
            self.rail_line_console.send('  ??\r\n')
예제 #4
0
def should_transfer_of_text():
    ip = 'localhost'
    port = 5000
    #
    engine = Engine(mtu=MTU)
    receiver = Receiver()
    #
    # step: start it
    rail_line_console = RailLineConsole()
    rail_h = 'test/line_console'
    rail_line_console.zero(
        rail_h=rail_h,
        cb_line_console_connect=receiver.on_line_console_connect,
        cb_line_console_condrop=receiver.on_line_console_condrop,
        cb_line_console_command=receiver.on_line_console_command,
        engine=engine)
    rail_line_console.start(ip=ip, port=port)
    #
    # verify
    engine.cycle()
    assert rail_line_console.is_server_listening() == True
    assert rail_line_console.is_accept_connected() == False
    #
    # step: client connects
    client = engine.init_spin(construct=SpinBasicTcpClient)
    client.start(addr=ip, port=port)
    #
    # verify
    engine.cycle()
    assert rail_line_console.is_server_listening() == False
    assert rail_line_console.is_accept_connected() == True
    assert client.is_connected() == True
    #
    # step: client sends text that does not have a newline
    client.send(msg="abc def")  # emphasis: no newline
    #
    # verify: we should not have received a line
    engine.cycle()
    assert 0 == len(receiver.sb)
    #
    # step: now send a new line and some overflow
    client.send(msg="\noverflow")
    client.send(msg="/second half")
    #
    # verify: we should have seen our first line
    engine.cycle()
    assert 1 == len(receiver.sb)
    assert receiver.sb[0] == ['abc', 'def']
    #
    # step: another line ending
    client.send(msg='\n')
    #
    # verify
    engine.cycle()
    assert 2 == len(receiver.sb)
    assert receiver.sb[-1] == ['overflow/second', 'half']
    #
    # step: multiple lines in one pass
    client.send(msg="three\nfour\n")
    #
    # verify
    engine.cycle()
    assert 4 == len(receiver.sb)
    assert receiver.sb[-2] == [
        'three',
    ]
    assert receiver.sb[-1] == [
        'four',
    ]
    #
    # step: we write to client
    s = "here is some text\n"
    rail_line_console.send(msg=s)
    #
    # verify
    engine.cycle()
    assert 1 == len(client.sb)
    assert client.sb[-1] == s
    #
    return True
예제 #5
0
class CogToLineConsole:
    def __init__(self, cog_h, orb, engine):
        self.cog_h = cog_h
        self.orb = orb
        self.engine = engine
        #
        self.rail_line_console = RailLineConsole()

    #
    def on_init(self):
        rail_h = '%s/line_console' % (self.cog_h)
        self.rail_line_console.zero(
            rail_h=rail_h,
            cb_line_console_connect=self.cb_line_console_connect,
            cb_line_console_condrop=self.cb_line_console_condrop,
            cb_line_console_command=self.cb_line_console_command,
            engine=self.engine)
        #
        self.rail_line_console.start(ip=LC_ADDR, port=LC_PORT)

    def on_to_line_console(self, s):
        self.rail_line_console.send(msg='%s\n' % s)

    #
    def cb_line_console_connect(self, cs_line_console_connect):
        addr = cs_line_console_connect.addr
        port = cs_line_console_connect.port
        #
        self.nearcast.line_console_connect(addr=addr, port=port)

    def cb_line_console_condrop(self, cs_line_console_condrop):
        msg = cs_line_console_condrop.msg
        #
        self.nearcast.line_console_condrop(msg=msg)

    def cb_line_console_command(self, cs_line_console_command):
        tokens = cs_line_console_command.tokens

        #
        def complain(msg):
            self.rail_line_console.send(msg='%s\n' % msg)

        #
        if 0 == len(tokens):
            pass
        elif tokens[0] == 'add':
            if 3 != len(tokens):
                complain('Usage: add a b')
                return
            (_, a, b) = tokens
            self.nearcast.cmd_add(a=a, b=b)
        elif tokens[0] == 'echo':
            if 2 != len(tokens):
                complain('Usage: echo s')
                return
            (_, s) = tokens
            self.nearcast.cmd_echo(s=s)
        elif tokens[0] == 'quit':
            self.nearcast.cmd_quit()
        else:
            complain('??')
            return