diff --git a/README.md b/README.md index d763178..67f3a21 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ emulation. - [x] TN3270 - [x] Extended Data Stream - [x] Basic TN3270E + - [x] Device name (_LU_) negotiation - [ ] SSL/TLS - [x] VT100 - [ ] Connection menu diff --git a/oec/__main__.py b/oec/__main__.py index 5125e48..3012449 100644 --- a/oec/__main__.py +++ b/oec/__main__.py @@ -77,7 +77,7 @@ def _create_device(args, interface, device_address, poll_response): def _create_session(args, device): if args.emulator == 'tn3270': - return TN3270Session(device, args.host, args.port, args.character_encoding) + return TN3270Session(device, args.host, args.port, args.device_names, args.character_encoding) if args.emulator == 'vt100' and IS_VT100_AVAILABLE: host_command = [args.command, *args.command_args] @@ -89,7 +89,6 @@ def _create_session(args, device): def parse_tn3270_host_args(args, parser): elements = args.host.rsplit(':', 1) - host = elements[0] port = None if len(elements) > 1: @@ -106,7 +105,18 @@ def parse_tn3270_host_args(args, parser): else: logger.warning('The port argument is deprecated and will be removed in the future, port from host:port is being used.') - return (host, port if port is not None else 23) + if port is None: + port = 23 + + elements = elements[0].split('@', 1) + + host = elements[-1] + device_names = None + + if len(elements) > 1: + device_names = elements[0].split(',') + + return (host, port, device_names) def _signal_handler(number, frame): global CONTROLLER @@ -134,8 +144,8 @@ def main(): tn3270_parser = subparsers.add_parser('tn3270', description='TN3270 emulator', help='TN3270 emulator') - tn3270_parser.add_argument('host', metavar='host[:port]', - help='host and optional port') + tn3270_parser.add_argument('host', metavar='[lu[,lu...]@]host[:port]', + help='host and optional port and LUs') tn3270_parser.add_argument('port', nargs='?', type=int, help=argparse.SUPPRESS) tn3270_parser.add_argument('--codepage', metavar='encoding', default='ibm037', @@ -152,7 +162,7 @@ def main(): args = parser.parse_args() if args.emulator == 'tn3270': - (args.host, args.port) = parse_tn3270_host_args(args, parser) + (args.host, args.port, args.device_names) = parse_tn3270_host_args(args, parser) create_device = lambda interface, device_address, poll_response: _create_device(args, interface, device_address, poll_response) create_session = lambda device: _create_session(args, device) diff --git a/oec/tn3270.py b/oec/tn3270.py index 229d6f8..4292cf7 100644 --- a/oec/tn3270.py +++ b/oec/tn3270.py @@ -47,13 +47,14 @@ AID_KEY_MAP = { class TN3270Session(Session): """TN3270 session.""" - def __init__(self, terminal, host, port, character_encoding): + def __init__(self, terminal, host, port, device_names, character_encoding): super().__init__(terminal) self.logger = logging.getLogger(__name__) self.host = host self.port = port + self.device_names = device_names self.character_encoding = character_encoding self.telnet = None @@ -192,7 +193,7 @@ class TN3270Session(Session): self.telnet = Telnet(terminal_type) - self.telnet.open(self.host, self.port) + self.telnet.open(self.host, self.port, self.device_names) if self.telnet.is_tn3270e_negotiated: self.logger.info(f'TN3270E mode negotiated: Device Type = {self.telnet.device_type}, Device Name = {self.telnet.device_name}') diff --git a/requirements.txt b/requirements.txt index c286232..b4ff2af 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ ptyprocess==0.7.0 pycoax==0.11.1 pyserial==3.5 pyte==0.8.1 -pytn3270==0.13.0 +pytn3270==0.14.0 sliplib==0.6.2 sortedcontainers==2.4.0 wcwidth==0.2.5 diff --git a/tests/test_tn3270.py b/tests/test_tn3270.py index 73a2a95..31331b1 100644 --- a/tests/test_tn3270.py +++ b/tests/test_tn3270.py @@ -24,7 +24,7 @@ class SessionHandleHostTestCase(unittest.TestCase): self.terminal = _create_terminal(self.interface) - self.session = TN3270Session(self.terminal, 'mainframe', 23, 'ibm037') + self.session = TN3270Session(self.terminal, 'mainframe', 23, None, 'ibm037') self.telnet = create_autospec(Telnet, instance=True) @@ -71,7 +71,7 @@ class SessionHandleKeyTestCase(unittest.TestCase): self.terminal = _create_terminal(self.interface) - self.session = TN3270Session(self.terminal, 'mainframe', 23, 'ibm037') + self.session = TN3270Session(self.terminal, 'mainframe', 23, None, 'ibm037') self.session.emulator = create_autospec(Emulator, instance=True) @@ -251,7 +251,7 @@ class SessionRenderTestCase(unittest.TestCase): self.terminal.display.flush = Mock(wraps=self.terminal.display.flush) self.terminal.display.status_line.write = Mock(wraps=self.terminal.display.status_line.write) - self.session = TN3270Session(self.terminal, 'mainframe', 23, 'ibm037') + self.session = TN3270Session(self.terminal, 'mainframe', 23, None, 'ibm037') self.session.telnet = create_autospec(Telnet, instance=True) self.session.emulator = create_autospec(Emulator, instance=True)