#!/usr/bin/env bash # PHP installer # Min requirement : GNU/Linux Ubuntu 14.04 & 16.04 # Last Build : 17/09/2018 # Author : ESLabs.id (eslabs.id@gmail.com) # Include decorator if [ "$(type -t run)" != "function" ]; then BASEDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) . ${BASEDIR}/helper.sh fi # Make sure only root can run this installer script if [ $(id -u) -ne 0 ]; then error "You need to be root to run this script" exit 1 fi # Install PHP function install_php() { if [[ -n $1 ]]; then PHPv="$1" else PHPv="7.3" # default php install 7.0 (latest stable recommendation) fi # Checking if php already installed if [[ -n $(which php${PHPv}) ]]; then warning "PHP${PHPv} & FPM package already installed..." else echo "Installing PHP${PHPv} & FPM..." run apt-get install -y php${PHPv} php${PHPv}-bcmath php${PHPv}-cli php${PHPv}-common \ php${PHPv}-curl php${PHPv}-dev php${PHPv}-fpm php${PHPv}-mysql php${PHPv}-gd \ php${PHPv}-gmp php${PHPv}-imap php${PHPv}-intl php${PHPv}-json php${PHPv}-ldap \ php${PHPv}-mbstring php${PHPv}-opcache php${PHPv}-pspell php${PHPv}-readline \ php${PHPv}-recode php${PHPv}-snmp php${PHPv}-soap php${PHPv}-sqlite3 \ php${PHPv}-tidy php${PHPv}-xml php${PHPv}-xmlrpc php${PHPv}-xsl php${PHPv}-zip \ php-geoip php-pear pkg-php-tools spawn-fcgi fcgiwrap geoip-database >> lemper.log 2>&1 if [[ -n $(which php${PHPv}) ]]; then status "PHP${PHPv} & FPM package installed." fi # Install php mcrypt? echo "" while [[ $INSTALL_PHPMCRYPT != "y" && $INSTALL_PHPMCRYPT != "n" ]]; do read -p "Do you want to install PHP Mcrypt for encryption/decryption? [y/n]: " -e INSTALL_PHPMCRYPT done echo "" if [[ "$INSTALL_PHPMCRYPT" == Y* || "$INSTALL_PHPMCRYPT" == y* ]]; then if [ "${PHPv//.}" -lt "72" ]; then run apt-get install -y php${PHPv}-mcrypt elif [ "$PHPv" == "7.2" ]; then run apt-get -y install gcc make autoconf libc-dev pkg-config >> lemper.log 2>&1 run apt-get -y install libmcrypt-dev libreadline-dev >> lemper.log 2>&1 run pecl install mcrypt-1.0.1 >> lemper.log 2>&1 # enable module echo "Update PHP ini file with Mcrypt module..." bash -c "echo extension=mcrypt.so > /etc/php/${PHPv}/mods-available/mcrypt.ini" if [ ! -f /etc/php/${PHPv}/cli/conf.d/20-mcrypt.ini ]; then run ln -s /etc/php/${PHPv}/mods-available/mcrypt.ini /etc/php/${PHPv}/cli/conf.d/20-mcrypt.ini fi if [ ! -f /etc/php/${PHPv}/fpm/conf.d/20-mcrypt.ini ]; then run ln -s /etc/php/${PHPv}/mods-available/mcrypt.ini /etc/php/${PHPv}/fpm/conf.d/20-mcrypt.ini fi else run apt-get install -y dh-php >> lemper.log 2>&1 # use libsodium instead warning "Mcrypt is deprecated for PHP version $PHPv or greater, you should using Libsodium or OpenSSL." fi fi fi } # Remove PHP function remove_php() { if [[ -n $1 ]]; then PHPv="$1" else PHPv="7.3" # default php install 7.3 (latest stable recommendation) fi echo "Uninstalling PHP $PHPv..." if [[ -n $(which php-fpm${PHPv}) ]]; then run apt-get remove -y php${PHPv} php${PHPv}-bcmath php${PHPv}-cli php${PHPv}-common \ php${PHPv}-curl php${PHPv}-dev php${PHPv}-fpm php${PHPv}-mysql php${PHPv}-gd \ php${PHPv}-gmp php${PHPv}-imap php${PHPv}-intl php${PHPv}-json php${PHPv}-ldap \ php${PHPv}-mbstring php${PHPv}-opcache php${PHPv}-pspell php${PHPv}-readline \ php${PHPv}-recode php${PHPv}-snmp php${PHPv}-soap php${PHPv}-sqlite3 \ php${PHPv}-tidy php${PHPv}-xml php${PHPv}-xmlrpc php${PHPv}-xsl php${PHPv}-zip \ php-geoip php-pear pkg-php-tools spawn-fcgi fcgiwrap geoip-database >> lemper.log 2>&1 isMcrypt=$(/usr/bin/php${PHPv} -m | grep mcrypt) if [[ "_$isMcrypt" == "_mcrypt" ]]; then if [ "${PHPv//.}" -lt "72" ]; then run apt-get --purge remove -y php${PHPv}-mcrypt >> lemper.log 2>&1 elif [ "$PHPv" == "7.2" ]; then # uninstall run pecl uninstall mcrypt-1.0.1 >> lemper.log 2>&1 # remove module run rm /etc/php/${PHPv}/mods-available/mcrypt.ini if [ -f /etc/php/${PHPv}/cli/conf.d/20-mcrypt.ini ]; then run rm /etc/php/${PHPv}/cli/conf.d/20-mcrypt.ini fi if [ -f /etc/php/${PHPv}/fpm/conf.d/20-mcrypt.ini ]; then run rm /etc/php/${PHPv}/fpm/conf.d/20-mcrypt.ini fi else run apt-get --purge remove -y dh-php >> lemper.log 2>&1 # use libsodium instead warning "If you're installing Libsodium extension, then remove it separately." fi fi status -e "PHP $PHPv installation has been removed." else warning "PHP $PHPv installation couldn't be found." fi } # Install ionCube Loader function install_ic() { echo "Installing IonCube PHP loader..." arch=$(uname -p) if [[ "$arch" == "x86_64" ]]; then run wget -q "http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz" run tar -xzf ioncube_loaders_lin_x86-64.tar.gz run rm -f ioncube_loaders_lin_x86-64.tar.gz else run wget -q "http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86.tar.gz" run tar -xzf ioncube_loaders_lin_x86.tar.gz run rm -f ioncube_loaders_lin_x86.tar.gz fi # Delete old loaders file if [ -d /usr/lib/php/loaders/ioncube ]; then echo "Removing old/existing IonCube PHP loader..." run rm -fr /usr/lib/php/loaders/ioncube fi echo "Installing latest IonCube PHP loader..." run mv -f ioncube /usr/lib/php/loaders/ } # Enable ionCube Loader function enable_ic() { if [[ -n $1 ]]; then PHPv="$1" else PHPv="7.3" # default php install 7.3 (latest stable recommendation) fi echo "Enabling IonCube PHP ${PHPv} loader" if [ -f /usr/lib/php/loaders/ioncube/ioncube_loader_lin_${PHPv}.so ]; then cat > /etc/php/${PHPv}/mods-available/ioncube.ini < /etc/php/${PHPv}/mods-available/sourceguardian.ini <> /etc/php/${PHPv}/fpm/php.ini <> /etc/php/${PHPv}/fpm/php.ini <> /etc/php/${PHPv}/fpm/pool.d/lemper.conf < 0 ]]; then run service php${PHPv}-fpm restart status "PHP${PHPv}-FPM restarted successfully." elif [[ -n $(which php${PHPv}) ]]; then run service php${PHPv}-fpm start if [[ $(ps -ef | grep -v grep | grep php-fpm | wc -l) > 0 ]]; then status "PHP${PHPv}-FPM started successfully." else warning "Something wrong with PHP installation." fi fi } # # Main Function # Start PHP Installation # function init_php_install() { # Menu Install PHP, fpm, and modules echo "" echo "Welcome to PHP installation script" echo "" echo "Which version of PHP to install?" echo "Supported PHP version:" echo " 1). PHP 5.6 (old stable)" echo " 2). PHP 7.0 (stable)" echo " 3). PHP 7.1 (stable)" echo " 4). PHP 7.2 (stable)" echo " 5). PHP 7.3 (latest stable)" echo " 6). All available versions" echo "---------------------------------" while [[ $SELECTED_PHP != "1" && $SELECTED_PHP != "2" \ && $SELECTED_PHP != "3" && $SELECTED_PHP != "4" \ && $SELECTED_PHP != "5" && $SELECTED_PHP != "6" ]]; do read -p "Select an option [1-6]: " SELECTED_PHP done echo "" case $SELECTED_PHP in 1) PHP_VER="5.6" install_php $PHP_VER ;; 2) PHP_VER="7.0" install_php $PHP_VER ;; 3) PHP_VER="7.1" install_php $PHP_VER ;; 4) PHP_VER="7.2" install_php $PHP_VER ;; 5) PHP_VER="7.3" install_php $PHP_VER ;; *) PHP_VER="all" install_php "5.6" install_php "7.0" install_php "7.1" install_php "7.2" install_php "7.3" ;; esac # Install default PHP version used by LEMPer if [[ ! -n $(which php7.3) ]]; then warning -e "\nLEMPer requires PHP 7.3 as default to run its administration tools." echo "PHP 7.3 now being installed..." install_php "7.3" fi # Menu Install PHP loader echo "" while [[ $INSTALL_PHPLOADER != "y" && $INSTALL_PHPLOADER != "n" ]]; do read -p "Do you want to install PHP Loaders? [y/n]: " -e INSTALL_PHPLOADER done if [[ "$INSTALL_PHPLOADER" == Y* || "$INSTALL_PHPLOADER" == y* ]]; then echo "" echo "Available PHP Loaders:" echo " 1). IonCube Loader (latest stable)" echo " 2). SourceGuardian (latest stable)" echo " 3). All loaders (IonCube, SourceGuardian)" echo "--------------------------------------------" while [[ $SELECTED_PHPLOADER != "1" && $SELECTED_PHPLOADER != "2" \ && $SELECTED_PHPLOADER != "3" ]]; do read -p "Select an option [1-3]: " SELECTED_PHPLOADER done echo "" # Create loaders directory if [ ! -d /usr/lib/php/loaders ]; then run mkdir /usr/lib/php/loaders fi case $SELECTED_PHPLOADER in 1) install_ic if [ "$PHP_VER" != "all" ]; then enable_ic $PHP_VER # Required for LEMPer default PHP if [ "$PHP_VER" != "7.3" ]; then enable_ic "7.3" fi else enable_ic "5.6" enable_ic "7.0" enable_ic "7.1" enable_ic "7.2" enable_ic "7.3" fi ;; 2) install_sg if [ "$PHP_VER" != "all" ]; then enable_sg $PHP_VER else enable_sg "5.6" enable_sg "7.0" enable_sg "7.1" enable_sg "7.2" enable_sg "7.3" fi ;; *) install_ic install_sg if [ "$PHP_VER" != "all" ]; then enable_ic $PHP_VER # Required for LEMPer default PHP if [ "$PHP_VER" != "7.3" ]; then enable_ic "7.3" fi enable_sg $PHP_VER else enable_ic "5.6" enable_ic "7.0" enable_ic "7.1" enable_ic "7.2" enable_ic "7.3" enable_sg "5.6" enable_sg "7.0" enable_sg "7.1" enable_sg "7.2" enable_sg "7.3" fi ;; esac fi # Menu Optimizing PHP if [ "$PHP_VER" != "all" ]; then optimize_php $PHP_VER # Required for LEMPer default PHP if [ "$PHP_VER" != "7.3" ]; then optimize_php "7.3" fi else optimize_php "5.6" optimize_php "7.0" optimize_php "7.1" optimize_php "7.2" optimize_php "7.3" fi } # Start running things from a call at the end so if this script is executed # after a partial download it doesn't do anything. if [[ -n $(which php5.6) && -n $(which php7.0) && -n $(which php7.1) && -n $(which php7.2) && -n $(which php7.3) ]]; then warning -e "\nAll available PHP version already exists. Installation skipped..." else init_php_install "$@" fi