module(..., package.seeall) -- Load libraries require("modelfunctions") require("fs") require("format") -- Set variables local configfile = "/etc/shorewall/shorewall.conf" local processname = "shorewall" local packagename = "shorewall" local baseurl = "/etc/shorewall/" --[[ local config = {} -- ################################################################################ -- LOCAL FUNCTIONS local function read_config(file) local path = baseurl .. file if not (fs.is_file(path)) then return {} end local filecontent = fs.read_file_as_array(path) local output = {} for k,v in pairs(filecontent) do if not string.find ( v, "^[;#].*" ) and not (string.find (v, "^%s*$")) then local details = {} for v in string.gmatch(v, "%S+") do table.insert(details, v) end table.insert(output, details) end end return output end local function addremove_config( addremove, file, value, orgvalue ) filepath = baseurl .. file local cmdoutput -- Check if we are about to change a valid filename local isvalidfile for k,v in pairs(getfilelist()) do isvalidfile = true if (v.value == filepath) then break end isvalidfile = false end if not (fs.is_file(filepath)) or not (isvalidfile) then return false, cfe({ name="model:addremove_config()", errtxt="'" .. filepath .. "' is not a valid file!", }) end if not (type(value) == "table") then return false, cfe({ name="model:addremove_config()", errtxt="Value should come as an array!", }) end local filecontentarray = fs.read_file_as_array(filepath) if (addremove == "delete" ) then local modifyrow local orgrecordtable = {} for word in string.gmatch(orgvalue, "%S+") do table.insert(orgrecordtable, word) end for i=1, #filecontentarray do local recordtable = {} for word in string.gmatch(filecontentarray[i], "%S+") do table.insert(recordtable, word) end if (table.concat(recordtable) == table.concat(orgrecordtable)) then modifyrow = i end end if (tonumber(modifyrow)) then table.remove(filecontentarray, modifyrow) fs.write_file(filepath, table.concat(filecontentarray, "\n")) return true, cfe({ name="model:addremove_config()", descr="* Record was successfully deleted!", }) else return false, cfe({ name="model:addremove_config()", errtxt="Record was not deleted!", }) end elseif (addremove == "add" ) then --Check if such record already exists for k,v in pairs(filecontentarray) do if not string.find ( v, "^[;#].*" ) then local recordtable = {} for word in string.gmatch(v, "%S+") do table.insert(recordtable, word) end if (table.concat(recordtable) == table.concat(value)) then return false, cfe({ name="model:addremove_config()", errtxt="The config already holds this kind of config!", }) end end end table.insert(filecontentarray, (#filecontentarray), table.concat(value, "\t")) fs.write_file(filepath, table.concat(filecontentarray, "\n")) return true, cfe({ name="model:addremove_config()", descr="* Record was successfully added!", }) elseif (addremove == "modify" ) then local modifyrow local orgrecordtable = {} for word in string.gmatch(orgvalue, "%S+") do table.insert(orgrecordtable, word) end for i=1, #filecontentarray do local recordtable = {} for word in string.gmatch(filecontentarray[i], "%S+") do table.insert(recordtable, word) end if (table.concat(recordtable) == table.concat(orgrecordtable)) then modifyrow = i end end if (tonumber(modifyrow)) then table.remove(filecontentarray, modifyrow) table.insert(filecontentarray, modifyrow, table.concat(value, "\t")) fs.write_file(filepath, table.concat(filecontentarray, "\n")) return true, cfe({ name="model:addremove_config()", descr="* Record was successfully modified!", }) else return false, cfe({ name="model:addremove_config()", errtxt="Record was not modified!", }) end else return false, cfe({ name="model:addremove_config()", errtxt="Wrong usage of this function! Available options are [add|delete|modify]. You chose '" .. addremove .. "'", }) end return false, cfe({ name="model:addremove_config()", errtxt="Something went wrong!", debug=value, }) end --]] -- ################################################################################ -- PUBLIC FUNCTIONS function getstatus() local status = modelfunctions.getstatus(processname, packagename, "Shorewall Status") local details = getstatusdetails() if string.match(details.value, "Shorewall is running") then status.value.status.value = "Enabled" end return status end function getstatusdetails() local f = io.popen("/sbin/shorewall status") local programstate = f:read("*a") or "" f:close() return cfe({ value=programstate, label="Shorewall status report" }) end function startstop_service(action) return modelfunctions.startstop_service(processname, action) end function configcheck () local f = 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() return cfe({ type="longtext", value=checkresult, label="Result of checking config" }) end function getlogfile () local logfilepath = format.parse_configfile2(fs.read_file(configfile),"","LOGFILE") or "" return cfe({ value=logfilepath, label="Shorewall logfile" }) end function getfilelist () local listed_files = {} for name in posix.files(baseurl) do if not string.match(name, "^%.") and not string.match(name, "^Makefile") then local filedetails = fs.stat(baseurl .. name) table.insert ( listed_files , {filename=baseurl..name, mtime=filedetails.mtime, filesize=filedetails.size} ) end end table.sort(listed_files, function (a,b) return (a.filename < b.filename) end ) return cfe({ type="list", value=listed_files, label="Shorewall File List" }) end function getfiledetails(filename) --Validate filename local available_files = getfilelist() for i,file in ipairs(available_files.value) do if file.filename == filename then return modelfunctions.getfiledetails(filename) end end local retval = modelfunctions.getfiledetails("") retval.value.filename.value = filename return retval end function updatefiledetails (filedetails) local available_files = getfilelist() for i,file in ipairs(available_files.value) do if file.filename == filedetails.value.filename.value then return modelfunctions.setfiledetails(filedetails) end end filedetails.value.filename.errtxt = "Invalid Filename" filedetails.errtxt = "Failed to save file" return filedetails end --[[ function modify_config(self, addremove, file, value, orgvalue ) return addremove_config(addremove, file, value, orgvalue ) end function getconfig() local config = {} config.params = cfe({ name = "params", label="List of parameters", type="select", option={}, }) for k,v in pairs(read_config("params")) do table.insert(config.params.option, v[1]) end config.params.size=#config.params.option + 1 config.interfaces = cfe({ name = "interfaces", label="List of interfaces", type="select", option=read_config("interfaces"), }) config.zones = cfe({ name = "zones", label="List of zones", type="select", option=read_config("zones"), }) config.policy = cfe({ name = "policy", label="List of policy", type="select", option=read_config("policy"), }) config.rules = cfe({ name = "rules", label="List of rules", type="select", option=read_config("rules"), }) config.masq = cfe({ name = "masq", label="List of rules", type="select", option=read_config("masq"), }) return config end function get_defined_zones () local output = {} for k,v in pairs(read_config("zones")) do table.insert(output, string.match(v, "^%s*(%S*)")) end return output end --]]