#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import socket import getopt import yaml import os.path from dns import resolver,reversename own_directory = os.path.dirname(os.path.abspath(__file__)) lib = os.path.join(own_directory, '..') if os.path.exists(os.path.join(lib, 'hostinfo')): sys.path = [lib] + sys.path from hostinfo import printer def _get_data(path): stream = file(path, 'r') return yaml.load(stream) def print_info(path, key=None, oneline=False): data = _get_data(path) p = printer.Printer(data, oneline) p.info(key) def _print_keys(data, prefix = ''): for key in data.keys(): print "%s%s" % (prefix, key) if key == 'addresses': for k in set([a['interface'] for a in data[key]]): print "%s%s.%s" % (prefix, key, k) if key == 'ports': for k in set([p['process'] for p in data[key] if 'process' in p]): print "%s%s.%s" % (prefix, key, k) if len([p for p in data[key] if 'process' not in p]) > 0: print "%s%s.%s" % (prefix, key, 'UNKNOWN') if isinstance(data[key], dict): _print_keys(data[key], "%s%s." % (prefix, key)) def print_keys(path): data = _get_data(path) _print_keys(data) def find_host(host): path = "/usr/local/share/hostinfo/%s" % host if os.path.exists(path): return path # try to build the fqdn path = "/usr/local/share/hostinfo/%s.spline.inf.fu-berlin.de" % \ host.replace('.spline.de', '') if os.path.exists(path): return 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 os.path.exists(path): return path return None def main(): self_name = sys.argv.pop(0) optlist, args = getopt.gnu_getopt(sys.argv, 'ofk', ['oneline', 'file', 'keys']) flags = [opt for (opt, value) in optlist if value == ''] file = '--file' in flags or '-f' in flags oneline = '--oneline' in flags or '-o' in flags keys = '--keys' in flags or '-k' in flags if len(args) < 1: print('Usage: %s [info]' % self_name) sys.exit(1) path = find_host(args[0]) if path is None: print("Host '%s' could not be found!" % args[0]) sys.exit(1) if file: print(path) elif keys: print_keys(path) else: if len(args) == 1: print_info(path, oneline=oneline) else: print_info(path, key=args[1], oneline=oneline) sys.exit(0) if __name__ == '__main__': main()