diff options
| author | Mika Havela <mika.havela@gmail.com> | 2008-02-04 13:57:48 +0000 | 
|---|---|---|
| committer | Mika Havela <mika.havela@gmail.com> | 2008-02-04 13:57:48 +0000 | 
| commit | 2eb595dbab74f76c42f44193945eba48144873ba (patch) | |
| tree | 0e0ff913b22a2c5548f41cf16bb8bb373b7d4e80 /fetchmail-model.lua | |
| parent | 1b6596778e5fd901eab6f7f9650610a24add2176 (diff) | |
| download | acf-fetchmail-2eb595dbab74f76c42f44193945eba48144873ba.tar.bz2 acf-fetchmail-2eb595dbab74f76c42f44193945eba48144873ba.tar.xz | |
Status-info: Works and shows some information (not sure enabled/disabled should be there).v0.1
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
Diffstat (limited to 'fetchmail-model.lua')
| -rw-r--r-- | fetchmail-model.lua | 353 | 
1 files changed, 353 insertions, 0 deletions
| 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 + | 
