]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
partial implementation of channel list via snmp
authorDaniel Swarbrick <daniel@seventhsignal.de>
Fri, 28 Jan 2011 21:32:14 +0000 (22:32 +0100)
committerDaniel Swarbrick <daniel@seventhsignal.de>
Fri, 28 Jan 2011 21:32:26 +0000 (22:32 +0100)
src/mod/event_handlers/mod_snmp/FREESWITCH-MIB
src/mod/event_handlers/mod_snmp/mod_snmp.c
src/mod/event_handlers/mod_snmp/subagent.c
src/mod/event_handlers/mod_snmp/subagent.h

index 9584c8bac38a403cb529b028c0508bf17727b358..11c3999c6f12454c932180af1c466629ae7bf99d 100644 (file)
@@ -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
index 56c7be1ef630a044ed3dd884ee3dba1664bf4074..d415d4fe1ce7cf4ba23b376c2d2307fa0c5a6788 100644 (file)
@@ -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;
index bad3dc6ff2b8d4a70aa250c6d980958b494f3a85..7b9faa752b6981f6471bd125bde452a02252887d 100644 (file)
 #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:
index 33153780b51dfd17ad821fa8515fbf4b06c4f486..0070b2c3af1c9d33c5459aee9dc6d22e66e48716 100644 (file)
 #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 */