diff options
Diffstat (limited to 'applications/luci-app-radicale/luasrc/model/cbi/radicale.lua')
-rw-r--r-- | applications/luci-app-radicale/luasrc/model/cbi/radicale.lua | 306 |
1 files changed, 153 insertions, 153 deletions
diff --git a/applications/luci-app-radicale/luasrc/model/cbi/radicale.lua b/applications/luci-app-radicale/luasrc/model/cbi/radicale.lua index 8abb68869..c610478bc 100644 --- a/applications/luci-app-radicale/luasrc/model/cbi/radicale.lua +++ b/applications/luci-app-radicale/luasrc/model/cbi/radicale.lua @@ -1,14 +1,43 @@ --- Copyright 2015 Christian Schoenebeck <christian dot schoenebeck at gmail dot com> +-- Copyright 2015-2016 Christian Schoenebeck <christian dot schoenebeck at gmail dot com> -- Licensed under the Apache License, Version 2.0 -local NXFS = require("nixio.fs") -local DISP = require("luci.dispatcher") -local DTYP = require("luci.cbi.datatypes") -local HTTP = require("luci.http") -local UTIL = require("luci.util") -local UCI = require("luci.model.uci") -local SYS = require("luci.sys") -local TOOLS = require("luci.controller.radicale") -- this application's controller and multiused functions +local NXFS = require("nixio.fs") +local DISP = require("luci.dispatcher") +local DTYP = require("luci.cbi.datatypes") +local HTTP = require("luci.http") +local UTIL = require("luci.util") +local UCI = require("luci.model.uci") +local SYS = require("luci.sys") +local WADM = require("luci.tools.webadmin") +local CTRL = require("luci.controller.radicale") -- this application's controller and multiused functions + +-- ################################################################################################# +-- Error handling if not installed or wrong version -- ######################### +if not CTRL.service_ok() then + local f = SimpleForm("__sf") + f.title = CTRL.app_title_main() + f.description = CTRL.app_description() + f.embedded = true + f.submit = false + f.reset = false + + local s = f:section(SimpleSection) + s.title = [[<font color="red">]] .. [[<strong>]] + .. translate("Software update required") + .. [[</strong>]] .. [[</font>]] + + local v = s:option(DummyValue, "_dv") + v.rawhtml = true + v.value = CTRL.app_err_value + + return f +end + +-- ################################################################################################# +-- Error handling if no config, create an empty one -- ######################### +if not NXFS.access("/etc/config/radicale") then + NXFS.writefile("/etc/config/radicale", "") +end -- ################################################################################################# -- takeover arguments if any -- ################################################ @@ -19,8 +48,8 @@ if arg[1] then -- SimpleForm ------------------------------------------------ local ft = SimpleForm("_text") - ft.title = TOOLS.app_title_back() - ft.description = TOOLS.app_description() + ft.title = CTRL.app_title_back() + ft.description = CTRL.app_description() ft.redirect = DISP.build_url("admin", "services", "radicale") .. "#cbi-radicale-" .. argument if argument == "logger" then ft.reset = false @@ -95,54 +124,12 @@ if arg[1] then end --- ################################################################################################# --- Error handling if not installed or wrong version -- ######################### -if not TOOLS.service_ok() then - local f = SimpleForm("_no_config") - f.title = TOOLS.app_title_main() - f.description = TOOLS.app_description() - f.submit = false - f.reset = false - - local s = f:section(SimpleSection) - - local v = s:option(DummyValue, "_update_needed") - v.rawhtml = true - if TOOLS.service_installed() == "0" then - v.value = [[<h3><strong><br /><font color="red"> ]] - .. translate("Software package '" .. TOOLS.service_name() .. "' is not installed.") - .. [[</font><br /><br /> ]] - .. translate("required") .. [[: ]] .. TOOLS.service_name() .. [[ ]] .. TOOLS.service_required() - .. [[<br /><br /> ]] - .. [[<a href="]] .. DISP.build_url("admin", "system", "packages") ..[[">]] - .. translate("Please install current version !") - .. [[</a><br /> </strong></h3>]] - else - v.value = [[<h3><strong><br /><font color="red"> ]] - .. translate("Software package '" .. TOOLS.service_name() .. "' is outdated.") - .. [[</font><br /><br /> ]] - .. translate("installed") .. [[: ]] .. TOOLS.service_name() .. [[ ]] .. TOOLS.service_installed() - .. [[<br /> ]] - .. translate("required") .. [[: ]] .. TOOLS.service_name() .. [[ ]] .. TOOLS.service_required() - .. [[<br /><br /> ]] - .. [[<a href="]] .. DISP.build_url("admin", "system", "packages") ..[[">]] - .. translate("Please update to current version !") - .. [[</a><br /> </strong></h3>]] - end - - return f -end - --- ################################################################################################# --- Error handling if no config, create an empty one -- ######################### -if not NXFS.access("/etc/config/radicale") then - NXFS.writefile("/etc/config/radicale", "") -end - -- cbi-map -- ################################################################## local m = Map("radicale") -m.title = TOOLS.app_title_main() -m.description = TOOLS.app_description() +m.title = CTRL.app_title_main() +m.description = CTRL.app_description() +m.template = "radicale/tabmap_nsections" +m.tabbed = true function m.commit_handler(self) if self.changed then -- changes ? os.execute("/etc/init.d/radicale reload &") -- reload configuration @@ -150,11 +137,14 @@ function m.commit_handler(self) end -- cbi-section "System" -- ##################################################### -local sys = m:section( NamedSection, "_system" ) +local sys = m:section( NamedSection, "system", "system" ) sys.title = translate("System") sys.description = nil function sys.cfgvalue(self, section) - return "_dummysection" + if not self.map:get(section) then -- section might not exist + self.map:set(section, nil, self.sectiontype) + end + return self.map:get(section) end -- start/stop button ----------------------------------------------------------- @@ -165,7 +155,7 @@ btn.rmempty = true btn.title = translate("Start / Stop") btn.description = translate("Start/Stop Radicale server") function btn.cfgvalue(self, section) - local pid = TOOLS.get_pid(true) + local pid = CTRL.get_pid(true) if pid > 0 then btn.inputtitle = "PID: " .. pid btn.inputstyle = "reset" @@ -183,18 +173,39 @@ local ena = sys:option(Flag, "_enabled") ena.title = translate("Auto-start") ena.description = translate("Enable/Disable auto-start of Radicale on system start-up and interface events") ena.orientation = "horizontal" -- put description under the checkbox -ena.rmempty = false -- we need write +ena.rmempty = false -- force write() function function ena.cfgvalue(self, section) - return (SYS.init.enabled("radicale")) and "1" or "0" + return (SYS.init.enabled("radicale")) and self.enabled or self.disabled end function ena.write(self, section, value) - if value == "1" then + if value == self.enabled then return SYS.init.enable("radicale") else return SYS.init.disable("radicale") end end +-- boot_delay ------------------------------------------------------------------ +local bd = sys:option(Value, "boot_delay") +bd.title = translate("Boot delay") +bd.description = translate("Delay (in seconds) during system boot before Radicale start") + .. [[<br />]] + .. translate("During delay ifup-events are not monitored !") +bd.default = "10" +function bd.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end +function bd.validate(self, value) + local val = tonumber(value) + if not val then + return nil, self.title .. ": " .. translate("Value is not a number") + elseif val < 0 or val > 300 then + return nil, self.title .. ": " .. translate("Value not between 0 and 300") + end + return value +end + + -- cbi-section "Server" -- ##################################################### local srv = m:section( NamedSection, "server", "setting" ) srv.title = translate("Server") @@ -215,15 +226,17 @@ sh.description = translate("'Hostname:Port' or 'IPv4:Port' or '[IPv6]:Port' Radi .. [[</strong>]] sh.placeholder = "0.0.0.0:5232" sh.rmempty = true +function sh.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end -- realm ----------------------------------------------------------------------- local alm = srv:option( Value, "realm" ) alm.title = translate("Logon message") alm.description = translate("Message displayed in the client when a password is needed.") alm.default = "Radicale - Password Required" -alm.rmempty = false -function alm.parse(self, section) - AbstractValue.parse(self, section, "true") -- otherwise unspecific validate error +function alm.parse(self, section, novld) + CTRL.value_parse(self, section, novld) end function alm.validate(self, value) if value then @@ -232,22 +245,11 @@ function alm.validate(self, value) return self.default end end -function alm.write(self, section, value) - if value ~= self.default then - return self.map:set(section, self.option, value) - else - return self.map:del(section, self.option) - end -end -- ssl ------------------------------------------------------------------------- local ssl = srv:option( Flag, "ssl" ) ssl.title = translate("Enable HTTPS") ssl.description = nil -ssl.rmempty = false -function ssl.parse(self, section) - TOOLS.flag_parse(self, section) -end function ssl.write(self, section, value) if value == "0" then -- delete all if not https enabled self.map:del(section, "protocol") -- protocol @@ -273,18 +275,18 @@ prt:value ("PROTOCOL_SSLv3", "SSL v3") prt:value ("PROTOCOL_TLSv1", "TLS v1") prt:value ("PROTOCOL_TLSv1_1", "TLS v1.1") prt:value ("PROTOCOL_TLSv1_2", "TLS v1.2") +function prt.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end -- certificate ----------------------------------------------------------------- local crt = srv:option( Value, "certificate" ) crt.title = translate("Certificate file") crt.description = translate("Full path and file name of certificate") crt.placeholder = "/etc/radicale/ssl/server.crt" -crt.rmempty = false -- force validate/write crt:depends ("ssl", "1") -function crt.parse(self, section) - local _ssl = ssl:formvalue(section) or "0" - local novld = (_ssl == "0") - AbstractValue.parse(self, section, novld) -- otherwise unspecific validate error +function crt.parse(self, section, novld) + CTRL.value_parse(self, section, novld) end function crt.validate(self, value) local _ssl = ssl:formvalue(srv.section) or "0" @@ -295,17 +297,10 @@ function crt.validate(self, value) if DTYP.file(value) then return value else - return nil, self.title .. " - " .. translate("File not found !") + return nil, self.title .. ": " .. translate("File not found !") end else - return nil, self.title .. " - " .. translate("Path/File required !") - end -end -function crt.write(self, section, value) - if not value or #value == 0 then - return self.map:del(section, self.option) - else - return self.map:set(section, self.option, value) + return nil, self.title .. ": " .. translate("Path/File required !") end end @@ -314,12 +309,9 @@ local key = srv:option( Value, "key" ) key.title = translate("Private key file") key.description = translate("Full path and file name of private key") key.placeholder = "/etc/radicale/ssl/server.key" -key.rmempty = false -- force validate/write key:depends ("ssl", "1") -function key.parse(self, section) - local _ssl = ssl:formvalue(section) or "0" - local novld = (_ssl == "0") - AbstractValue.parse(self, section, novld) -- otherwise unspecific validate error +function key.parse(self, section, novld) + CTRL.value_parse(self, section, novld) end function key.validate(self, value) local _ssl = ssl:formvalue(srv.section) or "0" @@ -330,17 +322,10 @@ function key.validate(self, value) if DTYP.file(value) then return value else - return nil, self.title .. " - " .. translate("File not found !") + return nil, self.title .. ": " .. translate("File not found !") end else - return nil, self.title .. " - " .. translate("Path/File required !") - end -end -function key.write(self, section, value) - if not value or #value == 0 then - return self.map:del(section, self.option) - else - return self.map:set(section, self.option, value) + return nil, self.title .. ": " .. translate("Path/File required !") end end @@ -377,6 +362,9 @@ aty:value ("htpasswd", translate("htpasswd file")) --aty:value ("HTTP", "HTTP") -- The HTTP authentication module relies on the requests module --aty:value ("remote_user", "remote_user") --aty:value ("custom", translate("custom")) +function aty.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end function aty.write(self, section, value) if value ~= "htpasswd" then self.map:del(section, "htpasswd_encryption") @@ -403,9 +391,12 @@ hte:value ("crypt", translate("crypt")) hte:value ("plain", translate("plain")) hte:value ("sha1", translate("SHA-1")) hte:value ("ssha", translate("salted SHA-1")) +function hte.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end -- htpasswd_file (dummy) ------------------------------------------------------- -local htf = aut:option( DummyValue, "_htf" ) +local htf = aut:option( Value, "_htf" ) htf.title = translate("htpasswd file") htf.description = [[<strong>]] .. translate("Read only!") @@ -416,9 +407,6 @@ htf.description = [[<strong>]] .. [[">]] .. translate("To edit the file follow this link!") .. [[</a>]] -htf.keylist = {} -- required by template -htf.vallist = {} -- required by template -htf.template = "radicale/ro_value" htf.readonly = true htf:depends ("type", "htpasswd") function htf.cfgvalue() @@ -448,6 +436,9 @@ rty:value ("owner_only", translate("Full access for Owner only") ) rty:value ("owner_write", translate("Owner allow write, authenticated users allow read") ) rty:value ("from_file", translate("Rights are based on a regexp-based file") ) --rty:value ("custom", "Custom handler") +function rty.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end function rty.write(self, section, value) if value ~= "custom" then self.map:del(section, "custom_handler") @@ -460,7 +451,7 @@ function rty.write(self, section, value) end -- from_file (dummy) ----------------------------------------------------------- -local rtf = rig:option( DummyValue, "_rtf" ) +local rtf = rig:option( Value, "_rtf" ) rtf.title = translate("RegExp file") rtf.description = [[<strong>]] .. translate("Read only!") @@ -471,9 +462,6 @@ rtf.description = [[<strong>]] .. [[">]] .. translate("To edit the file follow this link!") .. [[</a>]] -rtf.keylist = {} -- required by template -rtf.vallist = {} -- required by template -rtf.template = "radicale/ro_value" rtf.readonly = true rtf:depends ("type", "from_file") function rtf.cfgvalue() @@ -501,6 +489,9 @@ sty:value ("filesystem", translate("File-system")) --sty:value ("multifilesystem", translate("") ) --sty:value ("database", translate("Database") ) --sty:value ("custom", translate("Custom") ) +function sty.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end function sty.write(self, section, value) if value ~= "filesystem" then self.map:del(section, "filesystem_folder") @@ -516,13 +507,10 @@ end local sfi = sto:option( Value, "filesystem_folder" ) sfi.title = translate("Directory") sfi.description = nil -sfi.default = "/srv/radicale" -sfi.rmempty = false -- force validate/write +sfi.placeholder = "/srv/radicale" sfi:depends ("type", "filesystem") -function sfi.parse(self, section) - local _typ = sty:formvalue(sto.section) or "" - local novld = (_typ ~= "filesystem") - AbstractValue.parse(self, section, novld) -- otherwise unspecific validate error +function sfi.parse(self, section, novld) + CTRL.value_parse(self, section, novld) end function sfi.validate(self, value) local _typ = sty:formvalue(sto.section) or "" @@ -533,10 +521,10 @@ function sfi.validate(self, value) if DTYP.directory(value) then return value else - return nil, self.title .. " - " .. translate("Directory not exists/found !") + return nil, self.title .. ": " .. translate("Directory not exists/found !") end else - return nil, self.title .. " - " .. translate("Directory required !") + return nil, self.title .. ": " .. translate("Directory required !") end end @@ -562,6 +550,9 @@ lco:value ("INFO", translate("Info") ) lco:value ("WARNING", translate("Warning") ) lco:value ("ERROR", translate("Error") ) lco:value ("CRITICAL", translate("Critical") ) +function lco.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end function lco.write(self, section, value) if value ~= self.default then return self.map:set(section, self.option, value) @@ -581,6 +572,9 @@ lsl:value ("INFO", translate("Info") ) lsl:value ("WARNING", translate("Warning") ) lsl:value ("ERROR", translate("Error") ) lsl:value ("CRITICAL", translate("Critical") ) +function lsl.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end function lsl.write(self, section, value) if value ~= self.default then return self.map:set(section, self.option, value) @@ -600,6 +594,9 @@ lfi:value ("INFO", translate("Info") ) lfi:value ("WARNING", translate("Warning") ) lfi:value ("ERROR", translate("Error") ) lfi:value ("CRITICAL", translate("Critical") ) +function lfi.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end function lfi.write(self, section, value) if value ~= self.default then return self.map:set(section, self.option, value) @@ -618,12 +615,14 @@ lfp.description = translate("Directory where the rotating log-files are stored") .. translate("To view latest log file follow this link!") .. [[</a>]] lfp.default = "/var/log/radicale" -function lfp.write(self, section, value) - if value ~= self.default then - return self.map:set(section, self.option, value) - else - return self.map:del(section, self.option) +function lfp.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end +function lfp.validate(self, value) + if not value or (#value < 1) or (value:find("/") ~= 1) then + return nil, self.title .. ": " .. translate("no valid path given!") end + return value end -- file_maxbytes --------------------------------------------------------------- @@ -634,23 +633,18 @@ lmb.description = translate("Maximum size of each rotation log-file.") .. translate("Setting this parameter to '0' will disable rotation of log-file.") .. [[</strong>]] lmb.default = "8196" -lmb.rmempty = false +function lmb.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end function lmb.validate(self, value) if value then -- otherwise errors in datatype check if DTYP.uinteger(value) then return value else - return nil, self.title .. " - " .. translate("Value is not an Integer >= 0 !") + return nil, self.title .. ": " .. translate("Value is not an Integer >= 0 !") end else - return nil, self.title .. " - " .. translate("Value required ! Integer >= 0 !") - end -end -function lmb.write(self, section, value) - if value ~= self.default then - return self.map:set(section, self.option, value) - else - return self.map:del(section, self.option) + return nil, self.title .. ": " .. translate("Value required ! Integer >= 0 !") end end @@ -662,23 +656,18 @@ lbc.description = translate("Number of backup files of log to create.") .. translate("Setting this parameter to '0' will disable rotation of log-file.") .. [[</strong>]] lbc.default = "1" -lbc.rmempty = false +function lbc.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end function lbc.validate(self, value) if value then -- otherwise errors in datatype check if DTYP.uinteger(value) then return value else - return nil, self.title .. " - " .. translate("Value is not an Integer >= 0 !") + return nil, self.title .. ": " .. translate("Value is not an Integer >= 0 !") end else - return nil, self.title .. " - " .. translate("Value required ! Integer >= 0 !") - end -end -function lbc.write(self, section, value) - if value ~= self.default then - return self.map:set(section, self.option, value) - else - return self.map:del(section, self.option) + return nil, self.title .. ": " .. translate("Value required ! Integer >= 0 !") end end @@ -699,14 +688,18 @@ local enr = enc:option( Value, "request" ) enr.title = translate("Response Encoding") enr.description = translate("Encoding for responding requests.") enr.default = "utf-8" -enr.optional = true +function enr.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end -- stock ----------------------------------------------------------------------- local ens = enc:option( Value, "stock" ) ens.title = translate("Storage Encoding") ens.description = translate("Encoding for storing local collections.") ens.default = "utf-8" -ens.optional = true +function ens.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end -- cbi-section "Headers" -- #################################################### local hea = m:section( NamedSection, "headers", "setting" ) @@ -724,25 +717,32 @@ end local heo = hea:option( DynamicList, "Access_Control_Allow_Origin" ) heo.title = translate("Access-Control-Allow-Origin") heo.description = nil -heo.default = "*" -heo.optional = true +function heo.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end -- Access_Control_Allow_Methods ------------------------------------------------ local hem = hea:option( DynamicList, "Access_Control_Allow_Methods" ) hem.title = translate("Access-Control-Allow-Methods") hem.description = nil -hem.optional = true +function hem.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end -- Access_Control_Allow_Headers ------------------------------------------------ local heh = hea:option( DynamicList, "Access_Control_Allow_Headers" ) heh.title = translate("Access-Control-Allow-Headers") heh.description = nil -heh.optional = true +function heh.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end -- Access_Control_Expose_Headers ----------------------------------------------- local hee = hea:option( DynamicList, "Access_Control_Expose_Headers" ) hee.title = translate("Access-Control-Expose-Headers") hee.description = nil -hee.optional = true +function hee.parse(self, section, novld) + CTRL.value_parse(self, section, novld) +end return m |