Codebase list lua-systemd / HEAD src / daemon.lua
HEAD

Tree @HEAD (Download .tar.gz)

daemon.lua @HEADraw · history · blame

local c = require "systemd.daemon.core"

-- Wrap notify functions with versions that take tables
-- this lets you write `notifyt { READY=1, STATE="awesome!" }`
local function pack_state(t)
	local state = { }
	for k, v in pairs(t) do
		state[#state+1] = k.."="..v
	end
	return table.concat(state, "\n")
end
function c.notifyt(t)
	return c.notify(false, pack_state(t))
end
function c.pid_notifyt(pid, t)
	return c.pid_notify(pid, false, pack_state(t))
end

-- Get our own pid in pure lua.
local function get_pid()
	local fd, err, n = io.open "/proc/self/stat"
	if fd == nil then return nil, err, n end
	local pid = fd:read "*n"
	fd:close()
	return pid
end

-- sd_watchdog_enabled in pure lua.
-- returns watchdog interval
function c.watchdog_enabled(unset_environment)
	if unset_environment then error("unset not supported", 2) end

	local pid = os.getenv "WATCHDOG_PID"
	if not pid then return false end
	pid = tonumber(pid)
	if pid ~= get_pid() then return false end

	local usec = os.getenv "WATCHDOG_USEC"
	usec = tonumber(usec)
	if usec == nil then return nil, "invalid interval" end
	return usec/1e6
end

function c.kick_dog()
	return c.notify(false, "WATCHDOG=1")
end

return c