#!/bin/bash # chkconfig: 2345 55 25 # description: bt Cloud Service ### BEGIN INIT INFO # Provides: bt # Required-Start: $all # Required-Stop: $all # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts bt # Description: starts the bt ### END INIT INFO panel_init(){ panel_path=/www/server/panel pidfile=$panel_path/logs/panel.pid cd $panel_path env_path=$panel_path/pyenv/bin/python3 if [ -f $env_path ];then pythonV=$panel_path/pyenv/bin/python3 chmod -R 700 $panel_path/pyenv/bin &> /dev/null else pythonV=/usr/bin/python fi reg="^#\!$pythonV\$" is_sed=$(cat $panel_path/BT-Panel|head -n 1|grep -E $reg) if [ "${is_sed}" = "" ];then sed -i "s@^#!.*@#!$pythonV@" $panel_path/BT-Panel &> /dev/null fi is_python=$(cat $panel_path/BT-Task|grep import) if [ "${is_python}" != "" ];then is_sed=$(cat $panel_path/BT-Task|head -n 1|grep -E $reg) if [ "${is_sed}" = "" ];then sed -i "s@^#!.*@#!$pythonV@" $panel_path/BT-Task &> /dev/null fi fi chmod 700 $panel_path/BT-Panel &> /dev/null chmod 700 $panel_path/BT-Task &> /dev/null log_file=$panel_path/logs/error.log task_log_file=$panel_path/logs/task.log if [ -f $panel_path/data/ssl.pl ];then log_file=/dev/null fi port=$(cat $panel_path/data/port.pl) } panel_init get_panel_pids(){ isStart=$(ps aux|grep -E '(runserver|BT-Panel)'|grep -v grep|awk '{print $2}'|xargs) pids=$isStart arr=$isStart } get_task_pids(){ isStart=$(ps aux|grep -E '(task.py|BT-Task)'|grep -v grep|awk '{print $2}'|xargs) pids=$isStart arr=$isStart } panel_start() { isStart=`ps aux|grep 'runserver:app'|grep -v grep|awk '{print $2}'` if [ "$isStart" != '' ];then kill -9 $isStart fi get_panel_pids if [ -f $panel_path/script/init_db.py ]; then $pythonV $panel_path/script/init_db.py init_db # 初始化面板数据库 $pythonV $panel_path/tools.py check_db # 检查面板数据库,默认数据 fi if [ "$isStart" == '' ];then rm -f $pidfile &> /dev/null echo -e "Starting Bt-Panel...\c" echo '\n' >> $log_file if [ $? -ne 0 ];then $panel_path/BT-Panel > /dev/null 2>&1 else $panel_path/BT-Panel >> $log_file 2>&1 fi isStart="" n=0 while [[ "$isStart" == "" ]]; do echo -e ".\c" sleep 0.5 get_panel_pids let n+=1 if [ $n -gt 8 ];then break; fi done if [ "$isStart" == '' ];then panel_port_check echo -e "\033[31mfailed\033[0m" echo '------------------------------------------------------' tail -n 20 $log_file echo '------------------------------------------------------' echo -e "\033[31mError: BT-Panel service startup failed.\033[0m" fi echo -e " \033[32mdone\033[0m" else echo "Starting Bt-Panel... Bt-Panel (pid $(echo $isStart)) already running" fi get_task_pids if [ "$isStart" == '' ];then echo -e "Starting Bt-Tasks... \c" echo '\n' >> $task_log_file if [ $? -ne 0 ];then $panel_path/BT-Task > /dev/null 2>&1 else $panel_path/BT-Task >> $task_log_file 2>&1 fi sleep 0.2 get_task_pids if [ "$isStart" == '' ];then echo -e "\033[31mfailed\033[0m" echo '------------------------------------------------------' tail -n 20 $task_log_file echo '------------------------------------------------------' echo -e "\033[31mError: BT-Task service startup failed.\033[0m" return; fi echo -e " \033[32mdone\033[0m" else echo "Starting Bt-Tasks... Bt-Tasks (pid $isStart) already running" fi if [[ -f ${panel_path}/data/panel_ssl_error.pl ]]; then port=$(cat $panel_path/data/port.pl) password=$(cat $panel_path/default.pl) if [ -f $panel_path/data/domain.conf ];then address=$(cat $panel_path/data/domain.conf) fi auth_path=/login if [ -f $panel_path/data/admin_path.pl ];then auth_path=$(cat $panel_path/data/admin_path.pl) fi if [ "$address" = "" ];then address=$(curl -sS --connect-timeout 10 -m 60 https://www.bt.cn/Api/getIpAddress) fi if [ "$auth_path" == "/" ];then auth_path=/login fi 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) echo "" echo -e "==================================================================" echo -e "\033[32m您的面板SSL证书似乎出现了问题,已为您临时关闭面板HTTPS访问\033[0m" echo -e "\033[32m请使用如下地址访问宝塔面板,随后到面板设置中重新开启面板SSL证书即可!\033[0m" echo -e "==================================================================" echo "外网面板地址: http://${address}:${port}${auth_path}" echo "内网面板地址: http://${LOCAL_IP}:${port}${auth_path}" echo -e `$pythonV $panel_path/tools.py username` echo -e "password: $password" echo -e "\033[33mWarning:\033[0m" echo -e "\033[33mIf you cannot access the panel, \033[0m" echo -e "\033[33mrelease the following port (8888|888|80|443|20|21) in the security group\033[0m" echo -e "\033[33m注意:初始密码仅在首次登录面板前能正确获取,其它时间请通过 bt 5 命令修改密码\033[0m" echo -e "==================================================================" echo -e "==================================================================" echo "" rm -rf ${panel_path}/data/panel_ssl_error.pl fi } panel_port_check() { is_process=$(lsof -n -P -i:$port -sTCP:LISTEN|grep LISTEN|grep -v grep|awk '{print $1}'|sort|uniq|xargs) for pn in ${is_process[@]} do if [ "$pn" = "nginx" ];then /etc/init.d/nginx restart fi if [ "$pn" = "httpd" ];then /etc/init.d/httpd restart fi if [ "$pn" = "mysqld" ];then /etc/init.d/mysqld restart fi if [ "$pn" = "superviso" ];then pkill -9 superviso sleep 0.2 supervisord -c /etc/supervisor/supervisord.conf fi if [ "$pn" = "pure-ftpd" ];then /etc/init.d/pure-ftpd restart fi if [ "$pn" = "memcached" ];then /etc/init.d/memcached restart fi if [ "$pn" = "sudo" ];then if [ -f /etc/init.d/redis ];then /etc/init.d/redis restart fi fi if [ "$pn" = "php-fpm" ];then php_v=(52 53 54 55 56 70 71 72 73 74); for pv in ${php_v[@]}; do if [ -f /etc/init.d/php-fpm-${pv} ];then if [ -f /www/server/php/%{pv}/sbin/php-fpm ];then if [ -f /tmp/php-cgi-${pv}.sock ];then /etc/init.d/php-fpm-${pv} start fi /etc/init.d/php-fpm-${pv} restart fi fi done fi done is_ports=$(lsof -n -P -i:$port|grep LISTEN|grep -v grep|awk '{print $2}'|xargs) if [ "$is_ports" != '' ];then kill -9 $is_ports sleep 1 fi } panel_stop() { echo -e "Stopping Bt-Tasks...\c"; get_task_pids arr=($pids) for p in ${arr[@]} do kill -9 $p done echo -e " \033[32mdone\033[0m" echo -e "Stopping Bt-Panel...\c"; get_panel_pids for p in ${arr[@]} do kill -9 $p &>/dev/null done if [ -f $pidfile ];then rm -f $pidfile &> /dev/null fi echo -e " \033[32mdone\033[0m" } panel_status() { port=$(cat $panel_path/data/port.pl) get_panel_pids if [ "$isStart" != '' ];then echo -e "\033[32mBt-Panel (pid $(echo $isStart)) already running\033[0m" else echo -e "\033[31mBt-Panel not running\033[0m" fi get_task_pids if [ "$isStart" != '' ];then echo -e "\033[32mBt-Task (pid $isStart) already running\033[0m" else echo -e "\033[31mBt-Task not running\033[0m" fi } panel_reload() { isStart=$(ps aux|grep 'runserver:app'|grep -v grep|awk '{print $2}') if [ "$isStart" != '' ];then kill -9 $isStart sleep 0.5 fi get_panel_pids if [ "$isStart" != '' ];then get_panel_pids for p in ${arr[@]} do kill -9 $p done rm -f $pidfile echo -e "Reload Bt-Panel.\c"; nohup $panel_path/BT-Panel >> $log_file 2>&1 & isStart="" n=0 while [[ "$isStart" == "" ]]; do echo -e ".\c" sleep 0.5 get_panel_pids let n+=1 if [ $n -gt 8 ];then break; fi done if [ "$isStart" == '' ];then panel_port_check echo -e "\033[31mfailed\033[0m" echo '------------------------------------------------------' tail -n 20 $log_file echo '------------------------------------------------------' echo -e "\033[31mError: BT-Panel service startup failed.\033[0m" return; fi echo -e " \033[32mdone\033[0m" else echo -e "\033[31mBt-Panel not running\033[0m" panel_start fi } install_used() { if [ -f $panel_path/aliyun.pl ];then password=$(cat /dev/urandom | head -n 16 | md5sum | head -c 12) username=$($pythonV $panel_path/tools.py panel $password) echo "$password" > $panel_path/default.pl rm -f $panel_path/aliyun.pl chattr +i $panel_path/default.pl fi if [ -f $panel_path/php_mysql_auto.pl ];then bash $panel_path/script/mysql_auto.sh &> /dev/null bash $panel_path/script/php_auto.sh &> /dev/null rm -f $panel_path/php_mysql_auto.pl fi pip_file=/www/server/panel/pyenv/bin/pip3 python_file=/www/server/panel/pyenv/bin/python3 if [ -f $pip_file ];then is_rep=$(ls -l /usr/bin/btpip|grep pip3.) if [ "${is_rep}" != "" ];then rm -f /usr/bin/btpip /usr/bin/btpython ln -sf $pip_file /usr/bin/btpip ln -sf $python_file /usr/bin/btpython fi fi } error_logs() { tail -n 100 $log_file } case "$1" in 'start') install_used panel_start ;; 'stop') panel_stop ;; 'restart') panel_stop sleep 1 panel_start ;; 'reload') panel_reload ;; 'status') panel_status ;; 'logs') error_logs ;; 'panel') $pythonV $panel_path/tools.py cli $2 ;; 'default') port=$(cat $panel_path/data/port.pl) password=$(cat $panel_path/default.pl) if [ -f $panel_path/data/domain.conf ];then address=$(cat $panel_path/data/domain.conf) fi auth_path=/login if [ -f $panel_path/data/admin_path.pl ];then auth_path=$(cat $panel_path/data/admin_path.pl) fi if [ "$address" = "" ];then address=$(curl -sS --connect-timeout 10 -m 60 https://www.bt.cn/Api/getIpAddress) fi pool=http if [ -f $panel_path/data/ssl.pl ];then pool=https fi if [ "$auth_path" == "/" ];then auth_path=/login fi 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) echo -e "==================================================================" echo -e "\033[32mBT-Panel default info!\033[0m" echo -e "==================================================================" echo "外网面板地址: $pool://${address}:${port}${auth_path}" echo "内网面板地址: $pool://${LOCAL_IP}:${port}${auth_path}" echo -e `$pythonV $panel_path/tools.py username` echo -e "password: $password" echo -e "\033[33mWarning:\033[0m" echo -e "\033[33mIf you cannot access the panel, \033[0m" echo -e "\033[33mrelease the following port (8888|888|80|443|20|21) in the security group\033[0m" echo -e "\033[33m注意:初始密码仅在首次登录面板前能正确获取,其它时间请通过 bt 5 命令修改密码\033[0m" echo -e "==================================================================" ;; *) if [ "${LANG}" != "en_US.UTF-8" ];then export LANG=en_US.UTF-8 &> /dev/null fi if [ "${LC_ALL}" != "en_US.UTF-8" ];then export LC_ALL=en_US.UTF-8 &> /dev/null fi $pythonV $panel_path/tools.py cli $1 ;; esac