diff --git a/.gitignore b/.gitignore
index 304b42c1f9..c53d07d8a9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,6 +33,12 @@
*.ilk
*.bsc
*.pch
+*.tar
+*.gz
+*.tgz
+*.xz
+*.bz2
+*.tbz2
core.*
/Path
/w32/Library/lastversion
@@ -79,7 +85,6 @@ configure.lineno
/scripts/fsxs
/scripts/gentls_cert
/a.out.dSYM
-/freeswitch-sounds-*
src/mod/applications/mod_easyroute/Makefile
src/mod/applications/mod_lcr/Makefile
src/mod/applications/mod_nibblebill/Makefile
diff --git a/conf/freeswitch.xml b/conf/freeswitch.xml
index 80e7728e0d..6914128e55 100644
--- a/conf/freeswitch.xml
+++ b/conf/freeswitch.xml
@@ -61,7 +61,4 @@
-
-
-
diff --git a/libs/freetdm/msvc/freetdm.2010.vcxproj b/libs/freetdm/msvc/freetdm.2010.vcxproj
index 71eb6dbf22..aecb9ef79c 100644
--- a/libs/freetdm/msvc/freetdm.2010.vcxproj
+++ b/libs/freetdm/msvc/freetdm.2010.vcxproj
@@ -188,6 +188,7 @@
+
@@ -209,6 +210,7 @@
+
diff --git a/libs/freetdm/msvc/freetdm.2010.vcxproj.filters b/libs/freetdm/msvc/freetdm.2010.vcxproj.filters
index ed642baf3d..e6dc40d372 100644
--- a/libs/freetdm/msvc/freetdm.2010.vcxproj.filters
+++ b/libs/freetdm/msvc/freetdm.2010.vcxproj.filters
@@ -71,6 +71,9 @@
Header Files
+
+ Header Files
+
@@ -124,5 +127,8 @@
Source Files
+
+ Source Files
+
\ No newline at end of file
diff --git a/src/mod/endpoints/mod_gsmopen/.gitignore b/src/mod/endpoints/mod_gsmopen/.gitignore
index 9fdeeb1412..fe8dc68bd5 100644
--- a/src/mod/endpoints/mod_gsmopen/.gitignore
+++ b/src/mod/endpoints/mod_gsmopen/.gitignore
@@ -1,2 +1,4 @@
!/gsmlib/gsmlib-*/aclocal.m4
!/gsmlib/gsmlib-*/configure
+!/gsmlib/gsmlib-1.10.tar.gz
+!/gsmlib/gsmlib_1.10-12ubuntu1.diff.gz
diff --git a/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB b/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB
index 9584c8bac3..11c3999c6f 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 56c7be1ef6..d415d4fe1c 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 2da9ebeda6..7b9faa752b 100644
--- a/src/mod/event_handlers/mod_snmp/subagent.c
+++ b/src/mod/event_handlers/mod_snmp/subagent.c
@@ -36,16 +36,105 @@
#include
#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)
+{
+ uint32_t *count = (uint32_t *) pArg;
+ *count = atoi(argv[0]);
+ return 0;
+}
+
+
+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;
+}
+
+
+void channelList_free(netsnmp_cache *cache, void *magic)
+{
+ 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", "Initializing\n"));
+ 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)));
}
@@ -89,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:
@@ -109,17 +198,24 @@ int handle_systemStats(netsnmp_mib_handler *handler, netsnmp_handler_registratio
snmp_set_var_typed_value(requests->requestvb, ASN_GAUGE, (u_char *) &int_val, sizeof(int_val));
break;
case SS_MAX_SESSIONS:
- switch_core_session_ctl(SCSC_MAX_SESSIONS, &int_val);;
+ switch_core_session_ctl(SCSC_MAX_SESSIONS, &int_val);
snmp_set_var_typed_value(requests->requestvb, ASN_GAUGE, (u_char *) &int_val, sizeof(int_val));
break;
case SS_CURRENT_CALLS:
- /*
- * This is zero for now, since there is no convenient way to get total call
- * count (not to be confused with session count), without touching the
- * database.
- */
- int_val = 0;
+ {
+ switch_cache_db_handle_t *dbh;
+ char sql[1024] = "", hostname[256] = "";
+
+ if (switch_core_db_handle(&dbh) != SWITCH_STATUS_SUCCESS) {
+ return SNMP_ERR_GENERR;
+ }
+
+ gethostname(hostname, sizeof(hostname));
+ sprintf(sql, "SELECT COUNT(*) FROM calls WHERE hostname='%s'", hostname);
+ switch_cache_db_execute_sql_callback(dbh, sql, sql_count_callback, &int_val, NULL);
snmp_set_var_typed_value(requests->requestvb, ASN_GAUGE, (u_char *) &int_val, sizeof(int_val));
+ switch_cache_db_release_db_handle(&dbh);
+ }
break;
case SS_SESSIONS_PER_SECOND:
switch_core_session_ctl(SCSC_LAST_SPS, &int_val);
@@ -145,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 33153780b5..0070b2c3af 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 */