From 7da25d41900fee2e76715107f61f8b7844de9f10 Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Wed, 9 Apr 2025 14:12:34 +0200 Subject: [PATCH] listboxes: make nicer --- listboxes | 105 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 72 insertions(+), 33 deletions(-) diff --git a/listboxes b/listboxes index c2b2ce0..d2ff33c 100755 --- a/listboxes +++ b/listboxes @@ -7,33 +7,48 @@ from socket import gethostbyname, create_connection cfgdir = Path(__file__).resolve().parent / 'cfg' -def check_ssh(host, port=22): +def check_connection(host, port=22): try: addr = gethostbyname(host) test_socket = create_connection((addr, port), timeout=0.1) except Exception as e: if isinstance(e, TimeoutError): - return False, addr - return False, '' + return '', addr + return '', '' else: test_socket.close() - return True, addr + return '*', addr +def print_row(row, sizes): + print(' '.join(v.ljust(l) for v, l in zip(row, sizes))) + + +def print_line(sizes): + print(' '.join('-' * l for l in sizes)) + + +legend = ['', '', '* running', '* online'] opt = sys.argv[-1] if opt.startswith('-'): opt = opt[1:] header = ['box name', 'box type', 'frappy'] if opt == 's': - header.append('R') + header.append('') + legend = [] else: + header.append('ip ') if opt == 'a': - header.extend(['router', '*online ip ', 'MAC addr']) + header.extend(['router', 'MAC addr']) else: - header.extend(['R', 'ip']) + header.append('') + legend = legend[:4] table = [header] +all_ports = {} for file in sorted(cfgdir.glob('*.cfg')): + name = file.stem + all_ports[name] = box_ports = {} parser = ConfigParser() parser.read(file) info = {k: dict(parser[k]) for k in parser.sections()} @@ -42,9 +57,12 @@ for file in sorted(cfgdir.glob('*.cfg')): ports = sorted(router) router = [] following = None + firstport = None for p in ports: try: pnum = int(p) + if 'router' not in box_ports: + box_ports['router'] = pnum if pnum == following: first = router[-1].split('-')[0] router[-1] = f'{first}-{following}' @@ -56,42 +74,63 @@ for file in sorted(cfgdir.glob('*.cfg')): router.append(p) router = ' '.join(router) else: - router = 'R' if router else '' - frappy = info.get('FRAPPY', {}).get('cfg', '') + router = 'router' if router else '' + frappy_info = info.get('FRAPPY', {}) + frappy = frappy_info.get('cfg', '') + if frappy: + box_ports['frappy'] = int(frappy_info.get('port', 10767)) box = info.get('BOX', {}) - row = [file.stem, box.get('type', 'unknown'), frappy, router] - if opt != 's': - row.append('') + row = [name, box.get('type', 'unknown'), frappy] + if opt == 's': + row.append(router) + else: + row.extend(['', router]) if opt == 'a': row.append(box.get('mac', '')) table.append(row) sizes = [max([len(row[i]) for row in table]) for i in range(len(header))] +if opt != 's': + # make space for '*' + sizes[2] += 1 + sizes[3] += 1 -inside = False -print() +firstrow = True +print_line(sizes) for row in table: - if inside: + if firstrow: + firstrow = False + print_row(header, sizes) + print_line(sizes) + continue + if row[0]: + name = row[0] + online = '' if opt != 's': - online, addr = check_ssh(row[0]) - if opt == 'a': - addr = ('*' if online else ' ') + addr - elif not online: + online, addr = check_connection(row[0], 22) + addr += online + if opt != 'a' and online != '*': continue - row[4] = addr - print(' '.join(v.ljust(l) for v, l in zip(row, sizes))) - if not inside: - print() - inside = True -USAGE = """ -Usage: - listboxes o # only boxes online (default) - listboxes a # all boxes, all info - listboxes s # short (without ip and online check) + row[3] = addr + if opt != 's': + port = all_ports[name].get('frappy') + if port and online == '*': + flag = check_connection(name, port)[0] + else: + flag = ' ' + row[2] += flag + print(' '.join(v.ljust(l) for v, l in zip(row, sizes))) +print_line(sizes) - column R: router configured +if legend: + print_row(legend, sizes) + + +USAGE = f""" +Usage: + listboxes o # only boxes online (default) + listboxes a # all boxes, all info + listboxes s # without ip and online check """ -if opt in 'sao': - print() -else: +if opt not in 'sao': print(USAGE)