diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/bin/rc.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/rc.lua index 1d138cb63..c5a5422e7 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenOS/bin/rc.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/bin/rc.lua @@ -1,8 +1,8 @@ local rc = require('rc') local args = table.pack(...) -if args.n < 2 then - io.write("Usage: rc [args...]") +if args.n < 1 then + io.write("Usage: rc [command] [args...]") return end @@ -11,3 +11,4 @@ local result, reason = rc.runCommand(table.unpack(args)) if not result then io.stderr:write(reason .. "\n") end + diff --git a/src/main/resources/assets/opencomputers/loot/OpenOS/lib/rc.lua b/src/main/resources/assets/opencomputers/loot/OpenOS/lib/rc.lua index c674ec819..e03a0ab8c 100644 --- a/src/main/resources/assets/opencomputers/loot/OpenOS/lib/rc.lua +++ b/src/main/resources/assets/opencomputers/loot/OpenOS/lib/rc.lua @@ -1,4 +1,5 @@ local fs = require('filesystem') +local serialization = require('serialization') -- Keeps track of loaded scripts to retain local values between invocation -- of their command callbacks. @@ -18,6 +19,19 @@ local function loadConfig() return nil, reason end +local function saveConfig(conf) + local file, reason = io.open('/etc/rc.cfg', 'w') + if not file then + return nil, reason + end + for key, value in pairs(conf) do + file:write(tostring(key) .. " = " .. serialization.serialize(value) .. "\n") + end + + file:close() + return true +end + function rc.load(name, args) if loaded[name] then return loaded[name] @@ -39,14 +53,47 @@ function rc.unload(name) loaded[name] = nil end -local function rawRunCommand(name, cmd, args, ...) +local function rawRunCommand(conf, name, cmd, args, ...) local result, what = rc.load(name, args) if result then - if type(result[cmd]) == "function" then - result, what = xpcall(result[cmd], debug.traceback, ...) - if result then + if not cmd then + io.output():write("Commands for service " .. name .. "\n") + for command, val in pairs(result) do + if type(val) == "function" then + io.output():write(tostring(command) .. " ") + end + end + return true + elseif type(result[cmd]) == "function" then + res, what = xpcall(result[cmd], debug.traceback, ...) + if res then return true end + elseif cmd == "restart" and type(result["stop"]) == "function" and type(result["start"]) == "function" then + res, what = xpcall(result["stop"], debug.traceback, ...) + if res then + res, what = xpcall(result["start"], debug.traceback, ...) + if res then + return true + end + end + elseif cmd == "enable" then + conf.enabled = conf.enabled or {} + for _, _name in ipairs(conf.enabled) do + if name == _name then + return nil, "Service already enabled" + end + end + conf.enabled[#conf.enabled + 1] = name + return saveConfig(conf) + elseif cmd == "disable" then + conf.enabled = conf.enabled or {} + for n, _name in ipairs(conf.enabled) do + if name == _name then + table.remove(conf.enabled, n) + end + end + return saveConfig(conf) else what = "Command '" .. cmd .. "' not found in daemon '" .. name .. "'" end @@ -59,7 +106,7 @@ function rc.runCommand(name, cmd, ...) if not conf then return nil, reason end - return rawRunCommand(name, cmd, conf[name], ...) + return rawRunCommand(conf, name, cmd, conf[name], ...) end function rc.allRunCommand(cmd, ...) @@ -69,9 +116,10 @@ function rc.allRunCommand(cmd, ...) end local results = {} for _, name in ipairs(conf.enabled or {}) do - results[name] = table.pack(rawRunCommand(name, cmd, conf[name], ...)) + results[name] = table.pack(rawRunCommand(conf, name, cmd, conf[name], ...)) end return results end return rc +