summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2013-05-08 03:16:42 +0200
committerAlexander Sulfrian <alexander@sulfrian.net>2013-05-08 03:17:14 +0200
commitdb696830607b574cc8a9a59d0b0add50a0c0cb6e (patch)
treee43fd6218201ede9290e168b1c1a2e1627e19047
parent501282ed28012835ce51cce8d59b77645c741289 (diff)
downloadtools-db696830607b574cc8a9a59d0b0add50a0c0cb6e.tar.gz
tools-db696830607b574cc8a9a59d0b0add50a0c0cb6e.tar.bz2
tools-db696830607b574cc8a9a59d0b0add50a0c0cb6e.zip
hostinfo: Prefix class, ports/addresses handling adjusted, new online mode
-rwxr-xr-xbin/hostinfo2
-rw-r--r--hostinfo/printer.py97
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])
-