WIP Freeswitch + FusionPBX

#!/bin/sh
#
# Installation can take up a long time (e.g. downloading large high quality sound files) depending on your internet speed. 
# Set default php-scl version to version as set in the above variables
# 
# Install php-scl first
#yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
#yum -y install http://mirror.de-labrusse.fr/NethServer/7/x86_64/nethserver-stephdl-1.0.7-1.ns7.sdl.noarch.rpm
#yum -y install nethserver-php-scl --enablerepo=stephdl
#yum -y install php71-php-odbc php71-php-opcache php71-php-xmlrpc --enablerepo=remi-safe
#config setprop httpd PhpVersion php71
#signal-event nethserver-php-update
#
# then run this script "scl enable php71 'bash install.sh'
 
# Variables
autoyum=-"y"								# -"y -q" for quiet mode
php_version=71								# PHP SCL version, must be >=7.x.
pg_version=9.4
database_host=127.0.0.1							# Fixed setting
database_port=5432													# Fixed setting
database_username=fusionpbx						# FusionPBX PostgreSQL username
database_password=$(dd if=/dev/urandom bs=1 count=20 2>/dev/null | base64 | sed 's/[=\+//]//g')
fusionpbx_path=/var/www/html/fusionpbx
fusionpbx_branch=4.4							# Master or specific version e.g. 4.4
# Database names fusionpbx and freeswitch are hardcoded
 
# Save essentials under db key FusionPbx properties as backup
config set fusionpbx status PgsqlDbPassword $database_password PgsqlDbUser $database_username
 
# Install required repo's
yum $autoyum install https://forensics.cert.org/cert-forensics-tools-release-el7.rpm
yum $autoyum install http://repo.okay.com.mx/centos/7/x86_64/release/okay-release-1-1.noarch.rpm
yum $autoyum install https://download.postgresql.org/pub/repos/yum/9.4/redhat/rhel-7-x86_64/pgdg-centos94-9.4-3.noarch.rpm
yum-config-manager --disable okay,forensics
 
# Install various required tools
yum $autoyum install ntp yum-utils htop sngrep libtiff-devel libtiff-tools at memcached gdb git haveged
yum $autoyum install lame --enablerepo=forensics
yum $autoyum install ffmpeg ghostscript ilbc2 sox freeswitch-application-av --enablerepo=okay,epel,remi-safe
systemctl enable memcached
systemctl enable haveged
systemctl start memcached
 
# Install FusionPBX from github
mkdir -p /var/cache/fusionpbx
git clone --branch $fusionpbx_branch https://github.com/fusionpbx/fusionpbx.git $fusionpbx_path
chown -R apache:apache $fusionpbx_path
 
# Install PostgreSQL 
yum $autoyum install luapgsql postgresql94-contrib
/usr/pgsql-9.4/bin/postgresql94-setup initdb
sed -i 's/\(host  *all  *all  *127.0.0.1\/32  *\)ident/\1trust/' /var/lib/pgsql/9.4/data/pg_hba.conf
sed -i 's/\(host  *all  *all  *::1\/128  *\)ident/\1trust/' /var/lib/pgsql/9.4/data/pg_hba.conf
sed -i  /var/lib/pgsql/9.4/data/postgresql.conf -e s:"#port = 5432:port = 5432:"
 
# Set environment variables
export PATH=$PATH:/usr/pgsql-9.4/bin/
export LD_LIBRARY_PATH=/usr/pgsql-9.4/lib/
export PGHOST=localhost
 
#Add user postgres to the www group
usermod -a -G apache postgres
systemctl daemon-reload
systemctl restart postgresql-9.4
 
# move to /tmp to prevent a red herring error when running sudo with psql
cd /tmp 
sudo -u postgres psql -c "CREATE DATABASE fusionpbx";
sudo -u postgres psql -c "CREATE DATABASE freeswitch";
sudo -u postgres psql -c "CREATE ROLE fusionpbx WITH SUPERUSER LOGIN PASSWORD '$database_password';"
sudo -u postgres psql -c "CREATE ROLE freeswitch WITH SUPERUSER LOGIN PASSWORD '$database_password';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE fusionpbx to fusionpbx;"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE freeswitch to fusionpbx;"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE freeswitch to freeswitch;"
 
# Install Freeswitch
yum $autoyum install *1.8.5-2* freeswitch-sounds-en-us-callie* freeswitch-sounds-music* --enablerepo=okay,epel,remi-safe
#remove the music package to protect music on hold from package updates
mkdir -p /usr/share/freeswitch/sounds/temp
mv /usr/share/freeswitch/sounds/music/default/*000 /usr/share/freeswitch/sounds/temp
yum -y remove freeswitch-sounds-music
mkdir -p /usr/share/freeswitch/sounds/music/default
mv /usr/share/freeswitch/sounds/temp/* /usr/share/freeswitch/sounds/music/default
rm -R /usr/share/freeswitch/sounds/temp
config set fw_freeswitch service 
config setprop fw_freeswitch status enabled
config setprop fw_freeswitch access "red,green"
config setprop fw_freeswitch UDPPorts "5060:5061,5080:5081,8081,8082,16384:32768"
config setprop fw_freeswitch TCPPorts "5060:5061,5080:5081,8081,8082"
signal-event firewall-adjust
#systemctl enable freeswitch
 
# Pre config fusionPBX integration with FreeSWITCH and start (required) FreeSWITCH
mkdir -p /var/cache/fusionpbx
chown -R freeswitch:daemon /var/cache/fusionpbx
mkdir -p /etc/fusionpbx
mv /etc/freeswitch /etc/freeswitch.orig
mkdir /etc/freeswitch
cp -R $fusionpbx_path/resources/templates/conf/* /etc/freeswitch
systemctl start freeswitch
 
# Setting permissions. Apache *requires* access
chown -R apache:apache /etc/freeswitch /etc/fusionpbx /var/lib/freeswitch /usr/share/freeswitch /var/log/freeswitch /var/run/freeswitch
 
## Populate database ##
export PGPASSWORD=$database_password
export PGUSERNAME=$database_username
 
# Update the database password
sudo -u postgres psql --host=$database_host --port=$database_port --username=$database_username -c "ALTER USER fusionpbx WITH PASSWORD '$database_password';"
sudo -u postgres psql --host=$database_host --port=$database_port --username=$database_username -c "ALTER USER freeswitch WITH PASSWORD '$database_password';"
 
# Add the config.php 
cat <<HERE1 > /etc/fusionpbx/config.php
<?php
	\$db_type = 'pgsql'; //sqlite, mysql, pgsql, others with a manually created PDO connection
	\$db_host = 'localhost'; //set the host only if the database is not local
	\$db_port = '5432';
	\$db_name = 'fusionpbx';
	\$db_username = '$database_username';
	\$db_password = '$database_password';
	ini_set('display_errors', '1');
	error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING ); //hide notices and warnings
?>
HERE1
chown -R apache:apache /etc/fusionpbx
 
# Add the database schema
echo "Populating FusionPBX database"
cd $fusionpbx_path && php $fusionpbx_path/core/upgrade/upgrade_schema.php > /dev/null 2>&1
 
# Get the server FQDN which is used for the default FusionPBX domain and initial admin login
domain_name=$(hostname -f)
 
# Get a domain_uuid
domain_uuid=$(php $fusionpbx_path/resources/uuid.php);
 
# Add the domain name
echo "Setting FusionPBX domain name"
sudo -u postgres psql --host=$database_host --port=$database_port --username=$database_username -c "insert into v_domains (domain_uuid, domain_name, domain_enabled) values('$domain_uuid', '$domain_name', 'true');"
 
# App defaults and set permissions, default settings are initialized
cd $fusionpbx_path && php $fusionpbx_path/core/upgrade/upgrade_domains.php
rm -f /etc/fusionpbx/config.lua
 
# Add the admin user
user_uuid=$(php $fusionpbx_path/resources/uuid.php);
user_salt=$(php $fusionpbx_path/resources/uuid.php);
user_name=admin
user_password=$(dd if=/dev/urandom bs=1 count=12 2>/dev/null | base64 | sed 's/[=\+//]//g');
password_hash=$(php -r "echo md5('$user_salt$user_password');");
sudo -u postgres psql --host=$database_host --port=$database_port --username=$database_username -t -c "insert into v_users (user_uuid, domain_uuid, username, password, salt, user_enabled) values('$user_uuid', '$domain_uuid', '$user_name', '$password_hash', '$user_salt', 'true');"
 
# Save essentials under db key FusionPbx properties as backup
config setprop fusionpbx FusionPbxUser $user_name FusionPbxPassword $user_password DomainName $domain_name
 
# Get the superadmin group_uuid
group_uuid=$(sudo -u postgres psql --host=$database_host --port=$database_port --username=$database_username -t -c "select group_uuid from v_groups where group_name = 'superadmin';");
group_uuid=$(echo $group_uuid | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//')
 
# Add the user to the group
group_user_uuid=$(php $fusionpbx_path/resources/uuid.php);
group_name=superadmin
sudo -u postgres psql --host=$database_host --port=$database_port --username=$database_username -c "insert into v_group_users (group_user_uuid, domain_uuid, group_name, group_uuid, user_uuid) values('$group_user_uuid', '$domain_uuid', '$group_name', '$group_uuid', '$user_uuid');"
 
# Update xml_cdr url, user and password
xml_cdr_username=$(dd if=/dev/urandom bs=1 count=12 2>/dev/null | base64 | sed 's/[=\+//]//g')
xml_cdr_password=$(dd if=/dev/urandom bs=1 count=12 2>/dev/null | base64 | sed 's/[=\+//]//g')
sed -i /etc/freeswitch/autoload_configs/xml_cdr.conf.xml -e s:"{v_http_protocol}:https:"
sed -i /etc/freeswitch/autoload_configs/xml_cdr.conf.xml -e s:"{domain_name}:$domain_name:"
sed -i /etc/freeswitch/autoload_configs/xml_cdr.conf.xml -e s:"{v_project_path}::"
sed -i /etc/freeswitch/autoload_configs/xml_cdr.conf.xml -e s:"{v_user}:$xml_cdr_username:"
sed -i /etc/freeswitch/autoload_configs/xml_cdr.conf.xml -e s:"{v_pass}:$xml_cdr_password:"
 
# Save essentials under db key FusionPbx properties as backup
config setprop fusionpbx CdrUsername $xml_cdr_username CdrPassword $xml_cdr_password
 
# App defaults (in the GUI it is in Advanced -> upgrade) Default settings are updated
rm -f /etc/fusionpbx/config.lua
cd $fusionpbx_path && php $fusionpbx_path/core/upgrade/upgrade_domains.php
 
# Set directory permissions to 770 (u=rwx,g=rwx,o='')
find /etc/freeswitch -type d -exec chmod 775 {} \;
find /var/lib/freeswitch -type d -exec chmod 775 {} \;
find /var/log/freeswitch -type d -exec chmod 770 {} \;
find /usr/share/freeswitch -type d -exec chmod 770 {} \;
find $fusionpbx_path -type d -exec chmod 770 {} \;
 
# Set file permissions to 664 (u=rw,g=rw,o=r)
find /etc/freeswitch -type f -exec chmod 664 {} \;
find /var/lib/freeswitch -type f -exec chmod 664 {} \;
find /var/log/freeswitch -type f -exec chmod 664 {} \;
find /usr/share/freeswitch -type f -exec chmod 664 {} \;
find $fusionpbx_path -type f -exec chmod 664 {} \;
 
# Set system services and restart
systemctl enable postgresql-9.4
systemctl restart postgresql-9.4
systemctl restart freeswitch
 
# Message
echo ""
echo "			Installation has completed."
echo ""
echo "     	Use a web browser to login to your PBX at:"
echo "     	domain name: https://$domain_name/fusionpbx"
echo "     	username: $user_name@$domain_name"
echo "     	password: $user_password"
echo ""
echo "      config show fusionpbx has all credentials"