mirror of
https://github.com/lowobservable/oec.git
synced 2026-01-11 23:53:04 +00:00
103 lines
3.3 KiB
Python
103 lines
3.3 KiB
Python
"""
|
|
oec.args
|
|
~~~~~~~~
|
|
"""
|
|
|
|
import argparse
|
|
import codecs
|
|
import logging
|
|
|
|
logger = logging.getLogger('oec.args')
|
|
|
|
def parse_args(args, is_vt100_available):
|
|
parser = argparse.ArgumentParser(description='IBM 3270 terminal 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', 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',
|
|
dest='character_encoding', type=get_character_encoding,
|
|
help='host EBCDIC code page')
|
|
|
|
tn3270_parser.add_argument('--tn3270e', choices=['off', 'basic', 'default'],
|
|
metavar='profile', default='default',
|
|
dest='tn3270e_profile',
|
|
help='TN3270E profile: off, basic, default')
|
|
|
|
if is_vt100_available:
|
|
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(args)
|
|
|
|
if args.emulator == 'tn3270':
|
|
(args.host, args.port, args.device_names) = parse_tn3270_host_args(args, parser)
|
|
|
|
return args
|
|
|
|
def get_character_encoding(encoding):
|
|
try:
|
|
codecs.lookup(encoding)
|
|
except LookupError:
|
|
raise argparse.ArgumentTypeError(f'invalid encoding: {encoding}')
|
|
|
|
return encoding
|
|
|
|
def parse_tn3270_host_args(args, parser):
|
|
elements = args.host.rsplit(':', 1)
|
|
|
|
port = None
|
|
|
|
if len(elements) > 1:
|
|
try:
|
|
port = int(elements[1])
|
|
except ValueError:
|
|
parser.error(f'argument host: invalid port: {elements[1]}')
|
|
|
|
if not is_valid_port(port):
|
|
parser.error(f'argument host: invalid port: {port}')
|
|
|
|
if args.port is not None:
|
|
if port is None:
|
|
if not is_valid_port(args.port):
|
|
parser.error(f'argument port: invalid port: {args.port}')
|
|
|
|
port = args.port
|
|
|
|
logger.info('The port argument is deprecated and will be removed in the future, use host:port instead.')
|
|
else:
|
|
logger.warning('The port argument is deprecated and will be removed in the future, port from host:port is being used.')
|
|
|
|
if port is None:
|
|
port = 23
|
|
|
|
elements = elements[0].split('@', 1)
|
|
|
|
host = elements[-1].strip()
|
|
|
|
if not host:
|
|
parser.error(f'argument host: host name is required: {args.host}')
|
|
|
|
device_names = None
|
|
|
|
if len(elements) > 1:
|
|
device_names = elements[0].split(',')
|
|
|
|
return (host, port, device_names)
|
|
|
|
def is_valid_port(port):
|
|
return port >= 1 and port <= 65535
|