From: Andrew Beekhof Date: Wed, 2 Sep 2015 14:34:04 +1000 Subject: [PATCH] Fix: crmd: Report the completion status and output of notifications (cherry picked from commit 0c303d8a6f9f9a9dbec9f6d2e9e799fe335f8eaa) --- crmd/notify.c | 37 ++++++++++++++++++++++++------------- lib/services/services.c | 4 ++-- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/crmd/notify.c b/crmd/notify.c index ccf5ea8..ca2be0f 100644 --- a/crmd/notify.c +++ b/crmd/notify.c @@ -29,6 +29,7 @@ static const char *notify_keys[] = { "CRM_notify_recipient", "CRM_notify_node", + "CRM_notify_nodeid", "CRM_notify_rsc", "CRM_notify_task", "CRM_notify_interval", @@ -83,12 +84,21 @@ set_notify_key(const char *name, const char *cvalue, char *value) free(value); } +static void crmd_notify_complete(svc_action_t *op) +{ + if(op->rc == 0) { + crm_info("Notification %d (%s) complete", op->sequence, op->agent); + } else { + crm_warn("Notification %d (%s) failed: %d", op->sequence, op->agent, op->rc); + } +} static void send_notification(const char *kind) { int lpc; - pid_t pid; + svc_action_t *notify = NULL; + static int operations = 0; crm_debug("Sending '%s' notification to '%s' via '%s'", kind, notify_target, notify_script); @@ -96,20 +106,20 @@ send_notification(const char *kind) set_notify_key("CRM_notify_kind", kind, NULL); set_notify_key("CRM_notify_version", VERSION, NULL); - pid = fork(); - if (pid == -1) { - crm_perror(LOG_ERR, "notification failed"); - } + notify = services_action_create_generic(notify_script, NULL); - if (pid == 0) { - /* crm_debug("notification: I am the child. Executing the nofitication program."); */ - execl(notify_script, notify_script, NULL); - exit(EXIT_FAILURE); + notify->timeout = 300; + notify->standard = strdup("event"); + notify->id = strdup(notify_script); + notify->agent = strdup(notify_script); + notify->sequence = ++operations; - } else { - for(lpc = 0; lpc < DIMOF(notify_keys); lpc++) { - unsetenv(notify_keys[lpc]); - } + if(services_action_async(notify, &crmd_notify_complete) == FALSE) { + services_action_free(notify); + } + + for(lpc = 0; lpc < DIMOF(notify_keys); lpc++) { + unsetenv(notify_keys[lpc]); } } @@ -120,6 +130,7 @@ void crmd_notify_node_event(crm_node_t *node) } set_notify_key("CRM_notify_node", node->uname, NULL); + set_notify_key("CRM_notify_nodeid", NULL, crm_itoa(node->id)); set_notify_key("CRM_notify_desc", node->state, NULL); send_notification("node"); diff --git a/lib/services/services.c b/lib/services/services.c index abf1458..4609a7d 100644 --- a/lib/services/services.c +++ b/lib/services/services.c @@ -598,7 +598,7 @@ action_async_helper(svc_action_t * op) { } /* keep track of ops that are in-flight to avoid collisions in the same namespace */ - if (res) { + if (op->rsc && res) { inflight_ops = g_list_append(inflight_ops, op); } @@ -622,7 +622,7 @@ services_action_async(svc_action_t * op, void (*action_callback) (svc_action_t * g_hash_table_replace(recurring_actions, op->id, op); } - if (is_op_blocked(op->rsc)) { + if (op->rsc && is_op_blocked(op->rsc)) { blocked_ops = g_list_append(blocked_ops, op); return TRUE; }