136 lines
5.2 KiB
Python
136 lines
5.2 KiB
Python
import os
|
|
import CryptoBoxContainer
|
|
import CryptoBoxTools
|
|
|
|
## useful constant for some functions
|
|
CONT_TYPES = CryptoBoxContainer.CryptoBoxContainer.Types
|
|
|
|
class WebInterfaceDataset(dict):
|
|
"""this class contains all data that should be available for the clearsilver
|
|
templates
|
|
"""
|
|
|
|
def __init__(self, cbox, prefs, plugins):
|
|
self.prefs = prefs
|
|
self.cbox = cbox
|
|
self.__setConfigValues()
|
|
self.plugins = plugins
|
|
self.setCryptoBoxState()
|
|
self.setPluginData()
|
|
self.setContainersState()
|
|
|
|
|
|
def setCryptoBoxState(self):
|
|
import cherrypy
|
|
self["Data.Version"] = self.cbox.VERSION
|
|
langs = self.cbox.getAvailableLanguages()
|
|
langs.sort()
|
|
for (index, lang) in enumerate(langs):
|
|
self.cbox.log.info("language loaded: %s" % lang)
|
|
self["Data.Languages.%d.name" % index] = lang
|
|
self["Data.Languages.%d.link" % index] = self.__getLanguageName(lang)
|
|
try:
|
|
self["Data.ScriptURL.Prot"] = cherrypy.request.scheme
|
|
host = cherrypy.request.headers["Host"]
|
|
self["Data.ScriptURL.Host"] = host.split(":",1)[0]
|
|
complete_url = "%s://%s" % (self["Data.ScriptURL.Prot"], self["Data.ScriptURL.Host"])
|
|
try:
|
|
port = int(host.split(":",1)[1])
|
|
complete_url += ":%s" % port
|
|
except (IndexError, ValueError):
|
|
if cherrypy.request.scheme == "http":
|
|
port = 80
|
|
elif cherrypy.request.scheme == "https":
|
|
port = 443
|
|
else:
|
|
## unknown scheme -> port 0
|
|
self.cbox.log.info("unknown protocol scheme used: %s" % (cherrypy.request.scheme,))
|
|
port = 0
|
|
self["Data.ScriptURL.Port"] = port
|
|
## retrieve the relative address of the CGI (or the cherrypy base address)
|
|
## remove the last part of the url and add a slash
|
|
path = "/".join(cherrypy.request.path.split("/")[:-1]) + "/"
|
|
self["Data.ScriptURL.Path"] = path
|
|
complete_url += path
|
|
self["Data.ScriptURL"] = complete_url
|
|
except AttributeError:
|
|
self["Data.ScriptURL"] = ""
|
|
|
|
|
|
def setCurrentDiskState(self, device):
|
|
for container in self.cbox.getContainerList():
|
|
if container.getDevice() == device:
|
|
isEncrypted = (container.getType() == CONT_TYPES["luks"]) and 1 or 0
|
|
isPlain = (container.getType() == CONT_TYPES["plain"]) and 1 or 0
|
|
isMounted = container.isMounted() and 1 or 0
|
|
self["Data.CurrentDisk.device"] = container.getDevice()
|
|
self["Data.CurrentDisk.name"] = container.getName()
|
|
self["Data.CurrentDisk.encryption"] = isEncrypted
|
|
self["Data.CurrentDisk.plaintext"] = isPlain
|
|
self["Data.CurrentDisk.active"] = isMounted
|
|
self["Data.CurrentDisk.size"] = CryptoBoxTools.getBlockDeviceSizeHumanly(container.getDevice())
|
|
if isMounted:
|
|
(size, avail, used) = container.getCapacity()
|
|
percent = used / size
|
|
self["Data.CurrentDisk.capacity.used"] = used
|
|
self["Data.CurrentDisk.capacity.free"] = avail
|
|
self["Data.CurrentDisk.capacity.size"] = size
|
|
self["Data.CurrentDisk.capacity.percent"] = percent
|
|
self["Settings.LinkAttrs.device"] = device
|
|
|
|
|
|
def setContainersState(self):
|
|
avail_counter = 0
|
|
active_counter = 0
|
|
for container in self.cbox.getContainerList():
|
|
## useful if the container was changed during an action
|
|
container.resetObject()
|
|
isEncrypted = (container.getType() == CONT_TYPES["luks"]) and 1 or 0
|
|
isPlain = (container.getType() == CONT_TYPES["plain"]) and 1 or 0
|
|
isMounted = container.isMounted() and 1 or 0
|
|
self["Data.Disks.%d.device" % avail_counter] = container.getDevice()
|
|
self["Data.Disks.%d.name" % avail_counter] = container.getName()
|
|
self["Data.Disks.%d.encryption" % avail_counter] = isEncrypted
|
|
self["Data.Disks.%d.plaintext" % avail_counter] = isPlain
|
|
self["Data.Disks.%d.active" % avail_counter] = isMounted
|
|
self["Data.Disks.%d.size" % avail_counter] = CryptoBoxTools.getBlockDeviceSizeHumanly(container.getDevice())
|
|
if isMounted: active_counter += 1
|
|
avail_counter += 1
|
|
self["Data.activeDisksCount"] = active_counter
|
|
|
|
|
|
def setPluginData(self):
|
|
for p in self.plugins:
|
|
lang_data = p.getLanguageData()
|
|
entryName = "Settings.PluginList." + p.getName()
|
|
self[entryName] = p.getName()
|
|
self[entryName + ".Link"] = lang_data.getValue("Link", p.getName())
|
|
self[entryName + ".Rank"] = p.getRank()
|
|
self[entryName + ".RequestAuth"] = p.isAuthRequired() and "1" or "0"
|
|
self[entryName + ".Enabled"] = p.isEnabled() and "1" or "0"
|
|
for a in p.pluginCapabilities:
|
|
self[entryName + ".Types." + a] = "1"
|
|
|
|
|
|
def __setConfigValues(self):
|
|
self["Settings.TemplateDir"] = os.path.abspath(self.prefs["Locations"]["TemplateDir"])
|
|
self["Settings.LanguageDir"] = os.path.abspath(self.prefs["Locations"]["LangDir"])
|
|
self["Settings.DocDir"] = os.path.abspath(self.prefs["Locations"]["DocDir"])
|
|
self["Settings.Stylesheet"] = self.prefs["WebSettings"]["Stylesheet"]
|
|
self["Settings.Language"] = self.prefs["WebSettings"]["Language"]
|
|
self["Settings.PluginDir"] = self.prefs["Locations"]["PluginDir"]
|
|
self["Settings.SettingsDir"] = self.prefs["Locations"]["SettingsDir"]
|
|
|
|
|
|
def __getLanguageName(self, lang):
|
|
try:
|
|
import neo_cgi, neo_util, neo_cs
|
|
except:
|
|
raise CryptoBoxExceptions.CBEnvironmentError("couldn't import 'neo_*'! Try 'apt-get install python-clearsilver'.")
|
|
hdf_path = os.path.join(self.prefs["Locations"]["LangDir"], lang + ".hdf")
|
|
hdf = neo_util.HDF()
|
|
hdf.readFile(hdf_path)
|
|
return hdf.getValue("Name",lang)
|
|
|
|
|
|
|