From 4bcd42d6158c47cc13e1a3f07a839ce9c20ae88a Mon Sep 17 00:00:00 2001 From: phear Date: Fri, 18 Aug 2006 21:45:40 +0000 Subject: [PATCH] further work on the new cherrypy driven web interface. clicking onhelp already works ;) we have to decide whether we want to seperate that monstrous contitional statement in cryptobox.pl into seperate functions. --- pythonrewrite/bin2/CryptoBoxWebserver.py | 190 ++++++++++++++++++++--- pythonrewrite/bin2/cryptobox.conf | 13 ++ 2 files changed, 185 insertions(+), 18 deletions(-) diff --git a/pythonrewrite/bin2/CryptoBoxWebserver.py b/pythonrewrite/bin2/CryptoBoxWebserver.py index b5940d8..5d2a7c6 100644 --- a/pythonrewrite/bin2/CryptoBoxWebserver.py +++ b/pythonrewrite/bin2/CryptoBoxWebserver.py @@ -1,25 +1,179 @@ #!/usr/bin/env python -import cherrypy, neo_cgi, neo_util, neo_cs, os +import os,sys +import CryptoBox +try: + import cherrypy +except: + print "could not import cherrypy module! Try apt-get install python-cherrypy." + sys.exit(1) +try: + import neo_cgi, neo_util, neo_cs +except: + print "could not import clearsilver modules! Try apt-get install python-clearsilver." + -class RunCmd: - def index(self): - print "ooooooooooooooooooooooooooooooo" - print os.path.abspath("./") - hdf = neo_util.HDF() - #hdf.setValue("hdf.loadpaths.0","/my/path") - hdf.readFile("../lang/de.hdf") - hdf.setValue("Settings.TemplateDir","../templates") - hdf.setValue("Settings.Stylesheet","cryptobox.css") - hdf.setValue("Data.Action","show_status") - cs = neo_cs.CS(hdf) - cs.parseFile("../templates/main.cs") +class clearsilver: + def __init__(self): + pass + + + def render(self,cs_path,settings = {},hdf_path = ""): + """ + render a clearsilver template and return the result. + gets: + - path to clearsilver template + - dictionary with settings (optional) + - path to hdf dataset (optional) + """ + + hdf=neo_util.HDF() + if hdf_path != "": + hdf.readFile(hdf_path) + for key in settings.keys(): + hdf.setValue(key,str(settings[key])) + cs= neo_cs.CS(hdf) + cs.parseFile(cs_path) return cs.render() + + +class CryptoBoxSite(CryptoBox.CryptoBoxProps): + def index(self,action="show_status",page="",weblang="",device="", type=""): + + #PROPOSAL: + #cherrypy could create nice paths like http://crypto.box/doc/, + #but that would require an update of the links in the templates. + #is the style worth it? + + + #sanitize input + page = self.sanitize_input(page) + action = self.sanitize_input(action) + device = self.sanitize_input(device) + type = self.sanitize_input(type) + #setting settings ;) + settings={} + TemplateDir = self.cbxPrefs["Settings"]["TemplateDir"] + settings["Settings.TemplateDir"] = TemplateDir + settings["Settings.Stylesheet"] = self.cbxPrefs["Settings"]["Stylesheet"] + LangDir = self.cbxPrefs["Settings"]["LangDir"] + settings["Settings.LangDir"] = LangDir + Language = self.cbxPrefs["Settings"]["Language"] + settings["Settings.DocDir"] = self.cbxPrefs["Settings"]["DocDir"] + settings["Settings.DocLang"] = self.cbxPrefs["Settings"]["DocLang"] + + + # BEWARE: there are two kinds of actions: + # * some require a harddisk + # * some do not require a harddisk + # take care, that you put a new action into the appropriate block below + + + + #TODO: check for ssl, see cryptobox.pl lines 483-9 + + #--------------------------------------------------------------# + # here you may define all cases that do not require a harddisk # + # put all other cases below the harddisk check # + #--------------------------------------------------------------# + #################### show_log ####################### + if action == "show_log": + settings["Data.Action"] = "show_log" + ##################### doc ############################ + elif action == "doc": + settings["Data.Action"] = "show_doc" + if page != "": + + settings["Data.Doc.Page"] = page + else: + settings["Data.Doc.Page"] ="CryptoBoxUser" + + + ##################### poweroff ###################### + elif action == "system_ask": + settings["Data.Action"] = "form_system" + ##################### reboot ######################## + elif action == "shutdown_do": + if type == "reboot": + #TODO: call function for system reboot + pass + settings["Data.Success"] = "ReBoot" + settings["Data.Redirect.Action"] = "show_status" + settings["Data.Redirect.Delay"] = "180" + else: + settings["Data.Success"] = "PowerOff" + settings["Data.Action"] = "empty" + ##################### check for a harddisk ########################## + # catch this error, to prevent all following actions from execution # + ##################################################################### + elif not True: #TODO: replace True with check for hard disk is_harddisk_available() + settings["Data.Error"] = "NoHardDisk" + #-------------------------------------------------------# + # here you may define all cases that require a harddisk # + #-------------------------------------------------------# + ################ umount_do ####################### + elif action == "unmount_do": + if device == "": + #TODO: debug message: "invalid device: "+ device + settings["Data.Warning"] = "InvalidDevice" + settings["Data.Action"] = "empty" + elif not True: #TODO: replace True with check_config() + settings["Data.Warning"] = "NotInitialized" + settings["Data.Action"] = "form_init" + elif True: #TODO: replace True with check_init_running() + settings["Data.Warning"] = "InitNotFinished" + settings["Data.Action"] = "empty" + settings["Data.Redirect.Action"] = "form_config" + settings["Data.Redirect.Delay"] = "30" + elif not True: #TODO: replace True with check_mounted(device) + settings["Data.Warning"] = "NotMounted" + settings["Data.Action"] = "show_volume" + else: #unmount + #TODO: replace this line with umount_vol(device) + if True: #TODO: replace True with check_mounted(device) + settings["Data.Warning"] = "UmountFailed" + settings["Data.Action"] = "show_volume" + else: + settings["Data.Action"] = "show_volume" + ################ mount_do ######################## + elif action == "mount_do": + if device != "": + pass #TODO: is_encrypted = check_device_encryption(device) + if device == "": + #TODO: debug_msg(DEBUG_INFO, "invalid device: " + device) + settings["Data.Warning"] = "InvalidDevice" + settings["Data.Action"] = "empty" + elif not True: #TODO: replace True with check_config() + settings["Data.Warning"] = "NotInitialized" + settings["Data.Action"] = "form_init" + #at cryptobox.pl line 568 + + + + + #go render stuff + cs = clearsilver() + content = cs.render(TemplateDir+"/main.cs",settings,LangDir+"/"+Language+".hdf") + return content + + + def sanitize_input(self,data): + #TODO: do things + return data index.exposed = True -##### -cherrypy.root = RunCmd() -#cherrypy.lib.cptools.serve_file("/tmp/cryptobox.css") -cherrypy.config.configMap.update({ "/cryptobox.css": { -"staticFilter.on" : True, "staticFilter.file": "/tmp/cryptobox.css" }}) +############################################################## + +cherrypy.root = CryptoBoxSite() +#expose static content: +#I currently have no idea how to cleanly extract the stylesheet path from +#the config object without an extra CryptoBox.CryptoBoxProps instance. +#perhaps put config handling into a seperate class in CryptoBox.py? +cherrypy.config.configMap.update( + { + "/cryptobox.css": { + "staticFilter.on" : True, + "staticFilter.file": os.path.abspath("../www-data/cryptobox.css" ) + } + }) cherrypy.server.start() diff --git a/pythonrewrite/bin2/cryptobox.conf b/pythonrewrite/bin2/cryptobox.conf index 1be4dc6..c20f860 100644 --- a/pythonrewrite/bin2/cryptobox.conf +++ b/pythonrewrite/bin2/cryptobox.conf @@ -50,3 +50,16 @@ Facility = file #Destination = /var/log/cryptobox.log Destination = ./cryptobox.log +[Settings] +#default stylesheet +Stylesheet = cryptobox.css +#where are the clearsilver templates? +TemplateDir = ../templates +#path to language files +LangDir = ../lang +#default language +Language = de +#path to documentation files +DocDir = ../doc/html +#default language for documentation +DocLang = en \ No newline at end of file