[Freeswitch-trunk] [GIT] branch master updated. git2svn-syncpoint-master-1650-gbe3483b

git at svn.freeswitch.org git at svn.freeswitch.org
Sat Jan 29 00:42:29 MSK 2011


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "".

The branch, master has been updated
       via  be3483b924a674e4c4f0f05734e7e4917634f3ca (commit)
       via  068d36a5c95c5a4143f423b7c36cbe6d5cea36d5 (commit)
      from  e6e4bcea734fbfb54b901ff8b1107ddfe76b7010 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit be3483b924a674e4c4f0f05734e7e4917634f3ca
Merge: e6e4bce 068d36a
Author: Raymond Chandler <intralanman at gmail.com>
Date:   Fri Jan 28 16:42:20 2011 -0500

    Merge branch 'master' of fs-git:freeswitch


commit 068d36a5c95c5a4143f423b7c36cbe6d5cea36d5
Author: Daniel Swarbrick <daniel at seventhsignal.de>
Date:   Fri Jan 28 22:32:14 2011 +0100

    partial implementation of channel list via snmp

diff --git a/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB b/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB
index 9584c8b..11c3999 100644
--- a/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB
+++ b/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB
@@ -107,4 +107,88 @@ maxSessionsPerSecond OBJECT-TYPE
         "Maximum permissible sessions per second"
     ::= { systemStats 7 }
 
+
+ChannelEntry ::= SEQUENCE {
+    chanUUID        DisplayString,
+    chanDirection   DisplayString,
+    chanCreated     DisplayString,
+    chanName        DisplayString,
+    chanState       DisplayString,
+    chanCIDName     DisplayString,
+    chanCIDNum      DisplayString
+}
+
+channelList OBJECT-TYPE
+    SYNTAX      SEQUENCE OF ChannelEntry
+    MAX-ACCESS  not-accessible
+    STATUS      current
+    DESCRIPTION
+        "A table containing a list of active channels"
+    ::= { core 9 }
+
+channelEntry OBJECT-TYPE
+    SYNTAX      ChannelEntry
+    MAX-ACCESS  not-accessible
+    STATUS      current
+    DESCRIPTION
+        "A channel entry"
+    INDEX { chanIndex }
+    ::= { channelList 1 }
+
+chanUUID OBJECT-TYPE
+    SYNTAX      DisplayString
+    MAX-ACCESS  read-only
+    STATUS      current
+    DESCRIPTION
+        "The channel UUID."
+    ::= { channelEntry 1 }
+
+chanDirection OBJECT-TYPE
+    SYNTAX      DisplayString
+    MAX-ACCESS  read-only
+    STATUS      current
+    DESCRIPTION
+        "The channel direction."
+    ::= { channelEntry 2 }
+
+chanCreated OBJECT-TYPE
+    SYNTAX      DisplayString
+    MAX-ACCESS  read-only
+    STATUS      current
+    DESCRIPTION
+        "Channel creation timestamp."
+    ::= { channelEntry 3 }
+
+chanName OBJECT-TYPE
+    SYNTAX      DisplayString
+    MAX-ACCESS  read-only
+    STATUS      current
+    DESCRIPTION
+        "The channel name."
+    ::= { channelEntry 4 }
+
+chanState OBJECT-TYPE
+    SYNTAX      DisplayString
+    MAX-ACCESS  read-only
+    STATUS      current
+    DESCRIPTION
+        "The channel state."
+    ::= { channelEntry 5 }
+
+chanCIDName OBJECT-TYPE
+    SYNTAX      DisplayString
+    MAX-ACCESS  read-only
+    STATUS      current
+    DESCRIPTION
+        "The channel caller ID name."
+    ::= { channelEntry 6 }
+
+chanCIDNum OBJECT-TYPE
+    SYNTAX      DisplayString
+    MAX-ACCESS  read-only
+    STATUS      current
+    DESCRIPTION
+        "The channel caller ID number."
+    ::= { channelEntry 7 }
+
 END
diff --git a/src/mod/event_handlers/mod_snmp/mod_snmp.c b/src/mod/event_handlers/mod_snmp/mod_snmp.c
index 56c7be1..d415d4f 100644
--- a/src/mod/event_handlers/mod_snmp/mod_snmp.c
+++ b/src/mod/event_handlers/mod_snmp/mod_snmp.c
@@ -109,7 +109,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_snmp_load)
 	 */
 	netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_AGENTX_PING_INTERVAL, 2);
 
-	init_subagent();  
+	init_subagent(pool);
 	init_snmp("mod_snmp");
 
 	return status;
diff --git a/src/mod/event_handlers/mod_snmp/subagent.c b/src/mod/event_handlers/mod_snmp/subagent.c
index bad3dc6..7b9faa7 100644
--- a/src/mod/event_handlers/mod_snmp/subagent.c
+++ b/src/mod/event_handlers/mod_snmp/subagent.c
@@ -36,27 +36,108 @@
 #include <net-snmp/agent/net-snmp-agent-includes.h>
 #include "subagent.h"
 
+netsnmp_table_registration_info *ch_table_info;
+netsnmp_tdata *ch_table;
+netsnmp_handler_registration *ch_reginfo;
+uint32_t idx;
 
-void init_subagent(void)
+
+static int sql_count_callback(void *pArg, int argc, char **argv, char **columnNames)
 {
-	static oid identity_oid[] = { 1,3,6,1,4,1,27880,1,1 };
-	static oid systemStats_oid[] = { 1,3,6,1,4,1,27880,1,2 };
+	uint32_t *count = (uint32_t *) pArg;
+	*count = atoi(argv[0]);
+	return 0;
+}
 
-	DEBUGMSGTL(("init_subagent", "Initializing\n"));
 
-	netsnmp_register_scalar_group(netsnmp_create_handler_registration("identity", handle_identity, identity_oid, OID_LENGTH(identity_oid), HANDLER_CAN_RONLY), 1, 2);
-	netsnmp_register_scalar_group(netsnmp_create_handler_registration("systemStats", handle_systemStats, systemStats_oid, OID_LENGTH(systemStats_oid), HANDLER_CAN_RONLY), 1, 7);
+static int channelList_callback(void *pArg, int argc, char **argv, char **columnNames)
+{
+	chan_entry_t *entry;
+	netsnmp_tdata_row *row;
+
+	switch_zmalloc(entry, sizeof(chan_entry_t));
+	if (!entry)
+		return 0;
+
+	row = netsnmp_tdata_create_row();
+	if (!row) {
+		switch_safe_free(entry);
+		return 0;
+	}
+	row->data = entry;
+
+	entry->idx = idx++;
+	strncpy(entry->uuid, argv[0], sizeof(entry->uuid));
+	strncpy(entry->direction, argv[1], sizeof(entry->direction));
+	strncpy(entry->created, argv[2], sizeof(entry->created));
+	strncpy(entry->name, argv[4], sizeof(entry->name));
+	strncpy(entry->state, argv[5], sizeof(entry->state));
+	strncpy(entry->cid_name, argv[6], sizeof(entry->cid_name));
+	strncpy(entry->cid_num, argv[7], sizeof(entry->cid_num));
+
+	netsnmp_tdata_row_add_index(row, ASN_INTEGER, &entry->idx, sizeof(entry->idx));
+	netsnmp_tdata_add_row(ch_table, row);
+	return 0;
 }
 
 
-static int sql_count_callback(void *pArg, int argc, char **argv, char **columnNames)
+void channelList_free(netsnmp_cache *cache, void *magic)
 {
-	uint32_t *count = (uint32_t *) pArg;
-	*count = atoi(argv[0]);
+	netsnmp_tdata_row *row = netsnmp_tdata_row_first(ch_table);
+
+	/* Delete table rows one by one */
+	while (row) {
+		netsnmp_tdata_remove_and_delete_row(ch_table, row);
+		switch_safe_free(row->data);
+		row = netsnmp_tdata_row_first(ch_table);
+	}
+}
+
+
+int channelList_load(netsnmp_cache *cache, void *vmagic)
+{
+	switch_cache_db_handle_t *dbh;
+	char sql[1024] = "", hostname[256] = "";
+
+	channelList_free(cache, NULL);
+
+	if (switch_core_db_handle(&dbh) != SWITCH_STATUS_SUCCESS) {
+		return 0;
+	}
+
+	idx = 1;
+	gethostname(hostname, sizeof(hostname));
+	sprintf(sql, "SELECT * FROM channels WHERE hostname='%s' ORDER BY created_epoch", hostname);
+	switch_cache_db_execute_sql_callback(dbh, sql, channelList_callback, NULL, NULL);
+
+	switch_cache_db_release_db_handle(&dbh);
+
 	return 0;
 }
 
 
+void init_subagent(switch_memory_pool_t *pool)
+{
+	static oid identity_oid[] = { 1,3,6,1,4,1,27880,1,1 };
+	static oid systemStats_oid[] = { 1,3,6,1,4,1,27880,1,2 };
+	static oid channelList_oid[] = { 1,3,6,1,4,1,27880,1,9 };
+
+	DEBUGMSGTL(("init_subagent", "mod_snmp subagent initializing\n"));
+
+	netsnmp_register_scalar_group(netsnmp_create_handler_registration("identity", handle_identity, identity_oid, OID_LENGTH(identity_oid), HANDLER_CAN_RONLY), 1, 2);
+	netsnmp_register_scalar_group(netsnmp_create_handler_registration("systemStats", handle_systemStats, systemStats_oid, OID_LENGTH(systemStats_oid), HANDLER_CAN_RONLY), 1, 7);
+
+	ch_table_info = switch_core_alloc(pool, sizeof(netsnmp_table_registration_info));
+	netsnmp_table_helper_add_index(ch_table_info, ASN_INTEGER);
+	ch_table_info->min_column = 1;
+	ch_table_info->max_column = 7;
+	ch_table = netsnmp_tdata_create_table("channelList", 0);
+	ch_reginfo = netsnmp_create_handler_registration("channelList", handle_channelList, channelList_oid, OID_LENGTH(channelList_oid), HANDLER_CAN_RONLY);
+	netsnmp_tdata_register(ch_reginfo, ch_table, ch_table_info);
+	netsnmp_inject_handler(ch_reginfo, netsnmp_get_cache_handler(5, channelList_load, channelList_free, channelList_oid, OID_LENGTH(channelList_oid)));
+}
+
+
 int handle_identity(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)
 {
 	netsnmp_request_info *request = NULL;
@@ -97,7 +178,7 @@ int handle_systemStats(netsnmp_mib_handler *handler, netsnmp_handler_registratio
 	netsnmp_request_info *request = NULL;
 	oid subid;
 	switch_time_t uptime;
-	uint32_t int_val;
+	uint32_t int_val = 0;
 
 	switch(reqinfo->mode) {
 	case MODE_GET:
@@ -160,6 +241,55 @@ int handle_systemStats(netsnmp_mib_handler *handler, netsnmp_handler_registratio
 }
 
 
+int handle_channelList(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)
+{
+	netsnmp_request_info *request;
+	netsnmp_table_request_info *table_info;
+	chan_entry_t *entry;
+
+	switch (reqinfo->mode) {
+	case MODE_GET:
+		for (request = requests; request; request = request->next) {
+			table_info = netsnmp_extract_table_info(request);
+			entry = (chan_entry_t *) netsnmp_tdata_extract_entry(request);
+
+			switch (table_info->colnum) {
+			case CH_UUID:
+				snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->uuid, strlen(entry->uuid));
+				break;
+			case CH_DIRECTION:
+				snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->direction, strlen(entry->direction));
+				break;
+			case CH_CREATED:
+				snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->created, strlen(entry->created));
+				break;
+			case CH_NAME:
+				snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->name, strlen(entry->name));
+				break;
+			case CH_STATE:
+				snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->state, strlen(entry->state));
+				break;
+			case CH_CID_NAME:
+				snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->cid_name, strlen(entry->cid_name));
+				break;
+			case CH_CID_NUM:
+				snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, (u_char *) entry->cid_num, strlen(entry->cid_num));
+				break;
+			default:
+				snmp_log(LOG_WARNING, "Unregistered OID-suffix requested (%d)\n", table_info->colnum);
+				netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHOBJECT);
+			}
+		}
+		break;
+	default:
+		/* we should never get here, so this is a really bad error */
+		snmp_log(LOG_ERR, "Unknown mode (%d) in handle_foo\n", reqinfo->mode );
+		return SNMP_ERR_GENERR;
+	}
+
+	return SNMP_ERR_NOERROR;
+}
+
 
 /* For Emacs:
  * Local Variables:
diff --git a/src/mod/event_handlers/mod_snmp/subagent.h b/src/mod/event_handlers/mod_snmp/subagent.h
index 3315378..0070b2c 100644
--- a/src/mod/event_handlers/mod_snmp/subagent.h
+++ b/src/mod/event_handlers/mod_snmp/subagent.h
@@ -14,9 +14,29 @@
 #define SS_SESSIONS_PER_SECOND		6
 #define SS_MAX_SESSIONS_PER_SECOND	7
 
+/* .1.3.6.1.4.1.27880.1.9 */
+#define CH_UUID				1
+#define CH_DIRECTION			2
+#define CH_CREATED			3
+#define CH_NAME				4
+#define CH_STATE			5
+#define CH_CID_NAME			6
+#define CH_CID_NUM			7
 
-void init_subagent(void);
+typedef struct {
+	uint32_t idx;
+	char uuid[38];
+	char direction[32];
+	char created[128];
+	char name[1024];
+	char state[64];
+	char cid_name[1024];
+	char cid_num[256];
+} chan_entry_t;
+
+void init_subagent(switch_memory_pool_t *pool);
 Netsnmp_Node_Handler handle_identity;
 Netsnmp_Node_Handler handle_systemStats;
+Netsnmp_Node_Handler handle_channelList;
 
 #endif /* subagent_H */

-----------------------------------------------------------------------

Summary of changes:
 src/mod/event_handlers/mod_snmp/FREESWITCH-MIB |   84 +++++++++++++
 src/mod/event_handlers/mod_snmp/mod_snmp.c     |    2 +-
 src/mod/event_handlers/mod_snmp/subagent.c     |  150 ++++++++++++++++++++++--
 src/mod/event_handlers/mod_snmp/subagent.h     |   22 ++++-
 4 files changed, 246 insertions(+), 12 deletions(-)


hooks/post-receive
-- 




More information about the Freeswitch-trunk mailing list