#!/usr/bin/python2
#polls the hobbit server for ghost clients. If it finds ghosts it will make a new bb-hosts file
#with the new clients.
#Will not add duplicate clients
#return code of 0 means a new file was written, anything else is an error or no inserts occured
import urllib2
import string
import sys
import MySQLdb
import re
def findghosts():
ghostitems=[]
try:
f = urllib2.urlopen("http://localhost/xymon/hobbit-cgi/ghostlist.sh?SORT=name&MAXAGE=300&TEXT")
except urllib2.HTTPError, e:
if e.code != 200:
print 'error find ghost list'
sys.exit(1)
else:
ghostitems_full = f.readlines()
f.close()
#'''
Failed to retrieve ghostlist from server
#'''
for i in ghostitems_full:
if i.find("Failed to retrieve") >= 0 :
print "exiting because xymon ghost list failed"
print i
sys.exit(1)
if i.find('127.0.0') == -1 :
ghostitems.append(i.strip())
print "ghost host found: %s" %i.strip()
else:
continue
#ghostitems = ['192.168.1.233\t\tfeste32', '192.168.1.127\t\tjams3']
return ghostitems
def readbb():
bblist = []
strip_list = []
try:
infile = open('/home/xymon/etc/hosts.cfg', 'r')
#infile = open('/tmp/old-bb', 'r')
except(IOError), e:
print "couldn't open hosts.cfg file"
sys.exit(1)
else:
bblist = infile.readlines()
for line in bblist:
strip_list.append(line.strip())
infile.close()
return strip_list
def ghost_type(ghostlist):
match_gdict={}
#query db with ghostname
db = MySQLdb.connect(host="localhost", user="mythtv", passwd="mythtv", db="mythconverg")
# create a cursor
cursor = db.cursor()
for item in ghostlist:
host = item.split()[1].strip()
cursor.execute("select value,data from settings where hostname=%s and value in ('HostSystemType');",(host))
hostvalues=cursor.fetchall()
#this is here in case the db fails
if len(hostvalues) == 0:
hostvalues = (('HostSystemType','unknown system'),)
#should return something like this(('HostSystemType', 'Frontend_only'),)
#hostvalues = (('HostSystemType', 'Frontend_only'),)
if len(hostvalues) == 1:
#get current systemtype and make it all lowercase
current_hostvalue = hostvalues[0][1].lower()
try:
value = match_gdict[current_hostvalue]
value.append(item)
match_gdict[current_hostvalue] = value
except:
match_gdict[current_hostvalue] = [item]
#{'Frontend_only': ['feste32', 'feste3', 'feste33']}
return match_gdict
def check_duplicate(host_list,server):
server_no_space=re.sub(r'\s', '',server)
for line in host_list:
line_no_space=re.sub(r'\s', '',line)
if line_no_space.find(server_no_space) > -1 :
#print "server in hostlist"
return True
else:
continue
return False
def create_new_hosts(matched_gdict,host_list):
#loop over key in gdict
for key,value in matched_gdict.iteritems():
groupline = "title %s" %key
#print key
if key == "unknown system":
host_append_line = "%s #"
else:
host_append_line = "%s #func"
if groupline in host_list:
insert_index = host_list.index(groupline) + 1
for server in value:
if check_duplicate(host_list,server) == False :
#host_append_line = "%s #func" %(server)
host_list.insert(insert_index,host_append_line %server)
else:
host_list.append(groupline)
for server in value:
#host_append_line = "%s #func" %(server)
host_list.append(host_append_line %server)
outfile = open("/home/xymon/etc/hosts.cfg","w")
#outfile = open("/tmp/new-bb","w")
for i in host_list:
outfile.write(i + '\n' )
outfile.close
return
def go():
ghostlist = findghosts()
#print ghostlist
if len(ghostlist) == 0 :
sys.exit()
#match ghosts to system type
matched_gdict = ghost_type(ghostlist)
host_list = readbb()
create_new_hosts(matched_gdict,host_list)
if __name__ == "__main__":
go()