|
#!/bin/bash |
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin |
|
export PATH |
|
LANG=en_US.UTF-8 |
|
|
|
STRIPE_LINE="----------------------------------------------------" |
|
DOUBLE_STRIPE_LINE="============================================" |
|
|
|
HTTP_STR="http" |
|
|
|
XP_VERSION="v1.1.12" |
|
|
|
API_HOST="https://api.xp.cn" |
|
DL_HOST="https://dl.xp.cn" |
|
|
|
current_dir=$(pwd) |
|
INSTALL_LOG_PATH="${current_dir}/xp-install.log" |
|
|
|
start_time=`date +%s` |
|
|
|
IDC_CODE="" |
|
|
|
if [ $(whoami) != "root" ];then |
|
echo "xp面板安装命令需要root权限执行" |
|
exit 1; |
|
fi |
|
|
|
is64bit=$(getconf LONG_BIT) |
|
if [ "${is64bit}" != '64' ];then |
|
echo "xp面板仅支持64位系统安装"; |
|
fi |
|
|
|
arch_check=$(uname -m) |
|
if [ "${arch_check}" != "x86_64" ] && [ "${arch_check}" != "amd64" ]; then |
|
echo "xp面板仅支持x86_64或者amd64架构CPU的系统安装"; |
|
fi |
|
|
|
|
|
centos6_check=$(cat /etc/redhat-release | grep ' 6.' | grep -iE 'centos|Red Hat') |
|
if [ "${centos6_check}" ];then |
|
echo "xp面板不支持Centos6,请更换Centos7/8或更高版本的系统" |
|
exit 1 |
|
fi |
|
|
|
|
|
ubuntu_check=$(cat /etc/issue|grep Ubuntu|awk '{print $2}'|cut -f 1 -d '.') |
|
if [ "${ubuntu_check}" ] && [ "${ubuntu_check}" -lt "16" ];then |
|
echo "xp面板不支持Ubuntu ${ubuntu_check},请更换Ubuntu18/20或更高版本的系统" |
|
exit 1 |
|
fi |
|
|
|
hostname_check=$(cat /etc/hostname) |
|
if [ -z "${hostname_check}" ];then |
|
echo "无法安装xp面板,因为当前主机名hostname为空,请设置hostname后重新安装" |
|
exit 1 |
|
fi |
|
|
|
Get_LocalInfo(){ |
|
if [ -s "/etc/redhat-release" ];then |
|
SYS_VERSION=$(cat /etc/redhat-release | sed 's/\\n//g' | sed 's/\\l//g') |
|
elif [ -s "/etc/issue" ]; then |
|
SYS_VERSION=$(cat /etc/issue | sed 's/\\n//g' | sed 's/\\l//g' | tr -d '\n' | tr -d '\n') |
|
fi |
|
SYS_INFO=$(uname -a) |
|
SYS_BIT=$(getconf LONG_BIT) |
|
MEM_TOTAL=$(free -m|grep Mem|awk '{print $2}') |
|
CPU_INFO=$(getconf _NPROCESSORS_ONLN) |
|
DISK_USE=$(df -h / | tail -n 1 | awk '{printf "size:%s;used:%s;avil:%s;percent:%s", $2, $3, $4, $5}') |
|
} |
|
|
|
cd ~ |
|
SETUP_PATH="/xp" |
|
|
|
Get_Sysinfo(){ |
|
Get_LocalInfo |
|
|
|
echo -e ${SYS_VERSION} |
|
echo -e Bit:${SYS_BIT} Mem:${MEM_TOTAL}M Core:${CPU_INFO} |
|
echo -e ${SYS_INFO} |
|
echo -e "${DOUBLE_STRIPE_LINE}" |
|
echo -e "请截图以上报错信息发给客服人员" |
|
echo -e "${DOUBLE_STRIPE_LINE}" |
|
if [ -f "/usr/bin/qrencode" ];then |
|
echo -e "微信扫码联系企业微信技术求助" |
|
echo -e "${DOUBLE_STRIPE_LINE}" |
|
qrencode -t ANSIUTF8 "https://work.weixin.qq.com/kfid/kfc8e99c5e9fb4761c6" |
|
echo -e "${DOUBLE_STRIPE_LINE}" |
|
else |
|
echo -e "手机访问以下链接、扫码联系企业微信技术求助" |
|
echo -e "${DOUBLE_STRIPE_LINE}" |
|
echo -e "联系链接:https://work.weixin.qq.com/kfid/kfc8e99c5e9fb4761c6" |
|
echo -e "${DOUBLE_STRIPE_LINE}" |
|
fi |
|
} |
|
|
|
Red_Err(){ |
|
echo "${DOUBLE_STRIPE_LINE}"; |
|
printf '\033[1;31;40m%b\033[0m\n' "$@"; |
|
Get_Sysinfo |
|
Analysis_Log |
|
exit 1; |
|
} |
|
|
|
|
|
Env_Check(){ |
|
mysqld_exists=$(ps -ef |grep mysqld|grep -v grep|grep -v /www/server/mysql) |
|
php_exists=$(ps -ef|grep php-fpm|grep master|grep -v /www/server/php) |
|
nginx_exists=$(ps -ef|grep nginx|grep master|grep -v /www/server/nginx) |
|
httpd_exists=$(ps -ef |grep -E 'httpd|apache'|grep -v /www/server/apache|grep -v grep) |
|
if [ "${php_exists}" ] || [ "${mysqld_exists}" ] || [ "${nginx_exists}" ] || [ "${httpd_exists}" ];then |
|
Force_Install_Confirm |
|
fi |
|
} |
|
|
|
|
|
Force_Install_Confirm(){ |
|
if [ "${INSTALL_FORCE}" ];then |
|
return |
|
fi |
|
echo -e "${STRIPE_LINE}" |
|
echo -e "检查已有其他Web/mysql环境,继续安装可能影响现有站点及数据" |
|
echo -e "Web/mysql service is alreday installed,Can't install panel" |
|
echo -e "${STRIPE_LINE}" |
|
echo -e "已知风险/Enter yes to force installation" |
|
read -p "输入yes强制安装: " yes; |
|
if [ "$yes" != "yes" ];then |
|
echo -e "------------" |
|
echo "取消安装" |
|
exit; |
|
fi |
|
start_time=`date +%s` |
|
INSTALL_FORCE="true" |
|
} |
|
|
|
|
|
Get_PM(){ |
|
if [ -f "/usr/bin/yum" ] && [ -d "/etc/yum.repos.d" ]; then |
|
PM="yum" |
|
elif [ -f "/usr/bin/apt-get" ] && [ -f "/usr/bin/dpkg" ]; then |
|
PM="apt-get" |
|
fi |
|
} |
|
|
|
|
|
Auto_Swap_Mem(){ |
|
MEM_TOTAL=$(free -g|grep Mem|awk '{print $2}') |
|
if [ "${MEM_TOTAL}" -le "1" ];then |
|
swap=$(free |grep Swap|awk '{print $2}') |
|
if [ "${swap}" -gt 1 ];then |
|
echo "Swap total sizse: $swap"; |
|
return; |
|
fi |
|
if [ ! -d /www ];then |
|
mkdir /www |
|
fi |
|
swap_file="/www/swap" |
|
dd if=/dev/zero of=$swap_file bs=1M count=1025 |
|
mkswap -f $swap_file |
|
swapon $swap_file |
|
echo "$swap_file swap swap defaults 0 0" >> /etc/fstab |
|
swap=`free |grep Swap|awk '{print $2}'` |
|
if [ $swap -gt 1 ];then |
|
echo "Swap total sizse: $swap"; |
|
return; |
|
fi |
|
|
|
sed -i "/\/www\/swap/d" /etc/fstab |
|
rm -f $swap_file |
|
fi |
|
} |
|
|
|
Add_Service(){ |
|
if [ "${PM}" == "yum" ] || [ "${PM}" == "dnf" ]; then |
|
chkconfig --add xpd |
|
chkconfig --level 2345 xpd on |
|
sudo cp ${SETUP_PATH}/init/xpd.service /usr/lib/systemd/system/xpd.service |
|
sudo chmod +x /usr/lib/systemd/system/xpd.service |
|
sudo systemctl enable xpd |
|
elif [ "${PM}" == "apt-get" ]; then |
|
sudo update-rc.d xpd defaults |
|
fi |
|
} |
|
|
|
|
|
Set_Centos_Repo(){ |
|
huawei_check=$(cat /etc/motd |grep "Huawei Cloud") |
|
if [ "${huawei_check}" ] && [ "${is64bit}" == "64" ];then |
|
\cp -rpa /etc/yum.repos.d/ /etc/yumBak |
|
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*.repo |
|
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.epel.cloud|g' /etc/yum.repos.d/CentOS-*.repo |
|
rm -f /etc/yum.repos.d/epel.repo |
|
rm -f /etc/yum.repos.d/epel-* |
|
fi |
|
aliyun_check=$(cat /etc/motd|grep "Alibaba Cloud ") |
|
if [ "${aliyun_check}" ] && [ "${is64bit}" == "64" ] && [ ! -f "/etc/yum.repos.d/Centos-vault-8.5.2111.repo" ];then |
|
rename '.repo' '.repo.bak' /etc/yum.repos.d/*.repo |
|
wget https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo -O /etc/yum.repos.d/Centos-vault-8.5.2111.repo |
|
wget https://mirrors.aliyun.com/repo/epel-archive-8.repo -O /etc/yum.repos.d/epel-archive-8.repo |
|
sed -i 's/mirrors.cloud.aliyuncs.com/url_tmp/g' /etc/yum.repos.d/Centos-vault-8.5.2111.repo && sed -i 's/mirrors.aliyun.com/mirrors.cloud.aliyuncs.com/g' /etc/yum.repos.d/Centos-vault-8.5.2111.repo && sed -i 's/url_tmp/mirrors.aliyun.com/g' /etc/yum.repos.d/Centos-vault-8.5.2111.repo |
|
sed -i 's/mirrors.aliyun.com/mirrors.cloud.aliyuncs.com/g' /etc/yum.repos.d/epel-archive-8.repo |
|
fi |
|
mirror_check=$(cat /etc/yum.repos.d/CentOS-Linux-AppStream.repo |grep "[^#]mirror.centos.org") |
|
if [ "${mirror_check}" ] && [ "${is64bit}" == "64" ];then |
|
\cp -rpa /etc/yum.repos.d/ /etc/yumBak |
|
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*.repo |
|
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.epel.cloud|g' /etc/yum.repos.d/CentOS-*.repo |
|
fi |
|
} |
|
|
|
|
|
Install_RPM_Base_Pkg(){ |
|
yum_path=/etc/yum.conf |
|
centos8_check=$(cat /etc/redhat-release | grep ' 8.' | grep -iE 'centos|Red Hat') |
|
if [ "${centos8_check}" ];then |
|
Set_Centos_Repo |
|
fi |
|
is_exc=$(cat $yum_path|grep httpd) |
|
if [ "$is_exc" = "" ];then |
|
echo "exclude=httpd nginx php mysql mairadb python-psutil python2-psutil" >> $yum_path |
|
fi |
|
|
|
if [ -f "/etc/redhat-release" ] && [ $(cat /etc/os-release|grep PLATFORM_ID|grep -oE "el8") ];then |
|
yum config-manager --set-enabled powertools |
|
yum config-manager --set-enabled PowerTools |
|
fi |
|
|
|
if [ -f "/etc/redhat-release" ] && [ $(cat /etc/os-release|grep PLATFORM_ID|grep -oE "el9") ];then |
|
dnf config-manager --set-enabled crb -y |
|
fi |
|
|
|
|
|
echo 'Synchronizing system time...' |
|
get_server_time=$(curl -sS --connect-timeout 3 -m 60 ${API_HOST}/api/getTime) |
|
if [ "${get_server_time}" ];then |
|
date -s "$(date -d @$get_server_time +"%Y-%m-%d %H:%M:%S")" |
|
fi |
|
|
|
if [ -z "${centos8_check}" ]; then |
|
yum install ntp -y |
|
rm -rf /etc/localtime |
|
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |
|
|
|
|
|
ntpdate 0.asia.pool.ntp.org |
|
setenforce 0 |
|
fi |
|
|
|
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config |
|
yum_packs="libcurl-devel wget tar gcc make zip unzip openssl openssl-devel libxml2 libxml2-devel libxslt* zlib zlib-devel libjpeg-devel libpng-devel libwebp libwebp-devel freetype freetype-devel lsof pcre pcre-devel vixie-cron crontabs icu libicu-devel c-ares libffi-devel bzip2-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel qrencode clang libaio ncurses-compat-libs" |
|
echo "下列软件将被安装:${yum_packs}" |
|
yum install -y --skip-broken ${yum_packs} |
|
|
|
for yum_pack in ${yum_packs} |
|
do |
|
rpm_pack=$(rpm -q ${yum_pack}) |
|
pack_check=$(echo ${rpm_pack}|grep not) |
|
if [ "${pack_check}" ]; then |
|
yum install ${yum_pack} -y |
|
fi |
|
done |
|
|
|
echo "安装必备软件:iptables" |
|
yum install -y iptables |
|
|
|
if [ -f "/usr/bin/dnf" ]; then |
|
dnf install -y redhat-rpm-config |
|
fi |
|
|
|
ali_os=$(cat /etc/redhat-release |grep "Alibaba Cloud Linux release 3") |
|
if [ -z "${ali_os}" ];then |
|
yum install epel-release -y |
|
fi |
|
} |
|
|
|
|
|
Install_Deb_Base_Pkg(){ |
|
|
|
lf_pid=$(sudo lsof /var/lib/dpkg/lock-frontend | awk 'NR==2{print $2}') |
|
if [ -n "$lf_pid" ]; then |
|
sudo kill -9 $lf_pid |
|
fi |
|
l_pid=$(sudo lsof /var/lib/dpkg/lock | awk 'NR==2{print $2}') |
|
if [ -n "$l_pid" ]; then |
|
sudo kill -9 $l_pid |
|
fi |
|
|
|
ln -sf bash /bin/sh |
|
ubuntu_22=$(cat /etc/issue|grep "Ubuntu 22") |
|
if [ "${ubuntu_22}" ];then |
|
apt-get remove needrestart -y |
|
fi |
|
aliyun_check=$(cat /etc/motd|grep "Alibaba Cloud ") |
|
if [ "${aliyun_check}" ] && [ "${ubuntu_22}" ];then |
|
apt-get remove libicu70 -y |
|
fi |
|
apt-get update -y |
|
apt-get install bash -y |
|
if [ -f "/usr/bin/bash" ];then |
|
ln -sf /usr/bin/bash /bin/sh |
|
fi |
|
apt-get install ruby -y |
|
apt-get install lsb-release -y |
|
|
|
libcurl_ver=$(dpkg -l|grep libcurl4|awk '{print $3}') |
|
if [ "${libcurl_ver}" == "7.68.0-1ubuntu2.8" ];then |
|
apt-get remove libcurl4 -y |
|
apt-get install curl -y |
|
fi |
|
|
|
deb_packs="wget curl libcurl4-openssl-dev gcc make zip unzip tar openssl libssl-dev libxml2 libxml2-dev zlib1g zlib1g-dev libjpeg-dev libpng-dev lsof libpcre3 libpcre3-dev cron net-tools swig build-essential libffi-dev libbz2-dev libncurses-dev libsqlite3-dev iptables libreadline-dev tk-dev libgdbm-dev libdb-dev libdb++-dev libpcap-dev xz-utils git qrencode libwebp-dev libsodium-dev clang libaio1 libncurses5" |
|
echo "下列软件将被安装:${deb_packs}" |
|
apt-get install -y -m $deb_packs --force-yes |
|
|
|
for deb_pack in ${deb_packs} |
|
do |
|
pack_check=$(dpkg -l|grep ${deb_pack}) |
|
if [ "$?" -ne "0" ] ;then |
|
apt-get install -y $deb_pack |
|
fi |
|
done |
|
|
|
echo "安装必备软件:iptables" |
|
apt-get install -y iptables |
|
|
|
if [ ! -d '/etc/letsencrypt' ];then |
|
mkdir -p /etc/letsencryp |
|
mkdir -p /var/spool/cron |
|
if [ ! -f '/var/spool/cron/crontabs/root' ];then |
|
echo '' > /var/spool/cron/crontabs/root |
|
chmod 600 /var/spool/cron/crontabs/root |
|
fi |
|
fi |
|
} |
|
|
|
Init_DB(){ |
|
if [ ! -d "${SETUP_PATH}/db" ];then |
|
Red_Err "数据库文件缺失,请检查安装包" |
|
exit 1 |
|
fi |
|
if [ ! -f "${SETUP_PATH}/init/init.sql" ];then |
|
Red_Err "初始化数据文件缺失,请检查安装包" |
|
exit 1 |
|
fi |
|
|
|
chmod -R 0777 ${SETUP_PATH}/db |
|
|
|
time_now_str=$(date "+%Y-%m-%d %H:%M:%S") |
|
sed -i -e "s/{port}/${panel_port}/g" -e "s/{account}/${panel_user}/g" -e "s/{pwd}/${panel_pwd}/g" -e "s/{pwdMd5}/${panel_pwd_md5}/g" -e "s/{safeEntry}/${safe_entry}/g" -e "s/{time}/${time_now_str}/g" -e "s/{xpVersion}/${XP_VERSION}/g" -e "s/{idcCode}/${IDC_CODE}/g" ${SETUP_PATH}/init/init.sql |
|
|
|
msg=$(sqlite3 ${SETUP_PATH}/db/app.db < ${SETUP_PATH}/init/init.sql 2>&1) |
|
if [ $? -ne 0 ];then |
|
Red_Err "数据库初始化失败,错误信息:${msg}" |
|
exit 1 |
|
fi |
|
} |
|
|
|
Down_Deps(){ |
|
for pkg in $@ |
|
do |
|
dl_url="${DL_HOST}/deps/${pkg}.tar.gz" |
|
cd ${SETUP_PATH}/download |
|
wget -O ./${pkg}.tar.gz "${dl_url}" |
|
mkdir -p ./${pkg} |
|
tar -zxvf ./${pkg}.tar.gz -C ./${pkg} |
|
sudo bash ./${pkg}/${pkg}_install.sh |
|
cd $current_dir |
|
done |
|
} |
|
|
|
Check_CMD(){ |
|
for cmd in $@ |
|
do |
|
if ! command -v "$cmd" &> /dev/null; then |
|
Red_Err "Error: Command '$cmd' not found." |
|
exit 1 |
|
fi |
|
done |
|
} |
|
|
|
Down_XP(){ |
|
mkdir -p $SETUP_PATH/download |
|
wget -O ${SETUP_PATH}/download/xp-panel.tar.gz "${DL_HOST}/dl/xp/xp-panel.tar.gz" |
|
} |
|
|
|
Init_Tools(){ |
|
xp_tools_dir="/xp/tools" |
|
|
|
if [ -d "$xp_tools_dir" ]; then |
|
for tool in "$xp_tools_dir"/*.sh; do |
|
filename=$(basename "$tool" .sh) |
|
if [ -L "/usr/bin/$filename" ]; then |
|
rm "/usr/bin/$filename" |
|
fi |
|
ln -s "$tool" "/usr/bin/$filename" |
|
done |
|
fi |
|
} |
|
|
|
Init_XP(){ |
|
Check_CMD sqlite3 iptables vsftpd |
|
|
|
mkdir -p $SETUP_PATH/server |
|
mkdir -p $SETUP_PATH/panel |
|
mkdir -p $SETUP_PATH/wwwlogs |
|
mkdir -p $SETUP_PATH/applogs |
|
mkdir -p $SETUP_PATH/www |
|
mkdir -p $SETUP_PATH/backup |
|
mkdir -p $SETUP_PATH/db |
|
mkdir -p $SETUP_PATH/init |
|
|
|
cd $SETUP_PATH |
|
sudo tar -zxvf $SETUP_PATH/download/xp-panel.tar.gz -C $SETUP_PATH > /dev/null 2>&1 |
|
|
|
sudo chown -R root /xp/* |
|
sudo chmod -R 0777 /xp/* |
|
|
|
|
|
sudo chmod +x /xp/panel/app |
|
sudo chmod +x /xp/tasks/xp-tasks |
|
sudo chmod +x /xp/*.sh |
|
|
|
if [ ! -d "/etc/init.d" ];then |
|
mkdir -p /etc/init.d |
|
fi |
|
|
|
if [ -f "/etc/init.d/xpd" ]; then |
|
/etc/init.d/xpd stop |
|
sleep 1 |
|
fi |
|
|
|
|
|
run_user="www" |
|
www_user=$(cat /etc/passwd|cut -d ":" -f 1|grep ^www$) |
|
if [ "${www_user}" != "www" ];then |
|
groupadd ${run_user} |
|
useradd -s /sbin/nologin -g ${run_user} ${run_user} |
|
fi |
|
|
|
|
|
panel_port="6860" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
panel_user="1" |
|
if [ "$PANEL_USER" ];then |
|
panel_user="1" |
|
fi |
|
|
|
|
|
panel_pwd="1" |
|
if [ "$PANEL_PWD" ];then |
|
panel_pwd="1" |
|
fi |
|
sleep 1 |
|
panel_pwd_md5=$(echo -n $panel_pwd | md5sum | cut -d ' ' -f 1) |
|
|
|
|
|
if [ -z "$SAFE_ENTRY" ];then |
|
safe_entry="1" |
|
else |
|
safe_entry="1" |
|
fi |
|
|
|
|
|
sudo cp ${SETUP_PATH}/init/xpd /etc/init.d/xpd |
|
sudo chmod +x /etc/init.d/xpd |
|
|
|
|
|
sudo chmod 777 /xp/xp.sh |
|
if [ -f "/usr/bin/xp" ];then |
|
sudo rm -f /usr/bin/xp |
|
fi |
|
sudo ln -s /xp/xp.sh /usr/bin/xp |
|
|
|
|
|
Init_Tools |
|
|
|
Init_DB |
|
|
|
|
|
sudo touch /var/log/vsftpd.log |
|
sudo chmod 777 /var/log/vsftpd.log |
|
sudo touch /var/log/vsftpd_xfer.log |
|
sudo chmod 777 /var/log/vsftpd_xfer.log |
|
sudo setsid /usr/local/bin/vsftpd /etc/vsftpd.conf & |
|
} |
|
|
|
Get_IP_Info(){ |
|
IP_ADDR="" |
|
IP_ADDR=$(curl -sS --connect-timeout 10 -m 60 ${API_HOST}/api/myIP) |
|
|
|
LOCAL_IP=$(ip addr | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -E -v "^127\.|^255\.|^0\." | head -n 1) |
|
} |
|
|
|
Kill_Old_XP(){ |
|
sudo pkill -f /xp/panel/app |
|
sudo pkill -f /xp/tasks/xp-task |
|
} |
|
|
|
End(){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
echo -e "================================================================" |
|
echo -e " \033[32m小皮面板安装成功\033[0m" |
|
echo -e "=========================面板状态===============================" |
|
echo -e " ${Panel_Status}" |
|
echo -e " ${Task_Status}" |
|
echo -e "=========================面板账户信息===========================" |
|
echo -e "" |
|
echo -e " 面板版本: ${XP_VERSION}" |
|
echo -e " 外网面板地址: ${HTTP_STR}://${IP_ADDR}:${panel_port}/${safe_entry}" |
|
echo -e " 内网面板地址: ${HTTP_STR}://${LOCAL_IP}:${panel_port}/${safe_entry}" |
|
echo -e " username: ${panel_user}" |
|
echo -e " password: ${panel_pwd}" |
|
echo -e "" |
|
echo -e "=========================面板注意事项===========================" |
|
echo -e "" |
|
echo -e " 【云服务器】请在安全组放行 $panel_port 端口" |
|
echo -e " 面板工具命令: xp" |
|
echo -e "" |
|
echo -e "================================================================" |
|
end_time=`date +%s` |
|
((out_time=($end_time-$start_time))) |
|
echo -e "安装花费时间:\033[32m $out_time \033[0m秒" |
|
echo -e "安装日志路径:\033[32m $INSTALL_LOG_PATH \033[0m" |
|
|
|
echo -e "安装花费时间:\033[32m $out_time \033[0m秒" |
|
} |
|
|
|
Install_Tip(){ |
|
echo "+${STRIPE_LINE}${STRIPE_LINE}" |
|
echo "| xp-panel for CentOS/Ubuntu/Debian" |
|
echo "+${STRIPE_LINE}${STRIPE_LINE}" |
|
echo "| Copyright © 2015-2050 XP-SOFT(https://xp.cn) All rights reserved." |
|
echo "+${STRIPE_LINE}${STRIPE_LINE}" |
|
echo "| The WebPanel URL will be http://SERVER_IP:${PANEL_PORT} when installed." |
|
echo "+${STRIPE_LINE}${STRIPE_LINE}" |
|
echo "| 为了您的正常使用,请确保使用全新或纯净的系统安装小皮面板" |
|
echo "+${STRIPE_LINE}${STRIPE_LINE}" |
|
echo "| 安装后可能会影响您系统原有的防火墙、ftp、数据库、开发环境等" |
|
echo "+${STRIPE_LINE}${STRIPE_LINE}" |
|
echo "| 开始安装后将会停止系统正在运行的小皮面板,并覆盖之前面板的数据,请注意备份" |
|
echo "+${STRIPE_LINE}${STRIPE_LINE}" |
|
} |
|
|
|
Open_Log(){ |
|
touch $INSTALL_LOG_PATH |
|
exec 4>$INSTALL_LOG_PATH |
|
exec > >(tee >(cat >&4)) 2>&1 |
|
} |
|
|
|
Analysis_Log(){ |
|
exec 4>&- |
|
err_end=$(grep -n "请截图以上报错信息发给客服人员" $INSTALL_LOG_PATH | cut -d: -f1 | tail -n 1) |
|
if [ -n "$err_end" ]; then |
|
err_start=$(($err_end - 50)) |
|
if [ $err_start -lt 0 ]; then |
|
err_start=1 |
|
fi |
|
err=$(sed 's/\x1B\[[0-9;]*[JKmsu]//g' $INSTALL_LOG_PATH | sed -n "${err_start},${err_end}p" | tr '\n' ';') |
|
d='{"ver": "'${XP_VERSION}'", "err": "'${err}'","sysInfo": "'${SYS_INFO}'", "ip":"", "idc":"'${IDC_CODE}'"}' |
|
curl -s -X POST -H "Content-Type: application/json" -d "${d}" "${API_HOST}/api/installErr" 2>&1 >/dev/null |
|
fi |
|
|
|
err_end=$(grep -n "状态:未运行" $INSTALL_LOG_PATH | cut -d: -f1 | tail -n 1) |
|
if [ -n "$err_end" ]; then |
|
err_start=$(($err_end - 50)) |
|
if [ $err_start -lt 0 ]; then |
|
err_start=1 |
|
fi |
|
err=$(sed 's/\x1B\[[0-9;]*[JKmsu]//g' $INSTALL_LOG_PATH | sed -n "${err_start},${err_end}p" | tr '\n' ';') |
|
d='{"ver": "'${XP_VERSION}'", "err": "'${err}'","sysInfo": "'${SYS_INFO}'"}' |
|
curl -s -X POST -H "Content-Type: application/json" -d "${d}" "${API_HOST}/api/installErr" 2>&1 >/dev/null |
|
fi |
|
} |
|
|
|
Disable_Sudo_TTY(){ |
|
if [ -f "/etc/sudoers" ]; then |
|
tty_mode=$(grep '^Default.*requiretty' /etc/sudoers) |
|
if [ -n "$tty_mode" ]; then |
|
sed -i 's/^Default.*requiretty/#&/' /etc/sudoers |
|
fi |
|
fi |
|
} |
|
|
|
Select_DlNode(){ |
|
echo "select download node..." |
|
json_str=$(curl -s "${API_HOST}/api/dlNodes") |
|
if ! echo $json_str | grep -q '"ip":'; then |
|
echo "get download nodes failed, use default node" |
|
return |
|
fi |
|
ips=$(echo $json_str | grep -oP '"ip"\s*:\s*"\K[^"]+') |
|
min_delay_sec=5.0 |
|
fasted_ip="" |
|
for ip in $ips |
|
do |
|
delay_sec=$(timeout 5 curl -o /dev/null -s -w "%{time_total}" ${ip} || echo 999.0) |
|
comp_result=$(echo "${delay_sec} < ${min_delay_sec}" | awk '{print ($1 < $3) ? "1" : "0"}') |
|
if [ $comp_result -eq 1 ]; then |
|
min_delay_sec=$delay_sec |
|
fasted_ip=$ip |
|
fi |
|
done |
|
if [ -z "$fasted_ip" ]; then |
|
echo "test download nodes error, use default node" |
|
return |
|
fi |
|
|
|
if grep -q "dl.xp.cn" /etc/hosts; then |
|
sed -i "s/.*dl.xp.cn.*/${fasted_ip} dl.xp.cn/g" /etc/hosts |
|
else |
|
echo -e "\n${fasted_ip} dl.xp.cn\n" >> /etc/hosts |
|
fi |
|
echo "select fasted download node finish" |
|
} |
|
|
|
Set_Cent_Repo_Source() { |
|
distro=$(cat /etc/centos-release | awk '{print $1}') |
|
version=$(cat /etc/centos-release | awk '{print $4}' | cut -d '.' -f1) |
|
if [ "$distro" == "CentOS" ]; then |
|
echo "开始替换 CentOS 的源为阿里源..." |
|
if [ "$version" == "7" ]; then |
|
echo "正在替换为 CentOS 7 的阿里源..." |
|
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup |
|
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo |
|
sudo yum clean all && sudo yum makecache |
|
echo "替换完成!" |
|
elif [ "$version" == "8" ]; then |
|
echo "正在替换为 CentOS 8 的阿里源..." |
|
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup |
|
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo |
|
sudo yum clean all && sudo yum makecache |
|
echo "替换完成!" |
|
else |
|
echo "不支持替换阿里源的 CentOS 版本:$version" |
|
fi |
|
fi |
|
} |
|
|
|
Install_Main(){ |
|
Kill_Old_XP |
|
Env_Check |
|
Get_PM |
|
|
|
Auto_Swap_Mem |
|
|
|
Set_Cent_Repo_Source |
|
|
|
if [ "${PM}" = "yum" ]; then |
|
Install_RPM_Base_Pkg |
|
elif [ "${PM}" = "apt-get" ]; then |
|
Install_Deb_Base_Pkg |
|
fi |
|
|
|
Get_IP_Info |
|
|
|
Select_DlNode |
|
|
|
Down_XP |
|
Down_Deps sqlite3 vsftpd |
|
|
|
Open_Log |
|
|
|
Disable_Sudo_TTY |
|
|
|
Init_XP |
|
Add_Service |
|
End |
|
exit 0 |
|
Analysis_Log |
|
exit 0 |
|
} |
|
|
|
Install_Tip |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Install_Main |
|
echo -e "666666666666666666666666666666666666666666" |
|
exit 0 |
|
|
|
rm -f $SETUP_PATH/download/xp-panel.tar.gz |
|
|