util.startup: Add startup step for parsing command-line options 0.11
authorMatthew Wild <mwild1@gmail.com>
Sun, 19 Jan 2020 15:26:22 +0000
branch0.11
changeset 10600 cb107ea49b35
parent 10585 10d6d0d91f4e
child 10601 25a3c8134b0a
util.startup: Add startup step for parsing command-line options
util/startup.lua
--- a/util/startup.lua	Thu Jan 02 10:49:37 2020 +0100
+++ b/util/startup.lua	Sun Jan 19 15:26:22 2020 +0000
@@ -12,6 +12,60 @@
 
 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 = {};