diff options
Diffstat (limited to 'openntpd-controller.lua')
-rw-r--r-- | openntpd-controller.lua | 363 |
1 files changed, 323 insertions, 40 deletions
diff --git a/openntpd-controller.lua b/openntpd-controller.lua index 7031263..22fb89f 100644 --- a/openntpd-controller.lua +++ b/openntpd-controller.lua @@ -5,6 +5,8 @@ module (..., package.seeall) -- We use the self.conf table because it already has prefix,controller,etc -- The redir code is defined in the application error handler (acf-controller) require("posix") +require("validator") + local list_redir = function (self) self.conf.action = "read" self.conf.type = "redir" @@ -18,28 +20,165 @@ mvc.on_load = function(self, parent) end end +local function getstatus(self) + local status = self.model.getstatus() + if (#status.status.value > 0) then + status.status.value = "Enabled" + else + status.status.value = "Disabled" + end + return status +end + +local function displaycmdmanagement(disablestart,disablestop,disablerestart) + -- Add a management buttons + local management = {} + management.start = cfe({ name="cmdmanagement", + label="Program control-panel", + value="Start", + type="submit", + }) + management.stop = cfe({ name="cmdmanagement", + label="Program control-panel", + value="Stop", + type="submit", + }) + management.restart = cfe({ name="cmdmanagement", + label="Program control-panel", + value="Restart", + type="submit", + }) + + -- Disable management buttons based on if the process is running or not + if (disablestart) then management.start.disabled = "yes" end + if (disablestop) then management.stop.disabled = "yes" end + if (disablerestart) then management.restart.disabled = "yes" end + + return management +end + +local function displaycmdsave(self) + -- Add a cmd button to the view + local cmdsave = cfe({ name="cmdsave", + label="Save/Apply above settings", + value="Save", + type="submit", + }) + return cmdsave +end config = function (self) - local cmd = self.clientdata.cmd local errors = {} local modify_opts = nil - local url = ENV["SCRIPT_NAME"] .. self.conf.prefix .. self.conf.controller - local hosts_cmd = tostring(self.clientdata.hosts_cmd) - local hosts_cmd = string.lower(hosts_cmd) - local listen_cmd = tostring(self.clientdata.listen_cmd) - local listen_cmd = string.lower(listen_cmd) - local settings_cmd = tostring(self.clientdata.settings_cmd) - local settings_cmd = string.lower(settings_cmd) + local cmdsavereply = {} + local cmdsaveresult = {} + -- Start/Stop/Restart process + local cmdmanagement + if ( self.clientdata.cmdmanagement) then + cmdmanagement = cfe({ + name="cmdmanagement", + label="Previous action result", + action=cfe({ + name="cmdmanagement", + value=string.lower(self.clientdata.cmdmanagement), -- This row contains start/stop/restart (one of these commands) + }), + }) + local actionresult, cmdmanagement = self.model:startstop_service( cmdmanagement.action ) + end + + if (self.clientdata.cmdsavesetstimeonstartup) then + if (self.clientdata.setstimeonstartup) then + modify_opts = self.model:modify_opts("add", "/etc/conf.d/ntpd", "NTPD_OPTS", "-s") + else + modify_opts = self.model:modify_opts("remove", "/etc/conf.d/ntpd", "NTPD_OPTS", "-s") + end + end + + if ( self.clientdata.hosts_cmd_delete) then + local variables="hosts_cmd_delete" + for var in string.gmatch(variables, "%S+") do + -- Send nil instead of "" causes the parameter to be removed/deleted/empty/unset the variable in the config-file +-- if (self.clientdata[var] == "") then self.clientdata[var] = nil end + cmdsaveresult[var], cmdsavereply[var] = self.model:modify_config( "delete", + "server%S?" , + string.match(self.clientdata["hosts_list"], "^%s*(%S*)") ) + end + end + + if ( self.clientdata.listen_cmd_delete) then + local variables="listen_cmd_delete" + for var in string.gmatch(variables, "%S+") do + -- Send nil instead of "" causes the parameter to be removed/deleted/empty/unset the variable in the config-file +-- if (self.clientdata[var] == "") then self.clientdata[var] = nil end + cmdsaveresult[var], cmdsavereply[var] = self.model:modify_config( "delete", + "listen on" , + string.match(self.clientdata["listen_list"], "^%s*(%S*)") ) + end + end + + if ( self.clientdata.hosts_cmd_add) then + local variables="hosts_cmd_add" + for var in string.gmatch(variables, "%S+") do + local freetocommit + -- Do some checking before executing the command + if not (self.clientdata["hosts_type"]) then + cmdsavereply["hosts_type"] = cfe ({ + errtxt="You need chose type of host to add!", + }) + cmdsavereply["hosts_add"] = cfe ({ + value=self.clientdata["hosts_add"], + }) + end + if (#self.clientdata["hosts_add"] == 0) then + cmdsavereply["hosts_add"] = cfe ({ errtxt="You need to add a valid hostname/IP!", }) + end + + if not ( cmdsavereply["hosts_type"] and cmdsavereply["hosts_type"]["errtxt"]) and not + (cmdsavereply["hosts_add"] and cmdsavereply["hosts_add"]["errtxt"]) then + -- Send nil instead of "" causes the parameter to be removed/deleted/empty/unset the variable in the config-file +-- if (self.clientdata[var] == "") then self.clientdata[var] = nil end + cmdsaveresult[var], cmdsavereply[var] = self.model:modify_config( "add", + self.clientdata["hosts_type"] , + self.clientdata["hosts_add"] ) + end + end + end + + if ( self.clientdata.listen_cmd_add) then + local variables="listen_cmd_add" + for var in string.gmatch(variables, "%S+") do + local freetocommit + -- Do some checking before executing the command + if (#self.clientdata["listen_add"] == 0) then + cmdsavereply["listen_add"] = cfe ({ errtxt="You need to add a valid hostname/IP!", }) + end + + if not ( cmdsavereply["listen_add"] and cmdsavereply["listen_add"]["errtxt"]) then + -- Send nil instead of "" causes the parameter to be removed/deleted/empty/unset the variable in the config-file +-- if (self.clientdata[var] == "") then self.clientdata[var] = nil end + cmdsaveresult[var], cmdsavereply[var] = self.model:modify_config( "add", + "listen on", + self.clientdata["listen_add"] ) + end + end + end + + +--[[ -- SECTION WHERE YOU SAVE NEW SETTINGS - if ( hosts_cmd == "delete") then + if ( self.clientdata.hosts_cmd_delete ) then if not (self.clientdata.hosts_list) then errors["hosts_list"]="You need to choose something in the list to delete" end + if (self.clientdata.hosts_list) then - modify_opts = self.model:modify_config(hosts_cmd, nil, self.clientdata.hosts_list) + modify_opts = self.model:modify_config(string.lower(tostring(self.clientdata.hosts_cmd)), nil, self.clientdata.hosts_list) end - elseif (hosts_cmd == "add") then + + + + if (string.lower(tostring(self.clientdata.hosts_cmd)) == "add") then if (self.clientdata.hosts_add == "") then errors["hosts_add"]="You need to enter a server/IP" end @@ -48,70 +187,214 @@ config = function (self) errors["hosts_add_orgvalue"] = self.clientdata.hosts_add end if (self.clientdata.hosts_add ~= "") and (self.clientdata.hosts_type ~= nil) then - modify_opts = self.model:modify_config(hosts_cmd, nil, self.clientdata.hosts_type .. " " .. self.clientdata.hosts_add) + modify_opts = self.model:modify_config(string.lower(tostring(self.clientdata.hosts_cmd)), nil, self.clientdata.hosts_type .. " " .. self.clientdata.hosts_add) end - elseif (listen_cmd == "add") then + elseif (string.lower(tostring(self.clientdata.listen_cmd)) == "add") then if (self.clientdata.listen_add == "") then errors["listen_add"]="You need to enter what you want to listen at" end if (self.clientdata.listen_add ~= "") then - modify_opts = self.model:modify_config(listen_cmd, nil, "listen on " .. self.clientdata.listen_add) + modify_opts = self.model:modify_config(string.lower(tostring(self.clientdata.listen_cmd)), nil, "listen on " .. self.clientdata.listen_add) end - elseif (listen_cmd == "delete") then + elseif (string.lower(tostring(self.clientdata.listen_cmd)) == "delete") then if not (self.clientdata.listen_list) then errors["listen_list"]="You need to choose something in the list to delete" end if (self.clientdata.listen_list) then - modify_opts = self.model:modify_config(listen_cmd, nil, self.clientdata.listen_list) + modify_opts = self.model:modify_config(string.lower(tostring(self.clientdata.listen_cmd)), nil, self.clientdata.listen_list) end - elseif (settings_cmd == "save") then - if (self.clientdata.settings_startup) then - modify_opts = self.model:modify_opts("add", "/etc/conf.d/ntpd", "NTPD_OPTS", "-s") - else - modify_opts = self.model:modify_opts("remove", "/etc/conf.d/ntpd", "NTPD_OPTS", "-s") +--]] + + local url = ENV["SCRIPT_NAME"] .. self.conf.prefix .. self.conf.controller + local status = getstatus(self) + local config = self.model:getconfig() + + -- Add buttons + config.hosts_cmd_delete = cfe({ + name = "hosts_cmd_delete", + label="Delete selected host", + value="Delete", + type="submit", + }) + config.hosts_cmd_delete.descr="Mark a item in '" .. config.hosts_list.label .. "'-list before pressing [" .. config.hosts_cmd_delete.value .. "]." + if (#config.hosts_list.option == 0) then + config.hosts_cmd_delete.disabled = "yes" + config.hosts_cmd_delete.descr = "" + end + + config.listen_cmd_delete = cfe({ + name = "listen_cmd_delete", + label="Delete selected host", + value="Delete", + type="submit", + }) + config.listen_cmd_delete.descr="Mark a item in '" .. config.listen_list.label .. "'-list before pressing [" .. config.listen_cmd_delete.value .. "]." + if (#config.listen_list.option == 0) then + config.listen_cmd_delete.disabled = "yes" + config.listen_cmd_delete.descr = "" + end + + config.hosts_cmd_add = cfe({ + name = "hosts_cmd_add", + label="Add selected host", + value="Add", + type="submit", + }) + config.hosts_cmd_add.descr="Enter your values in '" .. config.hosts_add.label .. "' and chose '" .. config.hosts_type.label .. "' before pressing [" .. config.hosts_cmd_add.value .. "]." + + config.listen_cmd_add = cfe({ + name = "listen_cmd_add", + label="Add new listen address", + value="Add", + type="submit", + }) + config.listen_cmd_add.descr="Enter your values in '" .. config.listen_add.label .. "' before pressing [" .. config.listen_cmd_add.value .. "]." + + -- Management buttons + local disablestart,disablestop,disablerestart + -- Disable management buttons based on if the process is running or not + if (string.lower(status.status.value) == "enabled" ) then + disablestart = "yes" + else + disablestop = "yes" + end + -- Disable management buttons if there exist errors in the config + for k,v in pairs(config) do + if (config[k]["errtxt"] ~= "") then + disablestart = "yes" + disablestop = "yes" + disablerestart = "yes" + break end end + -- Display management buttons + local management = displaycmdmanagement(disablestart,disablestop,disablerestart) - DEBUGMODEL = modify_opts -- <<< DEBUG INFO >>> - DEBUGCLIENTDATA = self.clientdata -- <<< DEBUG INFO >>> - local startstop - if ( cmd ~= nil ) then - startstop = self.model:startstop_service( cmd ) + -- Write out erros and descriptions from previous actions + for k,v in pairs(cmdsavereply) do + if (config[k]) and (cmdsavereply[k]["errtxt"]) and (#cmdsavereply[k]["errtxt"] > 0) then + config[k]["errtxt"] = tostring(cmdsavereply[k]["errtxt"]) + end + if (config[k]) and (cmdsavereply[k]["descr"]) and (#cmdsavereply[k]["descr"] > 0) then + config[k]["descr"] = tostring(cmdsavereply[k]["descr"]) + end + if (config[k]) and (cmdsavereply[k]["value"]) and (#cmdsavereply[k]["value"] > 0) then + config[k]["value"] = tostring(cmdsavereply[k]["value"]) + end end - return ( {status = self.model:getstatus(), - config = self.model:getconfig(), + + DEBUGMODEL = modify_opts -- <<< DEBUG INFO >>> + return ( {status = status, + config = config, + management = management, url = url, errors = errors, - startstop = startstop, } ) + cmdmanagement = cmdmanagement, + + cmdsavereply = cmdsavereply, + cmdsaveresult = cmdsaveresult, + modify_opts = modify_opts, + clientdata = self.clientdata, + } ) end logfile = function (self) - return ( {status = self.model:getstatus(), logfile = self.model:get_logfile(), url = url } ) + -- Start/Stop/Restart process + local cmdmanagement + if ( self.clientdata.cmdmanagement) then + cmdmanagement = cfe({ + name="cmdmanagement", + label="Previous action result", + action=cfe({ + name="cmdmanagement", + value=string.lower(self.clientdata.cmdmanagement), -- This row contains start/stop/restart (one of these commands) + }), + }) + local actionresult, cmdmanagement = self.model:startstop_service( cmdmanagement.action ) + end + + local status = getstatus(self) + local logfile = self.model:get_logfile() + + -- Management buttons + local disablestart,disablestop,disablerestart + -- Disable management buttons based on if the process is running or not + if (string.lower(status.status.value) == "enabled" ) then + disablestart = "yes" + else + disablestop = "yes" + end + -- Display management buttons + management = displaycmdmanagement(disablestart,disablestop,disablerestart) + + return ({ + management = management, + cmdmanagement = cmdmanagement, + status = status, + logfile = logfile, + url = url, + }) end status = function (self) local cmd = self.clientdata.cmd local url = ENV["SCRIPT_NAME"] .. self.conf.prefix .. self.conf.controller - return ( {status = self.model:getstatus(), url = url } ) + return ( {status = getstatus(self), url = url } ) end expert = function (self) - local modifications = self.clientdata.modifications or "" - local cmd = self.clientdata.cmd + local modifications = self.clientdata.filecontent or "" + if ( self.clientdata.cmdsave ) then + modifications = self.model:update_filecontent(modifications) + end local url = ENV["SCRIPT_NAME"] .. self.conf.prefix .. self.conf.controller - if ( modifications ~= "") then - modifications = self.model:update_filecontent(modifications) + -- Start/Stop/Restart process + local cmdmanagement + if ( self.clientdata.cmdmanagement) then + cmdmanagement = cfe({ + name="cmdmanagement", + label="Previous action result", + action=cfe({ + name="cmdmanagement", + value=string.lower(self.clientdata.cmdmanagement), -- This row contains start/stop/restart (one of these commands) + }), + }) + local actionresult, cmdmanagement = self.model:startstop_service( cmdmanagement.action ) end - if ( cmd ~= nil ) then - startstop = self.model:startstop_service( cmd ) + local status = getstatus(self) + local file = self.model:get_filedetails() + + -- Add buttons + file.cmdsave = cfe ({ + name="cmdsave", + label="Apply settings", + value="Apply", + type="submit", + }) + if (self.clientdata.cmdsave) then + file.cmdsave.descr="* Changes has been saved!" + end + + + -- Management buttons + local disablestart,disablestop,disablerestart + -- Disable management buttons based on if the process is running or not + if (string.lower(status.status.value) == "enabled" ) then + disablestart = "yes" + else + disablestop = "yes" end + -- Display management buttons + management = displaycmdmanagement(disablestart,disablestop,disablerestart) - return ( {startstop = startstop, - status = self.model:getstatus(), - file = self.model:get_filedetails(), + return ( { + status = status, + file = file, modifications = modifications, + management = management, + cmdmanagement = cmdmanagement, url = url, } ) end |