| @ -0,0 +1,96 @@ | |||
| ######## FAST PICKUP ROLE ######## | |||
| modparam("htable", "htable", "park=>size=4;autoexpire=600") | |||
| modparam("htable", "htable", "fp=>size=32;autoexpire=3600;"); | |||
| route[FAST_PICKUP_ATTEMPT] | |||
| { | |||
| if (!is_method("INVITE")) { | |||
| return; | |||
| } | |||
| $var(replaced_call_id) = "none"; | |||
| if($ru =~ "sip:kfp+") { | |||
| $var(Cookie) = $(ru{s.rm,sip:kfp+}); | |||
| if($sht(fp=>$var(Cookie)::Call-ID) != $null) { | |||
| $var(replaced_call_id) = $sht(fp=>$var(Cookie)::Call-ID); | |||
| if($hdr(Replaces)!= $null) { | |||
| remove_hf_re("^Replaces"); | |||
| } | |||
| append_hf("Replaces: $var(replaced_call_id)\r\n"); | |||
| $ru = $sht(fp=>$var(Cookie)::URI); | |||
| $tu = $sht(fp=>$var(Cookie)::URI); | |||
| $du = $sht(fp=>$var(Cookie)::Switch-URI); | |||
| route(EXTERNAL_TO_INTERNAL_RELAY); | |||
| exit(); | |||
| } | |||
| } | |||
| 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}); | |||
| sl_send_reply("100", "Attempting Kazoo query"); | |||
| if(kazoo_query("callevt", $var(amqp_routing_key), $var(amqp_payload_request))) { | |||
| $du = $(kzR{kz.json,Switch-URL}); | |||
| if($du != $null) { | |||
| xlog("L_INFO", "$ci|log|call-id $var(replaced_call_id) found redirecting call to $du, courtesy of kazoo"); | |||
| route(EXTERNAL_TO_INTERNAL_RELAY); | |||
| exit(); | |||
| } | |||
| } | |||
| } | |||
| ##### 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})); | |||
| xlog("L_INFO", "$ci|log|redirecting park request to $du"); | |||
| if ($hdr(Proxy-Authorization) != $null) { | |||
| xlog("L_INFO", "$ci|log|removed park redirect"); | |||
| $sht(park=>$(ru{uri.user})@$(ruri{uri.domain})) = $null; | |||
| } | |||
| route(EXTERNAL_TO_INTERNAL_RELAY); | |||
| exit(); | |||
| } | |||
| } | |||
| route[FAST_PICKUP_REFER] | |||
| { | |||
| if(!is_method("REFER")) { | |||
| return; | |||
| } | |||
| $avp(refer_to) = $hdr(Refer-To); | |||
| $avp(referred_by) = $hdr(Referred-By); | |||
| $avp(refer_to_uri) = $rt; | |||
| } | |||
| route[FAST_PICKUP_REPLY] { | |||
| if (!is_method("REFER") || !t_check_status("(200)|(202)") ) { | |||
| return; | |||
| } | |||
| $var(contact) = "sip:" + $(ct{tobody.uri}{uri.host}) + ":" + $(ct{tobody.uri}{uri.port}); | |||
| xlog("L_INFO", "$ci|log|caching park info $(avp(refer_to_uri){uri.user})@$(avp(refer_to_uri){uri.domain}) = $var(contact)"); | |||
| $sht(park=>$(avp(refer_to_uri){uri.user})@$(avp(refer_to_uri){uri.domain})) = $var(contact); | |||
| } | |||
| route[FAST_PICKUP_INIT] | |||
| { | |||
| $var(AppName) = $(kzE{kz.json,App-Name}); | |||
| if($var(AppName) == "park") { | |||
| $var(Pickup) = ";kazoo-pickup=true"; | |||
| } else { | |||
| $var(Pickup) = ""; | |||
| } | |||
| $sht(fp=>$(kzE{kz.json,Call-Cookie})::Switch-URI) = $(kzE{kz.json,Switch-URI}); | |||
| $sht(fp=>$(kzE{kz.json,Call-Cookie})::Call-ID) = $(kzE{kz.json,Target-Call-ID}); | |||
| $sht(fp=>$(kzE{kz.json,Call-Cookie})::URI) = "sip:" + $(kzE{kz.json,From-User}) + "@" + $(kzE{kz.json,To-Realm}) + $var(Pickup); | |||
| } | |||
| # vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab | |||