Skip to content

Instantly share code, notes, and snippets.

@tlatsas
Last active December 22, 2015 19:59
Show Gist options
  • Save tlatsas/6523272 to your computer and use it in GitHub Desktop.
Save tlatsas/6523272 to your computer and use it in GitHub Desktop.
freepbx spec file
###################################################################
#
# freepbx.spec - used to generate freepbx rpm
# For more info: http://www.rpm.org/max-rpm/ch-rpm-basics.html
#
# This spec file uses default directories:
# /usr/src/redhat/SOURCES - orig source, patches, icons, etc.
# /usr/src/redhat/SPECS - spec files
# /usr/src/redhat/BUILD - sources unpacked & built here
# /usr/src/redhat/RPMS - binary package files
# /usr/src/redhat/SRPMS - source package files
#
###################################################################
#
# Global Definitions
#
###################################################################
%define aversion 2.11.0beta2
%define arelease 2_centos6
%define actversion %(echo %{aversion}|sed -e "s/-.*$//g")
%define subvers %(echo %{aversion}|awk "/-/"|sed -e "s/^.*-//"|awk '{print "0." $1 "."}')
%define actrelease %(echo %{subvers}%{arelease}|sed -e "s/-/_/g")
%define version_dahdiconfig 2.11.18
%define version_motif 2.11.5
%define version_parking 2.11.0.6
%define version_queues 2.11.0.4
###################################################################
#
# The Preamble
# information that is displayed when users request info
#
###################################################################
Summary: FreePBX
Name: freepbx
Version: %{actversion}
Release: %{actrelease}
License: GPL
Group: Utilities/System
Source0: %{name}-%{aversion}.tar.gz
Source1: odbc.ini.freepbx-template
Source2: odbcinst.ini.freepbx-template
Patch1: amportal-conf.patch
Patch2: install-md5check.patch
Patch3: asterisk-runas.patch
Patch4: ignore-selinux.patch
Patch7: amportal-chown.patch
Patch8: cdr_odbc-conf.diff
Patch10: install-nosudo.diff
BuildRoot: %{_tmppath}/%{name}-%{version}-root
URL: http://www.freepbx.org
Vendor: FreePBX
Packager: Jason Parker <[email protected]>
AutoReqProv: no
Requires: asterisk-core
Requires: asterisk-odbc
Requires: httpd
Requires: php
Requires: php-gd
Requires: php-mysql
Requires: php-pear-DB
%{?el6:Requires: php-process}
Requires: mysql-server
Requires: mysql-connector-odbc
# The way yum handles Requires doesn't work very well for this.
# Let's be explicit about what we need, so that a random package isn't chosen.
#Requires: asterisk-sounds-extra
Requires: asterisk-sounds-extra-en-gsm
#
# Other tags not used
#
#Distribution:
#Icon:
#Conflicts:
#Serial:
#Provides:
#ExcludeArch:
%description
FreePBX
###################################################################
#
# The Prep Section
# If stuff needs to be done before building, this is the section
# Use shell scripts to do stuff like uncompress and cd into source dir
# %setup macro - cleans old build trees, uncompress and extracts original source
#
###################################################################
%prep
%setup -n %{name}-%{aversion}
tar -C amp_conf/htdocs/admin/modules/ -xvf $RPM_SOURCE_DIR/dahdiconfig-%{version_dahdiconfig}.tgz
tar -C amp_conf/htdocs/admin/modules/ -xvf $RPM_SOURCE_DIR/motif-%{version_motif}.tgz
tar -C amp_conf/htdocs/admin/modules/ -xvf $RPM_SOURCE_DIR/parking-%{version_parking}.tgz
tar -C amp_conf/htdocs/admin/modules/ -xvf $RPM_SOURCE_DIR/queues-%{version_queues}.tgz
%patch1 -p0
%patch2 -p0
# Have to start Asterisk as root before fixing permissions..
%patch3 -p0
%patch4 -p0
%patch7 -p0
%patch8 -p0
%patch10 -p0
###################################################################
#
# The Build Section
# Use shell scripts and do stuff that makes the build happen, i.e. make
#
###################################################################
%build
###################################################################
#
# The Install Section
# Use shell scripts and perform the install, like 'make install',
# but can also be shell commands, i.e. cp, mv, install, etc..
#
###################################################################
%install
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/php.d/
echo "memory_limit = 100M" > $RPM_BUILD_ROOT%{_sysconfdir}/php.d/freepbx.ini
sed -i -e "s^/usr/lib/^%{_libdir}/^g" asterisk.conf
# This *really* needs to change at some point.
mkdir -p $RPM_BUILD_ROOT/usr/src/%{name}-%{aversion}/
cp -r * $RPM_BUILD_ROOT/usr/src/%{name}-%{aversion}/
cp %{SOURCE1} $RPM_BUILD_ROOT/%{_sysconfdir}/
cp %{SOURCE2} $RPM_BUILD_ROOT/%{_sysconfdir}/
# ugh
sed -i -e "s^/usr/lib/^%{_libdir}/^g" $RPM_BUILD_ROOT/%{_sysconfdir}/odbcinst.ini.freepbx-template
###################################################################
#
# Install and Uninstall
# This section can have scripts that are run either before/after
# an install process, or before/after an uninstall process
# %pre - executes prior to the installation of a package
# %post - executes after the package is installed
# %preun - executes prior to the uninstallation of a package
# %postun - executes after the uninstallation of a package
#
###################################################################
%post
dbuser="root"
dbpass=""
mysqlcmd="mysql --user=${dbuser} --password=${dbpass}"
mysqladmcmd="mysqladmin --user=${dbuser} --password=${dbpass}"
sed -i -e 's/^User .*/User asterisk/' /etc/httpd/conf/httpd.conf
sed -i -e 's/^Group .*/Group asterisk/' /etc/httpd/conf/httpd.conf
# Just in case they aren't running.
service httpd restart
chkconfig httpd on
service mysqld start
chkconfig mysqld on
if ! ${mysqlcmd} --execute "quit" > /dev/null 2>&1; then
echo "Failed to connect to mysql with user '${dbuser}' and password '${dbpass}'."
exit 1
else
cd /usr/src/%{name}-%{aversion}/
if [ ! -f /etc/amportal.conf ]; then
install -m 660 amportal.conf /etc/amportal.conf
chown asterisk:asterisk /etc/amportal.conf
fi
if ! grep "^AMPVMUMASK=" /etc/amportal.conf >/dev/null; then
echo "Adding AMPVMUMASK option to /etc/amportal.conf"
echo "AMPVMUMASK=007" >> /etc/amportal.conf
fi
if ! grep "^AMPASTERISKWEBUSER=" /etc/amportal.conf >/dev/null; then
echo "Adding AMPASTERISKWEBUSER option to /etc/amportal.conf"
echo "AMPASTERISKWEBUSER=asterisk" >> /etc/amportal.conf
else
echo "Setting AMPASTERISKWEBUSER option in /etc/amportal.conf"
sed -i -e 's/^AMPASTERISKWEBUSER=.*/AMPASTERISKWEBUSER=asterisk/' /etc/amportal.conf
fi
if ! grep "^AMPASTERISKWEBGROUP=" /etc/amportal.conf >/dev/null; then
echo "Adding AMPASTERISKWEBGROUP option to /etc/amportal.conf"
echo "AMPASTERISKWEBGROUP=asterisk" >> /etc/amportal.conf
else
echo "Setting AMPASTERISKWEBGROUP option in /etc/amportal.conf"
sed -i -e 's/^AMPASTERISKWEBGROUP=.*/AMPASTERISKWEBGROUP=asterisk/' /etc/amportal.conf
fi
if ! ${mysqlcmd} --database asterisk --execute "show tables" > /dev/null 2>&1; then
${mysqladmcmd} create asterisk
${mysqlcmd} --database asterisk < SQL/newinstall.sql
${mysqlcmd} --execute "GRANT ALL PRIVILEGES ON asterisk.* TO freepbx@localhost IDENTIFIED BY 'fpbx';"
fi
if ! ${mysqlcmd} --database asteriskcdrdb --execute "show tables" > /dev/null 2>&1; then
${mysqladmcmd} create asteriskcdrdb
${mysqlcmd} --database asteriskcdrdb < SQL/cdr_mysql_table.sql
${mysqlcmd} --execute "GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO freepbx@localhost IDENTIFIED BY 'fpbx';"
fi
ln -s `pwd`/amp_conf/htdocs/admin/modules/core/etc/sip.conf /etc/asterisk/sip.conf
ln -s `pwd`/amp_conf/htdocs/admin/modules/core/etc/extensions.conf /etc/asterisk/extensions.conf
./start_asterisk start
./install_amp
for i in `grep -rh "^#include" /etc/asterisk/*.conf | sed 's/#include //' | sort -u`; do
echo touch /etc/asterisk/$i
done
./amp_conf/bin/module_admin reload
ln -sf /var/www/html/admin/modules/core/etc/sip.conf /etc/asterisk/sip.conf
ln -sf /var/www/html/admin/modules/core/etc/extensions.conf /etc/asterisk/extensions.conf
amportal=`which amportal`
if ! grep -c amportal /etc/rc.local > /dev/null; then
echo "${amportal} start" >> /etc/rc.local
fi
odbcinst -i -d -n MySQL -f %{_sysconfdir}/odbcinst.ini.freepbx-template -r
odbcinst -i -s -n asteriskcdrdb -f %{_sysconfdir}/odbc.ini.freepbx-template -l
fi
%postun
odbcinst -u -d -n MySQL -f %{_sysconfdir}/odbcinst.ini.freepbx-template
odbcinst -u -s -n asteriskcdrdb -f %{_sysconfdir}/odbc.ini.freepbx-template -l
echo "The FreePBX uninstallation procedure is non-existent. You will need to manually remove left-over files."
###################################################################
#
# Verify
#
###################################################################
%verifyscript
###################################################################
#
# Clean
#
###################################################################
%clean
cd $RPM_BUILD_DIR
%{__rm} -rf %{name}-%{version}
%{__rm} -rf $RPM_BUILD_ROOT
###################################################################
#
# File List
#
###################################################################
%files
%defattr(-, root, root)
%config(noreplace) %{_sysconfdir}/php.d/freepbx.ini
%{_sysconfdir}/odbc.ini.freepbx-template
%{_sysconfdir}/odbcinst.ini.freepbx-template
# *sigh*
/usr/src/%{name}-%{aversion}
#!/usr/bin/php -q
<?php
// This file is part of FreePBX.
//
// FreePBX is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// FreePBX is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with FreePBX. If not, see <http://www.gnu.org/licenses/>.
//
// Copyright 2006, Rob Thomas <[email protected]>
// Copyright 2009, Bandwith.com
//
require_once ("libfreepbx.install.php");
require_once(dirname(__FILE__) . '/amp_conf/htdocs/admin/libraries/php-upgrade.functions.php');
require_once(dirname(__FILE__) . '/amp_conf/htdocs/admin/libraries/sql.functions.php');
require_once(dirname(__FILE__) . '/amp_conf/htdocs/admin/libraries/utility.functions.php');
# constants
define("AMP_CONF", "/etc/amportal.conf");
define("ASTERISK_CONF", "/etc/asterisk/asterisk.conf");
define("UPGRADE_DIR", dirname(__FILE__)."/upgrades");
define("MODULE_DIR", dirname(__FILE__)."/amp_conf/htdocs/admin/modules/");
# semi constants
$webroot = "/var/www/html";
/* should be deprecated and only under proramatic control
$fopwebroot = ""; // if blank, will use $webroot/panel
*/
$ampsbin_dir = "/usr/local/sbin"; // default if not set
$ampbin_dir = "/var/lib/asterisk/bin";
$asterisk_user = "asteriskuser";
$asterisk_pass = "amp109";
/********************************************************************************************************************/
function showHelp() {
out("Optional parameters:",false);
out(" --help, -h, -? Show this help",false);
out(" --dbhost <ip address> Use a remote database server",false);
out(" --dbname databasename Use database name specified, instead of 'asterisk'",false);
out(" --username <user> Use <user> to connect to db and write config",false);
out(" --password <pass> Use <pass> to connect to db and write config",false);
out(" --fopwebroot <path> Depricated Web path where fop will be installed, ignored should be under module control",false);
out(" --webroot <path> Web root where FreePBX will be installed",false);
out(" --cgibin <path> Path where cgi-bin's lives",false);
out(" --bin <path> Path of asterisk binaries",false);
out(" --sbin <path> Path of system admin binaries",false);
out(" --asteriskuser <user> Asterisk Manager username",false);
out(" --asteriskpass <pass> Asterisk Manager password",false);
out(" --debug Enable debug output",false);
out(" --dry-run Don't actually do anything",false);
out(" --force-version <ver> Force upgrade from version <ver>",false);
out(" --skip-module-install Don't run install scripts for packaged modules, the files are still loaded.",false);
out(" In a development environment you may not want the install scripts run.",false);
out(" --no-files Just run updates without installing files",false);
out(" --force-overwrite Don't ask if it is ok to overwrite modified files, assume yes for all.",false);
out(" --install-moh Install default music-on-hold files (normally doesn't, unless ",false);
out(" it's a new installation)",false);
out(" --install-fop false depricated, does nothing",false);
out(" --dev-links Make links to files in the source directory instead of copying",false);
out(" (intended for developers only)",false);
out(" --my-svn-is-correct Ignore Asterisk version, assume it is correct",false);
out(" --engine <name> Use the specified PBX Engine ('asterisk')",false);
out(" --uid <user> Set ownership of files to user",false);
out(" --gid <group> Set ownership of files to group",false);
out(" --scripted Scripted install. Do not ask any questions.",false);
out(" (Intended for unattended installers only)",false);
out(" --set-freepbx-settings Force set the internal FreePBX DB Settings with install time parameters",false);
out(" --cleaninstall Like 'make clean' will clean up any previous settings or previous setup while installing a-new",false);
out(" --uninstall Completely Uninstall FreePBX",false);
}
function install_parse_amportal_conf($filename) {
$file = file($filename);
foreach ($file as $line) {
if (preg_match("/^\s*([a-zA-Z0-9]+)\s*=\s*(.*)\s*([;#].*)?/",$line,$matches)) {
// TODO: force booleans into 0/1 this should be ok given the limited number of configuration values
//
switch (trim(strtolower($matches[2]))) {
case 'false':
case 'no':
case 'off':
case '0':
$conf[$matches[1]] = '0';
case 'true':
case 'yes':
case 'on':
case '1':
$conf[$matches[1]] = '1';
default:
$conf[$matches[1]] = $matches[2];
break;
}
}
}
// use same defaults as function.inc.php
if ( !isset($conf["AMPDBENGINE"]) || ($conf["AMPDBENGINE"] == "")) {
$conf["AMPDBENGINE"] = "mysql";
}
if ( !isset($conf["AMPDBNAME"]) || ($conf["AMPDBNAME"] == "")) {
$conf["AMPDBNAME"] = "asterisk";
}
if ( !isset($conf["AMPENGINE"]) || ($conf["AMPENGINE"] == "")) {
$conf["AMPENGINE"] = "asterisk";
}
out("parsed amp_conf variables from $filename:");
foreach ($conf as $keyword => $value) {
out("amp_conf [$keyword] => [$value]");
}
return $conf;
}
function install_parse_asterisk_conf($filename) {
$file = file($filename);
foreach ($file as $line) {
if (preg_match("/^\s*([a-zA-Z0-9]+)\s* => \s*(.*)\s*([;#].*)?/",$line,$matches)) {
$conf[ $matches[1] ] = $matches[2];
}
}
// Now set defaults if not set (although asterisk should fail if not set but at least
// it will get the setup somewhat right
//
if (!isset($asterisk_conf['astetcdir'])) { $asterisk_conf['astetcdir'] = "/etc/asterisk"; }
if (!isset($asterisk_conf['astmoddir'])) { $asterisk_conf['astmoddir'] = "/usr/lib/asterisk/modules"; }
if (!isset($asterisk_conf['astvarlibdir'])) { $asterisk_conf['astvarlibdir'] = "/var/lib/asterisk"; }
if (!isset($asterisk_conf['astagidir'])) { $asterisk_conf['astagidir'] = "/var/lib/asterisk/agi-bin"; }
if (!isset($asterisk_conf['astspooldir'])) { $asterisk_conf['astspooldir'] = "/var/spool/asterisk"; }
if (!isset($asterisk_conf['astrundir'])) { $asterisk_conf['astrundir'] = "/var/run/asterisk"; }
if (!isset($asterisk_conf['astlogdir'])) { $asterisk_conf['astlogdir'] = "/var/log/asterisk"; }
return $conf;
}
function write_amportal_conf($filename, $conf) {
$file = file($filename);
// parse through the file
foreach (array_keys($file) as $key) {
if (preg_match("/^\s*([a-zA-Z0-9]+)\s*=\s*(.*)\s*([;#].*)?/",$file[$key],$matches)) {
// this is an option=value line
if (isset($conf[ $matches[1] ])) {
// rewrite the line, if we have this in $conf
$file[$key] = $matches[1]."=".$conf[ $matches[1] ]."\n";
// unset it so we know what's new
unset($conf[ $matches[1] ]);
}
}
}
// add new entries
foreach ($conf as $key=>$val) {
$file[] = $key."=".$val."\n";
}
// write the file
if (!$fd = fopen($filename, "w")) {
fatal("Could not open ".$filename." for writing");
}
fwrite($fd, implode("",$file));
fclose($fd);
}
function ask_overwrite($file1, $file2) {
global $check_md5s;
do {
out($file2." has been changed from the original version.");
outn("Overwrite (y=yes/a=all/n=no/d=diff/s=shell/x=exit)? ");
$key = fgets(STDIN,1024);
switch (strtolower($key[0])) {
case "y": return true;
case "a": $check_md5s=false; return true;
case "n": return false;
case "d":
out("");
// w = ignore whitespace, u = unified
passthru("diff -wu ".escapeshellarg($file2)." ".escapeshellarg($file1));
break;
case "s":
if (function_exists("pcntl_fork")) {
out("");
$shell = (isset($_ENV["SHELL"]) ? $_ENV["SHELL"] : "/bin/bash");
out("Dropping to shell. Type 'exit' to return");
out("-> Original file: ".$file2);
out("-> New file: ".$file1);
$pid = pcntl_fork();
if ($pid == -1) {
out("[ERROR] cannot fork");
} else if ($pid) {
// parent
pcntl_waitpid($pid, $status);
// we wait till the child exits/dies/whatever
} else {
pcntl_exec($shell, array(), $_ENV);
}
out("Returned from shell");
} else {
out("[ERROR] PHP not built with process control (--enable-pcntl) support: cannot spawn shell");
}
break;
case "x":
out("-> Original file: ".$file2);
out("-> New file: ".$file1);
out("Exiting install program.");
exit(1);
break;
}
out("");
} while(1);
}
/** Write AMP-generated configuration files
*/
function generate_configs() {
global $amp_conf;
global $dryrun;
global $debug;
global $runas_uid;
out("Generating Configurations.conf, (if Asterisk is not running, you will get an error");
out("In case of error, start Asterisk and hit the red bar in the GUI to generate the Configurations.conf files");
if (!$dryrun)
// added --run-install to make it work like it has been working since retrieve_conf changed to not run module install scripts by default
//
// TODO: Should check if Asterisk is running and/or try to start it.
//
passthru("sudo -u $runas_uid ".trim($amp_conf["AMPBIN"])."/retrieve_conf --run-install --skip-registry-checks ".($debug ? ' --debug' : ''));
}
/** Collect AMP settings
*/
function collect_settings($filename, $dbhost = '', $dbuser = '', $dbpass = '', $dbname = 'asterisk') {
global $webroot;
/* should be deprecated and only under proramatic control
global $fopwebroot;
*/
global $ampsbin_dir;
global $ampbin_dir;
global $asterisk_user;
global $asterisk_pass;
global $scripted;
global $freepbxip;
global $asteriskip;
global $runas_uid;
global $runas_gid;
out("Creating new $filename");
if ($scripted == true) {
# Scripted install. Everything should have been set for us, don't ask questions.
out("Scripted install. Accepting command line params.");
$amp_conf["AMPDBUSER"] = $dbuser;
$amp_conf["AMPDBPASS"] = $dbpass;
$amp_conf["AMPDBHOST"] = $dbhost;
$amp_conf["AMPDBNAME"] = $dbname;
$amp_conf["AMPMGRUSER"] = "admin";
$amp_conf["AMPMGRPASS"] = "unset";
$amp_conf["AMPWEBROOT"] = $webroot;
/* should be deprecated and only under proramatic control
$amp_conf["FOPWEBROOT"] = ($fopwebroot ? $fopwebroot : $webroot."/panel");
*/
$amp_conf["AMPWEBADDRESS"] = $freepbxip;
$amp_conf["ASTMANAGERHOST"] = $asteriskip;
$amp_conf["AMPEXTENSIONS"] = "extensions";
$amp_conf["AMPBIN"] = $ampbin_dir;
$amp_conf["AMPSBIN"] = "$ampsbin_dir";
$amp_conf["AMPASTERISKWEBUSER"] = $runas_uid;
$amp_conf["AMPASTERISKWEBGROUP"] = $runas_gid;
$amp_conf["AMPASTERISKUSER"] = $runas_uid;
$amp_conf["AMPASTERISKGROUP"] = $runas_gid;
$amp_conf["AMPDEVUSER"] = $runas_uid;
$amp_conf["AMPDEVGROUP"] = $runas_gid;
write_amportal_conf($filename, $amp_conf);
outn(AMP_CONF." written");
return;
}
outn("Enter your USERNAME to connect to the '$dbname' database:\n [".($dbuser ? $dbuser : $asterisk_user) . "] ");
$key = trim(fgets(STDIN,1024));
if (preg_match('/^$/',$key))
$amp_conf["AMPDBUSER"] = ($dbuser ? $dbuser : $asterisk_user);
else
$amp_conf["AMPDBUSER"] = $key;
outn("Enter your PASSWORD to connect to the '$dbname' database:\n [".($dbpass ? $dbpass : $asterisk_pass)."] ");
$key = trim(fgets(STDIN,1024));
if (preg_match('/^$/',$key))
$amp_conf["AMPDBPASS"] = ($dbpass ? $dbpass : $asterisk_pass);
else
$amp_conf["AMPDBPASS"] = $key;
outn("Enter the hostname of the '$dbname' database:\n [".($dbhost ? $dbhost : "localhost")."] ");
$key = trim(fgets(STDIN,1024));
if (preg_match('/^$/',$key))
$amp_conf["AMPDBHOST"] = ($dbhost ? $dbhost : "localhost");
else
$amp_conf["AMPDBHOST"] = $key;
outn("Enter a USERNAME to connect to the Asterisk Manager interface:\n [admin] ");
$key = trim(fgets(STDIN,1024));
if (preg_match('/^$/',$key)) $amp_conf["AMPMGRUSER"] = "admin";
else $amp_conf["AMPMGRUSER"] = $key;
outn("Enter a PASSWORD to connect to the Asterisk Manager interface:\n [amp111] ");
$key = trim(fgets(STDIN,1024));
if (preg_match('/^$/',$key)) $amp_conf["AMPMGRPASS"] = "amp111";
else $amp_conf["AMPMGRPASS"] = $key;
do {
out("Enter the path to use for your AMP web root:\n [$webroot] ");
$key = trim(fgets(STDIN,1024));
if (preg_match('/^$/',$key))
$amp_conf["AMPWEBROOT"] = "$webroot";
else
$amp_conf["AMPWEBROOT"] = rtrim($key,'/');
//regression follows us all around freepbx #6159
$webroot = $amp_conf["AMPWEBROOT"];
if (is_dir($amp_conf["AMPWEBROOT"])) {
break;
} else if (amp_mkdir($amp_conf["AMPWEBROOT"],"0755",true)){
out("Created ".$amp_conf["AMPWEBROOT"]);
break;
} else {
fatal("Cannot create ".$amp_conf["AMPWEBROOT"]."!");
}
} while(1);
// Really no need to ask, is there.
/* should be deprecated and only under proramatic control
if (empty($fopwebroot))
$amp_conf["FOPWEBROOT"] = $amp_conf["AMPWEBROOT"]."/panel";
else
$amp_conf["FOPWEBROOT"] = $fopwebroot;
*/
outn("Enter the IP ADDRESS or hostname used to access the AMP web-admin:\n [$freepbxip] ");
$key = trim(fgets(STDIN,1024));
if (preg_match('/^$/',$key)) $amp_conf["AMPWEBADDRESS"] = $freepbxip;
else $amp_conf["AMPWEBADDRESS"] = $key;
outn("Use simple Extensions [extensions] admin or separate Devices and Users [deviceanduser]?\n [extensions] ");
$key = trim(fgets(STDIN,1024));
if (preg_match('/^$/',$key)) $amp_conf["AMPEXTENSIONS"] = "extensions";
else $amp_conf["AMPEXTENSIONS"] = $key;
do {
out("Enter directory in which to store AMP executable scripts:\n [$ampbin_dir] ");
$key = trim(fgets(STDIN,1024));
if (preg_match('/^$/',$key))
$amp_conf["AMPBIN"] = $ampbin_dir;
else
$amp_conf["AMPBIN"] = rtrim($key,'/');
if (is_dir($amp_conf["AMPBIN"])) {
break;
} else if (amp_mkdir($amp_conf["AMPBIN"],"0755",true)){
out("Created ".$amp_conf["AMPBIN"]);
break;
} else {
fatal("Cannot create ".$amp_conf["AMPBIN"]."!");
}
} while(1);
do {
out("Enter directory in which to store super-user scripts:\n [$ampsbin_dir] ");
$key = trim(fgets(STDIN,1024));
if (preg_match('/^$/',$key))
$amp_conf["AMPSBIN"] = "$ampsbin_dir";
else
$amp_conf["AMPSBIN"] = rtrim($key,'/');
if (is_dir($amp_conf["AMPSBIN"])) {
break;
} else if (amp_mkdir($amp_conf["AMPSBIN"],"0755",true)){
out("Created ".$amp_conf["AMPSBIN"]);
break;
} else {
fatal("Cannot create ".$amp_conf["AMPSBIN"]."!");
}
} while(1);
// write amportal.conf
write_amportal_conf($filename, $amp_conf);
outn(AMP_CONF." written");
}
/** Set base of packaged modules to the versions packaged in the tarball since they are
* getting overwritten with the tarball from anything that may have been updated online.
*
*/
function set_base_version() {
global $dryrun;
// read modules list from MODULE_DIR
//
$included_modules = array();
$dir = opendir(MODULE_DIR);
while ($file = readdir($dir)) {
if ($file[0] != "." && $file[0] != "_" && is_dir(MODULE_DIR."/".$file)) {
$included_modules[] = $file;
}
}
closedir($dir);
foreach ($included_modules as $up_module) {
outn("Checking $up_module.. ");
if (!$dryrun) {
out(set_module_version($up_module));
} else {
out("Dry Run Not Updated");
}
}
}
/** Install all modules packaged with the install. We use the force flag because the
* the assumption is that the dependencies are met and the package is able to have
* the modules installed.
*/
function install_modules() {
global $dryrun;
global $amp_conf;
// read modules list from MODULE_DIR
//
$included_modules = array();
$dir = opendir(MODULE_DIR);
while ($file = readdir($dir)) {
if ($file[0] != "." && $file[0] != "_" && is_dir(MODULE_DIR."/".$file)) {
$included_modules[] = $file;
}
}
closedir($dir);
$output = array();
$keep_checking = true;
$num_modules = false;
while ($keep_checking && count($included_modules)) {
if ($num_modules === count($included_modules)) {
$keep_checking = false;
} else {
$num_modules = count($included_modules);
}
foreach ($included_modules as $id => $up_module) {
outn("Checking $up_module.. ");
if (!$dryrun) {
// if $keep_checking then check dependencies first and skip if not met
// otherwise we will install anyhow even if some dependencies are not met
// since it is included. (TODO: should we not?)
//
if ($keep_checking) {
exec($amp_conf['AMPBIN']."/module_admin --no-warnings checkdepends $up_module",$output,$retval);
unset($output);
if ($retval) {
out("dependencies pending");
continue;
}
}
// Framework modules cannot be enabled, only installed.
//
switch ($up_module) {
case 'framework':
case 'fw_ari':
system($amp_conf['AMPBIN']."/module_admin --no-warnings -f install $up_module");
out("installed");
break;
default:
system($amp_conf['AMPBIN']."/module_admin --no-warnings -f install $up_module");
system($amp_conf['AMPBIN']."/module_admin --no-warnings -f enable $up_module");
out("installed");
}
unset($included_modules[$id]);
} else {
out("Dry Run Not Installed");
}
}
}
}
/** Set the module version number to the packaged version and enable
* module must require not install.php or install.sql script
* this is primarily to package core and framework with FreePBX tarballs
*
*/
function set_module_version($module) {
global $db;
$module_dir = MODULE_DIR;
$file_path = $module_dir.$module."/module.xml";
if (file_exists($file_path)) {
// TODO: this is bad, there are other version tags (depends on) but this
// is equivalnet to what publish.pl does, so it expects this to be
// at the top.
//
$module_xml = file_get_contents($file_path);
if (preg_match('/<version>(.+)<\/version>/', $module_xml, $matches)) {
$version = $matches[1];
} else {
fatal("ERROR: $file_path found but no version information");
}
} else {
return "not packaged, no updating needed";
}
// If we didn't return above, then we found the package as part of the install
// tarball and want to update the version info since this might be overwriting
// an existing install that has a newer version.
//
$sql = "SELECT version FROM modules WHERE modulename = '$module'";
$result = $db->getCol($sql);
if(DB::IsError($result)) {
fatal("error accessing version table: ".$result->getMessage());
}
$sql = "";
if (count($result) == 0) {
// insert but disable as we have to first run install scripts which come later
$sql = "INSERT INTO modules (modulename, version, enabled) VALUES ('$module', '$version', 0)";
} else if ($result[0] != $version) {
if (version_compare_freepbx($version, $result[0], "gt")) {
// if new version is greater than old, then we disable the module and it will get enabled next when installed
//
$sql = "UPDATE modules SET version = '$version', enabled = 0 WHERE modulename = '$module'";
} else {
// if new version is equal to or less than old, then we leave it in the enable/disable state it was in but just
// reset the version number.
//
$sql = "UPDATE modules SET version = '$version' WHERE modulename = '$module'";
}
}
if ($sql) {
debug($sql);
$result = $db->query($sql);
if(DB::IsError($result)) {
fatal("error writing to version table: ".$result->getMessage());
}
return "updated to $version";
} else {
return "already at $version";
}
}
function installampimport_mysql_dump($file,$db=NULL) {
if(!isset($db)) {
global $db;
}
$dir = dirname(__FILE__);
if(file_exists($dir.'/SQL/'.$file)) {
// Temporary variable, used to store current query
$templine = '';
// Read in entire file
$lines = file($dir.'/SQL/'.$file);
// Loop through each line
foreach ($lines as $line)
{
// Skip it if it's a comment
if (substr($line, 0, 2) == '--' || $line == '')
continue;
// Add this line to the current segment
$templine .= $line;
// If it has a semicolon at the end, it's the end of the query
if (substr(trim($line), -1, 1) == ';')
{
// Perform the query
$result = $db->query($templine);
if(DB::IsError($result)) {
fatal("Error performing query: ". $templine . " Message:".$result->getMessage());
}
// Reset temp variable to empty
$templine = '';
}
}
}
}
/********************************************************************************************************************/
//
// TODO: will this work, basically using bootstrap once installed if using to upgrade, etc?
/*
$bootstrap_settings['skip_astman']) = true;
$bootstrap_settings['freepbx_auth'] = false;
$restrict_mods = true;
if (@include_once(getenv('FREEPBX_CONF') ? getenv('FREEPBX_CONF') : '/etc/freepbx.conf')) {
out(_("FreePBX already installed, bootstrapping"));
} else if (@include_once('/etc/asterisk/freepbx.conf')) {
out(_("FreePBX already installed, bootstrapping"));
} else {
// all the initialization here instead
}
*/
// **** Make sure we have STDIN etc
// from ben-php dot net at efros dot com at php.net/install.unix.commandline
if (version_compare(phpversion(),'4.3.0','<') || !defined("STDIN")) {
define('STDIN',fopen("php://stdin","r"));
define('STDOUT',fopen("php://stdout","r"));
define('STDERR',fopen("php://stderr","r"));
register_shutdown_function( create_function( '' , 'fclose(STDIN); fclose(STDOUT); fclose(STDERR); return true;' ) );
}
// **** Make sure we have PEAR's DB.php, and include it
outn("Checking for PEAR DB..");
if (! @ include('DB.php')) {
out("FAILED");
fatal("PEAR must be installed (requires DB.php). Include path: ".ini_get("include_path"));
}
out("OK");
// **** Make sure we have PEAR's GetOpts.php, and include it
outn("Checking for PEAR Console::Getopt..");
if (! @ include("Console/Getopt.php")) {
out("FAILED");
fatal("PEAR must be installed (requires Console/Getopt.php). Include path: ".ini_get("include_path"));
}
out("OK");
// **** Parse out command-line options
$shortopts = "h?u:p:";
$longopts = array("help","debug","dry-run","username=","password=","force-version=","dbhost=","no-files","force-overwrite","dbname=","my-svn-is-correct","engine=","webroot=","install-moh","install-fop=","make-links-devel","dev-links","skip-module-install","uid=","gid=","scripted","freepbxip=","asteriskip=","set-freepbx-settings","cleaninstall","uninstall","installdb");
$args = Console_Getopt::getopt(Console_Getopt::readPHPArgv(), $shortopts, $longopts);
if (is_object($args)) {
// assume it's PEAR_ERROR
out($args->message);
exit(255);
}
$debug = false;
$dryrun = false;
$install_files = true;
$override_astvers = false;
$scripted = false;
$install_moh = false;
$make_links = false;
$module_install = true;
$set_freepbx_settings = false;
$installamp_clean = false;
$uninstallamp = false;
$installdb = false;
//initialize variables to avoid php notices
$dbhost = null;
$dbname = 'asterisk';
$new_username = null;
$new_password = null;
$runas_uid = "asterisk";
$runas_gid = "asterisk";
$freepbxip = "192.168.1.1";
$asteriskip = "localhost";
foreach ($args[0] as $arg) {
switch ($arg[0]) {
case "--help": case "h": case "?":
showHelp();
exit(10);
break;
case "--dry-run":
out("Dry-run only, nothing will be changed");
$dryrun = true;
break;
case "--debug":
$debug = true;
debug("Debug mode enabled");
break;
case "--username": case "u":
out("Using username: ".$arg[1]);
$new_username = $arg[1];
break;
case "--password": case "p":
out("Using password: ".str_repeat("*",strlen($arg[1])));
$new_password = $arg[1];
break;
case "--force-version":
$version = $arg[1];
out("Forcing upgrade from version ".$version);
break;
case "--dbhost":
$dbhost = $arg[1];
out("Using remote database server at ".$dbhost);
break;
case "--dbname":
$dbname = $arg[1];
out("Using database ".$dbname);
break;
case "--no-files":
$install_files = false;
out("Running upgrade only, without installing files.");
break;
case "--force-overwrite":
$check_md5s = false;
out("Overwriting all files including modified ones.");
break;
case "--my-svn-is-correct":
$override_astvers = true;
break;
case "--engine":
if ($arg[1] != 'asterisk') {
fatal('Currently only "asterisk" is supported as a PBX engine');
}
$pbx_engine = $arg[1];
break;
case "--install-moh":
$install_moh = true;
break;
case "--set-freepbx-settings":
$set_freepbx_settings = true;
break;
case "--fopwebroot":
case "--install-fop":
out("install-fop: depricated setting, does nothing.");
break;
case "--make-links-devel":
case "--dev-links":
$make_links = true;
break;
case "--skip-module-install":
$module_install = false;
break;
case "--fopwebroot":
/* should be deprecated and only under proramatic control
$fopwebroot = $arg[1];
out("Using fop at ".$fopwebroot);
*/
break;
case "--webroot":
$webroot = $arg[1];
out("Using Webroot at ".$webroot);
break;
case "--cgibin":
$cgibin = $arg[1];
out("Using CGI-BIN at ".$cgibin);
break;
case "--bin":
$ampbin_dir = $arg[1];
out("Using bin at ".$ampbin_dir);
break;
case "--sbin":
$ampsbin_dir = $arg[1];
out("Using sbin at ".$ampsbin_dir);
break;
case "--asteriskuser":
$asterisk_user = $arg[1];
out("Using Asterisk user ".$asterisk_user);
break;
case "--asteriskpass":
$asterisk_pass = $arg[1];
out("Using asteriskpass ".str_repeat("*",strlen($arg[1])));
break;
case "--uid":
$runas_uid = $arg[1];
out("Setting ownership (user) to ".$runas_uid);
break;
case "--gid":
$runas_gid = $arg[1];
out("Setting ownership (group) to ".$runas_gid);
break;
case "--scripted":
$scripted = true;
out("Unattended installation. No questions will be asked");
break;
case "--freepbxip":
$freepbxip = $arg[1];
out("Setting IP address of web interface to $freepbxip");
break;
case "--asteriskip":
$asteriskip = $arg[1];
out("Setting IP address of asterisk to $asteriskip");
break;
case "--cleaninstall":
$installamp_clean = true;
break;
case "--uninstall":
$uninstallamp = true;
break;
case "--installdb":
$installdb = true;
break;
}
}
if($installamp_clean || $uninstallamp) {
global $webroot;
global $asterisk_user;
global $asterisk_pass;
$oldampconf = array();
if(file_exists('/etc/amportal.conf')) {
$amportalconf = file_get_contents('/etc/amportal.conf');
if(preg_match('/AMPWEBROOT=(.*)/',$amportalconf,$matches)) {
$oldampconf['AMPWEBROOT'] = $matches[1];
}
if(preg_match('/AMPDBENGINE=(.*)/',$amportalconf,$matches)) {
$oldampconf['AMPDBENGINE'] = $matches[1];
}
if(preg_match('/AMPDBUSER=(.*)/',$amportalconf,$matches)) {
$oldampconf['AMPDBUSER'] = $matches[1];
}
if(preg_match('/AMPDBPASS=(.*)/',$amportalconf,$matches)) {
$oldampconf['AMPDBPASS'] = $matches[1];
}
if(preg_match('/AMPDBNAME=(.*)/',$amportalconf,$matches)) {
$oldampconf['AMPDBNAME'] = $matches[1];
}
if(preg_match('/AMPDBHOST=(.*)/',$amportalconf,$matches)) {
$oldampconf['AMPDBHOST'] = $matches[1];
}
outn("Remove /etc/amportal.conf?:\n [y] ");
$key = trim(fgets(STDIN,1024));
switch($key) {
case "n":
case "no":
break;
case "y":
case "yes":
default:
outn("Removing /etc/amportal.conf.....");
unlink('/etc/amportal.conf');
out("Done!");
break;
}
}
if(file_exists('/etc/freepbx.conf')) {
outn("Remove /etc/freepbx.conf?:\n [y] ");
$key = trim(fgets(STDIN,1024));
switch($key) {
case "n":
case "no":
break;
case "y":
case "yes":
default:
outn("Removing /etc/freepbx.conf.....");
unlink('/etc/freepbx.conf');
out("Done!");
break;
}
}
if(file_exists('/usr/local/sbin/amportal')) {
outn("Remove /usr/local/sbin/amportal?:\n [y] ");
$key = trim(fgets(STDIN,1024));
switch($key) {
case "n":
case "no":
break;
case "y":
case "yes":
default:
outn("Removing /usr/local/sbin/amportal.....");
unlink('/usr/local/sbin/amportal');
out("Done!");
break;
}
}
if(file_exists('/var/lib/asterisk/bin')) {
outn("Remove All FreePBX Tools in /var/lib/asterisk/bin?:\n [y] ");
$key = trim(fgets(STDIN,1024));
$files = array("archive_recordings","freepbx_engine", "gen_amp_conf.php", "libfreepbx.confgen.php", "retrieve_conf", "freepbx-cron-scheduler.php", "freepbx_setting", "generate_hints.php", "module_admin", "retrieve_parse_amportal_conf.pl");
switch($key) {
case "n":
case "no":
break;
case "y":
case "yes":
default:
foreach($files as $file) {
if(file_exists('/var/lib/asterisk/bin/'.$file)) {
outn("Removing /var/lib/asterisk/bin/".$file.".....");
unlink("/var/lib/asterisk/bin/".$file);
out("Done!");
}
}
break;
}
}
if(!empty($oldampconf) && isset($oldampconf['AMPWEBROOT']) && file_exists($oldampconf['AMPWEBROOT'])) {
outn("Remove ".$oldampconf['AMPWEBROOT']."?:\n [y] ");
$key = trim(fgets(STDIN,1024));
switch($key) {
case "n":
case "no":
break;
case "y":
case "yes":
default:
outn("Removing ".$oldampconf['AMPWEBROOT']."......");
exec('rm -Rf '.$oldampconf['AMPWEBROOT']);
out("Done!");
break;
}
}
if(!$uninstallamp && !empty($oldampconf) && $oldampconf['AMPDBENGINE'] == 'mysql') {
outn("Reinitalize & Reinstall Freepbx's Asterisk Database?:\n [y] ");
$key = trim(fgets(STDIN,1024));
switch($key) {
case "n":
case "no":
break;
case "y":
case "yes":
default:
outn("Erasing Database...");
$datasource = 'mysql://'.$oldampconf["AMPDBUSER"].':'.$oldampconf["AMPDBPASS"].'@'.$oldampconf["AMPDBHOST"].'/'.$oldampconf["AMPDBNAME"];
$cleandb = DB::connect($datasource); // attempt connection
if(DB::IsError($cleandb)) {
out("FAILED");
fatal("Try not selecting 'y' on Reinitalize & Reinstall Freepbx's Asterisk Database");
} else {
$sql = "SHOW TABLES FROM ".$oldampconf['AMPDBNAME'];
$tables = $cleandb->getAll($sql);
foreach($tables as $list) {
$sql = "DROP TABLE ".$oldampconf['AMPDBNAME'].".".$list[0];
$cleandb->query($sql);
}
out("Done");
outn("Reinstalling DB Structure...");
installampimport_mysql_dump('newinstall.sql',$cleandb);
out("Done");
}
break;
}
}
if($uninstallamp && !empty($oldampconf)) {
outn("Uninstall Freepbx's Asterisk Database?:\n [y] ");
$key = trim(fgets(STDIN,1024));
switch($key) {
case "n":
case "no":
break;
case "y":
case "yes":
default:
outn("Erasing Database...");
$datasource = 'mysql://'.$oldampconf["AMPDBUSER"].':'.$oldampconf["AMPDBPASS"].'@'.$oldampconf["AMPDBHOST"].'/'.$oldampconf["AMPDBNAME"];
$cleandb = DB::connect($datasource); // attempt connection
if(DB::IsError($cleandb)) {
out("FAILED");
fatal("Try not selecting 'y' on Uninstall Freepbx's Asterisk Database");
} else {
$sql = "SHOW TABLES FROM ".$oldampconf['AMPDBNAME'];
$tables = $cleandb->getAll($sql);
foreach($tables as $list) {
$sql = "DROP TABLE ".$oldampconf['AMPDBNAME'].".".$list[0];
$cleandb->query($sql);
}
out("Done");
}
break;
}
}
if($uninstallamp) {
die("Successfully Uninstalled FreePBX\n");
}
}
// **** Look for user = root
// TODO: if we bootstrap, do this first before even trying. Also, is their a problem boostraping as user root???
//
outn("Checking user..");
//$current_user=(isset($_ENV["USER"]) ? $_ENV["USER"] : exec('whoami',$output));
$euid = (posix_getpwuid(posix_geteuid()));
$current_user = $euid['name'];
if ($current_user != "root"){
out("FAILED");
fatal($argv[0]." must be run as root");
}
out("OK");
// TODO: if we bootstrap, do this first before even trying.
//
outn("Checking if Asterisk is running..");
exec("pidof asterisk", $pid_val, $ret);
if ($ret) {
out("FAILED");
fatal($argv[0]."\n\tAsterisk must be running. If this is a first time install, you should start\n\tAsterisk by typing './start_asterisk start'\n\tFor upgrading, you should run 'amportal start'");
}
out("running with PID: ".$pid_val[0]."..OK");
// **** Check for amportal.conf, create if necessary
// TODO: Check if freepbx_settings has been setup, if so then we don't even want to mess with ampportal.conf, that
// should only be first time install.
//
outn("Checking for ".AMP_CONF."..");
if (!file_exists(AMP_CONF)) {
out(AMP_CONF." does not exist, copying default");
copy("amportal.conf", AMP_CONF);
// this file contains password and should not be a+r
// this addresses http://freepbx.org/trac/ticket/1878
chown(AMP_CONF, $runas_uid);
chgrp(AMP_CONF, $runas_gid);
chmod(AMP_CONF, 0640);
collect_settings(AMP_CONF, $dbhost, $new_username, $new_password, $dbname);
out("Assuming new install, --install-moh added to command line");
$install_moh = true;
}
out("OK");
// **** read amportal.conf
// TODO: see comments above, have we already boostraped, if so, skip this?
//
outn("Reading ".AMP_CONF."..");
$amp_conf = install_parse_amportal_conf(AMP_CONF);
if (count($amp_conf) == 0) {
fatal("FAILED");
}
out("OK");
// TODO: if we boostrapped I think we can count on ALL of these being set but maybe it's
// fine to do a sanity check?
//
// Ensure our "critical" variables are set. We absolutely need these to copy in files.
if (!array_key_exists("AMPWEBROOT",$amp_conf)) {
out("Adding AMPWEBROOT option to amportal.conf - using AMP default");
$amp_conf["AMPWEBROOT"] = "/var/www/html";
}
if (!array_key_exists("AMPBIN",$amp_conf)) {
out("Adding AMPBIN option to amportal.conf - using AMP default");
$amp_conf["AMPBIN"] = "/var/lib/asterisk/bin";
}
if (!array_key_exists("AMPSBIN",$amp_conf)) {
out("Adding AMPSBIN option to amportal.conf - using AMP default");
$amp_conf["AMPSBIN"] = "/usr/sbin";
}
if (!array_key_exists("AMPDBENGINE",$amp_conf)) {
out("Adding AMPDBENGINE option to amportal.conf - using AMP default");
$amp_conf["AMPDBENGINE"] = "mysql";
}
if (!array_key_exists("AMPDBNAME",$amp_conf)) {
out("Adding AMPDBNAME option to amportal.conf - using AMP default");
$amp_conf["AMPDBNAME"] = "asterisk";
}
// TODO: if we boostrapped do we ignore these? (Can they even be set?)
//
if (isset($new_username)) {
$amp_conf["AMPDBUSER"] = $new_username;
}
if (isset($new_password)) {
$amp_conf["AMPDBPASS"] = $new_password;
}
if (isset($dbhost)) {
$amp_conf["AMPDBHOST"] = $dbhost;
}
if (isset($dbname)) {
$amp_conf["AMPDBNAME"] = $dbname;
}
// If they pre-set this in their amportal.conf or this is an upgrade, we should honor it as well
//
// TODO: if we boostrap, then this value could be normalized (1/0 I think?)
//
// write amportal.conf
// TODO: if we boostrapped we don't want to write amportal.conf, or do we? e.g. if we are running out of the file vs. the
// database then we probably want to write, though there should be a freepbx_conf class to use that does that and knows
// how to make that decsion as well as what to write?
//
write_amportal_conf(AMP_CONF, $amp_conf);
// **** Check for amportal.conf, create if necessary
outn("Checking for ".ASTERISK_CONF."..");
if (!file_exists(ASTERISK_CONF)) {
out(ASTERISK_CONF." does not exist, copying default");
copy("asterisk.conf", ASTERISK_CONF);
}
out("OK");
// **** read asterisk.conf
// TODO: if we boostrapped don't do this
//
outn("Reading ".ASTERISK_CONF."..");
$asterisk_conf = install_parse_asterisk_conf(ASTERISK_CONF);
if (count($asterisk_conf) == 0) {
fatal("FAILED. Have you installed Asterisk?");
}
out("OK");
/* TODO: if we boostrapped this should have been done but doesn't hurt?
*/
if (isset($asterisk_conf['astetcdir'])) { $amp_conf['ASTETCDIR'] = $asterisk_conf['astetcdir']; }
if (isset($asterisk_conf['astmoddir'])) { $amp_conf['ASTMODDIR'] = $asterisk_conf['astmoddir']; }
if (isset($asterisk_conf['astvarlibdir'])) { $amp_conf['ASTVARLIBDIR'] = $asterisk_conf['astvarlibdir']; }
if (isset($asterisk_conf['astagidir'])) { $amp_conf['ASTAGIDIR'] = $asterisk_conf['astagidir']; }
if (isset($asterisk_conf['astspooldir'])) { $amp_conf['ASTSPOOLDIR'] = $asterisk_conf['astspooldir']; }
if (isset($asterisk_conf['astrundir'])) { $amp_conf['ASTRUNDIR'] = $asterisk_conf['astrundir']; }
if (isset($asterisk_conf['astlogdir'])) { $amp_conf['ASTLOGDIR'] = $asterisk_conf['astlogdir']; }
if (!isset($pbx_engine)) { $pbx_engine='asterisk'; }
out("Using $pbx_engine as PBX Engine");
$amp_conf["AMPENGINE"]=$pbx_engine;
// TODO: I guess we have new variables set, of course see note above if we boostrapped. Probably
// this one stays?
//
write_amportal_conf(AMP_CONF, $amp_conf);
// **** Write asterisk version to ASTETCDIR/version
// TODO: does anything use this? What's the point? (other than we need the version for below)
//
$tmpoutput = '';
$tmpout = exec("asterisk -V", $tmpoutput, $exitcode);
if ($exitcode != 0) {
fatal("Error executing asterisk: be sure Asterisk is installed and in the path");
}
if (!$fd = fopen($amp_conf['ASTETCDIR'].'/version','w')) {
fatal('Cannot open '.$amp_conf['ASTETCDIR'].'/version for writing');
}
fwrite($fd, $tmpout);
fclose($fd);
// change to read-only
chmod($amp_conf['ASTETCDIR'].'/version',0444);
// normally this would be the contents of ASTETCDIR/version, but this is for simplicity, as we just read it above
$verinfo = $tmpout;
// **** Check asterisk version
// Set the 'engine' to be 'asterisk14' if using asterisk 1.4, otherwise
// 'asterisk'
outn("Checking for Asterisk version..");
if ((preg_match('/^Asterisk (\d+(\.\d+)*)(-?(.*))$/', $verinfo, $matches)) ||
(preg_match('/^Asterisk SVN-(\d+(\.\d+)*)(-?(.*))$/', $verinfo, $matches))) {
if ((version_compare($matches[1], "1.6") < 0)) {
fatal("Asterisk 1.6, 1.8 or 10 is required for this version of FreePBX. Detected version is: ".$matches[1]);
}
if (version_compare($matches[1], "12", "ge")) {
fatal("Asterisk 1.6, 1.8, 10 or 11 is required for this version of FreePBX. Detected version is: ".$matches[1]);
}
out("{$matches[1]}");
$asterisk_version = $matches[1];
} elseif (preg_match('/^Asterisk ([ABC]\.\d+(\.\d+)*)(-?(.*))$/', $verinfo, $matches)) {
if (substr($matches[1], 0, 1) == "A") {
fatal("Asterisk Business Edition B or C is required for this version of FreePBX. Detected version is: ".$matches[1]);
}
out("{$matches[1]}");
$asterisk_version = '1.4'; //Not really, but this makes sure that proper execution occurs later on reload commands, etc.
} elseif ($asterisk_version = preg_match('/^Asterisk SVN.+/', $verinfo)) {
out("FAIL");
out("*** WARNING ***");
out("You are not using a released version of Asterisk. We are unable to verify");
out("that your Asterisk version is compatible with FreePBX. Whilst this probably");
out("won't cause any problems, YOU NEED TO BE CERTAIN that it is compatible");
out("with at least the released Asterisk version 1.2" );
if ($override_astvers==false) {
out("If you are SURE that this is compatible, you can re-run ".$argv[0]." with");
out("the parameter --my-svn-is-correct");
exit;
} else {
out("--my-svn-is-correct specified, continuing");
}
} else {
fatal("Could not determine asterisk version (got: \"".$verinfo."\" please report this)");
}
// **** Make sure selinux isn't enabled
#outn("Checking for selinux..");
#$tmpoutput = array();
#$tmpout = exec("getenforce 2>/dev/null", $tmpoutput, $sereturn);
#if (isset($tmpoutput[0]) && strtolower($tmpoutput[0]) === "enabled") {
# // this method seems better because disabled and permissive are the same
# // if a user installs and realizes selinux is running the other method
# // requires a reboot to get selinuxenabled to work after editing the selinux config
# // this will allow you to use setenforce 0 which turns selinux into permissive mode which
# // doesnt enforce, it just warns.
# fatal("selinux is ENABLED. This is not supported. Please disable selinux before using FreePBX");
#}
#out("OK");
// **** Connect to database
// TODO: if we bootstrapped, we are already connected and this can all be skipped
//
outn("Connecting to database..");
$db_engine = $amp_conf["AMPDBENGINE"];
if ($db_engine != "sqlite3") {
$db_user = $amp_conf["AMPDBUSER"];
$db_pass = $amp_conf["AMPDBPASS"];
$db_host = $amp_conf["AMPDBHOST"];
}
$db_name = $amp_conf["AMPDBNAME"];
// we still support older configurations, and fall back
// into mysql when no other engine is defined
if ($db_engine == "")
{
$db_engine = "mysql";
}
switch ($db_engine)
{
case "pgsql":
case "mysql":
// datasource in in this style: dbengine://username:password@host/database
if (!function_exists($db_engine.'_connect')) {
out("FAILED");
fatal($db_engine." PHP libraries not installed");
}
$datasource = $db_engine.'://'.$db_user.':'.$db_pass.'@'.$db_host.'/'.$db_name;
$db = DB::connect($datasource); // attempt connection
break;
case "sqlite":
die_freepbx("SQLite2 support is deprecated. Please use sqlite3 only.");
break;
case "sqlite3":
if (!isset($amp_conf["AMPDBFILE"]))
die("You must setup properly AMPDBFILE in /etc/amportal.conf");
if (isset($amp_conf["AMPDBFILE"]) == "")
die("AMPDBFILE in /etc/amportal.conf cannot be blank");
/* on centos this extension is not loaded by default */
if (! extension_loaded('sqlite3.so') && ! extension_loaded('SQLITE3'))
dl('sqlite3.so');
if (! @require_once('DB/sqlite3.php') )
{
out("FAILED");
fatal( "Your PHP installation has no PEAR/SQLite3 support. Please install php-sqlite3 and php-pear.");
}
$datasource = "sqlite3:///" . $amp_conf["AMPDBFILE"] . "?mode=0666";
$db = DB::connect($datasource);
break;
default:
die( "Unknown SQL engine: [$db_engine]");
}
if(DB::IsError($db)) {
out("FAILED");
debug($db->userinfo);
out("Try running ".$argv[0]." --username=user --password=pass (using your own user and pass)");
fatal("Cannot connect to database");
}
out("OK");
if($installdb) {
outn("Checking state of FreePBX DB...");
$sql = "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '".$amp_conf["AMPDBNAME"]."'";
if(!$db->getOne($sql)) {
outn("FreePBX DB is empty, inserting standard rows...");
installampimport_mysql_dump('newinstall.sql');
out("Done!");
} else {
out("FreePBX DB is already populated skipping");
}
}
// **** Read DB for version info
if (!isset($version)) {
outn("Checking current version of AMP..");
$version = install_getversion();
if (!$version) {
out("no version information");
out("Assuming new installation");
} else {
out($version);
}
}
// Check if freepbx_settings is there and has been initialized
// if it has anything less than about 5 settings in it (and that
// is probably quite low) then something is wrong so assume it
// is not there.
//
$sql = "SELECT count(*) FROM freepbx_settings";
$num_settings = $db->getOne($sql);
$force_amportal_conf = DB::IsError($num_settings) || $num_settings < 5;
// **** Copy files
if ($install_files)
{
outn("Installing new FreePBX files..");
$check_md5s=false;
$md5sums = read_md5_file(UPGRADE_DIR."/".$version.".md5");
list($num_files, $num_copied) = recursive_copy("amp_conf", "", $md5sums);
if (!is_file("/etc/asterisk/voicemail.conf")) copy("/etc/asterisk/voicemail.conf.template","/etc/asterisk/voicemail.conf");
if (!is_dir("/var/spool/asterisk/voicemail/device")) amp_mkdir("/var/spool/asterisk/voicemail/device", "0755", true);
out("OK (".$num_copied." files copied, ".($num_files-$num_copied)." skipped)");
// link the packed js library for ARI, if there the error will indicate that
$libfreepbx = $amp_conf['AMPWEBROOT'].'/admin/common/libfreepbx.javascripts.js';
$dest_libfreepbx = $amp_conf['AMPWEBROOT'].'/recordings/theme/js/libfreepbx.javascripts.js';
if (!file_exists($amp_conf['AMPWEBROOT'].'/recordings/theme/js')) {
mkdir($amp_conf['AMPWEBROOT'].'/recordings/theme/js',0755, true);
}
if (file_exists($libfreepbx) && !file_exists($dest_libfreepbx)) {
outn(_("linking libfreepbx.javascripts.js to theme/js.."));
if (link($libfreepbx, $dest_libfreepbx)) {
out(_("ok"));
} else {
out(_("possible error - check warning message"));
}
}
}
if (!$dryrun) {
$asteriskuser = isset($amp_conf['AMPASTERISKUSER']) && $amp_conf['AMPASTERISKUSER'] ? $amp_conf['AMPASTERISKUSER'] : 'asterisk';
if (file_exists($amp_conf["AMPSBIN"]."/amportal")) {
exec("chmod 755 ".$amp_conf["AMPSBIN"]."/amportal");
outn("amportal..");
} else {
outn("no amportal..");
}
if (file_exists($amp_conf["AMPSBIN"]."/fpbx")) {
exec("chmod 755 ".$amp_conf["AMPSBIN"]."/fpbx");
outn("fpbx..");
} else {
outn("no fpbx..");
}
if (file_exists($amp_conf["AMPBIN"]."/freepbx_engine")) {
exec("chmod 755 ".$amp_conf["AMPBIN"]."/freepbx_engine");
outn("freepbx_engine..");
} else {
outn("no freepbx_engine..");
}
if (file_exists($amp_conf["AMPBIN"]."/freepbx_setting")) {
exec("chmod 755 ".$amp_conf["AMPBIN"]."/freepbx_setting");
outn("freepbx_setting..");
} else {
outn("no freepbx_setting..");
}
if (file_exists($amp_conf["AMPBIN"]."/gen_amp_conf.php")) {
exec("chmod 755 ".$amp_conf["AMPBIN"]."/gen_amp_conf.php");
outn("gen_amp_conf.php..");
} else {
outn("no gen_amp_conf..");
}
out("done");
// Ensure UIDs are set correctly before any chowns happen
// Note - freepbx_engine must be used the first time to ensure that freepbx.conf exists.
exec($amp_conf["AMPBIN"]."/freepbx_engine admin freepbx_setting AMPASTERISKWEBGROUP $runas_gid");
exec($amp_conf["AMPBIN"]."/freepbx_setting AMPASTERISKWEBUSER $runas_uid");
exec($amp_conf["AMPBIN"]."/freepbx_setting AMPASTERISKGROUP $runas_gid");
exec($amp_conf["AMPBIN"]."/freepbx_setting AMPASTERISKUSER $runas_uid");
exec($amp_conf["AMPBIN"]."/freepbx_setting AMPDEVGROUP $runas_gid");
exec($amp_conf["AMPBIN"]."/freepbx_setting AMPDEVUSER $runas_uid");
exec($amp_conf["AMPBIN"]."/freepbx_setting ASTMANAGERHOST $asteriskip");
// edit conf file passwords and then
// reload manager in asterisk if it is running:
//
if (file_exists(dirname(__FILE__)."/apply_conf.sh")) {
out("apply username/password changes to conf files:");
debug("Running ".dirname(__FILE__)."/apply_conf.sh");
$apply_conf_out = array();
if ($force_amportal_conf) {
out("running apply_conf.sh from " . AMP_CONF);
putenv('FORCE_AMPORTAL_CONF=1');
exec(dirname(__FILE__)."/apply_conf.sh ".AMP_CONF, $apply_conf_out);
putenv('FORCE_AMPORTAL_CONF=');
} else {
out("running apply_conf.sh from freepbx_settings");
exec(dirname(__FILE__)."/apply_conf.sh", $apply_conf_out);
}
foreach ($apply_conf_out as $line) {
out($line);
}
unset($apply_conf_out);
out("done with apply_conf.sh");
}
/* As of Asterisk 1.4.16 or there about, a missing #include file will make the reload fail. So
we need to make sure that we have such for everything that is in our configs. We will simply
look for the #include statements and touch the files vs. trying to inventory everything we may
need and then forgetting something.
*/
outn("creating missing #include files..");
$include_err = false;
exec("grep '#include' ".$amp_conf['ASTETCDIR']."/*.conf | sed 's/;.*//; s/#include//'",$output,$retcode);
if ($retcode != 0) {
out("Error code $retcode: trying to search for missing #include files");
$include_err = true;
}
foreach($output as $file) {
if (trim($file) == '') {
continue;
}
$parse1 = explode(':',$file);
$parse2 = explode(';',$parse1[1]);
$rawfile = trim($parse2[0]);
if ($rawfile == '') {
continue;
}
$target = ($rawfile[0] == '/') ? $rawfile : $amp_conf['ASTETCDIR']."/$rawfile";
if (!file_exists($target)) {
exec("touch $target", $output, $retcode);
if ($retcode != 0) {
out("Error code $retcode: trying to create empty file $target");
$include_err = true;
}
}
}
if (! $include_err) {
out("OK");
}
// reload manager in asterisk if it was running:
//
if (version_compare($asterisk_version,'1.4','ge')) {
system("asterisk -rx 'module reload manager'");
} else {
system("asterisk -rx 'reload manager'"); //1.2 syntax
}
}
out("OK");
// **** Create spool directories for monitor and fax
if (!is_dir($amp_conf["ASTSPOOLDIR"]."/monitor"))
amp_mkdir($amp_conf["ASTSPOOLDIR"]."/monitor","0766",true);
if (!is_dir($amp_conf["ASTSPOOLDIR"]."/fax"))
amp_mkdir($amp_conf["ASTSPOOLDIR"]."/fax","0766",true);
//Check to make sure database is installed
$sql = "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '".$amp_conf["AMPDBNAME"]."'";
if(!$db->getOne($sql)) {
fatal('The '. $amp_conf["AMPDBNAME"] . ' ' . $amp_conf["AMPDBENGINE"] . ' database appears empty, try running with the "--cleaninstall --installdb" commands or install the database manually');
}
// **** Set permissions all files
// tell amportal/freepbx_engine to use amportal.conf and not bootstrap
// if freepbx_settings has not been setup yet or you will get an error.
//
if ($install_files)
{
outn("Setting permissions on files..");
if (!$dryrun) {
if ($force_amportal_conf) {
putenv('FORCE_AMPORTAL_CONF=1');
}
exec($amp_conf["AMPSBIN"]."/amportal chown");
if ($force_amportal_conf) {
putenv('FORCE_AMPORTAL_CONF=');
}
}
out("OK");
}
// Run through all the upgrade scripts starting at the specified version
//
upgrade_all($version);
// Save $amp_conf variables so we can set the configured values
if (($set_freepbx_settings && $force_amportal_conf) || (!file_exists('/etc/redhat-release'))) {
$amp_conf_file = $amp_conf;
}
outn("Creating or updating freepbx_conf settings..");
freepbx_settings_init(true);
out("..OK");
// TODO: if file is $force_amportal_conf let's go set any settings in freepbx_settings,
// question is, should we do this further up???
//
if (($set_freepbx_settings && $force_amportal_conf) || (!file_exists('/etc/redhat-release'))) {
out("Setting freepbx settings form " . AMP_CONF);
$freepbx_conf =& freepbx_conf::create();
foreach ($amp_conf_file as $keyword => $value) {
if ($freepbx_conf->conf_setting_exists($keyword)) {
$freepbx_conf->set_conf_values(array($keyword => $value),true,true);
out("freepbx setting [$keyword] set to [$value]");
} else {
out("freepbx setting [$keyword] DOES NOT EXIST, can't set to [$value]");
}
}
} else {
//We are here mainly because of bug #6159
//Meaning they are installing this on CentOS manually so the above checks fail
global $webroot;
if(isset($webroot) && !empty($webroot) && ($webroot != $amp_conf['AMPWEBROOT'])) {
$freepbx_conf =& freepbx_conf::create();
outn("Noticed Irregular AMPWEBROOT setting....");
if ($freepbx_conf->conf_setting_exists('AMPWEBROOT')) {
$freepbx_conf->set_conf_values(array('AMPWEBROOT' => $webroot),true,true);
}
$amportalconf = file_get_contents('/etc/amportal.conf');
$amportalconf = preg_replace('/AMPWEBROOT=.*/', 'AMPWEBROOT='.$webroot, $amportalconf);
file_put_contents('/etc/amportal.conf',$amportalconf);
out("Fixed");
}
}
// **** Generate AMP configs
out("Generating AMP configs..");
generate_configs();
out("Generating AMP configs..OK");
$version = install_getversion();
// Now force an install for all modules that are packaged with the tarball
// directory.
//
if ($module_install) {
install_modules();
} else {
out("bypassing packaged module installation because --skip-module-install flag");
}
// **** Set reload flag for AMP admin
needreload();
if ($amp_conf["AMPWEBADDRESS"])
{
out("Please update your modules and reload Asterisk by visiting http://".$amp_conf["AMPWEBADDRESS"]."/admin",false);
}
else
{
out("Please update your modules and reload Asterisk by browsing to your server.",false);
}
out("",false);
out("*************************************************************************",false);
out("* Note: It's possible that if you click the red 'Update Now' bar BEFORE *",false);
out("* updating your modules, your machine will start dropping calls. Ensure *",false);
out("* that all modules are up to date BEFORE YOU CLICK THE RED BAR. As long *",false);
out("* as this is observed, your machine will be fully functional whilst the *",false);
out("* upgrade is in progress. *",false);
out("*************************************************************************",false);
// vim: set ts=4 sw=4 : //
// Ensure you 'set modeline' in your ~/.vimrc to activate this //
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment