2016-03-14 00:07:31 -04:00
#!/bin/sh
# (C) 2016 Ken Rice <krice@freeswitch.org>
# Licensed as per the MPL1.1
#
########################################################
# TODO: FreeSWITCH AutoStart
# TODO: Allow Selection of Source or Package Install on Debian
DIALOG = ${ DIALOG =dialog }
tempfile = ` tempfile 2>/dev/null` || tempfile = /tmp/test$$
trap " rm -f $tempfile " 0 1 2 5 15
. /etc/os-release
install_prereqs( ) {
#install the prereqs
echo "Making sure we have the prereqs for this script to run. Please Stand by..."
apt-get update 2>& 1 >/dev/null
2016-03-14 17:08:09 -04:00
apt-get install -y curl dialog git ntpdate 2>& 1 >/dev/null
# See if ntpd is running if it is, stop it set the current time as rpi has no RTC and this is needed
# for SSL to function properly
if pgrep "ntpd" >/dev/null ; then
/etc/init.d/ntp stop
ntpdate pool.ntp.org
/etc/init.d/ntp start
else
ntpdate pool.ntp.org
fi
2016-03-14 00:07:31 -04:00
}
welcome_screen( ) {
$DIALOG --title "FreeSWITCH with LetsEncrypt AutoInstaller" --clear \
--msgbox " This Script with automattically Install FreeSWITCH \
On your Debian 8 Jessie Machine, it will also install \
Verto Communicator and use LetsEncrypt for the required \
SSL Certificates needed for Proper WebRTC Communications.\n \n \
Please keep in mind that you will need a proper DNS \
Name pointed at this machine' s public IP address along \
with ports 80 and 443 opened on the firewall. \n \n \
Additionally, you will need TCP ports 5060, 5061, 8081, \
8082 and UDP ports 16384-32768 open on your firewall for \
FreeSWITCH and Verto Communicator for function properly. \n \n \
Press <Enter> to Continue or <ESC> to abort." 19 60
case $? in
0)
; ;
255)
exit 1; ;
esac
}
fs_ver_select( ) {
$DIALOG --backtitle "FreeSWITCH Version" \
--title "RADIOLIST BOX" --clear \
--radiolist "Which Version of FreeSWITCH are you installing? \n" 20 61 5 \
"1" "FreeSWITCH 1.7" ON \
"2" "FreeSWITCH 1.6" off 2> $tempfile
retval = $?
choice = ` cat $tempfile `
case $retval in
0)
case $choice in
1)
FS_REV = "master" ; ;
2)
FS_REV = "1.6" ; ;
esac ; ;
1)
exit 1; ;
255)
exit 1; ;
esac
}
get_network_settings( ) {
FQDN = ` hostname -f`
DOMAIN = ` hostname -d`
IPADDR = ` ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | tail -n 1`
EMAIL = " hostmaster@ $DOMAIN " ;
dialog --title "System Setup Information" \
--form "\nVerify or correct the Fully Qualified Domain Name and IP Address of your machine.\nAlso enter a valid Email Address for system and LetsEncrypt email alerts" 25 60 16 \
"FQDN:" 1 1 " $FQDN " 1 25 25 40 \
"IP Address:" 2 1 " $IPADDR " 2 25 25 30 \
"Email Address:" 3 1 " $EMAIL " 3 25 25 40 \
2> $tempfile
FQDN = ` head -n1 $tempfile `
IPADDR = ` tail -n2 $tempfile | head -n1`
EMAIL = ` tail -n1 $tempfile `
retval = $?
case $retval in
0)
; ;
1)
exit 1; ;
255)
exit 1; ;
esac
}
is_private_ip( ) {
PAT = '^10\.|^192\.168\.|^169\.254\.|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-1]\.'
echo $IPADDR | egrep " $PAT "
}
verify_ip_fqdn( ) {
2016-03-14 00:54:28 -04:00
DNSIP = ` dig +noall +answer @4.2.2.2 $FQDN | awk '{print $5}' `
2016-03-14 00:07:31 -04:00
dialog --title "NO DNS For this FQDN" --clear \
--menu "The FQDN and IP Address do not match what is available in Public DNS Servers." 15 60 5 \
1 "Continue installation without LetsEncrypt." 2 "Abort Installation" 2> $tempfile
LE_CHOICE = ` cat $tempfile `
if [ " $IPADDR " != " $DNSIP " ] ; then
if [ " x $LE_CHOICE " = "x1" ] ; then
VIPFQDN = 1
else
VIPFQDN = 2
fi
else
VIPFQDN = 0
fi
}
config_fs_repos( ) {
curl https://files.freeswitch.org/repo/deb/debian/freeswitch_archive_g0.pub | apt-key add -
if [ " $FS_REV " = "master" ] ; then
echo "deb http://files.freeswitch.org/repo/deb/debian-unstable/ jessie main" >/etc/apt/sources.list.d/freeswitch.list
REPO = "https://freeswitch.org/stash/scm/fs/freeswitch.git"
elif [ " $FS_REV " = "1.6" ] ; then
echo "deb http://files.freeswitch.org/repo/deb/freeswitch-1.6/ jessie main" > /etc/apt/sources.list.d/freeswitch.list
REPO = "-b v1.6 https://silik0n@freeswitch.org/stash/scm/fs/freeswitch.git"
fi
apt-get update 2>& 1 >/dev/null
}
get_fs_source( ) {
2016-03-14 17:08:09 -04:00
echo " REPO = $REPO "
2016-03-14 00:07:31 -04:00
if [ ! -d /usr/src/freeswitch.git ] ; then
cd /usr/src
git clone $REPO freeswitch.git
else
cd /usr/src/freeswitch.git
git clean -fdx
2016-03-14 17:08:09 -04:00
git reset --hard origin/$FS_REV
2016-03-14 00:07:31 -04:00
git pull
fi
}
get_letsencrypt( ) {
if [ ! -d /usr/src/letsencrypt ] ; then
cd /usr/src
git clone https://github.com/letsencrypt/letsencrypt.git letsencrypt
else
git clean -fdx
git pull
fi
}
install_certs( ) {
get_letsencrypt
cd /usr/src/letsencrypt
NEED_CERTS_INSTALL = 1
if [ -f /etc/letsencrypt/live/$FQDN /cert.pem ] ; then
if openssl x509 -checkend 2592000 -noout -in /etc/letsencrypt/live/$FQDN /cert.pem; then
echo "Skipping LetsEncrypt These Certs are good for atleast 30 days."
NEED_CERTS_INSTALL = 0
else
echo "Renewing LetsEncrypt Certs as they will expire in the next 30 days."
2016-03-14 00:54:28 -04:00
./letsencrypt-auto renew --manual-public-ip-logging-ok
2016-03-14 00:07:31 -04:00
fi
else
echo "Setting up LetsEncrypt and getting you some nice new Certs for this Server."
./letsencrypt-auto run -d $FQDN --email $EMAIL
fi
# if we dont have the FreeSWITCH Certs Directory, make it
if [ $NEED_CERTS_INSTALL -eq 1 ] ; then
if [ ! -d /usr/local/freeswitch/certs ] ; then
mkdir -p /usr/local/freeswitch/certs
fi
cat /etc/letsencrypt/live/$FQDN /cert.pem /etc/letsencrypt/live/$FQDN /privkey.pem \
/etc/letsencrypt/live/$FQDN /chain.pem > /usr/local/freeswitch/certs/wss.pem
fi
}
build_fs( ) {
get_fs_source
#if we already have a FreeSWITCH install from source clean out the old bins
if [ -d /usr/local/freeswitch/bin ] ; then
rm -rf /usr/local/freeswitch/{ bin,mod,lib} /*
fi
cd /usr/src/freeswitch.git
2016-03-14 17:08:09 -04:00
if [ ! -d /usr/src/freeswitch.git/configure ] ; then
./bootstrap.sh -j
fi
2016-03-14 00:07:31 -04:00
./configure -C
make -j$JLIMIT install
make uhd-sounds-install
make uhd-moh-install
}
install_vc( ) {
if [ ! -d /usr/src/freeswitch.git/html5/verto/verto_communicator ] ; then
get_fs_source
fi
if [ ! -x /usr/sbin/apache2 ] ; then
apt-get update 2>& 1 >/dev/null
apt-get install -y apache2
fi
cd /usr/src/freeswitch.git/html5/verto/verto_communicator
2016-03-14 00:31:28 -04:00
apt-get update
apt-get install npm nodejs-legacy -y
2016-03-14 00:07:31 -04:00
npm install -g grunt grunt-cli bower
npm install
bower --allow-root install
grunt build
cp -a dist /var/www/html/vc
}
freeswitch_debian_packages( ) {
apt-get install -o Dpkg::Progress= 1 -y freeswitch-all freeswitch-all-dbg gdb 2>& 1 | awk -W interactive '/Progress/ { print }' | \
sed -u 's/[^0-9]//g' | dialog --gauge "Please wait.\n Installing FreeSWITCH..." 10 70 0
}
freeswitch_debian_source( ) {
apt-get install -o Dpkg::Progress= 1 -y freeswitch-video-deps-most \
2>& 1 | awk -W interactive '/Progress/ { print }' | sed -u 's/[^0-9]//g' | \
dialog --gauge "Please wait.\n Installing Build Requirements..." 10 70 0
build_fs
}
freeswitch_raspbian_source( ) {
apt-get install -o Dpkg::Progress= 1 -y autoconf automake devscripts gawk libjpeg-dev libncurses5-dev libtool-bin python-dev \
libtiff5-dev libperl-dev libgdbm-dev libdb-dev gettext libssl-dev libcurl4-openssl-dev libpcre3-dev libspeex-dev \
libspeexdsp-dev libsqlite3-dev libedit-dev libldns-dev libpq-dev libsndfile-dev libopus-dev liblua5.1-0-dev 2>& 1 | \
awk -W interactive '/Progress/ { print }' | sed -u 's/[^0-9]//g' | dialog --gauge "Please wait.\n Installing Build Requirements..." 10 70 0
2016-03-14 17:08:09 -04:00
build_fs
2016-03-14 00:07:31 -04:00
}
# install_prereqs
welcome_screen
fs_ver_select
get_network_settings
if [ " $ID " = "debian" ] ; then
2016-03-29 18:39:59 -04:00
## These only work on Jessie at this time
config_fs_repos
2016-03-14 00:07:31 -04:00
freeswitch_debian_source
elif [ " $ID " = "raspbian" ] ; then
JLIMIT = "3"
2016-03-14 17:08:09 -04:00
freeswitch_raspbian_source
2016-03-14 00:07:31 -04:00
fi
install_vc
PRIVIP = $( is_private_ip)
if [ " x $PRIVIP " != " x $IPADDR " ] ; then
verify_ip_fqdn
if [ $VIPFQDN -eq 2 ] ; then
exit 1;
elif [ $VIPFQDN -eq 1 ] ; then
echo "Skipping LetsEncrypt\n"
else
2016-03-14 00:54:28 -04:00
get_letsencrypt
2016-03-14 00:07:31 -04:00
install_certs
fi
else
2016-03-14 18:06:19 -04:00
echo "Skipping LetsEncrypt. Since we are on a Private IP Address" ;
2016-03-14 00:07:31 -04:00
fi