#!/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, verbose=False, nospaces=False): data = _get_data(path) p = printer.Printer(data, oneline, verbose, nospaces) 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) file = oneline = keys = verbose = nospaces = False try: optlist, args = getopt.gnu_getopt(sys.argv, 'ofkvn', ['oneline', 'file', 'keys', 'verbose', 'nospaces']) opts = {} for key, value in optlist: opts[key] = value file = any([o in opts for o in ['--file', '-f']]) oneline = any([o in opts for o in ['--oneline', '-f']]) keys = any([o in opts for o in ['--keys', '-k']]) verbose = any([o in opts for o in ['--verbose', '-v']]) nospaces = any([o in opts for o in ['--nospaces', '-n']]) except getopt.GetoptError, e: print("Error: %s" % e) print args = [] 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: key=None if len(args) > 1: key = args[1] print_info(path, key=key, oneline=oneline, verbose=verbose, nospaces=nospaces) sys.exit(0) if __name__ == '__main__': main()