Diff

util/startup.lua @ 10599:4f655918fef1

Merge 0.11->trunk
author Matthew Wild <mwild1@gmail.com>
date Sun, 19 Jan 2020 15:34:28 +0000
parent 10532:19ec384eb782
parent 10597:25a3c8134b0a
child 10601:d8b51833926b
line wrap: on
line diff
--- a/util/startup.lua	Thu Jan 16 16:30:26 2020 +0100
+++ b/util/startup.lua	Sun Jan 19 15:34:28 2020 +0000
@@ -13,16 +13,69 @@
 
 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 = {};
 
 	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
@@ -426,8 +479,7 @@
 			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";
@@ -536,6 +588,7 @@
 
 -- prosodyctl only
 function startup.prosodyctl()
+	startup.parse_args();
 	startup.init_global_state();
 	startup.read_config();
 	startup.force_console_logging();
@@ -557,6 +610,7 @@
 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();