diff options
Diffstat (limited to 'cron-model.lua')
-rw-r--r-- | cron-model.lua | 141 |
1 files changed, 119 insertions, 22 deletions
diff --git a/cron-model.lua b/cron-model.lua index 1f39296..65d4393 100644 --- a/cron-model.lua +++ b/cron-model.lua @@ -1,29 +1,126 @@ module (..., package.seeall) -require "format" -require "fs" - -get = function (self) - f = io.open("/etc/crontabs/root") - crontab = f:read("*a") - - f:close() - return (cfe{value=crontab, name="crontab",type="longtext"}) -end - -set = function(self, cron) - checksum1 = fs.md5sum_file("/etc/crontabs/root") - newcron = format.dostounix(cron) - file.write_file("/etc/crontabs/root", newcron) - checksum2 = fs.md5sum_file("/etc/crontabs/root") - if checksum1 == checksum2 then - status = "Crontab file unchanged." - else - status = "Crontab file changed successfully" + +require("modelfunctions") +require("format") +require("fs") +require("validator") + +local configfile = "/etc/crontabs/root" +local processname = "crond" +local packagename = "busybox" +local servicename = "cron" +local baseurl = "/etc/periodic/" + +local periods +-- ################################################################################ +-- LOCAL FUNCTIONS + +local function list_periods() + if not periods then + periods = {} + local file = fs.read_file(configfile) or "" + for dir in string.gmatch(file, "/etc/periodic/(%S+)") do + periods[#periods+1] = dir + end +--[[ local reverseperiods = {} + for i,per in ipairs(periods) do reverseperiods[per] = i end + for dir in posix.files(baseurl) do + if fs.is_dir(baseurl .. dir) and (dir ~= ".") and (dir ~= "..") and not reverseperiods[dir] then + periods[#periods+1] = dir + end + end--]] end - - return(cfe{value=status, name="status"}) + return periods end +local function validate_filename(name) + local success = false + for i,per in ipairs(list_periods()) do + if validator.is_valid_filename(name, baseurl..per) then + success = true + break + end + end + return success +end +-- ################################################################################ +-- PUBLIC FUNCTIONS + +function startstop_service(action) + return modelfunctions.startstop_service(servicename, action) +end +function getstatus() + return modelfunctions.getstatus(processname, packagename, "Cron Status", servicename) +end + +function listjobs() + local jobs = {} + for i,period in ipairs(list_periods()) do + local temp = {period=period, jobs={}} + for file in fs.find("[^.]+", baseurl..period) do + table.insert(temp.jobs, file) + end + jobs[#jobs+1] = temp + end + return cfe({ type="structure", value=jobs, label="Cron Jobs" }) +end + +function read_job(filename) + return modelfunctions.getfiledetails(filename, validate_filename) +end + +function update_job(filedetails) + return modelfunctions.setfiledetails(filedetails, validate_filename) +end +function delete_job(filename) + local retval = cfe({ label="Delete Job Result", errtxt="Invalid file" }) + if validate_filename(filename) then + os.remove(filename) + retval.value = "Job File Deleted" + retval.errtxt = nil + end + return retval +end + +function create_new_job() + local newjob = {} + newjob.name = cfe({ label="Name" }) + newjob.period = cfe({ type="select", label="Period", option=list_periods() }) + return cfe({ type="group", value=newjob, label="Create New Job" }) +end + +function create_job(newjob) + local success = modelfunctions.validateselect(newjob.value.period) + + if newjob.value.name.value == "" then + newjob.value.name.errtxt = "Missing File Name" + success = false + elseif string.find(newjob.value.name.value, "[^%w_-]") then + newjob.value.name.errtxt = "Invalid File Name" + success = false + elseif posix.stat(baseurl..newjob.value.period.value.."/"..newjob.value.name.value) then + newjob.value.name.errtxt = "File already exists" + success = false + end + + if success then + fs.create_file(baseurl..newjob.value.period.value.."/"..newjob.value.name.value) + else + newjob.errtxt = "Failed to create new job" + end + + return newjob +end + +function read_configfile() + -- FIXME validate + return modelfunctions.getfiledetails(configfile) +end + +function update_configfile(filedetails) + -- FIXME validate + return modelfunctions.setfiledetails(filedetails, {configfile}) +end |