– Kamailio SIP Server –

Indexmenu Plugin: If you use the 'js'-option of the indexmenu plugin, you have to disable the 'defer_js'-setting. This setting is temporary, in the future the indexmenu plugin will be improved.

OpenSER Configuration File For Presence Server

Example started from default configuration file

The example uses '10.10.10.10' as server's IP address, you have to replace it with yours.

#
# $Id$
#
# simple quick-start config script
#
 
# ----------- global configuration parameters ------------------------
 
/* Uncomment these lines to enter debugging mode */ 
debug=7            # debug level (cmd line: -dddddddddd)
fork=no
log_stderror=yes
 
check_via=no	# (cmd. line: -v)
dns=no          # (cmd. line: -r)
rev_dns=no      # (cmd. line: -R)
listen=udp:10.10.10.10:5060
children=4
 
 
#
# uncomment the following lines for TLS support
#disable_tls = 0
#listen = tls:your_IP:5061
#tls_verify_server = 1
#tls_verify_client = 1
#tls_require_client_certificate = 0
#tls_method = TLSv1
#tls_certificate = "/usr/local/etc/openser/tls/user/user-cert.pem"
#tls_private_key = "/usr/local/etc/openser/tls/user/user-privkey.pem"
#tls_ca_list = "/usr/local/etc/openser/tls/user/user-calist.pem"
 
# ------------------ module loading ----------------------------------
mpath="/usr/local/lib/openser/modules/"
 
loadmodule "mysql.so"
loadmodule "sl.so"
loadmodule "maxfwd.so"
loadmodule "textops.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "presence.so"
loadmodule "avpops.so"
 
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "mi_fifo.so"
 
 
# Uncomment this if you want digest authentication
# mysql.so must be loaded !
#loadmodule "/usr/local/lib/openser/modules/auth.so"
#loadmodule "/usr/local/lib/openser/modules/auth_db.so"
 
# ----------------- setting module-specific parameters ---------------
 
# -- usrloc params --
# 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")
 
# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)
 
# -- presence params --
modparam("presence|usrloc", "db_url",
   "mysql://openser:openserrw@127.0.0.1/openser")
modparam("presence", "max_expires", 3600)
modparam("presence", "force_active", 1)
modparam("presence", "server_address", "sip:10.10.10.10:5060" )
 
# -- mi_fifo params --
modparam("mi_fifo","fifo_name", "/tmp/openser_fifo")
 
# -------------------------  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");
		exit;
	};
 
	if (msg:len >=  2048 ) {
		sl_send_reply("513", "Message too big");
		exit;
	};
 
	# 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
	if (!method=="REGISTER")
		record_route();
 
	# subsequent messages withing a dialog should take the
	# path determined by record-routing
	if (loose_route()) {
		# mark routing logic in request
		append_hf("P-hint: rr-enforced\r\n"); 
		route(1);
	};
 
	if (!uri==myself) {
		# mark routing logic in request
		append_hf("P-hint: outbound\r\n"); 
		# if you have some interdomain connections via TLS
		#if(uri=~"@tls_domain1.net") {
		#	t_relay("tls:domain1.net");
		#	exit;
		#} else if(uri=~"@tls_domain2.net") {
		#	t_relay("tls:domain2.net");
		#	exit;
		#}
		route(1);
	};
 
	# 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) {
 
		# presence handling
		if( is_method("PUBLISH|SUBSCRIBE"))
			route(2);
 
		if (method=="REGISTER") {
 
			# Uncomment this if you want to use digest authentication
			#if (!www_authorize("openser.org", "subscriber")) {
			#	www_challenge("openser.org", "0");
			#	exit;
			#};
 
			save("location");
			exit;
		};
 
		# native SIP destinations are handled using our USRLOC DB
		if (!lookup("location")) {
			sl_send_reply("404", "Not Found");
			exit;
		};
		append_hf("P-hint: usrloc applied\r\n"); 
	};
 
	route(1);
}
 
 
route[1] {
	# send it out now; use stateful forwarding as it works reliably
	# even for UDP2TCP
	if (!t_relay()) {
		sl_reply_error();
	};
	exit;
}
 
# presence handling route
route[2]
{
	# absorb retransmissions
	if (! t_newtran())
	{
	        sl_reply_error();
	        exit;
	};
 
	if(is_method("PUBLISH"))
	{
		handle_publish();
		t_release();
	} else if( is_method("SUBSCRIBE")) {
		handle_subscribe();
		t_release();
	};
 
	exit;
}

Stand alone presence server

The example uses '10.10.10.10' as server's IP address, you have to replace it with yours.

For NAT traversal you have to use fix_nated_contact() from 'nathelper' module. In your main SIP server, just forward PUBLISH and SUBSCRIBE requests to the presence server.

#
# $Id$
#
# simple quick-start config script
#
 
# ----------- global configuration parameters ------------------------
 
/* Uncomment these lines to enter debugging mode */
debug=7            # debug level (cmd line: -dddddddddd)
fork=no
log_stderror=yes
 
check_via=no    # (cmd. line: -v)
dns=no          # (cmd. line: -r)
rev_dns=no      # (cmd. line: -R)
listen=udp:10.10.10.10:5060
children=4
 
#
# uncomment the following lines for TLS support
#disable_tls = 0
#listen = tls:your_IP:5061
#tls_verify_server = 1
#tls_verify_client = 1
#tls_require_client_certificate = 0
#tls_method = TLSv1
#tls_certificate = "/usr/local/etc/openser/tls/user/user-cert.pem"
#tls_private_key = "/usr/local/etc/openser/tls/user/user-privkey.pem"
#tls_ca_list = "/usr/local/etc/openser/tls/user/user-calist.pem"
 
# ------------------ module loading ----------------------------------
mpath="/usr/local/openser/lib/openser/modules/"
 
loadmodule "mysql.so"
loadmodule "sl.so"
loadmodule "maxfwd.so"
loadmodule "textops.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "presence.so"
loadmodule "avpops.so"
loadmodule "mi_fifo.so"
 
## Uncomment this line if this presence server is handling Dialog Info presence ( BLF )
#loadmodule "presence_dialoginfo.so"
 
## Uncomment this line if this presence server is handling MWI ( Message Waiting Indicator, the voicemail light )
#loadmodule "presence_mwi.so"
 
# ----------------- setting module-specific parameters ---------------
 
# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)
 
# -- presence params --
modparam("presence", "db_url", "mysql://openser:openserrw@localhost/openser")
 
modparam("presence", "force_active", 1)
 
modparam("presence", "server_address", "sip:10.10.10.10:5060")
 
modparam("mi_fifo", "fifo_name", "/tmp/openser_fifo_presence")
 
# -------------------------  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");
        exit;
    };
 
    if (msg:len >=  2048 ) {
        sl_send_reply("513", "Message too big");
        exit;
    };
 
    # 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
    if (!is_method("SUBSCRIBE|PUBLISH")) {
        sl_send_reply("488", "Not Acceptable Here");
        exit;
    }
 
    # presence handling
    if (! t_newtran())
    {
        sl_reply_error();
        exit;
     };
 
    if(is_method("PUBLISH"))
    {
        handle_publish("");
        t_release();
    } else if( is_method("SUBSCRIBE"))
    {
        handle_subscribe();
        t_release();
    };
 
    exit;
}