Blame SOURCES/002-pacemakerd-options.patch

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