diff options
Diffstat (limited to 'lib/processinfo.lua')
-rw-r--r-- | lib/processinfo.lua | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/lib/processinfo.lua b/lib/processinfo.lua index 2637b8c..dd15fa8 100644 --- a/lib/processinfo.lua +++ b/lib/processinfo.lua @@ -29,3 +29,91 @@ function process_botsequence(processname) return cmdresult,cmderrors end +function daemoncontrol (process, action) + local cmdmessage = "" + if (string.lower(action) == "start") or (string.lower(action) == "stop") or (string.lower(action) == "restart") then + local file = io.popen( "PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin /etc/init.d/" .. + process .. " " .. string.lower(action) .. " 2>&1" ) + if file ~= nil then + cmdmessage = file:read( "*a" ) + file:close() + end + else + return false,nil,"Unknown command!",action + end + posix.sleep(2) -- Wait for the process to start|stop + return true,cmdmessage,nil,action +end + +-- the following methods are available: +-- /proc/<pid>/stat the comm field (2nd) field contains name but only up +-- to 15 chars. does not resolve links +-- +-- /proc/<pid>/cmdline argv[0] contains the command. However if it is a script +-- then will the interpreter show up +-- +-- /proc/<pid>/exe link to exe file. this will resolv links +-- +-- returns list of all pids for given exe name + +--[[ +-- gives lots of false positives for busybox +local function is_exe(path, name) + local f = posix.readlink(path.."/exe") + if f and (f == name or posix.basename(f) == name) then + return true + else + return false + end +end +]]-- + + +local function is_stat(path, name) + local f = io.open(path.."/stat") + if (f) then + local line = f:read() + local p = string.gsub(line, ".*%(", "") + p = string.gsub(p, "%).*", "") + f:close() + end + if p ~= nil then + if string.len(name) <= 15 and p == name then + return true + end + end + return false +end + +local function is_cmdline(path, name) + local f = io.open(path.."/cmdline") + if f == nil then + return false + end + local line = f:read() + f:close() + if line == nil then + return false + end + local arg0 = string.gsub(line, string.char(0)..".*", "") + if posix.basename(arg0) == name then + return true + end +end + +function pidof(name) + local pids = {} + local i, j + + for i,j in pairs(posix.glob("/proc/[0-9]*")) do + local pid = tonumber(posix.basename(j)) + if is_stat(j, name) or is_cmdline(j, name) then + table.insert(pids, pid) + end + end + if #pids == 0 then + pids = nil + end + return pids +end + |