summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--contrib/testpbx/Dockerfile25
-rw-r--r--contrib/testpbx/Makefile12
-rw-r--r--contrib/testpbx/README29
-rw-r--r--contrib/testpbx/configs/acl.conf.xml34
-rw-r--r--contrib/testpbx/configs/default.xml832
-rw-r--r--contrib/testpbx/configs/internal.xml422
-rw-r--r--contrib/testpbx/configs/public.xml68
-rw-r--r--contrib/testpbx/configs/switch.conf.xml181
-rw-r--r--contrib/testpbx/configs/vars.xml450
9 files changed, 2053 insertions, 0 deletions
diff --git a/contrib/testpbx/Dockerfile b/contrib/testpbx/Dockerfile
new file mode 100644
index 0000000..2f03424
--- /dev/null
+++ b/contrib/testpbx/Dockerfile
@@ -0,0 +1,25 @@
+FROM debian:jessie
+
+RUN apt-get update
+RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends wget
+
+# They use comodo.. it was hacked.. so don't bother trying to
+# install the right root certificates...
+RUN wget --no-check-certificate -O - https://files.freeswitch.org/repo/deb/debian/freeswitch_archive_g0.pub | apt-key add -
+RUN echo "deb http://files.freeswitch.org/repo/deb/freeswitch-1.6/ jessie main" > /etc/apt/sources.list.d/freeswitch.list
+RUN apt-get update && apt-get install -y freeswitch-meta-all
+
+
+# Change the config...
+COPY configs/vars.xml /etc/freeswitch/vars.xml
+COPY configs/acl.conf.xml /etc/freeswitch/autoload_configs/acl.conf.xml
+COPY configs/switch.conf.xml /etc/freeswitch/autoload_configs/switch.conf.xml
+COPY configs/public.xml /etc/freeswitch/dialplan/public.xml
+COPY configs/default.xml /etc/freeswitch/dialplan/default.xml
+COPY configs/internal.xml /etc/freeswitch/sip_profiles/internal.xml
+
+# Prepare to run
+# Reduce the number of ports.. as otherwise we wait a long time
+EXPOSE 6000-6020/udp
+EXPOSE 5060/udp
+CMD /usr/bin/freeswitch -nf
diff --git a/contrib/testpbx/Makefile b/contrib/testpbx/Makefile
new file mode 100644
index 0000000..ea34799
--- /dev/null
+++ b/contrib/testpbx/Makefile
@@ -0,0 +1,12 @@
+all: container
+
+container:
+ docker build -t osmo-freeswitch-pbx:latest .
+
+run:
+ docker run -it --name=osmo-freeswitch-pbx \
+ -p 5060:5060/udp -p 6000-6020:6000-6020/udp \
+ --rm=true osmo-freeswitch-pbx:latest
+
+stop:
+ docker rm -f osmo-freeswitch-pbx
diff --git a/contrib/testpbx/README b/contrib/testpbx/README
new file mode 100644
index 0000000..11c16f0
--- /dev/null
+++ b/contrib/testpbx/README
@@ -0,0 +1,29 @@
+Provide a semi-stable remote PBX system.
+
+There is no preferred PBX but YaTE is pretty small and still
+functional enough. Anyway Rhizomatica is using FreeSWITCH so
+let's use that for testing.
+
+This is creating a docker image with a SIP configuration that
+will allow to record audio, have a DTMF menu using some fixed
+numbers. Feel free to extend it to support bidirectional calls
+and routing.
+
+It is using the Debian packages and installs everything as I
+am not interested to track dependencies and see what is missing.
+Again feel free to optimize the size.
+
+
+Build:
+ make
+
+ or
+
+ docker build -t yourimagename:tag .
+
+
+Run:
+
+ docker run yourimagename:tag
+
+SIP is exposed on 5060 of your port and audio on 6000-6020
diff --git a/contrib/testpbx/configs/acl.conf.xml b/contrib/testpbx/configs/acl.conf.xml
new file mode 100644
index 0000000..70a64ea
--- /dev/null
+++ b/contrib/testpbx/configs/acl.conf.xml
@@ -0,0 +1,34 @@
+<configuration name="acl.conf" description="Network Lists">
+ <network-lists>
+ <!--
+ These ACL's are automatically created on startup.
+
+ rfc1918.auto - RFC1918 Space
+ nat.auto - RFC1918 Excluding your local lan.
+ localnet.auto - ACL for your local lan.
+ loopback.auto - ACL for your local lan.
+ -->
+
+ <list name="lan" default="allow">
+ <node type="allow" cidr="192.168.0.0/16"/>
+ </list>
+
+ <!--
+ This will traverse the directory adding all users
+ with the cidr= tag to this ACL, when this ACL matches
+ the users variables and params apply as if they
+ digest authenticated.
+ -->
+ <list name="domains" default="allow">
+ <!-- domain= is special it scans the domain from the directory to build the ACL -->
+ <node type="allow" domain="$${domain}"/>
+ <node type="allow" cidr="0.0.0.0/0"/>
+ <node type="allow" cidr="172.0.0.0/8"/>
+ <!-- use cidr= if you wish to allow ip ranges to this domains acl. -->
+ <!-- <node type="allow" cidr="192.168.0.0/24"/> -->
+ <node type="allow" cidr="192.168.0.0/16"/>
+ <node type="allow" cidr="10.0.0.0/16"/>
+ </list>
+
+ </network-lists>
+</configuration>
diff --git a/contrib/testpbx/configs/default.xml b/contrib/testpbx/configs/default.xml
new file mode 100644
index 0000000..f0e0af1
--- /dev/null
+++ b/contrib/testpbx/configs/default.xml
@@ -0,0 +1,832 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ NOTICE:
+
+ This context is usually accessed via authenticated callers on the sip profile on port 5060
+ or transfered callers from the public context which arrived via the sip profile on port 5080.
+
+ Authenticated users will use the user_context variable on the user to determine what context
+ they can access. You can also add a user in the directory with the cidr= attribute acl.conf.xml
+ will build the domains ACL using this value.
+-->
+<!-- http://wiki.freeswitch.org/wiki/Dialplan_XML -->
+<include>
+ <context name="default">
+
+ <extension name="unloop">
+ <condition field="${unroll_loops}" expression="^true$"/>
+ <condition field="${sip_looped_call}" expression="^true$">
+ <action application="deflect" data="${destination_number}"/>
+ </condition>
+ </extension>
+
+ <!-- Example of doing things based on time of day.
+
+ year = 4 digit year. Example year="2009"
+ yday = 1-365
+ mon = 1-12
+ mday = 1-31
+ week = 1-52
+ mweek= 1-6
+ wday = 1-7
+ hour = 0-23
+ minute = 0-59
+ minute-of-day = 1-1440
+
+ Example:
+ <condition minute-of-day="540-1080"> (9am to 6pm EVERY day)
+ do something ...
+ </condition>
+ -->
+ <extension name="tod_example" continue="true">
+ <condition wday="2-6" hour="9-18">
+ <action application="set" data="open=true"/>
+ </condition>
+ </extension>
+
+ <!-- Example of routing based on holidays
+
+ This example covers all US Federal holidays except for inauguration day.
+ -->
+
+ <extension name="holiday_example" continue="true">
+ <condition mday="1" mon="1">
+ <!-- new year's day -->
+ <action application="set" data="open=false"/>
+ </condition>
+ <condition wday="2" mweek="3" mon="1">
+ <!-- martin luther king day is the 3rd monday in january -->
+ <action application="set" data="open=false"/>
+ </condition>
+ <condition wday="2" mweek="3" mon="2">
+ <!-- president's day is the 3rd monday in february -->
+ <action application="set" data="open=false"/>
+ </condition>
+ <condition wday="2" mon="5" mday="25-31">
+ <!-- memorial day is the last monday in may (the only monday between the 25th and the 31st) -->
+ <action application="set" data="open=false"/>
+ </condition>
+ <condition mday="4" mon="7">
+ <!-- independence day -->
+ <action application="set" data="open=false"/>
+ </condition>
+ <condition wday="2" mday="1-7" mon="9">
+ <!-- labor day is the 1st monday in september (the only monday between the 1st and the 7th) -->
+ <action application="set" data="open=false"/>
+ </condition>
+ <condition wday="2" mweek="2" mon="10">
+ <!-- columbus day is the 2nd monday in october -->
+ <action application="set" data="open=false"/>
+ </condition>
+ <condition mday="11" mon="11">
+ <!-- veteran's day -->
+ <action application="set" data="open=false"/>
+ </condition>
+ <condition wday="5-6" mweek="4" mon="11">
+ <!-- thanksgiving is the 4th thursday in november and usually there's an extension for black friday -->
+ <action application="set" data="open=false"/>
+ </condition>
+ <condition mday="25" mon="12">
+ <!-- Christmas -->
+ <action application="set" data="open=false"/>
+ </condition>
+ </extension>
+
+ <extension name="global-intercept">
+ <condition field="destination_number" expression="^886$">
+ <action application="answer"/>
+ <action application="intercept" data="${hash(select/${domain_name}-last_dial_ext/global)}"/>
+ <action application="sleep" data="2000"/>
+ </condition>
+ </extension>
+
+ <extension name="group-intercept">
+ <condition field="destination_number" expression="^\*8$">
+ <action application="answer"/>
+ <action application="intercept" data="${hash(select/${domain_name}-last_dial_ext/${callgroup})}"/>
+ <action application="sleep" data="2000"/>
+ </condition>
+ </extension>
+
+ <extension name="intercept-ext">
+ <condition field="destination_number" expression="^\*\*(\d+)$">
+ <action application="answer"/>
+ <action application="intercept" data="${hash(select/${domain_name}-last_dial_ext/$1)}"/>
+ <action application="sleep" data="2000"/>
+ </condition>
+ </extension>
+
+ <extension name="redial">
+ <condition field="destination_number" expression="^(redial|870)$">
+ <action application="transfer" data="${hash(select/${domain_name}-last_dial/${caller_id_number})}"/>
+ </condition>
+ </extension>
+
+ <extension name="global" continue="true">
+ <condition field="${call_debug}" expression="^true$" break="never">
+ <action application="info"/>
+ </condition>
+
+ <condition field="${default_password}" expression="^1234$" break="never">
+ <action application="log" data="CRIT WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING "/>
+ <action application="log" data="CRIT Open $${conf_dir}/vars.xml and change the default_password."/>
+ <action application="log" data="CRIT Once changed type 'reloadxml' at the console."/>
+ <action application="log" data="CRIT WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING "/>
+ <!-- <action application="sleep" data="10000"/> -->
+ </condition>
+ <!--
+ This is an example of how to auto detect if telephone-event is missing and activate inband detection
+ -->
+ <!--
+ <condition field="${switch_r_sdp}" expression="a=rtpmap:(\d+)\stelephone-event/8000" break="never">
+ <action application="set" data="rtp_payload_number=$1"/>
+ <anti-action application="start_dtmf"/>
+ </condition>
+ -->
+ <condition field="${rtp_has_crypto}" expression="^($${rtp_sdes_suites})$" break="never">
+ <action application="set" data="rtp_secure_media=true"/>
+ <!-- Offer SRTP on outbound legs if we have it on inbound. -->
+ <!-- <action application="export" data="rtp_secure_media=true"/> -->
+ </condition>
+
+ <!--
+ Since we have inbound-late-negotation on by default now the
+ above behavior isn't the same so you have to do one extra step.
+ -->
+ <condition field="${endpoint_disposition}" expression="^(DELAYED NEGOTIATION)"/>
+ <condition field="${switch_r_sdp}" expression="(AES_CM_128_HMAC_SHA1_32|AES_CM_128_HMAC_SHA1_80)" break="never">
+ <action application="set" data="rtp_secure_media=true"/>
+ <!-- Offer SRTP on outbound legs if we have it on inbound. -->
+ <!-- <action application="export" data="rtp_secure_media=true"/> -->
+ </condition>
+
+
+ <condition>
+ <action application="hash" data="insert/${domain_name}-spymap/${caller_id_number}/${uuid}"/>
+ <action application="hash" data="insert/${domain_name}-last_dial/${caller_id_number}/${destination_number}"/>
+ <action application="hash" data="insert/${domain_name}-last_dial/global/${uuid}"/>
+ <action application="export" data="RFC2822_DATE=${strftime(%a, %d %b %Y %T %z)}"/>
+ </condition>
+ </extension>
+
+ <!-- If sip_req_host is not a local domain then this has to be an external sip uri -->
+ <!--
+ <extension name="external_sip_uri" continue="true">
+ <condition field="source" expression="mod_sofia"/>
+ <condition field="${outside_call}" expression="^$"/>
+ <condition field="${domain_exists(${sip_req_host})}" expression="true">
+ <anti-action application="bridge" data="sofia/${use_profile}/${sip_to_uri}"/>
+ </condition>
+ </extension>
+ -->
+ <!--
+ Snom button demo, call 9000 to make button 2 mapped to transfer the current call to a conference
+ -->
+
+ <extension name="snom-demo-2">
+ <condition field="destination_number" expression="^9001$">
+ <action application="eval" data="${snom_bind_key(2 off DND ${sip_from_user} ${sip_from_host} ${sofia_profile_name} message notused)}"/>
+ <action application="transfer" data="3000"/>
+ </condition>
+ </extension>
+
+ <extension name="snom-demo-1">
+ <condition field="destination_number" expression="^9000$">
+ <!--<key> <light> <label> <user> <host> <profile> <action_name> <action>-->
+ <action application="eval" data="${snom_bind_key(2 on DND ${sip_from_user} ${sip_from_host} ${sofia_profile_name} message api+uuid_transfer ${uuid} 9001)}"/>
+ <action application="playback" data="$${hold_music}"/>
+ </condition>
+ </extension>
+
+ <extension name="eavesdrop">
+ <condition field="destination_number" expression="^88(\d{4})$|^\*0(.*)$">
+ <action application="answer"/>
+ <action application="eavesdrop" data="${hash(select/${domain_name}-spymap/$1$2)}"/>
+ </condition>
+ </extension>
+
+ <extension name="eavesdrop">
+ <condition field="destination_number" expression="^779$">
+ <action application="answer"/>
+ <action application="set" data="eavesdrop_indicate_failed=tone_stream://%(500, 0, 320)"/>
+ <action application="set" data="eavesdrop_indicate_new=tone_stream://%(500, 0, 620)"/>
+ <action application="set" data="eavesdrop_indicate_idle=tone_stream://%(250, 0, 920)"/>
+ <action application="eavesdrop" data="all"/>
+ </condition>
+ </extension>
+
+ <extension name="call_return">
+ <condition field="destination_number" expression="^\*69$|^869$|^lcr$">
+ <action application="transfer" data="${hash(select/${domain_name}-call_return/${caller_id_number})}"/>
+ </condition>
+ </extension>
+
+ <extension name="del-group">
+ <condition field="destination_number" expression="^80(\d{2})$">
+ <action application="answer"/>
+ <action application="group" data="delete:$1@${domain_name}:${sofia_contact(${sip_from_user}@${domain_name})}"/>
+ <action application="gentones" data="%(1000, 0, 320)"/>
+ </condition>
+ </extension>
+
+ <extension name="add-group">
+ <condition field="destination_number" expression="^81(\d{2})$">
+ <action application="answer"/>
+ <action application="group" data="insert:$1@${domain_name}:${sofia_contact(${sip_from_user}@${domain_name})}"/>
+ <action application="gentones" data="%(1000, 0, 640)"/>
+ </condition>
+ </extension>
+
+ <extension name="call-group-simo">
+ <condition field="destination_number" expression="^82(\d{2})$">
+ <action application="bridge" data="{leg_timeout=15,ignore_early_media=true}${group(call:$1@${domain_name})}"/>
+ </condition>
+ </extension>
+
+ <extension name="call-group-order">
+ <condition field="destination_number" expression="^83(\d{2})$">
+ <action application="bridge" data="{leg_timeout=15,ignore_early_media=true}${group(call:$1@${domain_name}:order)}"/>
+ </condition>
+ </extension>
+
+ <extension name="extension-intercom">
+ <condition field="destination_number" expression="^8(10[01][0-9])$">
+ <action application="set" data="dialed_extension=$1"/>
+ <action application="export" data="sip_auto_answer=true"/>
+ <action application="bridge" data="user/${dialed_extension}@${domain_name}"/>
+ </condition>
+ </extension>
+
+ <!--
+ dial the extension (1000-1019) for 30 seconds and go to voicemail if the
+ call fails (continue_on_fail=true), otherwise hang up after a successful
+ bridge (hangup_after_bridge=true)
+ -->
+ <extension name="Local_Extension">
+ <condition field="destination_number" expression="^(10[01][0-9])$">
+ <action application="export" data="dialed_extension=$1"/>
+ <!-- bind_meta_app can have these args <key> [a|b|ab] [a|b|o|s] <app> -->
+ <action application="bind_meta_app" data="1 b s execute_extension::dx XML features"/>
+ <action application="bind_meta_app" data="2 b s record_session::$${recordings_dir}/${caller_id_number}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/>
+ <action application="bind_meta_app" data="3 b s execute_extension::cf XML features"/>
+ <action application="bind_meta_app" data="4 b s execute_extension::att_xfer XML features"/>
+ <action application="set" data="ringback=${us-ring}"/>
+ <action application="set" data="transfer_ringback=$${hold_music}"/>
+ <action application="set" data="call_timeout=30"/>
+ <!-- <action application="set" data="sip_exclude_contact=${network_addr}"/> -->
+ <action application="set" data="hangup_after_bridge=true"/>
+ <!--<action application="set" data="continue_on_fail=NORMAL_TEMPORARY_FAILURE,USER_BUSY,NO_ANSWER,TIMEOUT,NO_ROUTE_DESTINATION"/> -->
+ <action application="set" data="continue_on_fail=true"/>
+ <action application="hash" data="insert/${domain_name}-call_return/${dialed_extension}/${caller_id_number}"/>
+ <action application="hash" data="insert/${domain_name}-last_dial_ext/${dialed_extension}/${uuid}"/>
+ <action application="set" data="called_party_callgroup=${user_data(${dialed_extension}@${domain_name} var callgroup)}"/>
+ <action application="hash" data="insert/${domain_name}-last_dial_ext/${called_party_callgroup}/${uuid}"/>
+ <action application="hash" data="insert/${domain_name}-last_dial_ext/global/${uuid}"/>
+ <!--<action application="export" data="nolocal:rtp_secure_media=${user_data(${dialed_extension}@${domain_name} var rtp_secure_media)}"/>-->
+ <action application="hash" data="insert/${domain_name}-last_dial/${called_party_callgroup}/${uuid}"/>
+ <action application="bridge" data="user/${dialed_extension}@${domain_name}"/>
+ <action application="answer"/>
+ <action application="sleep" data="1000"/>
+ <action application="bridge" data="loopback/app=voicemail:default ${domain_name} ${dialed_extension}"/>
+ </condition>
+ </extension>
+
+ <extension name="Local_Extension_Skinny">
+ <condition field="destination_number" expression="^(11[01][0-9])$">
+ <action application="set" data="dialed_extension=$1"/>
+ <action application="export" data="dialed_extension=$1"/>
+ <action application="set" data="call_timeout=30"/>
+ <action application="set" data="hangup_after_bridge=true"/>
+ <action application="set" data="continue_on_fail=true"/>
+ <action application="bridge" data="skinny/internal/${destination_number}"/>
+ <action application="answer"/>
+ <action application="sleep" data="1000"/>
+ <action application="bridge" data="loopback/app=voicemail:default ${domain_name} ${dialed_extension}"/>
+ </condition>
+ </extension>
+
+ <extension name="group_dial_sales">
+ <condition field="destination_number" expression="^2000$">
+ <action application="bridge" data="${group_call(sales@${domain_name})}"/>
+ </condition>
+ </extension>
+
+ <extension name="group_dial_support">
+ <condition field="destination_number" expression="^2001$">
+ <action application="bridge" data="group/support@${domain_name}"/>
+ </condition>
+ </extension>
+
+ <extension name="group_dial_billing">
+ <condition field="destination_number" expression="^2002$">
+ <action application="bridge" data="group/billing@${domain_name}"/>
+ </condition>
+ </extension>
+
+ <!-- voicemail operator extension -->
+ <extension name="operator">
+ <condition field="destination_number" expression="^(operator|0)$">
+ <action application="set" data="transfer_ringback=$${hold_music}"/>
+ <action application="transfer" data="1000 XML features"/>
+ </condition>
+ </extension>
+
+ <!-- voicemail main extension -->
+ <extension name="vmain">
+ <condition field="destination_number" expression="^vmain$|^4000$|^\*98$">
+ <action application="answer"/>
+ <action application="sleep" data="1000"/>
+ <action application="voicemail" data="check default ${domain_name}"/>
+ </condition>
+ </extension>
+
+ <!--
+ This extension is used by mod_portaudio so you can pa call sip:someone@example.com
+ mod_portaudio will pass the entire string to the dialplan for routing.
+ -->
+ <extension name="sip_uri">
+ <condition field="destination_number" expression="^sip:(.*)$">
+ <action application="bridge" data="sofia/${use_profile}/$1"/>
+ </condition>
+ </extension>
+
+ <!--
+ start a dynamic conference with the settings of the "default" conference profile in conference.conf.xml
+ -->
+ <extension name="nb_conferences">
+ <condition field="destination_number" expression="^(30\d{2})$">
+ <action application="answer"/>
+ <action application="conference" data="$1-${domain_name}@default"/>
+ </condition>
+ </extension>
+
+ <extension name="wb_conferences">
+ <condition field="destination_number" expression="^(31\d{2})$">
+ <action application="answer"/>
+ <action application="conference" data="$1-${domain_name}@wideband"/>
+ </condition>
+ </extension>
+
+ <extension name="uwb_conferences">
+ <condition field="destination_number" expression="^(32\d{2})$">
+ <action application="answer"/>
+ <action application="conference" data="$1-${domain_name}@ultrawideband"/>
+ </condition>
+ </extension>
+ <!-- MONO 48kHz conferences -->
+ <extension name="cdquality_conferences">
+ <condition field="destination_number" expression="^(33\d{2})$">
+ <action application="answer"/>
+ <action application="conference" data="$1-${domain_name}@cdquality"/>
+ </condition>
+ </extension>
+
+ <!-- STEREO 48kHz conferences / Video MCU -->
+ <extension name="cdquality_stereo_conferences">
+ <condition field="destination_number" expression="^(35\d{2}).*?-screen$">
+ <action application="answer"/>
+ <action application="send_display" data="FreeSWITCH Conference|$1"/>
+ <action application="set" data="conference_member_flags=join-vid-floor"/>
+ <action application="conference" data="$1-${domain_name}@video-mcu-stereo"/>
+ </condition>
+ </extension>
+
+ <extension name="conference-canvases" continue="true">
+ <condition field="destination_number" expression="(35\d{2})-canvas-(\d+)">
+ <action application="push" data="conference_member_flags=second-screen"/>
+ <action application="set" data="video_initial_watching_canvas=$2"/>
+ <action application="transfer" data="$1"/>
+ </condition>
+ </extension>
+
+ <extension name="conf mod">
+ <condition field="destination_number" expression="^6070-moderator$">
+ <action application="answer"/>
+ <action application="set" data="conference_member_flags=moderator"/>
+ <action application="conference" data="$1-${domain_name}@video-mcu-stereo"/>
+ </condition>
+ </extension>
+
+ <extension name="cdquality_conferences">
+ <condition field="destination_number" expression="^(35\d{2})$">
+ <action application="answer"/>
+ <action application="conference" data="$1-${domain_name}@video-mcu-stereo"/>
+ </condition>
+ </extension>
+
+ <!-- dial the FreeSWITCH conference via SIP-->
+ <extension name="freeswitch_public_conf_via_sip">
+ <condition field="destination_number" expression="^9(888|8888|1616|3232)$">
+ <action application="export" data="hold_music=silence"/>
+ <!--
+ This will take the SAS from the b-leg and send it to the display on the a-leg phone.
+ Known working with Polycom and Snom maybe others.
+ -->
+ <!--
+ <action application="set" data="exec_after_bridge_app=${sched_api(+4 zrtp expand uuid_display ${uuid} \${uuid_getvar(\${uuid_getvar(${uuid} signal_bond)} zrtp_sas1_string )} \${uuid_getvar(\${uuid_getvar(${uuid} signal_bond)} zrtp_sas2_string )} )}"/>
+ <action application="export" data="nolocal:zrtp_secure_media=true"/>
+ -->
+ <action application="bridge" data="sofia/${use_profile}/$1@conference.freeswitch.org"/>
+ </condition>
+ </extension>
+
+ <!--
+ This extension will start a conference and invite a group.
+ At anytime the participant can dial *2 to bridge directly to the boss.
+ All other callers are then hung up on.
+ -->
+ <extension name="mad_boss_intercom">
+ <condition field="destination_number" expression="^0911$">
+ <action application="set" data="conference_auto_outcall_caller_id_name=Mad Boss1"/>
+ <action application="set" data="conference_auto_outcall_caller_id_number=0911"/>
+ <action application="set" data="conference_auto_outcall_timeout=60"/>
+ <action application="set" data="conference_auto_outcall_flags=mute"/>
+ <action application="set" data="conference_auto_outcall_prefix={sip_auto_answer=true,execute_on_answer='bind_meta_app 2 a s1 transfer::intercept:${uuid} inline'}"/>
+ <action application="set" data="sip_exclude_contact=${network_addr}"/>
+ <action application="conference_set_auto_outcall" data="${group_call(sales)}"/>
+ <action application="conference" data="madboss_intercom1@default+flags{endconf|deaf}"/>
+ </condition>
+ </extension>
+
+ <!--
+ This extension will start a conference and invite a few of people.
+ At anytime the participant can dial *2 to bridge directly to the boss.
+ All other callers are then hung up on.
+ -->
+ <extension name="mad_boss_intercom">
+ <condition field="destination_number" expression="^0912$">
+ <action application="set" data="conference_auto_outcall_caller_id_name=Mad Boss2"/>
+ <action application="set" data="conference_auto_outcall_caller_id_number=0912"/>
+ <action application="set" data="conference_auto_outcall_timeout=60"/>
+ <action application="set" data="conference_auto_outcall_flags=mute"/>
+ <action application="set" data="conference_auto_outcall_prefix={sip_auto_answer=true,execute_on_answer='bind_meta_app 2 a s1 transfer::intercept:${uuid} inline'}"/>
+ <action application="set" data="sip_exclude_contact=${network_addr}"/>
+ <action application="conference_set_auto_outcall" data="loopback/9664"/>
+ <action application="conference" data="madboss_intercom2@default+flags{endconf|deaf}"/>
+ </condition>
+ </extension>
+
+ <!--This extension will start a conference and invite several people upon entering -->
+ <extension name="mad_boss">
+ <condition field="destination_number" expression="^0913$">
+ <!--These params effect the outcalls made once you join-->
+ <action application="set" data="conference_auto_outcall_caller_id_name=Mad Boss"/>
+ <action application="set" data="conference_auto_outcall_caller_id_number=0911"/>
+ <action application="set" data="conference_auto_outcall_timeout=60"/>
+ <action application="set" data="conference_auto_outcall_flags=none"/>
+ <!--<action application="set" data="conference_auto_outcall_announce=say:You have been called into an emergency conference"/>-->
+ <!--Add as many of these as you need, These are the people you are going to call-->
+ <action application="conference_set_auto_outcall" data="loopback/9664"/>
+ <action application="conference" data="madboss3@default"/>
+ </condition>
+ </extension>
+
+ <!-- a sample IVR -->
+ <extension name="ivr_demo">
+ <condition field="destination_number" expression="^5000$">
+ <action application="answer"/>
+ <action application="sleep" data="2000"/>
+ <action application="ivr" data="demo_ivr"/>
+ </condition>
+ </extension>
+
+ <!-- Create a conference on the fly and pull someone in at the same time. -->
+ <extension name="dynamic_conference">
+ <condition field="destination_number" expression="^5001$">
+ <action application="conference" data="bridge:mydynaconf:sofia/${use_profile}/1234@conference.freeswitch.org"/>
+ </condition>
+ </extension>
+
+ <extension name="rtp_multicast_page">
+ <condition field="destination_number" expression="^pagegroup$|^7243$">
+ <action application="answer"/>
+ <action application="esf_page_group"/>
+ </condition>
+ </extension>
+
+ <!--
+ Parking extensions... transferring calls to 5900 will park them in a queue.
+ -->
+ <extension name="park">
+ <condition field="destination_number" expression="^5900$">
+ <action application="set" data="fifo_music=$${hold_music}"/>
+ <action application="fifo" data="5900@${domain_name} in"/>
+ </condition>
+ </extension>
+
+ <!--
+ Parking pickup extension. Calling 5901 will pickup the call.
+ -->
+ <extension name="unpark">
+ <condition field="destination_number" expression="^5901$">
+ <action application="answer"/>
+ <action application="fifo" data="5900@${domain_name} out nowait"/>
+ </condition>
+ </extension>
+
+ <!--
+ Valet park retrieval, works with valet_park extension below.
+ Retrieve a valet parked call by dialing 6000 + park number + #
+ -->
+ <extension name="valet_park">
+ <condition field="destination_number" expression="^(6000)$">
+ <action application="answer"/>
+ <action application="valet_park" data="valet_parking_lot ask 1 11 10000 ivr/ivr-enter_ext_pound.wav"/>
+ </condition>
+ </extension>
+
+ <!--
+ Valet park 6001-6099. Blind x-fer to 6001, 6002, etc. to valet park the call.
+ Dial 6001, 6002, etc. to retrieve a call that is already valet parked.
+ After call is retrieved, park extension is free for another call.
+ -->
+ <extension name="valet_park">
+ <condition field="destination_number" expression="^((?!6000)60\d{2})$">
+ <action application="answer"/>
+ <action application="valet_park" data="valet_parking_lot $1"/>
+ </condition>
+ </extension>
+
+
+ <!--
+ This extension is used with Snom phones.
+
+ Set a function key to park+lot (lot being a number or name.)
+ Set type to Park+Orbit. You can then park and pickup using
+ the softkey on the phone. Should work with other phones.
+ -->
+ <extension name="park">
+ <condition field="source" expression="mod_sofia"/>
+ <condition field="destination_number" expression="park\+(\d+)">
+ <action application="fifo" data="$1@${domain_name} in undef $${hold_music}"/>
+ </condition>
+ </extension>
+ <!--
+ The extension is parking pickup with a to param of the fifo we are calling
+ Some phones send things like orbit= and you can extract that info.
+ -->
+ <extension name="unpark">
+ <condition field="source" expression="mod_sofia"/>
+ <condition field="destination_number" expression="^parking$"/>
+ <condition field="${sip_to_params}" expression="fifo\=(\d+)">
+ <action application="answer"/>
+ <action application="fifo" data="$1@${domain_name} out nowait"/>
+ </condition>
+ </extension>
+
+ <!--
+ This extension is used with Linksys phones.
+
+ Set a Phone tab option Call Park Serv to yes. You can park and
+ pickup using soft keys "park" and "unpark" found during
+ active call when moving navigation button. The other option
+ is to use phone's star codes (defaults to *38 and *39).
+ -->
+ <extension name="park">
+ <condition field="source" expression="mod_sofia"/>
+ <condition field="destination_number" expression="callpark"/>
+ <condition field="${sip_refer_to}">
+ <expression><![CDATA[<sip:callpark@${domain_name};orbit=(\d+)>]]></expression>
+ <action application="fifo" data="$1@${domain_name} in undef $${hold_music}"/>
+ </condition>
+ </extension>
+
+ <!--
+ This extension is used with Linksys phones.
+
+ The extension is parking pickup with a to param of the fifo
+ we are calling. Linksys sends orbit=<parkingslotnumber>
+ and we extract that info.
+ -->
+ <extension name="unpark">
+ <condition field="source" expression="mod_sofia"/>
+ <condition field="destination_number" expression="pickup"/>
+ <condition field="${sip_to_params}" expression="orbit\=(\d+)">
+ <action application="answer"/>
+ <action application="fifo" data="$1@${domain_name} out nowait"/>
+ </condition>
+ </extension>
+
+ <!--
+ Here are some examples of how to override the ringback heard by the
+ far end. You have two variables that you can use to override this.
+
+ ringback - used when a call isn't answered. (early media)
+ transfer_ringback - used when the call is already answered. (post answer)
+ -->
+
+ <!-- Demonstration of how to override the ringback in various situations -->
+ <extension name="wait">
+ <condition field="destination_number" expression="^wait$">
+ <action application="pre_answer"/>
+ <action application="sleep" data="20000"/>
+ <action application="answer"/>
+ <action application="sleep" data="1000"/>
+ <action application="playback" data="voicemail/vm-goodbye.wav"/>
+ <action application="hangup"/>
+ </condition>
+ </extension>
+
+ <extension name="fax_receive">
+ <condition field="destination_number" expression="^9178$">
+ <action application="answer" />
+ <action application="playback" data="silence_stream://2000"/>
+ <action application="rxfax" data="$${temp_dir}/rxfax.tif"/>
+ <action application="hangup"/>
+ </condition>
+ </extension>
+
+ <extension name="fax_transmit">
+ <condition field="destination_number" expression="^9179$">
+ <action application="txfax" data="$${temp_dir}/txfax.tif"/>
+ <action application="hangup"/>
+ </condition>
+ </extension>
+
+ <!-- Send a 180 and let the far end generate ringback. -->
+ <extension name="ringback_180">
+ <condition field="destination_number" expression="^9180$">
+ <action application="ring_ready"/>
+ <action application="sleep" data="20000"/>
+ <action application="answer"/>
+ <action application="sleep" data="1000"/>
+ <action application="playback" data="voicemail/vm-goodbye.wav"/>
+ <action application="hangup"/>
+ </condition>
+ </extension>
+
+ <!-- Send a 183 and send uk-ring as the ringtone. (early media) -->
+ <extension name="ringback_183_uk_ring">
+ <condition field="destination_number" expression="^9181$">
+ <action application="set" data="ringback=$${uk-ring}"/>
+ <action application="bridge" data="{ignore_early_media=true}loopback/wait"/>
+ </condition>
+ </extension>
+
+ <!-- Send a 183 and use music as the ringtone. (early media) -->
+ <extension name="ringback_183_music_ring">
+ <condition field="destination_number" expression="^9182$">
+ <action application="set" data="ringback=$${hold_music}"/>
+ <action application="bridge" data="{ignore_early_media=true}loopback/wait"/>
+ </condition>
+ </extension>
+
+ <!-- Answer the call and use music as the ringtone. (post answer) -->
+ <extension name="ringback_post_answer_uk_ring">
+ <condition field="destination_number" expression="^9183$">
+ <action application="set" data="transfer_ringback=$${uk-ring}"/>
+ <action application="answer"/>
+ <action application="bridge" data="{ignore_early_media=true}loopback/wait"/>
+ </condition>
+ </extension>
+
+ <!-- Answer the call and use music as the ringtone. (post answer) -->
+ <extension name="ringback_post_answer_music">
+ <condition field="destination_number" expression="^9184$">
+ <action application="set" data="transfer_ringback=$${hold_music}"/>
+ <action application="answer"/>
+ <action application="bridge" data="{ignore_early_media=true}loopback/wait"/>
+ </condition>
+ </extension>
+
+ <extension name="ClueCon">
+ <condition field="destination_number" expression="^9191$">
+ <action application="set" data="effective_caller_id_name=ClueCon IVR"/>
+ <action application="bridge" data="sofia/$${domain}/2000@bkw.org"/>
+ </condition>
+ </extension>
+
+ <extension name="show_info">
+ <condition field="destination_number" expression="^9192$">
+ <action application="answer"/>
+ <action application="info"/>
+ <action application="sleep" data="250"/>
+ <action application="hangup"/>
+ </condition>
+ </extension>
+
+ <extension name="video_record">
+ <condition field="destination_number" expression="^9193$">
+ <action application="answer"/>
+ <action application="record_fsv" data="$${temp_dir}/testrecord.fsv"/>
+ </condition>
+ </extension>
+
+ <extension name="video_playback">
+ <condition field="destination_number" expression="^9194$">
+ <action application="answer"/>
+ <action application="play_fsv" data="$${temp_dir}/testrecord.fsv"/>
+ </condition>
+ </extension>
+
+ <extension name="delay_echo">
+ <condition field="destination_number" expression="^9195$">
+ <action application="answer"/>
+ <action application="delay_echo" data="5000"/>
+ </condition>
+ </extension>
+
+ <extension name="echo">
+ <condition field="destination_number" expression="^9196$">
+ <action application="answer"/>
+ <action application="echo"/>
+ </condition>
+ </extension>
+
+ <extension name="milliwatt">
+ <condition field="destination_number" expression="^9197$">
+ <action application="answer"/>
+ <action application="playback" data="{loops=-1}tone_stream://%(251,0,1004)"/>
+ </condition>
+ </extension>
+
+ <extension name="tone_stream">
+ <condition field="destination_number" expression="^9198$">
+ <action application="answer"/>
+ <action application="playback" data="{loops=10}tone_stream://path=${conf_dir}/tetris.ttml"/>
+ </condition>
+ </extension>
+
+ <!-- install zrtp_agent.lua into scripts (ZRTP == 9787) -->
+ <extension name="zrtp_enrollement">
+ <condition field="destination_number" expression="^9787$">
+ <action application="lua" data="zrtp_agent.lua"/>
+ </condition>
+ </extension>
+
+ <!--
+ You will no longer hear the bong tone. The wav file is playing stating the call is secure.
+ The file will not play unless you have both TLS and SRTP active.
+ -->
+
+ <extension name="hold_music">
+ <condition field="destination_number" expression="^9664$"/>
+ <condition field="${rtp_has_crypto}" expression="^(AES_CM_128_HMAC_SHA1_32|AES_CM_128_HMAC_SHA1_80)$">
+ <action application="answer"/>
+ <action application="execute_extension" data="is_secure XML features"/>
+ <action application="playback" data="$${hold_music}"/>
+ <anti-action application="set" data="zrtp_secure_media=true"/>
+ <anti-action application="answer"/>
+ <anti-action application="playback" data="silence_stream://2000"/>
+ <anti-action application="execute_extension" data="is_zrtp_secure XML features"/>
+ <anti-action application="playback" data="$${hold_music}"/>
+ </condition>
+ </extension>
+
+ <extension name="laugh break">
+ <condition field="destination_number" expression="^9386$">
+ <action application="answer"/>
+ <action application="sleep" data="1500"/>
+ <action application="playback" data="phrase:funny_prompts"/>
+ <action application="hangup"/>
+ </condition>
+ </extension>
+
+ <!--
+ You can place files in the default directory to get included.
+ -->
+ <X-PRE-PROCESS cmd="include" data="default/*.xml"/>
+
+ <!--
+ <extension name="refer">
+ <condition field="${sip_refer_to}">
+ <expression><![CDATA[<sip:${destination_number}@${domain_name}>]]></expression>
+ </condition>
+ <condition field="${sip_refer_to}">
+ <expression><![CDATA[<sip:(.*)@(.*)>]]></expression>
+ <action application="set" data="refer_user=$1"/>
+ <action application="set" data="refer_domain=$2"/>
+ <action application="info"/>
+ <action application="bridge" data="sofia/${use_profile}/${refer_user}@${refer_domain}"/>
+ </condition>
+ </extension>
+ -->
+ <!--
+ This is an example of how to override the RURI on an outgoing invite to a registered contact.
+ -->
+ <!--
+ <extension name="ruri">
+ <condition field="destination_number" expression="^ruri$">
+ <action application="bridge" data="sofia/${ruri_profile}/${ruri_user}${regex(${sofia_contact(${ruri_contact})}|^[^\@]+(.*)|%1)}"/>
+ </condition>
+ </extension>
+
+ <extension name="7004">
+ <condition field="destination_number" expression="^7004$">
+ <action application="set" data="ruri_profile=default"/>
+ <action application="set" data="ruri_user=2000"/>
+ <action application="set" data="ruri_contact=1001@${domain_name}"/>
+ <action application="execute_extension" data="ruri"/>
+ </condition>
+ </extension>
+ -->
+
+ <extension name="enum">
+ <condition field="${module_exists(mod_enum)}" expression="true"/>
+ <condition field="destination_number" expression="^(.*)$">
+ <action application="transfer" data="$1 enum"/>
+ </condition>
+ </extension>
+
+ </context>
+</include>
diff --git a/contrib/testpbx/configs/internal.xml b/contrib/testpbx/configs/internal.xml
new file mode 100644
index 0000000..2a679fb
--- /dev/null
+++ b/contrib/testpbx/configs/internal.xml
@@ -0,0 +1,422 @@
+<profile name="internal">
+ <!--
+ This is a sofia sip profile/user agent. This will service exactly one ip and port.
+ In FreeSWITCH you can run multiple sip user agents on their own ip and port.
+
+ When you hear someone say "sofia profile" this is what they are talking about.
+ -->
+
+ <!-- http://wiki.freeswitch.org/wiki/Sofia_Configuration_Files -->
+ <!--aliases are other names that will work as a valid profile name for this profile-->
+ <aliases>
+ <!--
+ <alias name="default"/>
+ -->
+ </aliases>
+ <!-- Outbound Registrations -->
+ <gateways>
+ </gateways>
+
+ <domains>
+ <!-- indicator to parse the directory for domains with parse="true" to get gateways-->
+ <domain name="$${domain}" parse="true"/>
+ <!-- indicator to parse the directory for domains with parse="true" to get gateways and alias every domain to this profile -->
+ <!--<domain name="all" alias="true" parse="true"/>-->
+ <domain name="all" alias="true" parse="false"/>
+ </domains>
+
+ <settings>
+
+
+ <!-- inject delay between dtmf digits on send to help some slow interpreters (also per channel with rtp_digit_delay var -->
+ <!-- <param name="rtp-digit-delay" value="40"/>-->
+
+ <!--
+ When calls are in no media this will bring them back to media
+ when you press the hold button.
+ -->
+ <!--<param name="media-option" value="resume-media-on-hold"/> -->
+
+ <!--
+ This will allow a call after an attended transfer go back to
+ bypass media after an attended transfer.
+ -->
+ <!--<param name="media-option" value="bypass-media-after-att-xfer"/>-->
+
+ <!-- Can be set to "_undef_" to remove the User-Agent header -->
+ <!-- <param name="user-agent-string" value="FreeSWITCH Rocks!"/> -->
+
+ <param name="debug" value="0"/>
+ <!-- If you want FreeSWITCH to shutdown if this profile fails to load, uncomment the next line. -->
+ <!-- <param name="shutdown-on-fail" value="true"/> -->
+ <param name="sip-trace" value="no"/>
+ <param name="sip-capture" value="no"/>
+
+ <!-- Use presence_map.conf.xml to convert extension regex to presence protos for routing -->
+ <!-- <param name="presence-proto-lookup" value="true"/> -->
+
+
+ <!-- Don't be picky about negotiated DTMF just always offer 2833 and accept both 2833 and INFO -->
+ <!--<param name="liberal-dtmf" value="true"/>-->
+
+
+ <!--
+ Sometimes, in extremely rare edge cases, the Sofia SIP stack may stop
+ responding. These options allow you to enable and control a watchdog
+ on the Sofia SIP stack so that if it stops responding for the
+ specified number of milliseconds, it will cause FreeSWITCH to crash
+ immediately. This is useful if you run in an HA environment and
+ need to ensure automated recovery from such a condition. Note that if
+ your server is idle a lot, the watchdog may fire due to not receiving
+ any SIP messages. Thus, if you expect your system to be idle, you
+ should leave the watchdog disabled. It can be toggled on and off
+ through the FreeSWITCH CLI either on an individual profile basis or
+ globally for all profiles. So, if you run in an HA environment with a
+ master and slave, you should use the CLI to make sure the watchdog is
+ only enabled on the master.
+ If such crash occurs, FreeSWITCH will dump core if allowed. The
+ stacktrace will include function watchdog_triggered_abort().
+ -->
+ <param name="watchdog-enabled" value="no"/>
+ <param name="watchdog-step-timeout" value="30000"/>
+ <param name="watchdog-event-timeout" value="30000"/>
+
+ <param name="log-auth-failures" value="false"/>
+ <param name="forward-unsolicited-mwi-notify" value="false"/>
+
+ <param name="context" value="public"/>
+ <param name="rfc2833-pt" value="101"/>
+ <!-- port to bind to for sip traffic -->
+ <param name="sip-port" value="$${internal_sip_port}"/>
+ <param name="dialplan" value="XML"/>
+ <param name="dtmf-duration" value="2000"/>
+ <param name="inbound-codec-prefs" value="$${global_codec_prefs}"/>
+ <param name="outbound-codec-prefs" value="$${global_codec_prefs}"/>
+ <param name="rtp-timer-name" value="soft"/>
+ <!-- ip address to use for rtp, DO NOT USE HOSTNAMES ONLY IP ADDRESSES -->
+ <param name="rtp-ip" value="$${local_ip_v4}"/>
+ <!-- ip address to bind to, DO NOT USE HOSTNAMES ONLY IP ADDRESSES -->
+ <param name="sip-ip" value="$${local_ip_v4}"/>
+ <param name="hold-music" value="$${hold_music}"/>
+ <param name="apply-nat-acl" value="nat.auto"/>
+
+
+ <!-- (default true) set to false if you do not wish to have called party info in 1XX responses -->
+ <!-- <param name="cid-in-1xx" value="false"/> -->
+
+ <!-- extended info parsing -->
+ <!-- <param name="extended-info-parsing" value="true"/> -->
+
+ <!--<param name="aggressive-nat-detection" value="true"/>-->
+ <!--
+ There are known issues (asserts and segfaults) when 100rel is enabled.
+ It is not recommended to enable 100rel at this time.
+ -->
+ <!--<param name="enable-100rel" value="true"/>-->
+
+ <!-- uncomment if you don't wish to try a next SRV destination on 503 response -->
+ <!-- RFC3263 Section 4.3 -->
+ <!--<param name="disable-srv503" value="true"/>-->
+
+ <!-- Enable Compact SIP headers. -->
+ <!--<param name="enable-compact-headers" value="true"/>-->
+ <!--
+ enable/disable session timers
+ -->
+ <!--<param name="enable-timer" value="false"/>-->
+ <!--<param name="minimum-session-expires" value="120"/>-->
+ <!-- <param name="apply-inbound-acl" value="domains"/>-->
+ <!--
+ This defines your local network, by default we detect your local network
+ and create this localnet.auto ACL for this.
+ -->
+ <param name="local-network-acl" value="localnet.auto"/>
+ <!--<param name="apply-register-acl" value="domains"/>-->
+ <!--<param name="dtmf-type" value="info"/>-->
+
+
+ <!-- 'true' means every time 'first-only' means on the first register -->
+ <!--<param name="send-message-query-on-register" value="true"/>-->
+
+ <!-- 'true' means every time 'first-only' means on the first register -->
+ <!--<param name="send-presence-on-register" value="first-only"/> -->
+
+
+ <!-- Caller-ID type (choose one, can be overridden by inbound call type and/or sip_cid_type channel variable -->
+ <!-- Remote-Party-ID header -->
+ <!--<param name="caller-id-type" value="rpid"/>-->
+
+ <!-- P-*-Identity family of headers -->
+ <!--<param name="caller-id-type" value="pid"/>-->
+
+ <!-- neither one -->
+ <!--<param name="caller-id-type" value="none"/>-->
+
+
+
+ <param name="record-path" value="$${recordings_dir}"/>
+ <param name="record-template" value="${caller_id_number}.${target_domain}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/>
+ <!--enable to use presence -->
+ <param name="manage-presence" value="true"/>
+ <!-- send a presence probe on each register to query devices to send presence instead of sending presence with less info -->
+ <!--<param name="presence-probe-on-register" value="true"/>-->
+ <!--<param name="manage-shared-appearance" value="true"/>-->
+ <!-- used to share presence info across sofia profiles -->
+ <!-- Name of the db to use for this profile -->
+ <!--<param name="dbname" value="share_presence"/>-->
+ <param name="presence-hosts" value="$${domain},$${local_ip_v4}"/>
+ <param name="presence-privacy" value="$${presence_privacy}"/>
+ <!-- ************************************************* -->
+
+ <!-- This setting is for AAL2 bitpacking on G726 -->
+ <!-- <param name="bitpacking" value="aal2"/> -->
+ <!--max number of open dialogs in proceeding -->
+ <!--<param name="max-proceeding" value="1000"/>-->
+ <!--session timers for all call to expire after the specified seconds -->
+ <!--<param name="session-timeout" value="1800"/>-->
+ <!-- Can be 'true' or 'contact' -->
+ <!--<param name="multiple-registrations" value="contact"/>-->
+ <!--set to 'greedy' if you want your codec list to take precedence -->
+ <param name="inbound-codec-negotiation" value="generous"/>
+ <!-- if you want to send any special bind params of your own -->
+ <!--<param name="bind-params" value="transport=udp"/>-->
+ <!--<param name="unregister-on-options-fail" value="true"/>-->
+ <!-- Send an OPTIONS packet to all registered endpoints -->
+ <!--<param name="all-reg-options-ping" value="true"/>-->
+ <!-- Send an OPTIONS packet to NATed registered endpoints. Can be 'true' or 'udp-only'. -->
+ <!--<param name="nat-options-ping" value="true"/>-->
+ <!--<param name="sip-options-respond-503-on-busy" value="true"/>-->
+ <!--<param name="sip-messages-respond-200-ok" value="true"/>-->
+ <!--<param name="sip-subscribe-respond-200-ok" value="true"/>-->
+
+ <!-- TLS: disabled by default, set to "true" to enable -->
+ <param name="tls" value="$${internal_ssl_enable}"/>
+ <!-- Set to true to not bind on the normal sip-port but only on the TLS port -->
+ <param name="tls-only" value="false"/>
+ <!-- additional bind parameters for TLS -->
+ <param name="tls-bind-params" value="transport=tls"/>
+ <!-- Port to listen on for TLS requests. (5061 will be used if unspecified) -->
+ <param name="tls-sip-port" value="$${internal_tls_port}"/>
+ <!-- Location of the agent.pem and cafile.pem ssl certificates (needed for TLS server) -->
+ <!--<param name="tls-cert-dir" value=""/>-->
+ <!-- Optionally set the passphrase password used by openSSL to encrypt/decrypt TLS private key files -->
+ <param name="tls-passphrase" value=""/>
+ <!-- Verify the date on TLS certificates -->
+ <param name="tls-verify-date" value="true"/>
+ <!-- TLS verify policy, when registering/inviting gateways with other servers (outbound) or handling inbound registration/invite requests how should we verify their certificate -->
+ <!-- set to 'in' to only verify incoming connections, 'out' to only verify outgoing connections, 'all' to verify all connections, also 'subjects_in', 'subjects_out' and 'subjects_all' for subject validation. Multiple policies can be split with a '|' pipe -->
+ <param name="tls-verify-policy" value="none"/>
+ <!-- Certificate max verify depth to use for validating peer TLS certificates when the verify policy is not none -->
+ <param name="tls-verify-depth" value="2"/>
+ <!-- If the tls-verify-policy is set to subjects_all or subjects_in this sets which subjects are allowed, multiple subjects can be split with a '|' pipe -->
+ <param name="tls-verify-in-subjects" value=""/>
+ <!-- TLS version default: tlsv1,tlsv1.1,tlsv1.2 -->
+ <param name="tls-version" value="$${sip_tls_version}"/>
+
+ <!-- TLS ciphers default: ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH -->
+ <param name="tls-ciphers" value="$${sip_tls_ciphers}"/>
+
+ <!-- turn on auto-flush during bridge (skip timer sleep when the socket already has data)
+ (reduces delay on latent connections default true, must be disabled explicitly)-->
+ <!--<param name="rtp-autoflush-during-bridge" value="false"/>-->
+
+ <!--If you don't want to pass through timestamps from 1 RTP call to another (on a per call basis with rtp_rewrite_timestamps chanvar)-->
+ <!--<param name="rtp-rewrite-timestamps" value="true"/>-->
+ <!--<param name="pass-rfc2833" value="true"/>-->
+ <!--If you have ODBC support and a working dsn you can use it instead of SQLite-->
+ <!--<param name="odbc-dsn" value="dsn:user:pass"/>-->
+
+ <!-- Or, if you have PGSQL support, you can use that -->
+ <!--<param name="odbc-dsn" value="pgsql://hostaddr=127.0.0.1 dbname=freeswitch user=freeswitch password='' options='-c client_min_messages=NOTICE' application_name='freeswitch'" />-->
+
+ <!--Uncomment to set all inbound calls to no media mode-->
+ <!--<param name="inbound-bypass-media" value="true"/>-->
+
+ <!--Uncomment to set all inbound calls to proxy media mode-->
+ <!--<param name="inbound-proxy-media" value="true"/>-->
+
+ <!-- Let calls hit the dialplan before selecting codec for the a-leg -->
+ <param name="inbound-late-negotiation" value="true"/>
+
+ <!-- Allow ZRTP clients to negotiate end-to-end security associations (also enables late negotiation) -->
+ <param name="inbound-zrtp-passthru" value="true"/>
+
+ <!-- this lets anything register -->
+ <!-- comment the next line and uncomment one or both of the other 2 lines for call authentication -->
+ <!-- <param name="accept-blind-reg" value="true"/> -->
+
+ <!-- accept any authentication without actually checking (not a good feature for most people) -->
+ <!-- <param name="accept-blind-auth" value="true"/> -->
+
+ <!-- suppress CNG on this profile or per call with the 'suppress_cng' variable -->
+ <!-- <param name="suppress-cng" value="true"/> -->
+
+ <!--TTL for nonce in sip auth-->
+ <param name="nonce-ttl" value="60"/>
+ <!--Uncomment if you want to force the outbound leg of a bridge to only offer the codec
+ that the originator is using-->
+ <!--<param name="disable-transcoding" value="true"/>-->
+ <!-- Handle 302 Redirect in the dialplan -->
+ <!--<param name="manual-redirect" value="true"/> -->
+ <!-- Disable Transfer -->
+ <!--<param name="disable-transfer" value="true"/> -->
+ <!-- Disable Register -->
+ <!--<param name="disable-register" value="true"/> -->
+ <!-- Used for when phones respond to a challenged ACK with method INVITE in the hash -->
+ <!--<param name="NDLB-broken-auth-hash" value="true"/>-->
+ <!-- add a ;received="<ip>:<port>" to the contact when replying to register for nat handling -->
+ <!--<param name="NDLB-received-in-nat-reg-contact" value="true"/>-->
+ <param name="auth-calls" value="$${internal_auth_calls}"/>
+ <!-- Force the user and auth-user to match. -->
+ <param name="inbound-reg-force-matching-username" value="true"/>
+ <!-- on authed calls, authenticate *all* the packets not just invite -->
+ <param name="auth-all-packets" value="false"/>
+
+ <!-- external_sip_ip
+ Used as the public IP address for SDP.
+ Can be an one of:
+ ip address - "12.34.56.78"
+ a stun server lookup - "stun:stun.server.com"
+ a DNS name - "host:host.server.com"
+ auto - Use guessed ip.
+ auto-nat - Use ip learned from NAT-PMP or UPNP
+ -->
+ <param name="ext-rtp-ip" value="127.0.0.1"/>
+ <param name="ext-sip-ip" value="127.0.0.1"/>
+
+ <!-- rtp inactivity timeout -->
+ <param name="rtp-timeout-sec" value="300"/>
+ <param name="rtp-hold-timeout-sec" value="1800"/>
+ <!-- VAD choose one (out is a good choice); -->
+ <!-- <param name="vad" value="in"/> -->
+ <!-- <param name="vad" value="out"/> -->
+ <!-- <param name="vad" value="both"/> -->
+ <!--<param name="alias" value="sip:10.0.1.251:5555"/>-->
+ <!--
+ These are enabled to make the default config work better out of the box.
+ If you need more than ONE domain you'll need to not use these options.
+
+ -->
+ <!--all inbound reg will look in this domain for the users -->
+ <param name="force-register-domain" value="$${domain}"/>
+ <!--force the domain in subscriptions to this value -->
+ <param name="force-subscription-domain" value="$${domain}"/>
+ <!--all inbound reg will stored in the db using this domain -->
+ <param name="force-register-db-domain" value="$${domain}"/>
+
+
+ <!-- for sip over websocket support -->
+ <param name="ws-binding" value=":5066"/>
+
+ <!-- for sip over secure websocket support -->
+ <!-- You need wss.pem in $${certs_dir} for wss or one will be created for you -->
+ <param name="wss-binding" value=":7443"/>
+
+ <!--<param name="delete-subs-on-register" value="false"/>-->
+
+ <!-- launch a new thread to process each new inbound register when using heavier backends -->
+ <!-- <param name="inbound-reg-in-new-thread" value="true"/> -->
+
+ <!-- enable rtcp on every channel also can be done per leg basis with rtcp_audio_interval_msec variable set to passthru to pass it across a call-->
+ <!--<param name="rtcp-audio-interval-msec" value="5000"/>-->
+ <!--<param name="rtcp-video-interval-msec" value="5000"/>-->
+
+ <!--force suscription expires to a lower value than requested-->
+ <!--<param name="force-subscription-expires" value="60"/>-->
+
+ <!-- add a random deviation to the expires value of the 202 Accepted -->
+ <!--<param name="sip-subscription-max-deviation" value="120"/>-->
+
+ <!-- disable register and transfer which may be undesirable in a public switch -->
+ <!--<param name="disable-transfer" value="true"/>-->
+ <!--<param name="disable-register" value="true"/>-->
+
+ <!--
+ enable-3pcc can be set to either 'true' or 'proxy', true accepts the call
+ right away, proxy waits until the call has been answered then sends accepts
+ -->
+ <!--<param name="enable-3pcc" value="true"/>-->
+
+ <!-- use at your own risk or if you know what this does.-->
+ <!--<param name="NDLB-force-rport" value="true"/>-->
+ <!--
+ Choose the realm challenge key. Default is auto_to if not set.
+
+ auto_from - uses the from field as the value for the sip realm.
+ auto_to - uses the to field as the value for the sip realm.
+ <anyvalue> - you can input any value to use for the sip realm.
+
+ If you want URL dialing to work you'll want to set this to auto_from.
+
+ If you use any other value besides auto_to or auto_from you'll
+ loose the ability to do multiple domains.
+
+ Note: comment out to restore the behavior before 2008-09-29
+ -->
+ <param name="challenge-realm" value="auto_from"/>
+ <!--<param name="disable-rtp-auto-adjust" value="true"/>-->
+ <!-- on inbound calls make the uuid of the session equal to the sip call id of that call -->
+ <!--<param name="inbound-use-callid-as-uuid" value="true"/>-->
+ <!-- on outbound calls set the callid to match the uuid of the session -->
+ <!--<param name="outbound-use-uuid-as-callid" value="true"/>-->
+ <!-- set to false disable this feature -->
+ <!--<param name="rtp-autofix-timing" value="false"/>-->
+
+ <!-- set this param to false if your gateway for some reason hates X- headers that it is supposed to ignore-->
+ <!--<param name="pass-callee-id" value="false"/>-->
+
+ <!-- clear clears them all or supply the name to add or the name
+ prefixed with ~ to remove valid values:
+
+ clear
+ CISCO_SKIP_MARK_BIT_2833
+ SONUS_SEND_INVALID_TIMESTAMP_2833
+
+ -->
+ <!--<param name="auto-rtp-bugs" data="clear"/>-->
+
+ <!-- the following can be used as workaround with bogus SRV/NAPTR records -->
+ <!--<param name="disable-srv" value="false" />-->
+ <!--<param name="disable-naptr" value="false" />-->
+
+ <!-- The following can be used to fine-tune timers within sofia's transport layer
+ Those settings are for advanced users and can safely be left as-is -->
+
+ <!-- Initial retransmission interval (in milliseconds).
+ Set the T1 retransmission interval used by the SIP transaction engine.
+ The T1 is the initial duration used by request retransmission timers A and E (UDP) as well as response retransmission timer G. -->
+ <!-- <param name="timer-T1" value="500" /> -->
+
+ <!-- Transaction timeout (defaults to T1 * 64).
+ Set the T1x64 timeout value used by the SIP transaction engine.
+ The T1x64 is duration used for timers B, F, H, and J (UDP) by the SIP transaction engine.
+ The timeout value T1x64 can be adjusted separately from the initial retransmission interval T1. -->
+ <!-- <param name="timer-T1X64" value="32000" /> -->
+
+
+ <!-- Maximum retransmission interval (in milliseconds).
+ Set the maximum retransmission interval used by the SIP transaction engine.
+ The T2 is the maximum duration used for the timers E (UDP) and G by the SIP transaction engine.
+ Note that the timer A is not capped by T2. Retransmission interval of INVITE requests grows exponentially
+ until the timer B fires. -->
+ <!-- <param name="timer-T2" value="4000" /> -->
+
+ <!--
+ Transaction lifetime (in milliseconds).
+ Set the lifetime for completed transactions used by the SIP transaction engine.
+ A completed transaction is kept around for the duration of T4 in order to catch late responses.
+ The T4 is the maximum duration for the messages to stay in the network and the duration of SIP timer K. -->
+ <!-- <param name="timer-T4" value="4000" /> -->
+
+ <!-- Turn on a jitterbuffer for every call -->
+ <!-- <param name="auto-jitterbuffer-msec" value="60"/> -->
+
+
+ <!-- By default mod_sofia will ignore the codecs in the sdp for hold/unhold operations
+ Set this to true if you want to actually parse the sdp and re-negotiate the codec during hold/unhold.
+ It's probably not what you want so stick with the default unless you really need to change this.
+ -->
+ <!--<param name="renegotiate-codec-on-hold" value="true"/>-->
+
+ </settings>
+</profile>
diff --git a/contrib/testpbx/configs/public.xml b/contrib/testpbx/configs/public.xml
new file mode 100644
index 0000000..d9b1d17
--- /dev/null
+++ b/contrib/testpbx/configs/public.xml
@@ -0,0 +1,68 @@
+<!--
+ NOTICE:
+
+ This context is usually accessed via the external sip profile listening on port 5080.
+
+ It is recommended to have separate inbound and outbound contexts. Not only for security
+ but clearing up why you would need to do such a thing. You don't want outside un-authenticated
+ callers hitting your default context which allows dialing calls thru your providers and results
+ in Toll Fraud.
+-->
+
+<!-- http://wiki.freeswitch.org/wiki/Dialplan_XML -->
+<include>
+ <context name="public">
+
+ <extension name="unloop">
+ <condition field="${unroll_loops}" expression="^true$"/>
+ <condition field="${sip_looped_call}" expression="^true$">
+ <action application="deflect" data="${destination_number}"/>
+ </condition>
+ </extension>
+ <!--
+ Tag anything pass thru here as an outside_call so you can make sure not
+ to create any routing loops based on the conditions that it came from
+ the outside of the switch.
+ -->
+ <extension name="outside_call" continue="true">
+ <condition>
+ <action application="set" data="outside_call=true"/>
+ <action application="export" data="RFC2822_DATE=${strftime(%a, %d %b %Y %T %z)}"/>
+ </condition>
+ </extension>
+
+ <extension name="call_debug" continue="true">
+ <condition field="${call_debug}" expression="^true$" break="never">
+ <action application="info"/>
+ </condition>
+ </extension>
+
+ <extension name="public_extensions">
+ <condition field="destination_number" expression="^(10[01][0-9])$">
+ <action application="transfer" data="$1 XML default"/>
+ </condition>
+ </extension>
+
+ <!--
+ You can place files in the public directory to get included.
+ -->
+ <X-PRE-PROCESS cmd="include" data="public/*.xml"/>
+ <!--
+ If you have made it this far lets challenge the caller and if they authenticate
+ lets try what they dialed in the default context. (commented out by default)
+ -->
+ <!--
+ <extension name="check_auth" continue="true">
+ <condition field="${sip_authorized}" expression="^true$" break="never">
+ <anti-action application="respond" data="407"/>
+ </condition>
+ </extension>
+
+ -->
+ <extension name="transfer_to_default">
+ <condition>
+ <action application="transfer" data="${destination_number} XML default"/>
+ </condition>
+ </extension>
+ </context>
+</include>
diff --git a/contrib/testpbx/configs/switch.conf.xml b/contrib/testpbx/configs/switch.conf.xml
new file mode 100644
index 0000000..1a82409
--- /dev/null
+++ b/contrib/testpbx/configs/switch.conf.xml
@@ -0,0 +1,181 @@
+<configuration name="switch.conf" description="Core Configuration">
+
+ <cli-keybindings>
+ <key name="1" value="help"/>
+ <key name="2" value="status"/>
+ <key name="3" value="show channels"/>
+ <key name="4" value="show calls"/>
+ <key name="5" value="sofia status"/>
+ <key name="6" value="reloadxml"/>
+ <key name="7" value="console loglevel 0"/>
+ <key name="8" value="console loglevel 7"/>
+ <key name="9" value="sofia status profile internal"/>
+ <key name="10" value="sofia profile internal siptrace on"/>
+ <key name="11" value="sofia profile internal siptrace off"/>
+ <key name="12" value="version"/>
+ </cli-keybindings>
+
+ <default-ptimes>
+ <!-- Set this to override the 20ms assumption of various codecs in the sdp with no ptime defined -->
+ <!-- <codec name="G729" ptime="40"/> -->
+ </default-ptimes>
+
+ <settings>
+ <!-- Colorize the Console -->
+ <param name="colorize-console" value="true"/>
+
+ <!--Include full timestamps in dialplan logs -->
+ <param name="dialplan-timestamps" value="false"/>
+
+ <!-- Run the timer at 20ms by default and drop down as needed unless you set 1m-timer=true which was previous default -->
+ <!-- <param name="1ms-timer" value="true"/> -->
+
+ <!--
+ Set the Switch Name for HA environments.
+ When setting the switch name, it will override the system hostname for all DB and CURL requests
+ allowing cluster environments such as RHCS to have identical FreeSWITCH configurations but run
+ as different hostnames.
+ -->
+ <!-- <param name="switchname" value="freeswitch"/> -->
+ <!-- <param name="cpu-idle-smoothing-depth" value="30"/> -->
+
+
+ <!-- Maximum number of simultaneous DB handles open -->
+ <param name="max-db-handles" value="50"/>
+ <!-- Maximum number of seconds to wait for a new DB handle before failing -->
+ <param name="db-handle-timeout" value="10"/>
+
+ <!-- Minimum idle CPU before refusing calls -->
+ <!-- <param name="min-idle-cpu" value="25"/> -->
+
+ <!--
+ Max number of sessions to allow at any given time.
+
+ NOTICE: If you're driving 28 T1's in a single box you should set this to 644*2 or 1288
+ this will ensure you're able to use the entire DS3 without a problem. Otherwise you'll
+ be 144 channels short of always filling that DS3 up which can translate into waste.
+ -->
+ <param name="max-sessions" value="1000"/>
+ <!--Most channels to create per second -->
+ <param name="sessions-per-second" value="30"/>
+ <!-- Default Global Log Level - value is one of debug,info,notice,warning,err,crit,alert -->
+ <param name="loglevel" value="debug"/>
+
+ <!-- Set the core DEBUG level (0-10) -->
+ <!-- <param name="debug-level" value="10"/> -->
+
+ <!-- SQL Buffer length within rage of 32k to 10m -->
+ <!-- <param name="sql-buffer-len" value="1m"/> -->
+ <!-- Maximum SQL Buffer length must be greater than sql-buffer-len -->
+ <!-- <param name="max-sql-buffer-len" value="2m"/> -->
+
+ <!--
+ The min-dtmf-duration specifies the minimum DTMF duration to use on
+ outgoing events. Events shorter than this will be increased in duration
+ to match min_dtmf_duration. You cannot configure a dtmf duration on a
+ profile that is less than this setting. You may increase this value,
+ but cannot set it lower than 400. This value cannot exceed
+ max-dtmf-duration. -->
+ <!-- <param name="min-dtmf-duration" value="400"/> -->
+
+ <!--
+ The max-dtmf-duration caps the playout of a DTMF event at the specified
+ duration. Events exceeding this duration will be truncated to this
+ duration. You cannot configure a duration on a profile that exceeds
+ this setting. This setting can be lowered, but cannot exceed 192000.
+ This setting cannot be set lower than min_dtmf_duration. -->
+ <!-- <param name="max-dtmf-duration" value="192000"/> -->
+
+ <!--
+ The default_dtmf_duration specifies the DTMF duration to use on
+ originated DTMF events or on events that are received without a
+ duration specified. This value can be increased or lowered. This
+ value is lower-bounded by min_dtmf_duration and upper-bounded by
+ max-dtmf-duration\. -->
+ <!-- <param name="default-dtmf-duration" value="2000"/> -->
+
+ <!--
+ If you want to send out voicemail notifications via Windows you'll need to change the mailer-app
+ variable to the setting below:
+
+ <param name="mailer-app" value="msmtp"/>
+
+ Do not change mailer-app-args.
+ You will also need to download a sendmail clone for Windows (msmtp). This version works without issue:
+ http://msmtp.sourceforge.net/index.html. Download and copy the .exe to %winddir%\system32.
+ You'll need to create a small config file for smtp credentials (host name, authentication, tls, etc.) in
+ %USERPROFILE%\Application Data\ called "msmtprc.txt". Below is a sample copy of this file:
+
+ ###################################
+ # The SMTP server of the provider.
+ account provider
+ host smtp.myisp.com
+ from john@myisp.com
+ auth login
+ user johndoe
+ password mypassword
+
+ # Set a default account
+ account default : provider
+ ###################################
+
+ -->
+
+ <param name="mailer-app" value="sendmail"/>
+ <param name="mailer-app-args" value="-t"/>
+ <param name="dump-cores" value="yes"/>
+
+ <!-- Enable verbose channel events to include every detail about a channel on every event -->
+ <!-- <param name="verbose-channel-events" value="no"/> -->
+
+ <!-- Enable clock nanosleep -->
+ <!-- <param name="enable-clock-nanosleep" value="true"/> -->
+
+ <!-- Enable monotonic timing -->
+ <!-- <param name="enable-monotonic-timing" value="true"/> -->
+
+ <!-- NEEDS DOCUMENTATION -->
+ <!-- <param name="enable-softtimer-timerfd" value="true"/> -->
+ <!-- <param name="enable-cond-yield" value="true"/> -->
+ <!-- <param name="enable-timer-matrix" value="true"/> -->
+ <!-- <param name="threaded-system-exec" value="true"/> -->
+ <!-- <param name="tipping-point" value="0"/> -->
+ <!-- <param name="timer-affinity" value="disabled"/> -->
+ <!-- NEEDS DOCUMENTATION -->
+
+ <!-- RTP port range -->
+ <param name="rtp-start-port" value="6000"/>
+ <param name="rtp-end-port" value="6020"/>
+
+ <!-- Test each port to make sure it is not in use by some other process before allocating it to RTP -->
+ <!-- <param name="rtp-port-usage-robustness" value="true"/> -->
+
+ <param name="rtp-enable-zrtp" value="false"/>
+
+ <!--
+ Store encryption keys for secure media in channel variables and call CDRs. Default: false.
+ WARNING: If true, anyone with CDR access can decrypt secure media!
+ -->
+ <!-- <param name="rtp-retain-crypto-keys" value="true"/> -->
+
+ <!-- <param name="core-db-dsn" value="pgsql://hostaddr=127.0.0.1 dbname=freeswitch user=freeswitch password='' options='-c client_min_messages=NOTICE'" /> -->
+ <!-- <param name="core-db-dsn" value="dsn:username:password" /> -->
+ <!--
+ Allow to specify the sqlite db at a different location (In this example, move it to ramdrive for
+ better performance on most linux distro (note, you loose the data if you reboot))
+ -->
+ <!-- <param name="core-db-name" value="/dev/shm/core.db" /> -->
+
+ <!-- The system will create all the db schemas automatically, set this to false to avoid this behaviour -->
+ <!-- <param name="auto-create-schemas" value="true"/> -->
+ <!-- <param name="auto-clear-sql" value="true"/> -->
+ <!-- <param name="enable-early-hangup" value="true"/> -->
+
+ <!-- <param name="core-dbtype" value="MSSQL"/> -->
+
+ <!-- Allow multiple registrations to the same account in the central registration table -->
+ <!-- <param name="multiple-registrations" value="true"/> -->
+
+ </settings>
+
+</configuration>
diff --git a/contrib/testpbx/configs/vars.xml b/contrib/testpbx/configs/vars.xml
new file mode 100644
index 0000000..1cb826d
--- /dev/null
+++ b/contrib/testpbx/configs/vars.xml
@@ -0,0 +1,450 @@
+<include>
+ <!-- Preprocessor Variables
+ These are introduced when configuration strings must be consistent across modules.
+ NOTICE: YOU CAN NOT COMMENT OUT AN X-PRE-PROCESS line, Remove the line instead.
+
+ WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
+
+ YOU SHOULD CHANGE THIS default_password value if you don't want to be subject to any
+ toll fraud in the future. It's your responsibility to secure your own system.
+
+ This default config is used to demonstrate the feature set of FreeSWITCH.
+
+ WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
+ -->
+ <X-PRE-PROCESS cmd="set" data="default_password=1234"/>
+ <!-- Did you change it yet? -->
+ <!--
+ The following variables are set dynamically - calculated if possible by freeswitch - and
+ are available to the config as $${variable}. You can see their calculated value via fs_cli
+ by entering eval $${variable}
+
+ hostname
+ local_ip_v4
+ local_mask_v4
+ local_ip_v6
+ switch_serial
+ base_dir
+ recordings_dir
+ sound_prefix
+ sounds_dir
+ conf_dir
+ log_dir
+ run_dir
+ db_dir
+ mod_dir
+ htdocs_dir
+ script_dir
+ temp_dir
+ grammar_dir
+ certs_dir
+ storage_dir
+ cache_dir
+ core_uuid
+ zrtp_enabled
+ nat_public_addr
+ nat_private_addr
+ nat_type
+
+ -->
+
+
+ <X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/en/us/callie"/>
+
+ <!--
+ This setting is what sets the default domain FreeSWITCH will use if all else fails.
+
+ FreeSWICH will default to $${local_ip_v4} unless changed. Changing this setting does
+ affect the sip authentication. Please review conf/directory/default.xml for more
+ information on this topic.
+ -->
+ <X-PRE-PROCESS cmd="set" data="domain=$${local_ip_v4}"/>
+ <X-PRE-PROCESS cmd="set" data="domain_name=$${domain}"/>
+ <X-PRE-PROCESS cmd="set" data="hold_music=local_stream://moh"/>
+ <X-PRE-PROCESS cmd="set" data="use_profile=external"/>
+ <X-PRE-PROCESS cmd="set" data="rtp_sdes_suites=AEAD_AES_256_GCM_8|AEAD_AES_128_GCM_8|AES_CM_256_HMAC_SHA1_80|AES_CM_192_HMAC_SHA1_80|AES_CM_128_HMAC_SHA1_80|AES_CM_256_HMAC_SHA1_32|AES_CM_192_HMAC_SHA1_32|AES_CM_128_HMAC_SHA1_32|AES_CM_128_NULL_AUTH"/>
+ <!--
+ Enable ZRTP globally you can override this on a per channel basis
+
+ http://wiki.freeswitch.org/wiki/ZRTP (on how to enable zrtp)
+ -->
+ <X-PRE-PROCESS cmd="set" data="zrtp_secure_media=true"/>
+ <!--
+ NOTICE: When using SRTP it's critical that you do not offer or accept
+ variable bit rate codecs, doing so would leak information and possibly
+ compromise your SRTP stream. (FS-6404)
+
+ Supported SRTP Crypto Suites:
+
+ AEAD_AES_256_GCM_8
+ ____________________________________________________________________________
+ This algorithm is identical to AEAD_AES_256_GCM (see Section 5.2 of
+ [RFC5116]), except that the tag length, t, is 8, and an
+ authentication tag with a length of 8 octets (64 bits) is used.
+ An AEAD_AES_256_GCM_8 ciphertext is exactly 8 octets longer than its
+ corresponding plaintext.
+
+
+ AEAD_AES_128_GCM_8
+ ____________________________________________________________________________
+ This algorithm is identical to AEAD_AES_128_GCM (see Section 5.1 of
+ [RFC5116]), except that the tag length, t, is 8, and an
+ authentication tag with a length of 8 octets (64 bits) is used.
+ An AEAD_AES_128_GCM_8 ciphertext is exactly 8 octets longer than its
+ corresponding plaintext.
+
+
+ AES_CM_256_HMAC_SHA1_80 | AES_CM_192_HMAC_SHA1_80 | AES_CM_128_HMAC_SHA1_80
+ ____________________________________________________________________________
+ AES_CM_128_HMAC_SHA1_80 is the SRTP default AES Counter Mode cipher
+ and HMAC-SHA1 message authentication with an 80-bit authentication
+ tag. The master-key length is 128 bits and has a default lifetime of
+ a maximum of 2^48 SRTP packets or 2^31 SRTCP packets, whichever comes
+ first.
+
+
+ AES_CM_256_HMAC_SHA1_32 | AES_CM_192_HMAC_SHA1_32 | AES_CM_128_HMAC_SHA1_32
+ ____________________________________________________________________________
+ This crypto-suite is identical to AES_CM_128_HMAC_SHA1_80 except that
+ the authentication tag is 32 bits. The length of the base64-decoded key and
+ salt value for this crypto-suite MUST be 30 octets i.e., 240 bits; otherwise,
+ the crypto attribute is considered invalid.
+
+
+ AES_CM_128_NULL_AUTH
+ ____________________________________________________________________________
+ The SRTP default cipher (AES-128 Counter Mode), but to use no authentication
+ method. This policy is NOT RECOMMENDED unless it is unavoidable; see
+ Section 7.5 of [RFC3711].
+
+
+ SRTP variables that modify behaviors based on direction/leg:
+
+ rtp_secure_media
+ ____________________________________________________________________________
+ possible values:
+ mandatory - Accept/Offer SAVP negotiation ONLY
+ optional - Accept/Offer SAVP/AVP with SAVP preferred
+ forbidden - More useful for inbound to deny SAVP negotiation
+ false - implies forbidden
+ true - implies mandatory
+
+ default if not set is accept SAVP inbound if offered.
+
+
+ rtp_secure_media_inbound | rtp_secure_media_outbound
+ ____________________________________________________________________________
+ This is the same as rtp_secure_media, but would apply to either inbound
+ or outbound offers specifically.
+
+
+ How to specify crypto suites:
+ ____________________________________________________________________________
+ By default without specifying any crypto suites FreeSWITCH will offer
+ crypto suites from strongest to weakest accepting the strongest each
+ endpoint has in common. If you wish to force specific crypto suites you
+ can do so by appending the suites in a comma separated list in the order
+ that you wish to offer them in.
+
+ Examples:
+
+ rtp_secure_media=mandatory:AES_CM_256_HMAC_SHA1_80,AES_CM_256_HMAC_SHA1_32
+ rtp_secure_media=true:AES_CM_256_HMAC_SHA1_80,AES_CM_256_HMAC_SHA1_32
+ rtp_secure_media=optional:AES_CM_256_HMAC_SHA1_80
+ rtp_secure_media=true:AES_CM_256_HMAC_SHA1_80
+
+ Additionally you can narrow this down on either inbound or outbound by
+ specifying as so:
+
+ rtp_secure_media_inbound=true:AEAD_AES_256_GCM_8
+ rtp_secure_media_inbound=mandatory:AEAD_AES_256_GCM_8
+ rtp_secure_media_outbound=true:AEAD_AES_128_GCM_8
+ rtp_secure_media_outbound=optional:AEAD_AES_128_GCM_8
+
+
+ rtp_secure_media_suites
+ ____________________________________________________________________________
+ Optionaly you can use rtp_secure_media_suites to dictate the suite list
+ and only use rtp_secure_media=[optional|mandatory|false|true] without having
+ to dictate the suite list with the rtp_secure_media* variables.
+ -->
+ <!--
+ Examples of codec options: (module must be compiled and loaded)
+
+ codecname[@8000h|16000h|32000h[@XXi]]
+
+ XX is the frame size must be multples allowed for the codec
+ FreeSWITCH can support 10-120ms on some codecs.
+ We do not support exceeding the MTU of the RTP packet.
+
+
+ iLBC@30i - iLBC using mode=30 which will win in all cases.
+ DVI4@8000h@20i - IMA ADPCM 8kHz using 20ms ptime. (multiples of 10)
+ DVI4@16000h@40i - IMA ADPCM 16kHz using 40ms ptime. (multiples of 10)
+ speex@8000h@20i - Speex 8kHz using 20ms ptime.
+ speex@16000h@20i - Speex 16kHz using 20ms ptime.
+ speex@32000h@20i - Speex 32kHz using 20ms ptime.
+ BV16 - BroadVoice 16kb/s narrowband, 8kHz
+ BV32 - BroadVoice 32kb/s wideband, 16kHz
+ G7221@16000h - G722.1 16kHz (aka Siren 7)
+ G7221@32000h - G722.1C 32kHz (aka Siren 14)
+ CELT@32000h - CELT 32kHz, only 10ms supported
+ CELT@48000h - CELT 48kHz, only 10ms supported
+ GSM@40i - GSM 8kHz using 40ms ptime. (GSM is done in multiples of 20, Default is 20ms)
+ G722 - G722 16kHz using default 20ms ptime. (multiples of 10)
+ PCMU - G711 8kHz ulaw using default 20ms ptime. (multiples of 10)
+ PCMA - G711 8kHz alaw using default 20ms ptime. (multiples of 10)
+ G726-16 - G726 16kbit adpcm using default 20ms ptime. (multiples of 10)
+ G726-24 - G726 24kbit adpcm using default 20ms ptime. (multiples of 10)
+ G726-32 - G726 32kbit adpcm using default 20ms ptime. (multiples of 10)
+ G726-40 - G726 40kbit adpcm using default 20ms ptime. (multiples of 10)
+ AAL2-G726-16 - Same as G726-16 but using AAL2 packing. (multiples of 10)
+ AAL2-G726-24 - Same as G726-24 but using AAL2 packing. (multiples of 10)
+ AAL2-G726-32 - Same as G726-32 but using AAL2 packing. (multiples of 10)
+ AAL2-G726-40 - Same as G726-40 but using AAL2 packing. (multiples of 10)
+ LPC - LPC10 using 90ms ptime (only supports 90ms at this time in FreeSWITCH)
+ L16 - L16 isn't recommended for VoIP but you can do it. L16 can exceed the MTU rather quickly.
+
+ These are the passthru audio codecs:
+
+ G729 - G729 in passthru mode. (mod_g729)
+ G723 - G723.1 in passthru mode. (mod_g723_1)
+ AMR - AMR in passthru mode. (mod_amr)
+
+ These are the passthru video codecs: (mod_h26x)
+
+ H261 - H.261 Video
+ H263 - H.263 Video
+ H263-1998 - H.263-1998 Video
+ H263-2000 - H.263-2000 Video
+ H264 - H.264 Video
+
+ RTP Dynamic Payload Numbers currently used in FreeSWITCH and what for.
+
+ 96 - AMR
+ 97 - iLBC (30)
+ 98 - iLBC (20)
+ 99 - Speex 8kHz, 16kHz, 32kHz
+ 100 -
+ 101 - telephone-event
+ 102 -
+ 103 -
+ 104 -
+ 105 -
+ 106 - BV16
+ 107 - G722.1 (16kHz)
+ 108 -
+ 109 -
+ 110 -
+ 111 -
+ 112 -
+ 113 -
+ 114 - CELT 32kHz, 48kHz
+ 115 - G722.1C (32kHz)
+ 116 -
+ 117 - SILK 8kHz
+ 118 - SILK 12kHz
+ 119 - SILK 16kHz
+ 120 - SILK 24kHz
+ 121 - AAL2-G726-40 && G726-40
+ 122 - AAL2-G726-32 && G726-32
+ 123 - AAL2-G726-24 && G726-24
+ 124 - AAL2-G726-16 && G726-16
+ 125 -
+ 126 -
+ 127 - BV32
+
+ -->
+ <X-PRE-PROCESS cmd="set" data="global_codec_prefs=OPUS,G722,PCMU,PCMA,VP8"/>
+ <X-PRE-PROCESS cmd="set" data="outbound_codec_prefs=OPUS,G722,PCMU,PCMA,VP8"/>
+
+ <!--
+ xmpp_client_profile and xmpp_server_profile
+ xmpp_client_profile can be any string.
+ xmpp_server_profile is appended to "dingaling_" to form the database name
+ containing the "subscriptions" table.
+ used by: dingaling.conf.xml enum.conf.xml
+ -->
+
+ <X-PRE-PROCESS cmd="set" data="xmpp_client_profile=xmppc"/>
+ <X-PRE-PROCESS cmd="set" data="xmpp_server_profile=xmpps"/>
+ <!--
+ THIS IS ONLY USED FOR DINGALING
+
+ bind_server_ip
+
+ Can be an ip address, a dns name, or "auto".
+ This determines an ip address available on this host to bind.
+ If you are separating RTP and SIP traffic, you will want to have
+ use different addresses where this variable appears.
+ Used by: dingaling.conf.xml
+ -->
+ <X-PRE-PROCESS cmd="set" data="bind_server_ip=auto"/>
+
+ <!-- NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE
+
+ If you're going to load test FreeSWITCH please input real IP addresses
+ for external_rtp_ip and external_sip_ip
+ -->
+
+ <!-- external_rtp_ip
+ Can be an one of:
+ ip address: "12.34.56.78"
+ a stun server lookup: "stun:stun.server.com"
+ a DNS name: "host:host.server.com"
+ where fs.mydomain.com is a DNS A record-useful when fs is on
+ a dynamic IP address, and uses a dynamic DNS updater.
+ If unspecified, the bind_server_ip value is used.
+ Used by: sofia.conf.xml dingaling.conf.xml
+ -->
+ <!-- <X-PRE-PROCESS cmd="set" data="external_rtp_ip=stun:stun.freeswitch.org"/> -->
+ <X-PRE-PROCESS cmd="set" data="external_rtp_ip=127.0.0.1"/>
+
+ <!-- external_sip_ip
+ Used as the public IP address for SDP.
+ Can be an one of:
+ ip address: "12.34.56.78"
+ a stun server lookup: "stun:stun.server.com"
+ a DNS name: "host:host.server.com"
+ where fs.mydomain.com is a DNS A record-useful when fs is on
+ a dynamic IP address, and uses a dynamic DNS updater.
+ If unspecified, the bind_server_ip value is used.
+ Used by: sofia.conf.xml dingaling.conf.xml
+ -->
+ <!-- <X-PRE-PROCESS cmd="set" data="external_sip_ip=stun:stun.freeswitch.org"/> -->
+ <X-PRE-PROCESS cmd="set" data="external_sip_ip=127.0.0.1"/>
+
+
+ <!-- unroll-loops
+ Used to turn on sip loopback unrolling.
+ -->
+ <X-PRE-PROCESS cmd="set" data="unroll_loops=true"/>
+
+ <!-- outbound_caller_id and outbound_caller_name
+ The caller ID telephone number we should use when calling out.
+ Used by: conference.conf.xml and user directory for default
+ outbound callerid name and number.
+ -->
+ <X-PRE-PROCESS cmd="set" data="outbound_caller_name=FreeSWITCH"/>
+ <X-PRE-PROCESS cmd="set" data="outbound_caller_id=0000000000"/>
+
+ <!-- various debug and defaults -->
+ <X-PRE-PROCESS cmd="set" data="call_debug=false"/>
+ <X-PRE-PROCESS cmd="set" data="console_loglevel=info"/>
+ <X-PRE-PROCESS cmd="set" data="default_areacode=918"/>
+ <X-PRE-PROCESS cmd="set" data="default_country=US"/>
+
+ <!-- if false or undefined, the destination number is included in presence NOTIFY dm:note.
+ if true, the destination number is not included -->
+ <X-PRE-PROCESS cmd="set" data="presence_privacy=false"/>
+
+ <X-PRE-PROCESS cmd="set" data="au-ring=%(400,200,383,417);%(400,2000,383,417)"/>
+ <X-PRE-PROCESS cmd="set" data="be-ring=%(1000,3000,425)"/>
+ <X-PRE-PROCESS cmd="set" data="ca-ring=%(2000,4000,440,480)"/>
+ <X-PRE-PROCESS cmd="set" data="cn-ring=%(1000,4000,450)"/>
+ <X-PRE-PROCESS cmd="set" data="cy-ring=%(1500,3000,425)"/>
+ <X-PRE-PROCESS cmd="set" data="cz-ring=%(1000,4000,425)"/>
+ <X-PRE-PROCESS cmd="set" data="de-ring=%(1000,4000,425)"/>
+ <X-PRE-PROCESS cmd="set" data="dk-ring=%(1000,4000,425)"/>
+ <X-PRE-PROCESS cmd="set" data="dz-ring=%(1500,3500,425)"/>
+ <X-PRE-PROCESS cmd="set" data="eg-ring=%(2000,1000,475,375)"/>
+ <X-PRE-PROCESS cmd="set" data="es-ring=%(1500,3000,425)"/>
+ <X-PRE-PROCESS cmd="set" data="fi-ring=%(1000,4000,425)"/>
+ <X-PRE-PROCESS cmd="set" data="fr-ring=%(1500,3500,440)"/>
+ <X-PRE-PROCESS cmd="set" data="hk-ring=%(400,200,440,480);%(400,3000,440,480)"/>
+ <X-PRE-PROCESS cmd="set" data="hu-ring=%(1250,3750,425)"/>
+ <X-PRE-PROCESS cmd="set" data="il-ring=%(1000,3000,400)"/>
+ <X-PRE-PROCESS cmd="set" data="in-ring=%(400,200,425,375);%(400,2000,425,375)"/>
+ <X-PRE-PROCESS cmd="set" data="jp-ring=%(1000,2000,420,380)"/>
+ <X-PRE-PROCESS cmd="set" data="ko-ring=%(1000,2000,440,480)"/>
+ <X-PRE-PROCESS cmd="set" data="pk-ring=%(1000,2000,400)"/>
+ <X-PRE-PROCESS cmd="set" data="pl-ring=%(1000,4000,425)"/>
+ <X-PRE-PROCESS cmd="set" data="ro-ring=%(1850,4150,475,425)"/>
+ <X-PRE-PROCESS cmd="set" data="rs-ring=%(1000,4000,425)"/>
+ <X-PRE-PROCESS cmd="set" data="ru-ring=%(800,3200,425)"/>
+ <X-PRE-PROCESS cmd="set" data="sa-ring=%(1200,4600,425)"/>
+ <X-PRE-PROCESS cmd="set" data="tr-ring=%(2000,4000,450)"/>
+ <X-PRE-PROCESS cmd="set" data="uk-ring=%(400,200,400,450);%(400,2000,400,450)"/>
+ <X-PRE-PROCESS cmd="set" data="us-ring=%(2000,4000,440,480)"/>
+ <X-PRE-PROCESS cmd="set" data="bong-ring=v=-7;%(100,0,941.0,1477.0);v=-7;>=2;+=.1;%(1400,0,350,440)"/>
+ <X-PRE-PROCESS cmd="set" data="beep=%(1000,0,640)"/>
+ <X-PRE-PROCESS cmd="set" data="sit=%(274,0,913.8);%(274,0,1370.6);%(380,0,1776.7)"/>
+
+ <!--
+ Digits Dialed filter: (FS-6940)
+
+ The digits stream may contain valid credit card numbers or social security numbers, These digit
+ filters will allow you to make a valant effort to stamp out sensitive information for
+ PCI/HIPPA compliance. (see xml_cdr dialed_digits)
+
+ df_us_ssn = US Social Security Number pattern
+ df_us_luhn = Visa, MasterCard, American Express, Diners Club, Discover and JCB
+ -->
+ <X-PRE-PROCESS cmd="set" data="df_us_ssn=(?!219099999|078051120)(?!666|000|9\d{2})\d{3}(?!00)\d{2}(?!0{4})\d{4}"/>
+ <X-PRE-PROCESS cmd="set" data="df_luhn=?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}|(?:2131|1800|35\d{3})\d{11}"/>
+ <!-- change XX to X below to enable -->
+ <XX-PRE-PROCESS cmd="set" data="digits_dialed_filter=(($${df_luhn})|($${df_us_ssn}))"/>
+
+ <!--
+ Setting up your default sip provider is easy.
+ Below are some values that should work in most cases.
+
+ These are for conf/directory/default/example.com.xml
+ -->
+ <X-PRE-PROCESS cmd="set" data="default_provider=example.com"/>
+ <X-PRE-PROCESS cmd="set" data="default_provider_username=joeuser"/>
+ <X-PRE-PROCESS cmd="set" data="default_provider_password=password"/>
+ <X-PRE-PROCESS cmd="set" data="default_provider_from_domain=example.com"/>
+ <!-- true or false -->
+ <X-PRE-PROCESS cmd="set" data="default_provider_register=false"/>
+ <X-PRE-PROCESS cmd="set" data="default_provider_contact=5000"/>
+
+ <!--
+ SIP and TLS settings. http://wiki.freeswitch.org/wiki/Tls
+
+ valid options: sslv2,sslv3,sslv23,tlsv1,tlsv1.1,tlsv1.2
+
+ default: tlsv1,tlsv1.1,tlsv1.2
+ -->
+ <X-PRE-PROCESS cmd="set" data="sip_tls_version=tlsv1,tlsv1.1,tlsv1.2"/>
+
+ <!--
+ TLS cipher suite: default ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH
+
+ The actual ciphers supported will change per platform.
+
+ openssl ciphers -v 'ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH'
+
+ Will show you what is available in your verion of openssl.
+ -->
+ <X-PRE-PROCESS cmd="set" data="sip_tls_ciphers=ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"/>
+
+ <!-- Internal SIP Profile -->
+ <X-PRE-PROCESS cmd="set" data="internal_auth_calls=false"/>
+ <X-PRE-PROCESS cmd="set" data="internal_sip_port=5060"/>
+ <X-PRE-PROCESS cmd="set" data="internal_tls_port=5061"/>
+ <X-PRE-PROCESS cmd="set" data="internal_ssl_enable=false"/>
+
+ <!-- External SIP Profile -->
+ <X-PRE-PROCESS cmd="set" data="external_auth_calls=false"/>
+ <X-PRE-PROCESS cmd="set" data="external_sip_port=5080"/>
+ <X-PRE-PROCESS cmd="set" data="external_tls_port=5081"/>
+ <X-PRE-PROCESS cmd="set" data="external_ssl_enable=false"/>
+
+ <!-- Video Settings -->
+ <!-- Setting the max bandwdith -->
+ <X-PRE-PROCESS cmd="set" data="rtp_video_max_bandwidth_in=1mb"/>
+ <X-PRE-PROCESS cmd="set" data="rtp_video_max_bandwidth_out=1mb"/>
+
+ <!-- WebRTC Video -->
+ <!-- Suppress CNG for WebRTC Audio -->
+ <X-PRE-PROCESS cmd="set" data="suppress_cng=true"/>
+ <!-- Enable liberal DTMF for those that can't get it right -->
+ <X-PRE-PROCESS cmd="set" data="rtp_liberal_dtmf=true"/>
+ <!-- Helps with WebRTC Audio -->
+
+ <!-- Stock Video Avatars -->
+ <X-PRE-PROCESS cmd="set" data="video_mute_png=$${images_dir}/default-mute.png"/>
+ <X-PRE-PROCESS cmd="set" data="video_no_avatar_png=$${images_dir}/default-avatar.png"/>
+
+</include>