#!/usr/bin/env python3 import sys from pathlib import Path from configparser import ConfigParser from socket import gethostbyname, create_connection cfgdir = Path(__file__).resolve().parent / 'cfg' 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] if opt.startswith('-'): opt = opt[1:] header = ['box name', 'box type', 'frappy'] if opt == 's': header.append('R') else: if opt == 'a': header.extend(['router', '*online ip ', 'MAC addr']) else: header.extend(['R', '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', {}) if opt == 'a': ports = sorted(router) router = [] following = None for p in ports: try: pnum = int(p) if pnum == following: first = router[-1].split('-')[0] router[-1] = f'{first}-{following}' following += 1 continue following = pnum + 1 except ValueError: pnum = -1 router.append(p) router = ' '.join(router) else: 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) column R: router configured """ if opt in 'sao': print() else: print(USAGE)