From 0eaa276421b09dda5b2b94d5a760eb80a7edcbfa Mon Sep 17 00:00:00 2001 From: karl anderson Date: Fri, 31 May 2013 11:39:23 -0700 Subject: [PATCH 1/9] added haproxy, rabbitmq, kamailio, config.ini, and updated freeswitch confs --- autoload_configs/cepstral.conf.xml | 12 - autoload_configs/httapi.conf.xml | 127 ---- autoload_configs/kazoo.conf.xml | 19 +- autoload_configs/modules.conf.xml | 3 - config.ini | 25 + haproxy/haproxy.cfg | 39 ++ kamailio/dispatcher.list | 1 + kamailio/kamailio.cfg | 944 +++++++++++++++++++++++++++++ rabbitmq/enabled_plugins | 1 + rabbitmq/rabbitmq-env.conf | 5 + 10 files changed, 1025 insertions(+), 151 deletions(-) delete mode 100644 autoload_configs/cepstral.conf.xml delete mode 100644 autoload_configs/httapi.conf.xml create mode 100644 config.ini create mode 100644 haproxy/haproxy.cfg create mode 100644 kamailio/dispatcher.list create mode 100644 kamailio/kamailio.cfg create mode 100644 rabbitmq/enabled_plugins create mode 100644 rabbitmq/rabbitmq-env.conf diff --git a/autoload_configs/cepstral.conf.xml b/autoload_configs/cepstral.conf.xml deleted file mode 100644 index cf4aa92..0000000 --- a/autoload_configs/cepstral.conf.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/autoload_configs/httapi.conf.xml b/autoload_configs/httapi.conf.xml deleted file mode 100644 index 50bbe78..0000000 --- a/autoload_configs/httapi.conf.xml +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/autoload_configs/kazoo.conf.xml b/autoload_configs/kazoo.conf.xml index 547e725..4cbd97f 100644 --- a/autoload_configs/kazoo.conf.xml +++ b/autoload_configs/kazoo.conf.xml @@ -1,12 +1,13 @@ - + + - - - - - - - + + + + --> + + + - \ No newline at end of file + diff --git a/autoload_configs/modules.conf.xml b/autoload_configs/modules.conf.xml index 8dc91db..ec0312b 100644 --- a/autoload_configs/modules.conf.xml +++ b/autoload_configs/modules.conf.xml @@ -22,13 +22,11 @@ - - @@ -39,7 +37,6 @@ - diff --git a/config.ini b/config.ini new file mode 100644 index 0000000..e013c7c --- /dev/null +++ b/config.ini @@ -0,0 +1,25 @@ +; section are between [] = [section] +; key = value +; to comment add ";" in front of the line +[amqp] +uri = "amqp://guest:guest@127.0.0.1:5672" + +[bigcouch] +compact_automatically = true +cookie = change_me +ip = "127.0.0.1" +port = 5984 +; username = "XXX" +; password = "XXX" +admin_port = 5986 + +[whistle_apps] +cookie = change_me + +[ecallmgr] +cookie = change_me + +[log] +syslog = info +console = notice +file = error diff --git a/haproxy/haproxy.cfg b/haproxy/haproxy.cfg new file mode 100644 index 0000000..a2201fc --- /dev/null +++ b/haproxy/haproxy.cfg @@ -0,0 +1,39 @@ +global + log 127.0.0.1 local0 + log 127.0.0.1 local1 notice + maxconn 4096 + user haproxy + group haproxy + stats socket /tmp/haproxy.sock mode 777 + +defaults + log global + mode http + option httplog + option dontlognull + option redispatch + option httpchk GET / + option allbackups + maxconn 2000 + retries 3 + timeout connect 6000ms + timeout client 12000ms + timeout server 12000ms + +listen bigcouch-data 127.0.0.1:15984 + balance roundrobin + server db1.zone1.mydomain.com 127.0.0.1:5984 check + server db2.zone1.mydomain.com 127.0.0.2:5984 check + server db3.zone2.mydomain.com 127.0.0.3:5984 check backup + server db4.zone2.mydomain.com 127.0.0.4:5984 check backup + +listen bigcouch-mgr 127.0.0.1:15986 + balance roundrobin + server db1.zone1.mydomain.com 127.0.0.1:5986 check + server db2.zone1.mydomain.com 127.0.0.2:5986 check + server db3.zone2.mydomain.com 127.0.0.3:5986 check backup + server db4.zone2.mydomain.com 127.0.0.4:5986 check backup + +listen haproxy-stats 127.0.0.1:22002 + mode http + stats uri / diff --git a/kamailio/dispatcher.list b/kamailio/dispatcher.list new file mode 100644 index 0000000..d50f425 --- /dev/null +++ b/kamailio/dispatcher.list @@ -0,0 +1 @@ +# setit(integer) destination(sip uri) flags (integer, optional) diff --git a/kamailio/kamailio.cfg b/kamailio/kamailio.cfg new file mode 100644 index 0000000..26a8fe4 --- /dev/null +++ b/kamailio/kamailio.cfg @@ -0,0 +1,944 @@ +#### Preprocessor Directives ######### +#!define L_ALERT -5 +#!define L_BUG -4 +#!define L_CRIT2 -3 +#!define L_CRIT -2 +#!define L_ERR -1 +#!define L_WARN 0 +#!define L_NOTICE 1 +#!define L_INFO 2 +#!define L_DBG 3 + +#!define AVP_RECV_PARAM "recv_param" +#!define AVP_LOG_LEVEL "log_level" +#!define AVP_ROUTE_CNT "route_cnt" +#!define AVP_ASSOCIATED_SERVER "associated_server" +#!define AVP_ASSOCIATE_CONTACT "associate_contact" + +####### Global Parameters ######### +fork = yes +children = 16 +#group = +#user = +server_signature = no +server_header = "Server: Kazoo" +user_agent_header = "User-Agent: Kazoo" +shm_force_alloc = yes +mlock_pages = yes +phone2tel = 1 +max_while_loops = 500 + +####### Logging Parameters ######### +debug = L_INFO +memdbg = 10 +memlog = 10 +corelog = L_ERR +log_stderror = no +log_facility = LOG_LOCAL0 +log_name="kamailio" + +####### Alias Parameters ######### +auto_aliases = yes +# alias = "mydomain.net" + +####### Binding Parameters ######### +listen = tcp:127.0.0.1:5060 +listen = udp:127.0.0.1:5060 +listen = tcp:127.0.0.1:5080 +listen = udp:127.0.0.1:5080 +listen = tcp:127.0.0.1:7000 +listen = udp:127.0.0.1:7000 + +#listen = tcp:127.0.0.1:5065 +#listen = udp:127.0.0.1:5065 +tos = IPTOS_LOWDELAY + +####### TCP Parameters ######### +tcp_children = 25 +disable_tcp = no +tcp_max_connections = 4096 +tcp_connection_lifetime = 3605 +tcp_accept_aliases = no +tcp_async = yes +tcp_connect_timeout = 10 +tcp_conn_wq_max = 65536 +tcp_crlf_ping = yes +tcp_delayed_ack = yes +tcp_fd_cache = yes +tcp_keepalive = yes +tcp_keepcnt = 3 +tcp_keepidle = 30 +tcp_keepintvl = 10 +tcp_linger2 = 30 +tcp_rd_buf_size = 4096 +tcp_send_timeout = 10 +tcp_wq_blk_size = 2100 +tcp_wq_max = 10485760 + +####### UDP Parameters ######### +udp4_raw = -1 +udp4_raw_mtu = 1500 + +####### DNS Parameters ######### +dns = no +rev_dns = no +dns_try_ipv6 = no +use_dns_cache = on +dns_cache_del_nonexp = no +dns_cache_flags = 1 +dns_cache_gc_interval = 120 +dns_cache_init = 1 +dns_cache_mem = 1000 +dns_cache_negative_ttl = 60 +dns_try_naptr = no +use_dns_failover = off +dns_srv_lb = off + +####### TLS Parameters ######### +enable_tls = yes + +####### SCTP Parameters ######### +disable_sctp = yes + +####### Custom Parameters ######### + + +####### Modules Section ######## +mpath="/usr/local/lib64/kamailio/modules/" + + +####### Flags ####### +flags + FLAG_INTERNALLY_SOURCED: 1, +# FLAG_ITSP_SOURCED: 2, + FLAG_ASSOCIATE_SERVER: 3, + FLAG_SKIP_NAT_CORRECTION: 4; + +#!define FLB_NATB 6 +#!define FLB_NATSIPPING 7 + + +######## Kamailio core extensions module ######## +loadmodule "kex.so" + +######## Transaction (stateful) module ######## +loadmodule "tm.so" +loadmodule "tmx.so" +modparam("tm", "auto_inv_100", 1) +modparam("tm", "auto_inv_100_reason", "Attempting to connect your call") +modparam("tm", "cancel_b_method", 2) +modparam("tm", "ruri_matching", 0) +modparam("tm", "failure_reply_mode", 3) +# modparam("tm", "fr_timer", 30000) +# modparam("tm", "fr_inv_timer", 120000) + +######## Stateless replier module ######## +loadmodule "sl.so" + +######## Record-Route and Route module ######## +loadmodule "rr.so" +modparam("rr", "enable_full_lr", 1) + +######## Max-Forward processor module ######## +loadmodule "maxfwd.so" + +######## SIP utilities [requires sl] ######## +loadmodule "siputils.so" + +######## SIP message formatting sanity checks [requires sl] ######## +loadmodule "sanity.so" +# sip_version, scheme, req_headers, cseq_method/value +# content_length, parse_uri, digest +modparam("sanity", "default_checks", 3303) +modparam("sanity", "uri_checks", 3) +modparam("sanity", "autodrop", 0) + +######## Text operations module ######## +loadmodule "textops.so" +loadmodule "textopsx.so" + +######## Path support for SIP loadbalancer ######## +loadmodule "path.so" +modparam("path", "use_received", 0) + +######## Generic Hash Table container in shared memory ######## +loadmodule "htable.so" +#modparam("htable", "htable", "associations=>size=14;") +modparam("htable", "htable", "a=>size=10;") + +/* +######## Memcached connector module ######## +loadmodule "memcached.so" +modparam("memcached", "servers", "localhost:11211") +modparam("memcached", "expire", 10800) +modparam("memcached", "mode", 0) +modparam("memcached", "timeout", 10000) +*/ + +######## Module holding Pseudo-Variables ######## +loadmodule "pv.so" + +######## Advanced logger module ######## +loadmodule "xlog.so" + +####### FIFO support for Management Interface ######## +loadmodule "mi_fifo.so" +modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo") + +####### Different config utilities ######## +loadmodule "cfgutils.so" + +####### Dispatcher Module Parameters ######## +loadmodule "dispatcher.so" +modparam("dispatcher", "list_file", "/etc/kazoo/kamailio/dispatcher.list") +modparam("dispatcher", "flags", 2) +modparam("dispatcher", "use_default", 0) +modparam("dispatcher", "force_dst", 1) +modparam("dispatcher", "dst_avp", "$avp(ds_dst)") +modparam("dispatcher", "attrs_avp", "$avp(ds_attrs)") +modparam("dispatcher", "grp_avp", "$avp(ds_grp)") +modparam("dispatcher", "cnt_avp", "$avp(ds_cnt)") +modparam("dispatcher", "hash_pvar", "$avp(ds_grp)") +# modparam("dispatcher", "setid_pvar", "$var(setid)") +modparam("dispatcher", "ds_ping_method", "OPTIONS") +modparam("dispatcher", "ds_ping_from", "sip:sipcheck@127.0.0.1") +modparam("dispatcher", "ds_ping_interval", 10) +# modparam("dispatcher", "ds_ping_sock", "udp:{{SIP_IP}}:{{SIP_PORT}}") +modparam("dispatcher", "ds_probing_threshhold", 3) +modparam("dispatcher", "ds_probing_mode", 1) +modparam("dispatcher", "ds_ping_reply_codes", "501,403,404,400,200") + +######## Uac_redirect ######## +loadmodule "uac_redirect.so" + + +####### db_kazoo registrar modules ########## +loadmodule "db_kazoo.so" +loadmodule "auth.so" +loadmodule "auth_db.so" + +# ----- registrar modules ----- +loadmodule "usrloc.so" +loadmodule "registrar.so" + +modparam("auth_db|usrloc", "db_url", "kazoo://guest:guest@127.0.0.1:5672/callmgr") +modparam("auth_db", "use_domain", 1) +modparam("auth_db", "version_table", 0) +modparam("auth_db", "calculate_ha1", 1) +modparam("auth_db", "password_column", "password") +modparam("auth_db", "load_credentials", "$avp(password)=password") + + +/* enable DB persistency for location entries */ +modparam("usrloc", "db_mode", 1) +modparam("usrloc", "db_update_as_insert", 1) +modparam("usrloc", "use_domain", 1) +modparam("usrloc", "nat_bflag", FLB_NATB) + + +######## NAT traversal module - signaling functions ######## +loadmodule "nathelper.so" +modparam("nathelper|registrar", "received_avp", "$avp(AVP_RECV_PARAM)") +modparam("nathelper", "natping_interval", 30) +modparam("nathelper", "ping_nated_only", 1) +modparam("nathelper", "natping_processes", 5) +modparam("nathelper", "sipping_bflag", FLB_NATSIPPING) +modparam("nathelper", "sipping_from", "sip:sipcheck@127.0.0.1") +#modparam("nathelper", "natping_socket", "127.0.0.1:5060") + + +####### Routing Logic ######## +route { + # log the basic info regarding this call + xlog("L_INFO", "$ci|start|recieved $oP request $rm $ou"); + xlog("L_INFO", "$ci|log|source $si:$sp"); + xlog("L_INFO", "$ci|log|from $fu"); + xlog("L_INFO", "$ci|log|to $tu"); + + route(SANITY_CHECK); + + route(SET_LOGGING_FLAGS); + + route(CLASSIFY_SOURCE); + + route(HANDLE_OPTIONS); + + route(HANDLE_IN_DIALOG_REQUESTS); + + route(PREPARE_INITIAL_REQUESTS); + + if (isflagset(FLAG_INTERNALLY_SOURCED)) { + route(INTERNAL_TO_EXTERNAL_RELAY); + exit(); + } + + route(HANDLE_MOVE_REQUEST); + + route(FIND_ROUTES); + + $avp(route_attempts) = 1; + route(EXTERNAL_TO_INTERNAL_RELAY); +} + +route[SANITY_CHECK] { + if (!mf_process_maxfwd_header("10")) { + xlog("L_WARN", "$ci|end|max-forward limit reached"); + sl_send_reply("483", "Too Many Hops"); + exit; + } + + if (!sanity_check()) { + xlog("L_WARN", "$ci|end|message is insane"); + exit; + } +} + +route[SET_LOGGING_FLAGS] { + return(); +} + +route[CLASSIFY_SOURCE] +{ + if (ds_is_from_list("1") || ds_is_from_list("3")) + { + xlog("L_INFO", "$ci|log|originated from internal sources"); + + setflag(FLAG_INTERNALLY_SOURCED); + } + else + { + xlog("L_INFO", "$ci|log|originated from external sources"); + } +} + +/* +route[CLASSIFY_SOURCE] { + switch($mct($si)) { + case "itsp": + xlog("L_INFO", "$ci|log|message is from ITSP"); + setflag(FLAG_ITSP_SOURCED); + break; + case "kazoo": + xlog("L_INFO", "$ci|log|message is from KAZOO"); + setflag(FLAG_INTERNALLY_SOURCED); + break; + default: + xlog("L_INFO", "$ci|log|message is from an unknown source"); + break; + } +} +*/ + +route[HANDLE_OPTIONS] { + if (is_method("OPTIONS")) { + if (isflagset(FLAG_INTERNALLY_SOURCED)) { + route(INTERNAL_TO_EXTERNAL_RELAY); + } else { + sl_send_reply("200", "Rawr!!"); + } + exit; + } +} + +# Called on in-dialog requests +# If the request in an Invite for on hold from external to internal, +# associate the contact with the media server +route[MAYBE_ASSOCIATE_USER] { + # if Invite for on hold, we need to associate the contact URI with the next hop + + if (is_method("INVITE") && !isflagset(FLAG_INTERNALLY_SOURCED) && is_audio_on_hold()) { + $var(contact_uri) = $(ct{tobody.user}) + "@" + $(ct{tobody.host}); + xlog("L_INFO", "$ci|log|associate user $var(contact_uri):$si:$sp with media server $du\n"); + $sht(associations=>$var(contact_uri))= $du; + } + +} + +route[HANDLE_IN_DIALOG_REQUESTS] { + if (has_totag()) { + if (loose_route()) { + xlog("L_INFO", "$ci|log|loose_route in-dialog message"); + + route(MAYBE_ASSOCIATE_USER); + + route(RELAY); + } else if (isflagset(FLAG_INTERNALLY_SOURCED)) { + xlog("L_INFO", "$ci|log|relay internally sourced in-dialog message without loose_route"); + if(is_method("INVITE")) { + xlog("L_INFO", "$ci|log|re-associate $ci with media server $si:$sp"); + } + route(RELAY); + } else if (t_check_trans()) { + xlog("L_INFO", "$ci|log|allow message for a known transaction"); + route(RELAY); + } else { + xlog("L_INFO", "$ci|log|message had a to-tag but can't be loose routed"); + sl_send_reply("481", "Call Leg/Transaction Does Not Exist"); + } + exit(); + } +} + + route[PREPARE_INITIAL_REQUESTS] { + if (is_method("CANCEL")) { + if (t_check_trans()) { + route(RELAY); + } else { + sl_send_reply("481", "Call Leg/Transaction Does Not Exist"); + } + exit(); + } else if (is_method("ACK")) { + if (t_check_trans()) { + route(RELAY); + } + exit(); + } + + t_check_trans(); + + if (loose_route()) { + sl_send_reply("403", "No pre-loaded routes"); + exit(); + } + + if (is_method("REGISTER")) { + + if (nat_uac_test("3")) { + xlog("L_INFO", "Nated contact\n"); +# setflag(FLB_NATSIPPING); + force_rport(); + setbflag(FLB_NATB); + setbflag(FLB_NATSIPPING); + + fix_nated_register(); + } + # authenticate requests + # check iif we have the password in cache + if ( is_present_hf("Authorization") ) { + if ( $sht(a=>$Au) != $null ) { + xlog("L_INFO", "Found stored password for $Au, $sht(a=>$Au)\n"); + if (!pv_auth_check("$fd", "$sht(a=>$Au)", "0", "0")) { + xlog("L_INFO", "Authentication did not work with stored password\n"); + + ## RABBITMQ - Credentials fetch + if (!auth_check("$fd", "subscriber", "1")) { + auth_challenge("$fd", "0"); + exit; + } else { + xlog("Credential fetch $avp(password)\n"); + # xlog("au=$au, ad = $ad, aU=$aU, Au= $Au\n"); + $sht(a=>$Au) = $avp(password); + } + } + } else { + ## RABBITMQ - Credentials fetch + if (!auth_check("$fd", "subscriber", "1")) { + auth_challenge("$fd", "0"); + exit; + } else { + xlog("L_INFO", "Credential fetch $avp(password)\n"); + # xlog("au=$Au, ad = $ad, aU=$aU, Au= $Au\n"); + $sht(a=>$Au) = $avp(password); + } + } + } else { + auth_challenge("$fd", "0"); + exit; + } + + + # user authenticated - remove auth header + consume_credentials(); + +# if (!add_path_received()) { + # sl_send_reply("503", "Internal path befuddlement"); + # # route(CLEANUP_DIALOG); + # exit(); + # } + + save("location"); + exit; + /* + if (is_method("REGISTER")) { + if (!add_path_received()) { + sl_send_reply("503", "Internal path befuddlement"); + # route(CLEANUP_DIALOG); + exit(); + } + */ + } else { + if (!is_method("MESSAGE")) + record_route(); + } +} + +# Take the routes from dispatcher - hash over callid +# If prefered route defined, reorder the destionations +route[FIND_ROUTES] +{ + if (is_method("REGISTER")) + { + # alg 2 = hash(To URI) + # To URI is actually AOR - to help with nounce reusage at reRegister + if (!ds_select_dst("3", "2") && !ds_select_dst("1", "2")) + { + xlog("L_ERR", "$ci|end|no servers avaliable"); + + sl_send_reply("480", "All servers busy"); + + exit; + } + } + else + { + # alg 0 = hash(Callid) + if (!ds_select_dst("1", "0")) + { + xlog("L_ERR", "$ci|end|no servers avaliable"); + + sl_send_reply("480", "All servers busy"); + + exit; + } + + # Handle the case when a prefered route is set + $var(contact_uri) = $(ct{tobody.user}) + "@" + $(ct{tobody.host}); + + if ($sht(associations=>$var(contact_uri)) != $null) + { + $var(prefered_route) = $sht(associations=>$var(contact_uri)); + + xlog("L_INFO", "$ci|log|should route to $var(prefered_route)"); + + route(REORDER_ROUTES); + } + + } +} + +route[REORDER_ROUTES] { + # if the dispatcher list does not start with + # the the prefered route, reorder the list so that it does + + if ($(avp(ds_dst)[0]) != $var(prefered_route)) + { + # create a index var for our loop (arrays are start at 0 and this is a count) + $var(i) = $avp(ds_cnt) - 1; + + # loop over the dispatcher list + while($var(i) > 0) + { + # if this element in the dispatch list is the same + # as the call destination + if($(avp(ds_dst)[$var(i)]) == $var(prefered_route)) + { + # replace it with the first element of the list + $(avp(ds_dst)[$(var(i))]) = $(avp(ds_dst)[0]); + + # break out of the loop + $var(i) = -1; + } + + $var(i) = $var(i) - 1; + } + + # handles the case were we only have two servers + # and the one that we are locked to has failed + if ($var(i) >= 0) + { + + xlog("L_INFO", "$ci|log|associated media server is inactive, moving to $rd"); + + $sht(associations=>$var(contact_uri)) = "sip:$rd:$rp"; + + xlog("L_INFO", "$ci|log|associated contact $var(contact_uri) with media server sip:$rd:$rp"); + } + # the server we are locked to is in the active server list from then + # dispatcher so re-arrange the list to try it first + else + { + xlog("L_INFO", "$ci|log|re-ordering the dispatcher list to keep associated server first"); + + # set the first element of the list to the destination + $(avp(ds_dst)[0]) = $var(prefered_route); + + # set the domain for this request (server IP to route to) + $rd = $(var(prefered_route){uri.host}); + + # set the port for this request (server IP to route to) + $rp = $(var(prefered_route){uri.port}); + } + } +} + + + + +route[HANDLE_MOVE_REQUEST] +{ + if (is_method("INVITE") && $rU == "*6683*" && $sht(associations=>$var(contact_uri)) != $null ) + { + $var(contact_uri) = $(ct{tobody.user}) + "@" + $(ct{tobody.host}); + + xlog("L_INFO", "$ci|log|remove association for user $var(contact_uri):$si:$sp + with media server $sht(associations=>$var(contact_uri))\n"); + + $sht(associations=>$var(contact_uri))= $null; + + # TODO - does the test expect smth like $rd:$rp as reason? + send_reply("503", "Removed association"); + + exit; + } +} + +route[RELAY] { +# if (is_method("CANCEL") || is_method("BYE")) { +# route(CLEANUP_DIALOG); +# } + + if (isflagset(FLAG_INTERNALLY_SOURCED)) { + route(INTERNAL_TO_EXTERNAL_RELAY); + } else { + route(EXTERNAL_TO_INTERNAL_RELAY); + } + + exit(); +} + +route[INTERNAL_TO_EXTERNAL_RELAY] { + remove_hf("X-AUTH-IP"); + + t_on_reply("EXTERNAL_REPLY"); + + t_set_fr(0, 10000); + + route(LOG_DESTINATION); + +# xlog("L_INFO", "$ci|log|associate call-id $ci with sip:$sip:$sp"); +# $sht(associations=>$ci) = "sip:" + $si + ":" + $sp; + + t_relay(); +} + +route[EXTERNAL_TO_INTERNAL_RELAY] { + if (!isflagset(FLAG_INTERNALLY_SOURCED)) { + route(NAT_TEST_AND_CORRECT); + } + + remove_hf("X-AUTH-IP"); + append_hf("X-AUTH-IP: $si\r\n"); + + t_on_reply("INTERNAL_REPLY"); + t_on_failure("INTERNAL_FAULT"); + + t_set_fr(0, 1000); + + route(LOG_DESTINATION); + + t_relay(); +} + + + +route[LOG_DESTINATION] { + if (isdsturiset()) { + $var(port) = $dp; + $var(domain) = $dd; + } else { + $var(port) = $rp; + $var(domain) = $rd; + } + + if ($(var(port){s.len}) <= 0) { + $var(port) = "5060"; + } + + xlog("L_INFO", "$ci|pass|$var(domain):$var(port)"); +} + +route[NAT_TEST_AND_CORRECT] { + if (is_present_hf("Record-Route")) { + $var(i) = $rr_count; + while($var(i) > 0) { + $var(i) = $var(i) - 1; + $var(rr) = $(hdr(Record-Route)[$var(i)]); + if (!is_myself("$(var(rr){nameaddr.uri})")) { + setflag(FLAG_SKIP_NAT_CORRECTION); + } + } + } else if ($Rp == "5080") { + setflag(FLAG_SKIP_NAT_CORRECTION); + } + + if (isflagset(FLAG_SKIP_NAT_CORRECTION)) { + return(); + } + + if (nat_uac_test("3")) { + force_rport(); + fix_nated_contact(); + } + + if (has_body("application/sdp") && nat_uac_test("8")) { + fix_nated_sdp("10"); + } +} + +onreply_route[EXTERNAL_REPLY] { + xlog("L_INFO", "$ci|log|external reply $T_reply_code"); + + route(NAT_TEST_AND_CORRECT); + +# if (is_method("INVITE") && t_check_status("200")) { +# $var(user) = $(ct{tobody.user}) + "@" + $(ct{tobody.host}); +# xlog("L_INFO", "$ci|log|associate user $var(user):$si:$sp with media server"); +# $sht(associations=>$var(user)) = $avp(AVP_ASSOCIATED_SERVER); +# } + +} + + +onreply_route[INTERNAL_REPLY] +{ + # this route handles replies that are comming from our media server + xlog("L_INFO", "$ci|start|recieved internal reply $T_reply_code $rr"); + xlog("L_INFO", "$ci|log|source $si:$sp"); + + if ($rs < 300) + { + xlog("L_INFO", "$ci|pass|$T_req($si):$T_req($sp)"); + } + + # change 6xx to 4xx + if (t_check_status("6[0-9][0-9]")) + { + $var(new_code) = "4" + $(T_reply_code{s.substr,1,0}); + change_reply_status("$var(new_code)", "$rr"); + } + +} + +failure_route[INTERNAL_FAULT] +{ + # this branch handles failures (>=300) to our media servers, + # which we can sometimes overcome by routing to another server + + # if the failure cause was due to the transaction being + # cancelled then we are complete + if (t_is_canceled()) + { + xlog("L_INFO", "$ci|log|transaction was cancelled"); + + exit; + } + + # if the failure case was something that we should recover + # from then try to find a new media server + if (t_check_status("(401)|(407)")) + { + xlog("L_INFO", "$ci|log|failure route ignoring auth reply $T_reply_code $rr"); + + exit; + } + else if (t_check_status("403")) + { + xlog("L_INFO", "$ci|log|failure route overriding reply code 403 with 503"); + + xlog("L_INFO", "$ci|pass|$si:$sp"); + + send_reply("503", "Error: Services Unavailable. Try Later"); + + exit; + } + else if (t_check_status("402")) + { + xlog("L_INFO", "$ci|log|failure route overriding reply code 402 with 486"); + + xlog("L_INFO", "$ci|pass|$si:$sp"); + + send_reply("486", "Insufficient Funds"); + + exit; + } + else if (t_check_status("(4[0-9][0-9])|(5[0-9][0-9])")) + { + xlog("L_INFO", "$ci|start|received failure reply $T_reply_code $rr"); + + # try to find a new media server to send the call to + if ($avp(route_attempts) < 3 && ds_next_domain()) + { + xlog("L_INFO", "$ci|log|attempting retry $avp(route_attempts) of failed request"); + xlog("L_INFO", "$ci|log|routing call to next media server $rd:$rp"); + + # reset the final reply timer + $avp(final_reply_timer) = 3; + + t_on_reply("INTERNAL_REPLY"); + + t_on_failure("INTERNAL_FAULT"); + + # relay the request to the new media server + route(EXTERNAL_TO_INTERNAL_RELAY); + + $avp(route_attempts) = $avp(route_attempts) + 1; + } + else if (t_check_status("404")) + { + xlog("L_ERR", "$ci|log|no other media servers avaliable, sending 486"); + + send_reply("486", "Not found"); + + exit; + } + else + { + xlog("L_ERR", "$ci|log|no other media servers avaliable"); + + exit; + } + } + else if (t_check_status("302")) + { + ## TODO - test this + get_redirects("*"); + + route(EXTERNAL_TO_INTERNAL_RELAY); + + /* + if( $(hdr(X-Redirect-Server)) && $(ct.fields(uri)) ) + { + $var(redirect_host) = $(hdr(X-Redirect-Server){uri.host}); + + $var(redirect_port) = $(hdr(X-Redirect-Server){uri.port}); + + cache_store("local", "$(ct.fields(uri))", "sip:$var(redirect_host):$var(redirect_port)", 60); + + xlog("L_INFO", "$ci|log|stored redirect mapping for $(ct.fields(uri)) to sip:$var(redirect_host):$var(redirect_port)"); + + remove_hf("X-Redirect-Server"); + } + */ + } + else + { + xlog("L_INFO", "$ci|log|failure route ignoring reply $T_reply_code $rr"); + + exit; + } + + route(LOG_DESTINATION); +} + +onsend_route { + xlog("L_INFO", "$ci|pass|$sndfrom(ip):$sndfrom(port) -> $sndto(ip):$sndto(port)"); +} + + +## Not used routes +/* +# Take the routes from memcached +# Write them in an AVP +# Randomize +route[LOAD_KAZOO_ROUTES] { + $var(routes) = $mct(available_kazoo_routes); + route(LOAD_ROUTES); + + $var(randomizer_pos) = $avp(AVP_ROUTE_CNT); + route(RANDOMIZE_ROUTES); + + if (!isflagset(FLAG_ITSP_SOURCED) && is_method("REGISTER|INVITE|SUBSCRIBE")) { + setflag(FLAG_ASSOCIATE_SERVER); + } +} + +route[LOAD_ROUTES] { + if ($var(routes) == $null) { + return(-1); + } + + $var(i) = 0; + $var(route) = $(var(routes){s.select,$var(i),;}); + while($(var(route){s.len}) > 0) { + $var(i) = $var(i) + 1; + $avp($var(i)) = $var(route); + $var(route) = $(var(routes){s.select,$var(i),;}); + } + $avp(AVP_ROUTE_CNT) = $var(i); + + return(1); +} + +# No longer used +route[NEXT_ROUTE] { + if ($avp(AVP_ROUTE_CNT) <= 0) { + return(-1); + } + + $var(domain) = $(avp($avp(AVP_ROUTE_CNT)){uri.host}); + $var(port) = $(avp($avp(AVP_ROUTE_CNT)){uri.port}); + + $avp(AVP_ROUTE_CNT) = $avp(AVP_ROUTE_CNT) - 1; + + if ($(var(domain){s.len}) <= 0) { + route(NEXT_ROUTE); + } + + if ($(var(port){s.len}) <= 4) { + $var(port) = "5060"; + } + + $du = "sip:" + $var(domain) + ":" + $var(port); + + xlog("L_INFO", "$ci|log|associate call-id $ci with $du"); + $sht(associations=>$ci) = $du; + + return(1); +} + +route[RANDOMIZE_ROUTES] { + if ($var(randomizer_pos) <= 0) { + return(); + } + + $var(random_pos) = ($RANDOM mod $var(randomizer_pos) + 1); + + if ($var(random_pos) != $var(randomizer_pos)) { + $var(route) = $avp($var(randomizer_pos)); + $avp($var(randomizer_pos)) = $avp($var(random_pos)); + $avp($var(random_pos)) = $var(route); + } + + $var(randomizer_pos) = $var(randomizer_pos) - 1; + route(RANDOMIZE_ROUTES); +} + +route[LOG_ROUTES] { + $var(i) = $avp(AVP_ROUTE_CNT); + while($var(i) > 0) { + $var(value) = $avp($var(i)); + xlog("L_INFO", "$ci|log|route $var(i): $var(value)"); + $var(i) = $var(i) - 1; + } +} + +route[CLEANUP_DIALOG] { + xlog("L_INFO", "$ci|log|remove any association for $ci"); + sht_rm_name_re("associations=>$ci"); + return(); +} + +route[MAYBE_ASSOCIATE_SERVER] { + if (isflagset(FLAG_ASSOCIATE_SERVER) && defined $avp(AVP_ASSOCIATED_SERVER)) { + xlog("L_INFO", "$ci|log|associate call-id $ci with $avp(AVP_ASSOCIATED_SERVER)"); + $sht(associations=>$ci) = $avp(AVP_ASSOCIATED_SERVER); + + if (is_method("INVITE")) { + $var(user) = $(ct{tobody.user}) + "@" + $si; + xlog("L_INFO", "$ci|log|associate user $var(user) with $avp(AVP_ASSOCIATED_SERVER)"); + $sht(associations=>$var(user)) = $avp(AVP_ASSOCIATED_SERVER); + } + } +} +*/ +## vim:set tabstop=4 softtabstop=4 shiftwidth=4 expandtab diff --git a/rabbitmq/enabled_plugins b/rabbitmq/enabled_plugins new file mode 100644 index 0000000..352dfc4 --- /dev/null +++ b/rabbitmq/enabled_plugins @@ -0,0 +1 @@ +[rabbitmq_management]. diff --git a/rabbitmq/rabbitmq-env.conf b/rabbitmq/rabbitmq-env.conf new file mode 100644 index 0000000..0b46f76 --- /dev/null +++ b/rabbitmq/rabbitmq-env.conf @@ -0,0 +1,5 @@ +NODENAME=rabbit +NODE_IP_ADDRESS=0.0.0.0 +NODE_PORT=5672 +LOG_BASE=/var/log/rabbitmq +MNESIA_BASE=/var/lib/rabbitmq/mnesia From bfecd0e51a1def2c45d20e6fbe6427d779080dd7 Mon Sep 17 00:00:00 2001 From: karl anderson Date: Fri, 31 May 2013 14:43:59 -0700 Subject: [PATCH 2/9] didnt mean to put freeswitch in the root dir --- bigcouch/.placeholder | 0 .../autoload_configs}/conference.conf.xml | 0 .../autoload_configs}/console.conf.xml | 0 .../autoload_configs}/event_socket.conf.xml | 0 .../autoload_configs}/http_cache.conf.xml | 0 {autoload_configs => freeswitch/autoload_configs}/kazoo.conf.xml | 0 .../autoload_configs}/local_stream.conf.xml | 0 .../autoload_configs}/logfile.conf.xml | 0 .../autoload_configs}/modules.conf.xml | 0 .../autoload_configs}/post_load_modules.conf.xml | 0 {autoload_configs => freeswitch/autoload_configs}/shout.conf.xml | 0 {autoload_configs => freeswitch/autoload_configs}/sofia.conf.xml | 0 .../autoload_configs}/spandsp.conf.xml | 0 {autoload_configs => freeswitch/autoload_configs}/switch.conf.xml | 0 {autoload_configs => freeswitch/autoload_configs}/syslog.conf.xml | 0 .../autoload_configs}/timezones.conf.xml | 0 freeswitch.xml => freeswitch/freeswitch.xml | 0 {lang => freeswitch/lang}/de/de.xml | 0 {lang => freeswitch/lang}/de/demo/demo.xml | 0 {lang => freeswitch/lang}/de/vm/sounds.xml | 0 {lang => freeswitch/lang}/de/vm/tts.xml | 0 {lang => freeswitch/lang}/en/demo/demo-ivr.xml | 0 {lang => freeswitch/lang}/en/demo/demo.xml | 0 {lang => freeswitch/lang}/en/demo/funnies.xml | 0 {lang => freeswitch/lang}/en/demo/new-demo-ivr.xml | 0 {lang => freeswitch/lang}/en/dir/sounds.xml | 0 {lang => freeswitch/lang}/en/dir/tts.xml | 0 {lang => freeswitch/lang}/en/en.xml | 0 {lang => freeswitch/lang}/en/ivr/sounds.xml | 0 {lang => freeswitch/lang}/en/vm/sounds.xml | 0 {lang => freeswitch/lang}/en/vm/tts.xml | 0 {lang => freeswitch/lang}/en/vm/voicemail_ivr.xml | 0 {lang => freeswitch/lang}/es/demo/demo-es-ES.xml | 0 {lang => freeswitch/lang}/es/demo/demo-es-MX.xml | 0 {lang => freeswitch/lang}/es/demo/demo-ivr-es-ES.xml | 0 {lang => freeswitch/lang}/es/demo/demo-ivr-es-MX.xml | 0 {lang => freeswitch/lang}/es/dir/sounds-es-ES.xml | 0 {lang => freeswitch/lang}/es/dir/sounds-es-MX.xml | 0 {lang => freeswitch/lang}/es/dir/tts-es-ES.xml | 0 {lang => freeswitch/lang}/es/dir/tts-es-MX.xml | 0 {lang => freeswitch/lang}/es/es_ES.xml | 0 {lang => freeswitch/lang}/es/es_MX.xml | 0 {lang => freeswitch/lang}/es/vm/sounds-es-ES.xml | 0 {lang => freeswitch/lang}/es/vm/sounds-es-MX.xml | 0 {lang => freeswitch/lang}/es/vm/tts-es-ES.xml | 0 {lang => freeswitch/lang}/es/vm/tts-es-MX.xml | 0 {lang => freeswitch/lang}/fr/demo/demo.xml | 0 {lang => freeswitch/lang}/fr/dir/sounds.xml | 0 {lang => freeswitch/lang}/fr/dir/tts.xml | 0 {lang => freeswitch/lang}/fr/fr.xml | 0 {lang => freeswitch/lang}/fr/vm/sounds.xml | 0 {lang => freeswitch/lang}/he/demo/demo-ivr.xml | 0 {lang => freeswitch/lang}/he/demo/demo.xml | 0 {lang => freeswitch/lang}/he/dir/sounds.xml | 0 {lang => freeswitch/lang}/he/he.xml | 0 {lang => freeswitch/lang}/he/vm/sounds.xml | 0 {lang => freeswitch/lang}/pt/demo/demo-ivr-pt-BR.xml | 0 {lang => freeswitch/lang}/pt/demo/demo-ivr-pt-PT.xml | 0 {lang => freeswitch/lang}/pt/demo/demo-pt-BR.xml | 0 {lang => freeswitch/lang}/pt/demo/demo-pt-PT.xml | 0 {lang => freeswitch/lang}/pt/dir/sounds-pt-BR.xml | 0 {lang => freeswitch/lang}/pt/dir/sounds-pt-PT.xml | 0 {lang => freeswitch/lang}/pt/dir/tts-pt-BR.xml | 0 {lang => freeswitch/lang}/pt/dir/tts-pt-PT.xml | 0 {lang => freeswitch/lang}/pt/pt_BR.xml | 0 {lang => freeswitch/lang}/pt/pt_PT.xml | 0 {lang => freeswitch/lang}/pt/vm/sounds-pt-BR.xml | 0 {lang => freeswitch/lang}/pt/vm/sounds-pt-PT.xml | 0 {lang => freeswitch/lang}/pt/vm/tts-pt-BR.xml | 0 {lang => freeswitch/lang}/pt/vm/tts-pt-PT.xml | 0 {lang => freeswitch/lang}/ru/demo/demo-ivr.xml | 0 {lang => freeswitch/lang}/ru/demo/demo.xml | 0 {lang => freeswitch/lang}/ru/dir/sounds.xml | 0 {lang => freeswitch/lang}/ru/dir/tts.xml | 0 {lang => freeswitch/lang}/ru/ru.xml | 0 {lang => freeswitch/lang}/ru/vm/sounds.xml | 0 {lang => freeswitch/lang}/ru/vm/tts.xml | 0 mime.types => freeswitch/mime.types | 0 {sip_profiles => freeswitch/sip_profiles}/sipinterface_1.xml | 0 freeswitch.limits.conf => system/freeswitch.limits.conf | 0 80 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 bigcouch/.placeholder rename {autoload_configs => freeswitch/autoload_configs}/conference.conf.xml (100%) rename {autoload_configs => freeswitch/autoload_configs}/console.conf.xml (100%) rename {autoload_configs => freeswitch/autoload_configs}/event_socket.conf.xml (100%) rename {autoload_configs => freeswitch/autoload_configs}/http_cache.conf.xml (100%) rename {autoload_configs => freeswitch/autoload_configs}/kazoo.conf.xml (100%) rename {autoload_configs => freeswitch/autoload_configs}/local_stream.conf.xml (100%) rename {autoload_configs => freeswitch/autoload_configs}/logfile.conf.xml (100%) rename {autoload_configs => freeswitch/autoload_configs}/modules.conf.xml (100%) rename {autoload_configs => freeswitch/autoload_configs}/post_load_modules.conf.xml (100%) rename {autoload_configs => freeswitch/autoload_configs}/shout.conf.xml (100%) rename {autoload_configs => freeswitch/autoload_configs}/sofia.conf.xml (100%) rename {autoload_configs => freeswitch/autoload_configs}/spandsp.conf.xml (100%) rename {autoload_configs => freeswitch/autoload_configs}/switch.conf.xml (100%) rename {autoload_configs => freeswitch/autoload_configs}/syslog.conf.xml (100%) rename {autoload_configs => freeswitch/autoload_configs}/timezones.conf.xml (100%) rename freeswitch.xml => freeswitch/freeswitch.xml (100%) rename {lang => freeswitch/lang}/de/de.xml (100%) rename {lang => freeswitch/lang}/de/demo/demo.xml (100%) rename {lang => freeswitch/lang}/de/vm/sounds.xml (100%) rename {lang => freeswitch/lang}/de/vm/tts.xml (100%) rename {lang => freeswitch/lang}/en/demo/demo-ivr.xml (100%) rename {lang => freeswitch/lang}/en/demo/demo.xml (100%) rename {lang => freeswitch/lang}/en/demo/funnies.xml (100%) rename {lang => freeswitch/lang}/en/demo/new-demo-ivr.xml (100%) rename {lang => freeswitch/lang}/en/dir/sounds.xml (100%) rename {lang => freeswitch/lang}/en/dir/tts.xml (100%) rename {lang => freeswitch/lang}/en/en.xml (100%) rename {lang => freeswitch/lang}/en/ivr/sounds.xml (100%) rename {lang => freeswitch/lang}/en/vm/sounds.xml (100%) rename {lang => freeswitch/lang}/en/vm/tts.xml (100%) rename {lang => freeswitch/lang}/en/vm/voicemail_ivr.xml (100%) rename {lang => freeswitch/lang}/es/demo/demo-es-ES.xml (100%) rename {lang => freeswitch/lang}/es/demo/demo-es-MX.xml (100%) rename {lang => freeswitch/lang}/es/demo/demo-ivr-es-ES.xml (100%) rename {lang => freeswitch/lang}/es/demo/demo-ivr-es-MX.xml (100%) rename {lang => freeswitch/lang}/es/dir/sounds-es-ES.xml (100%) rename {lang => freeswitch/lang}/es/dir/sounds-es-MX.xml (100%) rename {lang => freeswitch/lang}/es/dir/tts-es-ES.xml (100%) rename {lang => freeswitch/lang}/es/dir/tts-es-MX.xml (100%) rename {lang => freeswitch/lang}/es/es_ES.xml (100%) rename {lang => freeswitch/lang}/es/es_MX.xml (100%) rename {lang => freeswitch/lang}/es/vm/sounds-es-ES.xml (100%) rename {lang => freeswitch/lang}/es/vm/sounds-es-MX.xml (100%) rename {lang => freeswitch/lang}/es/vm/tts-es-ES.xml (100%) rename {lang => freeswitch/lang}/es/vm/tts-es-MX.xml (100%) rename {lang => freeswitch/lang}/fr/demo/demo.xml (100%) rename {lang => freeswitch/lang}/fr/dir/sounds.xml (100%) rename {lang => freeswitch/lang}/fr/dir/tts.xml (100%) rename {lang => freeswitch/lang}/fr/fr.xml (100%) rename {lang => freeswitch/lang}/fr/vm/sounds.xml (100%) rename {lang => freeswitch/lang}/he/demo/demo-ivr.xml (100%) rename {lang => freeswitch/lang}/he/demo/demo.xml (100%) rename {lang => freeswitch/lang}/he/dir/sounds.xml (100%) rename {lang => freeswitch/lang}/he/he.xml (100%) rename {lang => freeswitch/lang}/he/vm/sounds.xml (100%) rename {lang => freeswitch/lang}/pt/demo/demo-ivr-pt-BR.xml (100%) rename {lang => freeswitch/lang}/pt/demo/demo-ivr-pt-PT.xml (100%) rename {lang => freeswitch/lang}/pt/demo/demo-pt-BR.xml (100%) rename {lang => freeswitch/lang}/pt/demo/demo-pt-PT.xml (100%) rename {lang => freeswitch/lang}/pt/dir/sounds-pt-BR.xml (100%) rename {lang => freeswitch/lang}/pt/dir/sounds-pt-PT.xml (100%) rename {lang => freeswitch/lang}/pt/dir/tts-pt-BR.xml (100%) rename {lang => freeswitch/lang}/pt/dir/tts-pt-PT.xml (100%) rename {lang => freeswitch/lang}/pt/pt_BR.xml (100%) rename {lang => freeswitch/lang}/pt/pt_PT.xml (100%) rename {lang => freeswitch/lang}/pt/vm/sounds-pt-BR.xml (100%) rename {lang => freeswitch/lang}/pt/vm/sounds-pt-PT.xml (100%) rename {lang => freeswitch/lang}/pt/vm/tts-pt-BR.xml (100%) rename {lang => freeswitch/lang}/pt/vm/tts-pt-PT.xml (100%) rename {lang => freeswitch/lang}/ru/demo/demo-ivr.xml (100%) rename {lang => freeswitch/lang}/ru/demo/demo.xml (100%) rename {lang => freeswitch/lang}/ru/dir/sounds.xml (100%) rename {lang => freeswitch/lang}/ru/dir/tts.xml (100%) rename {lang => freeswitch/lang}/ru/ru.xml (100%) rename {lang => freeswitch/lang}/ru/vm/sounds.xml (100%) rename {lang => freeswitch/lang}/ru/vm/tts.xml (100%) rename mime.types => freeswitch/mime.types (100%) rename {sip_profiles => freeswitch/sip_profiles}/sipinterface_1.xml (100%) rename freeswitch.limits.conf => system/freeswitch.limits.conf (100%) diff --git a/bigcouch/.placeholder b/bigcouch/.placeholder new file mode 100644 index 0000000..e69de29 diff --git a/autoload_configs/conference.conf.xml b/freeswitch/autoload_configs/conference.conf.xml similarity index 100% rename from autoload_configs/conference.conf.xml rename to freeswitch/autoload_configs/conference.conf.xml diff --git a/autoload_configs/console.conf.xml b/freeswitch/autoload_configs/console.conf.xml similarity index 100% rename from autoload_configs/console.conf.xml rename to freeswitch/autoload_configs/console.conf.xml diff --git a/autoload_configs/event_socket.conf.xml b/freeswitch/autoload_configs/event_socket.conf.xml similarity index 100% rename from autoload_configs/event_socket.conf.xml rename to freeswitch/autoload_configs/event_socket.conf.xml diff --git a/autoload_configs/http_cache.conf.xml b/freeswitch/autoload_configs/http_cache.conf.xml similarity index 100% rename from autoload_configs/http_cache.conf.xml rename to freeswitch/autoload_configs/http_cache.conf.xml diff --git a/autoload_configs/kazoo.conf.xml b/freeswitch/autoload_configs/kazoo.conf.xml similarity index 100% rename from autoload_configs/kazoo.conf.xml rename to freeswitch/autoload_configs/kazoo.conf.xml diff --git a/autoload_configs/local_stream.conf.xml b/freeswitch/autoload_configs/local_stream.conf.xml similarity index 100% rename from autoload_configs/local_stream.conf.xml rename to freeswitch/autoload_configs/local_stream.conf.xml diff --git a/autoload_configs/logfile.conf.xml b/freeswitch/autoload_configs/logfile.conf.xml similarity index 100% rename from autoload_configs/logfile.conf.xml rename to freeswitch/autoload_configs/logfile.conf.xml diff --git a/autoload_configs/modules.conf.xml b/freeswitch/autoload_configs/modules.conf.xml similarity index 100% rename from autoload_configs/modules.conf.xml rename to freeswitch/autoload_configs/modules.conf.xml diff --git a/autoload_configs/post_load_modules.conf.xml b/freeswitch/autoload_configs/post_load_modules.conf.xml similarity index 100% rename from autoload_configs/post_load_modules.conf.xml rename to freeswitch/autoload_configs/post_load_modules.conf.xml diff --git a/autoload_configs/shout.conf.xml b/freeswitch/autoload_configs/shout.conf.xml similarity index 100% rename from autoload_configs/shout.conf.xml rename to freeswitch/autoload_configs/shout.conf.xml diff --git a/autoload_configs/sofia.conf.xml b/freeswitch/autoload_configs/sofia.conf.xml similarity index 100% rename from autoload_configs/sofia.conf.xml rename to freeswitch/autoload_configs/sofia.conf.xml diff --git a/autoload_configs/spandsp.conf.xml b/freeswitch/autoload_configs/spandsp.conf.xml similarity index 100% rename from autoload_configs/spandsp.conf.xml rename to freeswitch/autoload_configs/spandsp.conf.xml diff --git a/autoload_configs/switch.conf.xml b/freeswitch/autoload_configs/switch.conf.xml similarity index 100% rename from autoload_configs/switch.conf.xml rename to freeswitch/autoload_configs/switch.conf.xml diff --git a/autoload_configs/syslog.conf.xml b/freeswitch/autoload_configs/syslog.conf.xml similarity index 100% rename from autoload_configs/syslog.conf.xml rename to freeswitch/autoload_configs/syslog.conf.xml diff --git a/autoload_configs/timezones.conf.xml b/freeswitch/autoload_configs/timezones.conf.xml similarity index 100% rename from autoload_configs/timezones.conf.xml rename to freeswitch/autoload_configs/timezones.conf.xml diff --git a/freeswitch.xml b/freeswitch/freeswitch.xml similarity index 100% rename from freeswitch.xml rename to freeswitch/freeswitch.xml diff --git a/lang/de/de.xml b/freeswitch/lang/de/de.xml similarity index 100% rename from lang/de/de.xml rename to freeswitch/lang/de/de.xml diff --git a/lang/de/demo/demo.xml b/freeswitch/lang/de/demo/demo.xml similarity index 100% rename from lang/de/demo/demo.xml rename to freeswitch/lang/de/demo/demo.xml diff --git a/lang/de/vm/sounds.xml b/freeswitch/lang/de/vm/sounds.xml similarity index 100% rename from lang/de/vm/sounds.xml rename to freeswitch/lang/de/vm/sounds.xml diff --git a/lang/de/vm/tts.xml b/freeswitch/lang/de/vm/tts.xml similarity index 100% rename from lang/de/vm/tts.xml rename to freeswitch/lang/de/vm/tts.xml diff --git a/lang/en/demo/demo-ivr.xml b/freeswitch/lang/en/demo/demo-ivr.xml similarity index 100% rename from lang/en/demo/demo-ivr.xml rename to freeswitch/lang/en/demo/demo-ivr.xml diff --git a/lang/en/demo/demo.xml b/freeswitch/lang/en/demo/demo.xml similarity index 100% rename from lang/en/demo/demo.xml rename to freeswitch/lang/en/demo/demo.xml diff --git a/lang/en/demo/funnies.xml b/freeswitch/lang/en/demo/funnies.xml similarity index 100% rename from lang/en/demo/funnies.xml rename to freeswitch/lang/en/demo/funnies.xml diff --git a/lang/en/demo/new-demo-ivr.xml b/freeswitch/lang/en/demo/new-demo-ivr.xml similarity index 100% rename from lang/en/demo/new-demo-ivr.xml rename to freeswitch/lang/en/demo/new-demo-ivr.xml diff --git a/lang/en/dir/sounds.xml b/freeswitch/lang/en/dir/sounds.xml similarity index 100% rename from lang/en/dir/sounds.xml rename to freeswitch/lang/en/dir/sounds.xml diff --git a/lang/en/dir/tts.xml b/freeswitch/lang/en/dir/tts.xml similarity index 100% rename from lang/en/dir/tts.xml rename to freeswitch/lang/en/dir/tts.xml diff --git a/lang/en/en.xml b/freeswitch/lang/en/en.xml similarity index 100% rename from lang/en/en.xml rename to freeswitch/lang/en/en.xml diff --git a/lang/en/ivr/sounds.xml b/freeswitch/lang/en/ivr/sounds.xml similarity index 100% rename from lang/en/ivr/sounds.xml rename to freeswitch/lang/en/ivr/sounds.xml diff --git a/lang/en/vm/sounds.xml b/freeswitch/lang/en/vm/sounds.xml similarity index 100% rename from lang/en/vm/sounds.xml rename to freeswitch/lang/en/vm/sounds.xml diff --git a/lang/en/vm/tts.xml b/freeswitch/lang/en/vm/tts.xml similarity index 100% rename from lang/en/vm/tts.xml rename to freeswitch/lang/en/vm/tts.xml diff --git a/lang/en/vm/voicemail_ivr.xml b/freeswitch/lang/en/vm/voicemail_ivr.xml similarity index 100% rename from lang/en/vm/voicemail_ivr.xml rename to freeswitch/lang/en/vm/voicemail_ivr.xml diff --git a/lang/es/demo/demo-es-ES.xml b/freeswitch/lang/es/demo/demo-es-ES.xml similarity index 100% rename from lang/es/demo/demo-es-ES.xml rename to freeswitch/lang/es/demo/demo-es-ES.xml diff --git a/lang/es/demo/demo-es-MX.xml b/freeswitch/lang/es/demo/demo-es-MX.xml similarity index 100% rename from lang/es/demo/demo-es-MX.xml rename to freeswitch/lang/es/demo/demo-es-MX.xml diff --git a/lang/es/demo/demo-ivr-es-ES.xml b/freeswitch/lang/es/demo/demo-ivr-es-ES.xml similarity index 100% rename from lang/es/demo/demo-ivr-es-ES.xml rename to freeswitch/lang/es/demo/demo-ivr-es-ES.xml diff --git a/lang/es/demo/demo-ivr-es-MX.xml b/freeswitch/lang/es/demo/demo-ivr-es-MX.xml similarity index 100% rename from lang/es/demo/demo-ivr-es-MX.xml rename to freeswitch/lang/es/demo/demo-ivr-es-MX.xml diff --git a/lang/es/dir/sounds-es-ES.xml b/freeswitch/lang/es/dir/sounds-es-ES.xml similarity index 100% rename from lang/es/dir/sounds-es-ES.xml rename to freeswitch/lang/es/dir/sounds-es-ES.xml diff --git a/lang/es/dir/sounds-es-MX.xml b/freeswitch/lang/es/dir/sounds-es-MX.xml similarity index 100% rename from lang/es/dir/sounds-es-MX.xml rename to freeswitch/lang/es/dir/sounds-es-MX.xml diff --git a/lang/es/dir/tts-es-ES.xml b/freeswitch/lang/es/dir/tts-es-ES.xml similarity index 100% rename from lang/es/dir/tts-es-ES.xml rename to freeswitch/lang/es/dir/tts-es-ES.xml diff --git a/lang/es/dir/tts-es-MX.xml b/freeswitch/lang/es/dir/tts-es-MX.xml similarity index 100% rename from lang/es/dir/tts-es-MX.xml rename to freeswitch/lang/es/dir/tts-es-MX.xml diff --git a/lang/es/es_ES.xml b/freeswitch/lang/es/es_ES.xml similarity index 100% rename from lang/es/es_ES.xml rename to freeswitch/lang/es/es_ES.xml diff --git a/lang/es/es_MX.xml b/freeswitch/lang/es/es_MX.xml similarity index 100% rename from lang/es/es_MX.xml rename to freeswitch/lang/es/es_MX.xml diff --git a/lang/es/vm/sounds-es-ES.xml b/freeswitch/lang/es/vm/sounds-es-ES.xml similarity index 100% rename from lang/es/vm/sounds-es-ES.xml rename to freeswitch/lang/es/vm/sounds-es-ES.xml diff --git a/lang/es/vm/sounds-es-MX.xml b/freeswitch/lang/es/vm/sounds-es-MX.xml similarity index 100% rename from lang/es/vm/sounds-es-MX.xml rename to freeswitch/lang/es/vm/sounds-es-MX.xml diff --git a/lang/es/vm/tts-es-ES.xml b/freeswitch/lang/es/vm/tts-es-ES.xml similarity index 100% rename from lang/es/vm/tts-es-ES.xml rename to freeswitch/lang/es/vm/tts-es-ES.xml diff --git a/lang/es/vm/tts-es-MX.xml b/freeswitch/lang/es/vm/tts-es-MX.xml similarity index 100% rename from lang/es/vm/tts-es-MX.xml rename to freeswitch/lang/es/vm/tts-es-MX.xml diff --git a/lang/fr/demo/demo.xml b/freeswitch/lang/fr/demo/demo.xml similarity index 100% rename from lang/fr/demo/demo.xml rename to freeswitch/lang/fr/demo/demo.xml diff --git a/lang/fr/dir/sounds.xml b/freeswitch/lang/fr/dir/sounds.xml similarity index 100% rename from lang/fr/dir/sounds.xml rename to freeswitch/lang/fr/dir/sounds.xml diff --git a/lang/fr/dir/tts.xml b/freeswitch/lang/fr/dir/tts.xml similarity index 100% rename from lang/fr/dir/tts.xml rename to freeswitch/lang/fr/dir/tts.xml diff --git a/lang/fr/fr.xml b/freeswitch/lang/fr/fr.xml similarity index 100% rename from lang/fr/fr.xml rename to freeswitch/lang/fr/fr.xml diff --git a/lang/fr/vm/sounds.xml b/freeswitch/lang/fr/vm/sounds.xml similarity index 100% rename from lang/fr/vm/sounds.xml rename to freeswitch/lang/fr/vm/sounds.xml diff --git a/lang/he/demo/demo-ivr.xml b/freeswitch/lang/he/demo/demo-ivr.xml similarity index 100% rename from lang/he/demo/demo-ivr.xml rename to freeswitch/lang/he/demo/demo-ivr.xml diff --git a/lang/he/demo/demo.xml b/freeswitch/lang/he/demo/demo.xml similarity index 100% rename from lang/he/demo/demo.xml rename to freeswitch/lang/he/demo/demo.xml diff --git a/lang/he/dir/sounds.xml b/freeswitch/lang/he/dir/sounds.xml similarity index 100% rename from lang/he/dir/sounds.xml rename to freeswitch/lang/he/dir/sounds.xml diff --git a/lang/he/he.xml b/freeswitch/lang/he/he.xml similarity index 100% rename from lang/he/he.xml rename to freeswitch/lang/he/he.xml diff --git a/lang/he/vm/sounds.xml b/freeswitch/lang/he/vm/sounds.xml similarity index 100% rename from lang/he/vm/sounds.xml rename to freeswitch/lang/he/vm/sounds.xml diff --git a/lang/pt/demo/demo-ivr-pt-BR.xml b/freeswitch/lang/pt/demo/demo-ivr-pt-BR.xml similarity index 100% rename from lang/pt/demo/demo-ivr-pt-BR.xml rename to freeswitch/lang/pt/demo/demo-ivr-pt-BR.xml diff --git a/lang/pt/demo/demo-ivr-pt-PT.xml b/freeswitch/lang/pt/demo/demo-ivr-pt-PT.xml similarity index 100% rename from lang/pt/demo/demo-ivr-pt-PT.xml rename to freeswitch/lang/pt/demo/demo-ivr-pt-PT.xml diff --git a/lang/pt/demo/demo-pt-BR.xml b/freeswitch/lang/pt/demo/demo-pt-BR.xml similarity index 100% rename from lang/pt/demo/demo-pt-BR.xml rename to freeswitch/lang/pt/demo/demo-pt-BR.xml diff --git a/lang/pt/demo/demo-pt-PT.xml b/freeswitch/lang/pt/demo/demo-pt-PT.xml similarity index 100% rename from lang/pt/demo/demo-pt-PT.xml rename to freeswitch/lang/pt/demo/demo-pt-PT.xml diff --git a/lang/pt/dir/sounds-pt-BR.xml b/freeswitch/lang/pt/dir/sounds-pt-BR.xml similarity index 100% rename from lang/pt/dir/sounds-pt-BR.xml rename to freeswitch/lang/pt/dir/sounds-pt-BR.xml diff --git a/lang/pt/dir/sounds-pt-PT.xml b/freeswitch/lang/pt/dir/sounds-pt-PT.xml similarity index 100% rename from lang/pt/dir/sounds-pt-PT.xml rename to freeswitch/lang/pt/dir/sounds-pt-PT.xml diff --git a/lang/pt/dir/tts-pt-BR.xml b/freeswitch/lang/pt/dir/tts-pt-BR.xml similarity index 100% rename from lang/pt/dir/tts-pt-BR.xml rename to freeswitch/lang/pt/dir/tts-pt-BR.xml diff --git a/lang/pt/dir/tts-pt-PT.xml b/freeswitch/lang/pt/dir/tts-pt-PT.xml similarity index 100% rename from lang/pt/dir/tts-pt-PT.xml rename to freeswitch/lang/pt/dir/tts-pt-PT.xml diff --git a/lang/pt/pt_BR.xml b/freeswitch/lang/pt/pt_BR.xml similarity index 100% rename from lang/pt/pt_BR.xml rename to freeswitch/lang/pt/pt_BR.xml diff --git a/lang/pt/pt_PT.xml b/freeswitch/lang/pt/pt_PT.xml similarity index 100% rename from lang/pt/pt_PT.xml rename to freeswitch/lang/pt/pt_PT.xml diff --git a/lang/pt/vm/sounds-pt-BR.xml b/freeswitch/lang/pt/vm/sounds-pt-BR.xml similarity index 100% rename from lang/pt/vm/sounds-pt-BR.xml rename to freeswitch/lang/pt/vm/sounds-pt-BR.xml diff --git a/lang/pt/vm/sounds-pt-PT.xml b/freeswitch/lang/pt/vm/sounds-pt-PT.xml similarity index 100% rename from lang/pt/vm/sounds-pt-PT.xml rename to freeswitch/lang/pt/vm/sounds-pt-PT.xml diff --git a/lang/pt/vm/tts-pt-BR.xml b/freeswitch/lang/pt/vm/tts-pt-BR.xml similarity index 100% rename from lang/pt/vm/tts-pt-BR.xml rename to freeswitch/lang/pt/vm/tts-pt-BR.xml diff --git a/lang/pt/vm/tts-pt-PT.xml b/freeswitch/lang/pt/vm/tts-pt-PT.xml similarity index 100% rename from lang/pt/vm/tts-pt-PT.xml rename to freeswitch/lang/pt/vm/tts-pt-PT.xml diff --git a/lang/ru/demo/demo-ivr.xml b/freeswitch/lang/ru/demo/demo-ivr.xml similarity index 100% rename from lang/ru/demo/demo-ivr.xml rename to freeswitch/lang/ru/demo/demo-ivr.xml diff --git a/lang/ru/demo/demo.xml b/freeswitch/lang/ru/demo/demo.xml similarity index 100% rename from lang/ru/demo/demo.xml rename to freeswitch/lang/ru/demo/demo.xml diff --git a/lang/ru/dir/sounds.xml b/freeswitch/lang/ru/dir/sounds.xml similarity index 100% rename from lang/ru/dir/sounds.xml rename to freeswitch/lang/ru/dir/sounds.xml diff --git a/lang/ru/dir/tts.xml b/freeswitch/lang/ru/dir/tts.xml similarity index 100% rename from lang/ru/dir/tts.xml rename to freeswitch/lang/ru/dir/tts.xml diff --git a/lang/ru/ru.xml b/freeswitch/lang/ru/ru.xml similarity index 100% rename from lang/ru/ru.xml rename to freeswitch/lang/ru/ru.xml diff --git a/lang/ru/vm/sounds.xml b/freeswitch/lang/ru/vm/sounds.xml similarity index 100% rename from lang/ru/vm/sounds.xml rename to freeswitch/lang/ru/vm/sounds.xml diff --git a/lang/ru/vm/tts.xml b/freeswitch/lang/ru/vm/tts.xml similarity index 100% rename from lang/ru/vm/tts.xml rename to freeswitch/lang/ru/vm/tts.xml diff --git a/mime.types b/freeswitch/mime.types similarity index 100% rename from mime.types rename to freeswitch/mime.types diff --git a/sip_profiles/sipinterface_1.xml b/freeswitch/sip_profiles/sipinterface_1.xml similarity index 100% rename from sip_profiles/sipinterface_1.xml rename to freeswitch/sip_profiles/sipinterface_1.xml diff --git a/freeswitch.limits.conf b/system/freeswitch.limits.conf similarity index 100% rename from freeswitch.limits.conf rename to system/freeswitch.limits.conf From 91228300dc6d1cb40b005f169d9b8d37aef6c583 Mon Sep 17 00:00:00 2001 From: karl anderson Date: Fri, 31 May 2013 14:58:38 -0700 Subject: [PATCH 3/9] more tweaks --- bigcouch/.placeholder | 0 bigcouch/local.ini | 28 ++++++++++++++++++++++++++++ bigcouch/vm.args | 26 ++++++++++++++++++++++++++ config.ini | 8 ++++---- 4 files changed, 58 insertions(+), 4 deletions(-) delete mode 100644 bigcouch/.placeholder create mode 100644 bigcouch/local.ini create mode 100644 bigcouch/vm.args diff --git a/bigcouch/.placeholder b/bigcouch/.placeholder deleted file mode 100644 index e69de29..0000000 diff --git a/bigcouch/local.ini b/bigcouch/local.ini new file mode 100644 index 0000000..27341ab --- /dev/null +++ b/bigcouch/local.ini @@ -0,0 +1,28 @@ +[admins] +admin = intenseheavydutyadminactionplease +kazoo = supermegaexcellenttelephonyplatform + +[chttpd] +secret = 53e20840c5b911e28b8b0800200c9a66 +require_valid_user = true +port = 5984 +bind_address = 0.0.0.0 + +[httpd] +secret = 53e20840c5b911e28b8b0800200c9a66 +require_valid_user = true +port = 5986 +bind_address = 0.0.0.0 + +[couchdb] +database_dir = /srv/db +view_index_dir = /srv/view_index + +[cluster] +q=3 +r=2 +w=2 +n=3 + +[log] +file = /var/log/bigcouch.log diff --git a/bigcouch/vm.args b/bigcouch/vm.args new file mode 100644 index 0000000..ebae52f --- /dev/null +++ b/bigcouch/vm.args @@ -0,0 +1,26 @@ +# Each node in the system must have a unique name. A name can be short +# (specified using -sname) or it can by fully qualified (-name). There can be +# no communication between nodes running with the -sname flag and those running +# with the -name flag. +-name bigcouch + +# All nodes must share the same magic cookie for distributed Erlang to work. +# Comment out this line if you synchronized the cookies by other means (using +# the ~/.erlang.cookie file, for example). +-setcookie change_me + +# Tell SASL not to log progress reports +-sasl errlog_type error + +# Use kernel poll functionality if supported by emulator ++K true + +# Start a pool of asynchronous IO threads ++A 16 + +# Set the max port value to be the same as limits.d/bigcouch.limits +# +Q 65536 +-env ERL_MAX_PORTS 65536 + +# Comment this line out to enable the interactive Erlang shell on startup ++Bd -noinput -detached diff --git a/config.ini b/config.ini index e013c7c..7a98c5f 100644 --- a/config.ini +++ b/config.ini @@ -8,10 +8,10 @@ uri = "amqp://guest:guest@127.0.0.1:5672" compact_automatically = true cookie = change_me ip = "127.0.0.1" -port = 5984 -; username = "XXX" -; password = "XXX" -admin_port = 5986 +port = 15984 +username = "kazoo" +password = "supermegaexcellenttelephonyplatform" +admin_port = 15986 [whistle_apps] cookie = change_me From 17ee544fad4821be307aa86263e7ef50ca9f01c7 Mon Sep 17 00:00:00 2001 From: karl anderson Date: Fri, 31 May 2013 15:16:52 -0700 Subject: [PATCH 4/9] add spec file --- kazoo-configs.spec | 72 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 kazoo-configs.spec diff --git a/kazoo-configs.spec b/kazoo-configs.spec new file mode 100644 index 0000000..6644691 --- /dev/null +++ b/kazoo-configs.spec @@ -0,0 +1,72 @@ +%define packagelayout FH +%define SYSCONFDIR %{_sysconfdir} +%define KAZOOCONFDIR %{_sysconfdir}/kazoo + +Name: kazoo-configs +Summary: Configuration for the Kazoo platform +License: MPL1.1 +Group: Productivity/Telephony +Version: v2.13 +Release: 2600hz%{?dist} +URL: http://www.2600hz.org/ +Packager: Karl Anderson +Vendor: http://www.2600hz.org/ + +Source0: Kazoo-Configs.tar + +BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) + +%description +Configuration files for the various components that make up the Kazoo platform. + +###################################################################################################################### +# Prepare for the build +###################################################################################################################### +%prep +%setup -b0 -q -n Kazoo-Configs + +%{__mkdir} -p %{buildroot}%{KAZOOCONFDIR} +%{__mkdir} -p %{buildroot}%{SYSCONFDIR}/security/limits.d/ + +cp -r %{_builddir}/Kazoo-Configs/* %{buildroot}%{KAZOOCONFDIR}/ +rm -rf %{buildroot}%{KAZOOCONFDIR}/system + +cp %{_builddir}/Kazoo-Configs/system/*.limits.conf %{buildroot}%{SYSCONFDIR}/security/limits.d/ + +###################################################################################################################### +# Bootstrap, Configure and Build the whole enchilada +###################################################################################################################### +%build + +###################################################################################################################### +# Install it to the build root +###################################################################################################################### +%install + +###################################################################################################################### +# Include a script to add a freeswitch user with group daemon when the core RPM is installed +###################################################################################################################### +%pre + +%post +find %{KAZOOCONFDIR} -type d -exec chmod 755 {} + + +###################################################################################################################### +# When the core RPM is uninstalled remove the freeswitch user +###################################################################################################################### +%postun + +###################################################################################################################### +# List of files/directories to include in the core FreeSWITCH RPM +###################################################################################################################### +%files +%defattr(0644,root,root) +#################################### Basic Directory Structure ####################################################### +%dir %attr(0755, root, root) %{KAZOOCONFDIR} +%config(noreplace) %{KAZOOCONFDIR}/freeswitch/* +%config(noreplace) %{KAZOOCONFDIR}/haproxy/* +%config(noreplace) %{KAZOOCONFDIR}/kamailio/* +%config(noreplace) %{KAZOOCONFDIR}/rabbitmq/* +%config(noreplace) %{KAZOOCONFDIR}/bigcouch/* +%config(noreplace) %{KAZOOCONFDIR}/config.ini +%config(noreplace) %{SYSCONFDIR}/security/limits.d/* From fb84064ab2d75c755f6c70d28dfcda23908558a5 Mon Sep 17 00:00:00 2001 From: karl anderson Date: Fri, 31 May 2013 15:23:03 -0700 Subject: [PATCH 5/9] make it a noarch rpm --- kazoo-configs.spec | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/kazoo-configs.spec b/kazoo-configs.spec index 6644691..6ddcc25 100644 --- a/kazoo-configs.spec +++ b/kazoo-configs.spec @@ -7,13 +7,14 @@ Summary: Configuration for the Kazoo platform License: MPL1.1 Group: Productivity/Telephony Version: v2.13 -Release: 2600hz%{?dist} +Release: 2600hz URL: http://www.2600hz.org/ Packager: Karl Anderson Vendor: http://www.2600hz.org/ Source0: Kazoo-Configs.tar +BuildArch: noarch BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) %description @@ -30,7 +31,7 @@ Configuration files for the various components that make up the Kazoo platform. cp -r %{_builddir}/Kazoo-Configs/* %{buildroot}%{KAZOOCONFDIR}/ rm -rf %{buildroot}%{KAZOOCONFDIR}/system - +rm %{buildroot}%{KAZOOCONFDIR}/kazoo-configs.spec cp %{_builddir}/Kazoo-Configs/system/*.limits.conf %{buildroot}%{SYSCONFDIR}/security/limits.d/ ###################################################################################################################### From f18f71e7df7b1804cfaa7db93982554561f7a0b0 Mon Sep 17 00:00:00 2001 From: karl anderson Date: Tue, 18 Jun 2013 16:22:11 -0700 Subject: [PATCH 6/9] update modules path --- kamailio/kamailio.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kamailio/kamailio.cfg b/kamailio/kamailio.cfg index 26a8fe4..0152a50 100644 --- a/kamailio/kamailio.cfg +++ b/kamailio/kamailio.cfg @@ -104,7 +104,7 @@ disable_sctp = yes ####### Modules Section ######## -mpath="/usr/local/lib64/kamailio/modules/" +mpath="/usr/lib64/kamailio/modules/" ####### Flags ####### From db8a0fb24e06eef5352ff1d16d46fde6b2d7b2ff Mon Sep 17 00:00:00 2001 From: karl anderson Date: Thu, 20 Jun 2013 19:17:22 -0700 Subject: [PATCH 7/9] work on transfer tracking, change the default freeswitch port, and include it in the dispatcher list --- freeswitch/sip_profiles/sipinterface_1.xml | 2 +- kamailio/dispatcher.list | 1 + kamailio/kamailio.cfg | 487 +++++++-------------- 3 files changed, 151 insertions(+), 339 deletions(-) diff --git a/freeswitch/sip_profiles/sipinterface_1.xml b/freeswitch/sip_profiles/sipinterface_1.xml index 987e115..6aa36c6 100644 --- a/freeswitch/sip_profiles/sipinterface_1.xml +++ b/freeswitch/sip_profiles/sipinterface_1.xml @@ -43,7 +43,7 @@ - + diff --git a/kamailio/dispatcher.list b/kamailio/dispatcher.list index d50f425..cf724b4 100644 --- a/kamailio/dispatcher.list +++ b/kamailio/dispatcher.list @@ -1 +1,2 @@ # setit(integer) destination(sip uri) flags (integer, optional) +1 sip:127.0.0.1:11000 0 diff --git a/kamailio/kamailio.cfg b/kamailio/kamailio.cfg index 0152a50..19ce5d1 100644 --- a/kamailio/kamailio.cfg +++ b/kamailio/kamailio.cfg @@ -48,9 +48,6 @@ listen = tcp:127.0.0.1:5080 listen = udp:127.0.0.1:5080 listen = tcp:127.0.0.1:7000 listen = udp:127.0.0.1:7000 - -#listen = tcp:127.0.0.1:5065 -#listen = udp:127.0.0.1:5065 tos = IPTOS_LOWDELAY ####### TCP Parameters ######### @@ -106,18 +103,16 @@ disable_sctp = yes ####### Modules Section ######## mpath="/usr/lib64/kamailio/modules/" - ####### Flags ####### flags FLAG_INTERNALLY_SOURCED: 1, -# FLAG_ITSP_SOURCED: 2, - FLAG_ASSOCIATE_SERVER: 3, - FLAG_SKIP_NAT_CORRECTION: 4; + FLAG_ASSOCIATE_SERVER: 2, + FLAG_SKIP_NAT_CORRECTION: 3, + FLAG_ASSOCIATE_USER: 4; #!define FLB_NATB 6 #!define FLB_NATSIPPING 7 - ######## Kamailio core extensions module ######## loadmodule "kex.so" @@ -163,19 +158,10 @@ modparam("path", "use_received", 0) ######## Generic Hash Table container in shared memory ######## loadmodule "htable.so" -#modparam("htable", "htable", "associations=>size=14;") +modparam("htable", "htable", "associations=>size=14;") modparam("htable", "htable", "a=>size=10;") -/* -######## Memcached connector module ######## -loadmodule "memcached.so" -modparam("memcached", "servers", "localhost:11211") -modparam("memcached", "expire", 10800) -modparam("memcached", "mode", 0) -modparam("memcached", "timeout", 10000) -*/ - -######## Module holding Pseudo-Variables ######## +######## Pseudo-Variables module ######## loadmodule "pv.so" ######## Advanced logger module ######## @@ -185,12 +171,9 @@ loadmodule "xlog.so" loadmodule "mi_fifo.so" modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo") -####### Different config utilities ######## -loadmodule "cfgutils.so" - -####### Dispatcher Module Parameters ######## +####### Dispatcher module ######## loadmodule "dispatcher.so" -modparam("dispatcher", "list_file", "/etc/kazoo/kamailio/dispatcher.list") +modparam("dispatcher", "list_file", "/etc/kamailio/dispatcher.list") modparam("dispatcher", "flags", 2) modparam("dispatcher", "use_default", 0) modparam("dispatcher", "force_dst", 1) @@ -208,35 +191,36 @@ modparam("dispatcher", "ds_probing_threshhold", 3) modparam("dispatcher", "ds_probing_mode", 1) modparam("dispatcher", "ds_ping_reply_codes", "501,403,404,400,200") -######## Uac_redirect ######## +######## UAC Redirection module ######## loadmodule "uac_redirect.so" - -####### db_kazoo registrar modules ########## +####### Kazoo Integration module ########## loadmodule "db_kazoo.so" +# FIXME: uncomment the next line and set the correct hostname that should be advertised to Kazoo +#modparam("db_kazoo", "node_hostname", "kamailio.kazoo.com") +# If you want a certain fs_path to be sent Kazoo, uncomment the next line and set the right value +#modparam("db_kazoo", "register_fs_path", "IP:PORT") + +####### Authentication Interface module ########## loadmodule "auth.so" loadmodule "auth_db.so" - -# ----- registrar modules ----- -loadmodule "usrloc.so" -loadmodule "registrar.so" - -modparam("auth_db|usrloc", "db_url", "kazoo://guest:guest@127.0.0.1:5672/callmgr") modparam("auth_db", "use_domain", 1) modparam("auth_db", "version_table", 0) modparam("auth_db", "calculate_ha1", 1) modparam("auth_db", "password_column", "password") modparam("auth_db", "load_credentials", "$avp(password)=password") - -/* enable DB persistency for location entries */ +####### User Location Implementation module ########## +loadmodule "usrloc.so" modparam("usrloc", "db_mode", 1) modparam("usrloc", "db_update_as_insert", 1) modparam("usrloc", "use_domain", 1) modparam("usrloc", "nat_bflag", FLB_NATB) +####### SIP Registrar implementation module ########## +loadmodule "registrar.so" -######## NAT traversal module - signaling functions ######## +######## NAT Traversal module - signaling functions ######## loadmodule "nathelper.so" modparam("nathelper|registrar", "received_avp", "$avp(AVP_RECV_PARAM)") modparam("nathelper", "natping_interval", 30) @@ -246,6 +230,9 @@ modparam("nathelper", "sipping_bflag", FLB_NATSIPPING) modparam("nathelper", "sipping_from", "sip:sipcheck@127.0.0.1") #modparam("nathelper", "natping_socket", "127.0.0.1:5060") +####### Common Module Parameters ########## +modparam("auth_db|usrloc", "db_url", "kazoo://guest:guest@127.0.0.1:5672/callmgr") + ####### Routing Logic ######## route { @@ -311,24 +298,6 @@ route[CLASSIFY_SOURCE] } } -/* -route[CLASSIFY_SOURCE] { - switch($mct($si)) { - case "itsp": - xlog("L_INFO", "$ci|log|message is from ITSP"); - setflag(FLAG_ITSP_SOURCED); - break; - case "kazoo": - xlog("L_INFO", "$ci|log|message is from KAZOO"); - setflag(FLAG_INTERNALLY_SOURCED); - break; - default: - xlog("L_INFO", "$ci|log|message is from an unknown source"); - break; - } -} -*/ - route[HANDLE_OPTIONS] { if (is_method("OPTIONS")) { if (isflagset(FLAG_INTERNALLY_SOURCED)) { @@ -345,13 +314,10 @@ route[HANDLE_OPTIONS] { # associate the contact with the media server route[MAYBE_ASSOCIATE_USER] { # if Invite for on hold, we need to associate the contact URI with the next hop - if (is_method("INVITE") && !isflagset(FLAG_INTERNALLY_SOURCED) && is_audio_on_hold()) { - $var(contact_uri) = $(ct{tobody.user}) + "@" + $(ct{tobody.host}); - xlog("L_INFO", "$ci|log|associate user $var(contact_uri):$si:$sp with media server $du\n"); - $sht(associations=>$var(contact_uri))= $du; + setflag(FLAG_ASSOCIATE_USER); } - + } route[HANDLE_IN_DIALOG_REQUESTS] { @@ -402,73 +368,60 @@ route[HANDLE_IN_DIALOG_REQUESTS] { } if (is_method("REGISTER")) { - - if (nat_uac_test("3")) { - xlog("L_INFO", "Nated contact\n"); -# setflag(FLB_NATSIPPING); - force_rport(); - setbflag(FLB_NATB); - setbflag(FLB_NATSIPPING); - - fix_nated_register(); - } - # authenticate requests - # check iif we have the password in cache - if ( is_present_hf("Authorization") ) { - if ( $sht(a=>$Au) != $null ) { - xlog("L_INFO", "Found stored password for $Au, $sht(a=>$Au)\n"); - if (!pv_auth_check("$fd", "$sht(a=>$Au)", "0", "0")) { - xlog("L_INFO", "Authentication did not work with stored password\n"); - - ## RABBITMQ - Credentials fetch - if (!auth_check("$fd", "subscriber", "1")) { - auth_challenge("$fd", "0"); - exit; - } else { - xlog("Credential fetch $avp(password)\n"); - # xlog("au=$au, ad = $ad, aU=$aU, Au= $Au\n"); - $sht(a=>$Au) = $avp(password); - } - } - } else { - ## RABBITMQ - Credentials fetch - if (!auth_check("$fd", "subscriber", "1")) { - auth_challenge("$fd", "0"); - exit; - } else { - xlog("L_INFO", "Credential fetch $avp(password)\n"); - # xlog("au=$Au, ad = $ad, aU=$aU, Au= $Au\n"); - $sht(a=>$Au) = $avp(password); - } - } - } else { - auth_challenge("$fd", "0"); - exit; - } - - - # user authenticated - remove auth header - consume_credentials(); - -# if (!add_path_received()) { - # sl_send_reply("503", "Internal path befuddlement"); - # # route(CLEANUP_DIALOG); - # exit(); - # } - - save("location"); - exit; - /* - if (is_method("REGISTER")) { - if (!add_path_received()) { - sl_send_reply("503", "Internal path befuddlement"); - # route(CLEANUP_DIALOG); - exit(); + if (nat_uac_test("3")) { + xlog("L_INFO", "Nated contact\n"); + #setflag(FLB_NATSIPPING); + force_rport(); + + setbflag(FLB_NATB); + setbflag(FLB_NATSIPPING); + + fix_nated_register(); } - */ + + # authenticate requests + # check iif we have the password in cache + if ( is_present_hf("Authorization") ) { + if ( $sht(a=>$Au) != $null ) { + xlog("L_INFO", "Found stored password for $Au, $sht(a=>$Au)\n"); + if (!pv_auth_check("$fd", "$sht(a=>$Au)", "0", "0")) { + xlog("L_INFO", "Authentication did not work with stored password\n"); + + ## RABBITMQ - Credentials fetch + if (!auth_check("$fd", "subscriber", "1")) { + auth_challenge("$fd", "0"); + exit; + } else { + xlog("Credential fetch $avp(password)\n"); +# xlog("au=$au, ad = $ad, aU=$aU, Au= $Au\n"); + $sht(a=>$Au) = $avp(password); + } + } + } else { + ## RABBITMQ - Credentials fetch + if (!auth_check("$fd", "subscriber", "1")) { + auth_challenge("$fd", "0"); + exit; + } else { + xlog("L_INFO", "Credential fetch $avp(password)\n"); +# xlog("au=$Au, ad = $ad, aU=$aU, Au= $Au\n"); + $sht(a=>$Au) = $avp(password); + } + } + } else { + auth_challenge("$fd", "0"); + exit; + } + + # user authenticated - remove auth header + consume_credentials(); + + save("location"); + exit; } else { - if (!is_method("MESSAGE")) - record_route(); + if (!is_method("MESSAGE")) { + record_route(); + } } } @@ -476,127 +429,101 @@ route[HANDLE_IN_DIALOG_REQUESTS] { # If prefered route defined, reorder the destionations route[FIND_ROUTES] { - if (is_method("REGISTER")) + # alg 0 = hash(Callid) + if (!ds_select_dst("1", "0")) { - # alg 2 = hash(To URI) - # To URI is actually AOR - to help with nounce reusage at reRegister - if (!ds_select_dst("3", "2") && !ds_select_dst("1", "2")) - { - xlog("L_ERR", "$ci|end|no servers avaliable"); + xlog("L_ERR", "$ci|end|no servers avaliable"); - sl_send_reply("480", "All servers busy"); + sl_send_reply("480", "All servers busy"); - exit; - } + exit; } - else - { - # alg 0 = hash(Callid) - if (!ds_select_dst("1", "0")) - { - xlog("L_ERR", "$ci|end|no servers avaliable"); - sl_send_reply("480", "All servers busy"); + # Handle the case when a prefered route is set + $var(contact_uri) = @from.uri.user + "@" + @from.uri.host; - exit; - } - - # Handle the case when a prefered route is set - $var(contact_uri) = $(ct{tobody.user}) + "@" + $(ct{tobody.host}); - - if ($sht(associations=>$var(contact_uri)) != $null) - { - $var(prefered_route) = $sht(associations=>$var(contact_uri)); - - xlog("L_INFO", "$ci|log|should route to $var(prefered_route)"); + if ($sht(associations=>$var(contact_uri)) != $null) + { + $var(prefered_route) = $sht(associations=>$var(contact_uri)); - route(REORDER_ROUTES); - } + xlog("L_INFO", "$ci|log|should route to $var(prefered_route)"); + route(REORDER_ROUTES); } } route[REORDER_ROUTES] { - # if the dispatcher list does not start with - # the the prefered route, reorder the list so that it does - - if ($(avp(ds_dst)[0]) != $var(prefered_route)) + $var(i) = 0; + $var(found) = 0; + while($(avp(ds_dst)[$var(i)]) != $null) { - # create a index var for our loop (arrays are start at 0 and this is a count) - $var(i) = $avp(ds_cnt) - 1; + xlog("L_INFO", "$ci|log|IN $var(i): $(avp(ds_dst)[$var(i)])"); - # loop over the dispatcher list - while($var(i) > 0) - { - # if this element in the dispatch list is the same - # as the call destination - if($(avp(ds_dst)[$var(i)]) == $var(prefered_route)) - { - # replace it with the first element of the list - $(avp(ds_dst)[$(var(i))]) = $(avp(ds_dst)[0]); - - # break out of the loop - $var(i) = -1; - } - - $var(i) = $var(i) - 1; + if($(avp(ds_dst)[$var(i)]) != $var(prefered_route)) { + $avp(tmp_ds_dst) = $(avp(ds_dst)[$var(i)]); + } else { + $var(found) = 1; } - # handles the case were we only have two servers - # and the one that we are locked to has failed - if ($var(i) >= 0) - { - - xlog("L_INFO", "$ci|log|associated media server is inactive, moving to $rd"); + $var(i) = $var(i) + 1; + } + + if ($var(found)) { + xlog("L_INFO", "$ci|log|re-ordering the dispatcher list to keep associated server first"); - $sht(associations=>$var(contact_uri)) = "sip:$rd:$rp"; + $(avp(ds_dst)[*]) = $null; - xlog("L_INFO", "$ci|log|associated contact $var(contact_uri) with media server sip:$rd:$rp"); - } - # the server we are locked to is in the active server list from then - # dispatcher so re-arrange the list to try it first - else + $var(i) = 0; + while($(avp(tmp_ds_dst)[$var(i)]) != $null) { - xlog("L_INFO", "$ci|log|re-ordering the dispatcher list to keep associated server first"); + $avp(ds_dst) = $(avp(tmp_ds_dst)[$var(i)]); - # set the first element of the list to the destination - $(avp(ds_dst)[0]) = $var(prefered_route); + $var(i) = $var(i) + 1; + } + $avp(ds_dst) = $var(prefered_route); + $du = $var(prefered_route); - # set the domain for this request (server IP to route to) - $rd = $(var(prefered_route){uri.host}); + $(avp(tmp_ds_dst)[*]) = $null; + } else { + xlog("L_INFO", "$ci|log|associated media server is inactive, moving to $rd"); - # set the port for this request (server IP to route to) - $rp = $(var(prefered_route){uri.port}); - } + $sht(associations=>$var(contact_uri)) = $null; } -} - + $var(i) = 0; + while($(avp(ds_dst)[$var(i)]) != $null) + { + xlog("L_INFO", "$ci|log|OUT $var(i): $(avp(ds_dst)[$var(i)])"); + $var(i) = $var(i) + 1; + } +} route[HANDLE_MOVE_REQUEST] { - if (is_method("INVITE") && $rU == "*6683*" && $sht(associations=>$var(contact_uri)) != $null ) + if (is_method("INVITE") && $rU == "*6683*") { - $var(contact_uri) = $(ct{tobody.user}) + "@" + $(ct{tobody.host}); + $var(contact_uri) = @from.uri.user + "@" + @from.uri.host; - xlog("L_INFO", "$ci|log|remove association for user $var(contact_uri):$si:$sp - with media server $sht(associations=>$var(contact_uri))\n"); + if ($sht(associations=>$var(contact_uri)) != $null) + { + xlog("L_INFO", "$ci|log|remove association for user $var(contact_uri) + with media server $sht(associations=>$var(contact_uri))\n"); - $sht(associations=>$var(contact_uri))= $null; + $sht(associations=>$var(contact_uri)) = $null; + } # TODO - does the test expect smth like $rd:$rp as reason? send_reply("503", "Removed association"); + + xlog("L_INFO", "$ci|log|removed association for user $var(contact_uri) + with media server $sht(associations=>$var(contact_uri))\n"); exit; } } route[RELAY] { -# if (is_method("CANCEL") || is_method("BYE")) { -# route(CLEANUP_DIALOG); -# } - if (isflagset(FLAG_INTERNALLY_SOURCED)) { route(INTERNAL_TO_EXTERNAL_RELAY); } else { @@ -613,11 +540,6 @@ route[INTERNAL_TO_EXTERNAL_RELAY] { t_set_fr(0, 10000); - route(LOG_DESTINATION); - -# xlog("L_INFO", "$ci|log|associate call-id $ci with sip:$sip:$sp"); -# $sht(associations=>$ci) = "sip:" + $si + ":" + $sp; - t_relay(); } @@ -634,13 +556,9 @@ route[EXTERNAL_TO_INTERNAL_RELAY] { t_set_fr(0, 1000); - route(LOG_DESTINATION); - t_relay(); } - - route[LOG_DESTINATION] { if (isdsturiset()) { $var(port) = $dp; @@ -689,16 +607,8 @@ onreply_route[EXTERNAL_REPLY] { xlog("L_INFO", "$ci|log|external reply $T_reply_code"); route(NAT_TEST_AND_CORRECT); - -# if (is_method("INVITE") && t_check_status("200")) { -# $var(user) = $(ct{tobody.user}) + "@" + $(ct{tobody.host}); -# xlog("L_INFO", "$ci|log|associate user $var(user):$si:$sp with media server"); -# $sht(associations=>$var(user)) = $avp(AVP_ASSOCIATED_SERVER); -# } - } - onreply_route[INTERNAL_REPLY] { # this route handles replies that are comming from our media server @@ -801,24 +711,26 @@ failure_route[INTERNAL_FAULT] else if (t_check_status("302")) { ## TODO - test this - get_redirects("*"); + ## get_redirects("*"); +/* + if(@msg.header["X-Redirect-Server"] != $null) + { + $var(test) = @msg.header["X-Redirect-Server"].value; + xlog("L_INFO", "$ci|log|X-Redirect-Server $var(test)"); - route(EXTERNAL_TO_INTERNAL_RELAY); + $var(contact_uri) = $(ct{tobody.user}) + "@" + $(ct{tobody.host}); - /* - if( $(hdr(X-Redirect-Server)) && $(ct.fields(uri)) ) - { - $var(redirect_host) = $(hdr(X-Redirect-Server){uri.host}); + $var(redirect_host) = $(hdr(X-Redirect-Server){uri.host}); - $var(redirect_port) = $(hdr(X-Redirect-Server){uri.port}); + $var(redirect_port) = $(hdr(X-Redirect-Server){uri.port}); - cache_store("local", "$(ct.fields(uri))", "sip:$var(redirect_host):$var(redirect_port)", 60); + $sht(associations=>$var(contact_uri))= "sip:$var(redirect_host):$var(redirect_port)"; - xlog("L_INFO", "$ci|log|stored redirect mapping for $(ct.fields(uri)) to sip:$var(redirect_host):$var(redirect_port)"); + xlog("L_INFO", "$ci|log|stored redirect mapping for $var(contact_uri) to sip:$var(redirect_host):$var(redirect_port)"); remove_hf("X-Redirect-Server"); } - */ +*/ } else { @@ -831,114 +743,13 @@ failure_route[INTERNAL_FAULT] } onsend_route { - xlog("L_INFO", "$ci|pass|$sndfrom(ip):$sndfrom(port) -> $sndto(ip):$sndto(port)"); -} - - -## Not used routes -/* -# Take the routes from memcached -# Write them in an AVP -# Randomize -route[LOAD_KAZOO_ROUTES] { - $var(routes) = $mct(available_kazoo_routes); - route(LOAD_ROUTES); - - $var(randomizer_pos) = $avp(AVP_ROUTE_CNT); - route(RANDOMIZE_ROUTES); - - if (!isflagset(FLAG_ITSP_SOURCED) && is_method("REGISTER|INVITE|SUBSCRIBE")) { - setflag(FLAG_ASSOCIATE_SERVER); - } -} - -route[LOAD_ROUTES] { - if ($var(routes) == $null) { - return(-1); - } - - $var(i) = 0; - $var(route) = $(var(routes){s.select,$var(i),;}); - while($(var(route){s.len}) > 0) { - $var(i) = $var(i) + 1; - $avp($var(i)) = $var(route); - $var(route) = $(var(routes){s.select,$var(i),;}); - } - $avp(AVP_ROUTE_CNT) = $var(i); - - return(1); -} - -# No longer used -route[NEXT_ROUTE] { - if ($avp(AVP_ROUTE_CNT) <= 0) { - return(-1); - } - - $var(domain) = $(avp($avp(AVP_ROUTE_CNT)){uri.host}); - $var(port) = $(avp($avp(AVP_ROUTE_CNT)){uri.port}); - - $avp(AVP_ROUTE_CNT) = $avp(AVP_ROUTE_CNT) - 1; - - if ($(var(domain){s.len}) <= 0) { - route(NEXT_ROUTE); + if (isflagset(FLAG_ASSOCIATE_USER)) { + $var(contact_uri) = @from.uri.user + "@" + @from.uri.host; + xlog("L_INFO", "$ci|log|associate user $var(contact_uri) with media server sip:$sndto(ip):$sndto(port)\n"); + $sht(associations=>$var(contact_uri))= "sip:" + $sndto(ip) + ":" + $sndto(port); } - if ($(var(port){s.len}) <= 4) { - $var(port) = "5060"; - } - - $du = "sip:" + $var(domain) + ":" + $var(port); - - xlog("L_INFO", "$ci|log|associate call-id $ci with $du"); - $sht(associations=>$ci) = $du; - - return(1); -} - -route[RANDOMIZE_ROUTES] { - if ($var(randomizer_pos) <= 0) { - return(); - } - - $var(random_pos) = ($RANDOM mod $var(randomizer_pos) + 1); - - if ($var(random_pos) != $var(randomizer_pos)) { - $var(route) = $avp($var(randomizer_pos)); - $avp($var(randomizer_pos)) = $avp($var(random_pos)); - $avp($var(random_pos)) = $var(route); - } - - $var(randomizer_pos) = $var(randomizer_pos) - 1; - route(RANDOMIZE_ROUTES); -} - -route[LOG_ROUTES] { - $var(i) = $avp(AVP_ROUTE_CNT); - while($var(i) > 0) { - $var(value) = $avp($var(i)); - xlog("L_INFO", "$ci|log|route $var(i): $var(value)"); - $var(i) = $var(i) - 1; - } -} - -route[CLEANUP_DIALOG] { - xlog("L_INFO", "$ci|log|remove any association for $ci"); - sht_rm_name_re("associations=>$ci"); - return(); + xlog("L_INFO", "$ci|pass|$sndfrom(ip):$sndfrom(port) -> $sndto(ip):$sndto(port)"); } -route[MAYBE_ASSOCIATE_SERVER] { - if (isflagset(FLAG_ASSOCIATE_SERVER) && defined $avp(AVP_ASSOCIATED_SERVER)) { - xlog("L_INFO", "$ci|log|associate call-id $ci with $avp(AVP_ASSOCIATED_SERVER)"); - $sht(associations=>$ci) = $avp(AVP_ASSOCIATED_SERVER); - - if (is_method("INVITE")) { - $var(user) = $(ct{tobody.user}) + "@" + $si; - xlog("L_INFO", "$ci|log|associate user $var(user) with $avp(AVP_ASSOCIATED_SERVER)"); - $sht(associations=>$var(user)) = $avp(AVP_ASSOCIATED_SERVER); - } - } -} -*/ ## vim:set tabstop=4 softtabstop=4 shiftwidth=4 expandtab From 11654653027cd4afcc019c6533327af626b6dc10 Mon Sep 17 00:00:00 2001 From: karl anderson Date: Fri, 21 Jun 2013 12:12:09 -0700 Subject: [PATCH 8/9] incorporate proper 302 redirect handling --- kamailio/kamailio.cfg | 232 +++++++++++++++--------------------------- 1 file changed, 82 insertions(+), 150 deletions(-) diff --git a/kamailio/kamailio.cfg b/kamailio/kamailio.cfg index 19ce5d1..ed9d4b2 100644 --- a/kamailio/kamailio.cfg +++ b/kamailio/kamailio.cfg @@ -17,9 +17,9 @@ ####### Global Parameters ######### fork = yes -children = 16 -#group = -#user = +children = 25 +group = kamailio +user = kamailio server_signature = no server_header = "Server: Kazoo" user_agent_header = "User-Agent: Kazoo" @@ -158,8 +158,8 @@ modparam("path", "use_received", 0) ######## Generic Hash Table container in shared memory ######## loadmodule "htable.so" -modparam("htable", "htable", "associations=>size=14;") -modparam("htable", "htable", "a=>size=10;") +modparam("htable", "htable", "associations=>size=10;") +modparam("htable", "htable", "auth_cache=>size=10;") ######## Pseudo-Variables module ######## loadmodule "pv.so" @@ -199,7 +199,7 @@ loadmodule "db_kazoo.so" # FIXME: uncomment the next line and set the correct hostname that should be advertised to Kazoo #modparam("db_kazoo", "node_hostname", "kamailio.kazoo.com") # If you want a certain fs_path to be sent Kazoo, uncomment the next line and set the right value -#modparam("db_kazoo", "register_fs_path", "IP:PORT") +#modparam("db_kazoo", "register_fs_path", "127.0.0.1:5060") ####### Authentication Interface module ########## loadmodule "auth.so" @@ -235,7 +235,8 @@ modparam("auth_db|usrloc", "db_url", "kazoo://guest:guest@127.0.0.1:5672/callmgr ####### Routing Logic ######## -route { +route +{ # log the basic info regarding this call xlog("L_INFO", "$ci|start|recieved $oP request $rm $ou"); xlog("L_INFO", "$ci|log|source $si:$sp"); @@ -244,8 +245,6 @@ route { route(SANITY_CHECK); - route(SET_LOGGING_FLAGS); - route(CLASSIFY_SOURCE); route(HANDLE_OPTIONS); @@ -267,7 +266,8 @@ route { route(EXTERNAL_TO_INTERNAL_RELAY); } -route[SANITY_CHECK] { +route[SANITY_CHECK] +{ if (!mf_process_maxfwd_header("10")) { xlog("L_WARN", "$ci|end|max-forward limit reached"); sl_send_reply("483", "Too Many Hops"); @@ -280,25 +280,19 @@ route[SANITY_CHECK] { } } -route[SET_LOGGING_FLAGS] { - return(); -} - route[CLASSIFY_SOURCE] { - if (ds_is_from_list("1") || ds_is_from_list("3")) - { + if (ds_is_from_list("1") || ds_is_from_list("3")) { xlog("L_INFO", "$ci|log|originated from internal sources"); setflag(FLAG_INTERNALLY_SOURCED); - } - else - { + } else { xlog("L_INFO", "$ci|log|originated from external sources"); } } -route[HANDLE_OPTIONS] { +route[HANDLE_OPTIONS] +{ if (is_method("OPTIONS")) { if (isflagset(FLAG_INTERNALLY_SOURCED)) { route(INTERNAL_TO_EXTERNAL_RELAY); @@ -309,30 +303,21 @@ route[HANDLE_OPTIONS] { } } -# Called on in-dialog requests -# If the request in an Invite for on hold from external to internal, -# associate the contact with the media server -route[MAYBE_ASSOCIATE_USER] { - # if Invite for on hold, we need to associate the contact URI with the next hop - if (is_method("INVITE") && !isflagset(FLAG_INTERNALLY_SOURCED) && is_audio_on_hold()) { - setflag(FLAG_ASSOCIATE_USER); - } - -} - -route[HANDLE_IN_DIALOG_REQUESTS] { +route[HANDLE_IN_DIALOG_REQUESTS] +{ if (has_totag()) { if (loose_route()) { xlog("L_INFO", "$ci|log|loose_route in-dialog message"); - - route(MAYBE_ASSOCIATE_USER); - + # Called on in-dialog requests + # If the request in an Invite for on hold from external to internal, + # associate the contact with the media server + # if Invite for on hold, we need to associate the contact URI with the next hop + if (is_method("INVITE") && !isflagset(FLAG_INTERNALLY_SOURCED) && is_audio_on_hold()) { + setflag(FLAG_ASSOCIATE_USER); + } route(RELAY); } else if (isflagset(FLAG_INTERNALLY_SOURCED)) { xlog("L_INFO", "$ci|log|relay internally sourced in-dialog message without loose_route"); - if(is_method("INVITE")) { - xlog("L_INFO", "$ci|log|re-associate $ci with media server $si:$sp"); - } route(RELAY); } else if (t_check_trans()) { xlog("L_INFO", "$ci|log|allow message for a known transaction"); @@ -345,7 +330,8 @@ route[HANDLE_IN_DIALOG_REQUESTS] { } } - route[PREPARE_INITIAL_REQUESTS] { +route[PREPARE_INITIAL_REQUESTS] +{ if (is_method("CANCEL")) { if (t_check_trans()) { route(RELAY); @@ -368,60 +354,43 @@ route[HANDLE_IN_DIALOG_REQUESTS] { } if (is_method("REGISTER")) { - if (nat_uac_test("3")) { - xlog("L_INFO", "Nated contact\n"); - #setflag(FLB_NATSIPPING); - force_rport(); - - setbflag(FLB_NATB); - setbflag(FLB_NATSIPPING); - - fix_nated_register(); - } - - # authenticate requests - # check iif we have the password in cache - if ( is_present_hf("Authorization") ) { - if ( $sht(a=>$Au) != $null ) { - xlog("L_INFO", "Found stored password for $Au, $sht(a=>$Au)\n"); - if (!pv_auth_check("$fd", "$sht(a=>$Au)", "0", "0")) { - xlog("L_INFO", "Authentication did not work with stored password\n"); - - ## RABBITMQ - Credentials fetch - if (!auth_check("$fd", "subscriber", "1")) { - auth_challenge("$fd", "0"); - exit; - } else { - xlog("Credential fetch $avp(password)\n"); -# xlog("au=$au, ad = $ad, aU=$aU, Au= $Au\n"); - $sht(a=>$Au) = $avp(password); - } - } + if (is_present_hf("Authorization")) { + if ($sht(auth_cache=>$Au) != $null && pv_auth_check("$fd", "$sht(auth_cache=>$Au)", "0", "0")) { + xlog("L_INFO", "$ci|log|Authenticated $Au via cached SIP creds\n"); } else { ## RABBITMQ - Credentials fetch if (!auth_check("$fd", "subscriber", "1")) { auth_challenge("$fd", "0"); + xlog("L_INFO", "$ci|log|Issued new auth challenge to failed registration attempt\n"); exit; } else { - xlog("L_INFO", "Credential fetch $avp(password)\n"); -# xlog("au=$Au, ad = $ad, aU=$aU, Au= $Au\n"); - $sht(a=>$Au) = $avp(password); + xlog("$ci|log|Caching SIP credentials for $Au\n"); + $sht(auth_cache=>$Au) = $avp(password); } } } else { auth_challenge("$fd", "0"); + xlog("L_INFO", "$ci|log|Issued new auth challenge to new registration attempt\n"); exit; } # user authenticated - remove auth header consume_credentials(); + if (nat_uac_test("3")) { + xlog("L_INFO", "$ci|log|Correcting NATed contact in registration\n"); + force_rport(); + + setbflag(FLB_NATB); + setbflag(FLB_NATSIPPING); + + fix_nated_register(); + } + save("location"); exit; - } else { - if (!is_method("MESSAGE")) { + } else if (!is_method("MESSAGE")) { record_route(); - } } } @@ -430,8 +399,7 @@ route[HANDLE_IN_DIALOG_REQUESTS] { route[FIND_ROUTES] { # alg 0 = hash(Callid) - if (!ds_select_dst("1", "0")) - { + if (!ds_select_dst("1", "0")) { xlog("L_ERR", "$ci|end|no servers avaliable"); sl_send_reply("480", "All servers busy"); @@ -441,9 +409,7 @@ route[FIND_ROUTES] # Handle the case when a prefered route is set $var(contact_uri) = @from.uri.user + "@" + @from.uri.host; - - if ($sht(associations=>$var(contact_uri)) != $null) - { + if ($sht(associations=>$var(contact_uri)) != $null) { $var(prefered_route) = $sht(associations=>$var(contact_uri)); xlog("L_INFO", "$ci|log|should route to $var(prefered_route)"); @@ -452,13 +418,11 @@ route[FIND_ROUTES] } } -route[REORDER_ROUTES] { +route[REORDER_ROUTES] +{ $var(i) = 0; $var(found) = 0; - while($(avp(ds_dst)[$var(i)]) != $null) - { - xlog("L_INFO", "$ci|log|IN $var(i): $(avp(ds_dst)[$var(i)])"); - + while($(avp(ds_dst)[$var(i)]) != $null) { if($(avp(ds_dst)[$var(i)]) != $var(prefered_route)) { $avp(tmp_ds_dst) = $(avp(ds_dst)[$var(i)]); } else { @@ -474,8 +438,7 @@ route[REORDER_ROUTES] { $(avp(ds_dst)[*]) = $null; $var(i) = 0; - while($(avp(tmp_ds_dst)[$var(i)]) != $null) - { + while($(avp(tmp_ds_dst)[$var(i)]) != $null) { $avp(ds_dst) = $(avp(tmp_ds_dst)[$var(i)]); $var(i) = $var(i) + 1; @@ -489,31 +452,20 @@ route[REORDER_ROUTES] { $sht(associations=>$var(contact_uri)) = $null; } - - $var(i) = 0; - while($(avp(ds_dst)[$var(i)]) != $null) - { - xlog("L_INFO", "$ci|log|OUT $var(i): $(avp(ds_dst)[$var(i)])"); - - $var(i) = $var(i) + 1; - } } route[HANDLE_MOVE_REQUEST] { - if (is_method("INVITE") && $rU == "*6683*") - { + if (is_method("INVITE") && $rU == "*6683*") { $var(contact_uri) = @from.uri.user + "@" + @from.uri.host; - if ($sht(associations=>$var(contact_uri)) != $null) - { + if ($sht(associations=>$var(contact_uri)) != $null) { xlog("L_INFO", "$ci|log|remove association for user $var(contact_uri) with media server $sht(associations=>$var(contact_uri))\n"); $sht(associations=>$var(contact_uri)) = $null; } - # TODO - does the test expect smth like $rd:$rp as reason? send_reply("503", "Removed association"); xlog("L_INFO", "$ci|log|removed association for user $var(contact_uri) @@ -523,7 +475,8 @@ route[HANDLE_MOVE_REQUEST] } } -route[RELAY] { +route[RELAY] +{ if (isflagset(FLAG_INTERNALLY_SOURCED)) { route(INTERNAL_TO_EXTERNAL_RELAY); } else { @@ -533,7 +486,8 @@ route[RELAY] { exit(); } -route[INTERNAL_TO_EXTERNAL_RELAY] { +route[INTERNAL_TO_EXTERNAL_RELAY] +{ remove_hf("X-AUTH-IP"); t_on_reply("EXTERNAL_REPLY"); @@ -543,7 +497,8 @@ route[INTERNAL_TO_EXTERNAL_RELAY] { t_relay(); } -route[EXTERNAL_TO_INTERNAL_RELAY] { +route[EXTERNAL_TO_INTERNAL_RELAY] +{ if (!isflagset(FLAG_INTERNALLY_SOURCED)) { route(NAT_TEST_AND_CORRECT); } @@ -559,7 +514,8 @@ route[EXTERNAL_TO_INTERNAL_RELAY] { t_relay(); } -route[LOG_DESTINATION] { +route[LOG_DESTINATION] +{ if (isdsturiset()) { $var(port) = $dp; $var(domain) = $dd; @@ -575,7 +531,8 @@ route[LOG_DESTINATION] { xlog("L_INFO", "$ci|pass|$var(domain):$var(port)"); } -route[NAT_TEST_AND_CORRECT] { +route[NAT_TEST_AND_CORRECT] +{ if (is_present_hf("Record-Route")) { $var(i) = $rr_count; while($var(i) > 0) { @@ -603,7 +560,8 @@ route[NAT_TEST_AND_CORRECT] { } } -onreply_route[EXTERNAL_REPLY] { +onreply_route[EXTERNAL_REPLY] +{ xlog("L_INFO", "$ci|log|external reply $T_reply_code"); route(NAT_TEST_AND_CORRECT); @@ -615,29 +573,26 @@ onreply_route[INTERNAL_REPLY] xlog("L_INFO", "$ci|start|recieved internal reply $T_reply_code $rr"); xlog("L_INFO", "$ci|log|source $si:$sp"); - if ($rs < 300) - { + if ($rs < 300) { xlog("L_INFO", "$ci|pass|$T_req($si):$T_req($sp)"); } # change 6xx to 4xx - if (t_check_status("6[0-9][0-9]")) - { + if (t_check_status("6[0-9][0-9]")) { $var(new_code) = "4" + $(T_reply_code{s.substr,1,0}); change_reply_status("$var(new_code)", "$rr"); } } -failure_route[INTERNAL_FAULT] +failure_route[INTERNAL_FAULT] { # this branch handles failures (>=300) to our media servers, # which we can sometimes overcome by routing to another server # if the failure cause was due to the transaction being # cancelled then we are complete - if (t_is_canceled()) - { + if (t_is_canceled()) { xlog("L_INFO", "$ci|log|transaction was cancelled"); exit; @@ -645,14 +600,11 @@ failure_route[INTERNAL_FAULT] # if the failure case was something that we should recover # from then try to find a new media server - if (t_check_status("(401)|(407)")) - { + if (t_check_status("(401)|(407)")) { xlog("L_INFO", "$ci|log|failure route ignoring auth reply $T_reply_code $rr"); exit; - } - else if (t_check_status("403")) - { + } else if (t_check_status("403")) { xlog("L_INFO", "$ci|log|failure route overriding reply code 403 with 503"); xlog("L_INFO", "$ci|pass|$si:$sp"); @@ -660,9 +612,7 @@ failure_route[INTERNAL_FAULT] send_reply("503", "Error: Services Unavailable. Try Later"); exit; - } - else if (t_check_status("402")) - { + } else if (t_check_status("402")) { xlog("L_INFO", "$ci|log|failure route overriding reply code 402 with 486"); xlog("L_INFO", "$ci|pass|$si:$sp"); @@ -670,14 +620,11 @@ failure_route[INTERNAL_FAULT] send_reply("486", "Insufficient Funds"); exit; - } - else if (t_check_status("(4[0-9][0-9])|(5[0-9][0-9])")) - { + } else if (t_check_status("(4[0-9][0-9])|(5[0-9][0-9])")) { xlog("L_INFO", "$ci|start|received failure reply $T_reply_code $rr"); # try to find a new media server to send the call to - if ($avp(route_attempts) < 3 && ds_next_domain()) - { + if ($avp(route_attempts) < 3 && ds_next_domain()) { xlog("L_INFO", "$ci|log|attempting retry $avp(route_attempts) of failed request"); xlog("L_INFO", "$ci|log|routing call to next media server $rd:$rp"); @@ -692,48 +639,33 @@ failure_route[INTERNAL_FAULT] route(EXTERNAL_TO_INTERNAL_RELAY); $avp(route_attempts) = $avp(route_attempts) + 1; - } - else if (t_check_status("404")) - { + } else if (t_check_status("404")) { xlog("L_ERR", "$ci|log|no other media servers avaliable, sending 486"); send_reply("486", "Not found"); exit; - } - else - { + } else { xlog("L_ERR", "$ci|log|no other media servers avaliable"); exit; } - } - else if (t_check_status("302")) - { + } else if (t_check_status("302")) { ## TODO - test this ## get_redirects("*"); -/* - if(@msg.header["X-Redirect-Server"] != $null) - { - $var(test) = @msg.header["X-Redirect-Server"].value; - xlog("L_INFO", "$ci|log|X-Redirect-Server $var(test)"); - - $var(contact_uri) = $(ct{tobody.user}) + "@" + $(ct{tobody.host}); - - $var(redirect_host) = $(hdr(X-Redirect-Server){uri.host}); - $var(redirect_port) = $(hdr(X-Redirect-Server){uri.port}); + if($T_rpl($hdr(X-Redirect-Server)) != $null) { + $var(contact_uri) = @from.uri.user + "@" + @from.uri.host; - $sht(associations=>$var(contact_uri))= "sip:$var(redirect_host):$var(redirect_port)"; + $sht(associations=>$var(contact_uri)) = $T_rpl($hdr(X-Redirect-Server)); - xlog("L_INFO", "$ci|log|stored redirect mapping for $var(contact_uri) to sip:$var(redirect_host):$var(redirect_port)"); + xlog("L_INFO", "$ci|log|stored redirect mapping for $var(contact_uri) to $T_rpl($hdr(X-Redirect-Server))"); remove_hf("X-Redirect-Server"); } -*/ - } - else - { + + route(EXTERNAL_TO_INTERNAL_RELAY); + } else { xlog("L_INFO", "$ci|log|failure route ignoring reply $T_reply_code $rr"); exit; From 0d4ab51769e2ff70c5d9d090fbb7144ea90d74c1 Mon Sep 17 00:00:00 2001 From: karl anderson Date: Fri, 21 Jun 2013 12:16:58 -0700 Subject: [PATCH 9/9] fix ERROR: t_forward_nonack: no branches for forwarding --- kamailio/kamailio.cfg | 2 -- 1 file changed, 2 deletions(-) diff --git a/kamailio/kamailio.cfg b/kamailio/kamailio.cfg index ed9d4b2..cc770ec 100644 --- a/kamailio/kamailio.cfg +++ b/kamailio/kamailio.cfg @@ -663,8 +663,6 @@ failure_route[INTERNAL_FAULT] remove_hf("X-Redirect-Server"); } - - route(EXTERNAL_TO_INTERNAL_RELAY); } else { xlog("L_INFO", "$ci|log|failure route ignoring reply $T_reply_code $rr");