You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
366 lines
9.9 KiB
366 lines
9.9 KiB
#! /bin/bash
|
|
# Swoole-compiler loader install wizard
|
|
|
|
# Color
|
|
RED='\033[0;31m'
|
|
YELLOW='\033[0;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Output Logo
|
|
echo ""
|
|
echo "+-------------------------------------------------------------------+"
|
|
echo -e "| ${RED}Swoole Compiler Loader Installer${NC} |"
|
|
echo "+-------------------------------------------------------------------+"
|
|
echo "| version 1.0.3 (2018-03-15) |"
|
|
echo "+-------------------------------------------------------------------+"
|
|
echo ""
|
|
|
|
# The function which outputs help information
|
|
help(){
|
|
echo " "
|
|
echo -e " ${YELLOW}Usage :${NC} bash $0 [options] [arguments]"
|
|
echo " "
|
|
echo -e " ${YELLOW}Options :${NC} "
|
|
echo " -h --help Show the help of swoole compiler loader"
|
|
echo " -s --libsodium Install libsodium library"
|
|
echo " "
|
|
echo -e " ${YELLOW}Optional Arguments :${NC} "
|
|
echo " php_path : the absolute path of php-cli or php-fpm executable path"
|
|
echo " "
|
|
echo -e " ${YELLOW}Examples : ${NC}"
|
|
echo " bash $0"
|
|
echo " bash $0 /usr/local/sbin/php-fpm"
|
|
echo " base $0 -s"
|
|
echo " "
|
|
}
|
|
# The function which outputs choice
|
|
yes_or_no(){
|
|
if [ $# -eq 0 ]; then
|
|
echo -e " ${RED}Error:${NC}"
|
|
echo " Wrong function parameter"
|
|
echo ""
|
|
exit 1;
|
|
fi
|
|
while true; do
|
|
read -p "$* [y/n]: " yn
|
|
case $yn in
|
|
[Yy]*) return 0 ;;
|
|
[Nn]*) return 1 ;;
|
|
* ) echo "Please answer yes or no." ;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
# The function which judges the execute ability of the php_path
|
|
check_php(){
|
|
if [ $# -eq 0 ]; then
|
|
echo -e " ${RED}Error:${NC}"
|
|
echo " Wrong function parameter"
|
|
echo ""
|
|
exit 1;
|
|
fi
|
|
check_php_path="$1";
|
|
which "$check_php_path" &> /dev/null;
|
|
check_php_path_exist=$?;
|
|
if [ "$check_php_path_exist" == "0" ]; then
|
|
check_php_path=$(which "$check_php_path")
|
|
if [ -x "$check_php_path" ]; then
|
|
return 0;
|
|
else
|
|
return 1;
|
|
fi
|
|
else
|
|
return 1;
|
|
fi
|
|
}
|
|
|
|
# The function which installs the libsodium libray
|
|
install_libsodium(){
|
|
back_libsodium_path="./libsodium.so"
|
|
if [ ! -e "$back_libsodium_path" ]; then
|
|
echo ""
|
|
echo -e " ${RED}Error:${NC}"
|
|
echo " Not found backed libsodium.so, please check the loader folder"
|
|
echo ""
|
|
exit 1;
|
|
fi
|
|
ldconfig
|
|
libsodium_exists=$(ldconfig -p | awk '/libsodium/')
|
|
if [ -n "$libsodium_exists" ]; then
|
|
echo " libsodium.so : found"
|
|
else
|
|
echo " libsodium.so : not found"
|
|
echo -e " ${YELLOW}install libsodium.so...${NC}"
|
|
fi
|
|
enabled_so_path="/usr/lib"
|
|
cp "$back_libsodium_path" "$enabled_so_path"
|
|
ldconfig
|
|
libSodiumPath="$enabled_so_path/libsodium.so"
|
|
if [ ! -e $libSodiumPath ]; then
|
|
echo ""
|
|
echo -e " ${RED}Error:${NC}"
|
|
echo " No found shared library libsodium.so"
|
|
echo ""
|
|
exit 1;
|
|
fi
|
|
libsodium_exists=$(ldconfig -p | awk '/libsodium/')
|
|
if [ ! -n "$libsodium_exists" ]; then
|
|
echo ""
|
|
echo -e " ${RED}Error:${NC}"
|
|
echo " Fail to install libsodium.so"
|
|
echo ""
|
|
exit 1;
|
|
fi
|
|
}
|
|
|
|
# The function which checks the root
|
|
check_root(){
|
|
if [[ $EUID -ne 0 ]]; then
|
|
echo ""
|
|
echo -e " ${RED}This program needs root privilege${NC}"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Check the parameter of shell sctipt
|
|
if [ "$#" == "1" ] ; then
|
|
if [[ ( "$1" == "-h" ) || ( "$1" == "--help" ) ]] ; then
|
|
help
|
|
exit 1
|
|
fi
|
|
if [[ ( "$1" == "-s" ) || ( "$1" == "--libsodium" ) ]]; then
|
|
# Output checking environment information
|
|
echo " "
|
|
echo -e " ${YELLOW}Install Libsodium...${NC}"
|
|
echo " "
|
|
check_root
|
|
install_libsodium
|
|
echo " "
|
|
exit
|
|
fi
|
|
fi
|
|
|
|
# Output checking environment information
|
|
echo " "
|
|
echo -e " ${YELLOW}Checking Environment...${NC}"
|
|
echo " "
|
|
|
|
# Check the bin path of php
|
|
php_path=""
|
|
if [ $# -eq 0 ]; then
|
|
# Check the bin path of php-cli or php-fpm
|
|
default_optional_php_paths="php php-fpm php5-fpm php-fpm7.0"
|
|
enabled_php_paths=""
|
|
for optional_php_path in $default_optional_php_paths
|
|
do
|
|
check_php "$optional_php_path"
|
|
php_exists=$?
|
|
if [ "$php_exists" == "0" ]; then
|
|
optional_php_path=$(which "$optional_php_path")
|
|
enabled_php_paths=$enabled_php_paths" $optional_php_path"
|
|
fi
|
|
done
|
|
if [ "$enabled_php_paths" == "" ]; then
|
|
echo ""
|
|
echo -e " ${RED}Error:${NC}"
|
|
echo " No found php or php-fpm command, please run this script with the path of php"
|
|
echo ""
|
|
exit 1;
|
|
else
|
|
pathCount=$(echo "$enabled_php_paths" | awk '{print NF}')
|
|
echo " Please select the php path to install loader extension:"
|
|
echo ""
|
|
indexCount=1
|
|
for enabled_php_path in $enabled_php_paths
|
|
do
|
|
echo " $indexCount : $enabled_php_path"
|
|
indexCount=$(($indexCount + 1))
|
|
done
|
|
echo ""
|
|
echo " 0 : Quit this script"
|
|
# Choose the bin path to install loader extension
|
|
while true; do
|
|
preg_str="^[0-$pathCount]$"
|
|
echo ""
|
|
read -p " Enter a number > ";
|
|
if [[ $REPLY =~ $preg_str ]]; then
|
|
if [[ $REPLY == 0 ]]; then
|
|
echo ""
|
|
echo " Exit";
|
|
exit 1;
|
|
fi
|
|
indexCount=1
|
|
for enabled_php_path in $enabled_php_paths
|
|
do
|
|
if [[ $indexCount == $REPLY ]]; then
|
|
php_path=$enabled_php_path
|
|
fi
|
|
indexCount=$(($indexCount + 1))
|
|
done
|
|
break
|
|
else
|
|
echo ""
|
|
echo " Invalid input";
|
|
fi
|
|
done
|
|
fi
|
|
elif [ $# -eq 1 ]; then
|
|
php_path="$1"
|
|
check_php "$1"
|
|
php_exists=$?
|
|
if [ "$php_exists" == "0" ]; then
|
|
php_path=$(which "$php_path")
|
|
else
|
|
echo -e " ${RED}Error:${NC}"
|
|
echo " Please check if $php_path is existing and executable"
|
|
echo ""
|
|
exit 1;
|
|
fi
|
|
else
|
|
echo -e " ${RED}Error:${NC}"
|
|
echo " Please check your parameters, this shell script supports only one optional parameter."
|
|
echo ""
|
|
exit 1;
|
|
fi
|
|
|
|
# Check if installed swoole loader
|
|
loader_installed=$($php_path -m 2> /dev/null | awk '/swoole_loader/')
|
|
if [ -n "$loader_installed" ]; then
|
|
# check the version of installed swoole loader
|
|
loader_version_installed=$($php_path -i 2> /dev/null | awk '/^swoole_loader version =>/ {print $4}')
|
|
echo -e " ${YELLOW}Swoole Compiler Loader $loader_version_installed is installed now${NC}"
|
|
echo ""
|
|
yes_or_no " Reinstall swoole compiler loader?"
|
|
yes_or_no_res=$?
|
|
if [ "$yes_or_no_res" == "1" ]; then
|
|
echo "";
|
|
echo " Exit script";
|
|
echo "";
|
|
exit 1;
|
|
else
|
|
echo "";
|
|
fi
|
|
fi
|
|
|
|
# Output php path information
|
|
echo " php_path : $php_path"
|
|
|
|
# Check php version
|
|
raw_php_version=$($php_path -i 2> /dev/null | awk 'NR != 2 && /^PHP Version =>/ {print $4}')
|
|
php_one_version=$(echo "$raw_php_version" | cut -d . -f 1)
|
|
php_two_version=$(echo "$raw_php_version" | cut -d . -f 2)
|
|
php_version=$php_one_version.$php_two_version
|
|
echo " php_version : $php_version"
|
|
|
|
# Check php sapi
|
|
php_sapi=$($php_path -i 2> /dev/null | awk '/^Server API =>/ {print $4,$5,$6}')
|
|
echo " php_sapi : $php_sapi"
|
|
|
|
# Check php thread saftey
|
|
php_thread_safety=$($php_path -i 2> /dev/null | awk '/^Thread Safety =>/ {print $4}')
|
|
echo " php_thread_safety : $php_thread_safety"
|
|
|
|
# Check php extension dir
|
|
php_extension_dir=$($php_path -i 2> /dev/null | awk '/^extension_dir =>/ {print $3}')
|
|
if [ -d "$php_extension_dir" ]; then
|
|
echo " php_extension_dir : $php_extension_dir"
|
|
else
|
|
echo ""
|
|
echo -e " ${RED}Error:${NC}"
|
|
echo " No found php extension directory : $php_extension_dir"
|
|
echo ""
|
|
exit 1;
|
|
fi
|
|
|
|
# Check php extension dir
|
|
php_ini_path=$($php_path -i 2> /dev/null | awk '/^Loaded Configuration File =>/ {print $5}')
|
|
if [ -f "$php_ini_path" ]; then
|
|
echo " php_ini_path : $php_ini_path"
|
|
else
|
|
echo ""
|
|
echo -e " ${RED}Error:${NC}"
|
|
echo " No found php.ini file: $php_ini_path"
|
|
echo ""
|
|
exit 1;
|
|
fi
|
|
|
|
# Check xdebug, ioncube loader and zend loader extensions
|
|
forbidden_extensions_exists=$($php_path -m 2> /dev/null | awk '/xdebug|ionCube|zend_loader/')
|
|
if [ -n "$forbidden_extensions_exists" ]; then
|
|
echo ""
|
|
echo -e " ${RED}Error:${NC}"
|
|
echo " It exists xdebug or ionCuber loader or zend_loader extension, please remove these extensions"
|
|
echo ""
|
|
exit 1;
|
|
fi
|
|
|
|
# Ensure root privileges.
|
|
check_root
|
|
|
|
# Check libsodium.so which is required for swoole-compiler loader
|
|
install_libsodium
|
|
|
|
# Install swoole_loader.so to php extension directory
|
|
swoole_loader_file="swoole_loader"
|
|
swoole_loader_file="$swoole_loader_file""$php_one_version""$php_two_version"
|
|
if [ "$php_thread_safety" == "disabled" ]; then
|
|
swoole_loader_file="$swoole_loader_file"".so"
|
|
else
|
|
swoole_loader_file="$swoole_loader_file""_zts.so"
|
|
fi
|
|
real_swoole_loader_path=$php_extension_dir"/"$swoole_loader_file
|
|
if [ ! -f "$real_swoole_loader_path" ]; then
|
|
echo " swoole_loader.so : not found"
|
|
else
|
|
echo " swoole_loader.so : found"
|
|
fi
|
|
swoole_loader_path="./"$swoole_loader_file
|
|
if [ -f "$swoole_loader_path" ]; then
|
|
echo ""
|
|
echo -e " ${YELLOW}installing $swoole_loader_file to php_extension_dir...${NC}"
|
|
cp "$swoole_loader_path" "$php_extension_dir"
|
|
echo ""
|
|
else
|
|
echo ""
|
|
echo -e " ${RED}Error:${NC}"
|
|
echo " No found right swoole loader file : $swoole_loader_file"
|
|
echo ""
|
|
exit 1;
|
|
fi
|
|
real_swoole_loader_path=$php_extension_dir"/"$swoole_loader_file
|
|
if [ ! -f "$real_swoole_loader_path" ]; then
|
|
echo ""
|
|
echo -e " ${RED}Error:${NC}"
|
|
echo " No found swoole loader file in php extension dir: $real_swoole_loader_path"
|
|
echo ""
|
|
exit 1;
|
|
fi
|
|
|
|
# Check if exists swoole_loader.so config
|
|
raw_ini_loader="extension="$real_swoole_loader_path
|
|
ini_loader="$raw_ini_loader"
|
|
load_config_exists=$(awk '/swoole_loader/ {print $0}' "$php_ini_path")
|
|
if [ -n "$load_config_exists" ]; then
|
|
echo " loader_config : found"
|
|
sed -i '/swoole_loader/d' "$php_ini_path"
|
|
else
|
|
echo " loader_config : not found"
|
|
fi
|
|
echo ""
|
|
echo -e " ${YELLOW}adding swoole_loader extension config to php.ini...${NC}"
|
|
echo "$ini_loader" >> "$php_ini_path"
|
|
|
|
# Check if installed swoole loader
|
|
loader_installed=$($php_path -m 2> /dev/null | awk '/swoole_loader/')
|
|
if [ -n "$loader_installed" ]; then
|
|
loader_version_installed=$($php_path -i 2> /dev/null | awk '/^swoole_loader version =>/ {print $4}')
|
|
echo ""
|
|
echo -e " ${YELLOW}Swoole Compiler Loader $loader_version_installed is installed successfully${NC}"
|
|
exit 1;
|
|
else
|
|
echo ""
|
|
echo -e " ${RED}Error:${NC}"
|
|
echo " Swoole Compiler Loader failed to install"
|
|
echo ""
|
|
exit 1;
|
|
fi
|
|
|