diff options
author | Mika Havela <mika.havela@gmail.com> | 2008-02-01 18:14:36 +0000 |
---|---|---|
committer | Mika Havela <mika.havela@gmail.com> | 2008-02-01 18:14:36 +0000 |
commit | 37b4a15a9a0e07504188b96567d500085b035b4d (patch) | |
tree | 9986b737683c22c8f5aafb47817ec1ab9b41efce | |
parent | 33dd344b2d2074c8838834e1c77336499b8cb068 (diff) | |
download | acf-shorewall-37b4a15a9a0e07504188b96567d500085b035b4d.tar.bz2 acf-shorewall-37b4a15a9a0e07504188b96567d500085b035b4d.tar.xz |
Changed shorewall so that it reports/uses cfe's instead!
git-svn-id: svn://svn.alpinelinux.org/acf/shorewall/trunk@682 ab2d0c66-481e-0410-8bed-d214d4d58bed
-rw-r--r-- | shorewall-check-html.lsp | 128 | ||||
-rw-r--r-- | shorewall-controller.lua | 407 | ||||
-rw-r--r-- | shorewall-edit-html.lsp | 159 | ||||
-rw-r--r-- | shorewall-expert-html.lsp | 64 | ||||
-rw-r--r-- | shorewall-logfile-html.lsp | 111 | ||||
-rw-r--r-- | shorewall-model.lua | 278 | ||||
-rw-r--r-- | shorewall-status-html.lsp | 51 |
7 files changed, 976 insertions, 222 deletions
diff --git a/shorewall-check-html.lsp b/shorewall-check-html.lsp index 75f019b..8aee254 100644 --- a/shorewall-check-html.lsp +++ b/shorewall-check-html.lsp @@ -1,49 +1,91 @@ -<? local view = ... ?> - -<h1>SYSTEM INFO</h1> - -<DL> -<dt>Program status</dt> -<DD><?= view.status.status ?></DD> -</DL> - -<DL> -<dt>Program version</dt> -<dd><?= view.status.version ?></dd> -</DL> - -<h1>CONFIGURATION</h1> - -<h2>CHECK CONFIG</h2> -<textarea name="checkresult"><?= view.check.result ?></textarea> - -<H1>MANAGEMENT</H1> - -<dl> -<dt>Preform check of configs</dt> -<dd><form name="check" action="" method="POST"><input type=submit name="check" value="check" class="submit"></form></dd> -</dl> - -<dl> -<dt>Program controll-panel</dt> -<dd><form name="cmd" action="<?= view.confirm_url ?>" method="POST"> -<input type=submit class="submit" name="cmd" value="start"> -<input type=submit class="submit" name="cmd" value="stop"> -<input type=submit class="submit" name="cmd" value="restart"> -</form></dd> -</dl> - -<? if (view.startstop) and (view.startstop.cmdresult) then ?> -<dl> -<dt>Previous action result</dt> -<dd><pre><?= view.startstop.cmdresult?></pre></dd> -</dl> +<? local form = ... ?> + +<? +function informationform(myform,tags) + io.write("<DL>") + for k,v in pairs(tags) do + if (myform[v]) then + local val = myform[v] + io.write("\t<DT") + if (#val.errtxt > 0) then io.write(" class='error'") end + io.write(">" .. val.label .. "</DT>\n") + + io.write("\t\t<DD>" .. val.value .. "\n") + if (val.descr) and (#val.descr > 0) then io.write("\t\t<P CLASS='descr'>" .. string.gsub(val.descr, "\n", "<BR>") .. "</P>\n") end + if (#val.errtxt > 0) then io.write("\t\t<P CLASS='error'>" .. string.gsub(val.errtxt, "\n", "<BR>") .. "</P>\n") end + io.write("\t\t</DD>\n") + end + end + io.write("</DL>") +end +?> +<? +function configform(myform,tags) + io.write("<DL>") + for k,v in pairs(tags) do + if (myform[v]) then + local val = myform[v] + io.write("\t<DT") + if (#val.errtxt > 0) then io.write(" class='error'") end + io.write(">" .. val.label .. "</DT>\n") + + io.write("\t\t<DD>" .. html.form[val.type](val) .. "\n") + if (val.descr) and (#val.descr > 0) then io.write("\t\t<P CLASS='descr'>" .. string.gsub(val.descr, "\n", "<BR>") .. "</P>\n") end + if (#val.errtxt > 0) then io.write("\t\t<P CLASS='error'>" .. string.gsub(val.errtxt, "\n", "<BR>") .. "</P>\n") end + io.write("\t\t</DD>\n") + end + end + io.write("</DL>") +end +?> + + +<H1>SYSTEM INFO</H1> +<? +local myform = form.status +local tags = { "status", "version", } +informationform(myform,tags) +?> + +<H1>CONFIGURATION</H1> +<? local myform = form.config ?> + +<H2>CHECK CONFIGURATION</H2> +<? +io.write(html.form[form.config.checkresult.type](form.config.checkresult)) +?> + + +<? +local cmdform = form.management +local tags = { "start", "stop", "restart" } +if (cmdform) and (cmdform[tags[1]]) then +?> + <form name="management" action="" method="POST"> + <H1>MANAGEMENT</H1> + <dl> + <dt><?= cmdform[tags[1]]["label"] ?></dt> + <dd> + <? for k,v in pairs(tags) do ?> + <? if (cmdform[v]) then ?> + <? io.write(html.form[cmdform[v].type](cmdform[v])) ?> + <? end ?> + <? end ?> + </dd> + + <? if (form.cmdmanagement) and (#form.cmdmanagement.descr > 0) then ?> + <dt>Previous action result</dt> + <dd><pre><?= form.cmdmanagement.descr ?></pre></dd> + <? end ?> + </dl> + </form> + <? end ?> <? --[[ DEBUG INFORMATION -require("debugs") -io.write(debugs.variables(view)) +io.write("<H1>DEBUGGING</H1><span style='color:red'><H2>DEBUG INFO: CFE</H2>") +io.write(html.cfe_unpack(form)) +io.write("</span>") --]] ?> - diff --git a/shorewall-controller.lua b/shorewall-controller.lua index 8218b4d..27da886 100644 --- a/shorewall-controller.lua +++ b/shorewall-controller.lua @@ -1,95 +1,386 @@ module(..., package.seeall) --- Cause an http redirect to our "read" action --- 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) local list_redir = function (self) self.conf.action = "status" self.conf.type = "redir" error (self.conf) end -mvc={} +mvc = {} mvc.on_load = function(self, parent) if (self.worker[self.conf.action] == nil ) or ( self.conf.action == "init" ) then self.worker[self.conf.action] = list_redir(self) end end -logfile = function (self) - return ( {status = self.model:getstatus(), logfile = self.model:get_logfile(), url = url } ) +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 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 + +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 + +function status(self) + return { status=getstatus(self) } end -check = function(self) - local check = nil - if (self.clientdata.cmd) then - if self.clientdata.cmd == "stop" then - self.conf.action = "confirmation" - self.conf.type = "redir" +--[=[ +function config(self) + local cmdmanagement, cmdmanagementresult + local cmdsavereply = {} + local cmdsaveresult = {} + if ( self.clientdata.cmdmanagement) then + cmdmanagement = cfe({ + name="cmdmanagement", + value=string.lower(self.clientdata.cmdmanagement), + }) + cmdmanagementresult, cmdmanagement = self.model:startstop_service( cmdmanagement ) + end + if ( self.clientdata.cmdsave) then + local variables="logfile loglevel smallerlogs maxsize numrotate localandnetworklog remotelogging" -- Advanced-config options +-- local variables="remotelogging" -- Guided-config options + 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:setconfigs( var,self.clientdata[var] ) + end + end + + local status = getstatus(self) + local config = self.model.getconfig() + + -- Write out erros from previous cmdsave actions + for k,v in pairs(cmdsaveresult) do + if not (v) then + config[k]["errtxt"] = tostring(cmdsavereply[k]["errtxt"]) end - check = self.model:startstop_service(self.clientdata.cmd) - check = self.clientdata.cmd + end + + -- Display save button + config.cmdsave = displaycmdsave() + + -- 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 - check = self.model:check_config() + disablestop = "yes" end - return ( {status = self.model:getstatus(), - check = check, - previousaction = self.clientdata.cmd, - confirm_url = ENV["SCRIPT_NAME"] .. self.conf.prefix .. self.conf.controller .. "/confirmation" } ) + -- 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) + + return { + option={ script=ENV["SCRIPT_NAME"], + prefix=self.conf.prefix, + controller = self.conf.controller, + action = "config", }, + status = status, + cmdmanagement = cmdmanagement, + management = management, + config = config, + debugclientdata = self.clientdata, + } end +--]=] +function check(self) + local cmdmanagement, cmdmanagementresult + if ( self.clientdata.cmdmanagement) then + cmdmanagement = cfe({ + name="cmdmanagement", + value=string.lower(self.clientdata.cmdmanagement), + }) + cmdmanagementresult, cmdmanagement = self.model:startstop_service( cmdmanagement ) + end -status = function(self) - if self.clientdata.cmd == "check" then - self.conf.action = "check" - self.conf.type = "redir" - error (self.conf) +--[[ + -- Save changes + local modifications = self.clientdata.filecontent or "" + if ( self.clientdata.cmdsave) then + modifications = self.model:updatefilecontent(modifications) end --- if self.clientdata.cmd == "restart" then --- return ( {programstats = self.model:restart_service(), url = ENV["SCRIPT_NAME"] .. self.conf.prefix .. self.conf.controller } ) --- end - return ( {status = self.model:getstatus(), url = ENV["SCRIPT_NAME"] .. self.conf.prefix .. self.conf.controller } ) -end +--]] + + local status = getstatus(self) + local config = self.model:configcheck() + + + -- Display save button +-- config.cmdsave = displaycmdsave() + +--[[ + -- 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) + + return { + option={ script=ENV["SCRIPT_NAME"], + prefix=self.conf.prefix, + controller = self.conf.controller, + action = "expert", }, + cmdmanagement = cmdmanagement, + management = management, + config = config, + status = status, + startstop = startstop, + debugclientdata = self.clientdata, + } -expert = function(self) - return ( {status = self.model:getstatus(),filelist = self.model:get_filelist(), url = ENV["SCRIPT_NAME"] .. self.conf.prefix .. self.conf.controller } ) end -edit = function (self) - local name = self.clientdata.name or "" - if (name == "") then - self.conf.action = "status" - self.conf.type = "redir" +function logfile(self) + local cmdmanagement, cmdmanagementresult + if ( self.clientdata.cmdmanagement) then + cmdmanagement = cfe({ + name="cmdmanagement", + value=string.lower(self.clientdata.cmdmanagement), + }) + cmdmanagementresult, cmdmanagement = self.model:startstop_service( cmdmanagement ) end - local modifications = self.clientdata.modifications or "" - local cmd = self.clientdata.cmd - local url = ENV["SCRIPT_NAME"] .. self.conf.prefix .. self.conf.controller - if ( modifications ~= "") then - modifications = self.model:update_filecontent(name,modifications) +--[[ + -- Save changes + local modifications = self.clientdata.filecontent or "" + if ( self.clientdata.cmdsave) then + modifications = self.model:updatefilecontent(modifications) end +--]] + local status = getstatus(self) + local config = self.model:getlogfile() + + + -- Display save button +-- config.cmdsave = displaycmdsave() - if ( cmd ~= nil ) then - startstop = self.model:startstop_service( cmd ) +--[[ + -- 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 - return ( {name=name,startstop = startstop, - status = self.model:getstatus(), - file = self.model:get_filedetails(name), - modifications = modifications, - url = ENV["SCRIPT_NAME"] .. self.conf.prefix .. self.conf.controller, - confirm_url = ENV["SCRIPT_NAME"] .. self.conf.prefix .. self.conf.controller .. "/confirmation", } ) + -- Display management buttons + local management = displaycmdmanagement(disablestart,disablestop,disablerestart) +--]] + + return { + option={ script=ENV["SCRIPT_NAME"], + prefix=self.conf.prefix, + controller = self.conf.controller, + action = "expert", }, + cmdmanagement = cmdmanagement, + management = management, + config = config, + status = status, + startstop = startstop, + debugclientdata = self.clientdata, + } + end -confirmation = function (self) - local confirm = self.clientdata.confirm - if ( confirm ~= nil ) then - startstop = self.model:startstop_service( confirm ) +function expert(self) + local cmdmanagement, cmdmanagementresult + if ( self.clientdata.cmdmanagement) then + cmdmanagement = cfe({ + name="cmdmanagement", + value=string.lower(self.clientdata.cmdmanagement), + }) + cmdmanagementresult, cmdmanagement = self.model:startstop_service( cmdmanagement ) + end + +--[[ + -- Save changes + local modifications = self.clientdata.filecontent or "" + if ( self.clientdata.cmdsave) then + modifications = self.model:updatefilecontent(modifications) end - return ( {startstop = startstop, - previousaction = self.clientdata.cmd, - status = self.model:getstatus(), - confirm_url = ENV["SCRIPT_NAME"] .. self.conf.prefix .. self.conf.controller .. "/confirmation", - url = ENV["SCRIPT_NAME"] .. self.conf.prefix .. self.conf.controller, } ) +--]] + local status = getstatus(self) + local config = self.model:getfilelist() + + + -- Display save button +-- config.cmdsave = displaycmdsave() + +--[[ + -- 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) +--]] + + return { + option={ script=ENV["SCRIPT_NAME"], + prefix=self.conf.prefix, + controller = self.conf.controller, + action = "expert", }, + cmdmanagement = cmdmanagement, + management = management, + config = config, + status = status, + startstop = startstop, + debugclientdata = self.clientdata, + } + end +function edit(self) + local cmdmanagement, cmdmanagementresult, modifications + if ( self.clientdata.cmdmanagement) then + cmdmanagement = cfe({ + name="cmdmanagement", + value=string.lower(self.clientdata.cmdmanagement), + }) + cmdmanagementresult, cmdmanagement = self.model:startstop_service( cmdmanagement ) + end + +---[[ + -- Save changes + if ( self.clientdata.cmdsave) then + local filetochange = cfe ({ name=self.clientdata.filename, value=self.clientdata.filecontent, }) + modifications = self.model:updatefilecontent(filetochange) + self.clientdata.name = self.clientdata.filename + end +--]] + local status = getstatus(self) + local config = self.model:getfiledetails(cfe({ + name="editfile", + value=self.clientdata.name, + })) + + -- Display save button + config.cmdsave = displaycmdsave() + +--[[ + -- 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) +--]] + + return { + option={ script=ENV["SCRIPT_NAME"], + prefix=self.conf.prefix, + controller = self.conf.controller, + action = "edit", }, + cmdmanagement = cmdmanagement, + modifications = modifications, + management = management, + config = config, + status = status, + startstop = startstop, + debugclientdata = self.clientdata, + } + +end diff --git a/shorewall-edit-html.lsp b/shorewall-edit-html.lsp index 3e7a472..bc9b409 100644 --- a/shorewall-edit-html.lsp +++ b/shorewall-edit-html.lsp @@ -1,73 +1,122 @@ -<? local view = ... ?> - -<h1>SYSTEM INFO</h1> - -<DL> -<dt>Program status</dt> -<DD><?= view.status.status ?></DD> -</DL> - -<DL> -<dt>Program version</dt> -<dd><?= view.status.version ?></dd> -</DL> - -<h1>CONFIGURATION</h1> +<? local form = ... ?> +<? +--[[ DEBUG INFORMATION +io.write("<H1>DEBUGGING</H1><span style='color:red'><H2>DEBUG INFO: CFE</H2>") +io.write(html.cfe_unpack(form)) +io.write("</span>") +--]] +?> +<? +function informationform(myform,tags) + io.write("<DL>") + for k,v in pairs(tags) do + if (myform[v]) then + local val = myform[v] + io.write("\t<DT") + if (#val.errtxt > 0) then io.write(" class='error'") end + io.write(">" .. val.label .. "</DT>\n") + + io.write("\t\t<DD>" .. val.value .. "\n") + if (val.descr) and (#val.descr > 0) then io.write("\t\t<P CLASS='descr'>" .. string.gsub(val.descr, "\n", "<BR>") .. "</P>\n") end + if (#val.errtxt > 0) then io.write("\t\t<P CLASS='error'>" .. string.gsub(val.errtxt, "\n", "<BR>") .. "</P>\n") end + io.write("\t\t</DD>\n") + end + end + io.write("</DL>") +end +?> +<? +function configform(myform,tags) + io.write("<DL>") + for k,v in pairs(tags) do + if (myform[v]) then + local val = myform[v] + io.write("\t<DT") + if (#val.errtxt > 0) then io.write(" class='error'") end + io.write(">" .. val.label .. "</DT>\n") + + io.write("\t\t<DD>" .. html.form[val.type](val) .. "\n") + if (val.descr) and (#val.descr > 0) then io.write("\t\t<P CLASS='descr'>" .. string.gsub(val.descr, "\n", "<BR>") .. "</P>\n") end + if (#val.errtxt > 0) then io.write("\t\t<P CLASS='error'>" .. string.gsub(val.errtxt, "\n", "<BR>") .. "</P>\n") end + io.write("\t\t</DD>\n") + end + end + io.write("</DL>") +end +?> -<H2>Expert config</H2> -<h3>File details</h3> +<H1>SYSTEM INFO</H1> +<? +local myform = form.status +local tags = { "status", "version", } +informationform(myform,tags) +?> -<DL> -<dt>File name</dt> -<dd><?= view.file.details.path ?></dd> -</DL> +<H1>CONFIGURATION</H1> +<? local myform = form.config ?> +<form action="<?= form.option.script .. "/" .. form.option.prefix .. + form.option.controller .. "/" .. form.option.action ?>" method="POST"> -<DL> -<dt>File size</dt> -<dd><?= view.file.details.size ?></dd> -</DL> +<H2>EXPERT CONFIGURATION</H2> +<H3>FILE DETAILS</H3> +<? +local tags = { "filename", } +informationform(myform,tags) +?> -<DL> -<dt>Last modified</dt> -<dd><?= view.file.details.mtime ?></dd> -</DL> +<? if (form.config.filecontent) then ?> -<h3>File content</h3> +<? +local tags = { "filesize", "mtime", "sumerrors" } +informationform(myform,tags) +?> -<form name="myform" action="" method="POST"> -<input name="name" type=hidden value="<?= view.file.details.path ?>"> -<textarea name="modifications"><?= view.file.content ?></textarea> +<H3>FILE CONTENT</H3> +<input type="hidden" value="<?= myform.filename.value ?>" name="<?= myform.filename.name ?>"> +<? +io.write(html.form[form.config.filecontent.type](form.config.filecontent)) +?> -<H2>Save and apply above settings</H2> -<DL> -<DT>Apply settings</DT> -<DD><input class="submit" type="submit" value="Apply"/></DD> -</DL> +<H2>SAVE AND APPLY ABOVE SETTINGS</H2> +<? +local tags = { "cmdsave", } +configform(myform,tags) +?> </form> -<H1>MANAGEMENT</H1> +<? end ?> -<dl> -<dt>Program controll-panel</dt> -<dd><form name="cmd" action="<?= view.confirm_url ?>" method="POST"> -<input type=submit class="submit" name="cmd" value="start"> -<input type=submit class="submit" name="cmd" value="stop"> -<input type=submit class="submit" name="cmd" value="restart"> -</form></dd> -</dl> +<? +local cmdform = form.management +local tags = { "start", "stop", "restart" } +if (cmdform) and (cmdform[tags[1]]) then +?> + <form name="management" action="" method="POST"> + <H1>MANAGEMENT</H1> + <dl> + <dt><?= cmdform[tags[1]]["label"] ?></dt> + <dd> + <? for k,v in pairs(tags) do ?> + <? if (cmdform[v]) then ?> + <? io.write(html.form[cmdform[v].type](cmdform[v])) ?> + <? end ?> + <? end ?> + </dd> + + <? if (form.cmdmanagement) and (#form.cmdmanagement.descr > 0) then ?> + <dt>Previous action result</dt> + <dd><pre><?= form.cmdmanagement.descr ?></pre></dd> + <? end ?> + </dl> + </form> -<? if (view.startstop) and (view.startstop.cmdresult) then ?> -<dl> -<dt>Previous action result</dt> -<dd><pre><?= view.startstop.cmdresult?></pre></dd> -</dl> <? end ?> <? --[[ DEBUG INFORMATION -require("debugs") -io.write(debugs.variables(view)) +io.write("<H1>DEBUGGING</H1><span style='color:red'><H2>DEBUG INFO: CFE</H2>") +io.write(html.cfe_unpack(form)) +io.write("</span>") --]] ?> - diff --git a/shorewall-expert-html.lsp b/shorewall-expert-html.lsp index 2e2c1da..5a27555 100644 --- a/shorewall-expert-html.lsp +++ b/shorewall-expert-html.lsp @@ -1,42 +1,66 @@ -<? local view = ... ?> -<h1>SYSTEM INFO</h1> +<? local form = ... ?> +<? +--[[ DEBUG INFORMATION +io.write("<H1>DEBUGGING</H1><span style='color:red'><H2>DEBUG INFO: CFE</H2>") +io.write(html.cfe_unpack(form)) +io.write("</span>") +--]] +?> -<DL> -<dt>Program status</dt> -<DD><?= view.status.status ?></DD> -</DL> +<? +function informationform(myform,tags) + io.write("<DL>") + for k,v in pairs(tags) do + if (myform[v]) then + local val = myform[v] + io.write("\t<DT") + if (#val.errtxt > 0) then io.write(" class='error'") end + io.write(">" .. val.label .. "</DT>\n") -<DL> -<dt>Program version</dt> -<dd><?= view.status.version ?></dd> -</DL> + io.write("\t\t<DD>" .. val.value .. "\n") + if (val.descr) and (#val.descr > 0) then io.write("\t\t<P CLASS='descr'>" .. string.gsub(val.descr, "\n", "<BR>") .. "</P>\n") end + if (#val.errtxt > 0) then io.write("\t\t<P CLASS='error'>" .. string.gsub(val.errtxt, "\n", "<BR>") .. "</P>\n") end + io.write("\t\t</DD>\n") + end + end + io.write("</DL>") +end +?> + +<H1>SYSTEM INFO</H1> +<? +local myform = form.status +local tags = { "status", "version", } +informationform(myform,tags) +?> <h1>CONFIGURATION</h1> <h2>Expert config</h2> <h3>List of configfiles</h3> +<? local myform = form.config ?> <TABLE> <TR style="background:#eee;font-weight:bold;"> - <TD width="120px" align="left">File</TD> - <TD width="60px" align="right" style="padding-right:10px">Size</TD> - <TD align="left">Last Modified</TD> + <TD style="padding-right:20px;white-space:nowrap;">File</TD> + <TD style="padding-right:20px;white-space:nowrap;">Size</TD> + <TD style="white-space:nowrap;">Last Modified</TD> </TR> -<? for i = 1, table.maxn(view.filelist) do ?> +<? for i = 1, table.maxn(myform) do ?> <TR> - <TD><?= html.link{value = view.url .. "/edit?name=" .. view.filelist[i].path , label=view.filelist[i].name } ?></TD> - <TD style="padding-right:10px" align="right"><?= view.filelist[i].filedetails.size ?></TD> - <TD><?= view.filelist[i].filedetails.mtime ?></TD> + <TD style="padding-right:20px;white-space:nowrap;"><?= html.link{value = "edit?name=" .. myform[i].value , label=myform[i].value } ?></TD> + <TD style="padding-right:20px;white-space:nowrap;"><?= myform[i].size ?></TD> + <TD style="white-space:nowrap;" width="90%"><?= myform[i].mtime ?></TD> </TR> <? end ?> </TABLE> <? --[[ DEBUG INFORMATION -require("debugs") -io.write(debugs.variables(view)) +io.write("<H1>DEBUGGING</H1><span style='color:red'><H2>DEBUG INFO: CFE</H2>") +io.write(html.cfe_unpack(form)) +io.write("</span>") --]] ?> - diff --git a/shorewall-logfile-html.lsp b/shorewall-logfile-html.lsp index f509a1d..e7d32b2 100644 --- a/shorewall-logfile-html.lsp +++ b/shorewall-logfile-html.lsp @@ -1,32 +1,103 @@ -<? local view = ... ?> +<? local form = ... ?> +<? +--[[ DEBUG INFORMATION +io.write("<H1>DEBUGGING</H1><span style='color:red'><H2>DEBUG INFO: CFE</H2>") +io.write(html.cfe_unpack(form)) +io.write("</span>") +--]] +?> + +<? +function informationform(myform,tags) + io.write("<DL>") + for k,v in pairs(tags) do + if (myform[v]) then + local val = myform[v] + io.write("\t<DT") + if (#val.errtxt > 0) then io.write(" class='error'") end + io.write(">" .. val.label .. "</DT>\n") + + io.write("\t\t<DD>" .. val.value .. "\n") + if (val.descr) and (#val.descr > 0) then io.write("\t\t<P CLASS='descr'>" .. string.gsub(val.descr, "\n", "<BR>") .. "</P>\n") end + if (#val.errtxt > 0) then io.write("\t\t<P CLASS='error'>" .. string.gsub(val.errtxt, "\n", "<BR>") .. "</P>\n") end + io.write("\t\t</DD>\n") + end + end + io.write("</DL>") +end +?> +<? +function configform(myform,tags) + io.write("<DL>") + for k,v in pairs(tags) do + if (myform[v]) then + local val = myform[v] + io.write("\t<DT") + if (#val.errtxt > 0) then io.write(" class='error'") end + io.write(">" .. val.label .. "</DT>\n") + + io.write("\t\t<DD>" .. html.form[val.type](val) .. "\n") + if (val.descr) and (#val.descr > 0) then io.write("\t\t<P CLASS='descr'>" .. string.gsub(val.descr, "\n", "<BR>") .. "</P>\n") end + if (#val.errtxt > 0) then io.write("\t\t<P CLASS='error'>" .. string.gsub(val.errtxt, "\n", "<BR>") .. "</P>\n") end + io.write("\t\t</DD>\n") + end + end + io.write("</DL>") +end +?> + -<h1>SYSTEM INFO</h1> +<H1>SYSTEM INFO</H1> +<? +local myform = form.status +local tags = { "status", "version", } +informationform(myform,tags) +?> -<DL> -<dt>Program status</dt> -<DD><?= view.status.status ?></DD> -</DL> +<H1>LOGIFLES</H1> +<H2>DETAILS</H2> +<? local myform = form.config ?> +<H3>FILE DETAILS</H3> +<? +local tags = { "filename", "filesize", "mtime", "sumerrors" } +informationform(myform,tags) +?> -<DL> -<dt>Program version</dt> -<dd><?= view.status.version ?></dd> -</DL> +<H3>FILE CONTENT</H3><? +io.write(html.form[form.config.checkresult.type](form.config.checkresult)) +?> -<h1>LOGFILE</h1> -<h2>Details</h2> +<? +local cmdform = form.management +local tags = { "start", "stop", "restart" } +if (cmdform) and (cmdform[tags[1]]) then +?> + <form name="management" action="" method="POST"> + <H1>MANAGEMENT</H1> + <dl> + <dt><?= cmdform[tags[1]]["label"] ?></dt> + <dd> + <? for k,v in pairs(tags) do ?> + <? if (cmdform[v]) then ?> + <? io.write(html.form[cmdform[v].type](cmdform[v])) ?> + <? end ?> + <? end ?> + </dd> -<DL> -<dt>Logfile</dt> -<dd><?= view.logfile.cmd ?></dd> -</DL> + <? if (form.cmdmanagement) and (#form.cmdmanagement.descr > 0) then ?> + <dt>Previous action result</dt> + <dd><pre><?= form.cmdmanagement.descr ?></pre></dd> + <? end ?> + </dl> + </form> -<h2>Content</h2> -<textarea name=""><? io.write(view.logfile.value) ?></textarea> +<? end ?> <? --[[ DEBUG INFORMATION -require("debugs") -io.write(debugs.variables(view)) +io.write("<H1>DEBUGGING</H1><span style='color:red'><H2>DEBUG INFO: CFE</H2>") +io.write(html.cfe_unpack(form)) +io.write("</span>") --]] ?> diff --git a/shorewall-model.lua b/shorewall-model.lua index fe9c18e..cc6a85f 100644 --- a/shorewall-model.lua +++ b/shorewall-model.lua @@ -1,3 +1,270 @@ +module(..., package.seeall) + +require("fs") +require("procps") +require("getopts") +require("format") +require("daemoncontrol") +require("validator") + +local configfile = "/etc/shorewall/shorewall.conf" +local processname = "shorewall" +local baseurl = "/etc/shorewall/" + +local config = {} + +local function getloglevels() + local loglevels = {} + for i=1,8 do + table.insert(loglevels,i) + end + return loglevels +end + +local function getdetails() + local f,error = io.popen("/sbin/shorewall status") + local fake = f:read("*l") + local fake = f:read("*l") + local programstatus = f:read("*l") or "" + local programstate = f:read("*l") or "" + f:close() + local f,error = io.popen("/sbin/shorewall version") + local programversion = "shorewall-" .. f:read("*l") + f:close() + return programversion,programstatus,programstate +end + +-- ################################################################################ +-- PUBLIC FUNCTIONS + +-- action should be a CFE +function startstop_service ( self, action ) + local cmd = action.value + local cmdresult,cmdmessage,cmderror,cmdaction = daemoncontrol.daemoncontrol(processname, cmd) + action.descr=cmdmessage + action.errtxt=cmderror + -- Reporting back (true|false, the original acition) + return cmdresult,action + +end + +function getstatus() + local status = {} + local programversion,programstatus,programstate = getdetails() + status.version = cfe({ name = "version", + label="Program version", + value=programversion, + }) + status.status = cfe({ name="status", + label="Program status", + value=programstatus, + }) + status.state = cfe({ name="state", + label="Program reports", + value=programstate, + }) + + return status +end + +function configcheck () + local check = {} + local f,err = io.popen("/bin/echo -n '>> Check starts at: ';/bin/date; /bin/echo; /etc/init.d/shorewall check; /bin/echo; /bin/echo -n '>> Check stops at: '; /bin/date;") + local checkresult = f:read("*a") + f:close() + check.checkresult = cfe({ name = "checkresult", + type="longtext", + label="Result of checking config", + value=checkresult, + }) + return check +end + +function getlogfile () + local logfile = {} + local cmdaction = "cat /var/log/messages | grep Shorewall" + local f, error = io.popen(cmdaction ,r) + local checkresult = f:read("*a") + f:close() + logfile.checkresult = cfe({ name = "checkresult", + type="longtext", + label="Result of logfiles", + value=checkresult, + }) + logfile.filename = cfe({ + name="filename", + label="File name", + value=cmdaction, + }) + return logfile +end + +function getfilelist () + local filepath = baseurl + local listed_files = {} + + local k,v + for name in posix.files(filepath) do + if not string.match(name, "^%.") and not string.match(name, "^Makefile") then + local filedetails = fs.stat(filepath .. name) + table.insert ( listed_files , cfe({name=name, value=filepath .. name, mtime=filedetails.mtime, size=filedetails.size,}) ) + end + end + + table.sort(listed_files, function (a,b) return (a.name < b.name) end ) + + return listed_files +end + +function getfiledetails(self,search) + local file = {} + local path = nil + --Validate filename + local available_files = getfilelist() + for k,v in pairs(available_files) do + if ( tostring(available_files[k]["value"]) == tostring(search.value) ) then + path = tostring(search.value) + end + end + if not (path) or (path == "") then + file["filename"] = search + file["filename"]["label"] = "File name" + file["filename"]["errtxt"] = "Invalid path!" + return file + end + + local filedetails = fs.stat(path) + file["filename"] = cfe({ + name="filename", + label="File name", + value=path, + }) + file["filesize"] = cfe({ + name="filesize", + label="File size", + value=filedetails.size, + }) + file["mtime"] = cfe({ + name="mtime", + label="File name", + value=filedetails.mtime, + }) + file["filecontent"] = cfe({ + type="longtext", + name="filecontent", + label="File content", + value=fs.read_file(path), + }) + + return file +end + + +-- IMPORTANT! This function is a exception! It's not fed with CFE's +-- Parameter should be one of the ones defined in the variable 'variabletranslator'. +-- value should be whatever the new value should be. +function setconfigs(self,parameter,value) + -- Set variables + local variable = "SYSLOGD_OPTS" + local variabletranslator = ({ + logfile = "-O", + loglevel = "-l", + smallerlogs = "-S", + maxsize = "-s", + numrotate = "-b", + localandnetworklog = "-L", + remotelogging = "-R", + }) + cmdparameter = variabletranslator[parameter] + + -- Report a error if someone tryes to use a invalid parameter + if not (cmdparameter) then + local availablevariables = "" + for k,v in pairs(variabletranslator) do + availablevariables = k .. ", " .. availablevariables + end + parameter = parameter or "" + return false, cfe({ + name="syslog.model.setconfigs()", + errtxt="'" .. parameter .. "' is not a valid parameter!\nValid options are: " .. availablevariables, + }) + end + + --TODO: Validate so that user cant add values with '-' (could cause major breakage next time you do getopts) + + -- This config-file only accepts one type of parameters (report error if someone uses wrong parameter) + if not (string.find(cmdparameter, "-%a$")) then + return false, cfe({ + name="syslog.model.setconfigs()", + errtxt="Parameter must be formated '-a' (where a is one upper/lowercase letter [a-z])", + }) + end + + -- Validate userinput (if valid path/filename) + if (value) and (cmdparameter == "-O") then + local cmdresult, cmdmessage = validator.is_valid_filename(value, "/var/log" ) + if not (cmdresult) then + return false, cfe({ + name="syslog.model.setconfigs()", + errtxt=cmdmessage, + }) + end + end + + -- Validate userinput (Has the user entered a valid hostname and/or port) + if (value) and (cmdparameter == "-R") then + local hostport = format.string_to_table(value, ":") + local host = hostport[1] + local port = hostport[2] + if (port) and not (validator.is_port(port)) then + return false, cfe({ + name="syslog.model.setconfigs.getopts.setoptsinfile()", + errtxt="You entered '" .. tostring(port) .. "' as port - This is not valid!", + }) + end + end + + -- Set/Unset checkbox variables + if (value) and ((cmdparameter == "-S") or (cmdparameter == "-L")) then value = "" end + + local cmdresult, cmdmessage, cmderror = getopts.setoptsinfile(configfile,variable,cmdparameter,value) + if (cmderror) then + return false, cfe({ + name="syslog.model.setconfigs.getopts.setoptsinfile()", + errtxt=cmderror, + }) + end + return true, cfe({ + name="syslog.model.setconfigs()", + value=cmdmessage, + }) +end + +-- modifications should be a CFE +function updatefilecontent (self, filetochange) + local path = nil + --Validate filename + local available_files = getfilelist() + for k,v in pairs(available_files) do + if ( tostring(available_files[k]["value"]) == tostring(filetochange.name) ) then + path = tostring(filetochange.name) + end + end + if not (path) then + filetochange.errtxt = "Invalid path!" + return filetochange + end + + local file_result,err = fs.write_file(path, format.dostounix(filetochange.value)) + return file_result, err +end + + + + + +--[===[ + -- shorewall model methods module (..., package.seeall) require("format") @@ -13,15 +280,6 @@ function startstop_service ( self, state ) return daemoncontrol.daemoncontrol("shorewall", state) end -function check_config () - check = nil - check = {} - local f,err = io.popen("/bin/echo -n '>> Check starts at: ';/bin/date; /bin/echo; /etc/init.d/shorewall check; /bin/echo; /bin/echo -n '>> Check stops at: '; /bin/date;") - check.result = f:read("*a") - f:close() - check["error"]=err - return check -end function getstatus () local f,error = io.popen("/sbin/shorewall status") @@ -91,4 +349,4 @@ function update_filecontent (self, name, modifications) end return name, file_content end - +--]===] diff --git a/shorewall-status-html.lsp b/shorewall-status-html.lsp index 12b2a98..2dc6a2c 100644 --- a/shorewall-status-html.lsp +++ b/shorewall-status-html.lsp @@ -1,26 +1,45 @@ -<? local view = ... ?> +<? local form = ... ?> -<h1>SYSTEM INFO</h1> +<? +function informationform(myform,tags) + io.write("<DL>") + for k,v in pairs(tags) do + if (myform[v]) then + local val = myform[v] + io.write("\t<DT") + if (#val.errtxt > 0) then io.write(" class='error'") end + io.write(">" .. val.label .. "</DT>\n") -<DL> -<dt>Program status</dt> -<DD><?= view.status.status ?></DD> -</DL> + io.write("\t\t<DD>" .. val.value .. "\n") + if (val.descr) and (#val.descr > 0) then io.write("\t\t<P CLASS='descr'>" .. string.gsub(val.descr, "\n", "<BR>") .. "</P>\n") end + if (#val.errtxt > 0) then io.write("\t\t<P CLASS='error'>" .. string.gsub(val.errtxt, "\n", "<BR>") .. "</P>\n") end + io.write("\t\t</DD>\n") + end + end + io.write("</DL>") +end +?> -<DL> -<dt>Program version</dt> -<dd><?= view.status.version ?></dd> -</DL> +<H1>SYSTEM INFO</H1> +<? +local myform = form.status +local tags = { "status", "version", } +informationform(myform,tags) +?> <H2>PROGRAM SPECIFIC OPTIONS/INFORMATION</H2> -<DL> -<dt>Program reports</dt> -<dd><?= view.status.state ?></dd> -</DL> +<? +local myform = form.status +local tags = { "state", } +informationform(myform,tags) +?> + <? --[[ DEBUG INFORMATION -require("debugs") -io.write(debugs.variables(view)) +io.write("<H1>DEBUGGING</H1><span style='color:red'><H2>DEBUG INFO: CFE</H2>") +io.write(html.cfe_unpack(form)) +io.write("</span>") --]] ?> + |