From: Andrew Beekhof 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);