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
This commit is contained in:
Russell Bryant
2012-07-30 00:14:18 +00:00
parent 9850a075b7
commit fd11146592
3 changed files with 69 additions and 7 deletions

View File

@@ -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) {