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