diff --git a/listboxes b/listboxes new file mode 100755 index 0000000..2bf1470 --- /dev/null +++ b/listboxes @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 +import sys +from pathlib import Path +from configparser import ConfigParser +from socket import gethostbyname, create_connection + +# cfgdir = Path('~/boxtools/cfg').expanduser() +cfgdir = Path(__file__).parent / 'cfg' +print(cfgdir, cfgdir.is_dir()) + + +def check_ssh(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, '' + else: + test_socket.close() + return True, addr + + +opt = sys.argv[-1] +header = ['box name', 'box type', 'frappy', 'R'] +if opt != 's': + if opt == 'a': + header.extend(['*online ip ', 'MAC addr']) + else: + header.append('ip') +table = [header] + +for file in sorted(cfgdir.glob('*.cfg')): + parser = ConfigParser() + parser.read(file) + info = {k: dict(parser[k]) for k in parser.sections()} + router = info.get('ROUTER') + router = 'R' if router else '' + frappy = info.get('FRAPPY', {}).get('cfg', '') + box = info.get('BOX', {}) + row = [file.stem, box.get('type', 'unknown'), frappy, router] + if opt != 's': + row.append('') + 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))] + +inside = False +print() +for row in table: + if inside: + if opt != 's': + online, addr = check_ssh(row[0]) + if opt == 'a': + addr = ('*' if online else ' ') + addr + elif not 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) +""" +if opt in 'sao': + print() +else: + print(USAGE)