summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2013-05-06 17:20:20 +0200
committerAlexander Sulfrian <alexander@sulfrian.net>2013-05-06 17:20:20 +0200
commit25f54ac07dcc62d44059fd8f73091a1b3a535fa3 (patch)
tree43d6b8785368901486e394239b1d5dbe072cfe4d
downloadtools-25f54ac07dcc62d44059fd8f73091a1b3a535fa3.tar.gz
tools-25f54ac07dcc62d44059fd8f73091a1b3a535fa3.tar.bz2
tools-25f54ac07dcc62d44059fd8f73091a1b3a535fa3.zip
initial commit0.1.0
-rwxr-xr-xhostinfo59
-rw-r--r--printer.py74
2 files changed, 133 insertions, 0 deletions
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 <host> [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])
+