Blame SOURCES/003-pacemakerd-output.patch

599c7d
From 7c35387a9896cb968cf4087b5cbed94af44e1ea5 Mon Sep 17 00:00:00 2001
599c7d
From: Chris Lumens <clumens@redhat.com>
599c7d
Date: Fri, 14 May 2021 12:03:46 -0400
599c7d
Subject: [PATCH 1/5] Feature: daemons: Convert pacemakerd to formatted output.
599c7d
599c7d
The main purpose of this is to finish getting pacemakerd moved off the
599c7d
existing command line handling code (pcmk__cli_help in particular) so
599c7d
that code can eventually be deprecated or removed.  pacemakerd itself
599c7d
does fairly little printing.
599c7d
---
599c7d
 daemons/pacemakerd/pacemakerd.c | 58 ++++++++++++++++++++++++++++++-----------
599c7d
 1 file changed, 43 insertions(+), 15 deletions(-)
599c7d
599c7d
diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
599c7d
index ce194bf..bd59729 100644
599c7d
--- a/daemons/pacemakerd/pacemakerd.c
599c7d
+++ b/daemons/pacemakerd/pacemakerd.c
599c7d
@@ -25,6 +25,7 @@
599c7d
 #include <crm/common/ipc_internal.h>
599c7d
 #include <crm/common/mainloop.h>
599c7d
 #include <crm/common/cmdline_internal.h>
599c7d
+#include <crm/common/output_internal.h>
599c7d
 #include <crm/cluster/internal.h>
599c7d
 #include <crm/cluster.h>
599c7d
 
599c7d
@@ -37,6 +38,14 @@ struct {
599c7d
     gboolean standby;
599c7d
 } options;
599c7d
 
599c7d
+static pcmk__output_t *out = NULL;
599c7d
+
599c7d
+static pcmk__supported_format_t formats[] = {
599c7d
+    PCMK__SUPPORTED_FORMAT_NONE,
599c7d
+    PCMK__SUPPORTED_FORMAT_TEXT,
599c7d
+    { NULL, NULL, NULL }
599c7d
+};
599c7d
+
599c7d
 static gboolean
599c7d
 pid_cb(const gchar *option_name, const gchar *optarg, gpointer data, GError **err) {
599c7d
     return TRUE;
599c7d
@@ -1167,10 +1176,10 @@ pacemakerd_event_cb(pcmk_ipc_api_t *pacemakerd_api,
599c7d
 }
599c7d
 
599c7d
 static GOptionContext *
599c7d
-build_arg_context(pcmk__common_args_t *args) {
599c7d
+build_arg_context(pcmk__common_args_t *args, GOptionGroup **group) {
599c7d
     GOptionContext *context = NULL;
599c7d
 
599c7d
-    context = pcmk__build_arg_context(args, NULL, NULL, NULL);
599c7d
+    context = pcmk__build_arg_context(args, "text", group, NULL);
599c7d
     pcmk__add_main_args(context, entries);
599c7d
     return context;
599c7d
 }
599c7d
@@ -1182,9 +1191,11 @@ main(int argc, char **argv)
599c7d
 
599c7d
     GError *error = NULL;
599c7d
 
599c7d
+    int rc = pcmk_rc_ok;
599c7d
+    GOptionGroup *output_group = NULL;
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
+    GOptionContext *context = build_arg_context(args, &output_group);
599c7d
 
599c7d
     bool old_instance_connected = false;
599c7d
 
599c7d
@@ -1195,23 +1205,30 @@ main(int argc, char **argv)
599c7d
     mainloop_add_signal(SIGHUP, pcmk_ignore);
599c7d
     mainloop_add_signal(SIGQUIT, pcmk_sigquit);
599c7d
 
599c7d
+    pcmk__register_formats(output_group, formats);
599c7d
     if (!g_option_context_parse_strv(context, &processed_args, &error)) {
599c7d
         exit_code = CRM_EX_USAGE;
599c7d
         goto done;
599c7d
     }
599c7d
 
599c7d
+    rc = pcmk__output_new(&out, args->output_ty, args->output_dest, argv);
599c7d
+    if (rc != pcmk_rc_ok) {
599c7d
+        exit_code = CRM_EX_ERROR;
599c7d
+        g_set_error(&error, PCMK__EXITC_ERROR, exit_code, "Error creating output format %s: %s",
599c7d
+                    args->output_ty, pcmk_rc_str(rc));
599c7d
+        goto done;
599c7d
+    }
599c7d
+
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
+        out->info(out, "Pacemaker %s (Build: %s)\n Supporting v%s: %s", PACEMAKER_VERSION,
599c7d
+                  BUILD_VERSION, 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
+        out->version(out, false);
599c7d
+        goto done;
599c7d
     }
599c7d
 
599c7d
     setenv("LC_ALL", "C", 1);
599c7d
@@ -1248,6 +1265,13 @@ main(int argc, char **argv)
599c7d
     crm_ipc_close(old_instance);
599c7d
     crm_ipc_destroy(old_instance);
599c7d
 
599c7d
+    /* Don't allow any accidental output after this point. */
599c7d
+    if (out != NULL) {
599c7d
+        out->finish(out, exit_code, true, NULL);
599c7d
+        pcmk__output_free(out);
599c7d
+        out = NULL;
599c7d
+    }
599c7d
+
599c7d
 #ifdef SUPPORT_COROSYNC
599c7d
     if (mcp_read_config() == FALSE) {
599c7d
         exit_code = CRM_EX_UNAVAILABLE;
599c7d
@@ -1333,6 +1357,11 @@ done:
599c7d
     g_strfreev(processed_args);
599c7d
     pcmk__free_arg_context(context);
599c7d
 
599c7d
-    pcmk__output_and_clear_error(error, NULL);
599c7d
+    pcmk__output_and_clear_error(error, out);
599c7d
+
599c7d
+    if (out != NULL) {
599c7d
+        out->finish(out, exit_code, true, NULL);
599c7d
+        pcmk__output_free(out);
599c7d
+    }
599c7d
     crm_exit(exit_code);
599c7d
 }
599c7d
-- 
599c7d
1.8.3.1
599c7d
599c7d
599c7d
From 35e6da64381fcb092d81ce16835cc28670b077cb Mon Sep 17 00:00:00 2001
599c7d
From: Chris Lumens <clumens@redhat.com>
599c7d
Date: Mon, 17 May 2021 10:04:04 -0400
599c7d
Subject: [PATCH 2/5] Features: daemons: Output the pacemakerd feature list in
599c7d
 XML.
599c7d
599c7d
---
599c7d
 daemons/pacemakerd/pacemakerd.c | 45 ++++++++++++++++++++++++++++++++++++++---
599c7d
 1 file changed, 42 insertions(+), 3 deletions(-)
599c7d
599c7d
diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
599c7d
index bd59729..93cf743 100644
599c7d
--- a/daemons/pacemakerd/pacemakerd.c
599c7d
+++ b/daemons/pacemakerd/pacemakerd.c
599c7d
@@ -43,6 +43,42 @@ static pcmk__output_t *out = NULL;
599c7d
 static pcmk__supported_format_t formats[] = {
599c7d
     PCMK__SUPPORTED_FORMAT_NONE,
599c7d
     PCMK__SUPPORTED_FORMAT_TEXT,
599c7d
+    PCMK__SUPPORTED_FORMAT_XML,
599c7d
+    { NULL, NULL, NULL }
599c7d
+};
599c7d
+
599c7d
+static int
599c7d
+pacemakerd_features(pcmk__output_t *out, va_list args) {
599c7d
+    out->info(out, "Pacemaker %s (Build: %s)\n Supporting v%s: %s", PACEMAKER_VERSION,
599c7d
+              BUILD_VERSION, CRM_FEATURE_SET, CRM_FEATURES);
599c7d
+    return pcmk_rc_ok;
599c7d
+}
599c7d
+
599c7d
+static int
599c7d
+pacemakerd_features_xml(pcmk__output_t *out, va_list args) {
599c7d
+    gchar **feature_list = g_strsplit(CRM_FEATURES, " ", 0);
599c7d
+
599c7d
+    pcmk__output_xml_create_parent(out, "pacemakerd",
599c7d
+                                   "version", PACEMAKER_VERSION,
599c7d
+                                   "build", BUILD_VERSION,
599c7d
+                                   "feature_set", CRM_FEATURE_SET,
599c7d
+                                   NULL);
599c7d
+    out->begin_list(out, NULL, NULL, "features");
599c7d
+
599c7d
+    for (char **s = feature_list; *s != NULL; s++) {
599c7d
+        pcmk__output_create_xml_text_node(out, "feature", *s);
599c7d
+    }
599c7d
+
599c7d
+    out->end_list(out);
599c7d
+
599c7d
+    g_strfreev(feature_list);
599c7d
+    return pcmk_rc_ok;
599c7d
+}
599c7d
+
599c7d
+static pcmk__message_entry_t fmt_functions[] = {
599c7d
+    { "features", "default", pacemakerd_features },
599c7d
+    { "features", "xml", pacemakerd_features_xml },
599c7d
+
599c7d
     { NULL, NULL, NULL }
599c7d
 };
599c7d
 
599c7d
@@ -200,7 +236,7 @@ static GOptionContext *
599c7d
 build_arg_context(pcmk__common_args_t *args, GOptionGroup **group) {
599c7d
     GOptionContext *context = NULL;
599c7d
 
599c7d
-    context = pcmk__build_arg_context(args, "text", group, NULL);
599c7d
+    context = pcmk__build_arg_context(args, "text (default), xml", group, NULL);
599c7d
     pcmk__add_main_args(context, entries);
599c7d
     return context;
599c7d
 }
599c7d
@@ -241,9 +277,12 @@ main(int argc, char **argv)
599c7d
         goto done;
599c7d
     }
599c7d
 
599c7d
+    pcmk__force_args(context, &error, "%s --xml-simple-list", g_get_prgname());
599c7d
+
599c7d
+    pcmk__register_messages(out, fmt_functions);
599c7d
+
599c7d
     if (options.features) {
599c7d
-        out->info(out, "Pacemaker %s (Build: %s)\n Supporting v%s: %s", PACEMAKER_VERSION,
599c7d
-                  BUILD_VERSION, CRM_FEATURE_SET, CRM_FEATURES);
599c7d
+        out->message(out, "features");
599c7d
         exit_code = CRM_EX_OK;
599c7d
         goto done;
599c7d
     }
599c7d
-- 
599c7d
1.8.3.1
599c7d
599c7d
599c7d
From 5b7f5eb35b025b59805cf3c7c3dcb6a3cf4b71b3 Mon Sep 17 00:00:00 2001
599c7d
From: Chris Lumens <clumens@redhat.com>
599c7d
Date: Mon, 17 May 2021 11:09:53 -0400
599c7d
Subject: [PATCH 3/5] Low: daemons: Conditionally enable logging in pacemakerd.
599c7d
599c7d
If we're doing an interactive command-line call, use
599c7d
pcmk__cli_init_logging.  At the moment, all command line calls except
599c7d
for --shutdown do their work before logging would even come up, so we
599c7d
really only need to do this for --shutdown.
599c7d
599c7d
If we're doing a daemon call, use crm_log_init.
599c7d
---
599c7d
 daemons/pacemakerd/pacemakerd.c | 7 +++++--
599c7d
 1 file changed, 5 insertions(+), 2 deletions(-)
599c7d
599c7d
diff --git a/daemons/pacemakerd/pacemakerd.c b/daemons/pacemakerd/pacemakerd.c
599c7d
index 93cf743..c20bde7 100644
599c7d
--- a/daemons/pacemakerd/pacemakerd.c
599c7d
+++ b/daemons/pacemakerd/pacemakerd.c
599c7d
@@ -296,8 +296,11 @@ main(int argc, char **argv)
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
+    if (options.shutdown) {
599c7d
+        pcmk__cli_init_logging("pacemakerd", args->verbosity);
599c7d
+    } else {
599c7d
+        crm_log_init(NULL, LOG_INFO, TRUE, FALSE, argc, argv, FALSE);
599c7d
+    }
599c7d
 
599c7d
     crm_debug("Checking for existing Pacemaker instance");
599c7d
     old_instance = crm_ipc_new(CRM_SYSTEM_MCP, 0);
599c7d
-- 
599c7d
1.8.3.1
599c7d
599c7d
599c7d
From 2393362bb7489e86d937ed46a1c5cfb93d9bf3ab Mon Sep 17 00:00:00 2001
599c7d
From: Chris Lumens <clumens@redhat.com>
599c7d
Date: Mon, 17 May 2021 11:58:06 -0400
599c7d
Subject: [PATCH 4/5] Fix: include: Bump CRM_FEATURE_SET for new pacemakerd
599c7d
 args.
599c7d
599c7d
---
599c7d
 include/crm/crm.h | 2 +-
599c7d
 1 file changed, 1 insertion(+), 1 deletion(-)
599c7d
599c7d
diff --git a/include/crm/crm.h b/include/crm/crm.h
599c7d
index fdfc825..92a98fa 100644
599c7d
--- a/include/crm/crm.h
599c7d
+++ b/include/crm/crm.h
599c7d
@@ -66,7 +66,7 @@ extern "C" {
599c7d
  * >=3.0.13: Fail counts include operation name and interval
599c7d
  * >=3.2.0:  DC supports PCMK_LRM_OP_INVALID and PCMK_LRM_OP_NOT_CONNECTED
599c7d
  */
599c7d
-#  define CRM_FEATURE_SET		"3.10.0"
599c7d
+#  define CRM_FEATURE_SET		"3.10.1"
599c7d
 
599c7d
 /* Pacemaker's CPG protocols use fixed-width binary fields for the sender and
599c7d
  * recipient of a CPG message. This imposes an arbitrary limit on cluster node
599c7d
-- 
599c7d
1.8.3.1
599c7d
599c7d
599c7d
From 3ad8edbd91631b87ef5f53fa2d68f0c8bbb9ee2b Mon Sep 17 00:00:00 2001
599c7d
From: Chris Lumens <clumens@redhat.com>
599c7d
Date: Mon, 17 May 2021 11:57:09 -0400
599c7d
Subject: [PATCH 5/5] Feature: xml: Add schema for pacemakerd.
599c7d
599c7d
---
599c7d
 xml/Makefile.am             |  1 +
599c7d
 xml/api/pacemakerd-2.10.rng | 28 ++++++++++++++++++++++++++++
599c7d
 2 files changed, 29 insertions(+)
599c7d
 create mode 100644 xml/api/pacemakerd-2.10.rng
599c7d
599c7d
diff --git a/xml/Makefile.am b/xml/Makefile.am
599c7d
index 12a51c5..b9448d4 100644
599c7d
--- a/xml/Makefile.am
599c7d
+++ b/xml/Makefile.am
599c7d
@@ -56,6 +56,7 @@ API_request_base	= command-output	\
599c7d
 			  crm_simulate		\
599c7d
 			  crmadmin		\
599c7d
 			  digests		\
599c7d
+			  pacemakerd 		\
599c7d
 			  stonith_admin		\
599c7d
 			  version
599c7d
 
599c7d
diff --git a/xml/api/pacemakerd-2.10.rng b/xml/api/pacemakerd-2.10.rng
599c7d
new file mode 100644
599c7d
index 0000000..41a11e7
599c7d
--- /dev/null
599c7d
+++ b/xml/api/pacemakerd-2.10.rng
599c7d
@@ -0,0 +1,28 @@
599c7d
+
599c7d
+
599c7d
+         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
599c7d
+
599c7d
+    <start>
599c7d
+        <ref name="element-pacemakerd"/>
599c7d
+    </start>
599c7d
+
599c7d
+    <define name="element-pacemakerd">
599c7d
+        <element name="pacemakerd">
599c7d
+            <attribute name="version"> <text /> </attribute>
599c7d
+            <attribute name="build"> <text /> </attribute>
599c7d
+            <attribute name="feature_set"> <text /> </attribute>
599c7d
+
599c7d
+            <optional>
599c7d
+                <ref name="feature-list" />
599c7d
+            </optional>
599c7d
+        </element>
599c7d
+    </define>
599c7d
+
599c7d
+    <define name="feature-list">
599c7d
+        <element name="features">
599c7d
+            <oneOrMore>
599c7d
+                <element name="feature"> <text/> </element>
599c7d
+            </oneOrMore>
599c7d
+        </element>
599c7d
+    </define>
599c7d
+</grammar>
599c7d
-- 
599c7d
1.8.3.1
599c7d