From 0fc6ccff7a19a4c009f446e6d44c84bc67f88e30 Mon Sep 17 00:00:00 2001 From: kapil Date: Wed, 6 Jun 2012 18:03:07 +0530 Subject: [PATCH] adding "peerxmlstatus" CLI command to show the peer status for requested profile --- src/mod/endpoints/mod_megaco/megaco_cli.c | 133 +++++++++++++++------- src/mod/endpoints/mod_megaco/mod_megaco.c | 1 + src/mod/endpoints/mod_megaco/mod_megaco.h | 2 +- 3 files changed, 94 insertions(+), 42 deletions(-) diff --git a/src/mod/endpoints/mod_megaco/megaco_cli.c b/src/mod/endpoints/mod_megaco/megaco_cli.c index e7d0794c49..0bdb334754 100644 --- a/src/mod/endpoints/mod_megaco/megaco_cli.c +++ b/src/mod/endpoints/mod_megaco/megaco_cli.c @@ -12,8 +12,9 @@ /******************************************************************************/ /* FUNCTION PROTOTYPES ********************************************************/ -switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char* profilename); -switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const char* profilename); +switch_status_t megaco_profile_status(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg); +switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg); +switch_status_t megaco_profile_peer_xmlstatus(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg); void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm); /******************************************************************************/ @@ -22,9 +23,10 @@ void get_peer_xml_buffer(char* prntBuf, MgPeerSta* cfm); switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stream) { - int argc; - char *argv[10]; - char *dup = NULL; + int argc; + char* argv[10]; + char* dup = NULL; + megaco_profile_t* profile = NULL; if (zstr(cmd)) { goto usage; @@ -37,15 +39,17 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre goto usage; } - /**********************************************************************************/ +/**********************************************************************************/ if (!strcmp(argv[0], "profile")) { if (zstr(argv[1]) || zstr(argv[2])) { goto usage; } - /**********************************************************************************/ +/**********************************************************************************/ + profile = megaco_profile_locate(argv[1]); + +/**********************************************************************************/ if (!strcmp(argv[2], "start")) { - /**********************************************************************************/ - megaco_profile_t *profile = megaco_profile_locate(argv[1]); +/**********************************************************************************/ if (profile) { megaco_profile_release(profile); stream->write_function(stream, "-ERR Profile %s is already started\n", argv[2]); @@ -53,10 +57,9 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre megaco_profile_start(argv[1]); stream->write_function(stream, "+OK\n"); } - /**********************************************************************************/ +/**********************************************************************************/ } else if (!strcmp(argv[2], "stop")) { - /**********************************************************************************/ - megaco_profile_t *profile = megaco_profile_locate(argv[1]); +/**********************************************************************************/ if (profile) { megaco_profile_release(profile); megaco_profile_destroy(&profile); @@ -64,27 +67,36 @@ switch_status_t mg_process_cli_cmd(const char *cmd, switch_stream_handle_t *stre } else { stream->write_function(stream, "-ERR No such profile\n"); } - /**********************************************************************************/ +/**********************************************************************************/ }else if(!strcmp(argv[2], "status")) { - /**********************************************************************************/ - megaco_profile_t *profile = megaco_profile_locate(argv[1]); +/**********************************************************************************/ if (profile) { - megaco_profile_status(stream, profile->name); + megaco_profile_release(profile); + megaco_profile_status(stream, profile); } else { stream->write_function(stream, "-ERR No such profile\n"); } - /**********************************************************************************/ +/**********************************************************************************/ }else if(!strcmp(argv[2], "xmlstatus")) { - /**********************************************************************************/ - megaco_profile_t *profile = megaco_profile_locate(argv[1]); +/**********************************************************************************/ if (profile) { - megaco_profile_xmlstatus(stream, profile->name); + megaco_profile_release(profile); + megaco_profile_xmlstatus(stream, profile); } else { stream->write_function(stream, "-ERR No such profile\n"); } - /**********************************************************************************/ +/**********************************************************************************/ + }else if(!strcmp(argv[2], "peerxmlstatus")) { +/**********************************************************************************/ + if (profile) { + megaco_profile_release(profile); + megaco_profile_peer_xmlstatus(stream, profile); + } else { + stream->write_function(stream, "-ERR No such profile\n"); + } +/**********************************************************************************/ }else { - /**********************************************************************************/ +/**********************************************************************************/ goto usage; } } @@ -100,7 +112,7 @@ done: } /******************************************************************************/ -switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const char* profilename) +switch_status_t megaco_profile_peer_xmlstatus(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg) { int idx = 0x00; int len = 0x00; @@ -110,23 +122,69 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c int i = 0x00; char *asciiAddr; CmInetIpAddr ip; - megaco_profile_t* mg_cfg = NULL; mg_peer_profile_t* mg_peer = NULL; - switch_assert(profilename); + switch_assert(mg_cfg); memset((U8 *)&cfm, 0, sizeof(cfm)); memset((char *)&prntBuf, 0, sizeof(prntBuf)); - mg_cfg = megaco_profile_locate(profilename); - if(!mg_cfg){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); - return SWITCH_STATUS_FALSE; - } mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); if(!mg_peer){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],profilename); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],mg_cfg->name); + return SWITCH_STATUS_FALSE; + } + + + idx = mg_cfg->idx; + + len = len + sprintf(&prntBuf[0] + len,"%s\n",xmlhdr); + + len = len + sprintf(&prntBuf[0] + len,"\n"); + len = len + sprintf(&prntBuf[0] + len,"%s\n",mg_cfg->peer_list[0]); + + /* TODO - as of now supporting only one peer .. need to add logic to iterate through all the peers associated with this profile..*/ + + /* send request to MEGACO Trillium stack to get peer information*/ + sng_mgco_mg_get_status(STGCPENT, &cfm, mg_cfg, mg_peer); + + ip = ntohl(cfm.t.ssta.s.mgPeerSta.peerAddrTbl.netAddr[i].u.ipv4NetAddr); + cmInetNtoa(ip, &asciiAddr); + len = len + sprintf(prntBuf+len, "%s\n",asciiAddr); + + len = len + sprintf(prntBuf+len, "%s\n",PRNT_MG_PEER_STATE(cfm.t.ssta.s.mgPeerSta.peerState)); + + len = len + sprintf(&prntBuf[0] + len,"\n"); + + stream->write_function(stream, "\n%s\n",&prntBuf[0]); + + return SWITCH_STATUS_SUCCESS; +} + +/******************************************************************************/ + +switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg) +{ + int idx = 0x00; + int len = 0x00; + MgMngmt cfm; + char* xmlhdr = ""; + char prntBuf[3048]; + int i = 0x00; + char *asciiAddr; + CmInetIpAddr ip; + mg_peer_profile_t* mg_peer = NULL; + + switch_assert(mg_cfg); + + memset((U8 *)&cfm, 0, sizeof(cfm)); + memset((char *)&prntBuf, 0, sizeof(prntBuf)); + + mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); + + if(!mg_peer){ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],mg_cfg->name); return SWITCH_STATUS_FALSE; } @@ -137,7 +195,6 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c len = len + sprintf(&prntBuf[0] + len,"\n"); len = len + sprintf(&prntBuf[0] + len,"%s\n",mg_cfg->name); - len = len + sprintf(&prntBuf[0] + len,"%s\n",profilename); /****************************************************************************************************************/ /* Print Peer Information ***************************************************************************************/ @@ -254,29 +311,23 @@ switch_status_t megaco_profile_xmlstatus(switch_stream_handle_t *stream, const c } /****************************************************************************************************************/ -switch_status_t megaco_profile_status(switch_stream_handle_t *stream, const char* profilename) +switch_status_t megaco_profile_status(switch_stream_handle_t *stream, megaco_profile_t* mg_cfg) { int idx = 0x00; int len = 0x00; MgMngmt cfm; char prntBuf[1024]; - megaco_profile_t* mg_cfg = NULL; mg_peer_profile_t* mg_peer = NULL; - switch_assert(profilename); + switch_assert(mg_cfg); memset((U8 *)&cfm, 0, sizeof(cfm)); memset((char *)&prntBuf, 0, sizeof(prntBuf)); - mg_cfg = megaco_profile_locate(profilename); - if(!mg_cfg){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG configuration found against profilename[%s]\n",profilename); - return SWITCH_STATUS_FALSE; - } mg_peer = megaco_peer_profile_locate(mg_cfg->peer_list[0]); if(!mg_peer){ - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],profilename); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR," No MG peer configuration found for peername[%s] against profilename[%s]\n",mg_cfg->peer_list[0],mg_cfg->name); return SWITCH_STATUS_FALSE; } diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.c b/src/mod/endpoints/mod_megaco/mod_megaco.c index e966c76095..722e023ec6 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.c +++ b/src/mod/endpoints/mod_megaco/mod_megaco.c @@ -72,6 +72,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_megaco_load) switch_console_set_complete("add megaco profile ::megaco::list_profiles stop"); switch_console_set_complete("add megaco profile ::megaco::list_profiles status"); switch_console_set_complete("add megaco profile ::megaco::list_profiles xmlstatus"); + switch_console_set_complete("add megaco profile ::megaco::list_profiles peerxmlstatus"); switch_console_add_complete_func("::megaco::list_profiles", list_profiles); diff --git a/src/mod/endpoints/mod_megaco/mod_megaco.h b/src/mod/endpoints/mod_megaco/mod_megaco.h index 444639677c..9a30bc01df 100644 --- a/src/mod/endpoints/mod_megaco/mod_megaco.h +++ b/src/mod/endpoints/mod_megaco/mod_megaco.h @@ -15,7 +15,7 @@ #define MG_MAX_PEERS 5 -#define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop] [status] [xmlstatus]" +#define MEGACO_FUNCTION_SYNTAX "profile [name] [start | stop] [status] [xmlstatus] [peerxmlstatus]" struct megaco_globals { switch_memory_pool_t *pool;