Blame SOURCES/002-pacemakerd-options.patch

7ac83c
From 0d40ebf10b1794ece2c5c9768ea7222d3834d3b3 Mon Sep 17 00:00:00 2001
7ac83c
From: Chris Lumens <clumens@redhat.com>
7ac83c
Date: Thu, 13 May 2021 11:42:18 -0400
7ac83c
Subject: [PATCH 1/4] Build: Use a different variable to find man page
7ac83c
 includes.
7ac83c
7ac83c
With other programs outside of the tools directory being converted to
7ac83c
use glib for command line handling, their includes are not going to be
7ac83c
in tools/.  So we need to use a different autoconf variable to find
7ac83c
them.
7ac83c
---
7ac83c
 mk/common.mk | 6 +++---
7ac83c
 1 file changed, 3 insertions(+), 3 deletions(-)
7ac83c
7ac83c
diff --git a/mk/common.mk b/mk/common.mk
7ac83c
index b247670..aa59feb 100644
7ac83c
--- a/mk/common.mk
7ac83c
+++ b/mk/common.mk
7ac83c
@@ -1,5 +1,5 @@
7ac83c
 #
7ac83c
-# Copyright 2014-2020 the Pacemaker project contributors
7ac83c
+# Copyright 2014-2021 the Pacemaker project contributors
7ac83c
 #
7ac83c
 # The version control history for this file may have further details.
7ac83c
 #
7ac83c
@@ -68,11 +68,11 @@ HELP2MAN_ARGS = -N --section 8 --name "Part of the Pacemaker cluster resource ma
7ac83c
 #       and all wrappers to C code.
7ac83c
 %.8:	% $(MAN8DEPS)
7ac83c
 	$(AM_V_at)chmod a+x $(abs_builddir)/$<
7ac83c
-	$(AM_V_MAN)if [ -f $(top_srcdir)/tools/$@.inc ]; then			\
7ac83c
+	$(AM_V_MAN)if [ -f $(abs_srcdir)/$@.inc ]; then			\
7ac83c
 		PATH=$(abs_builddir):$$PATH $(HELP2MAN) $(HELP2MAN_ARGS)	\
7ac83c
 			-h --help-all 						\
7ac83c
 			--no-discard-stderr 					\
7ac83c
-			-i $(top_srcdir)/tools/$@.inc $(abs_builddir)/$<		\
7ac83c
+			-i $(abs_srcdir)/$@.inc $(abs_builddir)/$<		\
7ac83c
 			| sed -f $(top_srcdir)/tools/fix-manpages > $@ ; \
7ac83c
 	else									\
7ac83c
 		PATH=$(abs_builddir):$$PATH $(HELP2MAN) $(HELP2MAN_ARGS)	\
7ac83c
-- 
7ac83c
1.8.3.1
7ac83c
7ac83c
7ac83c
From c7ab1d901bcbbf0137277e783e072777ca2f82d9 Mon Sep 17 00:00:00 2001
7ac83c
From: Chris Lumens <clumens@redhat.com>
7ac83c
Date: Thu, 13 May 2021 11:44:16 -0400
7ac83c
Subject: [PATCH 2/4] Refactor: daemons: Remove the pid_file variable from
7ac83c
 pacemakerd.
7ac83c
7ac83c
It's never used anywhere.
7ac83c
---
7ac83c
 daemons/pacemakerd/pacemakerd.c | 3 ---
7ac83c
 1 file changed, 3 deletions(-)
7ac83c
7ac83c
diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
7ac83c
index 8ec9708..03d688e 100644
7ac83c
--- a/daemons/pacemakerd/pacemakerd.c
7ac83c
+++ b/daemons/pacemakerd/pacemakerd.c
7ac83c
@@ -27,8 +27,7 @@
7ac83c
 
7ac83c
 static crm_trigger_t *shutdown_trigger = NULL;
7ac83c
 static crm_trigger_t *startup_trigger = NULL;
7ac83c
-static const char *pid_file = PCMK_RUN_DIR "/pacemaker.pid";
7ac83c
7ac83c
 /* state we report when asked via pacemakerd-api status-ping */
7ac83c
 static const char *pacemakerd_state = XML_PING_ATTR_PACEMAKERDSTATE_INIT;
7ac83c
 static gboolean running_with_sbd = FALSE; /* local copy */
7ac83c
@@ -224,7 +222,6 @@ main(int argc, char **argv)
7ac83c
                 /* Legacy */
7ac83c
                 break;
7ac83c
             case 'p':
7ac83c
-                pid_file = optarg;
7ac83c
                 break;
7ac83c
             case 's':
7ac83c
                 pcmk__set_env_option("node_start_state", "standby");
7ac83c
-- 
7ac83c
1.8.3.1
7ac83c
7ac83c
7ac83c
From 98990eed9f6a5dbde7c8a5aa0783e93d5479295b Mon Sep 17 00:00:00 2001
7ac83c
From: Chris Lumens <clumens@redhat.com>
7ac83c
Date: Thu, 13 May 2021 13:14:38 -0400
7ac83c
Subject: [PATCH 3/4] Refactor: daemons: Use glib for command line handling in
7ac83c
 pacemakerd.
7ac83c
7ac83c
---
7ac83c
 daemons/pacemakerd/Makefile.am      |   2 +
7ac83c
 daemons/pacemakerd/pacemakerd.8.inc |   5 +
7ac83c
 daemons/pacemakerd/pacemakerd.c     | 195 ++++++++++++++++++------------------
7ac83c
 3 files changed, 102 insertions(+), 100 deletions(-)
7ac83c
 create mode 100644 daemons/pacemakerd/pacemakerd.8.inc
7ac83c
7ac83c
diff --git a/daemons/pacemakerd/Makefile.am b/daemons/pacemakerd/Makefile.am
7ac83c
index cc657f5..84517a3 100644
7ac83c
--- a/daemons/pacemakerd/Makefile.am
7ac83c
+++ b/daemons/pacemakerd/Makefile.am
7ac83c
@@ -15,6 +15,8 @@ if BUILD_SYSTEMD
7ac83c
 systemdsystemunit_DATA	= pacemaker.service
7ac83c
 endif
7ac83c
 
7ac83c
+EXTRA_DIST 	= pacemakerd.8.inc
7ac83c
+
7ac83c
 ## SOURCES
7ac83c
 
7ac83c
 noinst_HEADERS		= pacemakerd.h
7ac83c
diff --git a/daemons/pacemakerd/pacemakerd.8.inc b/daemons/pacemakerd/pacemakerd.8.inc
7ac83c
new file mode 100644
7ac83c
index 0000000..902af4e
7ac83c
--- /dev/null
7ac83c
+++ b/daemons/pacemakerd/pacemakerd.8.inc
7ac83c
@@ -0,0 +1,5 @@
7ac83c
+[synopsis]
7ac83c
+pacemakerd [options]
7ac83c
+
7ac83c
+/subsidiary Pacemaker daemons/
7ac83c
+.SH OPTIONS
7ac83c
diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
7ac83c
index 03d688e..ce194bf 100644
7ac83c
--- a/daemons/pacemakerd/pacemakerd.c
7ac83c
+++ b/daemons/pacemakerd/pacemakerd.c
7ac83c
@@ -23,12 +23,54 @@
7ac83c
 #include <crm/msg_xml.h>
7ac83c
 #include <crm/common/ipc_internal.h>
7ac83c
 #include <crm/common/mainloop.h>
7ac83c
+#include <crm/common/cmdline_internal.h>
7ac83c
 #include <crm/cluster/internal.h>
7ac83c
 #include <crm/cluster.h>
7ac83c
 
7ac83c
 #include <dirent.h>
7ac83c
 #include <ctype.h>
7ac83c
 
7ac83c
+#define SUMMARY "pacemakerd - primary Pacemaker daemon that launches and monitors all subsidiary Pacemaker daemons"
7ac83c
+
7ac83c
+struct {
7ac83c
+    gboolean features;
7ac83c
+    gboolean foreground;
7ac83c
+    gboolean shutdown;
7ac83c
+    gboolean standby;
7ac83c
+} options;
7ac83c
+
7ac83c
+static gboolean
7ac83c
+pid_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **err) {
7ac83c
+    return TRUE;
7ac83c
+}
7ac83c
+
7ac83c
+static gboolean
7ac83c
+standby_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **err) {
7ac83c
+    options.standby = TRUE;
7ac83c
+    pcmk__set_env_option("node_start_state", "standby");
7ac83c
+    return TRUE;
7ac83c
+}
7ac83c
+
7ac83c
+static GOptionEntry entries[] = {
7ac83c
+    { "features", 'F', 0, G_OPTION_ARG_NONE, &options.features,
7ac83c
+      "Display full version and list of features Pacemaker was built with",
7ac83c
+      NULL },
7ac83c
+    { "foreground", 'f', 0, G_OPTION_ARG_NONE, &options.foreground,
7ac83c
+      "(Ignored) Pacemaker always runs in the foreground",
7ac83c
+      NULL },
7ac83c
+    { "pid-file", 'p', 0, G_OPTION_ARG_CALLBACK, pid_cb,
7ac83c
+      "(Ignored) Daemon pid file location",
7ac83c
+      "FILE" },
7ac83c
+    { "shutdown", 'S', 0, G_OPTION_ARG_NONE, &options.shutdown,
7ac83c
+      "Instruct Pacemaker to shutdown on this machine",
7ac83c
+      NULL },
7ac83c
+    { "standby", 's', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, standby_cb,
7ac83c
+      "Start node in standby state",
7ac83c
+      NULL },
7ac83c
+
7ac83c
+    { NULL }
7ac83c
+};
7ac83c
+
7ac83c
 static gboolean fatal_error = FALSE;
7ac83c
 static GMainLoop *mainloop = NULL;
7ac83c
 static bool global_keep_tracking = false;
7ac83c
@@ -642,49 +685,6 @@ pcmk_sigquit(int nsig)
7ac83c
     .connection_destroyed = pcmk_ipc_destroy
7ac83c
 };
7ac83c
 
7ac83c
-static pcmk__cli_option_t long_options[] = {
7ac83c
-    // long option, argument type, storage, short option, description, flags
7ac83c
-    {
7ac83c
-        "help", no_argument, NULL, '?',
7ac83c
-        "\tThis text", pcmk__option_default
7ac83c
-    },
7ac83c
-    {
7ac83c
-        "version", no_argument, NULL, '$',
7ac83c
-        "\tVersion information", pcmk__option_default
7ac83c
-    },
7ac83c
-    {
7ac83c
-        "verbose", no_argument, NULL, 'V',
7ac83c
-        "\tIncrease debug output", pcmk__option_default
7ac83c
-    },
7ac83c
-    {
7ac83c
-        "shutdown", no_argument, NULL, 'S',
7ac83c
-        "\tInstruct Pacemaker to shutdown on this machine", pcmk__option_default
7ac83c
-    },
7ac83c
-    {
7ac83c
-        "features", no_argument, NULL, 'F',
7ac83c
-        "\tDisplay full version and list of features Pacemaker was built with",
7ac83c
-        pcmk__option_default
7ac83c
-    },
7ac83c
-    {
7ac83c
-        "-spacer-", no_argument, NULL, '-',
7ac83c
-        "\nAdditional Options:", pcmk__option_default
7ac83c
-    },
7ac83c
-    {
7ac83c
-        "foreground", no_argument, NULL, 'f',
7ac83c
-        "\t(Ignored) Pacemaker always runs in the foreground",
7ac83c
-        pcmk__option_default
7ac83c
-    },
7ac83c
-    {
7ac83c
-        "pid-file", required_argument, NULL, 'p',
7ac83c
-        "\t(Ignored) Daemon pid file location", pcmk__option_default
7ac83c
-    },
7ac83c
-    {
7ac83c
-        "standby", no_argument, NULL, 's',
7ac83c
-        "\tStart node in standby state", pcmk__option_default
7ac83c
-    },
7ac83c
-    { 0, 0, 0, 0 }
7ac83c
-};
7ac83c
-
7ac83c
 static void
7ac83c
 mcp_chown(const char *path, uid_t uid, gid_t gid)
7ac83c
 {
7ac83c
@@ -1168,83 +1211,66 @@ request_shutdown(crm_ipc_t *ipc)
7ac83c
     return status;
7ac83c
 }
7ac83c
 
7ac83c
+static GOptionContext *
7ac83c
+build_arg_context(pcmk__common_args_t *args) {
7ac83c
+    GOptionContext *context = NULL;
7ac83c
+
7ac83c
+    context = pcmk__build_arg_context(args, NULL, NULL, NULL);
7ac83c
+    pcmk__add_main_args(context, entries);
7ac83c
+    return context;
7ac83c
+}
7ac83c
+
7ac83c
 int
7ac83c
 main(int argc, char **argv)
7ac83c
 {
7ac83c
-    int flag;
7ac83c
-    int argerr = 0;
7ac83c
+    crm_exit_t exit_code = CRM_EX_OK;
7ac83c
+
7ac83c
+    GError *error = NULL;
7ac83c
+
7ac83c
+    pcmk__common_args_t *args = pcmk__new_common_args(SUMMARY);
7ac83c
+    gchar **processed_args = pcmk__cmdline_preproc(argv, "p");
7ac83c
+    GOptionContext *context = build_arg_context(args);
7ac83c
 
7ac83c
-    int option_index = 0;
7ac83c
     bool old_instance_connected = false;
7ac83c
-    gboolean shutdown = FALSE;
7ac83c
 
7ac83c
     crm_ipc_t *old_instance = NULL;
7ac83c
     qb_ipcs_service_t *ipcs = NULL;
7ac83c
 
7ac83c
     crm_log_preinit(NULL, argc, argv);
7ac83c
-    pcmk__set_cli_options(NULL, "[options]", long_options,
7ac83c
-                          "primary Pacemaker daemon that launches and "
7ac83c
-                          "monitors all subsidiary Pacemaker daemons");
7ac83c
     mainloop_add_signal(SIGHUP, pcmk_ignore);
7ac83c
     mainloop_add_signal(SIGQUIT, pcmk_sigquit);
7ac83c
 
7ac83c
-    while (1) {
7ac83c
-        flag = pcmk__next_cli_option(argc, argv, &option_index, NULL);
7ac83c
-        if (flag == -1)
7ac83c
-            break;
7ac83c
-
7ac83c
-        switch (flag) {
7ac83c
-            case 'V':
7ac83c
-                crm_bump_log_level(argc, argv);
7ac83c
-                break;
7ac83c
-            case 'f':
7ac83c
-                /* Legacy */
7ac83c
-                break;
7ac83c
-            case 'p':
7ac83c
-                break;
7ac83c
-            case 's':
7ac83c
-                pcmk__set_env_option("node_start_state", "standby");
7ac83c
-                break;
7ac83c
-            case '$':
7ac83c
-            case '?':
7ac83c
-                pcmk__cli_help(flag, CRM_EX_OK);
7ac83c
-                break;
7ac83c
-            case 'S':
7ac83c
-                shutdown = TRUE;
7ac83c
-                break;
7ac83c
-            case 'F':
7ac83c
-                printf("Pacemaker %s (Build: %s)\n Supporting v%s: %s\n", PACEMAKER_VERSION, BUILD_VERSION,
7ac83c
-                       CRM_FEATURE_SET, CRM_FEATURES);
7ac83c
-                crm_exit(CRM_EX_OK);
7ac83c
-            default:
7ac83c
-                printf("Argument code 0%o (%c) is not (?yet?) supported\n", flag, flag);
7ac83c
-                ++argerr;
7ac83c
-                break;
7ac83c
-        }
7ac83c
+    if (!g_option_context_parse_strv(context, &processed_args, &error)) {
7ac83c
+        exit_code = CRM_EX_USAGE;
7ac83c
+        goto done;
7ac83c
     }
7ac83c
 
7ac83c
-    if (optind < argc) {
7ac83c
-        printf("non-option ARGV-elements: ");
7ac83c
-        while (optind < argc)
7ac83c
-            printf("%s ", argv[optind++]);
7ac83c
-        printf("\n");
7ac83c
-    }
7ac83c
-    if (argerr) {
7ac83c
-        pcmk__cli_help('?', CRM_EX_USAGE);
7ac83c
+    if (options.features) {
7ac83c
+        printf("Pacemaker %s (Build: %s)\n Supporting v%s: %s\n", PACEMAKER_VERSION, BUILD_VERSION,
7ac83c
+               CRM_FEATURE_SET, CRM_FEATURES);
7ac83c
+        exit_code = CRM_EX_OK;
7ac83c
+        goto done;
7ac83c
     }
7ac83c
 
7ac83c
+    if (args->version) {
7ac83c
+        g_strfreev(processed_args);
7ac83c
+        pcmk__free_arg_context(context);
7ac83c
+        /* FIXME:  When pacemakerd is converted to use formatted output, this can go. */
7ac83c
+        pcmk__cli_help('v', CRM_EX_USAGE);
7ac83c
+    }
7ac83c
 
7ac83c
     setenv("LC_ALL", "C", 1);
7ac83c
 
7ac83c
     pcmk__set_env_option("mcp", "true");
7ac83c
 
7ac83c
+    pcmk__cli_init_logging("pacemakerd", args->verbosity);
7ac83c
     crm_log_init(NULL, LOG_INFO, TRUE, FALSE, argc, argv, FALSE);
7ac83c
 
7ac83c
     crm_debug("Checking for existing Pacemaker instance");
7ac83c
     old_instance = crm_ipc_new(CRM_SYSTEM_MCP, 0);
7ac83c
     old_instance_connected = crm_ipc_connect(old_instance);
7ac83c
 
7ac83c
-    if (shutdown) {
7ac83c
+    if (options.shutdown) {
7ac83c
         if (old_instance_connected) {
7ac83c
             crm_exit(request_shutdown(old_instance));
7ac83c
         } else {
7ac83c
@@ -1253,22 +1279,25 @@ main(int argc, char **argv)
7ac83c
                     "Pacemaker instance: %s", strerror(errno));
7ac83c
             crm_ipc_close(old_instance);
7ac83c
             crm_ipc_destroy(old_instance);
7ac83c
-            crm_exit(CRM_EX_DISCONNECT);
7ac83c
+            exit_code = CRM_EX_DISCONNECT;
7ac83c
+            goto done;
7ac83c
         }
7ac83c
 
7ac83c
     } else if (old_instance_connected) {
7ac83c
         crm_ipc_close(old_instance);
7ac83c
         crm_ipc_destroy(old_instance);
7ac83c
         crm_err("Aborting start-up because active Pacemaker instance found");
7ac83c
-        crm_exit(CRM_EX_FATAL);
7ac83c
+        exit_code = CRM_EX_FATAL;
7ac83c
+        goto done;
7ac83c
     }
7ac83c
 
7ac83c
     crm_ipc_close(old_instance);
7ac83c
     crm_ipc_destroy(old_instance);
7ac83c
 
7ac83c
 #ifdef SUPPORT_COROSYNC
7ac83c
     if (mcp_read_config() == FALSE) {
7ac83c
-        crm_exit(CRM_EX_UNAVAILABLE);
7ac83c
+        exit_code = CRM_EX_UNAVAILABLE;
7ac83c
+        goto done;
7ac83c
     }
7ac83c
 #endif
7ac83c
 
7ac83c
@@ -1292,7 +1321,8 @@ main(int argc, char **argv)
7ac83c
 #ifdef SUPPORT_COROSYNC
7ac83c
     /* Allows us to block shutdown */
7ac83c
     if (!cluster_connect_cfg()) {
7ac83c
-        crm_exit(CRM_EX_PROTOCOL);
7ac83c
+        exit_code = CRM_EX_PROTOCOL;
7ac83c
+        goto done;
7ac83c
     }
7ac83c
 #endif
7ac83c
 
7ac83c
@@ -1307,9 +1337,11 @@ main(int argc, char **argv)
7ac83c
         case pcmk_rc_ok:
7ac83c
             break;
7ac83c
         case pcmk_rc_ipc_unauthorized:
7ac83c
-            crm_exit(CRM_EX_CANTCREAT);
7ac83c
+            exit_code = CRM_EX_CANTCREAT;
7ac83c
+            goto done;
7ac83c
         default:
7ac83c
-            crm_exit(CRM_EX_FATAL);
7ac83c
+            exit_code = CRM_EX_FATAL;
7ac83c
+            goto done;
7ac83c
     };
7ac83c
 
7ac83c
     mainloop_add_signal(SIGTERM, pcmk_shutdown);
7ac83c
@@ -1342,5 +1374,11 @@ main(int argc, char **argv)
7ac83c
 #ifdef SUPPORT_COROSYNC
7ac83c
     cluster_disconnect_cfg();
7ac83c
 #endif
7ac83c
-    crm_exit(CRM_EX_OK);
7ac83c
+
7ac83c
+done:
7ac83c
+    g_strfreev(processed_args);
7ac83c
+    pcmk__free_arg_context(context);
7ac83c
+
7ac83c
+    pcmk__output_and_clear_error(error, NULL);
7ac83c
+    crm_exit(exit_code);
7ac83c
 }
7ac83c
-- 
7ac83c
1.8.3.1
7ac83c
7ac83c
7ac83c
From 8f7924fbb2a012bedcad59335b7bebc5020b26e3 Mon Sep 17 00:00:00 2001
7ac83c
From: Chris Lumens <clumens@redhat.com>
7ac83c
Date: Thu, 13 May 2021 13:27:13 -0400
7ac83c
Subject: [PATCH 4/4] Low: pacemaker.service: Don't start pacemakerd with -f.
7ac83c
7ac83c
This option is completely ignored by pacemakerd.
7ac83c
---
7ac83c
 daemons/pacemakerd/pacemaker.service.in           | 2 +-
7ac83c
 doc/sphinx/Clusters_from_Scratch/verification.rst | 2 +-
7ac83c
 2 files changed, 2 insertions(+), 2 deletions(-)
7ac83c
7ac83c
diff --git a/daemons/pacemakerd/pacemaker.service.in b/daemons/pacemakerd/pacemaker.service.in
7ac83c
index b128ddc..0363a22 100644
7ac83c
--- a/daemons/pacemakerd/pacemaker.service.in
7ac83c
+++ b/daemons/pacemakerd/pacemaker.service.in
7ac83c
@@ -44,7 +44,7 @@ EnvironmentFile=-@CONFIGDIR@/pacemaker
7ac83c
 EnvironmentFile=-@CONFIGDIR@/sbd
7ac83c
 SuccessExitStatus=100
7ac83c
 
7ac83c
-ExecStart=@sbindir@/pacemakerd -f
7ac83c
+ExecStart=@sbindir@/pacemakerd
7ac83c
 
7ac83c
 # Systemd v227 and above can limit the number of processes spawned by a
7ac83c
 # service. That is a bad idea for an HA cluster resource manager, so disable it
7ac83c
diff --git a/doc/sphinx/Clusters_from_Scratch/verification.rst b/doc/sphinx/Clusters_from_Scratch/verification.rst
7ac83c
index 9d647f8..b7fa20e 100644
7ac83c
--- a/doc/sphinx/Clusters_from_Scratch/verification.rst
7ac83c
+++ b/doc/sphinx/Clusters_from_Scratch/verification.rst
7ac83c
@@ -103,7 +103,7 @@ the necessary processes are running:
7ac83c
         2 ?        S      0:00 [kthreadd]
7ac83c
     ...lots of processes...
7ac83c
     17121 ?        SLsl   0:01 /usr/sbin/corosync -f
7ac83c
-    17133 ?        Ss     0:00 /usr/sbin/pacemakerd -f
7ac83c
+    17133 ?        Ss     0:00 /usr/sbin/pacemakerd
7ac83c
     17134 ?        Ss     0:00  \_ /usr/libexec/pacemaker/pacemaker-based
7ac83c
     17135 ?        Ss     0:00  \_ /usr/libexec/pacemaker/pacemaker-fenced
7ac83c
     17136 ?        Ss     0:00  \_ /usr/libexec/pacemaker/pacemaker-execd
7ac83c
-- 
7ac83c
1.8.3.1
7ac83c