From 17358273f2d7ad5624459ecc3d0c01b8bb48a1f2 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Sun, 19 Jan 2020 15:26:22 +0000 Subject: [PATCH 1/3] util.startup: Add startup step for parsing command-line options --- util/startup.lua | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/util/startup.lua b/util/startup.lua index e88ed7093..fb8989701 100644 --- a/util/startup.lua +++ b/util/startup.lua @@ -12,6 +12,60 @@ 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 = {}; + + if #arg > 0 and arg[1] ~= "--config" then + 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 + prosody.opts = parsed_opts; +end + function startup.read_config() local filenames = {}; From f24308103fa0d4057a36069dffff7514760274e5 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Sun, 19 Jan 2020 15:27:16 +0000 Subject: [PATCH 2/3] prosody/util.startup: Switch to parse_args() for --root and --config --- prosody | 6 +----- util/startup.lua | 12 ++++++------ 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/prosody b/prosody index 204fb36d3..3659ca555 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 fb8989701..93f40c8f0 100644 --- a/util/startup.lua +++ b/util/startup.lua @@ -70,12 +70,11 @@ 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 @@ -459,8 +458,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"; @@ -569,6 +567,7 @@ end -- prosodyctl only function startup.prosodyctl() + startup.parse_args(); startup.init_global_state(); startup.read_config(); startup.force_console_logging(); @@ -589,6 +588,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(); From 37ba5f795f519c55a28ae6b2a7a8cb239d097545 Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Sun, 19 Jan 2020 15:28:09 +0000 Subject: [PATCH 3/3] mod_posix: Support for command-line flags to override 'daemonize' config option -D / --daemonize -F / --no-daemonize --- plugins/mod_posix.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/mod_posix.lua b/plugins/mod_posix.lua index 23df4d23a..fe826c223 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";