From fd1114659298072d639b691095825b66252a2f3d Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Mon, 30 Jul 2012 00:14:18 +0000 Subject: Add a "corosync ping" CLI command. This patch adds a new CLI command to the res_corosync module. It is primarily used as a debugging tool. It lets you fire off an event which will cause res_corosync on other nodes in the cluster to place messages into the logger if everything is working ok. It verifies that the corosync communication is working as expected. I didn't put anything in the CHANGES file for this, because this module is new in Asterisk 11. There is already a generic "res_corosync new module" entry in there so I figure that covers it just fine. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@370535 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_corosync.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 3 deletions(-) (limited to 'res/res_corosync.c') diff --git a/res/res_corosync.c b/res/res_corosync.c index 72c3b6511..e6044c305 100644 --- a/res/res_corosync.c +++ b/res/res_corosync.c @@ -50,10 +50,13 @@ static struct { const char *name; struct ast_event_sub *sub; unsigned char publish; + unsigned char publish_default; unsigned char subscribe; + unsigned char subscribe_default; } event_types[] = { [AST_EVENT_MWI] = { .name = "mwi", }, [AST_EVENT_DEVICE_STATE_CHANGE] = { .name = "device_state", }, + [AST_EVENT_PING] = { .name = "ping", .publish_default = 1, .subscribe_default = 1 }, }; static struct { @@ -143,7 +146,18 @@ static void cpg_deliver_cb(cpg_handle_t handle, const struct cpg_name *group_nam memcpy(event, msg, msg_len); - ast_event_queue_and_cache(event); + if (ast_event_get_type(event) == AST_EVENT_PING) { + const struct ast_eid *eid; + char buf[128] = ""; + + eid = ast_event_get_ie_raw(event, AST_EVENT_IE_EID); + ast_eid_to_str(buf, sizeof(buf), (struct ast_eid *) eid); + ast_log(LOG_NOTICE, "(cpg_deliver_cb) Got event PING from server with EID: '%s'\n", buf); + + ast_event_queue(event); + } else { + ast_event_queue_and_cache(event); + } } static void cpg_confchg_cb(cpg_handle_t handle, const struct cpg_name *group_name, @@ -280,6 +294,15 @@ static void ast_event_cb(const struct ast_event *event, void *data) .iov_len = ast_event_get_size(event), }; + if (ast_event_get_type(event) == AST_EVENT_PING) { + const struct ast_eid *eid; + char buf[128] = ""; + + eid = ast_event_get_ie_raw(event, AST_EVENT_IE_EID); + ast_eid_to_str(buf, sizeof(buf), (struct ast_eid *) eid); + ast_log(LOG_NOTICE, "(ast_event_cb) Got event PING from server with EID: '%s'\n", buf); + } + if (ast_eid_cmp(&ast_eid_default, ast_event_get_ie_raw(event, AST_EVENT_IE_EID))) { /* If the event didn't originate from this server, don't send it back out. */ @@ -368,6 +391,40 @@ static char *corosync_show_members(struct ast_cli_entry *e, int cmd, struct ast_ return CLI_SUCCESS; } +static char *corosync_ping(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) +{ + struct ast_event *event; + + switch (cmd) { + case CLI_INIT: + e->command = "corosync ping"; + e->usage = + "Usage: corosync ping\n" + " Send a test ping to the cluster.\n" + "A NOTICE will be in the log for every ping received\n" + "on a server.\n If you send a ping, you should see a NOTICE\n" + "in the log for every server in the cluster.\n"; + return NULL; + + case CLI_GENERATE: + return NULL; /* no completion */ + } + + if (a->argc != e->args) { + return CLI_SHOWUSAGE; + } + + event = ast_event_new(AST_EVENT_PING, AST_EVENT_IE_END); + + if (!event) { + return CLI_FAILURE; + } + + ast_event_queue(event); + + return CLI_SUCCESS; +} + static char *corosync_show_config(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { unsigned int i; @@ -417,6 +474,7 @@ static char *corosync_show_config(struct ast_cli_entry *e, int cmd, struct ast_c static struct ast_cli_entry corosync_cli[] = { AST_CLI_DEFINE(corosync_show_config, "Show configuration"), AST_CLI_DEFINE(corosync_show_members, "Show cluster members"), + AST_CLI_DEFINE(corosync_ping, "Send a test ping to the cluster"), }; enum { @@ -457,8 +515,8 @@ static int load_general_config(struct ast_config *cfg) ast_rwlock_wrlock(&event_types_lock); for (i = 0; i < ARRAY_LEN(event_types); i++) { - event_types[i].publish = 0; - event_types[i].subscribe = 0; + event_types[i].publish = event_types[i].publish_default; + event_types[i].subscribe = event_types[i].subscribe_default; } for (v = ast_variable_browse(cfg, "general"); v && !res; v = v->next) { -- cgit v1.2.3