[asterisk-dev] Dundi library

Klaus Darilion klaus.mailinglists at pernau.at
Mon Apr 28 05:15:21 CDT 2014


Thanks for the feedback. Corey, thanks for the work on the library.

Meanwhile I implemented the workaround: let Kamailio forward the request 
to an Asterisk server which does the lookup and responds with a 302 
redirect to (Transfer()) the proper Asterisk server.

Using SIP for the query has the advantage that the query is handled 
asynchronous inside Kamailio. For INVITEs it is quite easy (as they are 
handled in the Asterisk dialplan of the Asterisk server which does the 
DUNDI query). But it was a bit more complicated than expected as I also 
have to do the lookups also for REGISTERs, SUBSCRIBE .... Therefore I 
implemented a "hack" in Kamailio, faking another INVITE transaction 
while putting the original transcation on hold. (yes there are plenty of 
hacks you can do in Kamailio).

Basically it works but I have not tested it in detail. If you are 
interested take a look at the Kamailio config below.

regards
Klaus


dundi.host = "1.2.3.4:5060" desc "Asterisk which performs the DUNDI 
query. Host:Port"
dundi.deftarget = "2.3.4.5:5160" desc "Default Asterisk server if DUNDI 
lookup failed. Host:Port"


route[RELAY_TO_DUNDI] {
         $var(dundicache) = $sht(dundicache=>$tU);
         if( $var(dundicache) == 0) {
                 xlogl("L_INFO","$tU not found in cache, quering 
Dundi-Asterisk for DUNDI lookup...");
                 if(t_suspend()) {
                         # build a new transaction, use From and To URI 
to store
                         # the transaction identifiers
                         xlogl("L_INFO","transaction suspended 
[$T(id_index):$T(id_label)]\n");
                         $uac_req(method)="INVITE";
                         $uac_req(ruri)="sip:" + $tU + "@" + 
$sel(cfg_get.dundi.host);
                         $uac_req(furi)="sip:" + $T(id_index) + "@proxy";
                         $uac_req(turi)="sip:" + $T(id_label) + "@proxy";
                         $uac_req(callid)=$(mb{s.md5});
                         uac_req_send();
                         exit;
                 } else {
                         xlogl("L_ERR","Failed to suspend transaction 
... 500");
                         send_reply("500","Failed to suspend transaction");
                         exit;
                 }
         } else if( $var(dundicache) == "unknown" ) {
                 xlogl("L_INFO","$tU found in cache but unknown, sending 
to $(sel(cfg_get.dundi.deftarget))");
                 $du="sip:" + $sel(cfg_get.dundi.deftarget);
         } else {
                 xlogl("L_INFO","$tU found in cache, sending to 
$var(dundicache)");
                 $du="sip:" + $var(dundicache);
         }
         add_contact_alias();

         if (!t_relay()) {
                 sl_reply_error();
         }
         exit;
}


event_route [tm:local-request] {
         # Handle locally generated requests
         xlogl("L_INFO", "local-request: Routing locally generated $rm 
to <$ru>:");
         t_on_reply("REPLY_DUNDI");
         # 2 seconds prober timeout
         t_set_fr(0, 2000);
}
onreply_route[REPLY_DUNDI] {
         xlogl("L_INFO","REPLY_DUNDI: response received from $si:");

         $var(index) = $(fU{s.int});
         $var(label) = $(tU{s.int});
         if (t_check_status("3[0-9][0-9]")) {
                 # this reply route is only executed for DUNDI 
responses, thus, no need to check the source
                 $var(target)= @msg.header.Contact[0].nameaddr.uri.host;
                 xlogl("L_INFO","REPLY_DUNDI: Tindex=$var(index), 
Tlabel=$var(label), target=$var(target)");
                 $sht(dundicache=>$fU:$tU)=$var(target);
                 t_continue("$var(index)", "$var(label)", "AFTER_DUNDI");
         } else {
                 xlogl("L_ERR", "Unexpected response from Dundi server");
                 t_continue("$var(index)", "$var(label)", "AFTER_DUNDI");
         }

}

route[AFTER_DUNDI] {
         xlogl("L_INFO","AFTER_DUNDI: transaction 
$T(id_index):$T(id_label) continues ....");
         $var(target) = $sht(dundicache=>$T(id_index):$T(id_label));
         if ($(var(target){s.len}) > 1) {
                 $du = "sip:" + $var(target);
                 $ru = $ou;
                 xlogl("L_INFO", "Got redirect from Dundi server, target 
is $ru, sending to $du");
                 $sht(dundicache=>$tU)=$var(target);
                 r_relay();
                 exit;
         } else {
                 xlogl("L_ERROR","AFTER_DUNDI: no target found ... using 
default");
                 $du="sip:" + $sel(cfg_get.dundi.deftarget);
                 $ru = $ou;
                 $sht(dundicache=>$tU)="unknown";
                 r_relay();
                 exit;
         }
         exit;
}








More information about the asterisk-dev mailing list