diff options
author | James Meyer <james.meyer@operamail.com> | 2013-01-05 02:40:34 (GMT) |
---|---|---|
committer | James Meyer <james.meyer@operamail.com> | 2013-01-05 02:40:34 (GMT) |
commit | 8535c8a04075454c676a548dbec40673b0ad62e0 (patch) | |
tree | ae7a7d6294cc96e1fd9e45556a51fec5a0fa14a3 | |
parent | 6623efa259ecac69b28c204f6100700a774adb2d (diff) | |
download | linhes_pkgbuild-8535c8a04075454c676a548dbec40673b0ad62e0.zip linhes_pkgbuild-8535c8a04075454c676a548dbec40673b0ad62e0.tar.gz linhes_pkgbuild-8535c8a04075454c676a548dbec40673b0ad62e0.tar.bz2 |
supplemental-web: Two major additions here.
1) introduce the static dev node mapping as produced by autocard. Currently located under system->List static dev nodes for tuners. This link will pull in mappings from the MBE and all SLAVE boxes. The query will pull the data from the host each time it's requested, so the slave machines must be on to see the mapping. The data is pulled over http from the slave box by calling cardlist.cgi, which will read in /etc/udev/mv-persisten-video.description.
2) Add the ability to upload and download system backup files from the MBE. Also reworked the css to make it a tad prettier.
refs #893
refs #892
-rw-r--r-- | abs/core/supplemental-web/PKGBUILD | 4 | ||||
-rwxr-xr-x | abs/core/supplemental-web/cgi/cardlist.cgi | 16 | ||||
-rwxr-xr-x | abs/core/supplemental-web/contents/cardmap.shtml | 11 | ||||
-rw-r--r-- | abs/core/supplemental-web/contents/frame.css | 20 | ||||
-rw-r--r-- | abs/core/supplemental-web/contents/header.html | 1 | ||||
-rwxr-xr-x | abs/core/supplemental-web/contents/list_cardmap.py | 132 | ||||
-rw-r--r-- | abs/core/supplemental-web/contents/process.py | 124 | ||||
-rw-r--r-- | abs/core/supplemental-web/supplemental-web.install | 1 | ||||
-rw-r--r-- | abs/core/supplemental-web/supplemental_web.rules | 1 |
9 files changed, 283 insertions, 27 deletions
diff --git a/abs/core/supplemental-web/PKGBUILD b/abs/core/supplemental-web/PKGBUILD index d3f82d7..257abdd 100644 --- a/abs/core/supplemental-web/PKGBUILD +++ b/abs/core/supplemental-web/PKGBUILD @@ -1,7 +1,7 @@ pkgbase=supplemental-web pkgname=('supplemental-web' 'supplemental-web-slave') pkgver=1.0 -pkgrel=36 +pkgrel=39 arch=('i686' 'x86_64') backup=('extra.cfg.txt') @@ -79,4 +79,4 @@ md5sums=('521714803b5a3df529f0fc5f853c0d55' '26598fd1dfaf5d36d7b1f9620da5543c' 'fabf825ca07502db40d78f0aae15f90b' 'b41eeb0f0aa67ea06aedff61e53fa774' - 'c90d7a015783316af2256a37bece62ce') + 'd7be6bc265b2b9e775b090b6ac2448da') diff --git a/abs/core/supplemental-web/cgi/cardlist.cgi b/abs/core/supplemental-web/cgi/cardlist.cgi new file mode 100755 index 0000000..5ba7343 --- /dev/null +++ b/abs/core/supplemental-web/cgi/cardlist.cgi @@ -0,0 +1,16 @@ +#!/usr/bin/env python2 +print "Content-type: text/html" +print +exportfile = '/etc/udev/mv-persistent-video.description' +try: + f = open(exportfile,"r") + for line in f.readlines(): + if line.startswith("#"): + continue + item = line.split(":") + if len(item) <= 1 : + continue + print line +except : + print "" + print "Couldn't read static tuner map" diff --git a/abs/core/supplemental-web/contents/cardmap.shtml b/abs/core/supplemental-web/contents/cardmap.shtml new file mode 100755 index 0000000..89013c0 --- /dev/null +++ b/abs/core/supplemental-web/contents/cardmap.shtml @@ -0,0 +1,11 @@ +<html> + <head> + <style type="text/css">@import "/frame.css";</style> + </head> + <body> + <h1> List of detected cards and static device path. </h1> + <br> + <!--#exec cmd=" MYTHCONFDIR=/usr/share/mythtv /data/srv/httpd/htdocs/list_cardmap.py" --> + </body> +</html> + diff --git a/abs/core/supplemental-web/contents/frame.css b/abs/core/supplemental-web/contents/frame.css index eb6db98..42877dd 100644 --- a/abs/core/supplemental-web/contents/frame.css +++ b/abs/core/supplemental-web/contents/frame.css @@ -22,7 +22,7 @@ body { //-o-background-size: 1000px 10000px; //-moz-background-size: 1000px 10000px, 500px, 500px; //-webkit-background-size: 1000px 10000px, 500px 500px; - + margin: 10; margin-left:40px; padding: 10; @@ -55,11 +55,29 @@ body { /*background: #D9D9D9;*/ margin-left:60px; } + #column { float: right; /* Our column is going to be right aligned */ width: 320px; /* Our total width - content width is 260px */ /*background: #8A8AE6;*/ } + +#resultbox { + width: 700px ; + margin-left: auto ; + margin-right: auto ; + border-width: .2em; + border-style: dotted; + border-color: #900; + text-align: left; + padding-left: 30; + padding-right: 30; + padding-top: 10; + padding-bottom: 10; + +} + + #footer { clear: both; /* We have to clear our floats */ width: 760px; /* We need to set the width on the footer since it's outside the mainContainer, and therefor isn't controlled by it */ diff --git a/abs/core/supplemental-web/contents/header.html b/abs/core/supplemental-web/contents/header.html index a75d57c..e08cbda 100644 --- a/abs/core/supplemental-web/contents/header.html +++ b/abs/core/supplemental-web/contents/header.html @@ -40,6 +40,7 @@ function remyth() <li><a href="xymon" >System »</a>
<ul>
+ <li><a href="/cardmap.shtml" >List static dev nodes for tuners </a></li>
<li><a href="/exports.shtml" >List file shares </a></li>
<li><a href="/xymon" >System Health</a></li>
<li><a href="/logs/">System Logs</a></li>
diff --git a/abs/core/supplemental-web/contents/list_cardmap.py b/abs/core/supplemental-web/contents/list_cardmap.py new file mode 100755 index 0000000..0c28e0e --- /dev/null +++ b/abs/core/supplemental-web/contents/list_cardmap.py @@ -0,0 +1,132 @@ +#!/usr/bin/python2 +import subprocess +import socket,sys +import urllib2 +from MythTV import MythBE,MythDB,MythLog + +def find_slave_hosts(): + slave_hosts=[] + try: + be=MythBE() + db = MythDB() + cursor = db.cursor() + except: + return slave_hosts + + try: + cmd="select hostname from settings where data='Slave_backend';" + cursor.execute(cmd) + results=cursor.fetchall() + for i in results: + slave_hosts.append(i[0]) + except: + return slave_hosts + return slave_hosts + +def read_local_tuner(): + tuner_list = [] + exportfile = '/etc/udev/mv-persistent-video.description' + try: + f = open(exportfile,"r") + for line in f.readlines(): + if line.startswith("#"): + continue + item = line.split(":") + if len(item) <= 1 : + continue + tuner_list.append(item) + except : + tuner_list.append(["notfound","notfound","notfound"]) + return tuner_list + +def parse_remote_tuners(the_page): + tuner_list=[] + the_page = the_page.split("\n") + try: + for line in the_page: + if line.startswith("#"): + continue + item = line.split(":") + if len(item) <= 1 : + continue + tuner_list.append(item) + except : + tuner_list.append(["notfound","notfound","notfound"]) + return tuner_list + + +def remote_tuners(slave_host): + default_timeout = 3 + socket.setdefaulttimeout(default_timeout) + slaveurl="http://%s:1337/cardlist.cgi" %slave_host + req = urllib2.Request(slaveurl) + response = urllib2.urlopen(req) + the_page = response.read() + #the_page="abc\nadef\na" + if the_page : + tuner_list = parse_remote_tuners(the_page) + print "</br>" + for statictuner in tuner_list: + if statictuner[1].find("notfound") > -1 : + print "Couldn't open tuner map" + print "</br>" + else: + print "<li> %s  %s" %(statictuner[1] ,statictuner[0]) + print "</br>" + print " static device node: %s" %statictuner[2] + print "</br>" + print "</br>" + else: + print "<li> no tuners found  " + + return + + + +mbelist = read_local_tuner() +slave_hosts = find_slave_hosts() + +#--------------MBE------------- +hostname = socket.gethostname() +print "<h2>" +print "__________ %s __________" %(hostname) +print "</h2>" +print "</br>" +print ''' +<div id="navcontainer"> +<ul id="navlist"> +''' + +for statictuner in mbelist: + if statictuner[1].find("notfound") > -1 : + print "Couldn't open tuner map" + print "</br>" + else: + print "<li> %s  %s" %(statictuner[1] ,statictuner[0]) + print "</br>" + print " static device node: %s" %statictuner[2] + print "</br>" + print "</br>" + +print '''</ul> </div>''' + +#---------Slave tuners +for i in slave_hosts: + print "<h2>" + print "__________ %s __________" %(i) + print "</h2>" + print "</br>" + print ''' + <div id="navcontainer"> + <ul id="navlist" ''' + #remote_tuners(i) + try: + remote_tuners(i) + pass + except: + print "</br>" + print "<li> Problem reading list from %s" %i + pass + print ''' </ul> </div>''' + + diff --git a/abs/core/supplemental-web/contents/process.py b/abs/core/supplemental-web/contents/process.py index 22ffb0f..988ebfc 100644 --- a/abs/core/supplemental-web/contents/process.py +++ b/abs/core/supplemental-web/contents/process.py @@ -4,6 +4,8 @@ import cgi import os import socket import time +import StringIO + try: import cgitb cgitb.enable() @@ -45,10 +47,10 @@ def getform(theform, valuelist, notpresent='', nolist=False): data[field] = notpresent else: # the field is present - print type(theform[field]) + #print type(theform[field]) if type(theform[field]) != type([]): # is it a list or a single item - print type(theform[field]) + #print type(theform[field]) data[field] = theform[field].value else: if not nolist: @@ -100,18 +102,43 @@ def go_backup(myhost): myhostname = socket.gethostname() results="Nothing happened" command= "sudo /usr/LH/bin/lh_system_backup_job" - print command - command2="sleep 1; /home/xymon/server/ext/hbnotes.py" + #print command + + command2="sleep 1; sudo -u nobody /home/xymon/server/ext/hbnotes.py" results=os.popen(command,'r') os.popen(command2,'r') return results -def go_restore(restorefile,myhost): +def go_download_backup(dl_file): + # Actual File Content will go hear. + dlf = "/data/storage/disk0/backup/system_backups/%s" %dl_file + fo = open(dlf, "rb") + + str = fo.read() + fo.close() + + # HTTP Header + print "Content-Type:application/octet-stream; name=\"%s\"\r\n;" %(dl_file) + print "Content-Disposition: attachment; filename=\"%s\"\r\n;" %(dl_file) + print "Content-Length: %d" % len(str) + print "" + + print str + return results + + +def go_restore(restorefile,myhost,prestore): myhostname = socket.gethostname() + psc = '' + if prestore == "on": + psc = "partial" + + if myhostname.strip() == myhost.strip(): - localcommand="sudo /usr/LH/bin/lh_system_restore_job " - command= localcommand + restorefile + command="sudo /usr/LH/bin/lh_system_restore_job %s %s" %(restorefile , psc) + + else: #this should never execute @@ -119,15 +146,37 @@ def go_restore(restorefile,myhost): sshcmd+=myhost.strip() cmd=' "sudo /usr/bin/restore_job.sh " ' command=sshcmd + cmd + restorefile + " 2>&1 " - print command + #print command results=os.popen(command,'r') return results +def go_upload(up_file): + saveDir = "/data/storage/disk0/backup/system_backups/" + fPath = "%s/%s" % (saveDir, up_file.filename) + buf = up_file.file.read() + bytes = len(buf) + sFile = open(fPath, 'wb') + sFile.write(buf) + sFile.close() + results=["<b>%s</b> uploaded (%d bytes)." %(up_file.filename, bytes)] + line = '''The backup has been uploaded and is now available for restore. + To restore from the file, check "Restore database" then select the file from the drop down menu''' + + + results.append(line) + + command2="sleep 1; sudo -u nobody /home/xymon/server/ext/hbnotes.py" + os.popen(command2,'r') + + + return results + + def go_optimize(myhost): #myhostname = socket.gethostname() #if myhostname.strip() == myhost.strip(): command="/usr/LH/bin/optimize_mythdb.py" - print command + #print command results=os.popen(command,'r') #else: #results='This host does not run a database' @@ -137,17 +186,17 @@ def go_update(myhost,update_type): cmd=" call pacman update_system " cmd+=update_type command="/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 + 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): @@ -209,6 +258,9 @@ def go_kill(myhost,kill_type): return results + + + mainpage = ''' <html><head> <style type="text/css">@import "/frame.css";</style> @@ -223,11 +275,12 @@ error = ''' result = ''' <h1>%s of %s</h1> ''' -possible_parameters = ['param1', 'param2', 'param3', 'param4','hiddenparam','param5','param6'] +possible_parameters = ['param1', 'param2', 'param3', 'param4','hiddenparam','param5','param6','param7','uFile','param8'] if __name__ == '__main__': - cgiprint(contentheader) # content header - cgiprint() # finish headers with blank line + + #cgiprint(contentheader) # content header + #cgiprint() # finish headers with blank line theform = cgi.FieldStorage() #print theform @@ -246,19 +299,31 @@ if __name__ == '__main__': hidden = formdict['hiddenparam'] all_update_type=formdict['param5'] kill_type = formdict['param6'] + dl_file = formdict['param7'] + try: + up_file = theform['uFile'] + except: + pass + try: + prestore = theform['param8'].value + except: + prestore = "off" body = result % (radio, hidden) - print mainpage % body + #print mainpage % body selection=radio myhost=hidden.lower() if selection == "Restore": - mylogfile=go_restore(name,myhost) + mylogfile=go_restore(name,myhost,prestore) elif selection == "Backup": mylogfile=go_backup(myhost) + elif selection == "Dbackup": + mylogfile=go_download_backup(dl_file) + elif selection == "Update": mylogfile=go_update(myhost,update_type) elif selection == "Shutdown": @@ -275,14 +340,25 @@ if __name__ == '__main__': mylogfile=go_shutdownall() elif selection == "Kill": mylogfile=go_kill(myhost,kill_type) + elif selection == "Upload": + mylogfile = go_upload(up_file) + + + cgiprint(contentheader) # content header + cgiprint() # finish headers with blank line + print mainpage % body + + #box=''' </br> </br> + #<div style="border: 1px solid #aaa; width:700px; height:700px; overflow:auto; color:#FFF;text-align:left;"> + #<code id="box" style="display: block; height: 700px; width: 700px; overflow: auto;"> + #''' + box='''</br> </br> + <div id="resultbox" > - box=''' </br> </br> - <div style="border: 1px solid #aaa; width:700px; height:700px; overflow:auto; color:#FFF;text-align:left;"> - <code id="box" style="display: block; height: 700px; width: 700px; overflow: auto;"> ''' endbox=''' - </code> + </div> ''' javascript=''' diff --git a/abs/core/supplemental-web/supplemental-web.install b/abs/core/supplemental-web/supplemental-web.install index 21946b2..55101ba 100644 --- a/abs/core/supplemental-web/supplemental-web.install +++ b/abs/core/supplemental-web/supplemental-web.install @@ -9,6 +9,7 @@ pre_install() { # arg 1: the new package version post_install() { setfacl -m u:http:rx /home/mythtv/ + setfacl -m u:http:rwx /data/storage/disk0/backup/system_backups/ gen_light_include.py echo "==> Forcing a re-read of lighttpd's configuration file." echo "" diff --git a/abs/core/supplemental-web/supplemental_web.rules b/abs/core/supplemental-web/supplemental_web.rules index f4d477b..f860c3e 100644 --- a/abs/core/supplemental-web/supplemental_web.rules +++ b/abs/core/supplemental-web/supplemental_web.rules @@ -1,2 +1,3 @@ #These rules are used by supplemental-web http ALL = NOPASSWD:/usr/sbin/etherwake +http ALL = (nobody) NOPASSWD:/home/xymon/server/ext/hbnotes.py |