#!/usr/bin/python import sys import cgi import os import socket import time try: import cgitb cgitb.enable() except ImportError: sys.stderr = sys.stdout def cgiprint(inline=''): sys.stdout.write(inline) sys.stdout.write('\r\n') sys.stdout.flush() contentheader = 'Content-Type: text/html' thepage = ''' %s %s ''' h1 = '

%s

' def getform(theform, valuelist, notpresent='', nolist=False): """ This function, given a CGI form as a FieldStorage instance, extracts the data from it, based on valuelist passed in. Any non-present values are set to '' - although this can be changed. (e.g. to return None so you can test for missing keywords - where '' is a valid answer but to have the field missing isn't.) It also takes a keyword argument 'nolist'. If this is True list values only return their first value. """ data = {} for field in valuelist: if not theform.has_key(field): # if the field is not present (or was empty) data[field] = notpresent else: # the field is present print type(theform[field]) if type(theform[field]) != type([]): # is it a list or a single item print type(theform[field]) data[field] = theform[field].value else: if not nolist: # do we want a list ? data[field] = theform.getlist(field) else: data[field] = theform.getfirst(field) # just fetch the first item return data def getall(theform, nolist=False): """ Passed a form (cgi.FieldStorage instance) return *all* the values. This doesn't take into account multipart form data (file uploads). It also takes a keyword argument 'nolist'. If this is True list values only return their first value. """ data = {} for field in theform.keys(): # we can't just iterate over it, but must use the keys() method if type(theform[field]) == type([]): if not nolist: data[field] = theform.getlist(field) else: data[field] = theform.getfirst(field) else: data[field] = theform[field].value return data def isblank(indict): """ Passed an indict of values it checks if any of the values are set. Returns True if the indict is empty, else returns False. I use it on the a form processed with getform to tell if my CGI has been activated without any form values. """ for key in indict.keys(): if indict[key]: return False return True def go_backup(myhost): myhostname = socket.gethostname() if myhostname.strip() == myhost.strip(): command= "sudo /usr/bin/backup_job " command2="sleep 2; /data/srv/hobbit/server/ext/hbnotes.py" results=os.popen(command,'r') os.popen(command2,'r') else: sshcmd="ssh -o StrictHostKeyChecking=no -o ConnectTimeout=1 -i /data/srv/.nobody_ssh/id_dsa mythtv@" sshcmd+=myhost.strip() cmd=' "sudo /etc/cron.daily/backup_cron ; sudo su nobody -c /data/srv/hobbit/server/ext/hbnotes.py"' command=sshcmd + cmd + " 2>&1 " results=os.popen(command,'r') return results def go_restore(restorefile,myhost): myhostname = socket.gethostname() if myhostname.strip() == myhost.strip(): localcommand="sudo /usr/bin/restore_job.sh " command= localcommand + restorefile else: sshcmd="ssh -o StrictHostKeyChecking=no -o ConnectTimeout=1 -i /data/srv/.nobody_ssh/id_dsa mythtv@" sshcmd+=myhost.strip() cmd=' "sudo /usr/bin/restore_job.sh " ' command=sshcmd + cmd + restorefile + " 2>&1 " results=os.popen(command,'r') return results def go_optimize(myhost): myhostname = socket.gethostname() if myhostname.strip() == myhost.strip(): command="/usr/bin/optimize_mythdb.py" results=os.popen(command,'r') else: results='oops' return results def go_update(myhost,update_type): myhostname = socket.gethostname() if myhostname.strip() == myhost.strip(): cmd="sudo /usr/bin/update_system " command=cmd + update_type else: cmd=" call pacman update_system " cmd+=update_type command="sudo /usr/bin/func \"" + myhost.strip() + "*\" " + cmd print command #print command results=os.popen(command,'r') return results def go_updateall(allupdate_type): cmd=" sudo /usr/bin/update_system_all " cmd+=allupdate_type command= cmd + " 2>&1 " results=os.popen(command,'r') return results def go_shutdown(myhost): myhostname = socket.gethostname() if myhostname.strip() == myhost.strip(): message="Shutdown from MBE:::ALT" os.system("/usr/bin/osdClient.pl " + myhost.strip() + " 5000 " + "\"" + message + "\"" ) time.sleep(3) command="sudo /sbin/poweroff " else: command="sudo /usr/bin/func \"" + myhost.strip() + "*\" call power poweroff " message="Shutdown from MBE:::ALT" os.system("/usr/bin/osdClient.pl " + myhost.strip() + " 5000 " + "\"" + message + "\"" ) time.sleep(3) results=os.popen(command,'r') return results def go_shutdownall(): import MySQLdb #import mysql #find all hosts(minus myself) #loop through results shutdown as we go. db = MySQLdb.connect(host="localhost", user="mythtv", passwd="mythtv", db="mythconverg") # create a cursor cursor = db.cursor() # execute SQL statement myhostname = socket.gethostname() results=["Sent shutdown command to: \n "] cursor.execute("SELECT distinct(hostname) from settings where not hostname = %s ; ",(myhostname)) result = cursor.fetchall() for row in result: go_shutdown(row[0]) results.append(row[0]) #shutdown myself. #go_shutdown(myhostname) #results.append(myhostname) return results def go_reboot(myhost): myhostname = socket.gethostname() if myhostname.strip() == myhost.strip(): message="Reboot from MBE:::ALT" os.system("/usr/bin/osdClient.pl " + myhost.strip() + " 5000 " + "\"" + message + "\"" ) time.sleep(3) command="sudo /sbin/reboot " else: command="sudo /usr/bin/func \"" + myhost.strip() + "*\ call power reboot " message="Reboot from MBE:::ALT" os.system("/usr/bin/osdClient.pl " + myhost.strip() + " 5000 " + "\"" + message + "\"" ) time.sleep(3) results=os.popen(command,'r') return results def go_wake(myhost): command="/usr/bin/wakeonlan.sh " + myhost.strip() results=os.popen(command,'r') return results def go_kill(myhost,kill_type): myhostname = socket.gethostname() if myhostname.strip() == myhost.strip(): if kill_type == "killX": command="sudo /sbin/sv restart frontend" else: command="sudo /usr/bin/killall -9 mythfrontend" else: cmd=" call fe_restart " cmd+=kill_type command="sudo /usr/bin/func \"" + myhost.strip() + "*\" " + cmd #print command results=os.popen(command,'r') return results mainpage = ''' Receiving a Form %s''' error = '''

Error

No Form Submission Was Received

''' result = '''

%s of %s

''' possible_parameters = ['param1', 'param2', 'param3', 'param4','hiddenparam','param5','param6'] if __name__ == '__main__': cgiprint(contentheader) # content header cgiprint() # finish headers with blank line theform = cgi.FieldStorage() #print theform formdict = getform(theform, possible_parameters) #print possible_parameters if isblank(formdict): body = error else: name = formdict['param1'] radio = formdict['param2'] # should be 'this' or 'that' if radio != 'Restore' : name = "" update_type = formdict['param3'] oldurl = formdict['param4'] hidden = formdict['hiddenparam'] all_update_type=formdict['param5'] kill_type = formdict['param6'] body = result % (radio, hidden) print mainpage % body selection=radio myhost=hidden if selection == "Restore": mylogfile=go_restore(name,myhost) elif selection == "Backup": mylogfile=go_backup(myhost) elif selection == "Update": mylogfile=go_update(myhost,update_type) elif selection == "Shutdown": mylogfile=go_shutdown(myhost) elif selection == "Reboot": mylogfile=go_reboot(myhost) elif selection == "Optimize": mylogfile=go_optimize(myhost) elif selection == "WOL": mylogfile=go_wake(myhost) elif selection == "UpdateAll": mylogfile=go_updateall(all_update_type) elif selection == "ShutdownAll": mylogfile=go_shutdownall() elif selection == "Kill": mylogfile=go_kill(myhost,kill_type) box='''
''' endbox='''
''' javascript=''' ''' print box for line in mylogfile: print line + '
\r\n' print endbox print ' Back ' #print oldurl print javascript