...
Each rule is processed in order until you reach the action tag which tells SBC what action to perform. You are not limited to only one condition or action tag for a given extension.
In our above example, a call to extension 501 rings the extensions. If the user does not answer, the second action answers the call, and following actions delay for 1000 milliseconds (which is 1 second) and connect the call to the voicemail system.
Context
Contexts are a logical grouping of extensions. You may have multiple extensions contained within a single context.
The context tag has a required parameter of ‘name’. There is one reserved name, any, which matches any context. The name is used by incoming call handlers (like the [Sofia] SIP driver) to select the dialplan that runs when it needs to route a call. There is often more than one context in a dialplan.
A fully qualified context definition is shown below. Typically you’ll not need all the trimmings, but they are shown here for completeness.
Code Block |
---|
<?xml version="1.0"?> <document type="freeswitch/xml"> <section name="dialplan" description="Regex/XML Dialplan"> <!-- the default context is a safe start --> <context name="default"> <!-- one or more extension tags --> </context> < !-- more optional contexts --> </section> </document> |
Extensions
Extensions are destinations for a call. This is the meat of SBC routing dialed numbers. They are given a name and contain a group of conditions, that if met, will execute certain actions.
A ‘name’ parameter is required: It must be a unique name assigned to an extension for identification and later use.
For example:
...
Code Block |
---|
<extension name="500" continue="true"> |
Conditions
Dialplan conditions are typically used to match a destination number to an extension. They have, however, much more power than may appear on the surface.
SBC has a set of built-in variables used for testing. In this example, the built-in variable destination_number is compared against the regular expression ^500$.
This comparison is ‘true’ if is set to 500.
...
A destination number of 3425 would set $1 to 25 and then bridge the call to the phone at 25@example.com
Multiple Conditions (Logical AND)
You can emulate the logical AND operation available in many programming languages using multiple conditions. When you place more than one condition in an extension, all conditions must match before the actions will be executed. For example, this block will only execute the actions if the destination number is 500 AND it is Sunday.
...
Keep in mind that you must observe correct XML syntax when using this structure. Be sure to close all conditions except the last one with />. The last condition contains the final actions to be run, and is closed on the line after the last action.
By default, if any condition is false, SBC will move on to the anti-actions or the next extension without even evaluating any more conditions.
Multiple Conditions (Logical OR, XOR)
It is possible to emulate the logical OR operation available in many programming languages, using multiple conditions. In this situation, if one of the conditions matches, the actions are executed.
For example, this block executes its actions if the destination number is 501 OR the destination number is 502.
...
Code Block |
---|
<condition regex="all"> <regex field="${sip_gateway}" expression="^${default_provider}$"/> <regex field="${emergency_call}" expression="^true$"/> <regex field="${db(select/emergency/autoanswer)}" expression="^1$"/> <!-- the following actions get executed if all regexes PASS --> <action application="set" data="call_timeout=60"/> <action application="set" data="effective_caller_id_name=${regex(${caller_id_name}|^Emerg(_.*)$|Auto%1)}"/> <action application="set" data="autoanswered=true"/> <action application="bridge" data="user/1000@${domain_name},sofia/gateway/1006_7217/${mobile_number}"/> <!-- the following anti-actions are executed if any of the regexes FAIL --> <anti-action application="set" data="effective_caller_id_name=${regex(${caller_id_name}|^Emerg(_.*)$|NotAuto%1)}"/> <anti-action application="set" data="call_timeout=30"/> <anti-action application="set" data="autoanswered=false"/> <anti-action application="bridge" data="user/1000@${domain_name},sofia/gateway/1006_7217/${mobile_number}"/> </condition> |
Complex Condition/Action Rules
Here is a more complex example, performing time-based routing for a support organization. The user dials extension 1100. The actual support extension is 1105 and is staffed every day from 8am to 10pm, except Friday, when it is staffed between 8am and 1pm. At all other times, calls to 1100 are sent to the support after-hours mailbox.
...
Code Block |
---|
<extension name="break-demo"> <!-- because break=never is set, even when the destination does not begin with 1, we skip the action and keep going --> <condition field="destination_number" expression="^1(\d+)$" break="never"> <action application="set" data="begins_with_one=true"/> </condition> <condition field="destination_number" expression="^(\d+)$"> ...other actions that may query begins_with_one... </condition> </extension> |
Variables
Condition statements can match against channel variables, or against an array of built in variables.
Built-In Variables
The following variables, called ‘caller profile fields’, can be accessed from condition statements directly:
Dialplan Variable | Description |
---|---|
context | Why can we use the context as a field? Give us examples of usages please. |
rdnis | Redirected Number, the directory number to which the call was last presented. |
destination_number | Called Number, the number this call is trying to reach (within a given context) |
dialplan | Name of the dialplan module that are used, the name is provided by each dialplan module. Example: XML |
caller_id_name | Name of the caller (provided by the User Agent that has called us). |
caller_id_number | Directory Number of the party who called (caller) — can be masked (hidden) |
ani | Automatic Number Identification, the number of the calling party (caller) — cannot be masked |
aniii | The type of device placing the call ANI2 |
uuid | Unique identifier of the current call? (looks like a GUID) |
source | Name of the FreeSWITCH module that received the call (e.g. PortAudio) |
chan_name | Name of the current channel (Example: PortAudio/1234). |
network_addr | IP address of the signaling source for a VoIP call. |
year | Calendar year, 0-9999 |
yday | Day of year, 1-366 |
mon | Month, 1-12 (Jan = 1, etc.) |
mday | Day of month, 1-31 |
week | Week of year, 1-53 |
mweek | Week of month, 1-6 |
wday | Day of week, 1-7 (Sun = 1, Mon = 2, etc.) or “sun”, “mon”, “tue”, etc. |
hour | Hour, 0-23 |
minute | Minute (of the hour), 0-59 |
minute-of-day | Minute of the day, (1-1440) (midnight = 1, 1am = 60, noon = 720, etc.) |
time-of-day | Time range formatted: hh:mm[:ss]-hh:mm[:ss] (seconds optional) Example: “08:00-17:00” |
date-time | Date/time range formatted: YYYY-MM-DD hh:mm[:ss]~YYYY-MM-DD hh:mm[:ss] |