Blob Blame History Raw
From: Andrew Beekhof <andrew@beekhof.net>
Date: Thu, 17 Sep 2015 09:46:38 +1000
Subject: [PATCH] Fix: crm_resource: Allow the resource configuration to be
 modified for --force-{check,start,..} calls

(cherry picked from commit 1206f735a8ddb33c77152c736828e823e7755c34)
---
 tools/crm_resource.c         | 36 +++++++++++++++++++++++++++++++-----
 tools/crm_resource.h         |  2 +-
 tools/crm_resource_runtime.c | 14 +++++++++++++-
 3 files changed, 45 insertions(+), 7 deletions(-)

diff --git a/tools/crm_resource.c b/tools/crm_resource.c
index 156bbea..2a94362 100644
--- a/tools/crm_resource.c
+++ b/tools/crm_resource.c
@@ -247,6 +247,7 @@ main(int argc, char **argv)
     const char *prop_set = NULL;
     const char *rsc_long_cmd = NULL;
     const char *longname = NULL;
+    GHashTable *override_params = NULL;
 
     char *xml_file = NULL;
     crm_ipc_t *crmd_channel = NULL;
@@ -503,11 +504,35 @@ main(int argc, char **argv)
         }
     }
 
-    if (optind < argc && argv[optind] != NULL) {
+    if (optind < argc
+        && argv[optind] != NULL
+        && rsc_cmd == 0
+        && rsc_long_cmd) {
+
+        override_params = g_hash_table_new_full(crm_str_hash, g_str_equal, g_hash_destroy_str, g_hash_destroy_str);
+        while (optind < argc && argv[optind] != NULL) {
+            char *name = calloc(1, strlen(argv[optind]));
+            char *value = calloc(1, strlen(argv[optind]));
+            int rc = sscanf(argv[optind], "%[^=]=%s", name, value);
+
+            if(rc == 2) {
+                g_hash_table_replace(override_params, name, value);
+
+            } else {
+                CMD_ERR("Error parsing '%s' as a name=value pair for --%s", argv[optind], rsc_long_cmd);
+                free(value);
+                free(name);
+                argerr++;
+            }
+            optind++;
+        }
+
+    } else if (optind < argc && argv[optind] != NULL && rsc_cmd == 0) {
         CMD_ERR("non-option ARGV-elements: ");
         while (optind < argc && argv[optind] != NULL) {
-            CMD_ERR("%s ", argv[optind++]);
-            ++argerr;
+            CMD_ERR("[%d of %d] %s ", optind, argc, argv[optind]);
+            optind++;
+            argerr++;
         }
     }
 
@@ -516,7 +541,8 @@ main(int argc, char **argv)
     }
 
     if (argerr) {
-        crm_help('?', EX_USAGE);
+        CMD_ERR("Invalid option(s) supplied, use --help for valid usage");
+        return crm_exit(EX_USAGE);
     }
 
     our_pid = calloc(1, 11);
@@ -631,7 +657,7 @@ main(int argc, char **argv)
         rc = wait_till_stable(timeout_ms, cib_conn);
 
     } else if (rsc_cmd == 0 && rsc_long_cmd) { /* force-(stop|start|check) */
-        rc = cli_resource_execute(rsc_id, rsc_long_cmd, cib_conn, &data_set);
+        rc = cli_resource_execute(rsc_id, rsc_long_cmd, override_params, cib_conn, &data_set);
 
     } else if (rsc_cmd == 'A' || rsc_cmd == 'a') {
         GListPtr lpc = NULL;
diff --git a/tools/crm_resource.h b/tools/crm_resource.h
index 5a206e0..d4c3b05 100644
--- a/tools/crm_resource.h
+++ b/tools/crm_resource.h
@@ -74,7 +74,7 @@ int cli_resource_search(const char *rsc, pe_working_set_t * data_set);
 int cli_resource_delete(cib_t *cib_conn, crm_ipc_t * crmd_channel, const char *host_uname, resource_t * rsc, pe_working_set_t * data_set);
 int cli_resource_restart(resource_t * rsc, const char *host, int timeout_ms, cib_t * cib);
 int cli_resource_move(const char *rsc_id, const char *host_name, cib_t * cib, pe_working_set_t *data_set);
-int cli_resource_execute(const char *rsc_id, const char *rsc_action, cib_t * cib, pe_working_set_t *data_set);
+int cli_resource_execute(const char *rsc_id, const char *rsc_action, GHashTable *override_hash, cib_t * cib, pe_working_set_t *data_set);
 
 int cli_resource_update_attribute(const char *rsc_id, const char *attr_set, const char *attr_id,
                                   const char *attr_name, const char *attr_value, bool recursive,
diff --git a/tools/crm_resource_runtime.c b/tools/crm_resource_runtime.c
index b9427bc..ce9db01 100644
--- a/tools/crm_resource_runtime.c
+++ b/tools/crm_resource_runtime.c
@@ -1297,7 +1297,7 @@ wait_till_stable(int timeout_ms, cib_t * cib)
 }
 
 int
-cli_resource_execute(const char *rsc_id, const char *rsc_action, cib_t * cib, pe_working_set_t *data_set)
+cli_resource_execute(const char *rsc_id, const char *rsc_action, GHashTable *override_hash, cib_t * cib, pe_working_set_t *data_set)
 {
     int rc = pcmk_ok;
     svc_action_t *op = NULL;
@@ -1360,6 +1360,18 @@ cli_resource_execute(const char *rsc_id, const char *rsc_action, cib_t * cib, pe
         setenv("OCF_TRACE_RA", "1", 1);
     }
 
+    if(op && override_hash) {
+        GHashTableIter iter;
+        char *name = NULL;
+        char *value = NULL;
+
+        g_hash_table_iter_init(&iter, override_hash);
+        while (g_hash_table_iter_next(&iter, (gpointer *) & name, (gpointer *) & value)) {
+            printf("Overriding the cluser configuration for '%s' with '%s' = '%s'\n", rsc->id, name, value);
+            g_hash_table_replace(op->params, strdup(name), strdup(value));
+        }
+    }
+
     if(op == NULL) {
         /* Re-run but with stderr enabled so we can display a sane error message */
         crm_enable_stderr(TRUE);