110 lines
3.4 KiB
Diff
110 lines
3.4 KiB
Diff
From: Andrew Beekhof <andrew@beekhof.net>
|
|
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;
|
|
}
|