diff --git a/kamailio/default.cfg b/kamailio/default.cfg index 8075c5b..62ce1b4 100644 --- a/kamailio/default.cfg +++ b/kamailio/default.cfg @@ -166,8 +166,7 @@ modparam("kazoo", "amqp_max_channels", MY_AMQP_MAX_CHANNELS) #!else modparam("kazoo", "amqp_max_channels", 100) #!endif -modparam("kazoo", "amqp_internal_loop_count", 1); -modparam("kazoo", "amqp_consumer_loop_count", 4); +modparam("kazoo", "amqp_query_timeout_avp", "$avp(kz_timeout)"); ####### Role Configurations ########## #!ifdef DISPATCHER-ROLE @@ -205,6 +204,9 @@ include_file "acl-role.cfg" #!endif #!ifdef RATE-LIMITER-ROLE include_file "rate-limiter-role.cfg" +#endif +#!ifdef PUSHER-ROLE +include_file "pusher-role.cfg" #!endif ####### Permissions module ########## @@ -320,6 +322,10 @@ route[HANDLE_OPTIONS] route(FILTER_REQUEST_DOMAIN); #!endif + #!ifdef NAT-TRAVERSAL-ROLE + route(NAT_TEST_AND_CORRECT); + #!endif + sl_send_reply("200", "Rawr!!"); } exit; @@ -521,6 +527,10 @@ route[INTERNAL_TO_EXTERNAL_RELAY] } #!endif + #!ifdef PUSHER-ROLE + route(INTERNAL_TO_EXTERNAL_PUSH); + #!endif + remove_hf_re("^X-.*"); t_on_reply("EXTERNAL_REPLY"); diff --git a/kamailio/dispatcher-role.cfg b/kamailio/dispatcher-role.cfg index 9cee94e..90c779f 100644 --- a/kamailio/dispatcher-role.cfg +++ b/kamailio/dispatcher-role.cfg @@ -71,8 +71,20 @@ route[DISPATCHER_FIND_ROUTES] if (is_method("INVITE")) { + $var(replaced_call_id) = "none"; + + if( $(ou{uri.param,kazoo-id}{s.len}) > 0) { + if($hdr(Replaces)== $null) { + $var(replaced_call_id) = $(ou{uri.param,kazoo-id}{s.unescape.param}); + append_hf("Replaces: $var(replaced_call_id)\r\n"); + } + } + if($hdr(Replaces)!= $null) { $var(replaced_call_id) = $(hdr(Replaces){s.select,0,;}); + } + + if($var(replaced_call_id) != "none") { xlog("L_INFO", "$ci|log|replaces call-id $var(replaced_call_id)"); $var(amqp_payload_request) = '{"Event-Category" : "call_event" , "Event-Name" : "channel_status_req", "Call-ID" : "' + $var(replaced_call_id) + '", "Active-Only" : true }'; $var(amqp_routing_key) = "call.status_req." + $(var(replaced_call_id){kz.encode}); @@ -83,15 +95,30 @@ route[DISPATCHER_FIND_ROUTES] return; } } - } - - ##### CALL-PARK #### - if($(ru{uri.user}) =~ "\*3" && $sht(park=>$(ru{uri.user})@$(ru{uri.domain})) != $null) { - $du = $sht(park=>$(ru{uri.user})@$(ruri{uri.domain})); - $sht(park=>$(ru{uri.user})@$(ruri{uri.domain})) = $null; - xlog("L_INFO", "$ci|log|redirecting park request to $du"); - return; - } + } + + ##### CALL-PARK #### + if($(ru{uri.user}) =~ "\*3" && $sht(park=>$(ru{uri.user})@$(ru{uri.domain})) != $null) { + $du = $sht(park=>$(ru{uri.user})@$(ruri{uri.domain})); + $sht(park=>$(ru{uri.user})@$(ruri{uri.domain})) = $null; + xlog("L_INFO", "$ci|log|redirecting park request to $du"); + return; + } + + + ##### CALL-PARK IN KAZOO #### + if($(ru{uri.user}) =~ "\*3" && !($rd =~ "[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3}\.[0-9]{1,3}") ) { + xlog("L_INFO", "$ci|log|checking park request to $(ru{uri.user})@$(ru{uri.domain})"); + $var(amqp_payload_request) = '{"Event-Category" : "call_event" , "Event-Name" : "query_user_channels_req", "Username" : "$(ru{uri.user})", "Realm" : "$(ru{uri.domain})", "Active-Only" : true }'; + $var(amqp_routing_key) = "call.status_req." + $(var(replaced_call_id){kz.encode}); + if(kazoo_query("callevt", $var(amqp_routing_key), $var(amqp_payload_request))) { + $du = $(kzR{kz.json,Channels[0].switch_url}); + if($du != $null) { + xlog("L_INFO", "$ci|log|redirecting park request to $du, courtesy of kazoo"); + return; + } + } + } } diff --git a/kamailio/local.cfg b/kamailio/local.cfg index c009d23..2edf815 100644 --- a/kamailio/local.cfg +++ b/kamailio/local.cfg @@ -20,7 +20,8 @@ debug = L_INFO # # #!trydef RATE-LIMITER-ROLE # # #!trydef ACL-ROLE # # #!trydef MESSAGE-ROLE - +# # #!trydef PUSHER-ROLE + ################################################################################ ## SERVER INFORMATION ################################################################################ diff --git a/kamailio/presence-role.cfg b/kamailio/presence-role.cfg index 8c40331..343a938 100644 --- a/kamailio/presence-role.cfg +++ b/kamailio/presence-role.cfg @@ -104,10 +104,10 @@ route[HANDLE_PUBLISH] event_route[kazoo:consumer-event-presence-update] { if( $(kzE{kz.json,Event-Package}) == "dialog") { - if($sht(p=>$(kzE{kz.json,Call-ID})) != $(kzE{kz.json,State})) { + if($sht(p=>$(kzE{kz.json,Call-ID})-$(kzE{kz.json,From})) != $(kzE{kz.json,State})) { xlog("L_INFO", "received $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From})"); xlog("L_INFO", "payload $kzE"); - $sht(p=>$(kzE{kz.json,Call-ID})) = $(kzE{kz.json,State}); + $sht(p=>$(kzE{kz.json,Call-ID})-$(kzE{kz.json,From})) = $(kzE{kz.json,State}); kazoo_pua_publish($kzE); pres_refresh_watchers("$(kzE{kz.json,From})", "$(kzE{kz.json,Event-Package})", 1); } else { diff --git a/kamailio/pusher-role.cfg b/kamailio/pusher-role.cfg new file mode 100644 index 0000000..2bd8c61 --- /dev/null +++ b/kamailio/pusher-role.cfg @@ -0,0 +1,35 @@ +## PUSHER ROLE + +route[INTERNAL_TO_EXTERNAL_PUSH] +{ + if (is_method("INVITE") && $hdr(X-KAZOO-PUSHER-Token-ID) != $null) + { + if(!registered("location", "$hdr(X-KAZOO-AOR)")) { + sl_send_reply(180, "waking the dead guy"); + $var(TokenID) = $hdr(X-KAZOO-PUSHER-Token-ID); + $var(TokenType) = $hdr(X-KAZOO-PUSHER-Token-Type); + $var(TokenApp) = $hdr(X-KAZOO-PUSHER-Token-App); + $var(rp) = $hdr(Remote-Party-ID); + $var(from) = $(var(rp){tobody.user}) + " - " + $(var(rp){tobody.display}{s.escape.common}); + $var(Payload) = '{ "Event-Category" : "notification", "Event-Name" : "push_req", "Call-ID" : "$ci", "Token-ID" : "$var(TokenID)", "Token-Type" : "$var(TokenType)", "Token-App" : "$var(TokenApp)", "Alert-Body" : "$var(from)" }'; + $var(RoutingKey) = "notification.push." + $var(TokenType) + "." + $var(TokenID); + $var(exchange) = "pushes"; + $avp(kz_timeout) = 20000; + kazoo_query($var(exchange), $var(RoutingKey), $var(Payload)); + } + + if(registered("location", "$hdr(X-KAZOO-AOR)")) + { + lookup("location", "$hdr(X-KAZOO-AOR)"); + xlog("L_INFO", "$ci|end|routing to $ruid"); + remove_hf_re("^X-.*"); + t_on_reply("EXTERNAL_REPLY"); + t_set_fr(0, 10000); + t_relay(); + } else { + send_reply(480, "No Answer"); + }; + exit; + } +} + diff --git a/kamailio/registrar-role.cfg b/kamailio/registrar-role.cfg index d5c2c96..7825e34 100644 --- a/kamailio/registrar-role.cfg +++ b/kamailio/registrar-role.cfg @@ -39,7 +39,7 @@ modparam("registrar", "received_avp", "$avp(AVP_RECV_PARAM)") modparam("registrar", "min_expires", REGISTRAR_MIN_EXPIRES) modparam("registrar", "max_expires", REGISTRAR_MAX_EXPIRES) modparam("registrar", "xavp_cfg", "regcfg") -modparam("registrar", "reg_match_flag", 1) +modparam("registrar", "reg_on_match_flag", 1) ####### Registrar Logic ######## @@ -76,7 +76,7 @@ route[ATTEMPT_AUTHORIZATION] $xavp(regcfg=>match_received) = $su; $xavp(regcfg[0]=>match_contact) = $(ct{nameaddr.uri}); - if ($sht(auth_cache=>$Au) != $null && registered("location", "$rz:$Au", 6) == 1)) { + if ($sht(auth_cache=>$Au) != $null && registered("location", "$rz:$Au", 6) == 1) { xlog("L_INFO", "$ci|log|authenticating $fu via cached SIP creds"); $var(password) = $sht(auth_cache=>$Au); } else { @@ -145,6 +145,10 @@ route[ATTEMPT_AUTHORIZATION] if($var(expires) == 0) { xlog("L_INFO", "$ci|end|unregister request from $Au $si:$sp"); exit; + } else if($var(Expires) < REGISTRAR_MIN_EXPIRES) { + $var(Expires) = REGISTRAR_MIN_EXPIRES; + } else if($var(Expires) > REGISTRAR_MAX_EXPIRES) { + $var(Expires) = REGISTRAR_MAX_EXPIRES; } if($(proto{s.tolower}) == "udp" || $(proto{s.tolower}) == "tcp" || $(proto{s.tolower}) == "tls") {