[Serusers] voicemail question - dial plan example - pstngatewayexample

Steve Dolloff sdolloff at noc.dls.net
Fri Sep 26 19:04:13 CEST 2003


Greg,

You can set a timer when the phone rings and isn't answered.

modparam("tm", "fr_inv_timer", 20 )

20 is the time before the failure.  You can change this.


Stephen
-----Original Message-----
From: Greg Fausak [mailto:greg at august.net] 
Sent: Friday, September 26, 2003 11:56 AM
To: 'Jiri Kuthan'; 'Gavin Bensom'; serusers at lists.iptel.org
Subject: RE: [Serusers] voicemail question - dial plan example -
pstngatewayexample

Jiri,

I believe this is what you and I talked about
 at VON.  I am very interested in an easy way to
 do serial forking.  For instance, if I have 3 sip endpoints
 like :

1000 at myproxy.com
1010 at myproxy.com
1020 at myproxy.com

And finally, a voice mail reference:

1000 at myvoicemailmediaserver.com

I currently am doing a serial forking like this:

First, create a table called 'forward' that works exactly like
'aliases'.
Then, put all 'forward' instructions in the table.  This includes
forwarding
to voicemail server.

{
...
 if(lookup("forward"))
 {
    xlog("L_WARN", "HUNTGROUP: %Ts call-id:%ci cseq:%ci\n");
    t_on_failure("1");
 }

 if(!t_relay())
 {
   sl_reply_error();
   break;
 }
...
}

# here is the 'failure_route' for number forwarding
failure_route[1]
{
        if(lookup("forward"))
        {
                xlog("L_WARN", "CONTINUE HUNT: %Ts call-id:%ci cseq:%ci
messageid:%mi\n");
                t_on_failure("1");
                append_branch();
                t_relay();
                break;
        };

        xlog("L_WARN", "NO CONTINUE HUNT: %Ts call-id:%ci cseq:%ci
messageid:%mi\n");

        #sl_reply_error();
        t_reply("486","Busy puppy.");
        break;
}

This setup sort of works, but, it seems that I get many
 t_relay() events that just hang and eventually time out,
 which I don't understand how is happening.

Also, it would be nice if I could set a timer, say for 15 seconds, that
 causes a failure to occur in the event a phone rings but isn't
answered.

---greg

> 
> There is other problem though -- the failure_route logic for 
> VM should be different
> from that in route block -- you can't create transaction 
> state two times
> (first time with t_relay, second time with t_newtran). SER 
> will certainly
> complain with some error message in your logs.
> 
> I will introduce some new command which hides details of 
> transaction processing
> from script writers and can be used from both route[] and 
> failure_route[].
> (I didn't think of it before since I used voicemail on some 
> other machine
>  than proxy server.)
> 
> -jiri
> 
> > 
> >Thanks,
> >G.
> >
> >
> >Do you Yahoo!?
> ><http://shopping.yahoo.com/?__yltc=s%3A150000443%2Cd%3A227082
> 28%2Cslk%3Atext%2Csec%3Amail>The New Yahoo! Shopping - with 
> improved product search 
> >#
> ># $Id: ser.cfg,v 1.20 2003/05/31 21:12:19 jiri Exp $
> >#
> ># simple quick-start config script
> >#
> >
> ># ----------- global configuration parameters 
> ------------------------
> >
> >debug=3         # debug level (cmd line: -dddddddddd)
> >fork=yes
> >log_stderror=no # (cmd line: -E)
> >
> >/* Uncomment these lines to enter debugging mode 
> >debug=8
> >fork=no
> >log_stderror=yes
> >*/
> >
> >check_via=no    # (cmd. line: -v)
> >dns=no           # (cmd. line: -r)
> >rev_dns=no      # (cmd. line: -R)
> >port=5060
> >children=4
> >fifo="/tmp/ser_fifo"
> >sip_warning=no
> >#
> ># ------------------ module loading 
> ----------------------------------
> >#
> ># Uncomment this if you want to use SQL database
> >loadmodule "/usr/local/lib/ser/modules/mysql.so"
> >#
> >loadmodule "/usr/local/lib/ser/modules/sl.so"
> >loadmodule "/usr/local/lib/ser/modules/tm.so"
> >loadmodule "/usr/local/lib/ser/modules/rr.so"
> >loadmodule "/usr/local/lib/ser/modules/maxfwd.so"
> >loadmodule "/usr/local/lib/ser/modules/usrloc.so"
> >loadmodule "/usr/local/lib/ser/modules/registrar.so"
> >loadmodule "/usr/local/lib/ser/modules/vm.so"
> >loadmodule "/usr/local/lib/ser/modules/pa.so"
> >loadmodule "/usr/local/lib/ser/modules/msilo.so"
> >loadmodule "/usr/local/lib/ser/modules/acc.so"
> >loadmodule "/usr/local/lib/ser/modules/textops.so"
> >#
> >#loadmodule "/usr/local/lib/ser/modules/nathelper.so"
> >#loadmodule "/usr/local/lib/ser/modules/uri.so"
> >#loadmodule "/usr/local/lib/ser/modules/group.so"
> >#
> ># Uncomment this if you want digest authentication
> ># mysql.so must be loaded !
> >loadmodule "/usr/local/lib/ser/modules/auth.so"
> >loadmodule "/usr/local/lib/ser/modules/auth_db.so"
> >#
> ># ----------------- setting module-specific parameters 
> ---------------
> >#
> ># -- usrloc params --
> >#
> >#modparam("usrloc", "db_mode",   0)
> >#
> ># Uncomment this if you want to use SQL database 
> ># for persistent storage and comment the previous line
> >modparam("usrloc", "db_mode", 2)
> >#
> ># -- auth params --
> ># Uncomment if you are using auth module
> >#
> >modparam("auth_db", "calculate_ha1", yes)
> >#
> ># If you set "calculate_ha1" parameter to yes (which true in 
> this config), 
> ># uncomment also the following parameter)
> >#
> >modparam("auth_db", "password_column", "password")
> >#
> >#
> >modparam("acc", "log_level", 1)
> >modparam("acc", "log_flag", 2)
> >modparam("acc", "log_missed_flag", 2)
> >modparam("acc", "log_fmt", "fimos")
> >#
> >#modparam("tm", "fr_inv_timer", 35)  #INVITE timeout
> >#modparam("tm", "fr_timer", 30)  #negative INVITE replay or no 
> >                                #final reply for a request for ACK
> >#
> >modparam("voicemail", "db_url", "sql://ser:heslo@localhost/ser")
> >#
> >#modparam("acc", "db_url", "sql://ser:heslo@localhost/ser")
> >#modparam("acc", "db_flag", 2)
> >#modparam("acc", "db_missed_flag", 2)
> >#
> ># -------------------------  request routing logic 
> -------------------
> >#
> ># main routing logic
> >#
> >alias=10.10.10.49               #sip server IP address
> >alias=jiffypop                  #sip server name
> >alias=mydomain.com              #sip domain/realm       
> >alias=jiffypop.mydomain.com     #sip server FQDN
> >#
> >route{
> >        log(1,"entering main route");
> >        #prevent strangers from claiming to belong to our domain;
> >        #if sender claims to be in our domain in From header field,
> >        #better authenticate him
> >        # code not inserted yet :)
> >
> >        # 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");
> >                break;
> >        };
> >        if (len_gt( max_len )) {
> >                sl_send_reply("513", "Message too big");
> >                break;
> >        };
> >
> >        # we record-route all messages -- to make sure that
> >        # subsequent messages will go through our proxy; that's
> >        # particularly good if upstream and downstream entities
> >        # use different transport protocol
> >        record_route(); 
> >        # loose-route processing
> >        if (loose_route()) {
> >                t_relay();
> >                break;
> >        };
> >        
> >        setflag(2);     #set flag for accounting
> >        
> >        # if the request is for other domain use UsrLoc
> >        # (in case it does not work, use the following command
> >        # with proper names and addresses in it)
> >
> >        if (uri==myself) {
> >                if (method=="REGISTER") {
> >                        # digest authentication
> >                        log(1,"request for registration");
> >                        if (!www_authorize("mydomain.com", 
> "subscriber")) {
> >                                www_challenge("mydomain.com", "0");
> >                                break;
> >                        };
> >                        save("location");
> >                        break;
> >                };
> >
> >/* ********** Dial out to PSTN logic ************* */           
> >
> >                #forward numerical 7 digit requests to gateway
> >                
> if(uri=~"^sip:[0-9]{7}@(mydomain\.com|10\.10\.10\.49)"){
> >#                       
> append_hf("Remote-Party-ID:<sip:6508466600 at mydomain.com>;party
> =calling;id-type=subscriber;privacy=off;screen=no;\r\n");
> >                        rewritehostport("10.10.10.5:5060");
> >                        log(1,"7 digit expression match");      
> >                        route(2);
> >                        break;    
> >
> >                };
> >                # strip 650 and forward to GW is user dials 
> 650 before phone no.
> >                
> if(uri=~"^sip:650[0-9]{7}@(mydomain\.com|10\.10\.10\.49)"){
> >                        strip(3);
> >                        rewritehostport("10.10.10.5:5060");
> >                        log(1,"650 area code dialed, 650 stripped");
> >                        route(2);
> >                        break;
> >                        
> >                };
> >                #forward numerical 10 digit requests to 
> gateway, append a 1 first
> >                
> if(uri=~"^sip:[0-9]{10}@(mydomain\.com|10\.10\.10\.49)"){
> >                        prefix("1");
> >                        rewritehostport("10.10.10.5:5060");    
> >                        log(1,"10 digit expression match, prefix 1");
> >                        route(2);
> >                        break;
> >                };
> >                #forward numerical 11 digit requests that 
> start with a 1 to GW
> >                
> if(uri=~"^sip:1[0-9]{10}@(mydomain\.com|10\.10\.10\.49)"){
> >                        rewritehostport("10.10.10.5:5060");
> >                        log(1,"10 digit exp match w/leading 1");
> >                        route(2);
> >                        break;
> >                };
> >                #forward international N digit requests to gateway
> >                
> if(uri=~"^sip:011[0-9]+@(mydomain\.com|10\.10\.10\.49)"){
> >                        rewritehostport("10.10.10.5:5060");    
> >                        log(1,"international expression match");
> >                        route(2);
> >                        break;
> >                };
> >
> >/* ********** VOICEMAIL logic ************* */
> >
> >                if (uri=~"^sip:voicemail\+@"){
> >                        t_newtran();
> >                        t_reply("100", "Trying -- just a second");
> >                        if(!vm("/tmp/am_fifo","announcement")){
> >                                t_reply("500", "SEMS error");
> >                        };
> >                        log(1,"sip:voicemail uri match");
> >                        break;
> >                };
> >/*  ****** Find Aliases and Locations of users ********* */
> >
> ># It is very important to lookup "aliases" before looking up 
> "locations"
> >
> >                if(!lookup("aliases")){
> >                        log(1,"Couldn't find any matching alias");
> >                        sl_send_reply("404", "User does not exist");
> >                        break;
> >                };
> >
> >                if(!lookup("location")) {
> >                        log(1,"unable to locate user");
> >                        route(3);
> >                        break;
> >                };
> >
> >        };
> >
> >
> >        # forward to current uri now; use stateful forwarding; that
> >        # works reliably even if we forward from TCP to UDP
> >        t_on_failure("1");
> >        if (!t_relay()) {
> >                sl_reply_error();
> >        };
> >        log(1,"eof");
> >}
> >
> >route[2]{       
> >        log(1,"route[2]:SIP-to-PSTN call routed");
> >        if(!t_relay()){
> >                sl_reply_error();
> >        };
> >}
> >
> >route[3]{
> >        log(1,"route[3]: voicemail processing");
> >        if(method=="INVITE" || method=="ACK"){
> >                log(1,"1st if entered in route[3] *vm*");
> >                t_newtran();
> >                t_reply("100","Trying -- just a second");
> >                if(!vm("/tmp/am_fifo","voicemail")){  # 
> "announcement" was replaced with "voicemail"
> >                        log(1,"vm module called and failed");
> >                        t_reply("500", "SEMS error");
> >                };      
> >                break;
> >        };
> >        log(1,"end of route[3], 1st if check not entered");
> >}
> >
> >failure_route[1]{
> >        log(1,"failure_route[1]:jump to vm processing");
> >        route(3);
> >#       break;
> >}
> >
> >_______________________________________________
> >Serusers mailing list
> >serusers at lists.iptel.org
> >http://lists.iptel.org/mailman/listinfo/serusers
> 
> --
> Jiri Kuthan            http://iptel.org/~jiri/ 
> 
> _______________________________________________
> Serusers mailing list
> serusers at lists.iptel.org
> http://lists.iptel.org/mailman/listinfo/serusers
> 

_______________________________________________
Serusers mailing list
serusers at lists.iptel.org
http://lists.iptel.org/mailman/listinfo/serusers




More information about the sr-users mailing list