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