aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/mod_posix.lua7
-rwxr-xr-xprosody6
-rw-r--r--util/startup.lua67
3 files changed, 68 insertions, 12 deletions
diff --git a/plugins/mod_posix.lua b/plugins/mod_posix.lua
index 23df4d23..fe826c22 100644
--- a/plugins/mod_posix.lua
+++ b/plugins/mod_posix.lua
@@ -126,7 +126,12 @@ function syslog_sink_maker(config) -- luacheck: ignore 212/config
end
require "core.loggingmanager".register_sink_type("syslog", syslog_sink_maker);
-local daemonize = module:get_option("daemonize", prosody.installed);
+local daemonize = prosody.opts.daemonize;
+
+if daemonize == nil then
+ -- Fall back to config file if not specified on command-line
+ daemonize = module:get_option("daemonize", prosody.installed);
+end
local function remove_log_sinks()
local lm = require "core.loggingmanager";
diff --git a/prosody b/prosody
index 204fb36d..3659ca55 100755
--- a/prosody
+++ b/prosody
@@ -43,11 +43,7 @@ if CFG_DATADIR then
end
end
-if #arg > 0 and arg[1] ~= "--config" then
- print("Unknown command-line option: "..tostring(arg[1]));
- print("Perhaps you meant to use prosodyctl instead?");
- return 1;
-end
+
local startup = require "util.startup";
local async = require "util.async";
diff --git a/util/startup.lua b/util/startup.lua
index e88ed709..24ed6026 100644
--- a/util/startup.lua
+++ b/util/startup.lua
@@ -12,16 +12,70 @@ local dependencies = require "util.dependencies";
local original_logging_config;
+local short_params = { D = "daemonize", F = "no-daemonize" };
+local value_params = { config = true };
+
+function startup.parse_args()
+ local parsed_opts = {};
+ prosody.opts = parsed_opts;
+
+ if #arg == 0 then
+ return;
+ end
+ while true do
+ local raw_param = arg[1];
+ if not raw_param then
+ break;
+ end
+
+ local prefix = raw_param:match("^%-%-?");
+ if not prefix then
+ break;
+ elseif prefix == "--" and raw_param == "--" then
+ table.remove(arg, 1);
+ break;
+ end
+ local param = table.remove(arg, 1):sub(#prefix+1);
+ if #param == 1 then
+ param = short_params[param];
+ end
+
+ if not param then
+ print("Unknown command-line option: "..tostring(param));
+ print("Perhaps you meant to use prosodyctl instead?");
+ os.exit(1);
+ end
+
+ local param_k, param_v;
+ if value_params[param] then
+ param_k, param_v = param, table.remove(arg, 1);
+ if not param_v then
+ print("Expected a value to follow command-line option: "..raw_param);
+ os.exit(1);
+ end
+ else
+ param_k, param_v = param:match("^([^=]+)=(.+)$");
+ if not param_k then
+ if param:match("^no%-") then
+ param_k, param_v = param:sub(4), false;
+ else
+ param_k, param_v = param, true;
+ end
+ end
+ end
+ parsed_opts[param_k] = param_v;
+ end
+end
+
function startup.read_config()
local filenames = {};
local filename;
- if arg[1] == "--config" and arg[2] then
- table.insert(filenames, arg[2]);
+ if prosody.opts.config then
+ table.insert(filenames, prosody.opts.config);
if CFG_CONFIGDIR then
- table.insert(filenames, CFG_CONFIGDIR.."/"..arg[2]);
+ table.insert(filenames, CFG_CONFIGDIR.."/"..prosody.opts.config);
end
- table.remove(arg, 1); table.remove(arg, 1);
elseif os.getenv("PROSODY_CONFIG") then -- Passed by prosodyctl
table.insert(filenames, os.getenv("PROSODY_CONFIG"));
else
@@ -405,8 +459,7 @@ function startup.switch_user()
os.exit(1);
end
prosody.current_uid = pposix.getuid();
- local arg_root = arg[1] == "--root";
- if arg_root then table.remove(arg, 1); end
+ local arg_root = prosody.opts.root;
if prosody.current_uid == 0 and config.get("*", "run_as_root") ~= true and not arg_root then
-- We haz root!
local desired_user = config.get("*", "prosody_user") or "prosody";
@@ -515,6 +568,7 @@ end
-- prosodyctl only
function startup.prosodyctl()
+ startup.parse_args();
startup.init_global_state();
startup.read_config();
startup.force_console_logging();
@@ -535,6 +589,7 @@ end
function startup.prosody()
-- These actions are in a strict order, as many depend on
-- previous steps to have already been performed
+ startup.parse_args();
startup.init_global_state();
startup.read_config();
startup.init_logging();