From db696830607b574cc8a9a59d0b0add50a0c0cb6e Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Wed, 8 May 2013 03:16:42 +0200 Subject: hostinfo: Prefix class, ports/addresses handling adjusted, new online mode --- bin/hostinfo | 2 +- hostinfo/printer.py | 97 ++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 71 insertions(+), 28 deletions(-) diff --git a/bin/hostinfo b/bin/hostinfo index acf711c..c7cf8f5 100755 --- a/bin/hostinfo +++ b/bin/hostinfo @@ -18,7 +18,7 @@ def print_info(path, key=None): stream = file(path, 'r') data = yaml.load(stream) - p = printer.Printer(data) + p = printer.Printer(data, False) p.info(key) def find_host(host, key=None): diff --git a/hostinfo/printer.py b/hostinfo/printer.py index 97ed4ca..438464b 100644 --- a/hostinfo/printer.py +++ b/hostinfo/printer.py @@ -1,5 +1,19 @@ # -*- coding: utf-8 -*- +from __future__ import print_function + +class Prefix: + def __init__(self, prefix, output, oneline): + self.prefix = prefix + self.output = output + self.empty = oneline + + def pprint(self, data): + self.output("%s%s" % (self.prefix, data)) + if not self.empty: + self.prefix = ' ' * len(self.prefix) + self.empty = True + class Printer: labels = { 'hostname': 'Hostname', @@ -10,41 +24,77 @@ class Printer: 'vserver': 'VServer' } - sort = ['hostname', 'arch', 'os', 'addresses'] ignore = ['vserver-host'] - def __init__(self, data): + def __init__(self, data, oneline): self.data = data + self.oneline = oneline + + def _sort_with_list(self, list, sort): + def helper(value): + if value in sort: + return sort.index(value) + return len(sort) + + return sorted(list, key=helper) + + def print_addresses(self, p, value): + interfaces = sorted(set([ip['interface'] for ip in value])) + maxlength = max(map(len, interfaces)) + for interface in interfaces: + iface_name = ("%s: " % interface).ljust(maxlength+2) + p_new = Prefix(iface_name, p.pprint, self.oneline) - def print_addresses(self, label, value): - for ip in value: - print('%s%s/%s (%s)' % - (label, ip['address'], ip['netmask'], ip['interface'])) - label = self.empty + for ip in value: + if interface == ip['interface']: + p_new.pprint('%s/%s' % + (ip['address'], ip['netmask'])) - def print_vserver(self, label, value): + def print_vserver(self, p, value): if value == 'guest': - print('%sguest running on %s' % - (label, self.data['vserver-host'])) + p.pprint('guest running on %s' % self.data['vserver-host']) else: - print('%s %s' % (self.label, value)) + p.pprint(value) + + def print_ports(self, p, value): + processes = set([port['process'] for port in value if 'process' in port]) + processes = self._sort_with_list(processes, + ['sshd', 'nrpe', 'munin-node']) + if len([port for port in value if 'process' not in port]) > 0: + processes.append('UNKNOWN') + + maxlength = max(map(len, processes)) + for process in processes: + process_name = ("%s: " % process).ljust(maxlength+2) + p_new = Prefix(process_name, p.pprint, self.oneline) + + for port in value: + if 'process' in port and process == port['process'] or \ + 'process' not in port and process == 'UNKNOWN': + if port['proto'] in ['tcp6', 'udp6']: + p_new.pprint('(%s) [%s]:%s' % + (port['proto'].replace('6', ''), + port['ip'], port['port'])) + else: + p_new.pprint('(%s) %s:%s' % + (port['proto'], port['ip'], port['port'])) def print_default(self, key, value): label = '' if self.length > 0: label = '%s: ' % self.get_label(key) label = label.rjust(self.length) + p = Prefix(label, print, self.oneline) try: method = getattr(self, 'print_%s' % key) - method(label, value) + method(p, value) except AttributeError: if isinstance(value, list): for v in value: - print('%s%s' % (label, v)) - label = self.empty + p.pprint(v) else: - print('%s%s' % (label, value)) + p.pprint(value) def get_label(self, key): if key in self.labels: @@ -55,22 +105,15 @@ class Printer: # find max lenght for labels labels = map(self.get_label, self.data.keys()) self.length = max(map(len, labels)) + 3 - self.empty = ' ' * self.length if key is not None: self.length = 0 - self.empty = '' if key in self.data: self.print_default(key, self.data[key]) else: - # first the sorted keys - for key in self.sort: - if key in self.data: + keys = self._sort_with_list(self.data.keys(), + ['hostname', 'arch', 'os', + 'addresses', 'ports']) + for key in keys: + if key not in self.ignore: self.print_default(key, self.data[key]) - - # other keys, that are not ignored - for key in [k for k in self.data.keys() - if k not in self.sort - and k not in self.ignore]: - self.print_default(key, self.data[key]) - -- cgit v1.2.3-1-g7c22