Blame SOURCES/004-systemd-metadata.patch

0aa0b6
From 09ef95a2eed48b4eb7488788a1b655d67eafe783 Mon Sep 17 00:00:00 2001
0aa0b6
From: Chris Lumens <clumens@redhat.com>
0aa0b6
Date: Tue, 30 Nov 2021 14:47:12 -0500
0aa0b6
Subject: [PATCH] Low: libcrmservice: Handle systemd service templates.
0aa0b6
0aa0b6
These unit files (which have an @ sign at the end) expect to be
0aa0b6
parameterized by an instance name.  Not providing an instance name
0aa0b6
causes the dbus lookup to fail, and we fall back to assume this is an
0aa0b6
LSB service.  If the user doesn't provide an instance name, just add a
0aa0b6
fake one.  It doesn't seem to matter what name is given for the lookup.
0aa0b6
0aa0b6
See: rhbz#2003151
0aa0b6
---
0aa0b6
 lib/services/systemd.c | 22 ++++++++++++++++------
0aa0b6
 1 file changed, 16 insertions(+), 6 deletions(-)
0aa0b6
0aa0b6
diff --git a/lib/services/systemd.c b/lib/services/systemd.c
0aa0b6
index 8e9fff484..27a3b376d 100644
0aa0b6
--- a/lib/services/systemd.c
0aa0b6
+++ b/lib/services/systemd.c
0aa0b6
@@ -206,17 +206,27 @@ systemd_unit_extension(const char *name)
0aa0b6
 }
0aa0b6
 
0aa0b6
 static char *
0aa0b6
-systemd_service_name(const char *name)
0aa0b6
+systemd_service_name(const char *name, bool add_instance_name)
0aa0b6
 {
0aa0b6
-    if (name == NULL) {
0aa0b6
+    if (pcmk__str_empty(name)) {
0aa0b6
         return NULL;
0aa0b6
     }
0aa0b6
 
0aa0b6
     if (systemd_unit_extension(name)) {
0aa0b6
         return strdup(name);
0aa0b6
-    }
0aa0b6
 
0aa0b6
-    return crm_strdup_printf("%s.service", name);
0aa0b6
+    /* Services that end with an @ sign are systemd templates.  They expect an
0aa0b6
+     * instance name to follow the service name.  If no instance name was
0aa0b6
+     * provided, just add "x" to the string as the instance name.  It doesn't
0aa0b6
+     * seem to matter for purposes of looking up whether a service exists or
0aa0b6
+     * not.
0aa0b6
+     */
0aa0b6
+    } else if (add_instance_name && *(name+strlen(name)-1) == '@') {
0aa0b6
+        return crm_strdup_printf("%sx.service", name);
0aa0b6
+
0aa0b6
+    } else {
0aa0b6
+        return crm_strdup_printf("%s.service", name);
0aa0b6
+    }
0aa0b6
 }
0aa0b6
 
0aa0b6
 static void
0aa0b6
@@ -427,7 +437,7 @@ invoke_unit_by_name(const char *arg_name, svc_action_t *op, char **path)
0aa0b6
     CRM_ASSERT(msg != NULL);
0aa0b6
 
0aa0b6
     // Add the (expanded) unit name as the argument
0aa0b6
-    name = systemd_service_name(arg_name);
0aa0b6
+    name = systemd_service_name(arg_name, op == NULL || pcmk__str_eq(op->action, "meta-data", pcmk__str_none));
0aa0b6
     CRM_LOG_ASSERT(dbus_message_append_args(msg, DBUS_TYPE_STRING, &name,
0aa0b6
                                             DBUS_TYPE_INVALID));
0aa0b6
     free(name);
0aa0b6
@@ -944,7 +954,7 @@ invoke_unit_by_path(svc_action_t *op, const char *unit)
0aa0b6
     /* (ss) */
0aa0b6
     {
0aa0b6
         const char *replace_s = "replace";
0aa0b6
-        char *name = systemd_service_name(op->agent);
0aa0b6
+        char *name = systemd_service_name(op->agent, pcmk__str_eq(op->action, "meta-data", pcmk__str_none));
0aa0b6
 
0aa0b6
         CRM_LOG_ASSERT(dbus_message_append_args(msg, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID));
0aa0b6
         CRM_LOG_ASSERT(dbus_message_append_args(msg, DBUS_TYPE_STRING, &replace_s, DBUS_TYPE_INVALID));
0aa0b6
-- 
0aa0b6
2.27.0
0aa0b6