You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

105 lines
3.8 KiB

######## FAST PICKUP ROLE ########
modparam("htable", "htable", "park=>size=16;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,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);
xlog("L_INFO", "$ci|log|call-id fast pickup call $var(replaced_call_id), redirecting to $du\n");
route(EXTERNAL_TO_INTERNAL_RELAY);
exit();
} else {
xlog("L_INFO", "$ci|log|call-id fast pickup call not found $ru\n");
send_reply("404", "Not Found");
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)\n");
$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 K 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\n");
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\n");
if ($hdr(Proxy-Authorization) != $null) {
xlog("L_INFO", "$ci|log|removed park redirect\n");
$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)\n");
$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) = ";a-leg=true";
} else {
if($(kzE{kz.json,State}) == "confirmed"){
$var(Pickup) = ";early-only=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}) + $var(Pickup);
$sht(fp=>$(kzE{kz.json,Call-Cookie})::URI) = "sip:" + $(kzE{kz.json,From-User}) + "@" + $(kzE{kz.json,To-Realm}) ;
}
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab