Logo Search packages:      
Sourcecode: bcfg2 version File versions  Download package

hostinfo.py

#!/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 <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()

Generated by  Doxygen 1.6.0   Back to index