Book Review: Asterisk 1.6

The folks at Packt Publishing recently sent me a copy of Asterisk 1.6 by David Merel, Barrie Dempster and David Gomillion and I’ve been using it for the past week or so to set up a fresh instance of Asterisk 1.6 on Ubuntu 8.04.

(Note – like many Asterisk books, this one is very CentOS focused, but I found the installation and configuration steps described in it – as well as some of the larger Asterisk management concepts – easily applied to Debian-based distros like Ubuntu.)

This is a solid, well-written book for anyone that wants to start building and managing an Asterisk-based telephony system. I found this book to be very well focused on concepts that would appeal to someone who wants to manage an Asterisk system professionally, and is probably less well suited for someone interested in tinkering with Asterisk as a hobby.

There is a good discussion of some of the key concepts that someone who aspires to be (or already is) an Asterisk professional should have a handle on. It has a very good discussion on hardening an Asterisk server in the chapter on “Maintenance and Security”, and the book begins (very appropriately) with an exercise in developing a deployment plan – again, probably not well suited for an Asterisk or VoIP tinkerer, but critical for someone who is going to deploy an Asterisk server in a production environment and assume responsibility for managing it.

I didn’t see any discussion of some of the more cutting edge features of Asterisk 1.6 that might be of interest to someone wanting in exploring alternative communication protocols (Jabber/Jingle) or some of the less mainstream channel drivers (GTalk, Skype, etc.) There is no mention at all (that I could see) of how to connect Asterisk to Google Talk via Jingle, or to the Skype network via Skype for Asterisk. Nor is there any mention of some of the IM-focused dialplan applications like JabberSend().

This book appears to be designed for someone who wants to set up and manage a more traditional Asterisk-based system. And for that purpose it is very well suited.


Customizing Caller ID with CiviCRM and trixbox

Recently, I had an opportunity to set up a CiviCRM site for a client to use to track contributors.

I think CiviCRM is a great piece of software that can be enormously useful to non-profit organizations, and I’m actually surprised that more don’t opt to use it. It’s powerful, robust, extensible and open source.

The site I set up is running a Red Hat-based LAMP stack with Drupal, CiviCRM and the CiviContribute module. I have the same set up mirrored in a local development environment that lets me test tweaks and upgrades to the site before they get pushed out into production. I also have an instance of trixbox CE running locally, and I decided to try and see if I could set up a trixbox PBX that uses CiviCRM as the data source for looking up caller information on inbound calls. This way, if a non-profit is using both CiviCRM and trixbox they could set their PBX to look up information about clients, donors, volunteers, etc. that call their offices and display this information in either a SIP client or in a screen pop.

The process of setting up trixbox to use CiviCRM as the data source for caller ID lookups couldn’t be easier (note, I used these steps on trixbox version

  1. Log into your trixbox and enter admin mode.
  2. From the toolbar, select PBX >> PBX Settings.
  3. From the FreePBX left-hand side menu (under “Inbound Call Control”), select CallerID Lookup Sources
  4. In the section entitled “Add Source”, enter the Source Description (CiviCRM), and Source Type (MySQL). Using Cache Results will cache the CID lookup in AstDB. Depending on your own set up, you may or may not feel the need to enable this setting.
  5. In the section entitled “MySQL” (appears after you designate the Source Type), enter the Host, Database, Username and Password to access your CiviCRM database.
  6. The section entitled Query is where you will enter the SQL query that will return the information you want to display about on incoming calls. I used the following SQL (you can modify this as you like to alter your display information – note, the special token ‘[NUMBER]’ is replaced with the caller ID of the incoming call):

  7. SELECT CONCAT('CiviCRM: ',display_name) FROM civicrm_contact WHERE id = (SELECT id FROM civicrm_phone WHERE REPLACE(phone, '-', '') = SUBSTRING('[NUMBER]',-10))

  8. Click Submit Changes.
  9. Navigate to Inbound Routes (also under the “Inbound Call Control” section of the FreePBX menu).
  10. Select the route that you would like to use CiviCRM as the data source for.
  11. In the section entitled “CID Lookup Source”, select CiviCRM from the drop down menu.
  12. Click Submit.
  13. Scroll to the top of the page and click on the orange bar that says Apply Configuration Changes and reload the settings.

Thats it!

Now on an inbound call, the name of the CiviCRM contributor in the format CiviCRM: John Doe is displayed in my SIP client whenever a successful lookup occurs. There are all sorts of options that can now be used to display the caller information to non-profit staff, send a screen pop, route the call to a specific destination, etc.

CiviCRM and trixbox are a potent combination. I hope this brief explanation of how to use the two together gets more non-profits excited about using them.

Screen Pops with Asterisk and XMPP

A few weeks ago, I wrote a post on using CCXML and PHP to do screen pops with the Voxeo Prophecy platform. The task was made incredibly easy with a nifty PHP class library designed specifically to interact with XMPP servers.

After getting screen pops working in Prophecy, I decided to try my hand at getting them to work in Asterisk (this is, after all, how the majority of phone calls to me are handled). It turns out, the PHP script I developed to do screen pops in Prophecy can be reused to do the very same thing in Asterisk. If you’d like to give this a try on your own, here is what you will need:

  1. A working Asterisk instance. (This example assumes you know how to modify Asterisk config files.)
  2. A copy of the very cool XMPPHP library from Google Code. (This example assumes that the PHP code used to interact with XMPP servers is running on a separate server than the one housing Asterisk. More on this below.)
  3. An XMPP server and a client, or simply use your Google account.

There are three components to this example. First, you’ll need a PHP script to interact with an XMPP server. You can use the same script employed in my previous screen pop example:

$conn->message('', 'You are receiving a call from: $ani');

Next, you’ll need a simple AGI script for Asterisk to interact with. This script will send an HTTP request to the PHP script above:

# Contents of screen_pop.agi
# It don't get any easier than this...
curl http://ip_address_to_your_web_server/screen_pop.php?ani="$1"

On your Asterisk server, place this script in /var/lib/asterisk/agi-bin/ and ensure that it is executable. You’ll need to specify the IP address to the server running this script. Note — there isn’t any reason that these two scripts can’t run on the same machine (you can run PHP scripts on an Asterisk server), or even be consolidated into one single script (just make sure to include the XMPPHP library). In fact, you could even run the XMPP server used to send screen pops on the same machine running Asterisk.

The mechanics of this specific example were influenced by the set up for my previous screen pop example, and I am (at heart) a lazy basterd. But I digress…

The last piece to be put in place is to modify extensions.conf to ensure that our AGI script is invoked. You’ll want to add something like the following to the appropriate dial plan context (your specific Asterisk set up will influence this heavily):

exten => 123,1,AGI(screen_pop.agi|${CALLERID(num)})

This will pass the caller ID to our AGI script, which will then invoke the PHP script and send the details of the call to the XMPP account of our choice. I’ve noticed in practice that adding this to my dial plan causes the IM to be sent to my Google Talk account a good 2-3 seconds before the phone rings. Plenty of time to give someone a heads up about who is on the other end of an incoming call.

Obviously there are lots of options for looking up information on the caller, once you have their caller ID, that you can use to augment the information in your screen pop.

Just goes to show you, there isn’t much you can’t do with open source / open standards.

Viva screen pop!

Fonality announces trixBox Pro

Some very cool news today from Fonality, stewards of the trixBox project — trixBox Pro is essentially a blending of trixBox with Fonality’s PBXtra, but the whole definitely seems to be greater than the sum of it’s parts:

With trixBox Pro, users can enjoy both basic and many advanced VoIP features — conferencing, unified messaging, presence features, embedded secure corporate chat, Outlook integration, and more.

Perhaps the most exciting new feature included with trixBox Pro is trixNet, the equivalent of a private VoIP peering service, which essentially connects trixBox Pro users to one another without connecting to the PSTN, regardless of the service provider either party uses. When a user places a call, trixNet quickly checks its database to determine whether the called party is also part of trixNet, and if not, routes the call to the PSTN. Additionally, the system has also been designed to detect connection times and reroute calls to the PSTN if calls are not connected within one second.

What is even cooler — trixNet is expected to be extended to trixBox CE (the stand alone version of trixBox) and to users of Google Talk in the near future.

Nice — can’t wait to get mine!

Top 5 Things to do after intalling Trixbox: #2

Once you’ve got your Trixbox all set up, you need to think about backups – what happens if your system needs to be restored, or if you’re doing and upgrade (say from version 2.0 to 2.2)?

The FreePBX module in Trixbox has a handy “System Backup” feature – in FreePBX, go to Tools->Backup & Restore.

Click on the “Add Backup Schedule” link and name your new schedule – I personally take the simple approach of just doing a weekly backup on Sunday night.

When your backup is created, Trixbox places a “.tar.gz” file in the /var/lib/asterisk/backups/ directory. So, if you created a schedule called “Weekly” your backup file would be placed in the directory /var/lib/asterisk/backups/Weekly/. Here these files will stay – a new one is created each time your scheduled backup is run – unless you do something with them.

For obvious reasons, we want to move these backup files to another server for safe keeping. Additionally, one we’ve successfully moved our backup, we want to clean up the old files from our backup directory.

There are any number of ways of doing this. Here is my preferred method:

Create a new user on your Trixbox machine, and add that user to the “asterisk” group. (The user will need to be a part of this group to access the backups directory.)

useradd -G asterisk backup
passwd backup

Log in as this new user, and create a key pair for ssh connections. When prompted to enter a pass phrase, simply hit enter (blank pass phrase).

ssh-keygen -t dsa

Export your public key to the machine where you will be storing your backups.

scp ~/.ssh/

Make sure you can SSH to the machine where you will store your back up files. You’ll want to make sure that key-based authentication is working (i.e., that your not prompted for a password).


Make sure you can securely copy files to the machine where you will store your back up files (again, make sure that your not prompted for a password).

scp /var/lib/asterisk/backups/Weekly/*

If all of the above steps went successfully, you are now ready to set up your automated process. We’ll use CRON to do this.

Log on as the new backup user on your Trixbox machine.

Create a new crontab for this user.

crontab -e

Insert cron entries to copy backup files to the remote machine, and to clean up old files after they have been moved.

01 0 * * 1 scp /var/lib/asterisk/backups/Weekly/*

01 1 * * 1 rm -f /var/lib/asterisk/backups/Weekly/*

The first entry will move our weekly backup file at 12:01 a.m. on Monday morning to our remote server. The second entry will clear the Weekly directory an hour later. This way, when you go to the office on Monday, all of your backup process are done and your ready to start the week on a good note.

In the next article, we’ll discuss how to monitor your Trixbox to make sure that it is performing properly.

Top 5 Things to do after intalling Trixbox: #1

Today I’ll start a series that I’ve been meaning to commit to writing for some time. The top 5 things to do after you finish installing Trixbox.

Trixbox 2.2 is now out, so if you’ve ever thought about setting up your own VoIP system I would strongly recommend giving Trixbox a try. The Trixbox forums provide a wealth of information, and there is some documentation available from the Trixbox project itself. However, most of the documentation focuses on the installation process, and does not provide a whole lot of information about what to do after your system is installed and running.

With this in mind, I’d like to share some of the things that I think are important to ensuring that your Trixbox system is running smoothly (and securely).

First things first — we need to lock down SSH.

If your not familiar with SSH, you should brush up on this remote connection method. Right out of the gate SSH is a more secure way of connecting to a Linux machine than alternatives like Telnet, but that doesn’t mean it’s perfect.

At a minimum, the following steps should be taken to improve SSH security:

  • Run SSH on an alternate port (the default is port 22).
  • Only use the SSH 2 protocol (SSH 1 is not as secure as 2)
  • Do not allow root logins via SSH (in fact, it’s a much better approach to only allow specifically named users to log in via SSH, but never root).
  • Use public key authentication, instead of passwords.

There are a number of other helpful tips and tricks available here.

Next up, we’ll walk through the process of backing up a Trixbox system and transferring the backup to a remote machine using scp and cron.