local serial = require "serialization" local rc = {} local service = {} local cfg = {} cfg.enabled = {} 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 service[name].stop(...) end function rc.start(name,...) rc.load(name) if not service[name] then return false, "service not found" end return service[name].start(...) 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 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() for k,v in pairs(cfg.enabled) do rc.start(v) end _G.service = service return rc