From 2eb595dbab74f76c42f44193945eba48144873ba Mon Sep 17 00:00:00 2001 From: Mika Havela Date: Mon, 4 Feb 2008 13:57:48 +0000 Subject: Status-info: Works and shows some information (not sure enabled/disabled should be there). Config-tab: Only graphical layout is taking shape. No real data is shown. Data can't be changed. Expert-tab: Works as it should (probably all done). git-svn-id: svn://svn.alpinelinux.org/acf/fetchmail/trunk@687 ab2d0c66-481e-0410-8bed-d214d4d58bed --- fetchmail-model.lua | 353 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 353 insertions(+) create mode 100644 fetchmail-model.lua (limited to 'fetchmail-model.lua') diff --git a/fetchmail-model.lua b/fetchmail-model.lua new file mode 100644 index 0000000..2be471b --- /dev/null +++ b/fetchmail-model.lua @@ -0,0 +1,353 @@ +module(..., package.seeall) + +require("fs") +require("procps") +require("getopts") +require("format") +require("daemoncontrol") +require("validator") + +local processname = "fetchmail" +local configfile = "/root/.fetchmailrc" +local config = {} + +local function get_version() + local cmd = "/usr/bin/fetchmail --version 2>/dev/null" + local f = io.popen( cmd ) + local cmd_output_result = f:read("*l") + f:close() + return cmd_output_result +end + +local function getloglevels() + local loglevels = {} + for i=1,8 do + table.insert(loglevels,i) + end + return loglevels +end +local function getmethods() + local methods = {"pop3","imap","pop3domain", } + return methods +end + +local function getmailboxes() + local mailboxes = {} + for i=1,2 do + local objects = cfe({}) + objects.label = "Mailbox_" .. tostring(i) + objects.method = cfe({ + name="method", + label = "Method", + type = "select", + value = "", + option = getmethods(), + }) + objects.disabled = cfe({ + name="disabled", + type="checkbox", + label = "Disabled", + checked = "yes", + }) + objects.remotehost = cfe({ + name="remotehost", + label = "RemoteHost", + value = "xxx_RemoteHost", + }) + objects.remotemailbox = cfe({ + name="remotemailbox", + label = "Mailbox", + value = "xxx_RemoteMailbox", + }) + objects.remotepassword = cfe({ + name="remotepassword", + label = "Password", + type = "text", + value = "xxx_password", + }) + objects.localhost = cfe({ + name="localhost", + label = "LocalHost", + value = "xxx_LocalHost", + }) + objects.localmailbox = cfe({ + name="localmailbox", + label = "LocalMailbox", + value = "xxx_LocalMailbox", + }) + objects.localdomain = cfe({ + name="localdomain", + label = "LocalDomain", + value = "xxx_LocalDomain", + }) + table.insert(mailboxes, objects) + end + return mailboxes +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 opts = getconfig() + local status = {} + status.version = cfe({ name = "version", + label="Program version", + value=get_version(), + }) + status.status = cfe({ name="status", + label="Program status", + value=procps.pidof(processname), + }) + status.configfile = cfe({ name="configfile", + label="Config file", + value=configfile, + }) + +--[[ + if (opts["remotelogging"]) and not ((opts["remotelogging"]["value"] ~= "") and not (opts["localandnetworklog"]["value"])) then + status.logfile = cfe({ name="logfile", + label="Locally logging to", + value=opts["logfile"]["value"], + }) + end + if (opts["SYSLOGD_OPTS"]) and (opts["SYSLOGD_OPTS"]["-R"]) and (opts["SYSLOGD_OPTS"]["-R"] ~= "") then + status.remote = cfe({ name="remotelogging", + label="Remote logging to", + value=opts["SYSLOGD_OPTS"]["-R"], + }) + end +--]] + return status +end + +function get_filedetails() + local path = configfile + local file = {} + local filedetails = {} + local config = {} + local filenameerrtxt + if (fs.is_file(path)) then + configcontent = getopts.getoptsfromfile(path) or config + filedetails = fs.stat(path) + config = getconfig(path) + else + config = {} + config.filename = {} + config["filename"]["errtxt"]="Config file '".. path .. "' is missing!" + end + + file["filename"] = cfe({ + name="filename", + label="File name", + value=path, + errtxt=filenameerrtxt + }) + file["filesize"] = cfe({ + name="filesize", + label="File size", + value=filedetails.size or 0, + }) + file["mtime"] = cfe({ + name="mtime", + label="File date", + value=filedetails.mtime or "---", + }) + file["filecontent"] = cfe({ + type="longtext", + name="filecontent", + label="File content", + value=fs.read_file(path), + }) + + -- Sum all errors into one cfe + local sumerrors = "" + for k,v in pairs(config) do + if (config[k]["errtxt"] ~= "") then + sumerrors = sumerrors .. config[k]["errtxt"] .. "\n" + end + end + if (sumerrors ~= "") then + file["sumerrors"] = cfe ({ + name="sumerrors", + label = "Configuration errors", + errtxt = string.match(sumerrors, "(.-)\n$"), + }) + end + + return file +end +function getconfig() + local config = {} + if (fs.is_file(configfile)) then + configcontent = getopts.getoptsfromfile(configfile) or config + else + config["configfile"] = "Config file '".. configfile .. "' is missing!" + end + + + + -- Next section selects which configurations we should show to the user + config["freq"] = cfe({ + name="freq", + label = "Check mail once every", + type = "select", + value = "123", + option = {"15min", "hour","day",}, + }) + config["mailboxes"] = cfe({ + name="mailboxes", + label = "Mailboxes", + value = getmailboxes(), + }) + config["postmaster"] = cfe({ + name="postmaster", + label = "Postmaster", + value = "xxx@xxx.xx", + }) + config["etrnremote"] = cfe({ + name="etrnremote", + label = "Remote server", + value = "xxx", + }) + config["etrnquedomain"] = cfe({ + name="etrnquedomain", + label = "Queued domain", + value = "xxx", + }) + +--[[ + + -- Next section is to print errormessages when configs are wrong + if (configcontent["SYSLOGD_OPTS"]["-l"]) and + ((tonumber(configcontent["SYSLOGD_OPTS"]["-l"]) == nil) or (tonumber(configcontent["SYSLOGD_OPTS"]["-l"]) > 8)) then + config["loglevel"]["errtxt"] = "Log value is out of range!\nCurrent value in config is '" .. + configcontent["SYSLOGD_OPTS"]["-l"] .. + "' - This is invalid!\nPlease select one of the above and save your changes." + table.insert(config["loglevel"]["option"], tonumber(configcontent["SYSLOGD_OPTS"]["-l"])) + end + + if (configcontent["SYSLOGD_OPTS"]["-L"] ~= nil) and ((configcontent["SYSLOGD_OPTS"]["-R"] == nil) or (configcontent["SYSLOGD_OPTS"]["-R"] == "")) then + config["localandnetworklog"]["errtxt"] = "Logging to local and network (-L) is not possible unless you define a host (-R) for remote logging or remove this option." + end + + -- Sum all errors into one cfe + local sumerrors = "" + for k,v in pairs(config) do + if (config[k]["errtxt"] ~= "") then + sumerrors = sumerrors .. config[k]["errtxt"] .. "\n" + end + end + if (sumerrors ~= "") then + config["sumerrors"] = cfe ({ + name="sumerrors", + label = "Configuration errors", + errtxt = sumerrors, + }) + end + +--]] + + return config +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 update_filecontent (self, modifications) + local path = configfile + local file_result,err = fs.write_file(path, format.dostounix(modifications)) + return file_result, err +end + -- cgit v1.2.3