# FCCN # WG Multimedia # with postgres, RTPproxy and NAThelper # ----------- global configuration parameters ------------------------ #nivel de debug (0-9) default=0 debug=6 fork=no log_stderror=yes #tls listen = tls:XXX.XXX.XXX.XXX:5061 #tls_port_no = 5061 tls_method=TLSv1 tls_certificate="/services/openser/openser-1.0.1-tls/tls/tools/rootCA/cacert.pem" tls_private_key="/services/openser/openser-1.0.1-tls/tls/tools/rootCA/private/cakey.pem" tls_ca_list="/services/openser/openser-1.0.1-tls/tls/tools/rootCA/certs/01.pem" #tls_ciphers_list="NULL-SHA:NULL-MD5:AES256-SHA:AES128-SHA" tls_verify = 1 tls_require_certificate = 1 tls_handshake_timeout=119 # number of seconds tls_send_timeout=121 # number of seconds # check_via - Turn on or off Via host checking when forwarding replies. # Default is no. arcane. looks for discrepancy between name and # ip address when forwarding replies. check_via=no # (cmd. line: -v) # dns - Uses dns to check if it is necessary to add a "received=" field # to a via. Default is no. # rev_dns - Same as dns but use reverse DNS. dns=yes # (cmd. line: -r) rev_dns=no # (cmd. line: -R) port=5060 alias=XXX.XXX.XXX.XXX alias=mex.fccn.pt # memlog - Debugging level for final memory statistics report. Default # is L_DBG -- memory statistics are dumped only if debug is set high. memlog=1 # sip_warning - Should replies include extensive warnings? # By default yes, it is good for trouble-shooting. sip_warning=no #numero de processos q serao lancados em cada protocolo de transporte children=3 fifo="/tmp/openser_fifo" #permissoes do ficheiro FIFO #fifo_mode=438 # 666 fifo_mode=0666 fifo_db_url="postgres://fccn:fccn@XXX.XXX.XXX.XXX:5432/fccn" # ------------------ module loading ---------------------------------- loadmodule "/usr/local/lib/openser/modules/postgres.so" loadmodule "/usr/local/lib/openser/modules/sl.so" loadmodule "/usr/local/lib/openser/modules/tm.so" loadmodule "/usr/local/lib/openser/modules/rr.so" loadmodule "/usr/local/lib/openser/modules/maxfwd.so" loadmodule "/usr/local/lib/openser/modules/usrloc.so" loadmodule "/usr/local/lib/openser/modules/registrar.so" loadmodule "/usr/local/lib/openser/modules/textops.so" loadmodule "/usr/local/lib/openser/modules/acc.so" # Uncomment this if you want digest authentication loadmodule "/usr/local/lib/openser/modules/auth.so" loadmodule "/usr/local/lib/openser/modules/auth_db.so" loadmodule "/usr/local/lib/openser/modules/exec.so" loadmodule "/usr/local/lib/openser/modules/group.so" # openser #loadmodule "/usr/local/lib/openser/modules/print.so" #loadmodule "/usr/local/lib/openser/modules/mediaproxy.so" loadmodule "/usr/local/lib/openser/modules/uri.so" loadmodule "/usr/local/lib/openser/modules/uri_db.so" loadmodule "/usr/local/lib/openser/modules/domain.so" loadmodule "/usr/local/lib/openser/modules/xlog.so" loadmodule "/usr/local/lib/openser/modules/speeddial.so" loadmodule "/usr/local/lib/openser/modules/options.so" loadmodule "/usr/local/lib/openser/modules/avpops.so" loadmodule "/usr/local/lib/openser/modules/permissions.so" #loadmodule "/usr/local/lib/opsener/modules/xdz_tools.so" loadmodule "/usr/local/lib/openser/modules/nathelper.so" # ENUM loadmodule "/usr/local/lib/openser/modules/enum.so" # ----------------- setting module-specific parameters --------------- # ENUM modparam("enum", "domain_suffix", "e164.org.") # -- nathelper params -- modparam("nathelper", "natping_interval", 15) modparam("nathelper", "ping_nated_only", 1) # ------------- exec parameters modparam("exec", "setvars", 1) modparam("exec", "time_to_kill", 10) # ------------- tm parameters modparam("tm", "fr_timer", 15) modparam("tm", "fr_inv_timer", 22) modparam("tm", "wt_timer", 5) modparam("tm", "fr_inv_timer_avp", "inv_timeout") # ------------- use_domain setting modparam("registrar|auth_db|group|db_url|speeddial", "use_domain", 0) # ------------- domain parameters modparam("domain", "db_mode", 1) # -- usrloc params -- modparam("usrloc|group|uri_db|domain|speeddial|permissions","db_url","postgres://fccn:fccn@XXX.XXX.XXX.XXX:5432/fccn") modparam("usrloc", "use_domain", 0) modparam("usrloc", "db_mode", 0) # Uncomment this if you want to use SQL database # for persistent storage and comment the previous line modparam("usrloc", "user_column", "username") modparam("usrloc", "contact_column", "contact") modparam("usrloc", "expires_column", "expires") modparam("usrloc", "q_column", "q") modparam("usrloc", "callid_column", "callid") modparam("usrloc", "cseq_column", "cseq") modparam("usrloc", "method_column", "method") modparam("usrloc", "timer_interval", 30) modparam("usrloc", "desc_time_order", 1) # -- auth params -- # modparam("auth_db", "calculate_ha1", yes) modparam("auth_db", "user_column", "username") modparam("auth_db", "domain_column", "dominio") modparam("auth_db", "calculate_ha1", 1) modparam("auth_db", "password_column", "password") #modparam("auth_db", "use_rpid", 0) modparam("auth_db","db_url","postgres://fccn:fccn@XXX.XXX.XXX.XXX:5432/fccn") #openser modparam("auth_db", "avps_column_int", "domn") #openser modparam("auth_db", "avps_column_str", "uuid|rpid") # -- acc params modparam("acc", "db_url", "postgres://fccn:fccn@XXX.XXX.XXX.XXX:5432/fccn") modparam ("acc", "log_level", 1)#log_level convem estar a 9 modparam("acc", "log_flag", 1) modparam("acc", "db_flag", 1) modparam("acc", "db_missed_flag", 1) #Defines what parts of header fields will be printed to syslog #c = Call-Id #d = To tag (Dst) #f = From #i = Inbound Request-URI #m = Method #o = Outbound Request-URI #r = fRom #s = Status #t = To #u = digest Username #p = username Part of inbound Request-URI #modparam("acc", "log_fmt", "cdfimorstup") modparam("acc", "early_media", 1) #openser modparam("acc", "failed_transactions", 1) modparam("acc", "report_cancels", 1) modparam("acc", "report_ack", 0) # ------------ media proxy settings #modparam("mediaproxy", "natping_interval", 30) #modparam("mediaproxy", "sip_asymmetrics","/usr/local/etc/ser/sip-asymmetric-clients") #modparam("mediaproxy", "rtp_asymmetrics","/usr/local/etc/ser/rtp-asymmetric-clients") # ------------- registration parameters modparam("registrar", "nat_flag", 6) modparam("registrar", "min_expires", 60) modparam("registrar", "max_expires", 86400) modparam("registrar", "default_expires", 3600) modparam("registrar", "desc_time_order", 1) modparam("registrar", "append_branches", 1) # -- rr params -- # add value to ;lr param to make some broken UAs happy modparam("rr", "enable_full_lr", 1) #-------------- AVPOPS parameters modparam("avpops", "avp_url","postgres://fccn:fccn@XXX.XXX.XXX.XXX:5432/fccn") modparam("avpops", "avp_table", "usr_preferences") modparam("avpops", "avp_aliases","voicemail=i:500;calltype=i:700;fwd_no_answer_type=i:701;fwd_busy_type=i:702") modparam("avpops","username_column","utilizador") # ------------- logging parameters modparam("xlog", "buf_size", 8192) # ------------- permissions settings modparam("permissions", "db_mode", 1) modparam("permissions", "trusted_table", "trusted") # ------------------------- request routing logic ------------------- # main routing logic route{ # initial sanity checks -- messages with # max_forwards==0, or excessively long requests if (!mf_process_maxfwd_header("10")) { sl_send_reply("483","Too Many Hops"); return; }; if (msg:len > max_len ) { sl_send_reply("513", "Message too big"); return; }; # -------------------------------------------------- # NOTIFY Keep-Alive Section # -------------------------------------------------- if ((method=="NOTIFY") && search("^Event: keep-alive")) { sl_send_reply("200", "OK"); return; }; if ((method=="NOTIFY") && (uri=~"^sip:700@")) { sl_send_reply("200", "OK"); return; }; # -------------------------------------------------- # OPTIONS Section # -------------------------------------------------- if (method=="OPTIONS") { options_reply(); return; }; # -------------------------------------------------- # NAT Test Section #1 # -------------------------------------------------- # versao para o RTPproxy if (method=="REGISTER" && nat_uac_test("3")) { fix_nated_contact(); force_rport(); setflag(2); }; # -------------------------------------------------- # Click2Dial Section # -------------------------------------------------- if (src_ip=="XXX.XXX.XXX.XXX" && (search("^From: " , "From: \"Anonymous\" "); }; # versao para o RTPproxy if (method=="INVITE" || method=="ACK") { log(1, "LOG: FORCE_RTPPROXY\n"); force_rtp_proxy(); }; t_on_failure("1"); t_on_reply("1"); if (!t_relay()) { # versao para o RTPproxy if (method=="INVITE" || method=="ACK") { unforce_rtp_proxy(); }; sl_reply_error(); }; } # encaminhamento para o Gateway PSTN route[3] { log(1, "LOG: ROUTE 3 \n"); # SIP->PSTN calls get 45 seconds to timeout avp_write("i:45", "inv_timeout"); rewritehost("XXX.XXX.XXX.XXX:1720"); # versao para o RTPproxy if (method=="INVITE" || method=="ACK") { force_rtp_proxy(); }; if (isflagset(31)) { t_on_failure("1"); }; t_on_reply("1"); if (!t_relay()) { sl_reply_error(); }; } route[4] { log(1, "LOG: ROUTE 4 \n"); if (isflagset(25)) { replace("^From:(.*)>" , "From: \"Anonymous\" "); }; rewritehostport("99.99.99.100:5060"); append_branch(); t_on_reply("1"); if (!t_relay()) { # versao para o RTPproxy if (method=="INVITE" || method=="ACK") { unforce_rtp_proxy(); }; sl_reply_error(); }; } route[5] { log(1, "LOG: ROUTE 5 \n"); # versao para o RTPproxy if (method=="INVITE" || method=="ACK") { force_rtp_proxy(); }; rewritehostport("99.99.99.100:5060"); t_on_reply("1"); if (!t_relay()) { # versao para o RTPproxy if (method=="INVITE" || method=="ACK") { unforce_rtp_proxy(); }; sl_reply_error(); }; } onreply_route[1] { log(1, "LOG: ON REPLY ROUTE 1 \n"); # Not all 2xx messages have a content body so here we # make sure our Content-Length > 0 to avoid a parse error if (status=~"(180)|(183)|2[0-9][0-9]") { if (!search("^Content-Length:\ 0")) { force_rtp_proxy(); }; }; if (nat_uac_test("1")) { fix_nated_contact(); }; } failure_route[1] { log(1, "LOG: FAILURE ROUTE 1 \n"); # if caller hung up then don't sent to voicemail if (t_check_status("487")) { return; }; if (isflagset(26) && t_check_status("486")) { # forward busy is flag 26 if (avp_pushto("$ruri", "s:fwdbusy")) { avp_delete("s:fwdbusy"); append_branch(); resetflag(26); # test for domestic PSTN gateway if (avp_check("$fwd_busy_type", "eq/dom/i")) { # test for domestic PSTN gateway #route(3); #sl_send_reply("503", "Gateway PSTN Indisponivel"); #} else if (avp_check("$fwd_busy_type", "eq/int/i")) { # test for international PSTN gateway # route(6); # } else { # default to sip call log(1, "LOG: routing 3\n"); route(2); }; return; }; }; # here we can have either voicemail __OR__ forward no answer if (isflagset(27) && t_check_status("408")) { # forward no answer is flag 27 if (avp_pushto("$ruri", "s:fwdnoanswer")) { avp_delete("s:fwdnoanswer"); append_branch(); resetflag(27); if (avp_check("$fwd_no_answer_type", "eq/dom/i")) { # test for domestic PSTN gateway #route(3); #sl_send_reply("503", "Gateway PSTN Indisponivel"); #} else if (avp_check("$fwd_no_answer_type", "eq/int/i")) { # test for international PSTN gateway # route(6); #} else { # default to sip call log(1, "LOG: routing 5\n"); route(2); }; return; }; } else if (isflagset(31) && avp_pushto("$ruri", "$voicemail")) { avp_delete("$voicemail"); route(4); return; }; } onreply_route[2] { log(1, "LOG: ONREPLY ROUTE 2 \n"); log(1, "LOG: entered onreply_route[2] now... \n"); if(isflagset(6)) { # && status =~"(183)|2[0-9][0-9]") { log(1, "LOG: TRansaction was sent to a NATed client --> fix_nated_contact() and force_rtp_proxy().\n"); if(!fix_nated_contact()) { log(1, "LOG: fix_nated_contact() FAILED!\n"); } else { log(1, "LOG: fix_nated_contact() succeded.\n"); }; if(!force_rtp_proxy()) { log(1, "LOG: force_rtp_proxy() FAILED!\n"); } else { log(1, "LOG: force_rtp_proxy() succeded.\n"); }; append_hf("P-hint: fixed NAT contact for response\r\n"); } else if (nat_uac_test("1")) { log(1, "LOG: Uncaught NAT. => fix_nated_contact()\n"); if(!fix_nated_contact()) { log(1, "LOG: fix_nated_contact() FAILED!\n"); } else { log(1, "LOG: fix_nated_contact() succeded.\n"); }; }; }