summaryrefslogtreecommitdiffstats
path: root/lib/processinfo.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lib/processinfo.lua')
-rw-r--r--lib/processinfo.lua88
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
+