This guide will show how to install A2Billing v2.2 on CentOS v7. 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:
- CentOS v7
- Asterisk v11 (v13 seems to work. The callback feature may require a patch )
- FreePBX v13
- A2Billing v2.2
Assumptions:
Console text mode (multi-user.target)
Installation done as root user (#)
The following 2 diagrams illustrate A2billing inbound and outbound call flow.
Install additional required packages if not already installed
yum -y update && yum -y groupinstall core && yum -y groupinstall base && yum -y install epel-release
yum -y install php-mcrypt php-xml perl-DBD-Pg git
Get A2Billing source
cd /usr/src git clone -b 'v2.2.0' --single-branch 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'
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 ./install-db.sh
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)
\q
cp /usr/src/a2billing/a2billing.conf /etc/
Make sure the following parameters are set as shown.
nano /etc/a2billing.conf
[database] hostname = localhost port = 3306 user = a2billinguser password = a2billing dbname = mya2billing dbtype = mysql
Create files and set permissions
Only required if not using Asterisk realtime. We are including this section for legacy purposes.
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.
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. /etc/asterisk/additional_a2billing_iax.conf chown -Rf asterisk. /etc/asterisk/additional_a2billing_sip.conf chmod -R 640 /etc/asterisk
Run sound installation script
cd /usr/src/a2billing/addons/sounds ./install_a2b_sounds.sh 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.
[myasterisk] secret=mycode deny=0.0.0.0/0.0.0.0 permit=127.0.0.1/255.255.255.0 read=system,call,log,verbose,command,agent,user write=system,call,log,verbose,command,agent,user
Add fwconsole blacklist
This is very important. Without this, a reboot or fwconsole restart
or fwconsole chown
command will delete necessary symlinks in a2billing.
nano /etc/asterisk/freepbx_chown.conf
[blacklist] directory=/var/www/html/a2billing/
Set up a2billing web folders
A2billing has 3 GUI sections. admin, agent, and customer.
mkdir /var/www/html/a2billing
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. /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
echo 'Deny from all' > /var/www/html/a2billing/common/.htaccess 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. /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
. Customize this to your needs.
The 1
in a2billing.php,1
refers to the default agi-conf1
configuration in a2billing system settings. It is possible to add additional agi-conf such as agi-conf2
etc. via System Settings > Add agi-conf
.
nano /etc/asterisk/extensions_custom.conf
[a2billing-did] exten => _X.,1,AGI(a2billing.php,1,did) exten => _X.,n,Hangup() [a2billing-out] exten => _X.,1,AGI(a2billing.php,1) exten => _X.,n,Hangup()
Add custom destinations to FreePBX via FreePBX GUI>Admin>Custom Destinations
These destinations are referring to the custom extensions created above in /etc/asterisk/extensions_custom.conf
Target: a2billing-did,${EXTEN},1
Description: A2Billing - Inbound
Target: a2billing-out,${EXTEN},1
Description: A2Billing - Outbound
Create inbound route
We are creating a universal DID inbound route. This requires _.
in the DID number field. That is underscore character followed by period or dot character.
Connectivity > Inbound Routes
Description: Some descriptive name
DID number: _.
Set Destination: Custom Destinations
A2Billing - Inbound
Start or restart FreePBX
fwconsole restart
Cron
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. /usr/local/a2billing
Add the cron jobs to /var/spool/cron/asterisk as follows
crontab -e -u 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 # Check the account of each user and send an email if the balance is below mimimum. 0 * * * * php /usr/local/a2billing/Cronjobs/a2billing_notify_account.php # Browse all the DID's that are reserved and check if the customer need to pay. # Bill them or warn them via email that they need 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 # Generate invoices and for each user 0 6 * * * php /usr/local/a2billing/Cronjobs/a2billing_batch_billing.php # Process 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 #Autorefill 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. /var/log/a2billing
Add index file to prevent browsing of folders
touch /var/www/html/a2billing/index.html
Log into the webpage
http://{my-ip-address}/a2billing/admin
- 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 or v13 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
If using Asterisk Realtime you do not need to reload every time you add/remove/change a customer. It also allows you to share the A2billing database between multiple Asterisk/Freepbx servers. If you need to create many customers it makes more sense to use a database rather than a flat text file.
Double check you have the Asterisk Realtime module installed.
cd /usr/lib64/asterisk/modules dir
There should be a file there called res_config_mysql.so
. If not you need to re-compile 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.
[settings] iaxusers => mysql,general,cc_iax_buddies iaxpeers => mysql,general,cc_iax_buddies sipusers => mysql,general,cc_sip_buddies sippeers => 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.
[general] dbhost = 127.0.0.1 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
fwconsole restart
To check if realtime is working:
From Asterisk CLI>
asterisk -vvvr
core show config mappings
Should produce:
Config Engine: mysql ===> 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 customer’s 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 callgroup callerid . . . maxcallbitrate outboundproxy rtpkeepalive 0 useragent callbackextension ... ... ...
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.