#!/usr/bin/env bash # PHP Installer # Min. Requirement : GNU/Linux Ubuntu 14.04 & 16.04 # Last Build : 05/11/2019 # Author : ESLabs.ID (eslabs.id@gmail.com) # Since Version : 1.0.0 # Include helper functions. if [ "$(type -t run)" != "function" ]; then BASEDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd ) # shellchechk source=scripts/helper.sh # shellcheck disable=SC1090 . "${BASEDIR}/helper.sh" fi # Make sure only root can run this installer script. requires_root ## # Add PHP repository. # function add_php_repo() { echo "Add Ondrej's PHP repository..." DISTRIB_NAME=${DISTRIB_NAME:-$(get_distrib_name)} RELEASE_NAME=${RELEASE_NAME:-$(get_release_name)} case ${DISTRIB_NAME} in debian) if [ ! -f "/etc/apt/sources.list.d/ondrej-php-${RELEASE_NAME}.list" ]; then run touch "/etc/apt/sources.list.d/ondrej-php-${RELEASE_NAME}.list" run bash -c "echo 'deb https://packages.sury.org/php/ ${RELEASE_NAME} main' > /etc/apt/sources.list.d/ondrej-php-${RELEASE_NAME}.list" run wget -qO /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg run apt update -qq -y else info "PHP repository already exists." fi ;; ubuntu) #run apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 4F4EA0AAE5267A6C run apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 14AA40EC0831756756D7F66C4F4EA0AAE5267A6C run add-apt-repository -y ppa:ondrej/php run apt update -qq -y ;; *) fail "Unable to install PHP, this GNU/Linux distribution is not supported." ;; esac } ## # Install PHP & FPM package. # function install_php_fpm() { # PHP version. local PHPv="${1}" if [ -z "${PHPv}" ]; then PHPv=${PHP_VERSION:-"7.3"} fi local PHP_PKGS=() export PHP_IS_INSTALLED="no" # Checking if php already installed. if [[ -n $(command -v "php${PHPv}") ]]; then PHP_IS_INSTALLED="yes" info "PHP${PHPv} & FPM package already installed..." else # Add repo first add_php_repo echo "Installing PHP${PHPv} & FPM..." if hash apt 2>/dev/null; then PHP_PKGS=("php${PHPv} php${PHPv}-bcmath php${PHPv}-bz2 php${PHPv}-calendar php${PHPv}-cli \ php${PHPv}-common php${PHPv}-curl php${PHPv}-dev php${PHPv}-exif php${PHPv}-fpm php${PHPv}-gd \ php${PHPv}-gettext php${PHPv}-gmp php${PHPv}-gnupg php${PHPv}-iconv php${PHPv}-imap php${PHPv}-intl \ php${PHPv}-json php${PHPv}-mbstring php${PHPv}-mysql php${PHPv}-opcache php${PHPv}-pdo php${PHPv}-posix \ php${PHPv}-pspell php${PHPv}-readline php${PHPv}-ldap php${PHPv}-snmp php${PHPv}-soap php${PHPv}-sqlite3 \ php${PHPv}-tidy php${PHPv}-tokenizer php${PHPv}-xml php${PHPv}-xmlrpc php${PHPv}-xsl php${PHPv}-zip \ php-pear php-xml pkg-php-tools spawn-fcgi fcgiwrap" "${PHP_PKGS[@]}") if [[ "${#PHP_PKGS[@]}" -gt 0 ]]; then echo "Installing PHP${PHPv} & FPM packages..." # shellcheck disable=SC2068 run apt install -qq -y ${PHP_PKGS[@]} fi if [[ -n $(command -v "php${PHPv}") ]]; then status "PHP${PHPv} & FPM packages installed." fi # Install php geoip? if "${AUTO_INSTALL}"; then local INSTALL_PHPGEOIP="y" else while [[ "${INSTALL_PHPGEOIP}" != "y" && "${INSTALL_PHPGEOIP}" != "n" ]]; do read -rp "Do you want to install PHP GeoIP for geolocation? [y/n]: " \ -i n -e INSTALL_PHPGEOIP done fi if [[ ${INSTALL_PHPGEOIP} == Y* || ${INSTALL_PHPGEOIP} == y* ]]; then echo "Installing PHP GeoIP module..." if [ "${PHPv//.}" -lt "70" ]; then #run mkdir -p /usr/lib/php/php-helper run apt install -qq -y php-geoip else run pecl install geoip-1.1.1 # Enable GeoIP module. echo "Updating PHP ini file with GeoIP module..." [ ! -f "/etc/php/${PHPv}/mods-available/geoip.ini" ] && \ run touch "/etc/php/${PHPv}/mods-available/geoip.ini" run bash -c "echo extension=geoip.so > /etc/php/${PHPv}/mods-available/geoip.ini" if [ ! -f "/etc/php/${PHPv}/cli/conf.d/20-geoip.ini" ]; then run ln -s "/etc/php/${PHPv}/mods-available/geoip.ini" \ "/etc/php/${PHPv}/cli/conf.d/20-geoip.ini" fi if [ ! -f "/etc/php/${PHPv}/fpm/conf.d/20-geoip.ini" ]; then run ln -s "/etc/php/${PHPv}/mods-available/geoip.ini" \ "/etc/php/${PHPv}/fpm/conf.d/20-geoip.ini" fi fi fi # Install php mcrypt? if "${AUTO_INSTALL}"; then local INSTALL_PHPMCRYPT="y" else while [[ "${INSTALL_PHPMCRYPT}" != "y" && "${INSTALL_PHPMCRYPT}" != "n" ]]; do read -rp "Do you want to install PHP Mcrypt for encryption/decryption? [y/n]: " \ -i n -e INSTALL_PHPMCRYPT done fi if [[ ${INSTALL_PHPMCRYPT} == Y* || ${INSTALL_PHPMCRYPT} == y* ]]; then echo "Installing PHP Mcrypt module..." if [ "${PHPv//.}" -lt "72" ]; then run apt install -qq -y "php${PHPv}-mcrypt" elif [ "${PHPv}" == "7.2" ]; then run apt install -qq -y libmcrypt-dev libreadline-dev && \ run pecl install mcrypt-1.0.1 # Enable Mcrypt module. echo "Updating PHP${PHPv} ini file with Mcrypt module..." [ ! -f "/etc/php/${PHPv}/mods-available/mcrypt.ini" ] && \ run touch "/etc/php/${PHPv}/mods-available/mcrypt.ini" run 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 install -qq -y dh-php # Use libsodium instead. info "Mcrypt module is deprecated for PHP${PHPv} or greater, use Libsodium or OpenSSL for encryption." fi fi else fail "Unable to install PHP${PHPv}, this GNU/Linux distribution is not supported." fi # Create PHP log dir. if [ ! -d /var/log/php ]; then mkdir -p /var/log/php fi fi } ## # Install ionCube Loader. # function install_ioncube() { echo "Installing ionCube PHP loader..." # 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 local CURRENT_DIR && CURRENT_DIR=$(pwd) run cd "${BUILD_DIR}" ARCH=${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 echo "Installing latest ionCube PHP loader..." run mv -f ioncube /usr/lib/php/loaders/ run cd "${CURRENT_DIR}" } ## # Enable ionCube Loader. # function enable_ioncube() { # PHP version. local PHPv="${1}" if [ -z "${PHPv}" ]; then PHPv=${PHP_VERSION:-"7.3"} fi echo "Enabling ionCube PHP${PHPv} loader" if "${DRYRUN}"; then info "ionCube PHP${PHPv} enabled in dryrun mode." else 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/pool.d/www.conf" < "/etc/php/${PHPv}/fpm/pool.d/${POOLNAME}.conf" <> /home/${LEMPER_USERNAME}/.bashrc" run bash -c "echo '[ -d \"\$HOME/.composer/vendor/bin\" ] && export PATH=\"\$PATH:\$HOME/.composer/vendor/bin\"' >> /home/${LEMPER_USERNAME}/.bash_profile" run bash -c "echo '[ -d \"\$HOME/.composer/vendor/bin\" ] && export PATH=\"\$PATH:\$HOME/.composer/vendor/bin\"' >> /home/${LEMPER_USERNAME}/.profile" else error "Invalid PHP Composer installer signature." fi #run rm composer-setup.php run cd "${CURRENT_DIR}" fi } ## # Initialize PHP & FPM Installation. # function init_php_fpm_install() { if "${AUTO_INSTALL}"; then local SELECTED_PHP="${1}" if [ -z "${SELECTED_PHP}" ]; then SELECTED_PHP=${PHP_VERSION:-"7.3"} fi else echo "Which version of PHP to be installed?" echo "Supported PHP version:" echo " 1). PHP 5.6 (EOL)" echo " 2). PHP 7.0 (EOL)" echo " 3). PHP 7.1 (SFO)" echo " 4). PHP 7.2 (Stable)" echo " 5). PHP 7.3 (Latest stable)" echo " 6). PHP 7.4 (Beta)" echo " 7). All available versions" echo "+--------------------------------------+" while [[ ${SELECTED_PHP} != "1" && ${SELECTED_PHP} != "2" && ${SELECTED_PHP} != "3" && \ ${SELECTED_PHP} != "4" && ${SELECTED_PHP} != "5" && ${SELECTED_PHP} != "6" && \ ${SELECTED_PHP} != "7" && ${SELECTED_PHP} != "5.6" && ${SELECTED_PHP} != "7.0" && \ ${SELECTED_PHP} != "7.1" && ${SELECTED_PHP} != "7.2" && ${SELECTED_PHP} != "7.3" && \ ${SELECTED_PHP} != "7.4" && ${SELECTED_PHP} != "all" ]]; do read -rp "Select a PHP version or an option [1-7]: " -i 5 -e SELECTED_PHP done fi local PHPv case ${SELECTED_PHP} in 1|"5.6") PHPv="5.6" install_php_fpm "${PHPv}" ;; 2|"7.0") PHPv="7.0" install_php_fpm "${PHPv}" ;; 3|"7.1") PHPv="7.1" install_php_fpm "${PHPv}" ;; 4|"7.2") PHPv="7.2" install_php_fpm "${PHPv}" ;; 5|"7.3") PHPv="7.3" install_php_fpm "${PHPv}" ;; 6|"7.4") PHPv="7.4" install_php_fpm "${PHPv}" ;; 7|"all") # Install all PHP version (except EOL & Beta). PHPv="all" install_php_fpm "5.6" install_php_fpm "7.0" install_php_fpm "7.1" install_php_fpm "7.2" install_php_fpm "7.3" install_php_fpm "7.4" ;; *) PHPv="unsupported" error "Your selected PHP version ${SELECTED_PHP} is not supported yet." ;; esac # Install default PHP version used by LEMPer. if [[ -z $(command -v 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_fpm "7.3" fi # Install PHP loader. if [[ "${PHPv}" != "unsupported" && "${PHP_IS_INSTALLED}" != "yes" ]]; then if "${AUTO_INSTALL}"; then if [[ -z "${PHP_LOADER}" || "${PHP_LOADER}" == "none" ]]; then INSTALL_PHPLOADER="n" else INSTALL_PHPLOADER="y" SELECTED_PHPLOADER=${PHP_LOADER} fi else while [[ "${INSTALL_PHPLOADER}" != "y" && "${INSTALL_PHPLOADER}" != "n" ]]; do read -rp "Do you want to install PHP Loaders? [y/n]: " -i n -e INSTALL_PHPLOADER done fi 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" && ${SELECTED_PHPLOADER} != "ioncube" && \ ${SELECTED_PHPLOADER} != "sourceguardian" && ${SELECTED_PHPLOADER} != "all" ]]; do read -rp "Select an option [1-3]: " -i "${PHP_LOADER}" -e SELECTED_PHPLOADER done # Create loaders directory if [ ! -d /usr/lib/php/loaders ]; then run mkdir -p /usr/lib/php/loaders fi case ${SELECTED_PHPLOADER} in 1|"ioncube") install_ioncube if [ "${PHPv}" != "all" ]; then enable_ioncube "${PHPv}" # Required for LEMPer default PHP. if [[ "${PHPv}" != "7.3" && -n $(command -v php7.3) ]]; then enable_ioncube "7.3" fi else # Install all PHP version (except EOL & Beta). enable_ioncube "5.6" enable_ioncube "7.0" enable_ioncube "7.1" enable_ioncube "7.2" enable_ioncube "7.3" #enable_ioncube "7.4" fi ;; 2|"sourceguardian") install_sourceguardian if [ "${PHPv}" != "all" ]; then enable_sourceguardian "${PHPv}" # Required for LEMPer default PHP. if [[ "${PHPv}" != "7.3" && -n $(command -v php7.3) ]]; then enable_sourceguardian "7.3" fi else # Install all PHP version (except EOL & Beta). enable_sourceguardian "5.6" enable_sourceguardian "7.0" enable_sourceguardian "7.1" enable_sourceguardian "7.2" enable_sourceguardian "7.3" #enable_sourceguardian "7.4" fi ;; "all") install_ioncube install_sourceguardian if [ "${PHPv}" != "all" ]; then enable_ioncube "${PHPv}" enable_sourceguardian "${PHPv}" # Required for LEMPer default PHP if [[ "${PHPv}" != "7.3" && -n $(command -v php7.3) ]]; then enable_ioncube "7.3" enable_sourceguardian "7.3" fi else # Install all PHP version (except EOL & Beta). enable_ioncube "5.6" enable_ioncube "7.0" enable_ioncube "7.1" enable_ioncube "7.2" enable_ioncube "7.3" #enable_ioncube "7.4" enable_sourceguardian "5.6" enable_sourceguardian "7.0" enable_sourceguardian "7.1" enable_sourceguardian "7.2" enable_sourceguardian "7.3" #enable_sourceguardian "7.4" fi ;; *) info "Your selected PHP loader ${SELECTED_PHPLOADER} is not supported yet." ;; esac fi # Final optimization. #if "${DRYRUN}"; then # info "PHP${PHPv} & FPM installed and optimized in dryrun mode." #else if [ "${PHPv}" != "all" ]; then optimize_php_fpm "${PHPv}" # Required for LEMPer default PHP if [[ "${PHPv}" != "7.3" && -n $(command -v php7.3) ]]; then optimize_php_fpm "7.3" fi else # Install all PHP version (except EOL & Beta). optimize_php_fpm "5.6" optimize_php_fpm "7.0" optimize_php_fpm "7.1" optimize_php_fpm "7.2" optimize_php_fpm "7.3" optimize_php_fpm "7.4" fi #fi fi # Install PHP composer. install_php_composer "${PHPv}" } echo "[PHP & FPM Packages Installation]" # 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 $(command -v php5.6) && \ -n $(command -v php7.0) && \ -n $(command -v php7.1) && \ -n $(command -v php7.2) && \ -n $(command -v php7.3) && \ -n $(command -v php7.4) ]]; then info "All available PHP version already exists. Installation skipped..." else init_php_fpm_install "$@" fi