From fe8e2565898e41344b55eda570370b4daf70ebcd Mon Sep 17 00:00:00 2001 From: lazedo Date: Wed, 27 Aug 2014 18:20:22 +0100 Subject: [PATCH 1/3] KAZOO-2870 - adapt the configuration and script --- kamailio/default.cfg | 24 +++++++++++ kamailio/dispatcher-role.cfg | 32 +++++++++++++++ kamailio/local.cfg | 5 +++ kamailio/presence-role.cfg | 55 ++++++++++++++++++++------ kamailio/registrar-role.cfg | 77 +++++++++++++++++++++++++----------- 5 files changed, 160 insertions(+), 33 deletions(-) diff --git a/kamailio/default.cfg b/kamailio/default.cfg index 0e90873..760b270 100644 --- a/kamailio/default.cfg +++ b/kamailio/default.cfg @@ -150,6 +150,16 @@ modparam("db_text", "db_mode", 1) ####### Kazoo Integration module ########## loadmodule "db_kazoo.so" modparam("db_kazoo", "node_hostname", "MY_HOSTNAME") +modparam("db_kazoo", "register_fs_path", "MY_IP_ADDRESS") +modparam("db_kazoo", "amqp_connection", "MY_AMQP_URL_1") +modparam("db_kazoo", "amqp_connection", "MY_AMQP_URL_2") +#modparam("db_kazoo", "amqp_connection", "MY_AMQP_URL_3") +#modparam("db_kazoo", "amqp_connection", "MY_AMQP_URL_4") +modparam("db_kazoo", "amqp_max_channels", AMQP_NUMBER_OF_CHANNELS) +modparam("db_kazoo", "amqp_internal_loop_count", 1); +modparam("db_kazoo", "amqp_consumer_loop_count", 3); + + ####### Role Configurations ########## #!ifdef DISPATCHER-ROLE @@ -583,4 +593,18 @@ onsend_route { xlog("L_INFO", "$ci|pass|$sndfrom(ip):$sndfrom(port) -> $sndto(ip):$sndto(port)"); } +event_route[kazoo:mod-init] +{ + #!ifdef PRESENCE-ROLE + kazoo_subscribe("dialoginfo", "direct", "BLF-QUEUE-MY_HOSTNAME", "BLF-MY_HOSTNAME"); + #!endif +} + +event_route[kazoo:consumer-event] +{ + xlog("L_INFO","REALLY!! you subscribed for something and you're not handling it ?"); + xlog("L_INFO","Payload : $kzE"); +} + + # vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab diff --git a/kamailio/dispatcher-role.cfg b/kamailio/dispatcher-role.cfg index e16db39..a3c1dfe 100644 --- a/kamailio/dispatcher-role.cfg +++ b/kamailio/dispatcher-role.cfg @@ -68,6 +68,38 @@ route[DISPATCHER_FIND_ROUTES] } #!endif + if (is_method("INVITE")) { + if($hdr(Replaces)!= $null) { + $var(replaced_call_id) = $(hdr(Replaces){s.select,0,;}); + xlog("L_INFO", "$ci|log|replaces call-id $var(replaced_call_id)"); + $var(amqp_payload_request) = "{'Event-Category' : 'call_event' , 'Event-Name' : 'channel_status_req', 'Call-ID' : '$var(replaced_call_id)', 'Active-Only' : false }"; + $var(amqp_routing_key) = "call.status_req." + $var(replaced_call_id); + if(kazoo_query("callevt", $var(amqp_routing_key), $var(amqp_payload_request), "$var(amqp_result)")) { + xlog("L_INFO", "$ci|log|amqp_result = $var(amqp_result)"); + kazoo_json("$var(amqp_result)", "Switch-URL", "$du"); + if($du != $null) { + xlog("L_INFO", "$ci|log|call-id $var(replaced_call_id) found redirecting call to $du, courtesy of kazoo"); + return; + } + } + } else { + ## query user channels - maybe we should this only to feature codes, *3... or * + $var(amqp_payload_request) = "{'Event-Category' : 'call_event' , 'Event-Name' : 'query_user_channels_req', 'Realm' : '" + $fd + "', 'Username' : '" + $fU + "', 'Active-Only' : false }"; + $var(amqp_routing_key) = "call.status_req.$(ci{kz.encode})"; + xlog("L_DBG", "$ci|log|amqp_payload_user_channels = $var(amqp_payload_request)"); + xlog("L_DBG", "$ci|log|amqp_payload_user_channels key = $var(amqp_routing_key)"); + if(kazoo_query("callevt", $var(amqp_routing_key), $var(amqp_payload_request), "$var(amqp_result)")) { + xlog("L_DBG", "$ci|log|amqp_result_user_channels = $var(amqp_result)"); + $du = $(var(amqp_result){kz.json,Channels[0].switch_url}); + if($du != $null) { + xlog("L_DBG", "$ci|log|user channels found redirecting call to $du, courtesy of kazoo"); + return; + } + } + + } + } + if (!ds_select_dst("$var(ds_group)", "0") || $(avp(ds_dst)[0]) == $null) { # if we selected from group 1, try again in group 2 if ($var(ds_group) == 1) { diff --git a/kamailio/local.cfg b/kamailio/local.cfg index 7a11ed1..657ee0e 100644 --- a/kamailio/local.cfg +++ b/kamailio/local.cfg @@ -33,6 +33,11 @@ debug = L_INFO ## This should be the primary RabbitMQ server ## in the zone that this server will service. #!substdef "!MY_AMQP_URL!kazoo://guest:guest@127.0.0.1:5672!g" +#!substdef "!MY_AMQP_URL_1!amqp://guest:guest@127.0.0.1:5672!g" +#!substdef "!MY_AMQP_URL_2!amqp://guest:guest@127.0.0.1:5672!g" +#!substdef "!MY_AMQP_URL_3!amqp://guest:guest@127.0.0.1:5672!g" +#!substdef "!MY_AMQP_URL_4!amqp://guest:guest@127.0.0.1:5672!g" +#!substdef "!MY_AMQP_NUMBER_OF_CHANNELS!100!g" ## This parameter is only required if you are using websockets ## This value must be present in the HTTP diff --git a/kamailio/presence-role.cfg b/kamailio/presence-role.cfg index 41ca8e2..cd94e3a 100644 --- a/kamailio/presence-role.cfg +++ b/kamailio/presence-role.cfg @@ -1,34 +1,29 @@ -######## Generic Hash Table container in shared memory ######## -modparam("htable", "htable", "dbkp=>size=16;autoexpire=7200") - ######## Presence server module ######## loadmodule "presence.so" loadmodule "presence_dialoginfo.so" loadmodule "presence_mwi.so" loadmodule "presence_xml.so" -modparam("presence", "subs_db_mode", 1) +modparam("presence", "subs_db_mode", 0) modparam("presence", "expires_offset", 60) modparam("presence", "publ_cache", 0) modparam("presence", "min_expires", 0) modparam("presence", "max_expires", 3600) modparam("presence", "db_url", "MY_AMQP_URL/dialoginfo") modparam("presence", "send_fast_notify", 0) -modparam("presence", "clean_period", 10) +modparam("presence", "clean_period", 30) -modparam("presence_xml", "integrated_xcap_server", 1) -modparam("presence_xml", "db_url", "MY_AMQP_URL/dialoginfo") modparam("presence_xml", "force_active", 1) + ######## Presence User Agent module ######## loadmodule "pua.so" modparam("pua", "db_mode", 0) -modparam("pua", "db_url", "MY_AMQP_URL/dialoginfo") +modparam("pua", "db_url", "text:///etc/kazoo/kamailio/dbtext") +modparam("pua", "update_period", 6) modparam("pua", "min_expires", 300) modparam("pua", "outbound_proxy", "sip:MY_IP_ADDRESS") -loadmodule "pua_dialoginfo.so" -modparam("pua_dialoginfo", "library_mode", 1) ####### Presence Logic ######## route[HANDLE_SUBSCRIBE] @@ -42,7 +37,21 @@ route[HANDLE_SUBSCRIBE] sl_reply_error(); exit; } + handle_subscribe(); + + ##RabbitMQ + $var(fs_path) = "%3C" + $rz + "%3A" + $Ri + "%3A" + $Rp + "%3Btransport=" + $proto + "%3Blr%3Breceived=" + $si+":"+$sp+"%3E"; + $var(fs_contact) = "<" + $(ct{tobody.uri}) + ";fs_path=" + $var(fs_path) + ">"; + if($(ct{tobody.params}) != $null) { + $var(fs_contact) = $var(fs_contact) + ";" + $(ct{tobody.params}); + } + + $var(amqp_payload_request) = "{'Event-Category' : 'presence', 'Event-Name' : 'subscription', 'Event-Package' : '" + $hdr(event) + "', 'Expires' : " + $hdr(Expires) + ", 'Queue' : 'BLF-MY_HOSTNAME', 'Server-ID' : 'BLF-MY_HOSTNAME' ,'Contact' : '" + $var(fs_contact) + "', 'Call-ID' : '" + $ci + "', 'From' : '" + $fu +"', 'User' : '" + $tu + "', 'User-Agent' : '" + $ua + "' }"; + + xlog("L_DBG", "$ci|log|amqp_presence = $var(amqp_payload_request)"); + kazoo_publish("dialoginfo_subs", "dialoginfo_subs", $var(amqp_payload_request)); + t_release(); exit; } @@ -55,10 +64,34 @@ route[HANDLE_PUBLISH] sl_reply_error(); exit; } - handle_publish(); + if($hdr(Sender)!= $null) + handle_publish("$hdr(Sender)"); + else + handle_publish(); t_release(); exit; } } +event_route[kazoo:consumer-event-presence-update] +{ + xlog("L_DBG","AMQP PRESENCE EVENT : $kzE"); + + kazoo_pua_publish($kzE); + +# switch($(kzE{kz.json,Event-Package})) +# { +# case "message-summary": +# kazoo_pua_publish($kzE); +# break; +# case "dialog": +# xlog("L_INFO","kazoo is great.\n"); +# kazoo_pua_publish($kzE); +# break; +# default: +# xlog("L_INFO","unhandled event package $(kzE{kz.json,Event-Package})"); +# } + +} + # vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab diff --git a/kamailio/registrar-role.cfg b/kamailio/registrar-role.cfg index 8860bc5..e43daf0 100644 --- a/kamailio/registrar-role.cfg +++ b/kamailio/registrar-role.cfg @@ -4,16 +4,10 @@ modparam("htable", "htable", "failed_auth_hash=>size=14;autoexpire=180;") ####### Authentication Interface module ########## loadmodule "auth.so" -loadmodule "auth_db.so" -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") ####### User Location Implementation module ########## loadmodule "usrloc.so" -modparam("usrloc", "db_mode", 1) +modparam("usrloc", "db_mode", 0) modparam("usrloc", "db_update_as_insert", 1) modparam("usrloc", "use_domain", 1) modparam("usrloc", "nat_bflag", FLB_NATB) @@ -34,8 +28,6 @@ modparam("registrar", "received_avp", "$avp(AVP_RECV_PARAM)") modparam("registrar", "min_expires", 300) modparam("registrar", "max_expires", 3600) -####### Common Module Parameters ########## -modparam("auth_db|usrloc", "db_url", "MY_AMQP_URL/callmgr") ####### Registrar Logic ######## route[HANDLE_REGISTER] @@ -69,21 +61,36 @@ route[HANDLE_REGISTER] #!endif if ($sht(auth_cache=>$Au) != $null && pv_auth_check("$fd", "$sht(auth_cache=>$Au)", "0", "0")) { - xlog("L_DBG", "$ci|log|authenticated $Au via cached SIP creds"); + xlog("L_INFO", "$ci|log|authenticated $Au via cached SIP creds"); } else { ## RABBITMQ - Credentials fetch - if (!auth_check("$fd", "subscriber", "1")) { - - #!ifdef TRAFFIC-FILTER-ROLE - route(FAILED_AUTH_COUNT); - #!endif - + $var(amqp_payload_request) = "{'Event-Category' : 'directory' , 'Event-Name' : 'authn_req', 'Method' : 'REGISTER', 'Auth-Realm' : '" + $fd + "', 'Auth-User' : '" + $fU + "', 'From' : '" + $fu + "', 'To' : '" + $tu +"' }"; + $var(amqp_routing_key) = "authn.req." + $(fd{kz.encode}); + if(kazoo_query("callmgr", $var(amqp_routing_key), $var(amqp_payload_request))) { + $var(password) = $(kzR{kz.json,Auth-Password}); + if($var(password) != $null) { + if (!pv_auth_check("$fd", "$var(password)", "0", "0")) { + + #!ifdef TRAFFIC-FILTER-ROLE + route(FAILED_AUTH_COUNT); + #!endif + + auth_challenge("$fd", "0"); + xlog("L_INFO", "$ci|end|failed registration attempt from $si:$sp for $Au"); + exit; + } else { + xlog("L_DBG", "$ci|log|caching SIP credentials for $Au"); + $sht(auth_cache=>$Au) = $var(password); + } + } else { + auth_challenge("$fd", "0"); + xlog("L_INFO", "$ci|log|error getting password from kazoo response"); + exit; + } + } else { auth_challenge("$fd", "0"); - xlog("L_INFO", "$ci|end|failed registration attempt from $si:$sp for $Au"); + xlog("L_INFO", "$ci|log|error query kazoo for credentials"); exit; - } else { - xlog("L_DBG", "$ci|log|caching SIP credentials for $Au"); - $sht(auth_cache=>$Au) = $avp(password); } } } else { @@ -96,7 +103,33 @@ route[HANDLE_REGISTER] consume_credentials(); save("location"); - xlog("L_INFO", "$ci|end|successful registration with contact $ct"); + $var(expires) = @contact.expires; + if($var(expires) == $null) { + $var(expires) = $hdr(Expires); + } + if($var(expires) == $null) { + $var(expires) = 190; + } + + $var(fs_path) = "%3C" + $rz + "%3A" + $Ri + "%3A" + $Rp + "%3Btransport=" + $proto + "%3Blr%3Breceived=" + $si+":"+$sp+"%3E"; + $var(fs_contact) = "<" + $(ct{tobody.uri}) + ";fs_path=" + $var(fs_path) + ">"; + if($(ct{tobody.params}) != $null) { + $var(fs_contact) = $var(fs_contact) + ";" + $(ct{tobody.params}); + } + + + xlog("L_INFO", "$ci|end|successful registration with contact $var(fs_contact)"); + $var(register_contants) = " 'Presence-Hosts' : 'n/a', 'Profile-Name' : 'sipinterface_1', 'Status' : 'Registered', 'Event-Timestamp' : '" + $TS + "'"; + if($var(expires) != $null) { + $var(register_contants) = $var(register_contants) + ", 'Expires' : " + $var(expires); + } + $var(amqp_payload_request) = "{'Event-Category' : 'directory', 'Event-Name' : 'reg_success', 'Contact' : '" + $var(fs_contact) + "', 'Call-ID' : '" + $ci + "', 'Realm' : '" + $fd +"', 'Username' : '" + $fU + "', 'From-User' : '" + $fU + "', 'From-Host' : '" + $fd + "', 'To-User' : '" + $tU +"', 'To-Host' : '" + $td + "', 'User-Agent' : '" + $ua +"' ," + $var(register_contants)+ " }"; + + $var(amqp_routing_key) = "registration.success." + $(fd{kz.encode}) + "." + $fU; + + xlog("L_DBG", "$ci|log|amqp_register_success = $var(amqp_payload_request)"); + kazoo_publish("callmgr", $var(amqp_routing_key), $var(amqp_payload_request)); + exit; } } @@ -151,4 +184,4 @@ route[DOMAIN_FORMAT_CHECK] } -# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab +# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab \ No newline at end of file From 44c9206a8f8b1d78a0a736d3e04f221a010f6629 Mon Sep 17 00:00:00 2001 From: karl anderson Date: Thu, 28 Aug 2014 20:17:50 -0700 Subject: [PATCH 2/3] KAZOO-2870: pull request tweaks --- kamailio/default.cfg | 22 +++++++++++-------- kamailio/dispatcher-role.cfg | 15 ------------- kamailio/presence-role.cfg | 17 -------------- kamailio/registrar-role.cfg | 5 ++--- system/security/limits.d/kamailio.limits.conf | 17 ++++++++++++++ 5 files changed, 32 insertions(+), 44 deletions(-) create mode 100644 system/security/limits.d/kamailio.limits.conf diff --git a/kamailio/default.cfg b/kamailio/default.cfg index 760b270..ad5d5db 100644 --- a/kamailio/default.cfg +++ b/kamailio/default.cfg @@ -151,16 +151,21 @@ modparam("db_text", "db_mode", 1) loadmodule "db_kazoo.so" modparam("db_kazoo", "node_hostname", "MY_HOSTNAME") modparam("db_kazoo", "register_fs_path", "MY_IP_ADDRESS") -modparam("db_kazoo", "amqp_connection", "MY_AMQP_URL_1") -modparam("db_kazoo", "amqp_connection", "MY_AMQP_URL_2") -#modparam("db_kazoo", "amqp_connection", "MY_AMQP_URL_3") -#modparam("db_kazoo", "amqp_connection", "MY_AMQP_URL_4") -modparam("db_kazoo", "amqp_max_channels", AMQP_NUMBER_OF_CHANNELS) +modparam("db_kazoo", "amqp_connection", "MY_AMQP_URL") +#!ifdef MY_AMQP_URL_SECONDARY +modparam("db_kazoo", "amqp_connection", "MY_AMQP_URL_SECONDARY") +#!endif +#!ifdef MY_AMQP_URL_TERTIARY +#modparam("db_kazoo", "amqp_connection", "MY_AMQP_URL_TERTIARY") +#!endif +#!ifdef MY_AMQP_MAX_CHANNELS +modparam("db_kazoo", "amqp_max_channels", MY_AMQP_MAX_CHANNELS) +#!else +modparam("db_kazoo", "amqp_max_channels", 100) +#!endif modparam("db_kazoo", "amqp_internal_loop_count", 1); modparam("db_kazoo", "amqp_consumer_loop_count", 3); - - ####### Role Configurations ########## #!ifdef DISPATCHER-ROLE include_file "dispatcher-role.cfg" @@ -602,8 +607,7 @@ event_route[kazoo:mod-init] event_route[kazoo:consumer-event] { - xlog("L_INFO","REALLY!! you subscribed for something and you're not handling it ?"); - xlog("L_INFO","Payload : $kzE"); + xlog("L_INFO","unhandled AMQP event, payload: $kzE"); } diff --git a/kamailio/dispatcher-role.cfg b/kamailio/dispatcher-role.cfg index a3c1dfe..2b24f02 100644 --- a/kamailio/dispatcher-role.cfg +++ b/kamailio/dispatcher-role.cfg @@ -82,21 +82,6 @@ route[DISPATCHER_FIND_ROUTES] return; } } - } else { - ## query user channels - maybe we should this only to feature codes, *3... or * - $var(amqp_payload_request) = "{'Event-Category' : 'call_event' , 'Event-Name' : 'query_user_channels_req', 'Realm' : '" + $fd + "', 'Username' : '" + $fU + "', 'Active-Only' : false }"; - $var(amqp_routing_key) = "call.status_req.$(ci{kz.encode})"; - xlog("L_DBG", "$ci|log|amqp_payload_user_channels = $var(amqp_payload_request)"); - xlog("L_DBG", "$ci|log|amqp_payload_user_channels key = $var(amqp_routing_key)"); - if(kazoo_query("callevt", $var(amqp_routing_key), $var(amqp_payload_request), "$var(amqp_result)")) { - xlog("L_DBG", "$ci|log|amqp_result_user_channels = $var(amqp_result)"); - $du = $(var(amqp_result){kz.json,Channels[0].switch_url}); - if($du != $null) { - xlog("L_DBG", "$ci|log|user channels found redirecting call to $du, courtesy of kazoo"); - return; - } - } - } } diff --git a/kamailio/presence-role.cfg b/kamailio/presence-role.cfg index cd94e3a..f829929 100644 --- a/kamailio/presence-role.cfg +++ b/kamailio/presence-role.cfg @@ -49,7 +49,6 @@ route[HANDLE_SUBSCRIBE] $var(amqp_payload_request) = "{'Event-Category' : 'presence', 'Event-Name' : 'subscription', 'Event-Package' : '" + $hdr(event) + "', 'Expires' : " + $hdr(Expires) + ", 'Queue' : 'BLF-MY_HOSTNAME', 'Server-ID' : 'BLF-MY_HOSTNAME' ,'Contact' : '" + $var(fs_contact) + "', 'Call-ID' : '" + $ci + "', 'From' : '" + $fu +"', 'User' : '" + $tu + "', 'User-Agent' : '" + $ua + "' }"; - xlog("L_DBG", "$ci|log|amqp_presence = $var(amqp_payload_request)"); kazoo_publish("dialoginfo_subs", "dialoginfo_subs", $var(amqp_payload_request)); t_release(); @@ -75,23 +74,7 @@ route[HANDLE_PUBLISH] event_route[kazoo:consumer-event-presence-update] { - xlog("L_DBG","AMQP PRESENCE EVENT : $kzE"); - kazoo_pua_publish($kzE); - -# switch($(kzE{kz.json,Event-Package})) -# { -# case "message-summary": -# kazoo_pua_publish($kzE); -# break; -# case "dialog": -# xlog("L_INFO","kazoo is great.\n"); -# kazoo_pua_publish($kzE); -# break; -# default: -# xlog("L_INFO","unhandled event package $(kzE{kz.json,Event-Package})"); -# } - } # vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab diff --git a/kamailio/registrar-role.cfg b/kamailio/registrar-role.cfg index e43daf0..2006972 100644 --- a/kamailio/registrar-role.cfg +++ b/kamailio/registrar-role.cfg @@ -95,7 +95,7 @@ route[HANDLE_REGISTER] } } else { auth_challenge("$fd", "0"); - xlog("L_INFO", "$ci|end|issued new auth challenge to new registration attempt"); + xlog("L_INFO", "$ci|end|issued new auth challenge to registration attempt from $Au $si:$sp"); exit; } @@ -127,7 +127,6 @@ route[HANDLE_REGISTER] $var(amqp_routing_key) = "registration.success." + $(fd{kz.encode}) + "." + $fU; - xlog("L_DBG", "$ci|log|amqp_register_success = $var(amqp_payload_request)"); kazoo_publish("callmgr", $var(amqp_routing_key), $var(amqp_payload_request)); exit; @@ -184,4 +183,4 @@ route[DOMAIN_FORMAT_CHECK] } -# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab \ No newline at end of file +# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab diff --git a/system/security/limits.d/kamailio.limits.conf b/system/security/limits.d/kamailio.limits.conf new file mode 100644 index 0000000..93f4664 --- /dev/null +++ b/system/security/limits.d/kamailio.limits.conf @@ -0,0 +1,17 @@ +kamailio soft core unlimited +kamailio soft data unlimited +kamailio soft fsize unlimited +kamailio soft memlock unlimited +kamailio soft nofile 999999 +kamailio soft rss unlimited +kamailio hard stack 240 +kamailio soft cpu unlimited +kamailio soft nproc unlimited +kamailio soft as unlimited +kamailio soft priority -11 +kamailio soft locks unlimited +kamailio soft sigpending unlimited +kamailio soft msgqueue unlimited +kamailio soft nice -11 +kamailio soft nofile 65536 +kamailio hard nofile 65536 From 080214d8f89b525dd74dc7f3e29f30d4759fed3e Mon Sep 17 00:00:00 2001 From: karl anderson Date: Thu, 28 Aug 2014 20:18:41 -0700 Subject: [PATCH 3/3] KAZOO-2870: pull request tweaks --- kamailio/local.cfg | 5 ----- 1 file changed, 5 deletions(-) diff --git a/kamailio/local.cfg b/kamailio/local.cfg index 657ee0e..7a11ed1 100644 --- a/kamailio/local.cfg +++ b/kamailio/local.cfg @@ -33,11 +33,6 @@ debug = L_INFO ## This should be the primary RabbitMQ server ## in the zone that this server will service. #!substdef "!MY_AMQP_URL!kazoo://guest:guest@127.0.0.1:5672!g" -#!substdef "!MY_AMQP_URL_1!amqp://guest:guest@127.0.0.1:5672!g" -#!substdef "!MY_AMQP_URL_2!amqp://guest:guest@127.0.0.1:5672!g" -#!substdef "!MY_AMQP_URL_3!amqp://guest:guest@127.0.0.1:5672!g" -#!substdef "!MY_AMQP_URL_4!amqp://guest:guest@127.0.0.1:5672!g" -#!substdef "!MY_AMQP_NUMBER_OF_CHANNELS!100!g" ## This parameter is only required if you are using websockets ## This value must be present in the HTTP