|
|
######## FAST PICKUP ROLE ########
|
|
|
|
|
|
modparam("htable", "htable", "fp=>size=32;autoexpire=3600;");
|
|
|
|
|
|
route[FAST_PICKUP_CHK]
|
|
|
{
|
|
|
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});
|
|
|
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();
|
|
|
}
|
|
|
|
|
|
|
|
|
##### 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");
|
|
|
route(EXTERNAL_TO_INTERNAL_RELAY);
|
|
|
exit();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
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
|