module(..., package.seeall) require("fs") require("posix") require("procps") local function get_version() local cmd = "/sbin/apk_version -v -s busybox | cut -d ' ' -f 1" local cmd_output = io.popen( cmd ) local cmd_output_result = cmd_output:read("*a") or "" cmd_output:close() return cmd_output_result end local is_running = function( process ) local statusreport = nil if procps.pidof(process) then statusreport = "Yes" end return statusreport end local function readopts(optname) local opts = {} local line local f = io.open("/etc/conf.d/syslog", "r") if (f == nil) then return nil end for line in f:lines() do local optstr = string.match(line, "^" .. optname .. "=\"?(.*)%\"+") if optstr then local option = "" local optvalue = "" opts["org"]=optstr for j = 1, string.len(optstr) do if (string.sub(optstr, j, j) == "-") then option=string.sub(optstr, j, j+1) for k = j+1, string.len(optstr) do if (string.sub(optstr, k, k) == "-") then opts[option] = string.match(string.sub(optstr, j+2, k-1),"^%s*(.*)%s?") break end if (k == string.len(optstr)) then opts[option] = string.match(string.sub(optstr, j+2, k),"^%s*(.*)%s?") break end end end end end end return opts end local function file_info ( path ) local filedetails = posix.stat(path) filedetails["owner"]=rawget((posix.getpasswd(filedetails["uid"])),"name") filedetails["group"]=rawget((posix.getgroup(filedetails["gid"])),"name") filedetails["atimelong"]=os.date("%c", filedetails["atime"]) filedetails["mtimelong"]=os.date("%c", filedetails["mtime"]) filedetails["path"]=path filedetails["name"]=basename(path) if ( filedetails["size"] > 1073741824 ) then filedetails["size"]=((filedetails["size"]/1073741824) - (filedetails["size"]/1073741824%0.1)) .. "G" elseif ( filedetails["size"] > 1048576 ) then filedetails["size"]=((filedetails["size"]/1048576) - (filedetails["size"]/1048576%0.1)) .. "M" elseif ( filedetails["size"] > 1024 ) then filedetails["size"]=((filedetails["size"]/1024) - (filedetails["size"]/1024%0.1)) .. "k" else filedetails["size"]=filedetails["size"] end return filedetails end -- ################################################################################ -- EXPERIMENTAL LOCAL FUNCTIONS -- ################################################################################ -- PUBLIC FUNCTIONS function getstatus() local opts = readopts("SYSLOGD_OPTS") local status = {} status.version = get_version() status.enabled = is_running("syslogd") status.logfile = opts["-O"] or "/var/log/messages" status.remote = opts["-R"] return status end function get_filedetails() local filedetails = {} local path = "/etc/conf.d/syslog" filedetails.details = file_info(path) filedetails.content = fs.read_file(path) return filedetails end function getconfig() local opts = readopts("SYSLOGD_OPTS") local config = {} config.debug = opts config.logfile = cfe({value=opts["-O"], type="text", option="", errtxt="" ,label="Log to given file", }) config.loglevel = cfe({value=opts["-l"], type="radio", option="", errtxt="", helptxt="(1=Quiet, 5=Noisy, Default=Not specifyed any loglevel in the config)", label="Set local log level", }) config.smallog = cfe({value=opts["-S"], type="select", option="", errtxt="", label="Smaller logging output", }) config.maxsize = cfe({value=opts["-s"], type="text", option="", errtxt="", label="Max size (KB) before rotate", }) config.logrotate = cfe({value=opts["-b"], type="text", option="", errtxt="", label="Number of rotated logs to keep", }) config.remote = cfe({value=opts["-R"], type="text", option="", errtxt="", label="Log to IP or hostname on PORT", }) return config end service_control = function ( self, srvcmd ) local srvcmd = string.lower(srvcmd) local retval = "" local line = "" if (srvcmd == "start") or (srvcmd == "stop") or (srvcmd == "restart") then local file = io.popen( "PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin /etc/init.d/syslog " .. srvcmd .. " 2>&1" ) if file ~= nil then line = file:read( "*l" ) while line ~= nil do retval = retval .. "\n" .. line line = file:read( "*l" ) end file:close() end else retval = "Unknown command!" end return retval end -- ################################################################################ -- OTHER FUNCTIONS -- we actually need root permissions to get the process list --[[ priv = {} function priv.is_enabled() return (pidof.pidof("syslogd")) end function priv.enable(opts) if opts and opts.remote then local f = io.open("/etc/conf.d/syslog", "w") if f == nil then return nil end f:write("# this file was written by and will be overwritten by acf\n") f:write("SYSLOGD_OPTS=\"-R "..opts.remote.."\"") f:close() end os.system("/etc/init.d/syslogd restart; rc_add -k -s 20 syslog") end --]] --[[ -- this func does not need privileges local function readopts() local opts = {} local line local f = io.open("/etc/conf.d/syslog", "r") if f == nil then return nil end for line in f:lines() do local optstr = string.match(line, "^SYSLOGD_OPTS=\"?(.*)\"?") if optstr then opts.remote = string.match(optstr, "-R%s*(.*)%s*.*$") opts.optstr = optstr end end return opts end --]]