#!/usr/bin/python """Hostinfo queries the hostbase database according to user-defined data""" from os import system, environ environ['DJANGO_SETTINGS_MODULE'] = 'Hostbase.settings' from getopt import gnu_getopt, GetoptError from django.db import connection import sys logic_ops = ["and", "or"] host_attribs = ["hostname", "whatami", "netgroup", "security_class", "support", "csi", "memory", "printq", "dhcp", "outbound_smtp", "primary_user", "administrator", "location", "comments", "last", "expiration_date"] dispatch = {'mac_addr': ' i.', 'hdwr_type': ' i.', 'ip_addr': ' p.', 'name': ' n.', 'dns_view': ' n.', 'cname': ' c.', 'mx': ' m.', 'priority': ' m.'} def pinger(hosts): """Function that uses fping to ping multiple hosts in parallel""" hostnames = "" for each in hosts: hostnames += each[0] + " " system("fping -r 1" + hostnames) sys.exit() def get_query(arguments): """Parses the command line options and returns the necessary data for an SQL query""" logic = None resultset = [] querystring = '' while 1: notflag = False if arguments[0] == 'not': notflag = True querypos = 1 elif arguments[0] in logic_ops: logic = arguments[0] if arguments[1] == 'not': notflag = True querypos = 2 else: querypos = 1 else: querypos = 0 if len(arguments[querypos].split("==")) > 1: operator = "=" if notflag: operator = "<>" querysplit = arguments[querypos].split("==") if querysplit[0] in host_attribs: querystring = " h.%s%s\'%s\'" % (querysplit[0], operator, querysplit[1]) elif querysplit[0] in dispatch: querystring = dispatch[querysplit[0]] querystring += "%s%s\'%s\'" % (querysplit[0], operator, querysplit[1]) elif len(arguments[querypos].split("=")) > 1: notstring = '' if notflag: notstring = 'NOT ' querysplit = arguments[querypos].split("=") if querysplit[0] in host_attribs: querystring = " h.%s %sLIKE \'%%%%%s%%%%\'" % (querysplit[0], notstring, querysplit[1]) elif querysplit[0] in dispatch: querystring = dispatch[querysplit[0]] querystring += "%s %sLIKE \'%%%%%s%%%%\'" % (querysplit[0], notstring, querysplit[1]) else: print("ERROR: bad query format") sys.exit() if not querystring: print("ERROR: bad query format") sys.exit() resultset.append((querystring, logic)) arguments = arguments[querypos + 1:] if arguments == [] or arguments[0] not in logic_ops: break return resultset try: (opts, args) = gnu_getopt(sys.argv[1:], 'q:', ['showfields', 'fields', 'ping', 'summary']) cursor = connection.cursor() if ('--showfields', '') in opts: print("\nhost fields:\n") for field in host_attribs: print(field) for field in dispatch: print(field) print("") sys.exit() if opts[0][0] == '-q': results = get_query(sys.argv[2:]) queryoptions = "" for result in results: if result[1] == 'and': queryoptions += " AND " + result[0] elif result[1] == 'or': queryoptions += " OR " + result[0] else: queryoptions += result[0] if ('--summary', '') in opts: fields = "h.hostname, h.whatami, h.location, h.primary_user" query = """SELECT DISTINCT %s FROM (((((hostbase_host h INNER JOIN hostbase_interface i ON h.id = i.host_id) INNER JOIN hostbase_ip p ON i.id = p.interface_id) INNER JOIN hostbase_name n ON p.id = n.ip_id) INNER JOIN hostbase_name_mxs x ON x.name_id = n.id) INNER JOIN hostbase_mx m ON m.id = x.mx_id) LEFT JOIN hostbase_cname c ON n.id = c.name_id WHERE %s ORDER BY h.hostname """ % (fields, queryoptions) cursor.execute(query) results = cursor.fetchall() if not results: print("No matches were found for your query") sys.exit() print("\n%-32s %-10s %-10s %-10s" % ('Hostname', 'Type', 'Location', 'User')) print("================================ ========== ========== ==========") for host in results: print("%-32s %-10s %-10s %-10s" % (host)) print("") elif ('--fields', '') in opts: tolook = [arg for arg in args if arg in host_attribs or arg in dispatch] fields = "" fields = ", ".join(tolook) if not fields: print("No valid fields were entered. exiting...") sys.exit() query = """SELECT DISTINCT %s FROM (((((hostbase_host h INNER JOIN hostbase_interface i ON h.id = i.host_id) INNER JOIN hostbase_ip p ON i.id = p.interface_id) INNER JOIN hostbase_name n ON p.id = n.ip_id) INNER JOIN hostbase_name_mxs x ON x.name_id = n.id) INNER JOIN hostbase_mx m ON m.id = x.mx_id) LEFT JOIN hostbase_cname c ON n.id = c.name_id WHERE %s ORDER BY h.hostname """ % (fields, queryoptions) cursor.execute(query) results = cursor.fetchall() last = results[0] for field in results[0]: print(repr(field) + "\t") for host in results: if not host == last: for field in host: print(repr(field) + "\t") last = host print("") else: basequery = """SELECT DISTINCT h.hostname FROM (((((hostbase_host h INNER JOIN hostbase_interface i ON h.id = i.host_id) INNER JOIN hostbase_ip p ON i.id = p.interface_id) INNER JOIN hostbase_name n ON p.id = n.ip_id) INNER JOIN hostbase_name_mxs x ON x.name_id = n.id) INNER JOIN hostbase_mx m ON m.id = x.mx_id) LEFT JOIN hostbase_cname c ON n.id = c.name_id WHERE """ cursor.execute(basequery + queryoptions + " ORDER BY h.hostname") results = cursor.fetchall() if not results: print("No matches were found for your query") sys.exit() if ("--ping", '') in opts: pinger(results) for host in results: print(host[0]) except (GetoptError, IndexError): print("\nUsage: hostinfo.py -q =[=] [and/or = [--long option]]") print(" hostinfo.py --showfields\tshows all data fields") print("\n long options:") print("\t --fields f1 f2 ...\tspecifies the fields displayed from the queried hosts") print("\t --summary\t\tprints out a predetermined set of fields") print("\t --ping\t\t\tuses fping to ping all queried hosts\n") sys.exit()