Here is my ser.cg file. I try to configure send IM, Missed calls,
Voicemail.
I just can configure Send IM.
Now I can call isdngw, ivr,..
I need help to configure lookup location logic for missed calls and
voicemail (offline users)
Anybody could help me to configure the others functions (problem with
logic !!).
harry
Regards
#
# $Id: ser.cfg,v 1.21.4.1 2003/11/10 15:35:15 andrei 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=7
fork=no
log_stderror=yes
*/
check_via=no # (cmd. line: -v)
dns=no # (cmd. line: -r)
rev_dns=no # (cmd. line: -R)
listen=192.168.0.1
port=5060
children=4
fifo="/tmp/ser_fifo"
fifo_mode=0666
# ------------------ module loading ----------------------------------
# Uncomment this if you want to use SQL database
loadmodule "/usr/lib/ser/modules/mysql.so"
loadmodule "/usr/lib/ser/modules/sl.so"
loadmodule "/usr/lib/ser/modules/tm.so"
loadmodule "/usr/lib/ser/modules/rr.so"
loadmodule "/usr/lib/ser/modules/maxfwd.so"
loadmodule "/usr/lib/ser/modules/usrloc.so"
loadmodule "/usr/lib/ser/modules/registrar.so"
loadmodule "/usr/lib/ser/modules/domain.so"
loadmodule "/usr/lib/ser/modules/msilo.so"
loadmodule "/usr/lib/ser/modules/acc.so"
loadmodule "/usr/lib/ser/modules/vm.so"
loadmodule "/usr/lib/ser/modules/uri.so"
loadmodule "/usr/lib/ser/modules/group.so"
loadmodule "/usr/lib/ser/modules/textops.so"
# Uncomment this if you want digest authentication
# mysql.so must be loaded !
loadmodule "/usr/lib/ser/modules/auth.so"
loadmodule "/usr/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_url", "mysql://ser:heslo@localhost/ser")
modparam("usrloc", "db_mode", 2)
modparam("usrloc", "use_domain", 1)
# -- 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")
# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)
# --registrar params--
modparam("registrar", "use_domain", 1)
# --domain params--
modparam("domain", "db_url", "mysql://ser:heslo@localhost/ser")
modparam("domain", "db_mode", 1) # Use chaching
# --acc params--
modparam("acc", "db_url", "mysql://ser:heslo@localhost/ser")
modparam("acc", "db_missed_flag", 3)
# --msilo params--
modparam("msilo", "db_url", "mysql://ser:heslo@localhost/ser")
modparam("msilo", "db_table", "silo")
modparam("msilo","registrar","sip:registrar@192.168.0.1")
# --uri params--
#modparam("uri", "db_url", "mysql://ser:heslo@localhost/ser")
#modparam("uri", "subscriber_table", "subscriber")
# --vm params--
modparam("voicemail", "db_url", "mysql://ser:heslo@localhost/ser")
# ------------------------- 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");
break;
};
if ( msg:len > 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;
};
# --isdn gateway--
if(method=="INVITE" || method=="BYE" || method=="CANCEL"){
if (uri=~"sip:[0-9]{10}@.*") {
route(2);
break;
};
};
# --ivr conf--
if(method=="INVITE" || method=="BYE" || method=="CANCEL"){
if (uri=~"sip:5000@.*") {
route(4);
break;
};
};
# --conference--
if(method=="INVITE" || method=="BYE" || method=="CANCEL"){
if (uri=~"sip:6000@.*") {
route(5);
break;
};
};
# --play an annoucement--
if(method=="INVITE" || method=="BYE" || method=="CANCEL"){
if (uri=~"sip:7000@.*") {
route(6);
break;
};
};
# 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 (is_from_local()) {
if (method=="REGISTER") {
# Uncomment this if you want to use digest authentication
if (!www_authorize("", "subscriber")) {
www_challenge("", "0");
break;
};
save("location");
# MSILO - dumping user's offline messages
if (m_dump())
{
log("MSILO: offline messages dumped - if they were\n");
}else{
log("MSILO: no offline messages dumped\n");
};
break;
};
# does the user wish redirection on no availability? (i.e., is he
# in the voicemail (ser->grp) group?)
if (is_user_in("Request-URI", "voicemail")) {
t_on_failure("4");
setflag(4);
};
# native SIP destinations are handled using our USRLOC DB
lookup("aliases");
if (!lookup("location")) {
if (! t_newtran()) {
sl_reply_error();
break;
};
# we do not care about anything else but MESSAGEs
if (!method=="MESSAGE") {
if (!t_reply("404", "Not found")) {
sl_reply_error();
};
break;
};
log("MESSAGE received -> storing using MSILO\n");
# MSILO - storing as offline message
if (m_store("0")) {
log("MSILO: offline message stored\n");
if (!t_reply("202", "Accepted")) {
sl_reply_error();
};
}else{
log("MSILO: offline message NOT stored\n");
if (!t_reply("503", "Service Unavailable")) {
sl_reply_error();
};
};
break;
};
# if the downstream UA does not support MESSAGE requests
# go to failure_route[1]
t_on_failure("1");
t_relay();
break;
};
# forward to current uri now; use stateful forwarding; that
# works reliably even if we forward from TCP to UDP
if (!t_relay()) {
sl_reply_error();
};
}
failure_route[1] {
# forwarding failed -- check if the request was a MESSAGE
if (!method=="MESSAGE")
{
break;
};
log(1,"MSILO: the downstream UA does not support MESSAGE requests ...\n");
# we have changed the R-URI with the contact address -- ignore it now
if (m_store("1"))
{
log("MSILO: offline message stored\n");
t_reply("202", "Accepted for delivery");
}else{
log("MSILO: offline message NOT stored\n");
t_reply("503", "Service Unavailable");
};
}
failure_route[4] {
route(3);
#append_branch("sip:80000@10.1.2.5");
append_urihf("CC-Diversion: ", "\r\n");
append_hf("P-hint: OFFLINE-VOICEMAIL\r\n");
t_relay();
}
route[2] {
# ############################## #
# isdngw specific configuration #
# ############################## #
if(t_newtran()){
if(method=="INVITE" || method=="BYE" || method=="CANCEL"){
# send a response right at the start to avoid retransmissions
t_reply("100","Trying -- just wait a minute !");
# isdngw only gets activated on invite requests
if(method=="INVITE"){
# filename is defined in sems.conf.
if(uri=~"sip:[0-9]{10}@.*"){
if(!vm("/tmp/am_fifo","isdngw")){
log("could not contact isdngw\n");
t_reply("500","could not contact isdngw");
};
# Allow the announcement module of sems to be used as well.
# This can be useful for testing the isdngw.
} else if(uri=~"sip:7000@.*"){
if(!vm("/tmp/am_fifo","announcement")){
log("could not contact announcement\n");
t_reply("500","could not contact announcement");
};
# we dont feel responsible for sip addresses of any other kind,
# so send the right error code.
} else {
t_reply("404","Not Found");
};
# stop routing here, the message is now processed by the media server
break;
};
# The following handles the call termination, we must pass these requests
# to the media server as follows. Again make shure the fifo name and permissions
# are set correctly (like im sems.conf).
if((method=="BYE")||(method=="CANCEL")){
if(!vm("/tmp/am_fifo","bye")){
log("could not contact the media server\n");
t_reply("500","could not contact the media server");
};
break;
};
# other methods than INVITE, BYE and CANCEL are not handled by this SIP Server
# so we sent an error message
} else {
log("ERROR: method not supported\n");
t_reply("500", "sorry, method not supported");
};
} else {
# for any reason the transaction could not be created, send error code
log("could not create new transaction\n");
sl_send_reply("500","could not create new transaction");
};
# in isdngw.conf. Don't change this setting.
t_relay();
# end of routing.
}
route[3] {
############################################
# Voicemail specific configuration - begin #
############################################
if(method=="ACK" || method=="INVITE" || method=="BYE"){
if (!t_newtran()) {
log("could not create new transaction\n");
sl_send_reply("500","could not create new transaction");
break;
};
t_reply("100","Trying -- just wait a minute !");
if(method=="INVITE"){
if(!vm("/tmp/am_fifo","voicemail")) {
log("couldn't contact announcement server\n");
t_reply("500", "couldn not contact announcement server");
};
break;
};
if(method=="BYE" || method=="CANCEL") {
if(!vm("/tmp/am_fifo","bye")) {
log("could not contact the answer machine\n");
t_reply("500","could not contact the answer machine");
};
break;
};
};
if (method=="CANCEL") {
sl_send_reply("200", "cancels are junked here");
break;
};
sl_send_reply("501", "method not understood here");
}
route[4] {
######################################
# ivr specific configuration - begin #
######################################
if(method=="ACK" || method=="INVITE" || method=="BYE"){
if (!t_newtran()) {
log("could not create new transaction\n");
sl_send_reply("500","could not create new transaction");
break;
};
t_reply("100","Trying -- just wait a minute !");
if(method=="INVITE"){
log("**************** vm start - begin ******************\n");
if (uri=~"sip:5000@.*") {
if (!vm("/tmp/am_fifo", "ivr")) {
log("couldn't contact ivr server\n");
t_reply("500", "couldn not contact ivr server");
};
};
log("**************** vm start - end ******************\n");
} else if(method=="BYE"){
log("**************** vm end - begin ******************\n");
if(!vm("/tmp/am_fifo","bye")){
log("could not contact ivr\n");
t_reply("500","could not contact ivr");
};
log("**************** vm end - end ******************\n");
};
break;
};
if (method=="CANCEL") {
sl_send_reply("200", "cancels are junked here");
break;
};
sl_send_reply("501", "method not understood here");
}
route[5] {
# ####################################
# conference specific configuration #
# ####################################
if(t_newtran()){
if(method=="INVITE" || method=="BYE" || method=="CANCEL"){
# send a response right at the start to avoid retransmissions
t_reply("100","Trying -- just wait a minute !");
# isdngw only gets activated on invite requests
if(method=="INVITE"){
# filename is defined in sems.conf.
if(uri=~"sip:6000@.*"){
if(!vm("/tmp/am_fifo","conference")){
log("could not contact conference\n");
t_reply("500","could not contact conference");
};
# Allow the announcement module of sems to be used as well.
# This can be useful for testing the conference.
} else if(uri=~"sip:5000@.*"){
if(!vm("/tmp/am_fifo","announcement")){
log("could not contact announcement\n");
t_reply("500","could not contact announcement");
};
# we dont feel responsible for sip addresses of any other kind,
# so send the right error code.
} else {
t_reply("404","Not Found");
};
# stop routing here, the message is now processed by the media server
break;
};
# The following handles the call termination, we must pass these requests
# to the media server as follows. Again make shure the fifo name and permissions
# are set correctly (like im sems.conf).
if((method=="BYE")||(method=="CANCEL")){
if(!vm("/tmp/am_fifo","bye")){
log("could not contact the media server\n");
t_reply("500","could not contact the media server");
};
break;
};
# other methods than INVITE, BYE and CANCEL are not handled by this SIP Server
# so we sent an error message
} else {
log("ERROR: method not supported\n");
t_reply("500", "sorry, method not supported");
};
} else {
# for any reason the transaction could not be created, send error code
log("could not create new transaction\n");
sl_send_reply("500","could not create new transaction");
};
# in isdngw.conf. Don't change this setting.
t_relay();
# end of routing.
}
route[6] {
######################################
# announcement configuration - begin #
######################################
if(method=="ACK" || method=="INVITE" || method=="BYE"){
if (!t_newtran()) {
log("could not create new transaction\n");
sl_send_reply("500","could not create new transaction");
break;
};
t_reply("100","Trying -- just wait a minute !");
if(method=="INVITE"){
log("**************** vm start - begin ******************\n");
if (uri=~"sip:7000@.*") {
if (!vm("/tmp/am_fifo", "announcement")) {
log("couldn't contact ivr server\n");
t_reply("500", "couldn not contact announcement");
};
};
log("**************** vm start - end ******************\n");
} else if(method=="BYE"){
log("**************** vm end - begin ******************\n");
if(!vm("/tmp/am_fifo","bye")){
log("could not contact annoucement\n");
t_reply("500","could not contact annoucement");
};
log("**************** vm end - end ******************\n");
};
break;
};
if (method=="CANCEL") {
sl_send_reply("200", "cancels are junked here");
break;
};
sl_send_reply("501", "method not understood here");
}
route[7] {
# non-Voip -- just send "off-line"
if (!(method=="INVITE" || method=="ACK" || method=="CANCEL")) {
sl_send_reply("404", "Not Found");
break;
};
if (t_newtran()) {
t_reply("404", "Not Found");
acc_db_request("404 missed call", "missed_calls");
};
}
Hi All,
I have successfully called to PSTN unfortunately I got cut off in about a
minute, the gateway provider told us that he can't see an ACK from my SIP,
but on my SIP, I received an ACK from the SIP phone. How can I forward that
ACK to the gateway providers SIP?
Thank You
Ronald
1. no direct mails -> mail to the list!
2. maybe you should make yourself familiar with php, mysql and SQL first!
3.
gaillac harry wrote:
> Here is my missed_calls.php
>
> Where is the SQL query file ???
>
> $q="select username, domain from ".$config->table_aliases.
> " where
> 'sip:".$auth->auth["uname"]."@".$config->default_domain."'=contact";
>
this is an SQL query
oh, here is antohter one
>
> $q="delete from ".$config->table_missed_calls.
> " where username='".$row."' and domain='".$dom."' ".
> " and time<'".gmdate("Y-m-d H:i:s", $page_loaded_timestamp)."'";
> $res=mySQL_query($q);
> if (!$res) {$errors[]="error in SQL query, line: ".__LINE__; }
and again a query!
> */
> $q="(SELECT t1.from_uri, t1.sip_from, t1.time, t1.sip_status ".
> "FROM missed_calls t1 ".
> "WHERE t1.username='".$auth->auth["uname"]."' and
> t1.domain='".$config->default_domain."' ) ".
> "UNION ".
> "(SELECT t1.from_uri, t1.sip_from, t1.time, t1.sip_status ".
> "FROM missed_calls t1, aliases t2 ".
> "WHERE 'sip:".$auth->auth["uname"]."@".$config->default_domain."'".
> "=t2.contact AND t2.username=t1.username AND t2.domain=t1.domain )
> ".
> "ORDER BY time DESC";
That's probably not very useful for you (as it looks like you have no
glue what you are talking about - sorry), but I will give you another
hint from your previous mail:
> >I've still a problem with missed_calls.php from serweb "error in SQL
> > query, line: 77 No missed calls".
--> check line 77 and you will find a query just before it!
klaus
Hey Guys (And most likely No girls :( )
I'v got this scenario now :
if a user does have voicemail everything is great!. No problems. Thou,
my case is that I've got users who does not have a voicemail service,
and may disconnect from my gw.
Then when a imcoming call coms, the "caller" get's a 404 (per today).
So the way I want it to be is :
if (!lookup("location"){
(lookup("subscirber"){
log(1,"user's not online but does exist");
sl_send_reply("404", "Not found,but exists");
break;
}
log(1,"404 , user not found");
sl_send_reply("404","Not found");
break;
}
If I do it like this,the !lookup("subscriber") will fail, because it
cant do this.
How can I get this to work ?
I see 2 difrent way's of doing it.
1: Create a database with the name users, and dump all my users from
this into that database,, then have the same structure etc as I have
in the locations database..
.. As far as I see , this will be a ugly hack.
2: make a new function for this ..
How and what do you guys mean ?
Thanks for a quick answer :)
You guys are REALLY helpful both night and day.
- Atle
Hi i am using default file for ser.cfg and grandstream 286....any call made
from garndstream gets disconnected in 9 seconds...cisco works fine...i
traced logs also....but didn't get any clue...
_________________________________________________________________
Deals can't get any better. Products at Lowest Prices.
http://go.msnserver.com/IN/47508.asp Only on baazee.com
i think this may be the problem
1.uncomment this one
modparam("usrloc", "db_mode", 0)
2.give this syntax correctly
modparam("usrloc", "db_url", "sql//ser:heslo@localhost/ser")
Hello,
Klaus, Jan, thank you very much for your answers. Below is the list of
RFCs I'm interested in. As Klaus says, maybe some of them don't need
explicit support, because ser can route these new messages. Or maybe
there are RFCs that are not fully supported. Please, let me know if
this is the case and if it could be necessary writting a new module or
changing SER core.
By the way, can SER initiate a session release (it means, generate a
BYE) or generate a REGISTER to an application server? If not, what
would be necessary from your point of view?
Again, thank you very much for your time and knowledge. I know that
there are a lot of questions in this message, so thank you.
Curro
(These five RFCs are related to new messages, so I suppose Yes)
RFC 2976 (October 2000): "The SIP INFO method".
RFC 3262 (June 2002): "Reliability of provisional responses in Session
Initiation Protocol (SIP)".
(can SER generate PRACK, besides proxying it?)
RFC 3515 (April 2003): "The Session Initiation Protocol (SIP) REFER
method".
RFC 3311 (September 2002): "The Session Initiation Protocol (SIP)
UPDATE method".
RFC 3428 (December 2002): "Session Initiation Protocol (SIP) Extension
for Instant Messaging".
RFC 3313 (January 2003): "Private Session Initiation Protocol (SIP)
Extensions for Media Authorization".
RFC 3265 (June 2002): "Session Initiation Protocol (SIP) Specific Event
Notification".
(As far as I know, SER handles SUBSCRIBE and NOTIFY, but I want to know
whether SER can act as the subscriber to the event information, it
means, generate SUBSCRIBE)
RFC 3327 (December 2002): "Session Initiation Protocol Extension Header
Field for Registering Non-Adjacent Contacts".
RFC 3325 (November 2002): "Private Extensions to the Session Initiation
Protocol (SIP) for Network Asserted Identity within Trusted Networks".
RFC 3323 (November 2002): "A Privacy Mechanism for the Session
Initiation Protocol (SIP)".
RFC 3608 (October 2003): "Session Initiation Protocol (SIP) Extension
Header Field for Service Route Discovery During Registration".
RFC 3486 (February 2003): "Compressing the Session Initiation Protocol
(SIP)".
RFC 3455 (January 2003): "Private Header (P-Header) Extensions to the
Session Initiation Protocol (SIP) for the 3rd-Generation Partnership
Project (3GPP)".
RFC 3329 (January 2003): "Security Mechanism Agreement for the Session
Initiation Protocol (SIP)".
----- Mensaje Original -----
De: Jan Janak <jan(a)iptel.org>
Fecha: Lunes, Abril 12, 2004 10:28 pm
Asunto: Re: [Serusers] SER 0.8.12 and RFC
> There is no such list. If you need it then put together a list of RFCs
> you are interested in and we will add yes/no to each entry in the
> list.
> Jan.
>
> On 12-04 12:38, CURRO_DOMINGUEZ wrote:
> > Hello all the list
> >
> > I'm looking some information about SER at www.iptel.org but I've
> found
> > nothing. I would like to know the list of RFC that SER
> implements
> > (related to SIP or SIP extensions), besides RFC3261.
> >
> > I think it could be interesting to add this information at the
> product
> > sheet.
> >
> > Can you help me?
> >
> > Thank you very much
> >
> > Curro
> >
> >
> >
> >
> > _______________________________________________
> > Serusers mailing list
> > serusers(a)lists.iptel.org
> > http://lists.iptel.org/mailman/listinfo/serusers
>