2020-03-20 13:15:02 +11:00
|
|
|
local serial = require "serialization"
|
|
|
|
|
|
|
|
local rc = {}
|
2020-03-24 16:27:51 +11:00
|
|
|
rc.pids = {}
|
2020-03-20 13:15:02 +11:00
|
|
|
local service = {}
|
|
|
|
local cfg = {}
|
2020-03-26 17:32:54 +11:00
|
|
|
cfg.enabled = {"getty","minitel"}
|
2020-03-20 13:15:02 +11:00
|
|
|
|
|
|
|
local function loadConfig()
|
|
|
|
local f = io.open("/boot/cfg/rc.cfg","rb")
|
|
|
|
if not f then return false end
|
|
|
|
cfg = serial.unserialize(f:read("*a")) or {}
|
|
|
|
f:close()
|
|
|
|
cfg.enabled = cfg.enabled or {}
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
local function saveConfig()
|
|
|
|
local f = io.open("/boot/cfg/rc.cfg","wb")
|
|
|
|
if not f then return false end
|
|
|
|
f:write(serial.serialize(cfg))
|
|
|
|
f:close()
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
|
|
|
|
function rc.load(name,force)
|
|
|
|
if force then
|
|
|
|
rc.stop(name)
|
|
|
|
service[name] = nil
|
|
|
|
end
|
|
|
|
if service[name] then return true end
|
|
|
|
service[name] = setmetatable({},{__index=_G})
|
|
|
|
local f = io.open("/boot/service/"..name..".lua","rb")
|
|
|
|
local res = load(f:read("*a"),name,"t",service[name])()
|
|
|
|
f:close()
|
|
|
|
return res
|
|
|
|
end
|
|
|
|
|
|
|
|
function rc.stop(name,...)
|
|
|
|
if not service[name] then return false, "service not found" end
|
2020-03-26 17:32:54 +11:00
|
|
|
if service[name].stop then
|
|
|
|
service[name].stop(...)
|
|
|
|
coroutine.yield()
|
|
|
|
end
|
2020-03-24 16:27:51 +11:00
|
|
|
if rc.pids[name] then
|
|
|
|
os.kill(rc.pids[name])
|
|
|
|
end
|
|
|
|
rc.pids[name] = nil
|
2020-03-20 13:15:02 +11:00
|
|
|
end
|
|
|
|
|
|
|
|
function rc.start(name,...)
|
|
|
|
rc.load(name)
|
|
|
|
if not service[name] then return false, "service not found" end
|
2020-03-24 16:27:51 +11:00
|
|
|
local rv = {service[name].start(...)}
|
|
|
|
if type(rv[1]) == "number" then
|
|
|
|
rc.pids[name] = rv[1]
|
|
|
|
end
|
2020-03-20 13:15:02 +11:00
|
|
|
end
|
|
|
|
|
|
|
|
function rc.restart(name)
|
|
|
|
rc.stop(name)
|
|
|
|
rc.start(name)
|
|
|
|
end
|
|
|
|
|
|
|
|
function rc.enable(name)
|
|
|
|
for k,v in pairs(cfg.enabled) do
|
|
|
|
if v == name then return false end
|
|
|
|
end
|
2020-03-26 17:32:54 +11:00
|
|
|
cfg.enabled[#cfg.enabled+1] = name
|
2020-03-20 13:15:02 +11:00
|
|
|
saveConfig()
|
|
|
|
end
|
|
|
|
function rc.disable(name)
|
|
|
|
local disabled = false
|
|
|
|
for k,v in pairs(cfg.enabled) do
|
|
|
|
if v == name then table.remove(cfg.enabled,k) disabled = true break end
|
|
|
|
end
|
|
|
|
saveConfig()
|
|
|
|
return disabled
|
|
|
|
end
|
|
|
|
|
|
|
|
loadConfig()
|
|
|
|
|
|
|
|
_G.service = service
|
2020-03-20 13:15:54 +11:00
|
|
|
rc.cfg = cfg
|
2020-03-20 13:15:02 +11:00
|
|
|
|
|
|
|
return rc
|