replacing the init system with something more OpenOS rc inspired
This commit is contained in:
parent
66ea129b7a
commit
e20c9546ea
76
lib/rc.lua
Normal file
76
lib/rc.lua
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
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
|
@ -22,20 +22,16 @@ os.spawn(function()
|
|||||||
os.setenv("HOSTNAME",hostname)
|
os.setenv("HOSTNAME",hostname)
|
||||||
syslog(string.format("Hostname set to %s",hostname))
|
syslog(string.format("Hostname set to %s",hostname))
|
||||||
local pids = {}
|
local pids = {}
|
||||||
local function loadlist()
|
local rc = require "rc"
|
||||||
local f = io.open("/boot/cfg/init.txt","rb")
|
for k,v in pairs(rc.cfg.enabled) do
|
||||||
if not f then return false end
|
pids[v] = -1
|
||||||
for line in f:read("*a"):gmatch("[^\r\n]+") do
|
dprint(v)
|
||||||
pids[line] = -1
|
|
||||||
end
|
end
|
||||||
f:close()
|
|
||||||
end
|
|
||||||
loadlist()
|
|
||||||
while true do
|
while true do
|
||||||
for k,v in pairs(pids) do
|
for k,v in pairs(pids) do
|
||||||
if not os.taskInfo(v) then
|
if not os.taskInfo(v) then
|
||||||
syslog("Starting service "..k)
|
syslog("Starting service "..k)
|
||||||
pids[k] = os.spawnfile("/boot/service/"..k)
|
pids[k] = rc.start(k)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
coroutine.yield()
|
coroutine.yield()
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
local gpus,screens,ttyn,pids = {}, {}, 0, {}
|
local gpus,screens,ttyn,pids = {}, {}, 0, {}
|
||||||
|
local basepid = nil
|
||||||
local shell = require "shell"
|
local shell = require "shell"
|
||||||
local function scan()
|
local function scan()
|
||||||
local w,di = pcall(computer.getDeviceInfo)
|
local w,di = pcall(computer.getDeviceInfo)
|
||||||
@ -53,9 +54,11 @@ local function allocate()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function start()
|
||||||
scan()
|
scan()
|
||||||
allocate()
|
allocate()
|
||||||
dprint("screens ready")
|
dprint("screens ready")
|
||||||
|
basepid = os.spawn(function()
|
||||||
while true do
|
while true do
|
||||||
coroutine.yield()
|
coroutine.yield()
|
||||||
for k,v in pairs(pids) do
|
for k,v in pairs(pids) do
|
||||||
@ -66,3 +69,10 @@ while true do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end,"getty")
|
||||||
|
return basepid
|
||||||
|
end
|
||||||
|
function stop()
|
||||||
|
os.kill(basepid)
|
||||||
|
basepid = nil
|
||||||
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user