# -*- coding: utf-8 -*- class Printer: labels = { 'hostname': 'Hostname', 'arch': 'Architecture', 'os': 'Operating System', 'addresses': 'IPs' } sort = ['hostname', 'arch', 'os', 'addresses'] ignore = ['vserver-host'] def __init__(self, data): self.data = data 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 def print_vserver(self, label, value): if value == 'guest': print('%sguest running on %s' % (label, self.data['vserver-host'])) else: print('%s %s' % (self.label, value)) def print_default(self, key, value): label = '' if self.length > 0: label = '%s: ' % self.get_label(key) label = label.rjust(self.length) try: method = getattr(self, 'print_%s' % key) method(label, value) except AttributeError: if isinstance(value, list): for v in value: print('%s%s' % (label, v)) label = self.empty else: print('%s%s' % (label, value)) def get_label(self, key): if key in self.labels: return self.labels[key] return key def info(self, key): # 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: 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])