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 */