]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add homer capture hooks to mod_sofia
authorAnthony Minessale <anthm@freeswitch.org>
Sun, 31 Jul 2011 23:36:23 +0000 (18:36 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Sun, 31 Jul 2011 23:36:23 +0000 (18:36 -0500)
conf/autoload_configs/sofia.conf.xml
conf/sip_profiles/external.xml
conf/sip_profiles/internal.xml
src/mod/endpoints/mod_sofia/mod_sofia.c
src/mod/endpoints/mod_sofia/mod_sofia.h
src/mod/endpoints/mod_sofia/sofia.c
src/mod/endpoints/mod_sofia/sofia_glue.c

index 24252d08ce3dcc83ff34959833068593501a9e3e..a5e86143223fd7df1ab89a738cd6b8752c18ea8c 100644 (file)
@@ -4,6 +4,7 @@
     <param name="log-level" value="0"/>
     <!-- <param name="auto-restart" value="false"/> -->
     <param name="debug-presence" value="0"/>
+    <!-- <param name="capture-server" value="udp:homer.domain.com:5060"/> -->
   </global_settings>
 
   <!--
index 8f1076364cac461a12523c33bc081cc2ca6cff9f..1d7bae9a7d0aa546afc644699fb97636602f1e57 100644 (file)
@@ -21,6 +21,7 @@
        <!-- If you want FreeSWITCH to shutdown if this profile fails to load, uncomment the next line. -->
        <!-- <param name="shutdown-on-fail" value="true"/> -->
     <param name="sip-trace" value="no"/>
+    <param name="sip-capture" value="no"/>        
     <param name="rfc2833-pt" value="101"/>
     <param name="sip-port" value="$${external_sip_port}"/>
     <param name="dialplan" value="XML"/>
index 2dd094a656017f34c42abce80ec71edd0c5cf932..3b19b6ecc6c938002cf38b6cfc77ea4a67aa4313 100644 (file)
@@ -42,7 +42,8 @@
        <!-- If you want FreeSWITCH to shutdown if this profile fails to load, uncomment the next line. -->
        <!-- <param name="shutdown-on-fail" value="true"/> -->
     <param name="sip-trace" value="no"/>
-
+    <param name="sip-capture" value="no"/>
+    
 
     <!-- Don't be picky about negotiated DTMF just always offer 2833 and accept both 2833 and INFO -->
     <!--<param name="liberal-dtmf" value="true"/>-->
index 24f2828d35c74594eeeebef06ba4e296d1a9ca5e..e540ee783078ecf05bb725637361d3061e267566 100644 (file)
@@ -3434,6 +3434,17 @@ static switch_status_t cmd_profile(char **argv, int argc, switch_stream_handle_t
                goto done;
        }
 
+        if (!strcasecmp(argv[1], "capture")) {
+               if (argc > 2) {
+                       int value = switch_true(argv[2]);
+                       nua_set_params(profile->nua, TPTAG_CAPT(value ? mod_sofia_globals.capture_server : NULL), TAG_END());
+                       stream->write_function(stream, "%s sip capturing on %s", value ? "Enabled" : "Disabled", profile->name);
+               } else {
+                       stream->write_function(stream, "Usage: sofia profile <name> capture <on/off>\n");
+               }
+               goto done;
+        }
+
        if (!strcasecmp(argv[1], "watchdog")) {
                if (argc > 2) {
                        int value = switch_true(argv[2]);
@@ -3898,6 +3909,7 @@ SWITCH_STANDARD_API(sofia_function)
        static const char usage_string[] = "USAGE:\n"
                "--------------------------------------------------------------------------------\n"
                "sofia global siptrace <on|off>\n"
+               "sofia        capture  <on|off>\n"
                "             watchdog <on|off>\n\n"
                "sofia profile <name> [start | stop | restart | rescan]\n"
                "                     flush_inbound_reg [<call_id> | <[user]@domain>] [reboot]\n"
@@ -3906,6 +3918,7 @@ SWITCH_STANDARD_API(sofia_function)
                "                     killgw <gateway name>\n"
                "                     [stun-auto-disable | stun-enabled] [true | false]]\n"
                "                     siptrace <on|off>\n"
+               "                     capture  <on|off>\n"
                "                     watchdog <on|off>\n\n"
                "sofia <status|xmlstatus> profile <name> [reg <contact str>] | [pres <pres str>] | [user <user@domain>]\n"
                "sofia <status|xmlstatus> gateway <name>\n\n"
@@ -3965,6 +3978,7 @@ SWITCH_STANDARD_API(sofia_function)
                goto done;
        } else if (!strcasecmp(argv[0], "global")) {
                int ston = -1;
+               int cton = -1;
                int wdon = -1;
 
                if (argc > 1) {
@@ -4001,6 +4015,12 @@ SWITCH_STANDARD_API(sofia_function)
                                }
                        }
 
+                       if (!strcasecmp(argv[1], "capture")) {
+                               if (argc > 2) {
+                                        cton = switch_true(argv[2]);
+                                }
+                        }
+
                        if (!strcasecmp(argv[1], "watchdog")) {
                                if (argc > 2) {
                                        wdon = switch_true(argv[2]);
@@ -4011,11 +4031,14 @@ SWITCH_STANDARD_API(sofia_function)
                if (ston != -1) {
                        sofia_glue_global_siptrace(ston);
                        stream->write_function(stream, "+OK Global siptrace %s", ston ? "on" : "off");
+               } else if (cton != -1) {
+                        sofia_glue_global_capture(cton);
+                        stream->write_function(stream, "+OK Global capture %s", cton ? "on" : "off");
                } else if (wdon != -1) {
                        sofia_glue_global_watchdog(wdon);
                        stream->write_function(stream, "+OK Global watchdog %s", wdon ? "on" : "off");
                } else {
-                       stream->write_function(stream, "-ERR Usage: siptrace <on|off>|watchdog <on|off>|debug <sla|presence|none");
+                       stream->write_function(stream, "-ERR Usage: siptrace <on|off>|capture <on|off>|watchdog <on|off>|debug <sla|presence|none");
                }
                
                goto done;
@@ -5208,6 +5231,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load)
        switch_console_set_complete("add sofia tracelevel ::[console:alert:crit:err:warning:notice:info:debug");
 
        switch_console_set_complete("add sofia global siptrace ::[on:off");
+       switch_console_set_complete("add sofia global capture  ::[on:off");
        switch_console_set_complete("add sofia global watchdog ::[on:off");
 
        switch_console_set_complete("add sofia global debug ::[presence:sla:none");
@@ -5228,6 +5252,8 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load)
        switch_console_set_complete("add sofia profile ::sofia::list_profiles killgw ::sofia::list_profile_gateway");
        switch_console_set_complete("add sofia profile ::sofia::list_profiles siptrace on");
        switch_console_set_complete("add sofia profile ::sofia::list_profiles siptrace off");
+       switch_console_set_complete("add sofia profile ::sofia::list_profiles capture on");
+       switch_console_set_complete("add sofia profile ::sofia::list_profiles capture off");
        switch_console_set_complete("add sofia profile ::sofia::list_profiles watchdog on");
        switch_console_set_complete("add sofia profile ::sofia::list_profiles watchdog off");
 
index 795c7b5e59fde482cd0ceec2d460d85b065c40fe..0e8b727bdfce6da13f7679d293be98f0b8569b9e 100644 (file)
@@ -315,6 +315,7 @@ typedef enum {
        TFLAG_NOREPLY,
        TFLAG_LIBERAL_DTMF,
        TFLAG_GOT_ACK,
+       TFLAG_CAPTURE,
        /* No new flags below this line */
        TFLAG_MAX
 } TFLAGS;
@@ -354,6 +355,7 @@ struct mod_sofia_globals {
        int auto_restart;
        int auto_nat;
        int tracelevel;
+       char *capture_server;   
        int rewrite_multicasted_fs_path;
 };
 extern struct mod_sofia_globals mod_sofia_globals;
@@ -1115,6 +1117,7 @@ void sofia_glue_tech_simplify(private_object_t *tech_pvt);
 switch_console_callback_match_t *sofia_reg_find_reg_url_multi(sofia_profile_t *profile, const char *user, const char *host);
 switch_bool_t sofia_glue_profile_exists(const char *key);
 void sofia_glue_global_siptrace(switch_bool_t on);
+void sofia_glue_global_capture(switch_bool_t on);
 void sofia_glue_global_watchdog(switch_bool_t on);
 void sofia_glue_proxy_codec(switch_core_session_t *session, const char *r_sdp);
 switch_status_t sofia_glue_sdp_map(const char *r_sdp, switch_event_t **fmtp, switch_event_t **pt);
index ea38ac4133ff85f4ee55d9e7c241090764fe9f8b..5c37fd1808985ae9141cd750ef90729a45dc40e4 100644 (file)
@@ -1793,6 +1793,7 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void
                                                          NTATAG_SERVER_RPORT(profile->server_rport_level),
                                                          NTATAG_CLIENT_RPORT(profile->client_rport_level),
                                                          TPTAG_LOG(sofia_test_flag(profile, TFLAG_TPORT_LOG)),
+                                                         TPTAG_CAPT(sofia_test_flag(profile, TFLAG_CAPTURE) ? mod_sofia_globals.capture_server : NULL),
                                                          TAG_IF(sofia_test_pflag(profile, PFLAG_SIPCOMPACT),
                                                                         NTATAG_SIPFLAGS(MSG_DO_COMPACT)),
                                                          TAG_IF(profile->timer_t1, NTATAG_SIP_T1(profile->timer_t1)),
@@ -2713,6 +2714,9 @@ switch_status_t reconfig_sofia(sofia_profile_t *profile)
                                        mod_sofia_globals.rewrite_multicasted_fs_path = SWITCH_FALSE;
                                }
                        }
+                       else if (!strcasecmp(var, "capture-server")) {
+                                 mod_sofia_globals.capture_server = switch_core_strdup(mod_sofia_globals.pool, val);
+                        }
                }
        }
 
@@ -2791,6 +2795,13 @@ switch_status_t reconfig_sofia(sofia_profile_t *profile)
                                                        sofia_clear_flag(profile, TFLAG_TPORT_LOG);
                                                }
                                                nua_set_params(profile->nua, TPTAG_LOG(sofia_test_flag(profile, TFLAG_TPORT_LOG)), TAG_END());
+                                        } else if (!strcasecmp(var, "sip-capture")) {
+                                                if (switch_true(val)) {
+                                                        sofia_set_flag(profile, TFLAG_CAPTURE);
+                                                } else {
+                                                        sofia_clear_flag(profile, TFLAG_CAPTURE);
+                                                }
+                                                nua_set_params(profile->nua, TPTAG_CAPT(sofia_test_flag(profile, TFLAG_CAPTURE) ? mod_sofia_globals.capture_server : NULL), TAG_END());                                                
                                        } else if (!strcasecmp(var, "send-message-query-on-register")) {
                                                if (switch_true(val)) {
                                                        sofia_set_pflag(profile, PFLAG_MESSAGE_QUERY_ON_REGISTER);
@@ -3394,6 +3405,9 @@ switch_status_t config_sofia(int reload, char *profile_name)
                                        mod_sofia_globals.rewrite_multicasted_fs_path = SWITCH_FALSE;
                                }
                        }
+                       else if (!strcasecmp(var, "capture-server")) {
+                                 mod_sofia_globals.capture_server = switch_core_strdup(mod_sofia_globals.pool, val);
+                        }
                }
        }
 
@@ -3485,6 +3499,9 @@ switch_status_t config_sofia(int reload, char *profile_name)
                                                profile->shutdown_type = switch_core_strdup(profile->pool, val);
                                        } else if (!strcasecmp(var, "sip-trace") && switch_true(val)) {
                                                sofia_set_flag(profile, TFLAG_TPORT_LOG);
+                                       } else if (!strcasecmp(var, "sip-capture") && switch_true(val)) {
+                                                sofia_set_flag(profile, TFLAG_CAPTURE);
+                                                nua_set_params(profile->nua, TPTAG_CAPT(mod_sofia_globals.capture_server), TAG_END());
                                        } else if (!strcasecmp(var, "odbc-dsn") && !zstr(val)) {
                                                if (switch_odbc_available()) {
                                                        profile->odbc_dsn = switch_core_strdup(profile->pool, val);
index 508e5b19dc134ea00ddc5bb1a3c6b156fa3c0b76..1c3999c110d012273a4d92ca440a8aaa775012cf 100644 (file)
@@ -5240,6 +5240,27 @@ void sofia_glue_global_siptrace(switch_bool_t on)
 
 }
 
+void sofia_glue_global_capture(switch_bool_t on)
+{
+       switch_hash_index_t *hi;
+       const void *var;
+       void *val;
+       sofia_profile_t *pptr;
+
+       switch_mutex_lock(mod_sofia_globals.hash_mutex);
+       if (mod_sofia_globals.profile_hash) {
+               for (hi = switch_hash_first(NULL, mod_sofia_globals.profile_hash); hi; hi = switch_hash_next(hi)) {
+                       switch_hash_this(hi, &var, NULL, &val);
+                       if ((pptr = (sofia_profile_t *) val)) {
+                               nua_set_params(pptr->nua, TPTAG_CAPT(on ? mod_sofia_globals.capture_server : NULL), TAG_END());
+                       }
+               }
+       }
+       switch_mutex_unlock(mod_sofia_globals.hash_mutex);
+
+}
+
+
 void sofia_glue_global_watchdog(switch_bool_t on)
 {
        switch_hash_index_t *hi;