Asterisk Call File Example

Asterisk Call File Example

Asterisk Call Files

Asterisk Call Files are structured files that, when moved to the appropriate directory, are able to automatically place calls using Asterisk. Call files are a great way to place calls automatically without using more complex Asterisk features like the AGI, AMI, and dialplan, and require very little technical knowledge to use.

Print and download in PDF or MIDI Singin' in the rain. Made by CathyD. Singing In The Rain MIDI Files Backing Tracks Lyrics. Singing In The Rain is a popular recording artist in the Broadway and Stage. Singing In The Rain hits include Singing In The Rain. Good morning-singing in the rain midi

Page Contents

Asterisk comes with many professionally recorded sound files, which should be found in the default sounds directory (usually /var/lib/asterisk/sounds/). When you compile Asterisk, you can choose to install various sets of sample sounds that have been recorded in a variety of languages and file formats.

  • The ‘failed’ extension
  • Examples

The Asterisk dial plan extensions.conf responds to someone calling an extension on a channel. If you want to initiate a call from an external application, there are several ways to do this.

There are basically four ways to initiate outgoing calls in Asterisk

  • Use .call files. A call file is a text file that when placed in the correct directory makes Asterisk make an outgoing call.
  • Use the manager API to activate a call. See Asterisk manager dialout
  • Use the Asterisk CLI originate command
  • Asterisk cmd FollowMe command of Asterisk 1.4: Since this has the ability to fork (create multiple calls) it could be ‘misused’ to initiate outgoing calls.

New in Asterisk 1.8: A new application Originate has been introduced, that allows asynchronous call origination from the dialplan.

How Does It Work?

  • Move a call file into /var/spool/asterisk/outgoing/ (or the equivalent astspooldir directory defined in asterisk.conf).
  • If autoload=no in modules.conf be sure to load pbx_spool.so, otherwise, call files will not work.
  • If the modification date on the call file is in the future, Asterisk will wait until the system time matches the modification time before executing the call file.
  • Asterisk will notice and immediately execute the directives defined in the call file. This can include either connecting to an Asterisk dial plan context or performing a single Asterisk dial plan function call.
  • Asterisk will then remove the call file from the spooling directory (typically /var/spool/asterisk/outgoing).
  • Examples: See Minimal Call File Example and Syntax of Call Files sections.

Syntax of call files

  • Specify where and how to call
    • Channel: <channel>: Channel to use for the call.
    • CallerID: “name” <number> Caller ID, Please note: It may not work if you do not respect the format: CallerID: “Some Name” <1234>
    • MaxRetries: <number> Number of retries before failing (not including the initial attempt, e.g. 0 = total of 1 attempt to make the call). Default is 0.
    • RetryTime: <number> Seconds between retries, Don’t hammer an unavailable phone. The default is 300 (5 min).
    • WaitTime: <number> Seconds to wait for an answer. Default is 45.
    • Account: Set the account code to use.
  • If the call answers, connect it here:
    • Context: <context-name> Context in extensions.conf
    • Extension: <ext> Extension definition in extensions.conf
    • Priority: <priority> Priority of extension to start with
    • Set: Set a variable for use in the extension logic (example: file1=/tmp/to ); in Asterisk 1.0.x use ‘SetVar’ instead of ‘Set’
    • Application: Asterisk Application to run (use instead of specifying context, extension and priority)
    • Data: The options to be passed to application
  • New (?) in Asterisk 1.4
    • Set: Can now also write to dialplan functions like CDR()
    • AlwaysDelete: Yes/No – If the file’s modification time is in the future, the call file will not be deleted
    • Archive: Yes/No – Move to subdir “outgoing_done” with “Status: value”, where value can be Completed, Expired or Failed.

At least one of app or extension must be specified, along with channel and destination

Minimal Call File Example

The most minimal call file example that we can make does nothing more than dial a number, and play a sound file.

hello-world.call

Channel: SIP/trunkname/18882223333
Application: Playback
Data: hello-world

To run the call file above, you would type the following commands (we assume that the file already belongs to the asterisk user:

How does this work? Asterisk does the following when reading the above call file:

  • Dial the number 18882223333 out of the trunkname SIP trunk.
  • Once the call has been answered, play the sound file /var/lib/asterisk/sounds/hello-world (this sound file is included by default)
  • Hang up the call.

As you can see, this is a very minimal call file example.

The ‘failed’ extension

If the call is not answered, and the standard extensionfailed with priority 1 exists in the same context, control will jump there (feature introduced in either Asterisk 1.2 or 1.4. NOTE: This works in asterisk 1.2.14)

  • Note 1: This only works if you made the call with context, extension, and priority defined, and didn’t use the application, data form.
  • Note 2: This is a good place to update the CDR UserField with a value of the phone number that was being dialed using the SetCDRUserfield() application. Asterisk (as of 1.2.10) does not make the dialed channel (eg. IAX2/15551234567) available anywhere, so you have to pass it to yourself using Set: field of the .call file. (Along with anything else you won’t pass to the channel in this same variable).
  • Note 3: The ${REASON} channel variable receives a value that represents the reason why the call failed. See more on Asterisk Reason variable.

Example

In .call file:
Set: PassedInfo=15551234567-moreinfo-evenmoreinfo

extensions.conf
exten => failed,1,Set(NumberDialed=${CUT(PassedInfo,1)})
exten => failed,n,SetCDRUserField(${NumberDialed})

Scope of variables

  • Make sure you know what prefixing a variable with _ or __ does!
  • Especially Asterisk 1.0 and 1.2 behave differently for what concerns a) passing on variables to channels and b) global variables
  • Consider using Asterisk cmd DBget and Asterisk cmd DBget if you experience trouble passing variables

Creating and Moving Call Files

Because Asterisk can grab these files at any time (e.g. when the file is only 1 / 2 written), do not create the file directly in the /var/spool/asterisk/outgoing directory. Do something like this:

  • Create the call file in a different directory – e.g. /var/spool/asterisk/tmp/callfile-18882223333-01252010-104400.call
  • If Asterisk is running as a different user than you are creating the call file with (eg: If Asterisk runs as ‘asterisk’, but you are creating the call file as ‘root’,) then you will need to change the file’s ownership permissions before sending it to the Asterisk spooling directory: chown asterisk:asterisk /var/spool/asterisk/tmp/callfile-18882223333-01252010-104400.call
  • mv /var/spool/asterisk/tmp/callfile-18882223333-01252010-104400.call /var/spool/asterisk/outgoing/

This works because the Unix move operation (mv command) merely moves the “inode” — the pointer to the file — making the entire file appear all at once and eliminates the possibility that Asterisk could read and act upon a partially written file. (Note that this is only true if the source and destination are on the same file system; otherwise, it does the equivalent of a “cp”; see below.)

Note:Using the copy command (cp) is not a safe method for adding a file to the outbound directory since other programs can read the new file in the midst of the copy operation when the file is only partially written. If you want to use CP you should copy the file in your call file directory under permissions which don’t allow asterisk to read or remove it, then chown the file. This will save you from having to create an extra backup of the file.

VB Scripts for creating your call files from a simple text file and then moving the files to asterisk spool directory using pscp.

First, you have to create the text files using a text file that has all the phone numbers, this script expects the text file to be in the format of one phone number per line.
It then goes through the text file and creates a new subfolder in the current working directory for each 20 phone numbers it finds.
It uses the phone number as the file name for each call file. Each subfolder that contains 20 call files is named with a number starting from 1.
Once the call files are created using the second script to move it into the spool directory using pscp.
Pscp is a free file transfer program that works over SSH, before you use this script make sure you have putty on your machine, create a saved session on putty for your asterisk system.

Examples

Example 1

Filename: 1.call

Channel: Zap/1/1XXXXXXXXXXXX
MaxRetries: 2
RetryTime: 60
WaitTime: 30
Context: callme
Extension: 800
Priority: 2

This will hook up to priority 2 of extension 800 in context callme in extensions.conf.

Example 2

To create a call to 14109850123 on an analog channel in group 2 and then connect it to the hypothetical extension 84 (which would map to 84,1, Dial(SIP/84) ) inside your network, here’s the file you’d create in /var/spool/asterisk/outgoing:

Create the call on group 2 dial lines and set up some re-try timers

Channel: Zap/g2/14109850123
MaxRetries: 2
RetryTime: 60
WaitTime: 30

Assuming that your local extensions are kept in the context called [extensions]

Context: extensions
Extension: 84
Priority: 1

The above examples are good if you want to automatically play some recorded message or something automatic that must start when the other party picks up the phone. In fact, if you use the above for a conversation, you will have the outgoing phone ring, and when the other person picks up his phone, only then your extension starts to ring, so you miss the initial “hello” and maybe some more words!
If you have outgoing calls in your dialplan defined in the [outgoing] context, to call 14109850123 do this:

Example 3

To create a call to 14109850123 on a SIP phone called bt101, here’s the file you’d create in /var/spool/asterisk/outgoing (whatever name is good, of course, must be accessible and deletable by asterisk GNU/Linux user):

Channel: SIP/bt101
MaxRetries: 1
RetryTime: 60
WaitTime: 30

Assuming that your outgoing call logic is kept in the context called [outgoing]

Context: outgoing
Extension: 14109850123
Priority: 1

Example 4

Auto dial a number and play a prerecorded message, allow replay, and message acknowledgment
See: Auto-dial and Deliver Message

Example 5

To create a call to an internal or external extension connected to an AGI

Channel: Local/[email protected]
MaxRetries: 0
RetryTime: 15
WaitTime: 15
Application: AGI
Data: myagi.agi

On a trixbox/freepbx system this will dial internal extension 1000 (or you can put even an outside # here and it will follow outbound rules) and connect it to an AGI program. Note that unlike in extensions.conf where you can specify AGI(file.agi), here it must be separated. I use one agi to detect an incoming call to a special extension#, record the caller id, and then create the .call file to call back that number and connect it to a second agi.

Example 6: Use Asterisk as a PA system for emergency announcements.

Your Asterisk PABX can easily be used to send a voice message instantly to all (or a group of) phones.

It is quite easy to set this up. First, you need to record 2 prompt sounds:

pa-welcome.wav

Please record your broadcast after the beep. End by pressing the hash key

Outgoing

pa-confirm.wav

Press 1 to send your message to all phones. Press 0 to cancel.

In your dialplan you create a context called [pa-system] and you Goto that context if the user dials 911 (or any other extension you find appropriate).

exten => 911,1,Goto(pa-system,s,1)

[pa-system]
exten => s,1,Answer
exten => s,n,Wait(2)
exten => s,n,Playback(pa-welcome)
exten => s,n,Wait(1)
exten => s,n,Record(pa-message.wav)
exten => s,n,Wait(1)
exten => s,n,Background(pa-confirm)
exten => s,n,WaitExten(10)
exten => s,n,Hangup()
exten => 1,1,System(cp /etc/asterisk/pa-system/*.call /tmp/)
exten => 1,n,System(mv /tmp/*.call /var/spool/asterisk/outgoing/)
exten => 0,1, Hangup()

Now what the above context does is to copy call files that you have prepared from a directory you create under /etc/asterisk to the outgoing queue. To avoid timing problems we first copy the files to the temp directory and then move them to the outgoing queue.
The call file you create has to have the extension .call and is best to have the extension as file name. For example:

Filename: 218.call

Channel: SIP/218
Callerid: 911
MaxRetries: 10
RetryTime: 5
WaitTime: 20
Context: pa-call-file
Extension: 10

So all call files in the directory /etc/asterisk/pa-system have the same content, except for the first line where you put the channel (like Zap/1 of SIP/218)
The Context line refers to the context that will be executed. You have to create that context in you extensions.conf too:

[pa-call-file]
exten => 10,1,Answer()
exten => 10,n,Wait(1)
exten => 10,n,Playback(pa-message)
exten => 10,n,Wait(1)
exten => 10,n,Hangup()

And you have a functional PA system!

One more feature you can add:
If you use (SIP) phones that support a distinctive ringtone, you can program these phones to ring differently when Callerid 911 calls (to indicate it’s an emergency).

How to schedule a Call in the Future

Files with a modified date in the future are ignored until that time arrives. Create the file in /var/spool/asterisk/tmp, modify the mtime using “touch”, and then move it…

$ date
Mon Mar 19 13:52:30 EDT 2007
$ touch -d 20080101 /var/spool/asterisk/tmp/blah
$ mv /var/spool/asterisk/tmp/blah .
$ ls -l blah
-rw-r–r– 1 andrew users 0 Jan 1 00:00 blah

Bash example: to schedule a call in 100 s :

  1. gives you the current time in seconds since dawn of UNIX

NOW=`date +%s`

  1. add 100 seconds

let NOW=$NOW+100

  1. create a timestamp used by ‘touch -t’ (no space between %M. %S, but the Wiki wants a space at this place)

TOUCH_TMSP=`date -d “1970-01-01 $NOW sec GMT” +%Y%m%d%H%M. %S`

  1. and do the touch

touch -t $TOUCH_TMSP blah

Edit: many modern `touch ´ binaries support all -d options of `date ´. You can schedule a call in the future before moving it to /var/spool/asterisk/outgoing with

touch -d “1 week 2 days 4 hours 49 minutes 11 seconds” my_call_file_name

Tip on managing the number of simultaneous outbound calls

You can limit the number of simultaneous outgoing calls by managing the number of files in the outbound directory (/var/spool/asterisk/outgoing). For example, to limit Asterisk to only doing 10 simultaneous outdials just limit the number of files in the outbound directory to 10 at any one time. As the number decreases, you can move additional files into the directory to maintain the number of outgoing calls at the desired level.

Note: There are various user reports of Asterisk choking (=not processing some of the .call files) when too many files are moved simultaneously into the outgoing directory. Therefore it may be advisable to move them step-by-step with a slight delay.
However, even then it is possible that Asterisk once in a while ‘forgets’ to process a call file (seen e.g. in 1.0.9). Possible solutions:

  • 1. Find the cause and fix it in the source code,
  • 2. Use the Manager API which hopefully doesn’t exhibit this problem,
  • 3. Design your application to cope with this effect, for example, counter check the existence of CDR data against your .call file details (execution time, destination, accountcode etc).

More examples

  • Asterisk tips callback: How to create a callback system with .call files
  • Asterisk tips Wake-Up Call PHP: Create, manage and execute Wake-Up calls via phone

Callfiles and Call Detail Records

  • Avoid missing CDR records: Use either a) Context/Extension/Priority in the call file instead of Application/Data, or b) call a Local channel instead of directly calling the desired channel. Else Asterisk will bypass the process that tracks the call and no CDR record will be generated. When using Context/Extension/Priority, you are really using a Goto type function which just puts the call into the correct part of the dialplan and it is the same as if the caller had dialed the call manually and so the call is logged.
  • The phone number you are dialling will not be stored in the CDR by * – if you need this information for CDR processing you can set the CallerID in the call file to this number and it will be stored. However, this will present the person you are calling their own phone number, which doesn’t make much sense. A better solution might be to put the number you are dialing in the Set: channel variable in the .call file and later put it into the UserField of the CDR. See the example above in the first section.

Tips and hints

  • Create the call file elsewhere, and move it (better not use copy, see above) into the directory after you’re done creating it. Asterisk is very aggressive in grabbing these files, and if you’re still creating it when it grabs the file, you’ll get errors, so best to create first and then copy into the outgoing directory all at once.
  • The call file must be owned by the user asterisk runs as, so asterisk can utime() it, or you will get permission errors.
  • If you are using POTS (Plain Old Telephone System) lines attached to a channel bank with FXO cards, it’s likely that you will run into problems sensing when your callee picks up their phone – especially to cell phones. Once Asterisk hands off a call to an FXO line (ie, it starts to ring), the system counts the call as ‘answered’, and continues its merry way. This means that your voice prompts get played to a ring tone, and your users are presented with a silent call.

Some things to try:

    • In zapata.conf, try adding callprogress=yes above your channel => n definition for the FXO lines. (remember that settings set above the channel flow down, and that you need to clear this setting with a callprogress=no for any channels you might not want this to affect!)
      • This is experimental, only sometimes works, and only for North American tones.
      • On my system, this setting failed miserably, to the point that I could no longer make outgoing calls, and calls were dropped.
    • Another option (At least in example 3), is to repeat your message. Note the ResponseTimeout(2), to set the pause between repeats to 2 seconds, and the GoTo(s 1), to repeat the prompts.
    • Yet another option is to use an application like “WaitForSilence” that will wait for a certain amount of silence before beginning to play the message. See bugs.digium.com #2467 for this app, which will probably soon appear in CVS.
  • Try app_machinedetect.c application for the detection of answering machines. This works best with PRI, VoIP, or a POTS with callprogress enabled. (This will cause a ‘dead-air’ silent pause at the beginning of all calls and with well-chosen settings will not provide better than 80-90% accuracy.)
  • Be advised that, if you create a new .call file and move it into the outgoing Asterisk directory for processing AND it has the same file name as a .call file which was just processed, Asterisk will throw the new file in the bit bucket.

A Few Ideas

What Can You Do With This Interface?

  • Setup a cron job to dial out at specific times.
  • Stress-test your server for call load.
  • Prank call your friends with pre-recorded messages.
  • War dialing.
  • Auto-dialing / telemarketing.
  • Create an alarm program to wake you up in the mornings.
  • Create auto-callback functionality from your extensions.
  • Connect calls between your extension and a number using a web interface / other application.

The possibilities are endless!

Programming Libraries For Creating / Using CallFiles

There are several programming libraries that abstract file operations and simplify the call file process.

  • http://pycall.org pycall – A flexible python library for creating and using Asterisk callfiles.

See also

  • Asterisk CLI: originate command
  • (( ICTBroadcast )) from ICT Innovations – A web-based Multi-tenant Voice, Sms, Fax Broadcasting/autodialer software solution based on Asterisk Broadcast Demo available
  • WombatDialer can be used for auto-dial out scenarios, can be controlled manually or through easy APIs and encapsulates all logic for you (using multiple servers, handles and reschedules busy/lost/unanswered calls, runs multiple campaigns in parallel, keeps statistics, etc.)

Go back to Asterisk

Call files are perhaps one of the coolest things you can do with Asterisk. Just literally dump the file in a particular directory and voila, you can make a call. Past few days, I’ve been playing around with it quite a bit and would like to share some things with you on using the Local channel which is most beneficial since you may wish to take advantage of the dialplans and call flows defined in FreePBX (for instance).
Now, the Local channel does a lot such as checks if voicemail is enabled, call forwarding (follow-me) and other customization to the user’s account. It also would support the Device and User mode if that’s being used. The Local channel rather than using technology channels directly can help with several things again for example restrictions that may apply (context) for a particular user. Using channels like SIP/1000 and IAX/1000 will literally bypass all the good stuff that may have been setup.
In conjunction with asterisk call files e.g. .call. You can do lots! including lots of automation and what not just like how you would do using AMI or any AGI stuff if you know about them. Here I would like to show you how to take advantage of the Local channel in call files.
Channel: Local/2000@from-internal/n
CallerID: <0386892800>
MaxRetries: 0
RetryTime: 1
WaitTime: 10
Context: from-internal
Extension: 86892888
Priority: 1
Archive: no
Set: AMPUSER=2000
Now try modifying these above values to match your specific needs, e.g. channel 2000 is a user 2000 attached to device 1000, change that, change Extension to the destination you wish to bridge a call and here’s what’s important for device/user mode, you must specify the AMPUSER value otherwise, the macro-set-callerid will not be able to set right variables such as outbound CID for you since the Local/2000 will eventually be using SIP/1000 and SIP 1000 doesn’t really have anything more than just a connection agreement (username/password).
Create this file anywhere and then dump it into /var/spool/asterisk/outgoing and voila, you’ve got call.
Also, would like to share a script to automatically create and move files for you; note this will work with FreePBX 2.8 or higher and Asterisk 1.8.
1) nano /root/callgenerator.sh
2) Paste the script below
#!/bin/bash
user=$1
dial=$2
if [[ '$user' -eq ' ]]; then
echo 'ERROR No User / Destination Defined'
exit 2
fi
if [[ '$dial' -eq ' ]]; then
echo 'ERROR No Destination Number Specified'
exit 2
fi
# generate call file
mydate=`date +%d%m%y_%H%M%S`
filename='$mydate.U-$user-D-$dial.call'
#
# SUPPORT ONLY SIP
echo -e 'Channel: Local/$dial@from-internal/n
CallerID:
MaxRetries: 0
RetryTime: 1
WaitTime: 10
Context: from-internal
Extension:*60
Priority: 1
Archive: no
Set: AMPUSER=$user' > /var/spool/asterisk/$filename
# Call now
# File ops
chown asterisk:asterisk /var/spool/asterisk/$filename
mv /var/spool/asterisk/$filename /var/spool/asterisk/outgoing/ > /dev/null 2>&1
if [[ $? -ne 0 ]]; then
echo 'ERROR Parsefile crashed'
exit 2
else
echo Start calling.
fi
exit 0

3) Make it executable chmod +x /root/callgenerator.sh
Test it out like this /root/callgenerator.sh 2000 986892888 (where 2000 is the user’s phone that will first ring and once picked up, it will proceed with the other leg of the call i.e. 986892888, its important here to use from-internal otherwise, your dialplan routing and prefix handingling (in this case, the number 9) will not be stripped off when calling).
Asterisk Call File Example
© 2020