FreePBX Polycom Directory Automation

Creating a FreePBX Polycom directory for all of your users can be a frustrating and manual process.  The goal of this article is to make that process much much easier.  Once complete, you should have a central directory in all of your Polycom phones that shows all other employee extensions, and that central directory will update hourly from FreePBX’s database.

Create Script

First, log into your FreePBX via SSH as root.

Create a new application in /usr/local/sbin called polycom-dir.sh:

nano -w /usr/local/sbin/polycom-dir.sh

Credit where credit is due – I stole the base of this script from Thyrus Gorges – he did the bulk of the heavy lifting, and I simply modified the script a bit for easier use with FreePBX.  You can see Thyrus’s original post here.

Copy and paste the following into the polycom-dir.sh file:

#!/bin/bash

# Author: Thyrus Gorges
# Date: 2015/03/04

#The MIT License (MIT)

#Copyright (c) <2015> <Thyrus Gorges>

#Permission is hereby granted, free of charge, to any person obtaining a copy
#of this software and associated documentation files (the "Software"), to deal
#in the Software without restriction, including without limitation the rights
#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#copies of the Software, and to permit persons to whom the Software is
#furnished to do so, subject to the following conditions:

#The above copyright notice and this permission notice shall be included in
#all copies or substantial portions of the Software.

#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#THE SOFTWARE.


# Build a Polycom Directory XML file
# by pulling the usernames and extensions of all SIP users

# Set so we can loop on newlines instead of spaces
IFS=$'\n'

# MySQL Creds
SQLUSER=root
SQLPASS=""

# Declare our file
FILE=/tftpboot/000000000000-directory.xml

# Remove old file
rm $FILE

# ReCreate our file
touch $FILE


# Write the header of the file
# Passing the -e option to echo allows us to use tabs
echo -e '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' >> $FILE
echo -e '<!-- $RCSfile: 000000000000-directory~.xml,v $  $Revision: 1.3 $ -->' >> $FILE
echo -e '<directory>' >> $FILE
echo -e "\t<item_list>" >> $FILE


# Query Database
# We pass -N to MySQL so it doens't print headers
# CS:  Original command below, modified to remove password
# for i in $( mysql -u $SQLUSER -p$SQLPASS -N -e "use asterisk; select extension, name from users;" ); do
for i in $( mysql -u $SQLUSER -N -e "use asterisk; select extension, name from users;" ); do
        # Assign Variables to each field
        EXTEN=`echo $i | cut -f1`
        FN=`echo $i | cut  -f2 | cut -d" " -f1`
        LN=`echo $i | cut -d" " -f2`
        # The item tag is the beginning of a contact
        echo -e "\t\t<item>" >> $FILE
        echo -e "\t\t\t<ln> $LN </ln>" >> $FILE
        echo -e "\t\t\t<fn> $FN </fn>" >> $FILE
        echo -e "\t\t\t<ct> $EXTEN </ct>" >> $FILE
        echo -e "\t\t</item>" >> $FILE
done

# Write file endings
echo -e "\t</item_list>" >> $FILE
echo -e "</directory>" >> $FILE

Note that this script assumes that you are using the FreePBX default MySQL credentials of ‘root’ with no password.  If you are using different MySQL credentials, modify the script accordingly.

Once you have everything copied in, save and exit by doing CTRL+X followed by Y.

Next, make your new script executable:

chmod +x /usr/local/sbin/polycom-dir.sh

Run Script

Run the script as ‘asterisk’ user:

runuser -l asterisk -c '/usr/local/sbin/polycom-dir.sh'

Check /tftpboot for 000000000000-directory.xml file:

ls -la /tftpboot |grep xml

The 000000000000-directory.xml file should have a very recent time and date stamp.

Everytime this script runs, it will overwrite the previous version.

Automate Script

Next, let’s tell FreePBX to run it once an hour.

nano -w /etc/crontab

Append the following line to the bottom of the crontab file:

0 * * * * asterisk /usr/local/sbin/polycom-dir.sh

CTRL+X followed by Y to save and exit.

That’s it!  Reboot your Polycom phones, and they should now pick up this new FreePBX Polycom directory.