summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMika Havela <mika.havela@gmail.com>2008-02-01 18:14:36 +0000
committerMika Havela <mika.havela@gmail.com>2008-02-01 18:14:36 +0000
commit37b4a15a9a0e07504188b96567d500085b035b4d (patch)
tree9986b737683c22c8f5aafb47817ec1ab9b41efce
parent33dd344b2d2074c8838834e1c77336499b8cb068 (diff)
downloadacf-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.lsp128
-rw-r--r--shorewall-controller.lua407
-rw-r--r--shorewall-edit-html.lsp159
-rw-r--r--shorewall-expert-html.lsp64
-rw-r--r--shorewall-logfile-html.lsp111
-rw-r--r--shorewall-model.lua278
-rw-r--r--shorewall-status-html.lsp51
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>")
--]]
?>
+