From 7e8565a59723cb299d499bbcd9bb5abd4ac5c9ff Mon Sep 17 00:00:00 2001 From: Ken Raffenetti Date: Mon, 28 Aug 2006 20:02:37 +0000 Subject: added hostinfo tool for querying hostbase from the command line git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@2130 ce84e21b-d406-0410-9b95-82705330c041 --- tools/hostinfo.py | 185 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100755 tools/hostinfo.py (limited to 'tools/hostinfo.py') diff --git a/tools/hostinfo.py b/tools/hostinfo.py new file mode 100755 index 000000000..d960354d9 --- /dev/null +++ b/tools/hostinfo.py @@ -0,0 +1,185 @@ +#!/usr/bin/python +"""Hostinfo queries the hostbase database according to user-defined data""" +__revision__ = '0.1' + +from getopt import gnu_getopt, GetoptError +from django.db import connection +from os import system +import sys + +xmldirectory = "./xmldata/" +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 (((((dbconvert_host h + INNER JOIN dbconvert_interface i ON h.id = i.host_id) + INNER JOIN dbconvert_ip p ON i.id = p.interface_id) + INNER JOIN dbconvert_name n ON p.id = n.ip_id) + INNER JOIN dbconvert_name_mxs x ON x.name_id = n.id) + INNER JOIN dbconvert_mx m ON m.id = x.mx_id) + LEFT JOIN dbconvert_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 (((((dbconvert_host h + INNER JOIN dbconvert_interface i ON h.id = i.host_id) + INNER JOIN dbconvert_ip p ON i.id = p.interface_id) + INNER JOIN dbconvert_name n ON p.id = n.ip_id) + INNER JOIN dbconvert_name_mxs x ON x.name_id = n.id) + INNER JOIN dbconvert_mx m ON m.id = x.mx_id) + LEFT JOIN dbconvert_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 (((((dbconvert_host h + INNER JOIN dbconvert_interface i ON h.id = i.host_id) + INNER JOIN dbconvert_ip p ON i.id = p.interface_id) + INNER JOIN dbconvert_name n ON p.id = n.ip_id) + INNER JOIN dbconvert_name_mxs x ON x.name_id = n.id) + INNER JOIN dbconvert_mx m ON m.id = x.mx_id) + LEFT JOIN dbconvert_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() -- cgit v1.2.3-1-g7c22