summaryrefslogtreecommitdiffstats
path: root/tools/hostinfo.py
diff options
context:
space:
mode:
authorKen Raffenetti <raffenet@mcs.anl.gov>2006-08-28 20:02:37 +0000
committerKen Raffenetti <raffenet@mcs.anl.gov>2006-08-28 20:02:37 +0000
commit7e8565a59723cb299d499bbcd9bb5abd4ac5c9ff (patch)
treef81f54bfbb33c3a90722402594c3ec260c84c84e /tools/hostinfo.py
parent0f732319cf69e2195b85bdade7823d439634dbae (diff)
downloadbcfg2-7e8565a59723cb299d499bbcd9bb5abd4ac5c9ff.tar.gz
bcfg2-7e8565a59723cb299d499bbcd9bb5abd4ac5c9ff.tar.bz2
bcfg2-7e8565a59723cb299d499bbcd9bb5abd4ac5c9ff.zip
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
Diffstat (limited to 'tools/hostinfo.py')
-rwxr-xr-xtools/hostinfo.py185
1 files changed, 185 insertions, 0 deletions
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 <field>=[=]<value> [and/or <field>=<value> [--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()