summaryrefslogtreecommitdiffstats
path: root/hostinfo/printer.py
blob: 438464bea737edf03a58f041d45ebddb9122f77b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# -*- 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',
        'arch': 'Architecture',
        'os': 'Operating System',
        'addresses': 'IPs',
        'ports': 'Ports',
        'vserver': 'VServer'
    }

    ignore = ['vserver-host']

    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)

            for ip in value:
                if interface == ip['interface']:
                    p_new.pprint('%s/%s' %
                                 (ip['address'], ip['netmask']))

    def print_vserver(self, p, value):
        if value == 'guest':
            p.pprint('guest running on %s' % self.data['vserver-host'])
        else:
            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(p, value)
        except AttributeError:
            if isinstance(value, list):
                for v in value:
                    p.pprint(v)
            else:
                p.pprint(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

        if key is not None:
            self.length = 0
            if key in self.data:
                self.print_default(key, self.data[key])
        else:
            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])