#!/usr/bin/python2 # -*- coding: utf-8 -*- # import MySQL module import MySQLdb import sys import getopt import socket import os def create_dot_file(): try: import ignoreclient ignorehostlist=ignoreclient.ignorehosts except: print "could not find the ignore list" ignorehostlist="'ignoreme'" db = MySQLdb.connect(host="localhost", user="mythtv", passwd="mythtv", db="mythconverg") cursor = db.cursor() SQL="SELECT DISTINCT(hostname) from settings where hostname not in(%s)" cursor.execute(SQL %ignorehostlist) result = cursor.fetchall() frontonly="_FRONTEND_" masterbackend="_MASTERBACKEND_" masterbacked_w_fe="_MASTERFRONTEND_" slave_w_fe="_SLAVEFE_" slave="_SLAVEBACKEND_" stand_alone="_STANDALONE_" dotMBE="" dotfrontend=list() dotslave=list() dotslavefe=list() tunerdict = {} for row in result: hostname = row[0] dot_hostname = row[0].replace('.','_') dot_hostname = row[0].replace('-','__') #Find the system type cursor.execute("select value,data from settings where hostname=%s and value in ('HostSystemType','HostRunFrontend');",(row)) hostvalues=cursor.fetchall() if len(hostvalues) == 2: if hostvalues[1][1] == 'Frontend_only': frontonly+=","+dot_hostname dotfrontend.append(dot_hostname) elif hostvalues[1][1] == 'Standalone': stand_alone+=","+dot_hostname dotMBE="MBE" + " [ label=\"" + dot_hostname + " \\n Standalone \" shapefile=\"/data/srv/httpd/htdocs/xymon/gifs/be.png\" fontcolor=\"white\" color=blue4 style=filled ] " dotfrontend.append(dot_hostname) cursor.execute("select cardtype,defaultinput from capturecard where hostname=%s;",(row)) tuners=cursor.fetchall() tstring="" if len(tuners) == 0: tunerdict["MBE"]="no tuners \\n" else: for t in tuners: tstring+=t[0] tstring+=t[1] tstring+='\\n' tunerdict["MBE"]=tstring elif hostvalues[1][1] == 'Master_backend': if hostvalues[0][1]=='0': masterbackend+=","+dot_hostname dotMBE="MBE" + " [ label=\"" + dot_hostname + " \\n Master Backend \" shapefile=\"/data/srv/httpd/htdocs/xymon/gifs/be.png\" fontcolor=\"white\" color=blue4 style=filled ] " else: masterbacked_w_fe+=","+dot_hostname dotMBE="MBE" + " [ label=\"" + dot_hostname + " \\n Master Backend with frontend \" shapefile=\"/data/srv/httpd/htdocs/xymon/gifs/be.png\" fontcolor=\"white\" color=blue4 style=filled ] " dotfrontend.append(dot_hostname) cursor.execute("select cardtype,defaultinput from capturecard where hostname=%s;",(row)) tuners=cursor.fetchall() tstring="" if len(tuners) <= 0: tunerdict["MBE"]="no tuners \\n" else: #print tuners for t in tuners: tstring+=t[0] tstring+=t[1] tstring+='\\n' tunerdict["MBE"]=tstring elif hostvalues[1][1] == 'Slave_backend': cursor.execute("select cardtype,defaultinput from capturecard where hostname=%s;",(row)) tuners=cursor.fetchall() #slave withoutfe if hostvalues[0][1]=='0': slave+=","+dot_hostname dotslave.append(dot_hostname) tstring="" if len(tuners) <= 0: tunerdict["STUNER"+dot_hostname]="No Tuners" else: for t in tuners: tstring+=t[0] tstring+=t[1] tstring+='\\n' tunerdict["STUNER"+dot_hostname]=tstring else: #slave with fe tstring="" if len(tuners) <= 0: tunerdict["STUNER"+dot_hostname]="No Tuners" else: for t in tuners: tstring+=t[0] tstring+=t[1] tstring+='\\n' tunerdict["STUNER"+dot_hostname]=tstring slave_w_fe+=","+dot_hostname dotslave.append(dot_hostname) dotfrontend.append(dot_hostname) #----------------------------------Create graphviz dot files dotfilename="/home/xymon/server/etc/mythdot" try: dotfile=open(dotfilename,'w') dotfile.write("digraph G { " + "\n" ) dotfile.write("graph [bgcolor=transparent]" + "\n" ) #print tunerdict #define the nodes dotfile.write( dotMBE + " \n" ) dotfile.write("tunermbe"+ " [ label= \"" + tunerdict["MBE"] + "\" , shapefile=\"/data/srv/httpd/htdocs/xymon/gifs/tuner.png\" fontcolor=\"white\" color=red ] \n" ) for fe in dotfrontend: dotfile.write("FEND"+fe + "[ label=\"frontend \\n " + fe + "\" ,shapefile=\"/data/srv/httpd/htdocs/xymon/gifs/tv.png\" , fontcolor=\"white\" , imagescale=\"true\" color=\"gold2\" ] \n" ) for fe in dotslave: cslave="STUNER"+fe #adding tuners to dot file if tunerdict[cslave] != "" : dotfile.write(cslave+ " [ label= \"" + tunerdict[cslave] + "\" , shapefile=\"/data/srv/httpd/htdocs/xymon/gifs/tuner.png\" fontcolor=\"white\" color=red ] \n" ) #adding slave to dot file dotfile.write("SLAVE"+fe + "[ label=\"slave backend \\n " + fe + "\" shapefile=\"/data/srv/httpd/htdocs/xymon/gifs/be.png\" fontcolor=\"white\" color=green ] \n" ) #connect up the nodes! dotfile.write("tunermbe -> MBE [color=\"red\"] \n " ) for fe in dotfrontend: dotfile.write("MBE -> FEND" + fe + "[color=\"gold2\"] \n " ) for fe in dotslave: cslave="STUNER"+fe dotfile.write("SLAVE" + fe + "-> MBE [color=\"green\"] \n " ) if tunerdict[cslave] != "" : dotfile.write(cslave + "-> SLAVE"+fe + "[color=\"red\"]" "\n" ) dotfile.write("} " + "\n" ) dotfile.close() except: print "Problem writing %s" %dotfilename cmd="/usr/bin/unflatten -l1 -c3 -f " + dotfilename + " |/usr/bin/dot -Tpng -o/data/srv/httpd/htdocs/xymon/gifs/network.png " # cmd="/usr/bin/circo -Tpng -o/data/srv/httpd/htdocs/xymon/gifs/network.png " + dotfilename results=os.popen(cmd,'r') return frontonly,masterbackend,masterbacked_w_fe,slave_w_fe,slave,stand_alone def createdropdown(currenthostype): dir = "/data/storage/disk0/backup/system_backups" dropdown=''' </br> <input name="param2" type="radio" value="Restore" />Restore Database: </> <select name="param1">\n''' os.chdir(dir) if os.path.exists(dir): files = os.listdir(dir) files.sort(key=lambda x: os.path.getmtime(x) , reverse=True) #for file in os.listdir(dir): if len(files) > 20: del files[20:] for file in files: if (file.endswith(".tgz")): dropdown+=' <option value="' + file + '">' + file + '</option> \n' dropdown+=''' </select> </br>   <input type="checkbox" name="param8" >Partial Restore<br> <br> <input name="param2" type="radio" value="Upload" />Upload File to Restore: </> <input name="uFile" type="file" size="40"> <br><br> <input name="param2" type="radio" value="Backup" checked="checked" />Backup System<br /> ''' #This is for the d/l backup option dropdown+=''' </br> <input name="param2" type="radio" value="Dbackup" />Download Backup: </> <select name="param7">\n\n </br>''' for file in files: if (file.endswith(".tgz")): dropdown+=' <option value="' + file + '">' + file + '</option> \n' dropdown+=''' </select> </br> </br> <input name="param2" type="radio" value="Optimize" />Optimize Database<br /> ''' if currenthostype == "Master_backend": dropdown+='</br><input name="param2" type="radio" value="ShutdownAll" />Shutdown All Systems (except master backend)<br /> \n' #Add option to restart MBE dropdown+='</br> <input name="param2" type="radio" value="RestartMBE" />Restart MBE service<br /> \n' dropdown+=''' </br></br>\n''' return dropdown def create_notes(): db = MySQLdb.connect(host="localhost", user="mythtv", passwd="mythtv", db="mythconverg") # create a cursor cursor = db.cursor() cursor.execute("SELECT DISTINCT(hostname) from settings") result = cursor.fetchall() for row in result: #cursor.execute("select value,data from settings where hostname=%s and value in ('HostSystemType','HostHwuuid');",(row)) cursor.execute("select value,data from settings where hostname=%s and value in ('HostSystemType','HardwareProfilePublicUUID');",(row)) hostvalues=cursor.fetchall() #This is here to ignore non LinHES hosts, or those that don't have a HostSystemType if len(hostvalues) == 0: continue found_uuid="false" filename="/home/xymon/server/www/notes/" filename+=str(row[0]) filename+=(".html") try: file = open(filename,'w') except: print "problem opening %s" %filename continue string=''' <html> <head> <style type="text/css">@import "/frame.css";</style> <SCRIPT> function do_submission() { document.form.submit(); } function Do_it () { chosen = "" len = document.form.param2.length for (i = 0; i <len; i++) { if (document.form.param2[i].checked) { chosen = document.form.param2[i].value } } if (chosen == "Restore") { if (confirm('Continue with database restore?')) { do_submission(); } else { alert("The database was not restored."); } } else if (chosen == "Backup") { if (confirm('Continue with database backup?')) { do_submission(); } else { alert("Backup cancelled."); } } else if (chosen == "Upload") { if (confirm('Upload the backup file to the server?')) { do_submission(); } } else if (chosen == "Optimize") { if (confirm('Continue with database maintenance?')) { do_submission(); } else { alert("Optimization cancelled."); } } else if (chosen == "Shutdown") { if (confirm('Continue with server shutdown?')) { do_submission(); alert("The system is powering off."); } } else if (chosen == "Reboot") { if (confirm('Continue with server restart?')) { do_submission(); alert("The system is restarting."); } } else if (chosen == "ShutdownAll") { if (confirm('Continue with powering off all servers except master backend?')) { do_submission(); alert("Systems are powering off."); } } else if (chosen == "Update") { if (confirm('Continue with applying updates?')) { do_submission(); } } else { //alert("not restore") do_submission(); } } </SCRIPT> </head> ''' file.write(string) for i in range( 0 , len(hostvalues)): value=hostvalues[i][0] data=hostvalues[i][1] currenthostype='' currenthostname='' #if value == "HostHwuuid" : if value == "HardwareProfilePublicUUID" : if data != "blank" : found_uuid="true" uuid=data if value == "HostSystemType" : currenthostname= str(row[0]).strip() currenthostype=str(data).strip() header="<h1>" + currenthostname + " (" + currenthostype + ") </h1>" file.write(header + '\n') if found_uuid == "true" : string=str("http://smolt.mythtv.org/client/show?uuid=") string+=str(uuid) file.write("<A href=\"" ) file.write(string) file.write("\" >" + str(uuid) + "</A>") else: file.write( "uuid not found, please submit a hardware profile" ) buttonform_top=''' <div id="resultbox" > <form name="form" action="/process.py" enctype="multipart/form-data" method="POST" > ''' buttonform_bottom=''' </br> <input name="param2" type="radio" value="Update" />Update System: </> <select name="param3"> <option value="Myth_only">Myth only</option> <option value="All"> Full System</option> </select> </br> </br> <input name="param2" type="radio" value="Kill" />Restart Interface: </> <select name="param6"> <option value="killmyth">MythFrontend</option> <option value="killX">Full UI</option> </select> </br> </br> <input name="param2" type="radio" value="Shutdown" />Shutdown System<br /> </br> <input name="param2" type="radio" value="Reboot" />Reboot System<br /> </br> <input name="param2" type="radio" value="WOL" />Wake on LAN<br /> </br> <input name="hiddenparam" type="hidden" value=" ''' oldurlform=''' "/> <input name="param4" type="hidden" value=" ''' closetag=''' "/> </br> </div> </br> <div id="center_button" > <!--<input id="submitbutton" type="submit" />--> <a href="Javascript:Do_it();"> <img src="/go.png"></a> </form> </div> ''' if currenthostype == "Master_backend" or currenthostype == "Standalone": mbeoptions=createdropdown(currenthostype) else: mbeoptions='' returnurl="/xymon/notes/" returnurl+=str(row[0]) returnurl+=(".html") file.write('</br> </br> ') file.write(buttonform_top) file.write(mbeoptions) file.write(buttonform_bottom) file.write(str(row[0])) file.write(oldurlform) file.write(returnurl) file.write(closetag) string=('</html>') file.write(string) def create_hobbit_analysis(frontonly, masterbackend, masterbacked_w_fe, slave_w_fe, slave, stand_alone): hobbitfile="/home/xymon/server/etc/analysis.cfg" hobbitf=open(hobbitfile,'r') hobbitconfig=hobbitf.readlines() hobbitf.close() try: hobbitf=open(hobbitfile,'w') print "FE",frontonly print "MBE",masterbackend print "MBEwFW",masterbacked_w_fe print "SLAVEwFW",slave_w_fe print "SLAVE",slave print "STD",stand_alone for line in hobbitconfig: if line.startswith("HOST"): cline=line.split("=") if cline[1].startswith("_FRONTEND_"): pline="HOST=" pline+=frontonly.strip() hobbitf.write(pline + "\n") elif cline[1].startswith("_MASTERBACKEND_"): pline="HOST=" pline+=masterbackend.strip() #print pline hobbitf.write(pline+ "\n") elif cline[1].startswith("_MASTERFRONTEND_"): pline="HOST=" pline+=masterbacked_w_fe.strip() #print pline hobbitf.write(pline+ "\n") elif cline[1].startswith("_SLAVEBACKEND_"): pline="HOST=" pline+=slave.strip() #print pline hobbitf.write(pline+ "\n") elif cline[1].startswith("_SLAVEFE_"): pline="HOST=" pline+=slave_w_fe.strip() #print pline hobbitf.write(pline+ "\n") else: #print line hobbitf.write(line) else: #print line hobbitf.write(line) hobbitf.close() except: print "problem writing analysis.cfg" def main(argv): frontonly,masterbackend,masterbacked_w_fe,slave_w_fe,slave,stand_alone = create_dot_file() create_notes() create_hobbit_analysis(frontonly, masterbackend, masterbacked_w_fe, slave_w_fe, slave, stand_alone) if __name__ == "__main__": main(sys.argv[1:])