debug=3 log_stderror=no log_facility=LOG_LOCAL0 log_name="ser" fork=yes children=4 /* uncomment the following lines to enable debugging */ #debug=6 #fork=no #log_stderror=yes check_via=no dns=no rev_dns=no disable_dns_blacklist=yes auto_aliases=no disable_tcp=yes server_signature=yes sip_warning=1 listen=87.106.212.173 # INA (Colt) listen=212.227.250.146 # Colt listen=87.106.166.145 # Reliance listen=87.106.213.52 # Verizon ####### Modules Section ######## mpath="/usr/lib/kamailio/modules/" loadmodule "sl.so" loadmodule "tm.so" loadmodule "rr.so" loadmodule "pv.so" loadmodule "siputils.so" loadmodule "maxfwd.so" loadmodule "textops.so" loadmodule "mi_fifo.so" loadmodule "xlog.so" loadmodule "sqlops.so" loadmodule "db_mysql.so" # ACD Routing loadmodule "cfgutils.so" # ----------------- setting module-specific parameters --------------- modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo") modparam("rr", "enable_full_lr", 1) modparam("rr", "append_fromtag", 0) modparam("sqlops","sqlcon","routing_ina=>mysql://root:revolution1025@127.0.0.1/ina") modparam("sqlops","sqlcon","routing_acd=>mysql://root:revolution1025@127.0.0.1/acd_armenia") ####### Routing Logic ######## route{ if (!mf_process_maxfwd_header("10")) { sl_send_reply("483","Too Many Hops"); exit; } #TODO what is has_totag if (has_totag()) { if (loose_route()) { if(method=="INVITE") { if(t_newtran()) { t_reply("100","Your Re-INVITE is received"); t_reply("488","Your Re-INVITE is ignored"); exit; } else { xlog("L_INFO","$Ts ==> Newtran error $oU\n"); sl_send_reply("100","Your Re-INVITE is received (SL)"); sl_send_reply("488","Your Re-INVITE is ignored (SL)"); exit; } } t_relay(); exit; } else { if ( is_method("ACK") ) { if ( t_check_trans() ) { # non loose-route, but stateful ACK; must be an ACK after a 487 or e.g. 404 from upstream server t_relay(); exit; } else { # ACK without matching transaction ... ignore and discard.\n"); exit; } } # sl_send_reply("404","Not here"); } exit; } if ($si!="91.121.66.202" and $si!="91.121.19.149" and $si!="91.121.101.126" and $si!="91.121.75.124" and $si!="91.121.167.75" and $si!="91.121.70.119" and $si!="66.234.138.73" and $si!="82.103.128.3" and $si!="217.168.45.4" and $si!="212.249.15.3" and $si!="212.249.15.9" and $si!="91.121.138.5" and $si!="94.23.225.212" and $si!="94.23.242.200" and $si!="213.251.169.218" and $si!="91.121.99.16") { xlog("L_INFO","$Ts ==> Unallowed access for $si\n"); sl_send_reply("403","Forbidden here xx"); exit; } if(is_method("INVITE")) { record_route(); #418XX numbers if($tU=~"^08(00|40|42|44|48)") { xlog("INA: processing call to $tU\n"); sql_query("routing_ina", "select right(l.ina_number,9),l.tsp_id,s.description from lig l,status s where l.ina_status=s.ina_status and l.ina_number=concat(\"0\",left($tU,9)) and s.description in (\"SRVIN\",\"SRVTO\",\"ALLOC\",\"ALLNO\",\"ALLEX\") order by concat(l.trans_date,l.trans_time) desc limit 1","result_ina"); if ($dbr(result_ina=>rows)>0) { # xlog("$Ts ==> INA: $dbr(result_ina=>colname[0]) -> $dbr(result_ina=>[0,0])\n"); # xlog("$Ts ==> INA: $dbr(result_ina=>colname[1]) -> $dbr(result_ina=>[0,1])\n"); # xlog("$Ts ==> INA: $dbr(result_ina=>colname[2]) -> $dbr(result_ina=>[0,2])\n"); $var(ina_number)=$dbr(result_ina=>[0,0]); $var(tsp_id)=$dbr(result_ina=>[0,1]); $var(ina_status)=$dbr(result_ina=>[0,2]); sql_result_free("result_ina"); # xlog("$Ts ==> INA: ina_number: $var(ina_number)\n"); # xlog("$Ts ==> INA: tsp_id: $var(tsp_id)\n"); # xlog("$Ts ==> INA: ina_status: $var(ina_status)\n"); switch($var(ina_status)) { case "SRVIN": $var(prefix)="0"+$var(tsp_id)+"10335"; xlog("$Ts ==> INA: prefix -> $var(prefix)\n"); subst_uri("/^sip:0/sip:$var(prefix)/i"); rewritehost("217.168.45.4"); t_relay(); break; case "SRVTO": sl_send_reply("480","INA SRVTO"); break; case "ALLOC": sl_send_reply("480","INA ALLOC"); break; case "ALLNO": sl_send_reply("404","INA ALLNO"); break; case "ALLEX": sl_send_reply("404","INA ALLEX"); break; } exit; } else { xlog("$Ts ==> INA: $tU not found!\n"); sl_send_reply("404","INA not found"); exit; } } ###################### ACD Routing ###################### if ($tU=~"^(\+|00|)?(41215661380|37410)") { $var(Ri_V)="87.106.213.52"; $var(Ri_C)="87.106.166.145"; sql_query("routing_acd", "select ACD, reject, Nb_reject, total_calls from acd_vendors where i_vendor=55 and prefix=37410 order by date desc limit 1;","result_Verizon"); sql_query("routing_acd", "select ACD, reject, Nb_reject, total_calls from acd_vendors where i_vendor=61 and prefix=37410 order by date desc limit 1;","result_Colt"); if ($dbr(result_Verizon=>rows) && $dbr(result_Colt=>rows)) { $var(Verizon)="ACD="+$dbr(result_Verizon=>[0,0])+";Rej="+$dbr(result_Verizon=>[0,1])+";NbRej="+$dbr(result_Verizon=>[0,2])+";TOT_C="+$dbr(result_Verizon=>[0,3]); $var(Colt)="ACD="+$dbr(result_Colt=>[0,0])+";Rej="+$dbr(result_Colt=>[0,1])+";NbRej="+$dbr(result_Colt=>[0,2])+";TOT_C="+$dbr(result_Colt=>[0,3]); sql_result_free("result_Verizon"); sql_result_free("result_Colt"); if ($Ri=="212.227.250.146") { sl_send_reply("480","Call Rejected"); exit; } if ($Ri==$var(Ri_V)) { $var(Target_Load)= 100 - $(var(Verizon){param.value,Rej}{s.int}) ; } else { $var(Target_Load)= 100 - $(var(Colt){param.value,Rej}{s.int}) ; } } else { xlog("=> ACD $tU: DB connection failed (Select query) \n"); } $var(TOT_Calls) = $(var(Verizon){param.value,TOT_C}{s.int}) + $(var(Colt){param.value,TOT_C}{s.int}); $var(TOT_Reject) = $(var(Verizon){param.value,NbRej}{s.int}) + $(var(Colt){param.value,NbRej}{s.int}) ; $var(C1) = $var(TOT_Calls) - $var(TOT_Reject) ; $var(C1) = $var(C1) * 100; $var(C2) = $var(Target_Load) * $var(TOT_Calls) ; xlog("=> ACD $tU: $rm IP_Reception = $Ri \n"); xlog("=> ACD $tU: ACD_Colt = $(var(Colt){param.value,ACD}) | ACD_Verizon = $(var(Verizon){param.value,ACD}) \n"); xlog("=> ACD $tU: Reject_Colt = $(var(Colt){param.value,Rej}) | Reject_Verizon = $(var(Verizon){param.value,Rej})\n"); xlog("=> ACD $tU: Total_Calls_Colt = $(var(Colt){param.value,TOT_C}) | Total_Calls_Verizon = $(var(Verizon){param.value,TOT_C})\n"); xlog("=> ACD $tU: Target_Load = $var(Target_Load) \n"); xlog("=> ACD $tU: TOT_Calls = $var(TOT_Calls) | TOT_Reject = $var(TOT_Reject) \n"); # if ($Ri==$var(Ri_V)) # { # $var(C1) = 100; # $var(C2) = 200; # } # else # { # $var(C2) = 100; # $var(C1) = 200; # } if ( $var(C1) <= $var(C2) ) { xlog("=> ACD $tU: Call Accepted : $var(C1) < $var(C2)\n\n\n\n"); if ($Ri==$var(Ri_C)) { #rewritehost("80.77.12.195"); # IP Reliance xlog("=> ACD $tU: rewritehost Reliance"); rewritehost("220.224.129.21"); sql_query("routing_acd","update acd_vendors set total_calls = total_calls + 1 where i_vendor=61 and prefix =37410 order by date desc limit 1;","result_upd"); } else { xlog("=> ACD $tU: rewritehost Verizon"); rand_set_prob("50"); if (rand_event()) rewritehost("212.249.15.9"); else rewritehost("212.249.15.3"); sql_query("routing_acd","update acd_vendors set total_calls = total_calls + 1 where i_vendor=55 and prefix =37410 order by date desc limit 1;","result_upd"); } t_relay(); } else { xlog("=> ACD $tU: Call Rejected : $var(C1) >= $var(C2)\n\n\n\n"); if ($Ri==$var(Ri_V)) { sql_query("routing_acd","update acd_vendors set Nb_reject = Nb_reject + 1 where i_vendor=55 and prefix =37410 order by date desc limit 1;","result_upd"); } else { sql_query("routing_acd","update acd_vendors set Nb_reject = Nb_reject + 1 where i_vendor=61 and prefix =37410 order by date desc limit 1;","result_upd"); } sl_send_reply("480","Call Rejected"); } sql_result_free("result_upd"); exit; } ###################### END Script ACD ###################### # Forbidden destinations if($tU=~"^4190") { xlog("L_INFO","$Ts ==> Forbidden $tU\n"); sl_send_reply("403","Forbidden"); exit; } # Unassigned else { xlog("L_INFO","$Ts ==> Unassigned Number $tU\n"); sl_send_reply("404","Unassigned Number"); exit; } xlog("=> ACD $tU: Unmatched Packet $rm IP, Source address $si, From URI $fu, To URI $tu\n"); } t_check_trans(); route(1); xlog("=> ACD $tU: Unmatched Packet $rm IP, Source address $si, From URI $fu, To URI $tu\n"); } route[1] { # for INVITEs enable some additional helper routes if (is_method("INVITE")) { t_on_failure("1"); } if (!t_relay()) { sl_reply_error(); }; exit; }