From 25f54ac07dcc62d44059fd8f73091a1b3a535fa3 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Mon, 6 May 2013 17:20:20 +0200 Subject: initial commit --- hostinfo | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ printer.py | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100755 hostinfo create mode 100644 printer.py diff --git a/hostinfo b/hostinfo new file mode 100755 index 0000000..bf08d03 --- /dev/null +++ b/hostinfo @@ -0,0 +1,59 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import sys +import socket +import yaml +import os.path +from dns import resolver,reversename + +import printer + +def print_info(path, key=None): + stream = file(path, 'r') + data = yaml.load(stream) + + p = printer.Printer(data) + p.info(key) + +def find_host(host, key=None): + path = "/usr/local/share/hostinfo/%s" % host + + if not os.path.exists(path): + # try to build the fqdn + path = "/usr/local/share/hostinfo/%s.spline.inf.fu-berlin.de" % \ + host.replace('.spline.de', '') + + if not os.path.exists(path): + try: + # try to use reverse dns + addr=reversename.from_address(host) + hostname = str(resolver.query(addr,"PTR")[0]) + path = "/usr/local/share/hostinfo/%s" % hostname[0:-1] + except: + pass + + if not os.path.exists(path): + return False + + print_info(path, key) + return True + +def main(): + if len(sys.argv) < 2: + print('Usage: %s [info]' % sys.argv[0]) + sys.exit(1) + + if len(sys.argv) == 2: + if find_host(sys.argv[1]): + sys.exit(0) + else: + if find_host(sys.argv[1], sys.argv[2]): + sys.exit(0) + + print("Host '%s' could not be found!" % sys.argv[1]) + sys.exit(1) + + +if __name__ == '__main__': + main() diff --git a/printer.py b/printer.py new file mode 100644 index 0000000..7d440d0 --- /dev/null +++ b/printer.py @@ -0,0 +1,74 @@ +# -*- 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]) + -- cgit v1.2.3-1-g7c22