Merge branch 'master-MC1.7.10' of github.com:MightyPirates/OpenComputers into master-MC1.8

This commit is contained in:
Florian Nücke 2015-02-25 12:58:54 +01:00
commit c544e3d3d8
3 changed files with 93 additions and 8 deletions

View File

@ -1,8 +1,8 @@
local rc = require('rc')
local args = table.pack(...)
if args.n < 2 then
io.write("Usage: rc <service> <command> [args...]")
if args.n < 1 then
io.write("Usage: rc <service> [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

View File

@ -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

View File

@ -0,0 +1,36 @@
NAME
rc - Manage services
SYNOPSIS
rc SERVICE COMMAND [ARGS...]
DESCRIPTION
Controls services in /etc/rc.d/
Common commands are start/stop/restart, there are also special commands enable/disable. A command is global function in executable file that is stored in /etc/rc.d/ directory. Service cen define own commands.
COMMANDS
start
This command starts specified service, executed automatically for all enbled services when system boots.
stop
This command stops specified service.
restart
This command restarts specified service. This command doesn't have to be implemented by services when start and stop commands are present.
enable
This command enables specified service. Executing this command won't start the service. It's implemented by the rc library, but can be overridden by service.
disable
This command disables specified service. Executing this command won't stop the service. It's implemented by the rc library, but can be overridden by service.
EXAMPLES
rc example
Lists commands of example service.
rc example start
Starts example setvice.
rc example enable
Makes example start on system boot.