mirror of
https://github.com/teddysun/lamp.git
synced 2026-04-03 11:18:35 +00:00
1040 lines
31 KiB
Bash
1040 lines
31 KiB
Bash
# Copyright (C) 2013 - 2025 Teddysun <i@teddysun.com>
|
|
#
|
|
# This file is part of the LAMP script.
|
|
#
|
|
# LAMP is a powerful bash script for the installation of
|
|
# Apache + PHP + MySQL/MariaDB and so on.
|
|
# You can install Apache + PHP + MySQL/MariaDB in an very easy way.
|
|
# Just need to input numbers to choose what you want to install before installation.
|
|
# And all things will be done in a few minutes.
|
|
#
|
|
# Website: https://lamp.sh
|
|
# Github: https://github.com/teddysun/lamp
|
|
|
|
_red() {
|
|
printf '\033[1;31;31m%b\033[0m' "$1"
|
|
}
|
|
|
|
_green() {
|
|
printf '\033[1;31;32m%b\033[0m' "$1"
|
|
}
|
|
|
|
_yellow() {
|
|
printf '\033[1;31;33m%b\033[0m' "$1"
|
|
}
|
|
|
|
_printargs() {
|
|
printf -- "%s" "$1"
|
|
printf "\n"
|
|
}
|
|
|
|
_info() {
|
|
_printargs "$@"
|
|
}
|
|
|
|
_warn() {
|
|
_yellow "$1"
|
|
printf "\n"
|
|
}
|
|
|
|
_error() {
|
|
_red "$1"
|
|
printf "\n"
|
|
exit 1
|
|
}
|
|
|
|
rootness() {
|
|
if [[ ${EUID} -ne 0 ]]; then
|
|
_error "This script must be run as root"
|
|
fi
|
|
}
|
|
|
|
generate_password() {
|
|
cat /dev/urandom | head -1 | md5sum | head -c 8
|
|
}
|
|
|
|
get_ip() {
|
|
ipv4=$(wget -qO- -t1 -T2 ipv4.icanhazip.com)
|
|
[ -z "${ipv4}" ] && ipv4=$(wget -qO- -t1 -T2 ipinfo.io/ip)
|
|
printf -- "%s" "${ipv4}"
|
|
}
|
|
|
|
get_ip_country() {
|
|
local country=$(wget -qO- -t1 -T2 ipinfo.io/$(get_ip)/country)
|
|
printf -- "%s" "${country}"
|
|
}
|
|
|
|
get_libc_version() {
|
|
getconf -a | grep GNU_LIBC_VERSION | awk '{print $NF}'
|
|
}
|
|
|
|
get_opsy() {
|
|
[ -f /etc/redhat-release ] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release && return
|
|
[ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return
|
|
[ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return
|
|
}
|
|
|
|
get_os_info() {
|
|
cname=$(awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//')
|
|
cores=$(awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo)
|
|
freq=$(awk -F: '/cpu MHz/ {freq=$2} END {print freq}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//')
|
|
tram=$(free -m | awk '/Mem/ {print $2}')
|
|
swap=$(free -m | awk '/Swap/ {print $2}')
|
|
up=$(awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60;d=$1%60} {printf("%ddays, %d:%d:%d\n",a,b,c,d)}' /proc/uptime)
|
|
load=$(w | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//')
|
|
opsy=$(get_opsy)
|
|
arch=$(uname -m)
|
|
lbit=$(getconf LONG_BIT)
|
|
host=$(hostname)
|
|
kern=$(uname -r)
|
|
ramsum=$(expr $tram + $swap)
|
|
}
|
|
|
|
get_php_extension_dir() {
|
|
local phpConfig="$1"
|
|
${phpConfig} --extension-dir
|
|
}
|
|
|
|
get_php_version() {
|
|
local phpConfig="$1"
|
|
${phpConfig} --version | cut -d'.' -f1-2
|
|
}
|
|
|
|
get_char() {
|
|
SAVEDSTTY=$(stty -g)
|
|
stty -echo
|
|
stty cbreak
|
|
dd if=/dev/tty bs=1 count=1 2>/dev/null
|
|
stty -raw
|
|
stty echo
|
|
stty ${SAVEDSTTY}
|
|
}
|
|
|
|
get_valid_valname() {
|
|
local val="$1"
|
|
local new_val=$(eval echo $val | sed 's/[-.]/_/g')
|
|
echo ${new_val}
|
|
}
|
|
|
|
get_hint() {
|
|
local val="$1"
|
|
local new_val=$(get_valid_valname $val)
|
|
eval echo "\$hint_${new_val}"
|
|
}
|
|
|
|
set_hint() {
|
|
local val="$1"
|
|
local hint="$2"
|
|
local new_val=$(get_valid_valname $val)
|
|
eval hint_${new_val}="\$hint"
|
|
}
|
|
|
|
disable_selinux() {
|
|
if [ -s /etc/selinux/config ] && grep -q 'SELINUX=enforcing' /etc/selinux/config; then
|
|
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
|
|
setenforce 0
|
|
fi
|
|
}
|
|
|
|
#Display Memu
|
|
display_menu() {
|
|
local soft="$1"
|
|
local default="$2"
|
|
eval local arr=(\${${soft}_arr[@]})
|
|
local default_prompt
|
|
if [[ "$default" != "" ]]; then
|
|
if [[ "$default" == "last" ]]; then
|
|
default=${#arr[@]}
|
|
fi
|
|
default_prompt="(default ${arr[$default - 1]})"
|
|
fi
|
|
local pick
|
|
local hint
|
|
local vname
|
|
local prompt="which ${soft} you'd select ${default_prompt}: "
|
|
|
|
while true; do
|
|
echo -e "\n-------------------------- ${soft} setting ---------------------------\n"
|
|
for ((i = 1; i <= ${#arr[@]}; i++)); do
|
|
vname="$(get_valid_valname ${arr[$i - 1]})"
|
|
hint="$(get_hint $vname)"
|
|
[[ "$hint" == "" ]] && hint="${arr[$i - 1]}"
|
|
_info "$(_green ${i}). $hint"
|
|
done
|
|
echo
|
|
read -p "${prompt}" pick
|
|
if [[ "$pick" == "" && "$default" != "" ]]; then
|
|
pick=${default}
|
|
break
|
|
fi
|
|
if ! is_digit "$pick"; then
|
|
prompt="Input error, please only input a number: "
|
|
continue
|
|
fi
|
|
if [[ "$pick" -lt 1 || "$pick" -gt ${#arr[@]} ]]; then
|
|
prompt="Input error, please input a number between 1 and ${#arr[@]}: "
|
|
continue
|
|
fi
|
|
break
|
|
done
|
|
|
|
eval ${soft}=${arr[$pick - 1]}
|
|
vname="$(get_valid_valname ${arr[$pick - 1]})"
|
|
hint="$(get_hint $vname)"
|
|
[[ "$hint" == "" ]] && hint="${arr[$pick - 1]}"
|
|
echo -e "\nyour selection: $hint"
|
|
}
|
|
|
|
#Display multiple Menu
|
|
display_menu_multi() {
|
|
local soft="$1"
|
|
local default="$2"
|
|
eval local arr=(\${${soft}_arr[@]})
|
|
local arr_len=${#arr[@]}
|
|
local pick
|
|
local correct=true
|
|
local prompt
|
|
local vname
|
|
local hint
|
|
local default_prompt
|
|
if [[ "$default" != "" ]]; then
|
|
if [[ "$default" == "last" ]]; then
|
|
default=${arr_len}
|
|
fi
|
|
default_prompt="(default ${arr[$default - 1]})"
|
|
fi
|
|
prompt="Please input one or more number between 1 and ${arr_len} ${default_prompt} (for example: 1 2 3): "
|
|
|
|
echo -e "\n-------------------------- ${soft} install --------------------------\n"
|
|
for ((i = 1; i <= ${arr_len}; i++)); do
|
|
vname="$(get_valid_valname ${arr[$i - 1]})"
|
|
hint="$(get_hint $vname)"
|
|
[[ "$hint" == "" ]] && hint="${arr[$i - 1]}"
|
|
_info "$(_green ${i}). $hint"
|
|
done
|
|
echo
|
|
while true; do
|
|
read -p "${prompt}" pick
|
|
pick=(${pick})
|
|
eval unset ${soft}_install
|
|
if [[ "$pick" == "" ]]; then
|
|
if [[ "$default" == "" ]]; then
|
|
echo "Input can not be empty, please reinput."
|
|
continue
|
|
else
|
|
eval ${soft}_install="${arr[$default - 1]}"
|
|
break
|
|
fi
|
|
fi
|
|
|
|
for j in ${pick[@]}; do
|
|
if ! is_digit "$j"; then
|
|
echo "Input error, please only input a number."
|
|
correct=false
|
|
break 1
|
|
fi
|
|
if [[ "$j" -lt 1 || "$j" -gt ${arr_len} ]]; then
|
|
echo "Input error, please input one or more number between 1 and ${arr_len}${default_prompt}."
|
|
correct=false
|
|
break 1
|
|
fi
|
|
if [ "${arr[$j - 1]}" == "do_not_install" ]; then
|
|
eval ${soft}_install="do_not_install"
|
|
break 2
|
|
fi
|
|
eval ${soft}_install="\"\$${soft}_install ${arr[$j - 1]}\""
|
|
correct=true
|
|
done
|
|
[[ "$correct" == true ]] && break
|
|
done
|
|
|
|
echo
|
|
eval echo -e "your selection: \$${soft}_install"
|
|
}
|
|
|
|
display_os_info() {
|
|
clear
|
|
echo
|
|
echo "+-------------------------------------------------------------------+"
|
|
echo "| Auto Install LAMP(Linux + Apache + MySQL/MariaDB + PHP ) |"
|
|
echo "| Website: https://lamp.sh |"
|
|
echo "| Author : Teddysun <i@teddysun.com> |"
|
|
echo "+-------------------------------------------------------------------+"
|
|
echo
|
|
echo "--------------------- System Information ----------------------------"
|
|
echo
|
|
echo "CPU model : ${cname}"
|
|
echo "Number of cores : ${cores}"
|
|
echo "CPU frequency : ${freq} MHz"
|
|
echo "Total amount of ram : ${tram} MB"
|
|
echo "Total amount of swap : ${swap} MB"
|
|
echo "System uptime : ${up}"
|
|
echo "Load average : ${load}"
|
|
echo "OS : ${opsy}"
|
|
echo "Arch : ${arch} (${lbit} Bit)"
|
|
echo "Kernel : ${kern}"
|
|
echo "Hostname : ${host}"
|
|
echo "IPv4 address : $(get_ip)"
|
|
echo
|
|
echo "---------------------------------------------------------------------"
|
|
}
|
|
|
|
check_installed() {
|
|
local cmd="$1"
|
|
local location="$2"
|
|
if [ -d "${location}" ]; then
|
|
_info "${location} already exists, skipped the installation."
|
|
add_to_env "${location}"
|
|
else
|
|
${cmd}
|
|
fi
|
|
}
|
|
|
|
check_os() {
|
|
get_os_info
|
|
is_support_flg=0
|
|
if check_sys packageManager yum || check_sys packageManager apt; then
|
|
# Not support CentOS prior to 8 & Debian prior to 10 & Ubuntu prior to 20 versions
|
|
if [ -n "$(get_centosversion)" ] && [ $(get_centosversion) -lt 8 ]; then
|
|
is_support_flg=1
|
|
fi
|
|
if [ -n "$(get_debianversion)" ] && [ $(get_debianversion) -lt 10 ]; then
|
|
is_support_flg=1
|
|
fi
|
|
if [ -n "$(get_ubuntuversion)" ] && [ $(get_ubuntuversion) -lt 20 ]; then
|
|
is_support_flg=1
|
|
fi
|
|
else
|
|
is_support_flg=1
|
|
fi
|
|
if [ ${is_support_flg} -eq 1 ]; then
|
|
_error "Not supported OS, please change OS to CentOS 8+ or Debian 10+ or Ubuntu 20+ and try again."
|
|
fi
|
|
}
|
|
|
|
check_ram() {
|
|
if [ ${ramsum} -lt 480 ]; then
|
|
_error "Not enough memory. The LAMP installation needs memory: ${tram}MB*RAM + ${swap}MB*SWAP >= 480MB"
|
|
fi
|
|
[ ${ramsum} -lt 1025 ] && disable_fileinfo="--disable-fileinfo" || disable_fileinfo=""
|
|
}
|
|
|
|
#Check system
|
|
check_sys() {
|
|
local checkType="$1"
|
|
local value="$2"
|
|
local release=''
|
|
local systemPackage=''
|
|
if [[ -f /etc/redhat-release ]]; then
|
|
release="centos"
|
|
systemPackage="yum"
|
|
elif grep -Eqi "debian" /etc/issue; then
|
|
release="debian"
|
|
systemPackage="apt"
|
|
elif grep -Eqi "ubuntu" /etc/issue; then
|
|
release="ubuntu"
|
|
systemPackage="apt"
|
|
elif grep -Eqi "centos|red hat|redhat" /etc/issue; then
|
|
release="centos"
|
|
systemPackage="yum"
|
|
elif grep -Eqi "debian" /proc/version; then
|
|
release="debian"
|
|
systemPackage="apt"
|
|
elif grep -Eqi "ubuntu" /proc/version; then
|
|
release="ubuntu"
|
|
systemPackage="apt"
|
|
elif grep -Eqi "centos|red hat|redhat" /proc/version; then
|
|
release="centos"
|
|
systemPackage="yum"
|
|
fi
|
|
|
|
if [[ "${checkType}" == "sysRelease" ]]; then
|
|
if [ "${value}" == "${release}" ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
elif [[ "${checkType}" == "packageManager" ]]; then
|
|
if [ "${value}" == "${systemPackage}" ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
create_lib_link() {
|
|
local lib="$1"
|
|
if [ ! -s "/usr/lib64/$lib" ] && [ ! -s "/usr/lib/$lib" ]; then
|
|
libdir=$(find /usr/lib /usr/lib64 -name "$lib" | awk 'NR==1{print}')
|
|
if [ "$libdir" != "" ]; then
|
|
if is_64bit; then
|
|
mkdir /usr/lib64
|
|
ln -s ${libdir} /usr/lib64/${lib}
|
|
ln -s ${libdir} /usr/lib/${lib}
|
|
else
|
|
ln -s ${libdir} /usr/lib/${lib}
|
|
fi
|
|
fi
|
|
fi
|
|
if is_64bit; then
|
|
[ ! -d /usr/lib64 ] && mkdir /usr/lib64
|
|
[ ! -s "/usr/lib64/$lib" ] && [ -s "/usr/lib/$lib" ] && ln -s /usr/lib/${lib} /usr/lib64/${lib}
|
|
[ ! -s "/usr/lib/$lib" ] && [ -s "/usr/lib64/$lib" ] && ln -s /usr/lib64/${lib} /usr/lib/${lib}
|
|
fi
|
|
}
|
|
|
|
create_lib64_dir() {
|
|
local dir="$1"
|
|
if is_64bit; then
|
|
if [ -s "$dir/lib/" ] && [ ! -s "$dir/lib64/" ]; then
|
|
cd ${dir}
|
|
ln -s lib lib64
|
|
fi
|
|
fi
|
|
}
|
|
|
|
error_detect_depends() {
|
|
local command="$1"
|
|
local work_dir=$(pwd)
|
|
local depend=$(echo "$1" | awk '{print $4}')
|
|
_info "Installing package ${depend}"
|
|
${command} &>/dev/null
|
|
if [ $? -ne 0 ]; then
|
|
distro=$(get_opsy)
|
|
version=$(cat /proc/version)
|
|
architecture=$(uname -m)
|
|
mem=$(free -m)
|
|
disk=$(df -ah)
|
|
cat >>${cur_dir}/lamp.log <<EOF
|
|
Errors Detail:
|
|
Distributions:${distro}
|
|
Architecture:${architecture}
|
|
Version:${version}
|
|
Memery:
|
|
${mem}
|
|
Disk:
|
|
${disk}
|
|
Issue:failed to install ${depend}
|
|
EOF
|
|
echo
|
|
echo "+------------------+"
|
|
echo "| ERROR DETECTED |"
|
|
echo "+------------------+"
|
|
echo "Installation package ${depend} failed."
|
|
echo "The Full Log is available at ${cur_dir}/lamp.log"
|
|
echo "Please visit website: https://lamp.sh/faq.html for help"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
error_detect() {
|
|
local command="$1"
|
|
local work_dir=$(pwd)
|
|
local cur_soft=$(echo ${work_dir#$cur_dir} | awk -F'/' '{print $3}')
|
|
${command}
|
|
if [ $? -ne 0 ]; then
|
|
distro=$(get_opsy)
|
|
version=$(cat /proc/version)
|
|
architecture=$(uname -m)
|
|
mem=$(free -m)
|
|
disk=$(df -ah)
|
|
cat >>${cur_dir}/lamp.log <<EOF
|
|
Errors Detail:
|
|
Distributions:${distro}
|
|
Architecture:${architecture}
|
|
Version:${version}
|
|
Memery:
|
|
${mem}
|
|
Disk:
|
|
${disk}
|
|
PHP Version: ${php}
|
|
PHP compile parameter: ${php_configure_args}
|
|
Issue:failed to install ${cur_soft}
|
|
EOF
|
|
echo
|
|
echo "+------------------+"
|
|
echo "| ERROR DETECTED |"
|
|
echo "+------------------+"
|
|
echo "Installation ${cur_soft} failed."
|
|
echo "The Full Log is available at ${cur_dir}/lamp.log"
|
|
echo "Please visit website: https://lamp.sh/faq.html for help"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
upcase_to_lowcase() {
|
|
echo ${1} | tr '[A-Z]' '[a-z]'
|
|
}
|
|
|
|
untar() {
|
|
local tarball_type
|
|
local cur_dir=$(pwd)
|
|
if [ -n ${1} ]; then
|
|
software_name=$(echo $1 | awk -F/ '{print $NF}')
|
|
tarball_type=$(echo $1 | awk -F. '{print $NF}')
|
|
wget --no-check-certificate --progress=bar:force -cv -t3 -T60 ${1} -P ${cur_dir}/
|
|
if [ $? -ne 0 ]; then
|
|
rm -rf ${cur_dir}/${software_name}
|
|
wget --no-check-certificate --progress=bar:force -cv -t3 -T60 ${2} -P ${cur_dir}/
|
|
software_name=$(echo ${2} | awk -F/ '{print $NF}')
|
|
tarball_type=$(echo ${2} | awk -F. '{print $NF}')
|
|
fi
|
|
else
|
|
software_name=$(echo ${2} | awk -F/ '{print $NF}')
|
|
tarball_type=$(echo ${2} | awk -F. '{print $NF}')
|
|
wget --no-check-certificate --progress=bar:force -cv -t3 -T60 ${2} -P ${cur_dir}/ || exit
|
|
fi
|
|
extracted_dir=$(tar tf ${cur_dir}/${software_name} | tail -n 1 | awk -F/ '{print $1}')
|
|
case ${tarball_type} in
|
|
gz | tgz)
|
|
tar zxf ${cur_dir}/${software_name} -C ${cur_dir}/ && cd ${cur_dir}/${extracted_dir} || return 1
|
|
;;
|
|
bz2 | tbz)
|
|
tar jxf ${cur_dir}/${software_name} -C ${cur_dir}/ && cd ${cur_dir}/${extracted_dir} || return 1
|
|
;;
|
|
xz)
|
|
tar Jxf ${cur_dir}/${software_name} -C ${cur_dir}/ && cd ${cur_dir}/${extracted_dir} || return 1
|
|
;;
|
|
tar | Z)
|
|
tar xf ${cur_dir}/${software_name} -C ${cur_dir}/ && cd ${cur_dir}/${extracted_dir} || return 1
|
|
;;
|
|
*)
|
|
_info "${software_name} is wrong tarball type"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
version_lt() {
|
|
test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" != "$1"
|
|
}
|
|
|
|
version_gt() {
|
|
test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1"
|
|
}
|
|
|
|
version_le() {
|
|
test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" == "$1"
|
|
}
|
|
|
|
version_ge() {
|
|
test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"
|
|
}
|
|
|
|
versionget() {
|
|
if [[ -s /etc/redhat-release ]]; then
|
|
grep -oE "[0-9.]+" /etc/redhat-release
|
|
else
|
|
grep -oE "[0-9.]+" /etc/issue
|
|
fi
|
|
}
|
|
|
|
centosversion() {
|
|
if check_sys sysRelease centos; then
|
|
local code=${1}
|
|
local version="$(versionget)"
|
|
local main_ver=${version%%.*}
|
|
if [ "$main_ver" == "$code" ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
get_centosversion() {
|
|
if check_sys sysRelease centos; then
|
|
local version="$(versionget)"
|
|
echo ${version%%.*}
|
|
else
|
|
echo ""
|
|
fi
|
|
}
|
|
|
|
debianversion() {
|
|
if check_sys sysRelease debian; then
|
|
local version=$(get_opsy)
|
|
local code=${1}
|
|
local main_ver=$(echo ${version} | sed 's/[^0-9]//g')
|
|
if [ "${main_ver}" == "${code}" ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
get_debianversion() {
|
|
if check_sys sysRelease debian; then
|
|
local version=$(get_opsy)
|
|
local main_ver=$(echo ${version} | grep -oE "[0-9.]+")
|
|
echo ${main_ver%%.*}
|
|
else
|
|
echo ""
|
|
fi
|
|
}
|
|
|
|
ubuntuversion() {
|
|
if check_sys sysRelease ubuntu; then
|
|
local version=$(get_opsy)
|
|
local code=${1}
|
|
echo ${version} | grep -q "${code}"
|
|
if [ $? -eq 0 ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
get_ubuntuversion() {
|
|
if check_sys sysRelease ubuntu; then
|
|
local version=$(get_opsy)
|
|
local main_ver=$(echo ${version} | grep -oE "[0-9.]+")
|
|
echo ${main_ver%%.*}
|
|
else
|
|
echo ""
|
|
fi
|
|
}
|
|
|
|
parallel_make() {
|
|
local para="$1"
|
|
cpunum=$(cat /proc/cpuinfo | grep 'processor' | wc -l)
|
|
|
|
if [ ${parallel_compile} -eq 0 ]; then
|
|
cpunum=1
|
|
fi
|
|
|
|
if [ ${cpunum} -eq 1 ]; then
|
|
[ "${para}" == "" ] && make || make "${para}"
|
|
else
|
|
[ "${para}" == "" ] && make -j${cpunum} || make -j${cpunum} "${para}"
|
|
fi
|
|
}
|
|
|
|
boot_start() {
|
|
if check_sys packageManager apt; then
|
|
update-rc.d -f "$1" defaults
|
|
elif check_sys packageManager yum; then
|
|
chkconfig --add "$1"
|
|
chkconfig "$1" on
|
|
fi
|
|
}
|
|
|
|
boot_stop() {
|
|
if check_sys packageManager apt; then
|
|
update-rc.d -f "$1" remove
|
|
elif check_sys packageManager yum; then
|
|
chkconfig "$1" off
|
|
chkconfig --del "$1"
|
|
fi
|
|
}
|
|
|
|
filter_location() {
|
|
local location="$1"
|
|
if ! echo ${location} | grep -q "^/"; then
|
|
while true; do
|
|
read -p "Input error, please input location again: " location
|
|
echo ${location} | grep -q "^/" && echo ${location} && break
|
|
done
|
|
else
|
|
echo ${location}
|
|
fi
|
|
}
|
|
|
|
# Download a file
|
|
# $1: file name
|
|
# $2: primary url
|
|
download_file() {
|
|
local cur_dir=$(pwd)
|
|
if [ -s "$1" ]; then
|
|
_info "$1 [found]"
|
|
else
|
|
_info "$1 not found, download now..."
|
|
wget --no-check-certificate --progress=bar:force -cv -t3 -T10 -O ${1} ${2}
|
|
if [ $? -eq 0 ]; then
|
|
_info "$1 download completed..."
|
|
else
|
|
rm -f "$1"
|
|
_info "$1 download failed, retrying download from secondary url..."
|
|
wget --no-check-certificate --progress=bar:force -cv -t3 -T60 -O "$1" "${download_root_url}/${1}"
|
|
if [ $? -eq 0 ]; then
|
|
_info "$1 download completed..."
|
|
else
|
|
_error "Failed to download $1, please download it to ${cur_dir} directory manually and try again."
|
|
fi
|
|
fi
|
|
fi
|
|
}
|
|
|
|
is_64bit() {
|
|
if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LONG_BIT) = '64' ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
is_digit() {
|
|
local input="$1"
|
|
if [[ "$input" =~ ^[0-9]+$ ]]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
is_exist() {
|
|
local cmd="$1"
|
|
if eval type type &>/dev/null; then
|
|
eval type "$cmd" &>/dev/null
|
|
elif command &>/dev/null; then
|
|
command -v "$cmd" &>/dev/null
|
|
else
|
|
which "$cmd" &>/dev/null
|
|
fi
|
|
local rt=$?
|
|
return ${rt}
|
|
}
|
|
|
|
if_in_array() {
|
|
local element="$1"
|
|
local array="$2"
|
|
for i in ${array}; do
|
|
if [ "$i" == "$element" ]; then
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
add_to_env() {
|
|
local location="$1"
|
|
cd ${location} && [ ! -d lib ] && [ -d lib64 ] && ln -s lib64 lib
|
|
[ -d "${location}/lib" ] && export LD_LIBRARY_PATH=${location}/lib:${LD_LIBRARY_PATH}
|
|
[ -d "${location}/bin" ] && export PATH=${location}/bin:${PATH}
|
|
[ -d "${location}/include" ] && export CPPFLAGS="-I${location}/include $CPPFLAGS"
|
|
}
|
|
|
|
firewall_set() {
|
|
_info "Setting Firewall..."
|
|
if systemctl status firewalld &>/dev/null; then
|
|
default_zone="$(firewall-cmd --get-default-zone)"
|
|
firewall-cmd --permanent --zone=${default_zone} --add-service=http &>/dev/null
|
|
firewall-cmd --permanent --zone=${default_zone} --add-service=https &>/dev/null
|
|
firewall-cmd --reload &>/dev/null
|
|
else
|
|
_warn "firewalld looks like not running, please manually set if necessary."
|
|
fi
|
|
_info "Set Firewall completed..."
|
|
}
|
|
|
|
remove_packages() {
|
|
_info "Removing the conflict packages..."
|
|
if check_sys packageManager apt; then
|
|
[ "${apache}" != "do_not_install" ] && apt-get -y remove --purge apache2 apache2-* &>/dev/null
|
|
[ "${mysql}" != "do_not_install" ] && apt-get -y remove --purge mysql-client mysql-server mysql-common libmysqlclient20 libmysqlclient21 &>/dev/null
|
|
[ "${php}" != "do_not_install" ] && apt-get -y remove --purge php7.4 php7.4-* php8.0 php8.0-* php8.1 php8.1-* php8.2 php8.2-* &>/dev/null
|
|
elif check_sys packageManager yum; then
|
|
[ "${apache}" != "do_not_install" ] && yum -y remove httpd-* &>/dev/null
|
|
[ "${mysql}" != "do_not_install" ] && yum -y remove mysql-* &>/dev/null
|
|
[ "${php}" != "do_not_install" ] && yum -y remove php-* libzip-devel libzip &>/dev/null
|
|
fi
|
|
_info "Remove the conflict packages completed..."
|
|
}
|
|
|
|
sync_time() {
|
|
_info "Sync time..."
|
|
is_exist "ntpdate" && ntpdate -b cn.pool.ntp.org &>/dev/null
|
|
is_exist "chronyd" && chronyd -q 'server cn.pool.ntp.org iburst' &>/dev/null
|
|
_info "Sync time completed..."
|
|
StartDate=$(date "+%Y-%m-%d %H:%M:%S")
|
|
StartDateSecond=$(date +%s)
|
|
_info "Start time: ${StartDate}"
|
|
}
|
|
|
|
start_install() {
|
|
echo "Press any key to start...or Press Ctrl+C to cancel"
|
|
echo
|
|
char=$(get_char)
|
|
}
|
|
|
|
#Last confirm
|
|
last_confirm() {
|
|
clear
|
|
echo
|
|
echo "------------------------- Install Overview --------------------------"
|
|
echo
|
|
echo "Apache: ${apache}"
|
|
[ "${apache}" != "do_not_install" ] && echo "Apache Location: ${apache_location}"
|
|
if [ "${apache_modules_install}" != "do_not_install" ]; then
|
|
echo "Apache Additional Modules:"
|
|
for a in ${apache_modules_install[@]}; do
|
|
echo "${a}"
|
|
done
|
|
else
|
|
echo "Apache Additional Modules: do_not_install"
|
|
fi
|
|
echo
|
|
echo "Database: ${mysql}"
|
|
if echo "${mysql}" | grep -qi "mysql"; then
|
|
echo "MySQL Location: ${mysql_location}"
|
|
echo "MySQL Data Location: ${mysql_data_location}"
|
|
echo "MySQL Root Password: ${mysql_root_pass}"
|
|
elif echo "${mysql}" | grep -qi "mariadb"; then
|
|
echo "MariaDB Location: ${mariadb_location}"
|
|
echo "MariaDB Data Location: ${mariadb_data_location}"
|
|
echo "MariaDB Root Password: ${mariadb_root_pass}"
|
|
fi
|
|
echo
|
|
if [ "${phpmyadmin_install}" != "do_not_install" ]; then
|
|
echo "Database Management Modules:"
|
|
for a in ${phpmyadmin_install[@]}; do
|
|
echo "${a}"
|
|
done
|
|
else
|
|
echo "Database Management Modules: do_not_install"
|
|
fi
|
|
echo
|
|
echo "PHP: ${php}"
|
|
[ "${php}" != "do_not_install" ] && echo "PHP Location: ${php_location}"
|
|
if [ "${php_modules_install}" != "do_not_install" ]; then
|
|
echo "PHP Additional Extensions:"
|
|
for m in ${php_modules_install[@]}; do
|
|
echo "${m}"
|
|
done
|
|
else
|
|
echo "PHP Additional Extensions: do_not_install"
|
|
fi
|
|
echo
|
|
echo "KodExplorer: ${kodexplorer}"
|
|
[ "${kodexplorer}" != "do_not_install" ] && echo "KodExplorer Location: ${web_root_dir}/kod"
|
|
echo
|
|
echo "---------------------------------------------------------------------"
|
|
echo
|
|
}
|
|
|
|
#Finally to do
|
|
install_finally() {
|
|
_info "Cleaning up..."
|
|
cd ${cur_dir}
|
|
rm -rf ${cur_dir}/software
|
|
_info "Clean up completed..."
|
|
|
|
if check_sys packageManager yum; then
|
|
firewall_set
|
|
fi
|
|
|
|
echo
|
|
echo "Congratulations, LAMP install completed!"
|
|
echo
|
|
echo "------------------------ Installed Overview -------------------------"
|
|
echo
|
|
echo "Apache: ${apache}"
|
|
if [ "${apache}" != "do_not_install" ]; then
|
|
echo "Default Website: http://$(get_ip)"
|
|
echo "Apache Location: ${apache_location}"
|
|
fi
|
|
if [ "${apache_modules_install}" != "do_not_install" ]; then
|
|
echo "Apache Additional Modules:"
|
|
for a in ${apache_modules_install[@]}; do
|
|
echo "${a}"
|
|
done
|
|
else
|
|
echo "Apache Additional Modules: do_not_install"
|
|
fi
|
|
echo
|
|
echo "Database: ${mysql}"
|
|
if [ -d ${mysql_location} ]; then
|
|
echo "MySQL Location: ${mysql_location}"
|
|
echo "MySQL Data Location: ${mysql_data_location}"
|
|
echo "MySQL Root Password: ${mysql_root_pass}"
|
|
dbrootpwd=${mysql_root_pass}
|
|
elif [ -d ${mariadb_location} ]; then
|
|
echo "MariaDB Location: ${mariadb_location}"
|
|
echo "MariaDB Data Location: ${mariadb_data_location}"
|
|
echo "MariaDB Root Password: ${mariadb_root_pass}"
|
|
dbrootpwd=${mariadb_root_pass}
|
|
fi
|
|
echo
|
|
if [ "${phpmyadmin_install}" != "do_not_install" ]; then
|
|
echo "Database Management Modules:"
|
|
for a in ${phpmyadmin_install[@]}; do
|
|
echo "${a}"
|
|
done
|
|
else
|
|
echo "Database Management Modules: do_not_install"
|
|
fi
|
|
echo
|
|
echo "PHP: ${php}"
|
|
[ "${php}" != "do_not_install" ] && echo "PHP Location: ${php_location}"
|
|
if [ "${php_modules_install}" != "do_not_install" ]; then
|
|
echo "PHP Additional Extensions:"
|
|
for m in ${php_modules_install[@]}; do
|
|
echo "${m}"
|
|
done
|
|
else
|
|
echo "PHP Additional Extensions: do_not_install"
|
|
fi
|
|
echo
|
|
echo "KodExplorer: ${kodexplorer}"
|
|
[ "${kodexplorer}" != "do_not_install" ] && echo "KodExplorer Location: ${web_root_dir}/kod"
|
|
echo
|
|
echo "---------------------------------------------------------------------"
|
|
echo
|
|
|
|
cp -f ${cur_dir}/conf/lamp /usr/bin/lamp
|
|
chmod +x /usr/bin/lamp
|
|
sed -i "s@^apache_location=.*@apache_location=${apache_location}@" /usr/bin/lamp
|
|
sed -i "s@^mysql_location=.*@mysql_location=${mysql_location}@" /usr/bin/lamp
|
|
sed -i "s@^mariadb_location=.*@mariadb_location=${mariadb_location}@" /usr/bin/lamp
|
|
sed -i "s@^web_root_dir=.*@web_root_dir=${web_root_dir}@" /usr/bin/lamp
|
|
ldconfig
|
|
# Add phpmyadmin Alias
|
|
if [[ -d "${web_root_dir}/phpmyadmin" ]]; then
|
|
if [[ $(grep -Ec "^\s*Alias /phpmyadmin" ${apache_location}/conf/httpd.conf) -eq 0 ]]; then
|
|
cat >>${apache_location}/conf/httpd.conf <<EOF
|
|
<IfModule alias_module>
|
|
Alias /phpmyadmin ${web_root_dir}/phpmyadmin
|
|
</IfModule>
|
|
EOF
|
|
fi
|
|
fi
|
|
# Add kodexplorer Alias
|
|
if [[ -d "${web_root_dir}/kod" ]]; then
|
|
if [[ $(grep -Ec "^\s*Alias /kod" ${apache_location}/conf/httpd.conf) -eq 0 ]]; then
|
|
cat >>${apache_location}/conf/httpd.conf <<EOF
|
|
<IfModule alias_module>
|
|
Alias /kod ${web_root_dir}/kod
|
|
</IfModule>
|
|
EOF
|
|
fi
|
|
fi
|
|
if [ "${apache}" != "do_not_install" ]; then
|
|
echo "Starting Apache..."
|
|
/etc/init.d/httpd start &>/dev/null
|
|
fi
|
|
if [ "${mysql}" != "do_not_install" ]; then
|
|
echo "Starting Database..."
|
|
/etc/init.d/mysqld start &>/dev/null
|
|
fi
|
|
if if_in_array "${php_memcached_filename}" "${php_modules_install}"; then
|
|
echo "Starting Memcached..."
|
|
/etc/init.d/memcached start &>/dev/null
|
|
fi
|
|
if if_in_array "${php_redis_filename}" "${php_modules_install}"; then
|
|
echo "Starting Redis-server..."
|
|
/etc/init.d/redis-server start &>/dev/null
|
|
fi
|
|
# Install phpmyadmin database
|
|
if [ -d "${web_root_dir}/phpmyadmin" ] && [ -f "/usr/bin/mysql" ]; then
|
|
/usr/bin/mysql -uroot -p${dbrootpwd} <${web_root_dir}/phpmyadmin/sql/create_tables.sql &>/dev/null
|
|
fi
|
|
|
|
sleep 1
|
|
netstat -tunlp
|
|
echo
|
|
_info "Start time : ${StartDate}"
|
|
_info "Completion time: $(date "+%Y-%m-%d %H:%M:%S") (Use:$(_red $((($(date +%s) - StartDateSecond) / 60))) minutes)"
|
|
_info "Welcome to visit our website: https://lamp.sh"
|
|
_info "Enjoy it"
|
|
exit 0
|
|
}
|
|
|
|
#Install tools
|
|
install_tools() {
|
|
_info "Installing development tools..."
|
|
if check_sys packageManager apt; then
|
|
apt-get -y update &>/dev/null
|
|
apt_tools=(xz-utils tar gcc g++ make wget perl curl bzip2 libreadline-dev net-tools cron ca-certificates ntpdate)
|
|
for tool in ${apt_tools[@]}; do
|
|
error_detect_depends "apt-get -y install ${tool}"
|
|
done
|
|
if ubuntuversion 22 || ubuntuversion 24 || debianversion 12; then
|
|
error_detect_depends "apt-get -y install python3"
|
|
error_detect_depends "apt-get -y install python3-dev"
|
|
else
|
|
error_detect_depends "apt-get -y install python"
|
|
error_detect_depends "apt-get -y install python-dev"
|
|
fi
|
|
elif check_sys packageManager yum; then
|
|
yum makecache &>/dev/null
|
|
yum_tools=(yum-utils tar gcc gcc-c++ make wget perl chkconfig curl bzip2 readline readline-devel net-tools crontabs ca-certificates epel-release)
|
|
# libcurl-minimal and curl-minimal will be installed by default instead of libcurl and curl
|
|
if rpm -qa | grep -q curl-minimal; then
|
|
yum_tools=(${yum_tools[@]#curl})
|
|
fi
|
|
for tool in ${yum_tools[@]}; do
|
|
error_detect_depends "yum -y install ${tool}"
|
|
done
|
|
yum-config-manager --enable epel &>/dev/null
|
|
# Install epel-release in Amazon Linux 2
|
|
if is_exist "amazon-linux-extras"; then
|
|
amazon-linux-extras install -y epel &>/dev/null
|
|
fi
|
|
if centosversion 8; then
|
|
error_detect_depends "yum -y install python3-devel"
|
|
error_detect_depends "yum -y install chrony"
|
|
yum-config-manager --enable PowerTools &>/dev/null || yum-config-manager --enable powertools &>/dev/null
|
|
elif centosversion 9; then
|
|
error_detect_depends "yum -y install python3-devel"
|
|
error_detect_depends "yum -y install chrony"
|
|
yum-config-manager --enable crb &>/dev/null
|
|
else
|
|
error_detect_depends "yum -y install python"
|
|
error_detect_depends "yum -y install python-devel"
|
|
error_detect_depends "yum -y install ntpdate"
|
|
fi
|
|
fi
|
|
_info "Install development tools completed..."
|
|
|
|
}
|
|
|
|
#start install lamp
|
|
lamp_install() {
|
|
disable_selinux
|
|
install_tools
|
|
sync_time
|
|
remove_packages
|
|
[ ! -d ${cur_dir}/software ] && mkdir -p ${cur_dir}/software
|
|
[ "${apache}" != "do_not_install" ] && check_installed "install_apache" "${apache_location}"
|
|
[ "${apache_modules_install}" != "do_not_install" ] && install_apache_modules
|
|
if echo "${mysql}" | grep -qi "mysql"; then
|
|
check_installed "install_mysqld" "${mysql_location}"
|
|
elif echo "${mysql}" | grep -qi "mariadb"; then
|
|
check_installed "install_mariadb" "${mariadb_location}"
|
|
fi
|
|
[ "${php}" != "do_not_install" ] && check_installed "install_php" "${php_location}"
|
|
[ "${phpmyadmin_install}" != "do_not_install" ] && install_phpmyadmin_modules
|
|
[ "${kodexplorer}" != "do_not_install" ] && install_kodexplorer
|
|
[ "${php_modules_install}" != "do_not_install" ] && install_php_modules "${phpConfig}"
|
|
install_finally
|
|
}
|
|
|
|
#Pre-installation
|
|
lamp_preinstall() {
|
|
apache_preinstall_settings
|
|
mysql_preinstall_settings
|
|
php_preinstall_settings
|
|
php_modules_preinstall_settings
|
|
phpmyadmin_preinstall_settings
|
|
kodexplorer_preinstall_settings
|
|
}
|
|
|
|
#Pre-installation settings
|
|
pre_setting() {
|
|
check_os
|
|
check_ram
|
|
display_os_info
|
|
lamp_preinstall
|
|
last_confirm
|
|
start_install
|
|
lamp_install
|
|
}
|