A2Billing v2 Install Guide


A2BillingThis guide will show how to install A2Billing v2.x on a Redhat Enterprise Linux v6 based system.  It is assumed you already have Linux and Asterisk and FreePBX installed using a procedure similar to this one.  It is also assumed you have compiled asterisk realtime driver module (res_config_mysql) by selecting it in asterisk menuselect before compiling asterisk. We do not cover the installation of the callback daemon.

Tested using the following software:

The following 2 diagrams illustrate A2billing inbound and outbound call flow.

Inbounc call flow

Outbound call flow

All commands are assuming you are at run level 3 running in a shell as root.  In other words, not in a Gnome/KDE GUI and not using a limited access account.

Install EPEL repo

If not already done so.

yum install epel-release
yum update

Install additional required packages if not already installed

yum -y install php-mcrypt php-xml perl-DBD-Pg git

If using this procedure on an Asterisk only system without freepbx, you still need many of the freepbx required packages installed such as php.  They can be found at the beginning of this procedure.

Get A2Billing source
cd /usr/src
git clone https://github.com/Star2Billing/a2billing.git

Get vendor packages using composer

cd /usr/src/a2billing
curl -sS https://getcomposer.org/installer | php
php composer.phar update
php composer.phar install

Create MySQL root password

If you did not create a mysql root password during the asterisk install you should create one now.

mysqladmin -u root password 'rootmysqlpassword'

If MySQL root password already exists

If you get access denied the password has already been set.  For PowerPBX install guide a password of abcdef was used.  For distributions such as PiaF, the password might be passw0rd.  This will be the password the following commands will ask for.

If you do not know the MySQL root password and want to change it

If you do not know what it is this guide has a procedure for changing the MySQL root password which is as follows.  Otherwise skip down to Create A2Billing Database.

#service mysqld stop
# mysqld_safe --skip-grant-tables &
If you don't see a command prompt (#) appear press the ENTER key and you should get it.
mysql --user=root mysql
update user set Password=PASSWORD('new-root-password') where user='root';
service mysqld restart

Create A2Billing Database

cd /usr/src/a2billing
mysql -u root -p < DataBase/mysql-5.x/a2billing-createdb-user.sql

which, after you enter your root password, will create:

Database name: mya2billing
Database user: a2billinguser
Database user password: a2billing

Now run script to create tables and insert some basic configuration data

cd /usr/src/a2billing/DataBase/mysql-5.x

Answer questions as follows:

  • Enter Database Name: mya2billing
  • Enter Hostname: localhost
  • Enter UserName: root
  • Enter Password: {mysql-root-password...not a2billing db password}

Now check that the database and 90+ tables have been created

mysql -u root -p mya2billing
>show tables;

Should produce

| Tables_in_mya2billing    
| +-----------------------+
| cc_agent                |
| cc_agent_commission     |
| cc_agent_signup         |
. . .                     |
| cc_ui_authen            |
| cc_version              |
| cc_voucher              |
97 rows in set (0.00 sec)
cp /usr/src/a2billing/a2billing.conf /etc/

Make sure the following parameters are set as shown.

nano /etc/a2billing.conf
hostname = localhost
port = 3306
user = a2billinguser
password = a2billing
dbname = mya2billing
dbtype = mysql

Create files and set permissions

Only required if not using Asterisk Realtime.  If unsure then proceed as if you are not using Asterisk Realtime.  Some of these files assume you have FreePBX installed and not just Asterisk.  If you just have Asterisk installed then use the files specified in the INSTALL.rst instructions included with A2billing source files.

chmod 777 /etc/asterisk
touch /etc/asterisk/additional_a2billing_iax.conf
touch /etc/asterisk/additional_a2billing_sip.conf
echo \#include additional_a2billing_sip.conf >> /etc/asterisk/sip_custom.conf
echo \#include additional_a2billing_iax.conf >> /etc/asterisk/iax_custom.conf
chown -Rf asterisk:asterisk /etc/asterisk/additional_a2billing_iax.conf
chown -Rf asterisk:asterisk /etc/asterisk/additional_a2billing_sip.conf

Run sound installation script

cd /usr/src/a2billing/addons/sounds
chown -R asterisk:asterisk /var/lib/asterisk/sounds/

Add the following to /etc/asterisk/manager_custom.conf

You can also do it via the FreePBX Asterisk API module.  If you don't have FreePBX installed then you should follow the INSTALL.rst instructions included with the a2billing source files.


Set up a2billing web folders

A2billing has 3 GUIs.  admin, agent, and customer.

mkdir /var/www/html/a2billing

Directory may already exist.

cp -rf /usr/src/a2billing/admin /var/www/html/a2billing
cp -rf /usr/src/a2billing/agent /var/www/html/a2billing
cp -rf /usr/src/a2billing/customer /var/www/html/a2billing
cp -rf /usr/src/a2billing/common /var/www/html/a2billing
cp -rf /usr/src/a2billing/vendor /var/www/html/a2billing
chown -R asterisk:asterisk /var/www/html/a2billing
chmod 755 /var/www/html/a2billing/admin/templates_c
chmod 755 /var/www/html/a2billing/customer/templates_c
chmod 755 /var/www/html/a2billing/agent/templates_c
Protect /vendor folder
echo 'Deny from all' > /var/www/html/a2billing/vendor/.htaccess

Check admin web interface

From a web browser go to (http://{my-ip-address}/a2billing/admin) and make sure you get the authentication screen.  Log in as follows.

user: root
password: changepassword

Once logged in click change password link at bottom left and change it.

Set up AGI

mkdir /var/lib/asterisk/agi-bin
cd /usr/src/a2billing/AGI               
cp a2billing.php /var/lib/asterisk/agi-bin
cp a2billing_monitoring.php /var/lib/asterisk/agi-bin
chown -R asterisk:asterisk /var/lib/asterisk/agi-bin
chmod 755 /var/lib/asterisk/agi-bin/a2billing.php
chmod 755 /var/lib/asterisk/agi-bin/a2billing_monitoring.php
ln -s /var/www/html/a2billing/common/lib /var/lib/asterisk/agi-bin/lib
ln -s /var/www/html/a2billing/vendor /var/lib/asterisk/vendor

Add the following extensions to /etc/asterisk/extensions_custom.conf

If not using FreePBX then this would go into /etc/asterisk/extensions.conf.  These are just examples.  Depending on what you are doing and how you are doing it some may not apply and some may not work.  Customizing this to your needs is considered beyond the scope of this document.  Search for documentation on Asterisk custom extensions and dialplans.  If possible try find examples specific to A2Billing.

nano /etc/asterisk/extensions_custom.conf
exten => s,1,GotoIf($["${OUT_${DIAL_TRUNK}:4:4}" = "A2B/"]?custom-freepbx-a2billing,${OUTNUM},1:2)
exten => s,2,MacroExit

exten => _X.,1,DeadAGI(a2billing.php,${OUT_${DIAL_TRUNK}:8})
exten => _X.,n,Hangup()

exten => _X.,1,Answer
exten => _X.,n,Wait(1)
exten => _X.,n,deadAGI(a2billing.php,1)
exten => _X.,n,Hangup

exten => _X.,1,deadAGI(a2billing.php,1,callback)
exten => _X.,n,Hangup

exten => _X.,1,deadAGI(a2billing.php,1,cid-callback,34) ;last parameter is the callback area code
exten => _X.,n,Hangup

exten => _X.,1,deadAGI(a2billing.php,1,all-callback,34) ;last parameter is the callback area code
exten => _X.,n,Hangup

exten => _X.,1,deadAGI(a2billing.php,1,did)
exten => _X.,2,Hangup

; CallingCard application
exten => _X.,1,NoOp(A2Billing Start)
exten => _X.,n,DeadAgi(a2billing.php|1)
exten => _X.,n,Hangup

exten => _X.,1,Answer(1)
exten => _X.,n,DeadAgi(a2billing.php|1|voucher)
;exten => _X.,n,AGI(a2billing.php|1|voucher|44) ; will add 44 in front of the callerID
exten => _X.,n,Hangup

exten => _X.,1,deadAGI(a2billing.php,1,did)
exten => _X.,2,Hangup

exten => _X.,1,deadAGI(a2billing.php,1)
exten => _X.,n,Hangup

Go into FreePBX GUI>Setup>Trunks>Add Custom Trunk give it a name and add the following dial string:


This is the trunk that is used to send calls out via A2Billing.  Simply select this trunk in outbound routes.  The /1 refers to which agi-conf is going to be used.

Add custom destinations to FreePBX via FreePBX GUI>Tools>Custom Destinations

These destinations are referring to the custom extensions created above in /etc/asterisk/extensions_custom.conf

Custom Destination: custom-a2billing,${EXTEN},1 
Destination Quick Pick: (pick destination)
Description: A2Billing - Callthrough

Custom Destination: custom-a2billing-did,${EXTEN},1 
Destination Quick Pick: (pick destination)
Description: A2Billing - DID

Start or restart FreePBX

amportal restart

Recurring Services

Recurring services are handled via the /etc/crontab. Make directory for A2Billing cron PID

mkdir -p /var/run/a2billing
chown asterisk:asterisk /var/run/a2billing

Copy cron files to some permanent location such as /usr/local

mkdir -p /usr/local/a2billing
cp -R /usr/src/a2billing/Cronjobs /usr/local/a2billing/
ln -sf /var/www/html/a2billing/common/lib /usr/local/a2billing/Cronjobs/lib
chown -R asterisk:asterisk /usr/local/a2billing

Add the cron jobs to /var/spool/cron/asterisk

# update the currency table
0 6 * * * php /usr/local/a2billing/Cronjobs/currencies_update_yahoo.php

# manage the monthly services subscription
0 6 1 * * php /usr/local/a2billing/Cronjobs/a2billing_subscription_fee.php

# To check account of each Users and send an email if the balance is less than the user have choice.
0 * * * * php /usr/local/a2billing/Cronjobs/a2billing_notify_account.php

# this script will browse all the DID that are reserve and check if the customer need to pay for it.
# bill them or warn them per email to know if they want to pay in order to keep their DIDs.
0 2 * * * php /usr/local/a2billing/Cronjobs/a2billing_bill_diduse.php

# This script will take care of the recurring service.
0 12 * * * php /usr/local/a2billing/Cronjobs/a2billing_batch_process.php

# To generate invoices and for each user.
0 6 * * * php /usr/local/a2billing/Cronjobs/a2billing_batch_billing.php

# to proceed the autodialer
*/5 * * * * php /usr/local/a2billing/Cronjobs/a2billing_batch_autodialer.php

# manage alarms
0 * * * * php /usr/local/a2billing/Cronjobs/a2billing_alarm.php

# manage archive
0 12 * * * php /usr/local/a2billing/Cronjobs/a2billing_archive_data_cront.php

0 10 21 * * php /usr/local/a2billing/Cronjobs/a2billing_autorefill.php
15 * * * * php /usr/local/a2billing/Cronjobs/a2billing_batch_cache.php

Add log files

mkdir -p /var/log/a2billing
touch /var/log/a2billing/cront_a2b_alarm.log
touch /var/log/a2billing/cront_a2b_autorefill.log
touch /var/log/a2billing/cront_a2b_batch_process.log
touch /var/log/a2billing/cront_a2b_archive_data.log   
touch /var/log/a2billing/cront_a2b_bill_diduse.log   
touch /var/log/a2billing/cront_a2b_subscription_fee.log   
touch /var/log/a2billing/cront_a2b_currency_update.log   
touch /var/log/a2billing/cront_a2b_invoice.log   
touch /var/log/a2billing/cront_a2b_check_account.log   
touch /var/log/a2billing/a2billing_paypal.log
touch /var/log/a2billing/a2billing_epayment.log
touch /var/log/a2billing/a2billing_api_ecommerce_request.log
touch /var/log/a2billing/a2billing_api_callback_request.log
touch /var/log/a2billing/a2billing_api_card.log
touch /var/log/a2billing/a2billing_agi.log
chown -R asterisk:asterisk /var/log/a2billing

Add index file to prevent browsing of root folder

touch /var/www/html/a2billing/index.html

Log into the webpage

  • user:  root
  • pass: mynewpassword

Or use default password changepassword if you have not changed it yet and then click the change password link at the bottom left.

Set Asterisk version in A2Billing

Go into System settings>Global list.  Go to the bottom left and set to display all.  From your web browser search for "asterisk_version".  It will find that setting twice.  One for Global group and one for agi-conf1 group.  Change both accordingly.  If using Asterisk v11 then use "1_11"

Disable Asterisk Realtime if not setting up the following Asterisk Realtime procedure. Go to System settings>Global search for "realtime".  Change that setting to "no".

Asterisk Realtime

It may be beneficial to use Asterisk Realtime with A2billing.  If running Asterisk Realtime you do not need to reload every time you add/remove/change a customer.  Also it allows you to share the A2billing database between multiple Aserisk/FreePBX servers if you needed to do that.  If you need to create many customers it makes more sense to use a database instead of putting them all in a flat text file. Double check you have the Asterisk Realtime module installed.  If using 64bit OS the modules are in /usr/lib64/asterisk/modules.

cd /usr/lib/asterisk/modules

There should be a file there called res_config_mysql.so.  If not you need to re-install Asterisk and set it to compile the res_config_mysql.so realtime module in menuselect. Add the following to /etc/asterisk/extconfig.conf

nano /etc/asterisk/extconfig.conf

NOTE: [settings] is already included and uncommented in this file in asterisk sample configurations.  So if you installed asterisk samples or FreePBX and this file already exists and you are trying to add to it, do not add this line twice.

iaxusers => mysql,general,cc_iax_buddies
iaxpeers => mysql,general,cc_iax_buddies
sipusers => mysql,general,cc_sip_buddies
sippeers => mysql,general,cc_sip_buddies
extensions => mysql,general,cc_sip_buddies

Add the following to /etc/asterisk/res_config_mysql.conf

nano /etc/asterisk/res_config_mysql.conf

NOTE: [general] is already included and uncommented in this file in asterisk samples.  So if you installed asterisk samples or FreePBX and this file already exists and you are trying to add to it, do not add this line twice.

dbhost =
dbname = mya2billing
dbuser = a2billinguser
dbpass = a2billing
dbport = 3306
;dbsock = /var/lib/mysql/mysql.sock

Assuming (as we did in this guide) that the dbname=mya2billing, dbuser=a2billinguser, dbpassword=a2billing.  Double check that these settings match /etc/a2billing.conf and substitute as necessary.

Now restart freepbx/asterisk

amportal restart

To check if realtime is working:

From Asterisk CLI>

# asterisk -vvvr
core show config mappings

Should produce:

Config Engine: mysql
===> extensions (db=general, table=cc_sip_buddies)
===> iaxpeers (db=general, table=cc_iax_buddies)
===> iaxusers (db=general, table=cc_iax_buddies)
===> sippeers (db=general, table=cc_sip_buddies)
===> sipusers (db=general, table=cc_sip_buddies)

After you add a customer to A2Billing, and assuming that customers account number is, for example, 1234567890

realtime load sipusers name 1234567890

should produce:

Column Name  Column Value
-----------  ------------
id           1 
id_cc_card   1 
name         1234567890
accountcode  1234567890
regexten     1234567890
amaflags     billing
callerid . . .
rtpkeepalive  0 

In the A2Billing GUI go into System settings>Global and search forrealtime. Change that setting to yes if no. If already yes and having problems try change it to no and save and then change back to yes and save.