# # $Id$ # # OpenSIPS residential configuration script # by OpenSIPS Solutions # # This script was generated via "make menuconfig", from # the "Residential" scenario. # You can enable / disable more features / functionalities by # re-generating the scenario with different options.# # # Please refer to the Core CookBook at: # http://www.opensips.org/Resources/DocsCookbooks # for a explanation of possible statements, functions and parameters. # ####### Global Parameters ######### log_level=4 log_stderror=yes log_facility=LOG_LOCAL0 children=1 memdump=-1 /* uncomment the following line to enable debugging */ #debug_mode=yes /* uncomment the next line to enable the auto temporary blacklisting of not available destinations (default disabled) */ #disable_dns_blacklist=no /* uncomment the next line to enable IPv6 lookup after IPv4 dns lookup failures (default disabled) */ #dns_try_ipv6=yes /* comment the next line to enable the auto discovery of local aliases based on revers DNS on IPs */ auto_aliases=no listen=udp:10.0.2.8:5060 # CUSTOMIZE ME alias=udp:10.0.2.8:5061 alias=udp:127.0.1.1:5061 ####### Modules Section ######## #set module path mpath="modules/" loadmodule "proto_udp.so" loadmodule "proto_tcp.so" #### SIGNALING module loadmodule "signaling.so" #### StateLess module loadmodule "sl.so" #### Transaction Module loadmodule "tm.so" modparam("tm", "fr_timeout", 5) modparam("tm", "fr_inv_timeout", 30) modparam("tm", "restart_fr_on_each_reply", 0) modparam("tm", "onreply_avp_mode", 1) #### Record Route Module loadmodule "rr.so" /* do not append from tag to the RR (no need for this script) */ modparam("rr", "append_fromtag", 0) #### MAX ForWarD module loadmodule "maxfwd.so" #### SIP MSG OPerationS module loadmodule "sipmsgops.so" loadmodule "freeswitch.so" loadmodule "statistics.so" loadmodule "mathops.so" modparam("mathops", "decimal_digits", 12) #### FIFO Management Interface loadmodule "mi_fifo.so" modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo") modparam("mi_fifo", "fifo_mode", 0666) #### URI module loadmodule "uri.so" modparam("uri", "use_uri_table", 0) #### USeR LOCation module loadmodule "usrloc.so" modparam("usrloc", "nat_bflag", "NAT") modparam("usrloc", "db_mode", 1) modparam("usrloc", "db_url", "mysql://root:summit2017@127.0.0.1/opensips_2_3") #### REGISTRAR module loadmodule "registrar.so" /* uncomment the next line not to allow more than 10 contacts per AOR */ #modparam("registrar", "max_contacts", 10) loadmodule "cachedb_local.so" loadmodule "rest_client.so" #### ACCounting module loadmodule "acc.so" /* what special events should be accounted ? */ #modparam("acc", "aaa_url", "radius:modules/acc/etc/radius/radiusclient.conf") modparam("acc", "early_media", 0) modparam("acc", "report_cancels", 0) /* by default we do not adjust the direct of the sequential requests. if you enable this parameter, be sure the enable "append_fromtag" in "rr" module */ modparam("acc", "detect_direction", 0) #modparam("acc", "multi_leg_info", "text1=$avp(src);text2=$avp(dst)") #modparam("acc", "multi_leg_bye_info", "text1=$avp(src);text2=$avp(dst)") /* account triggers (flags) */ loadmodule "avpops.so" modparam("avpops", "db_url", "1 mysql://root:summit2017@127.0.0.1/opensips_2_3") loadmodule "db_mysql.so" modparam("db_mysql", "exec_query_threshold", 500000) loadmodule "cfgutils.so" loadmodule "dialog.so" # TODO-1 loadmodule "dispatcher.so" modparam("dispatcher", "db_url", "mysql://root:summit2017@127.0.0.1/opensips_2_3") modparam("dispatcher", "fetch_freeswitch_stats", 1) ####### Routing Logic ######## # main request routing logic startup_route { $stat(neg_replies) = 0; } route { if ($stat(neg_replies) == "") $stat(neg_replies) = 0; if (!mf_process_maxfwd_header("10")) { sl_send_reply("483","Too Many Hops"); exit; } if (has_totag()) { # sequential requests within a dialog should # take the path determined by record-routing if (loose_route()) { if (is_method("INVITE")) { # even if in most of the cases is useless, do RR for # re-INVITEs alos, as some buggy clients do change route set # during the dialog. record_route(); } # route it out to whatever destination was set by loose_route() # in $du (destination URI). route(relay); } 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 exit; } } sl_send_reply("404","Not here"); } exit; } if (is_method("REGISTER")) { if (!save("location")) sl_reply_error(); exit; } # CANCEL processing if (is_method("CANCEL")) { if (t_check_trans()) t_relay(); exit; } t_check_trans(); if ( !(is_method("REGISTER") ) ) { if (from_uri==myself) { } else { # if caller is not local, then called number must be local } } # preloaded route checking if (loose_route()) { xlog("L_ERR", "Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]"); if (!is_method("ACK")) sl_send_reply("403","Preload Route denied"); exit; } # record routing if (!is_method("REGISTER|MESSAGE")) record_route(); t_newtran(); # account only INVITEs if (is_method("INVITE")) { create_dialog(); $dlg_val(start_ts) = $Ts; $dlg_val(start_tsm) = $Tsm; if ($dlg_val(gw_failure) != "false") { $dlg_val(gw_failure) = "false"; } t_on_reply("invite_reply"); } # TODO-2 if (!ds_select_dst("1", "4", "f")) { #ESL group #if (!ds_select_dst("2", "4", "f")) { #normal group t_reply("503", "No destination available"); exit; } if (!uri==myself) { append_hf("P-hint: outbound\r\n"); route(relay); } # requests for my domain if (is_method("PUBLISH|SUBSCRIBE")) { sl_send_reply("503", "Service Unavailable"); exit; } if ($rU==NULL) { # request with no Username in RURI sl_send_reply("484","Address Incomplete"); exit; } # do lookup with method filtering #if (!lookup("location","m")) { # t_newtran(); # t_reply("404", "Not Found"); # exit; #} route(relay); } onreply_route [invite_reply] { if ($rs == 200 || $dlg_val(gw_failure) == "true") { if ($Ts == $(dlg_val(start_ts){s.int})) { $var(diff_sec) = 0; $var(diff_usec) = $Tsm - $(dlg_val(start_tsm){s.int}); } else if ($Tsm > $(dlg_val(start_tsm){s.int})) { $var(diff_sec) = $Ts - $(dlg_val(start_ts){s.int}); $var(diff_usec) = $Tsm - $(dlg_val(start_tsm){s.int}); } else { $var(diff_sec) = $Ts - $(dlg_val(start_ts){s.int}) - 1; $var(diff_usec) = 1000000 + $Tsm - $(dlg_val(start_tsm){s.int}); } cache_add("local", "tot_sec", $var(diff_sec), 0, $var(nsv)); cache_add("local", "tot_usec", $var(diff_usec), 0, $var(nmsv)); cache_add("local", "tot", 1, 0); xlog("XXXX: $var(diff_sec) s, $var(diff_usec) us | $dlg_val(gw_failure) | $var(nsv) | $var(nmsv)\n"); } # http://localhost:8086/write?db=statsdemo } route [resume_sleep] { # for INVITEs enable some additional helper routes if (is_method("INVITE")) { t_on_branch("per_branch_ops"); t_on_failure("missed_call"); } if (!t_relay()) { send_reply("500","Internal Error"); }; exit; } route [relay] { #$ru = "sip:liviu@192.168.1.38:5060"; async(usleep("100000"), resume_sleep); } branch_route[per_branch_ops] { xlog("new branch at $ru\n"); } failure_route[missed_call] { xlog("missed_call\n"); #update_stat("neg_replies", "1"); cache_add("local", "neg_replies", 1, 0); if (!ds_next_dst()) { t_reply("503", "No GWs available"); exit; } xlog("rerouting to $ru / $du\n"); $dlg_val(gw_failure) = "true"; t_on_reply("invite_reply"); t_on_failure("missed_call"); t_relay(); # uncomment the following lines if you want to block client # redirect based on 3xx replies. ##if (t_check_status("3[0-9][0-9]")) { ##t_reply("404","Not found"); ## exit; ##} } timer_route [dump_pdd, 1] { $var(out) = 0; $var(out_us) = 0; $var(tot) = 0; cache_counter_fetch("local", "tot_sec", $var(out)); cache_counter_fetch("local", "tot_usec", $var(out_us)); cache_counter_fetch("local", "tot", $var(tot)); cache_remove("local", "tot_sec"); cache_remove("local", "tot_usec"); cache_remove("local", "tot"); $var(v1) = ($var(out) + $var(out_us) / 1000000 + $var(out_us) % 1000000) / $var(tot); if (!math_eval("($var(out) + ($var(out_us) / 1000000)) / $var(tot)", "$var(result)")) { xlog("match eval error $rc\n"); } route(store_influxdb, "fsdemo", "pdd", "serverA", $var(result)); xlog("rest_post: $var(body)\n"); } route [ds_route] { xlog("XXX bal: $(avp(ds_loads)[*])\n"); route(store_influxdb, "fsdemo", "bal", "serverA", $(avp(ds_loads)[0])); if ($(avp(ds_loads)[1]) != NULL) { route(store_influxdb, "fsdemo", "bal", "serverB", $(avp(ds_loads)[1])); } } route [store_influxdb] { $var(body) = $param(2) + ",host=" + $param(3) + " value=" + $param(4); xlog("XXX posting: $var(body) ($param(1) / $param(2) / $param(4))\n"); if (!rest_post("http://localhost:8086/write?db=$param(1)", "$var(body)", , "$var(body)")) { xlog("ERR in rest_post!\n"); exit; } } timer_route [dump_neg_replies, 1] { $var(nr) = 0; cache_counter_fetch("local", "neg_replies", $var(nr)); cache_remove("local", "neg_replies"); route(store_influxdb, "fsdemo", "neg", "serverA", $var(nr)); xlog("XXX stats: $var(nr)\n"); }