PBX Cheat Sheet
Notes on FreePBX, IncrediblePBX, and the like.
Installation
Copy the ISO to the SDHC card
- Download IncrediblePBX for Pi. See http://nerdvittles.com/?p=3026
- Unpack the tarball.
- Put the SDHC card in the card reader (assumes Linux).
- Run the
make-sdhc
script that came out of the tarball.
Put the Pi on the network
For security reasons, do not put the Pi outside your firewall!
Boot the Pi.
Put the SDHC card in the Pi, attach the HDMI port to a monitor, and boot.
Initial configuration
- Log in as
root
. Initial password israspberry
. - Allow IncrediblePBX to update itself.
- At the bash prompt, run
raspi-config
. - If the SD card has more than 4Gb, choose the menu item to expand the file system. (The ISO is only 4Gb, and Linux will only see that much, unless you expand the file system.)
- Possibly select the overclock option, as well.
- Enable the SSH daemon.
- Reboot.
In a terminal window on another machine, ssh
into the PBX machine.
Configure MySQL
The docs I’ve seen don’t say what the IncrediblePBX distribution uses for the MySQL root password, and it’s useful to be able to get into MySQL. Set the root password as follows:
# /etc/init.d/mysql stop
# mysqld_safe --skip-grant-tables &
# mysql -u root
mysql> use mysql;
mysql> update user set password=PASSWORD("NEW-PASSWORD") where user='root';
mysql> flush privileges;
mysql> quit
# /etc/init.d/mysql restart
# mysql -u root -p
Change the host name
Edit /etc/hostname
to reflect your desired host name. Then, run:
# hostname $(cat /etc/hostname)
Install and configure postfix
This is only necessary if you prefer postfix to the default exim.
# apt-get install postfix
A smart host relay is sufficient. Having a configured mail server allows the PBX to email voice mail audio files.
Using Gmail as a relay
First, you’ll need TLS support, which requires installing some supplementary packages.
# apt-get install libsasl2-modules
Next, add the following to /etc/postfix/main.cf
# Use Gmail as smart relay. See
# http://mhawthorne.net/posts/postfix-configuring-gmail-as-relay.html and
# http://anothersysadmin.wordpress.com/2009/02/06/postfix-as-relay-to-a-smtp-requiring-authentication/
relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_password
smtp_sasl_security_options = noanonymous
smtp_use_tls = yes
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/ssl/certs/ca-certificates.crt
Change masquerade_domains
appropriately, as well.
Finally, you have to add authentication parameters. Create
/etc/postfix/sasl_password
with the following contents:
[smtp.gmail.com]:587 gmailuser:gmailpassword
Replace gmailuser
with your Gmail login. If you use a Google Apps
domain account, use your domain email address as the user.
Then, run these commands:
# cd /etc/postfix
# postmap sasl_password
# chown postfix sasl_password*
Adjust your router’s firewall
With your Pi behind your firewall, you’ll have to open some ports. Configure your firewall to pass UDP ports 5060, 5061, and 10,000 through 20,000 to and from the Pi. If you’re using a Linux-based iptables firewall, the following rules should do the trick
EXT_IF=... # The external, Internet visible interface (e.g., eth0)
PBX=... # The internal IP address of your Raspberry Pi PBX machine
iptables -t nat -A PREROUTING -i $EXT_IF -p udp -m udp \
-dport 10000:20000 -j DNAT --to-destination $PBX
iptables -t nat -A PREROUTING -i $EXT_IF -p udp -m udp \
-dport 5060:5061 -j DNAT --to-destination $PBX
Configure the PBX
- Connect to the web server on the Pi.
- Select the administration logo.
- Log in as
admin
, with passwordadmin
. - Change the password, under the Admin > Administrators menu.
- Under the Settings menu, select Asterisk Settings.
- Set the NAT configuration.
Configuring Trunks
Google Voice
Log into your Google Voice account. In Settings, set:
- Call Screening – off
- Caller ID (incoming) – Display caller’s number
- Do Not Disturb – off
- Missed Calls – both options should be unchecked
- Call Options (Enable Recording) – off
- Global Spam Filtering – on
NOTE Disable 2-factor authentication on the account, or the PBX won’t be able to log in.
Next, set up a trunk in the PBX. Under Connectivity, select Google Voice (Motif). Create a new Google Voice trunk:
Typical Settings | |
---|---|
Google Voice Username | google username (see Note 1) |
Google Voice Password | password |
Google Voice Phone Number | phone number (see Note 2) |
Edit Trunk | checked |
Edit Outbound Routes | checked |
Send Unanswered Calls to Google Voicemail | _un_checked |
Leave all other settings alone.
Note 1: If you’re using a regular Gmail account with Google voice, your username should be only your username, with no “@gmail.com”. If you’re using a hosted Google Apps account, specify the username and the domain name.
Note 2: Specify the number without spaces or hyphens.
You’ll need to set an appropriate inbound route. (See below.) You can also use Google Voice as your outbound route.
Vitelity
Sample trunk configurations, using a subaccount
Outbound
Set Maximum Channels to 2.
Set the Outbound Caller ID to the number for the DID you’re using for outbound calls.
Set the trunk name under Outgoing Settings (e.g., vitel-out
).
Set PEER Details under Outgoing Settings to something like the following. Replace the username and secret to correspond to the Vitelity subaccount.
type=friend
dtmfmode=auto
username=subaccount_user
secret=subaccount_password
fromuser=subaccount_user
trustrpid=yes
sendrpid=yes
context=from-trunk
canreinvite=no
nat=yes
host=outbound.vitelity.net
Inbound
Set the trunk name under Incoming Settings (e.g., vitel-in
).
Set USER Details under Incoming Settings to something like the following. Replace the username and secret with the credentials of the Vitelity subaccount you’re using.
type=friend
dtmfmode=auto
username=subaccount_user
secret=subaccount_password
context=from-trunk
insecure=port,invite
canreinvite=no
nat=yes
host=inbound29.vitelity.net
Set the Register String. Again, replace the username and secret with the credentials of the Vitelity subaccount you’re using.
subaccount_user:subaccount_password@inbound29.vitelity.net:5060
If inbound calls aren’t working, be sure to set the provider route for the DID(s) appropriately, via the DIDs page on the Vitelity customer portal.
Configuring routes
Configure your trunks. (See above)
Inbound route
Define a new incoming route and set the DID Number field to the number associated with the trunk. You must ensure that the trunk passes the associated DID number, or routing won’t work.
Be sure to define a destination (e.g., a ring group or extension.)
Google Voice Note: If you want to route from a Google Voice trunk, just create a new route and put the Google Voice number in the DID Number field.
Outbound route
Define the route as normal, but be sure to use dial patterns so that outbound calls match the route.
Configuration for a single default outbound route
Route Settings | |
---|---|
Route Name | routename |
Route CID | CID |
Route Password | |
Route Type | [ ] Emergency [ ] Intra-Company |
Music On Hold? | [default] |
Time Group | [–Permanent Route–] |
Route Position | [–No Change–] |
Additional Settings | |
Call Recording | [Allow ] |
Dial Patterns that will use this Route | |
(…….) + [……..] | [1NXXNXXXXXX] / …..] | |
(…….) + [……..] | [N11……..] / …..] | |
(…….) + [……..] | [NXXNXXXXXX.] / …..] | |
(…….) + [……..] | [NXXXXXX….] / …..] |
(Dots in the above indicate blanks.)
Forwarding to an external number after so many rings
Two simple solutions:
Follow Me
- Applications > Follow Me
- Select the extension.
- Select hunt as the Ring Strategy.
- Add the number, with a trailing #, to the Follow-Me List.
- Optional: Adjust the ring time.
Note: If the target of an inbound route is a ring group, rather than an extension, you must include a “#” on the end of the extension in the ring group to force Follow Me behavior.
Chained ring groups
- Put the external number in its own ring group (e.g., ring group #601).
- Set the “Destination if no answer” to “Voicemail”.
- Put the main extension in different ring group (e.g., ring group #600), and point the inbound route at this ring group.
- In this primary ring group (#600), set the ring time appropriately.
- Set the “Destination if no answer” to go to the second ring group.
Ensuring that the original caller ID follows a forwarded call
Go into Advanced Settings and change SIP trustrpid and SIP sendrpid to
yes
.
Also, make sure you don’t have the Outbound CID set on the primary extension.
NOTE: This strategy may not work. The DID provider may not honor the PBX’s attempt to pass along the original caller ID. (Mine doesn’t; I always see the caller ID of the PBX’s outbound trunk.)
In that case, one solution is to modify the second ring group (#601, in the example above) so that “Confirm Calls” is checked. When the call is forwarded, the PBX (which knows the original caller ID) will play a short message (“press 1 to accept the call, 2 to reject it, 3 to listen to the caller ID information”). This approach provides a way to allow the callee to get the caller ID information, even though it’s not passed along by the telco. Be sure to configure enough ring time on the second ring group to permit the callee to listen to the message!
Ensuring that an extension only uses specific outbound routes
This is useful if you have, say, a home line and an office line on the same PBX, and you want to ensure that each one uses a specific outbound route.
Solutions proposed on the web include:
- Using the complicated, and unsupported, Custom Contexts module. This is a potentially dangerous module that can totally bork your PBX.
- Using something called Extension Routing, by SchmoozeCom; getting it requires a complicated registration procedure at SchmoozeCom, one that doesn’t appear to work with Incredible PBX.
- Using a dial pattern to specify individual internal extension caller IDs on each outbound route.
(I have not gotten this working yet.)
Modifying the inbound caller ID.
- Install the Set Caller ID module. This module works as a filter.
- Create a new Set Caller ID, editing the inbound caller ID as appropriate.
- Set the new Set Caller ID’s destination to be the desired extension or ring group. If adding a prefix (e.g., “H” to indicate that the call came into the home line), it’s best just to modify the caller ID name.
- Go to the appropriate inbound route and set its destination to the new Set Caller ID.
Hold Music
Converting the music file
FreePBX works best with 8- or 16-bit monoaural, 8,000-Hz WAV files. If you’re starting with an MP3, first convert it to a WAV file:
$ lame --decode mymusic.mp3 mymusic.wav
Then, use sox
to convert it to the correct format:
$ sox mymusic.wav -r 8000 -s -b 8 -c 1 mymusic2.wav
Installing the music file
FreePBX support hold music categories. While the Settings > Music On Hold screen supports uploading files and creating new categories, it doesn’t always work. It’s easier to do the whole thing from the command line.
- Copy your converted WAV file(s) to the PBX machine.
- SSH into the PBX.
cd
to/var/lib/asterisk/moh
- If you want the new music to be in the
Default
category, copy the WAV files to that directory. Otherwise, create a subdirectory for the new category (e.g.,mkdir Classical
for a “Classical” category), and copy the WAV files into that directory. - Restart the PBX via:
amportal restart
- Log into the PBX web portal, go to Settings > Music On Hold, and verify that (a) the new category is there and (b) the files you copied are listed.
Using the new category
The on-hold music category is specified in the Inbound Routes configuration.
Misc. Admin
Restarting Asterisk
# amportal restart
Changing the log level
First, ensure that the FreePBX Asterisk Logfiles module is installed.
- Within the FreePBX web UI, go to Admin > Module Admin
- Click the Check Online button
- Location the Asterisk Logfiles module and install it, if it isn’t already installed.
Next, adjust the logging.
- Go to Settings > Asterisk Logfile Settings
Backups
Needless to say, it’s a really good idea to backup your PBX. It’s possible to screw things up beyond the point of recovery (especially using experimental modules like Custom Contexts).
To schedule a routine backup, ensure that the Backup and Restore module is installed. (By default, it should be.) Then, go to Admin > Backup. The “Full Backup” template is a reasonable place to start.
Backups are written to /var/spool/asterisk/backup
. Copying this directory
off to another machine is also a wise idea.
Troubleshooting
Can’t access voicemail
Password not accepted
You enter the password on the phone handset, but it isn’t accepted. Common problem: The phone isn’t a SIP phone, and you’re using an adapter, but the adapter’s DTMF method isn’t set to “SIP INFO” for that extension. Set the DTMF method to “SIP INFO” and try again.
Feature Codes
These are the default settings. To change them, use the web admin UI and go to Admin | Feature Codes.
Feature | Code |
---|---|
Blacklist | |
Blacklist a number | *30 |
Blacklist the last caller | *32 |
Remove a number from the blacklist | *31 |
Call Forward | |
Call Forward All Activate | *72 |
Call Forward All Deactivate | *73 |
Call Forward All Prompting Activate | *720 |
Call Forward All Prompting Deactivate | *74 |
Call Forward Busy Activate | *90 |
Call Forward Busy Deactivate | *91 |
Call Forward Busy Prompting Activate | *900 |
Call Forward Busy Prompting Deactivate | *92 |
Call Forward No Answer/Unavailable Activate | *52 |
Call Forward No Answer/Unavailable Deactivate | *53 |
Call Forward No Answer/Unavailable Prompting Activate | *520 |
Call Forward Toggle | *740 |
Call Waiting | |
Call Waiting - Activate | *70 |
Call Waiting - Deactivate | *71 |
Conferences | |
Conference Status | *87 |
Core | |
Asterisk General Call Pickup | *8 |
ChanSpy | 555 |
Directed Call Pickup | ** |
In-Call Asterisk Attended Transfer | *2 |
In-Call Asterisk Blind Transfer | ## |
In-Call Asterisk Disconnect Code | ** |
In-Call Asterisk Toggle Call Recording | *1 |
Simulate Incoming Call | 7777 |
User Logoff | *12 |
User Logon | *11 |
ZapBarge | 888 |
Do-Not-Disturb (DND) | |
DND Activate | *78 |
DND Deactivate | *79 |
DND Toggle | *76 |
Fax Configuration | |
Dial System FAX | 666 |
Follow Me | |
Findme Follow Toggle | *21 |
Wake Up Calls | |
Wake Up Calls | *68 |
Info Services | |
Call Trace | *69 |
Echo Test | *43 |
Speak Your Exten Number | *65 |
Speaking Clock | *60 |
Misc Applications | |
Apps IVR Demo | 3366 |
Time of Day | *61 |
Parking Lot | |
Pickup ParkedCall Prefix | *85 |
Recordings | |
Check Recording | *99 |
Save Recording | *77 |
Time Conditions | |
All: Time Condition Override | *27 |
Voicemail | |
Dial Voicemail | *98 |
Direct Dial Prefix | * |
My Voicemail | *97 |
References
- A Newcomer’s Guide to PBX in a Flash: http://nerdvittles.com/?p=755
- Incredible PBX Quick Start Guide: http://nerdvittles.com/?p=3026