Its Summer ending, why not try these ads
https://singingfiles.com/show.php?l=0&u=2239412&id=55764
Extensions.conf
extensions.conf – This is your Dialplan.
The configuration file “extensions.conf” contains the “dial plan” of Asterisk, the master plan of control or execution flow for all of its operations. It controls how incoming and outgoing calls are handled and routed. This is where you configure the behavior of all connections through your PBX.
The content of “extensions.conf” is organized in sections, which can be either for static settings and definitions, or for executable dialplan components in which case they are referred to as contexts. The settings sections are general and globals and the names of contexts are entirely defined by the system administrator. A special type of contexts are macros, label by a userdefined name prefixed with macro-. These are reusable execution patterns, like procedures in a programming language. Every section in extensions.conf starts with the name of the section contained within square brackets. This gives the extensions.conf file a similar structure to the traditional .ini file format of the Windows world.
Asterisk Dialplan Planning – General discussion about organizing a dialplan
New in Asterisk v1.2: By default, there is a new option called “autofallthrough” in extensions.conf that is set to yes. Asterisk 1.0 (and earlier) behavior was to wait for an extension to be dialed after there were no more extensions to execute. “autofallthrough” changes this behavior so that the call is terminated immediately with BUSY, CONGESTION, or HANGUP based on Asterisk’s best guess. If you are writing an extension for IVR, you must use the WaitExtenapplication if “autofallthrough” is set to yes.
[general]
-
At the top of your extensions.conf file, you configure a few general settings in the section headed [general]. For details, see:
[globals]
-
Next, in the [globals] section, you may define global variables (or constants) and their initial values. For details, see:
- Using Variables in Asterisk Dialplans
Contexts and Extensions
-
After the [general] and [globals] categories, the remainder of the extensions.conf file is taken up by the definition of the Dialplan. The Dialplan consists of a collection of contexts. Each context consists of a collection of extensions. For an introduction to these topics, see:
Extension Patterns
-
When you define the extensions within a context, you may not only use literal numbers, not only alphanumeric names, but also you may define extensions that match whole sets of dialed numbers by using extension patterns. For more information about this, see:
Context Inclusion
One extension context can include the contents of another. For example, consider the following contexts:
Context “default”:
Extension Description
101 Mark Spencer
102 Wil Meadows
0 Operator
Context “local”:
Extension Description
_9NXXXXXX Local calls
include => “default”
Context “longdistance”:
Extension Description
_91NXXNXXXXXX Long distance calls
include => “local”
Here we have defined three extensions:
- The context default permits dialing three telephone extensions: Mark, Wil, and the Operator.
- The context local has one extension pattern to permit dialing 7-digit numbers only (local calls), and also includes the context “default”, thus also permitting a user to dial Mark, Wil, or the Operator.
- The context long distance has one extension pattern to permit dialing a long-distance call, and it also includes the context “local”, thus permitting the user to make local calls and also to dial the extensions of Mark, Wil or the Operator.
Using extension contexts, you can carefully control who has access to toll services.
If more than one pattern matches a dialed number, Asterisk may not use the one you expect. See Sort Order of Extension Patterns.
Adding to an existing section (I believe this is a 1.4 feature; additional info on similar option are in doc/configuration.txt of asterisk src tree)
[section]
label = value
[section](+)
label2 = value2
In this case, the plus sign indicates that the second section (with the same name) is an addition to the first section. The second section can be in another file (by using the #include statement). If the section name referred to before the plus is missing, the configuration fails to load.
When Asterisk receives an incoming connection on a channel, Asterisk looks at the context defined for that channel for commands telling Asterisk what it should do. The context defines different sets of commands depending on what extension the user has dialed. For example, a context might provide one set of commands for what to do if the user dials “123”, and another set of commands for what to do if the user dials “9”, and another set of commands for what to do if the user dials any number beginning with “555”.
For some kinds of connections — such incoming calls from an outside telephone line — the user has not dialed an extension. In that case, Asterisk behaves as if the user had dialed a special extension named “s” (for Start). Asterisk looks for an extension “number” s in the definition of the context for that channel for instructions about what it should do to handle the call.
Let’s say, for example, that you have a channel “Zap/1” which is a connection to a telephone handset in your building. And let’s say that in the configuration file for Zap channels (zapata.conf), you have defined context=john for Zap channel 1. So when you use that handset to dial a number, Asterisk looks for a context with the name “john” in extensions.conf to find out what it should do. You begin the definition of a context in extensions.conf by putting the name of the context in square brackets on a line by itself, like this:
[john]
For each context, you need to define one or more extensions that Asterisk uses to compare against the number dialed. For each extension, you tell Asterisk what to do by listing a set of commands.
Extensions
An extension can be one of two types: a literal or a pattern.
A literal extension can be a number, like 123, and it can also contain the standard symbols * and # that appear on ordinary telephones, so 12#89* is a valid extension. Some telephone keypads have the special DTMF keys labeled A, B, C and D, and extensions can be defined with these letters too. In fact, the name of an extension can contain any letter or number as well as some punctuation marks. Note that many VOIP telephones are able to “dial” extension “numbers” that may be any arbitrary text string, such as “Office”. It is perfectly permissible to define an extension with the name Officein Asterisk.
Extension names may or may not be case sensitive. They are case sensitive in the sense that when Asterisk is trying to match the extension a user dialed against the extensions defined for a context, the extension must match, including case. So if a user dials extension “OFFICE” using their VOIP telephone, Asterisk does not start executing the commands you have defined for an extension named “Office”. On the other hand, extension names are not case sensitive in the sense that you can not define different extensions (in the one context) that have the same names differing only in case. So you can’t define one set of commands for extension “Office” and another set of commands for extension “OFFICE”.
Predefined Extension Names
Asterisk uses some extension names for special purposes:
- i : Invalid
- s : Start
- h : Hangup
- t : Timeout
- T : AbsoluteTimeout
- a : Asterisk extension
- o : Operator
See Asterisk standard extensions for details.
Defining Extensions
Unlike a traditional PBX, where extensions are associated with phones, interfaces, menus, and so on, in Asterisk an extension is defined as a list of commands to execute. The commands are generally executed in the order defined by their “priority” tag, but some commands, such as the Dial and GotoIf commands, have the ability to redirect somewhere else, based on some condition.
When an extension is dialed, the command tagged with a priority of 1 is executed, followed by command priority 2, and so on. This goes on until:
- the call is hung up,
- a command returns a result code of -1 (indicating failure),
- a command with the next higher priority doesn’t exist (note: Asterisk does not “skip over” missing priorities), or
- the call is routed to a new extension.
In the syntax of the extensions.conf file, each execution step in an extension is written in this format:
exten = extension,priority,Command(parameters)
where the equal sign can also be ornamented as an arrow, i.e., “=>”, a form most often seen in many examples.
Ok, so a “context” has a name, such as “john”. And in each context, you can define one or more “extensions”. For each extension, you define a set of commands. So how do you define these extensions and the commands to handle them? You need to edit the extensions.conf file with a text editor. However, there are some tools available to help: GUI tool.
The components of an extension execution step or command line are the following:
-
- extension is the label of the extension, and can be either a literal constant string (alphanumeric plus a few special symols allowed) or a dynamically evaluated pattern (see below) to match many possible phone numbers, for example. Every command line that is part of a given extensions has this same label.
-
- priority is usually an integer (see note, however). It’s just a sequence number for each command line of an extension. The first executable command of an extensions has the priority “1”, so when Asterisk transfers a call to an extension, it looks for a command with priority 1. If there is not a line with a priority of 1, then the extension does not match the dialed number. After executing the priority 1 command, Asterisk increments the priority to “2” unless the command itself determines the next priority to be executed. If this next priority is not defined in the extension, Asterisk finishes processing for this extension, even if there exists another command with a priority higher than the missing one.
Note: Strings may also be used in place of priority in special situations (see Asterisk standard extensions).
-
- command is the name of the command (also called an “application”) to execute. See the Asterisk Commands List.
- parameters depend on the command. Some commands take no parameters, in which case you can omit the parentheses.
Example
exten => 123,1,Answer
exten => 123,2,Playback(tt-weasels)
exten => 123,3,Voicemail(44)
exten => 123,4,Hangup
This is the definiton of a single extension with name “123”. When a call is made to extension 123, Asterisk answers the call itself, play a sound file called “tt-weasels”, give the user an opportunity to leave a voicemail message for mailbox 44, and then hangup.
Note that Asterisk doesn’t care about the order in which you put the lines in the extensions.conf file. You could mix the lines into a different order, like this following example, and it would make no difference because Asterisk uses the priority of each line to determine order of execution:
exten => 123,4,Hangup
exten => 123,1,Answer
exten => 123,3,Voicemail(44)
exten => 123,2,Playback(tt-weasels)
Other options for defining extensions include an option commonly referred to as the ex-girlfriend logic. This logic matches the dialed extension irrespective of its origin based on the callerid of the person calling it. For example:
exten => 123/100,1,Answer()
exten => 123/100,2,Playback(tt-weasels)
exten => 123/100,3,Voicemail(123)
exten => 123/100,4,Hangup()
This matches extension 123 and perform the following options ONLY if the Caller-ID Number of the calling user is 100. This can also be accomplished with pattern matching, as seen below:
exten => 1234/_256NXXXXXX,1,Answer()
and so on…
This matches only 1234 if the Caller ID Number is something beginning with 256. This is very useful to keep locals from dialing your toll-free number and charging you for the call.
You can even do this:
exten => s,1,Answer
exten => s/9184238080,2,Set(CALLERID(name)=EVIL BASTARD)
exten => s,2,Set(CALLERID(name)=Good Person)
exten => s,3,Dial(SIP/goodperson)
(thanks for pointing that out, Brian 🙂 )
Basically the call comes in, at 2 you fork the people you don’t like out, everybody else stays in the path and at 3 everybody is back in the main path.
Syntax for defining a context: keywords exten, include, ignorepat and switch.
One of the banes of this method of storing the extension information is that if you need to insert or delete a priority, you have to manually renumber all numbers after it and all label referrences to it. I’m working on a utility to do this online: give it a try if you like
Since Asterisk 1.2 there is a new way to work around this. Number the first priority and “name” the following priorities “n”. See Asterisk Prioritiesfor further details!
If you are not so familiar with Asterisk dialplan syntax, dialplan priorities, or you simply do not prefer coding using text editors, you may find Visual Dialplan for Asterisk useful tool for your dialplan development. Visual Dialplan for Asterisk is rapid dialplan development tool for Asterisk dialplan development, it provides similar interface and approach like Visual Basic provides for rapid application development for Windows platform (if you are more familiar the Windows environment like I am, although there is Visual Dialplan for Linux too).
You may drag, drop and connect building blocks to make Asterisk dialplan. Then you may configure building blocks to fine tune your dialplan.
Here is the same example above created using Visual Dialplan for Asterisk:
Download Visual Dialplan for Asterisk
Variables and expressions
There is support for using variables using the ${VARIABLENAME} construct. You can also use expressions with the $[EXPRESSION] construct, where expressions can be regular expressions, comparision, addition, substraction and much more. See Asterisk variables for standard variables and Asterisk readme.variables for an explanations of expressions.
For more information about using global variables and channel variables in extensions.conf, see
New in 1.2 are dialplan functions, see
Reloading
If you want to reload the dial plan after changes, without reloading all of Asterisk’s config, use the dialplan reload Asterisk CLI command.
Either connect to your asterisk process with asterisk -r or rasterisk and type in the command, or send the command directly with:
asterisk -rx ‘dialplan reload’
One big file or several small?
With the #include <filename> statement in extensions.conf, other files are included. This way you can setup a system where extensions.conf is the main file, users.conf (SEE IMPORTANT NOTE BELOW) contain your local users, services.conf contain various services, like conferencing. This way, the dial plan may be easier to maintain, depending on the size of your setup. The #include <filename> statement is not the same as the include <context> statement. The #include statement works in all Asterisk configuration files.
DO NOT USE users.conf as a filename anymore! This is now a “reserved” filename as of Asterisk 1.4! In general, it is a good idea to divide your extensions.conf file up into subcomponents but put those files in a subdirectory (don’t clutter up /etc/asterisk). For example, have a directory /etc/asterisk/exts and use #include <exts/…>
Sample extensions.conf using the #include statement
#include “my-extra-config-file”
[globals]
ALL=Zap/1&SIP/1000&SIP/1001
[default]
exten => s,1,Answer
exten => s,2,Playback(welcome-message)
exten => s,3,Goto(context-in-include-file,s,1) ; go to context defined in included file
Forwarding to another Asterisk
Syntax:
[iaxprovider]
switch => IAX2/user:[key]@server/context
Specifies forwarding to another server. The user and key needs to be defined in the iax.conf file of the server which is called. The context is a context in the called servers extensions.conf.
- See Asterisk – dual servers for an example
Controlling extensions.conf from outside
- Asterisk extensions from mysql
- as with all .conf files you can use the #include statement to include another file
Macro Examples
Using a macro to create extensions
[globals]
PHONE1=Zap/1
PHONE2=SIP/6002
[macro-oneline]
exten => s,1,Dial(${ARG1},20,t)
exten => s,2,Voicemail(u${MACRO_EXTEN})
exten => s,3,Hangup
exten => s,102,Voicemail(b${MACRO_EXTEN})
exten => s,103,Hangup
[local]
exten => 6601,1,Macro(oneline,${PHONE1})
exten => 6602,1,Macro(oneline,${PHONE2})
- Asterisk dial plan – working example: Real world example
- An expanded example showing integrations with a Panasonic KSU ivr
Sip header manipulation examples
These examples may be beneficial when interfacing Asterisk with a Nortel SST or an Acme Packet SBC.
Sending RFC-3323 compliant privacy headers in sip calls
ftp://ftp.rfc-editor.org/in-notes/rfc3323.txt
exten => _9.,1,SIPAddHeader(P-Asserted-Identity: <sip:+1${CALLERID(num)}\;user=phone>)
exten => _9.,n,SIPAddHeader(Privacy: user\; header\; session)
exten => _9.,n.SetCallerPres(prohib_not_screened) ; this might not be needed — needs further testing
exten => _9.,n,Set(CALLERID(num)=)
exten => _9.,n,Set(CALLERID(name)=Anonymous)
exten => _9.,n,Dial(SIP/+${EXTEN:1}@sipcarrier)
exten => _9.,n,Hangup()
Sending RFC-3325 compliant privacy headers in sip calls
ftp://ftp.rfc-editor.org/in-notes/rfc3325.txt
exten => _9.,1,SIPAddHeader(P-Preferred-Identity: <sip:+1${CALLERID(num)}\;user=phone>)
exten => _9.,n,SIPAddHeader(Privacy: id)
exten => _9.,n.SetCallerPres(prohib_not_screened) ; this might not be needed — needs further testing
exten => _9.,n,Set(CALLERID(num)=)
exten => _9.,n,Set(CALLERID(name)=Anonymous)
exten => _9.,n,Dial(SIP/+${EXTEN:1}@sipcarrier)
exten => _9.,n,Hangup()
Sending Sip Diversion headers (spawned from dialplan as macro)
[macro-diversion-header]
exten => s,1,SIPAddHeader(Diversion: <tel:+{ARG1}>\;reason=user=busy\;screen=no\;privacy=off)
Tip: With vim syntax highlighting highlights correct dialplan syntax and may ease dialplan design through these visual aids.
Example files on the net
-
- How to set up a SIP trunk in the Asterisk PBX – Basic setup How-To/tutorial, SIP trunk and dialplan, to dial out, and in. With full example configuration files.
- John Todd, Loligo.com: http://www.loligo.com/asterisk/current/extensions.conf
- Tilghman Lesher: http://asterisk.drunkcoder.com/extensions.conf
- planetWayne: Ideas for Home Based Asterisk Systems
See also
- AEL: The Asterisk Extension Language
- AEL2: The Asterisk Extension Language v2.
- Asterisk Configuration files
- Asterisk config sip.conf: sip.conf sample configurations
- Asterisk Dialplanner – A Java-based point-and-click web tool to help you create your dialplan.
- Asterisk – dual servers: How to connect to an extension in another Asterisk server over IAX.
- Asterisk handbook (draft) includes a good explanation and many examples
- Asterisk how to dial plan: How to build a dial plan
- Asterisk tips and tricks
- Dialplan Commands
- Dialplan Renumberer Utility – Beta resource for renumbering your dialplan if you have to insert/delete a priority.
- Extension Names and Patterns
- http://www.astautodialer.com – AstPlanDesigner (part of AstAutoDialer) – A graphical tool to draw and visualize your Asterisk dial plan!
- International numbering plans and phone number analysis
- radp – Ruby Asterisk Dial Plan generator (create your dialplans with ruby)
- Sort Order of Extension Patterns
- Using Variables in Asterisk Dialplans
- Using Functions in Asterisk Dialplans
- vim syntax highlighting for extensions.conf
Intro to Asterisk Dialplan Priorities
Asterisk Priorities are used within a dialplan, in the extensions.conf configuration file..
Priorities are numbered steps in the execution of each command that make up an extension. Each priority represents one specific application. Typically, priority numbers start at 1 and increment consecutively for each line in the context. Priority numbers are not always consecutive, but we will worry about that later. For now, just remember that for each extension, Asterisk runs each priority in numerical order — as opposed to the order in which they appear in the file.
Example
exten => 555,1,Answer
exten => 555,2,Playback(tt-weasels)
exten => 555,3,Voicemail(44)
exten => 555,4,Hangup
This example is a definition of a single extension with the name “555”. When a call is made to extension 555, Asterisk will answer the call itself, play a sound file called “tt-weasels”, give the user an opportunity to leave a voicemail message for mailbox 44, and then hangup.
In the example, “exten =>” tells the dialplan that the next thing it sees will be a command.
“555” are the actual digits received (i.e. what the caller dialed, or the “extension” number dialed).
“1”, “2”, “3”, and “4” represent the priority, which determines the order in which commands for that extension will be executed.
Note that Asterisk does not care about the order in which you put the lines in the extensions.conf file. You could mix the lines into a different order, like this following example, and it would make no difference because Asterisk uses the priority of each line to determine order of execution:
exten => 555,4,Hangup
exten => 555,1,Answer
exten => 555,3,Voicemail(44)
exten => 555,2,Playback(tt-weasels)
The n Priority (Asterisk 1.2.x and later versions)
Instead of having to manually number (and renumber) priorities within a given extension, you may use “n” to represent the next priority. The “n” automatically increases a priority’s value incrementally. Previously, if you wanted to insert a command between the third and fourth line of a 20-priority extension, you would need to manually renumber each priority after the inserted line.
Example
exten => 555,1,Answer
exten => 555,n,Playback(tt-weasels)
exten => 555,n,Voicemail(44)
exten => 555,n,Hangup
Using “n” priorities, there are two things you can do that make creating extension logic a lot easier.
The first is that you can set labels:
exten => s,n(Start),Answer
As well as making the dialplan more readable, labels can be the target of gotos:
exten => s,n,Goto(Start)
The second feature that makes using priorities easier is that arbitrary increments can be defined:
exten => s,n+2,Dial(…)
Maybe its utility is not so obvious, but in conjunction with labels, it can be pretty handy. In a typical dialplan, Asterisk must often handle the “+101” priority to handle the failure condition of an application, like Dial(). Without the n priority, if you were to change one of the lines within an extension, not only must the Dial() priority change, so must the corresponding +101 priority.
With n priority increments, the following expression is possible:
exten => s,n(MainDial),Dial(…) ; Dial the main numbers for this context
…
…
exten => s,MainDial+101,Voicemail(u100)
Now when new dial plan instructions are added before (MainDial) there is no need to update any priorities.
Note that the “+101” priority may also use a label:
exten => s,MainDial+101(MainDialNotAnswered),Voicemail(u100)
The s Priority (Asterisk 1.2.x and later versions)
You can use ‘s’ as a priority where different patterns may match at the same point in the extension and act differently for them. It would be the same as having multiple lines with the same fixed priority number. You cannot use ‘n’ in this case because there would be missing priorities for any pattern matches after the first one.
Example
exten => 16025551212,1,Goto(customername#did|${EXTEN}|1000)
exten => 16025551213,1,Goto(customername#did|${EXTEN}|1000)
exten => _1602555121[4-9],1,Goto(customername#did|${EXTEN}|1000)
exten => _X.,1000,Set(CALLSOURCE=pstn)
exten => _X.,n,SetAccount(customername)
exten => 16025551212,n,Goto(customername#main,s,1)
exten => 16025551213,s,Goto(customername#fax,s,1)
exten => _1602555121[4-9],s,Goto(customername#extensions,${EXTEN:7},1)
What are Contexts and Extensions
Contexts and Extensions
After the [general] and [globals] categories, the remainder of the extensions.conf file is taken up by the definition of the Dialplan. The Dialplan consists of a collection of contexts. Each context consists of a collection of extensions. For an introduction to these topics:.
-
- Introducing Contexts and Extensions
The Dialplan consists of a collection of contexts. These context definitions are the most important part of the extensions.conf file and are the most important part of Asterisk configuration.
A context is just a collection of extensions. Here is a diagrammatic representation (i.e. not something you’d type into your extensions.conf file!) of a simple example context:
Context “default”:
Extension Description
101 Mark Spencer
102 Wil Meadows
103 Greg Vance
104 Check voicemail
105 Conference Room
0 Operator
In this example context, which has been given the name “default”, the first three extensions (101 to 103) all would be associated with ringing phones belonging to various employees. The fourth extension (104) would be associated with allowing someone to check their voicemail. The fifth extension (105) would be associated with a conference room. Finally, the “0” extension would be associated with the operator.
Here is another simple example of a context:
Context “mainmenu”:
Extension Description
s Welcome message and instructions
1 Sales
2 Support
3 Accounting
9 Directory
Hangup
This example context, given the name “mainmenu”, has only single-digit extensions. The “s” extension is the start extension, where the caller begins. This extension would play a message along the lines of “Thank you for calling OurCompany. Press 1 for sales, 2 for support, 3 for accounting, 9 for a company directory, or # to hangup.” Each menu option is, in fact, an extension and could either dial someone’s real extension or could do something like sending the caller to another menu.
Contexts can be used to implement a number of important features including:
-
- Security: Permit long distance calls from certain phones only
- Routing: Route calls based on extension
- Autoattendant: Greet callers and ask them to enter extensions
- Multilevel menus: Menus for sales, support, etc.
- Authentication: Ask for passwords for certain extensions
- Callback: Reduce long distance charges
- Privacy: Blacklist annoying callers from contacting you
- PBX Multihosting: Yes, you can have “virtual hosts” on your PBX
- Daytime/Nighttime: You can vary behavior after hours
- Macros: Create scripts for commonly used functions
How Are Contexts Used?
When Asterisk receives a call connection, whether an incoming call from outside, or from an internal extension, that call belongs to a context. Which context the call belongs to depends on what channel the call came in on. When you configured the channels that you have on your Asterisk PBX, one of the things you had to do was to define what context an incoming connection on that channel would be put into, using a definition like:
context=incoming
So the first way contexts are used is to make Asterisk do different things depending on where a call is coming from. You most likely will have at least one context defined for how Asterisk handles an incoming call on your telephone line: it might ring some of your extensions or play an announcement and record a voicemail message. You want Asterisk to handle connections from your internal extensions differently — they will be permitted to dial a different extension, or make an outgoing call — so you define that calls from those different channels go into different contexts.
LAB Part 1 Enable CDR (call detail record) logging
Need a master.csv to enable logging.
nano /etc/asterisk/cdr_custom.conf
uncomment [mappings]
uncomment Master.csv
save
In asterisk console
cdr show status
localhost*CLI> cdr show status
Call Detail Record (CDR) settings
———————————-
Logging: Enabled
Mode: Simple
Log unanswered calls: No
Log congestion: No
* Registered Backends
——————-
cdr-custom
localhost*CLI>
Need to configure the cdr-custom field
cd /var/log/asterisk/
ls
cd cdr-csv/
ls
would see master.csv
cd ..
cd cdr-custom
SETUP YOUR LINUX SERVER TO SEND VOICEMAIL
Using Postfix:
service postfix status
Configure for a g-mail account
If postfix is not installed:
yum -y install postfix mailx cyrus-sasl-plain
edit /etc/postfix/sasl_passwd
smtp.gmail.com email@gmail.com:emailpassword
postmap hash:/etc/postfix/sasl_passwd
edit /etc/postfix/main.cf
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
samtp_sasl_security_options = noanonymous
# Secure channel TLS with exact nexthop name match.
smtp_tls_security_level = secure
smtp_tls_mandatory_protocols = TLSv1
smtp_tls_mandatory_ciphers = high
smtp_tls_secure_cert_match = nexthop
smtp_tls_Cafile = /etc/pki/tls/certs/ca-bundle.crt
relayhost = smtp.gmail.com:587
save file
service postfix restart
mail email@domain
rm /etc/postfix/sasl_passwd
LAB CUSTOMIZING FOLLOWME.CONF
; Find-Me / Follow-Me Configuration File
[general]
featuredigittimeout=>5000
takecall=>1
declinecall=>2
call_from_prompt=>followme/call-from
norecording_prompt=>followme/no-recording
options_prompt=>followme/options
pls_hold_prompt=>followme/pls-hold-while-try
status_prompt=>followme/status
sorry_prompt=>followme/sorry
[default]
musicclass=>default
context=>default
number=>01233456,25
takecall=>1
declinecall=>2
call_from_prompt=>followme/call-from
norecording_prompt=>followme/no-recording
options_prompt=>followme/options
pls_hold_prompt=>followme/pls-hold-while-try
status_prompt=>followme/status
sorry_prompt=>followme/sorry
[104]
number=>8605551212,36 ; change 8605551212 with extension 104 users mobile phone number, 36 is the ring time in seconds
context=>outbound-follow-me
musicclass=>default
[106]
number=>4075551212,36 ; change 4075551212 with extension 106 users mobile phone number, 36 is the ring time in seconds
context=>outbound-follow-me
musicclass=>default
[105]
number=>3055551212,36 ; change 3055551212 with extension 105 users mobile phone number, 36 is the ring time in seconds
context=>outbound-follow-me
musicclass=>default
[107]
number=>6175551212,36
context=>outbound-follow-me
musicclass=>default
[108]
number=>2125551212,36
context=>outbound-follow-me
musicclass=>default
LAB CUSTOMIZING VOICEMAIL.CONF
[general]
format = wav FORMAT TO SAVE VOICEMAILS
serveremail = asterisk VOICEMAIL TO EMAIL
attach = yes ATTACHING VOICEMAIL AS ATTACHMENT MESSAGE
skipms = 3000
maxsilence = 10
maxmessage = 300
review = yes
silencethreshold = 128
maxlogins = 3
emaildateformat = %A, %B %d, %Y at %r
sendvoicemail = yes
exitcontext = vm-operator
operator = yes
fromstring = PBX Voicemail
[zonemessages] TIMEZONES
eastern = America/New_York|’vm-received’ Q ‘digits/at’ IMp
central = America/Chicago|’vm-received’ Q ‘digits/at’ IMp
central24 = America/Chicago|’vm-received’ q ‘digits/at’ H N ‘hours’
military = Zulu|’vm-received’ q ‘digits/at’ H N ‘hours’ ‘phonetic/z_p’
european = Europe/Copenhagen|’vm-received’ a d b ‘digits/at’ HM
[default] DEFAULT VOICEMAIL GROUP CONTEXT CREATED IN SIP.CONF IE: MAILBOX=101@DEFAULT
100 => 1234,Office Mailbox,office@email.com,,attach=yes|hidefromdir=yes HIDE FROM DIR GENERIC GROUP
108 => 1234,John Doe,johndoe@email.com,,attach=yes
107 => 1234,Jame Doe,janedoe@email.com,,attach=yes
106 => 1234,Steve Smith,stevesmith@email.com,,attach=yes
105 => 1234,Sally Smith,sallysmith@email.com,,attach=yes
104 => 1234,Jeremy Clarkson,clarkson@email.com,,attach=yes
103 => 1234,Richard Hammond,hammond@email.com,,attach=yes
102 => 1234,Pink Floyd,pinkfloyd@email.com,,attach=yes
101 => 1234,Receptionist,receptionist@email.com,,attach=yes
.
LAB CUSTOMIZING extensions.conf
Breakdown: cat /etc/asterisk/extensions.conf
[default]
exten => .,1,Hangup() HANGS UP ON ANYTHING THAT COMES IN
5 STEPS
[inbound-schedule]
; #_#_# Phone Number #_#_#
exten => 2242179435,1,Answer ANSWER
exten => 2242179435,n,NoOp(Office-ANI-${EXTEN}) PRINT TO CONSOLE
exten => 2242179435,n,Set(CDR(userfield)=ib_${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${EXTEN}_${CALLERID(num)}) CUSTOM CDR ENTRY, GET TIME, CALLERID
exten => 2242179435,n,MixMonitor(ib_${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${EXTEN}_${CALLERID(num)}.wav) CALL RECORDING ON CALL
exten => 2242179435,n,Goto(schedule,${EXTEN},1) SCHEDULE FOR OPEN AND CLOSED HOURS
GOTO(SCHEDULE =WHAT CONTEXT, WHERE ARE WE GOING ${EXTEN},WHAT STEP,1)
exten => .,1,Hangup() HANG UP IF INVALID # DIALED
[schedule]
exten => _NXXNXXXXXX,1,NoOp(Time-of-Day-Routing) MATCH FOR 2242179435
exten => _NXXNXXXXXX,n,GotoIfTime(8:58-17:02,mon-fri,*,*?inbound,${EXTEN},1) OPEN HOURS, OPEN DAYS, ?INBOUND=WHERE DO WE GO,${EXTEN=INBOUND DID},1)
exten => _NXXNXXXXXX,n,Goto(inbound-closed,${EXTEN},1) IF IT DOESN’T MATCH GO TO NEXT STEP
[inbound]
exten => _NXXNXXXXXX,1,NoOp(Office-Open) OFFICE OPEN CONSOLE MESSAGE
exten => _NXXNXXXXXX,n,Set(NUMINVALID=1) SET VARIABLE NUMINVALID LOOP COUNTER ( KICK THEM OUT )
exten => _NXXNXXXXXX,n,Set(TIMEOUT(digit)=3) ; max wait in-between digits seconds
exten => _NXXNXXXXXX,n,Set(TIMEOUT(response)=3) ; max wait for digit entry seconds
exten => _NXXNXXXXXX,n,Ringing PLAY RING
exten => _NXXNXXXXXX,n(menu),Wait(1) IF YOU DO RINGING NEED WAIT
exten => _NXXNXXXXXX,n,Background(custom/open-recording) PLAY CUSTOM/OPEN-RECORDING ** EDIT TO NAME OF CUSTOM RECORDING YOU CREATED**
exten => _NXXNXXXXXX,n,Wait(3)
exten => _NXXNXXXXXX,n,Background(custom/open-recording) PLAY CUSTOME/OPEN-RECORDING AGAIN
exten => _NXXNXXXXXX,n,Wait(3)
exten => _NXXNXXXXXX,n,Dial(SIP/101,18) Dial extension 101 the receptionist can use (SIP/${EXTEN},18) 18 SECONDS THEN GO TO VOICEMAIL
exten => _NXXNXXXXXX,n,Voicemail(100@default,su) Default voicemail box, and use unavailable message
exten => 0,1,NoOp(Office-Open-Press-Zero)
exten => 0,n,Voicemail(100@default,su)
exten => 2,1,NoOp(Operator-Directory)
exten => 2,n,Directory(default,vm-operator,f) SENDS USER TO COMPANY DIRECTORY
exten => 200,1,NoOp(External-Voicemail-Dial-From-${CALLERID(num)}) UNANNOUNCED OPTION, BACKDOOR TO VOICEMAIL SYSTEM
exten => 200,n,Playback(vm-dialout)
exten => 200,n,Wait(1)
exten => 200,n,VoiceMailMain()
exten => _1XX,1,Macro(local-followme,${EXTEN}) DIAL BY EXTENSION USING LOCAL-FOLLOWME CONTEXT
exten => t,1,Playback(option-is-invalid)
exten => t,n,Hangup()
exten => i,1,Set(NUMINVALID=$[${NUMINVALID}+1]}) HANG UP AFTER 4 OR MORE INVALID OPIIONS
exten => i,n,Playback(option-is-invalid)
exten => i,n,Gotoif($[“${NUMINVALID}” < “4”]?:10) GO TO STEP 10 AFTER 4 INVALID TRIES
exten => i,n,Goto(_NXXNXXXXXX,menu)
exten => i,10,Playback(vm-goodbye) GOODBYE
exten => i,n,Hangup()
[inbound-closed]
exten => _NXXNXXXXXX,1,NoOp(Office-Closed)
exten => _NXXNXXXXXX,n,Set(NUMINVALID=1)
exten => _NXXNXXXXXX,n,Set(TIMEOUT(digit)=3)
exten => _NXXNXXXXXX,n,Set(TIMEOUT(response)=3)
exten => _NXXNXXXXXX,n,Ringing
exten => _NXXNXXXXXX,n(menu),Wait(1)
exten => _NXXNXXXXXX,n,Background(custom/closed-recording)
exten => _NXXNXXXXXX,n,Wait(3)
exten => _NXXNXXXXXX,n,Background(custom/closed-recording)
exten => _NXXNXXXXXX,n,Wait(3)
exten => _NXXNXXXXXX,n,Dial(SIP/101,18)
exten => _NXXNXXXXXX,n,Voicemail(100@default,su)
exten => 0,1,NoOp(Office-Open-Press-Zero)
exten => 0,n,Voicemail(100@default,su)
exten => 2,1,NoOp(Operator-Directory)
exten => 2,n,Directory(default,vm-operator,f)
exten => 200,1,NoOp(External-Voicemail-Dial-From-${CALLERID(num)})
exten => 200,n,Playback(vm-dialout)
exten => 200,n,Wait(1)
exten => 200,n,VoiceMailMain()
exten => _1XX,1,Macro(local-followme,${EXTEN})
exten => t,1,Playback(option-is-invalid)
exten => t,n,Hangup()
exten => i,1,Set(NUMINVALID=$[${NUMINVALID}+1]})
exten => i,n,Playback(option-is-invalid)
exten => i,n,Gotoif($[“${NUMINVALID}” < “4”]?:10)
exten => i,n,Goto(_NXXNXXXXXX,menu)
exten => i,10,Playback(vm-goodbye)
exten => i,n,Hangup()
[outbound]
exten => _NXXNXXXXXX,1,Dial(SIP/${EXTEN}@voip-outbound,120,trwW)
exten => _NXXNXXXXXX,n,Hangup()
exten => .,1,Playback(invalid)
exten => .,n,Hangup()
[internal]
; #_#_#_#_#_#_#_#_# INTERNAL MAIN CONTEXT #_#_#_#_#_#_#_#_#_#
; Extension to Extension Dialing
exten => _1XX,1,Macro(local-followme,${EXTEN})
; Call Pickup
exten => _*971XX,1,SET(GLOBAL(PICKUPMARK)=${EXTEN:2})
exten => _*971XX,n,Pickup(${EXTEN:2}@PICKUPMARK)
; Voicemail Access
exten => 1000,1,VoiceMailMain(${CALLERID(num)}@default)
exten => 2000,1,VoiceMailMain()
; Outbound Dialing
exten => _NXXXXXX,1,Answer
exten => _NXXXXXX,n,Set(CDR(userfield)=ib_${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${EXTEN}_${CALLERID(num)}) CUSTOM CDR
exten => _NXXXXXX,n,MixMonitor(ob_${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${EXTEN}_${CALLERID(num)}.wav) RECORD CALL
exten => _NXXXXXX,n,Set(CALLERID(num)=2242179435)
exten => _NXXXXXX,n,Goto(outbound,224${EXTEN},1) HARDCODED AREA CODE
exten => _NXXNXXXXXX,1,Answer
exten => _NXXNXXXXXX,n,Set(CDR(userfield)=ib_${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${EXTEN}_${CALLERID(num)})
exten => _NXXNXXXXXX,n,MixMonitor(ob_${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${EXTEN}_${CALLERID(num)}.wav)
exten => _NXXNXXXXXX,n,Set(CALLERID(num)=2242179435)
exten => _NXXNXXXXXX,n,Goto(outbound,${EXTEN},1)
exten => _1NXXNXXXXXX,1,Answer
exten => _1NXXNXXXXXX,n,Set(CDR(userfield)=ib_${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${EXTEN}_${CALLERID(num)})
exten => _1NXXNXXXXXX,n,MixMonitor(ob_${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}_${EXTEN}_${CALLERID(num)}.wav)
exten => _1NXXNXXXXXX,n,Set(CALLERID(num)=2242179435)
exten => _1NXXNXXXXXX,n,Goto(outbound,${EXTEN:1},1)
exten => t,1,Playback(invalid)
exten => t,n,Hangup()
exten => i,1,Playback(invalid)
exten => i,n,Hangup()
exten => .,1,Playback(invalid)
exten => .,n,Hangup()
[macro-local-followme]
exten => s,1,GotoIf($[${DB_EXISTS(followme/${ARG1})}=0]?nofollow)
exten => s,n,GotoIf($[${DB_RESULT:0:1}=0]?nofollow:follow)
exten => s,n(follow),Dial(SIP/${ARG1},20)
exten => s,n,Followme(${ARG1},n) ; Removed sa so no name recording
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s,n(nofollow),Dial(SIP/${ARG1},20)
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Voicemail(${ARG1},u) ; If unavailable, send to voicemail
exten => s-BUSY,1,Voicemail(${ARG1},u) ; I changed b to u. If busy, send to voicemail w/ busy ann
exten => _s-.,1,Goto(s-NOANSWER,1)
[outbound-follow-me]
exten => _NXXNXXXXXX,1,NoOp(follow-me-activated-${EXTEN})
exten => _NXXNXXXXXX,n,Set(CALLERID(num)=${IF($[ ${LEN(${CALLERID(num)})} = 3]?2242179435:${CALLERID(num)})})
exten => _NXXNXXXXXX,n,Goto(outbound,${EXTEN},1) REDIRECT CALLS TO FOLLOWME EXTENSION
exten => _1NXXNXXXXXX,1,NoOp(follow-me-activated-${EXTEN})
exten => _1NXXNXXXXXX,n,Set(CALLERID(num)=${IF($[ ${LEN(${CALLERID(num)})} = 3]?2242179435:${CALLERID(num)})})
exten => _1NXXNXXXXXX,n,Goto(outbound,${EXTEN:1},1)
exten => _1XX,1,Dial(SIP/${EXTEN},120,t)
exten => _1XX,n,Hangup()
[vm-operator]
exten => o,1,NoOp(operator-zero-out)
exten => o,n,Goto(vm-zero-menu,s,1)
; Direct Extension Dialing
exten => _1XX,1,Macro(local-followme,${EXTEN})
[vm-zero-menu]
exten => s,1,NoOp(operator-asterisk-out)
exten => s,n,Set(TIMEOUT(digit)=3)
exten => s,n,Set(TIMEOUT(response)=3)
exten => s,n,Background(custom/vm-operator-recording)
exten => s,n,Wait(3)
exten => s,n,Voicemail(100@default,su)
exten => 0,1,Voicemail(100@default,su)
exten => 1,1,NoOp(Operator-Directory)
exten => 1,n,Directory(default,vm-operator,f)
exten => 2,1,Voicemail(100@default,su)
exten => 3,1,Voicemail(100@default,su)
exten => 4,1,Voicemail(100@default,su)
exten => 5,1,Voicemail(100@default,su)
exten => 6,1,Voicemail(100@default,su)
exten => 7,1,Voicemail(100@default,su)
exten => 8,1,Voicemail(100@default,su)
exten => 9,1,Voicemail(100@default,su)
; Direct Extension Dialing
exten => _1XX,1,Macro(local-followme,${EXTEN})
exten => t,1,Playback(invalid)
exten => t,n,Hangup()
exten => i,1,Playback(invalid)
exten => i,n,Hangup()
exten => .,1,Playback(invalid)
exten => .,n,Hangup()
LAB CUSTOMIZING SIP.CONF
cat /etc/asterisk/sip.conf
Look at the file make changes to sip peers as needed like register for SIP PEER
password for users you created, username for SIPPEERS etc etc add more users and etc copy defaults from previous users
.