import time import signal import logging import argparse from serial import Serial from coax import Interface1 from .controller import Controller from .tn3270 import TN3270Session from .vt100 import VT100Session from .keymap_3278_2 import KEYMAP as KEYMAP_3278_2 from .keymap_3483 import KEYMAP as KEYMAP_3483 logging.basicConfig(level=logging.INFO) controller = None def _get_keymap(terminal_id, extended_id): keymap = KEYMAP_3278_2 if extended_id == 'c1348300': keymap = KEYMAP_3483 return keymap def _create_session(args, terminal): if args.emulator == 'tn3270': return TN3270Session(terminal, args.host, args.port) if args.emulator == 'vt100': host_command = [args.command, *args.command_args] return VT100Session(terminal, host_command) raise ValueError('Unsupported emulator') def _signal_handler(number, frame): global controller print('Stopping controller...') if controller: controller.stop() controller = None signal.signal(signal.SIGINT, _signal_handler) signal.signal(signal.SIGTERM, _signal_handler) def main(): global controller parser = argparse.ArgumentParser(description=('An open replacement for the IBM 3174 ' 'Establishment Controller')) parser.add_argument('serial_port', help='Serial port') subparsers = parser.add_subparsers(dest='emulator', required=True, description='Emulator') tn3270_parser = subparsers.add_parser('tn3270', description='TN3270 emulator', help='TN3270 emulator') tn3270_parser.add_argument('host', help='Hostname') tn3270_parser.add_argument('port', nargs='?', default=23, type=int) vt100_parser = subparsers.add_parser('vt100', description='VT100 emulator', help='VT100 emulator') vt100_parser.add_argument('command', help='Host process') vt100_parser.add_argument('command_args', nargs=argparse.REMAINDER, help='Host process arguments') args = parser.parse_args() with Serial(args.serial_port, 115200) as serial: serial.reset_input_buffer() serial.reset_output_buffer() # Allow the interface firmware time to start. time.sleep(3) # Initialize the interface. interface = Interface1(serial) firmware_version = interface.reset() print(f'Interface firmware version {firmware_version}') # Initialize and start the controller. create_session = lambda terminal: _create_session(args, terminal) controller = Controller(interface, _get_keymap, create_session) print('Starting controller...') controller.run() if __name__ == '__main__': main()