#!/bin/bash ############################################################################## # Switch between Apache and LiteSpeed Web Server under control panel environment # # @author LiteSpeed Technologies, Inc. (https://www.litespeedtech.com) # @copyright (c) 2016-2023 ############################################################################## check_errs() { if [ "$1" -ne 0 ] ; then echo "[ERROR] ${2}" exit "$1" fi } display_usage() { cat </dev/null; then . "/etc/apache2/envvars" fi AP_PIDFILE="$APACHE_PID_FILE" fi } cp_stop_lsws() { if [ "$CP" = "WHM" ] ; then pkill wswatch.sh 2>/dev/null fi $LSWS_CTLCMD stop $AP_CTLCMD stop 1>/dev/null 2>&1 RETRY=30 LSPID=1 while [ $RETRY -gt 0 ] && [ $LSPID -ne 0 ] do ((RETRY--)) sleep 1 cp_detect_lsws_pid done if [ $LSPID -eq 0 ] ; then pkill -9 lshttpd pkill -9 litespeed echo "LiteSpeed Stopped." else echo "LiteSpeed is still running. Fail to stop within 30 secs." echo "Will use pkill command to stop" pkill -9 lshttpd pkill -9 litespeed sleep 1 cp_detect_lsws_pid if [ $LSPID -eq 0 ] ; then echo "LiteSpeed Stopped." else echo "LiteSpeed is still running. Fail to stop using kill command." fi fi } cp_detect_lsws_pid() { LSPID=0 if [ -f "$LSWS_PIDFILE" ] ; then FPID=$(cat "$LSWS_PIDFILE") if [ "x$FPID" != "x" ] ; then PL=$($PS_CMD | grep -w 'lshttpd\|litespeed' | grep -v grep | grep -w "$FPID") if [ "x$PL" != "x" ] ; then LSPID=$FPID fi fi fi } # # start LiteSpeed # cp_start_fake_apache() { $AP_CTLCMD start 2>&1 RETRY=30 LSPID=0 while [ $RETRY -gt 0 ] && [ $LSPID -eq 0 ] do ((RETRY--)) sleep 1 cp_detect_lsws_pid done } remove_bak_bak() { if [ -f "$1$2" ]; then mv "$1$2" "$1$2_restore_done" fi } cpanel_apache_wrapper_helper() { RESTORE=$1 NEED_PROTECT=$(/usr/local/cpanel/3rdparty/bin/perl -MCpanel::Config::Httpd::Perms -e'print Cpanel::Config::Httpd::Perms::webserver_runs_as_user();') if [ "$RESTORE" -eq 1 ] ; then # restore Apache binary Files if [ -f "/usr/local/apache/bin/${AP_PROC}_ls_bak" ] ; then mv -f "/usr/local/apache/bin/${AP_PROC}_ls_bak" "/usr/local/apache/bin/${AP_PROC}" elif [ -f "/usr/local/apache/bin/${AP_PROC}_ls_bak_bak" ] ; then cp -f "/usr/local/apache/bin/${AP_PROC}_ls_bak_bak" "/usr/local/apache/bin/${AP_PROC}" fi remove_bak_bak "/usr/local/apache/bin/${AP_PROC}" "_ls_bak_bak" if [ -f "/usr/sbin/${AP_PROC}_ls_bak" ] ; then mv -f "/usr/sbin/${AP_PROC}_ls_bak" "/usr/sbin/${AP_PROC}" elif [ -f "/usr/sbin/${AP_PROC}_ls_bak_bak" ] ; then cp -f "/usr/sbin/${AP_PROC}_ls_bak_bak" "/usr/sbin/${AP_PROC}" fi remove_bak_bak "/usr/sbin/${AP_PROC}" "_ls_bak_bak" if [ -f "/scripts/restartsrv_httpd_ls_bak" ] ; then mv -f "/scripts/restartsrv_httpd_ls_bak" "/scripts/restartsrv_httpd" elif [ -f "/scripts/restartsrv_httpd_ls_bak_bak" ] ; then cp -f "/scripts/restartsrv_httpd_ls_bak_bak" "/scripts/restartsrv_httpd" fi remove_bak_bak "/scripts/restartsrv_httpd" "_ls_bak_bak" if [ "$NEED_PROTECT" -eq 1 ] ; then /scripts/enablefileprotect echo "Added fileprotect for Apache" fi if [ ! -f "/etc/cpanel/ea4/paths.conf" ] || ! grep -q '[^[:space:]]' /etc/cpanel/ea4/paths.conf ; then if [ -f '/etc/cpanel/ea4/paths.conf_ls_bak' ]; then mv '/etc/cpanel/ea4/paths.conf_ls_bak' '/etc/cpanel/ea4/paths.conf' fi fi if [ -f "/etc/cpanel/ea4/paths.conf" ]; then sed -i -e 's#/usr/local/lsws/bin/lswsctrl#/usr/sbin/apachectl#' /etc/cpanel/ea4/paths.conf fi # restore rc file if [ "$SYSTEMDDIR" != "" ]; then if [ -e "${SYSTEMDDIR}/${AP_PROC}.service.ls_bak" ] ; then mv -f "${SYSTEMDDIR}/${AP_PROC}.service.ls_bak" "${SYSTEMDDIR}/${AP_PROC}.service" elif [ -e "${SYSTEMDDIR}/${AP_PROC}.service.ls_bak_bak" ] ; then cp -f "${SYSTEMDDIR}/${AP_PROC}.service.ls_bak_bak" "${SYSTEMDDIR}/${AP_PROC}.service" fi remove_bak_bak "${SYSTEMDDIR}/${AP_PROC}.service" ".ls_bak_bak" systemctl daemon-reload fi if [ "$INIT_DIR" != "" ]; then if [ -e "${INIT_DIR}/${AP_PROC}.ls_bak" ] ; then mv -f "${INIT_DIR}/${AP_PROC}.ls_bak" "${INIT_DIR}/${AP_PROC}" elif [ -e "${INIT_DIR}/${AP_PROC}.ls_bak_bak" ] ; then cp -f "${INIT_DIR}/${AP_PROC}.ls_bak_bak" "${INIT_DIR}/${AP_PROC}" fi remove_bak_bak "${INIT_DIR}/${AP_PROC}" ".ls_bak_bak" fi if [ -f "$LSWS_SWITCH_FLAG" ] ; then /bin/rm -f "$LSWS_SWITCH_FLAG" fi else if [ "$NEED_PROTECT" -eq 1 ] ; then /scripts/disablefileprotect echo "fileprotect removed, not needed by LiteSpeed" fi if [ ! -f "/etc/cpanel/ea4/paths.conf" ] || ! grep -q '[^[:space:]]' /etc/cpanel/ea4/paths.conf ; then if [ -f '/etc/cpanel/ea4/paths.conf_ls_bak' ]; then mv '/etc/cpanel/ea4/paths.conf_ls_bak' '/etc/cpanel/ea4/paths.conf' fi fi if [ -f "/etc/cpanel/ea4/paths.conf" ]; then sed -i -e 's#/usr/sbin/apachectl#/usr/local/lsws/bin/lswsctrl#' /etc/cpanel/ea4/paths.conf fi # add rc wrapper if [ "$SYSTEMDDIR" != "" ] ; then # copy the correct file again to avoid wrong data "${LSWSHOME}/admin/misc/rc-inst.sh" if [ ! -e "${SYSTEMDDIR}/${AP_PROC}.service.ls_bak" ] ; then mv -f "${SYSTEMDDIR}/${AP_PROC}.service" "${SYSTEMDDIR}/${AP_PROC}.service.ls_bak" fi ln -sf "${SYSTEMDDIR}/lshttpd.service" "${SYSTEMDDIR}/${AP_PROC}.service" systemctl daemon-reload fi if [ "$INIT_DIR" != "" ] ; then if [ ! -e "${INIT_DIR}/${AP_PROC}.ls_bak" ] ; then mv -f "${INIT_DIR}/${AP_PROC}" "${INIT_DIR}/${AP_PROC}.ls_bak" fi ln -sf ./lsws "${INIT_DIR}/${AP_PROC}" fi # set flag touch "$LSWS_SWITCH_FLAG" fi } plesk_apache_wrapper_helper() { RESTORE=$1 if [ "$RESTORE" -eq 1 ] ; then # restore Apache binary Files if [ -f "/usr/sbin/${AP_PROC}_ls_bak" ] ; then mv -f "/usr/sbin/${AP_PROC}_ls_bak" "/usr/sbin/${AP_PROC}" elif [ -f "/usr/sbin/${AP_PROC}_ls_bak_bak" ] ; then cp -f "/usr/sbin/${AP_PROC}_ls_bak_bak" "/usr/sbin/${AP_PROC}" fi remove_bak_bak "/usr/sbin/${AP_PROC}" "_ls_bak_bak" # restore rc file if [ "$SYSTEMDDIR" != "" ]; then if [ -e "${SYSTEMDDIR}/${AP_PROC}.service.ls_bak" ] ; then mv -f "${SYSTEMDDIR}/${AP_PROC}.service.ls_bak" "${SYSTEMDDIR}/${AP_PROC}.service" elif [ -e "${SYSTEMDDIR}/${AP_PROC}.service.ls_bak_bak" ] ; then cp -f "${SYSTEMDDIR}/${AP_PROC}.service.ls_bak_bak" "${SYSTEMDDIR}/${AP_PROC}.service" fi remove_bak_bak "${SYSTEMDDIR}/${AP_PROC}.service" ".ls_bak_bak" if [ -d "${SYSTEMDDIR}/lshttpd.service.d" ]; then mv -f "${SYSTEMDDIR}/lshttpd.service.d" "${SYSTEMDDIR}/${AP_PROC}.service.d" fi if [ -d "${SYSTEMDDIR}/${AP_PROC}.service.d.ls_bak" ]; then mv -f "${SYSTEMDDIR}/${AP_PROC}.service.d.ls_bak" "${SYSTEMDDIR}/${AP_PROC}.service.d" fi if [ -d "/etc/systemd/system/${AP_PROC}.service.d.ls_bak" ]; then mv -f "/etc/systemd/system/${AP_PROC}.service.d.ls_bak" "/etc/systemd/system/${AP_PROC}.service.d" fi systemctl daemon-reload systemctl disable lshttpd systemctl enable ${AP_PROC} fi if [ "$INIT_DIR" != "" ] ; then if [ -e "${INIT_DIR}/${AP_PROC}.ls_bak" ] ; then mv -f "${INIT_DIR}/${AP_PROC}.ls_bak" "${INIT_DIR}/${AP_PROC}" elif [ -e "${INIT_DIR}/${AP_PROC}.ls_bak_bak" ] ; then cp -f "${INIT_DIR}/${AP_PROC}.ls_bak_bak" "${INIT_DIR}/${AP_PROC}" fi remove_bak_bak "${INIT_DIR}/${AP_PROC}" ".ls_bak_bak" if [ "$SYSTEMDDIR" != "" ] ; then systemctl daemon-reload fi fi if [ -f "$LSWS_SWITCH_FLAG" ] ; then /bin/rm -f "$LSWS_SWITCH_FLAG" fi else # add rc wrapper if [ "$SYSTEMDDIR" != "" ] ; then if [ ! -e "${SYSTEMDDIR}/${AP_PROC}.service.ls_bak" ] ; then systemctl disable ${AP_PROC} systemctl enable lshttpd mv -f "${SYSTEMDDIR}/${AP_PROC}.service" "${SYSTEMDDIR}/${AP_PROC}.service.ls_bak" fi ln -sf "${SYSTEMDDIR}/lshttpd.service" "${SYSTEMDDIR}/${AP_PROC}.service" if [ -d "${SYSTEMDDIR}/${AP_PROC}.service.d" ]; then mv -f "${SYSTEMDDIR}/${AP_PROC}.service.d" "${SYSTEMDDIR}/${AP_PROC}.service.d.ls_bak" fi if [ -d "/etc/systemd/system/${AP_PROC}.service.d" ]; then mv -f "/etc/systemd/system/${AP_PROC}.service.d" "/etc/systemd/system/${AP_PROC}.service.d.ls_bak" fi systemctl daemon-reload fi if [ "$INIT_DIR" != "" ] ; then if [ ! -e "${INIT_DIR}/${AP_PROC}.ls_bak" ] ; then mv -f "${INIT_DIR}/${AP_PROC}" "${INIT_DIR}/${AP_PROC}.ls_bak" fi cp "${INIT_DIR}/lsws" "${INIT_DIR}/${AP_PROC}" #ln -sf ./lsws "${INIT_DIR}/${AP_PROC}" if [ "$SYSTEMDDIR" != "" ] ; then systemctl daemon-reload fi fi # set flag touch "$LSWS_SWITCH_FLAG" fi } cp_apache_wrapper() { RESTORE=$1 INIT_DIR="" for path in "/etc/init.d" "/etc/rc.d/init.d" do if [ "$INIT_DIR" = "" ] \ && { [ -e "${path}/${AP_PROC}" ] || [ -e "${path}/${AP_PROC}.ls_bak" ] ;} then INIT_DIR="$path" fi done # use systemd if possible, need to use same method as apache SYSTEMDDIR="" for path in "/usr/lib/systemd/system" "/lib/systemd/system" "/etc/systemd/system" do if [ "$SYSTEMDDIR" = "" ] \ && [ -d "$path" ] \ && [ -e "${path}/${AP_PROC}.service" ] ; then SYSTEMDDIR="$path" fi done if [ "$CP" = "WHM" ] ; then cpanel_apache_wrapper_helper "$RESTORE" elif [ "$CP" = "PSA" ] ; then plesk_apache_wrapper_helper "$RESTORE" fi } cp_detect_ap_pid() { APPID=0 FPID=$($PS_CMD | grep -w "${AP_PROC} \|${AP_PROC}$\|^${AP_PROC}$" \ | grep -v "lscgid\|litespeed\|lshttpd\|grep\|/usr/bin/logger" | grep -w "root" \ | awk '{print $2}') if [ "x$FPID" != "x" ] ; then APPID=$FPID fi } cp_stop_apache() { $AP_CTLCMD stop RETRY=30 APPID=1 while [ $RETRY -gt 0 ] && [ $APPID -ne 0 ] do ((RETRY--)) sleep 1 cp_detect_ap_pid done if [ $APPID -eq 0 ] ; then echo "Apache Stopped." else echo "Apache is still running. Fail to stop within 30 secs." echo "Will use pkill command to stop" pkill -9 $AP_PROC sleep 1 cp_detect_ap_pid if [ $APPID -eq 0 ] ; then echo "Apache Stopped." else echo "Apache is still running. Fail to stop using kill command." fi fi } cp_change_port_offset() { PORT_OFFSET=$1 if [ ! -f "$CONF" ] ; then check_errs 1 "${0}: invalid conf file directory!" fi /bin/cp -f "$CONF" "${CONF}.orig" sed -e "s/.*<\/apachePortOffset>/${PORT_OFFSET}<\/apachePortOffset>/" "${CONF}.orig" > "$CONF" check_errs $? "${0}: sed command error, please try to modify apache port offset manually from config file ${CONF}" /bin/rm -f "${CONF}.orig" } cp_SwitchToLiteSpeed() { cp_change_port_offset 0 cp_stop_apache if [ "$CP" = "WHM" ] ; then #sleep 8 pkill -9 httpd elif [ "$CP" = "PSA" ] ; then cp_detect_lsws_pid fi cp_apache_wrapper 0 if [ "$CP" = "WHM" ] ; then /usr/local/cpanel/bin/whmapi1 configureservice service=httpd enabled=1 monitored=1 fi cp_start_fake_apache if [ $LSPID -gt 0 ] ; then if [ "$CP" = "WHM" ] ; then pkill wswatch.sh 2>/dev/null cd /usr/local/lsws/logs nohup ../bin/wswatch.sh /dev/null 2>&1 & fi cp_msg_exit 0 "LiteSpeed started successfully." fi echo "LiteSpeed is not up within 30 secs, try again by removing /tmp/lshttpd/." pkill -9 lshttpd pkill -9 litespeed /bin/rm -rf "/tmp/lshttpd" cp_start_fake_apache # wrapper needs to run after lsws start if [ $LSPID -gt 0 ] ; then if [ "$CP" = "WHM" ] ; then pkill wswatch.sh 2>/dev/null cd /usr/local/lsws/logs nohup ../bin/wswatch.sh 2>/dev/null & fi cp_msg_exit 0 "LiteSpeed started successfully." else cp_apache_wrapper 1 check_errs 1 "LiteSpeed is not up within 60 secs, please check the error log and try again." fi } cp_SwitchToApache() { if [ "$CP" = "WHM" ] ; then pkill wswatch.sh 2>/dev/null fi cp_detect_lsws_pid if [ $LSPID -gt 0 ] ; then echo "LiteSpeed is running, stop it first." cp_stop_lsws if [ $LSPID -gt 0 ] ; then check_errs 1 "Abort." fi fi cp_detect_ap_pid if [ $APPID -gt 0 ] ; then if [ ! -f "$LSWS_SWITCH_FLAG" ] ; then return fi # if running, stop first cp_stop_apache fi # restore Apache Files, wrapper needs to run before Apache start cp_apache_wrapper 1 # wait 1 sec before start apache sleep 1 if [ "$CP" = "WHM" ] ; then /usr/local/cpanel/bin/whmapi1 configureservice service=httpd enabled=1 monitored=1 # # start Apache # # does not change the memory limits, does not work well. # $AP_CTLCMD start # # call a cPanel script /scripts/restartsrv_httpd elif [ "$CP" = "PSA" ] ; then $AP_CTLCMD start 2>&1 fi RETRY=30 APPID=0 while [ $RETRY -gt 0 ] && [ $APPID -eq 0 ] do cp_detect_ap_pid ((RETRY--)) sleep 1 done if [ $APPID -ne 0 ] ; then cp_msg_exit 0 "Apache started successfully." else check_errs 1 "Apache is not up within 30 secs. Please check the log file." fi } switch_cp() { if [ "x$1" = "xapache" ] ; then cp_SwitchToApache cp_SetRunOnBoot elif [ "x$1" = "xlsws" ] ; then cp_SwitchToLiteSpeed cp_SetRunOnBoot fi } switch_da() { cd ${DA_DIR} pmod1=$(grep "php1_mode" /usr/local/directadmin/custombuild/options.conf | cut -d = -f 2 | xargs) pmod2=$(grep "php2_mode" /usr/local/directadmin/custombuild/options.conf | cut -d = -f 2 | xargs) pmod3=$(grep "php3_mode" /usr/local/directadmin/custombuild/options.conf | cut -d = -f 2 | xargs) pmod4=$(grep "php4_mode" /usr/local/directadmin/custombuild/options.conf | cut -d = -f 2 | xargs) if [ "x$1" = "xapache" ] ; then pkill wswatch.sh ./build set webserver apache OS_NAME=$(awk '{print $1}' < /etc/redhat-release) if [ "${OS_NAME}" == 'CloudLinux' ] ; then ./build set php1_mode lsphp ./build set php2_mode lsphp ./build set php3_mode lsphp ./build set php4_mode lsphp else ./build set php1_mode php-fpm ./build set php2_mode php-fpm ./build set php3_mode php-fpm ./build set php4_mode php-fpm fi ./build set mod_ruid2 no ./build apache else ./build set webserver litespeed if [ "x$pmod1" != "xlsphp" ] ; then ./build set php1_mode lsphp if [ "x$pmod2" != "xlsphp" ] ; then ./build set php2_mode lsphp fi if [ "x$pmod3" != "xlsphp" ] ; then ./build set php3_mode lsphp fi if [ "x$pmod4" != "xlsphp" ] ; then ./build set php4_mode lsphp fi fi ./build litespeed fi } switch_cwp() { if [ "x$1" = "xapache" ] ; then pkill wswatch.sh stop_running_ws echo "Starting Apache..." if [ -e "/usr/local/apache/bin/httpd_ls_bak" ] ; then mv /usr/local/apache/bin/httpd_ls_bak /usr/local/apache/bin/httpd fi service_manager "start" "httpd" echo "Apache has been started successfully." elif [ "x$1" = "xlsws" ] ; then stop_running_ws echo "Starting LiteSpeed Enterprise..." service_manager "start" "lsws" echo "LiteSpeed Enterprise has been started successfully." fi } service_manager() { if [ -d "/etc/systemd" ] ; then systemctl "$1" "$2" > /dev/null 2>&1 else service "$2" "$1" > /dev/null 2>&1 fi } stop_running_ws() { local AP_PIDFILE=/usr/local/apache/logs/httpd.pid local LSWS_PIDFILE=/tmp/lshttpd/lshttpd.pid if [ -e "$AP_PIDFILE" ] ; then local AP_PID AP_PID=$(cat $AP_PIDFILE) fi if [ -e "$LSWS_PIDFILE" ] ; then local LSWS_PID LSWS_PID=$(cat $LSWS_PIDFILE) fi if [ -e "$LSWS_PIDFILE" ] && [ "$(ps -ef | grep -w 'lshttpd\|litespeed' | grep -v grep | grep -w "$LSWS_PID")" != "" ] || [ "$(ps -ef | grep -w 'lshttpd\|litespeed' | grep -v grep)" != "" ] ; then echo "Stopping LiteSpeed Enterprise..." service_manager "stop" "lsws" sleep 1 RETRY=30 CHECK=$(ps -ef | grep -w 'lshttpd\|litespeed' | grep -v grep) while [ "$RETRY" -gt 0 ] && [ "$CHECK" != "" ] ; do RETRY=$((RETRY-1)) sleep 1 CHECK=$(ps -ef | grep -w 'lshttpd\|litespeed' | grep -v grep) done pkill -9 lsphp > /dev/null 2>&1 if [ "$CHECK" != "" ] ; then pkill -9 litespeed > /dev/null 2>&1 pkill -9 lshttpd > /dev/null 2>&1 pkill -9 lscgid > /dev/null 2>&1 sleep 1 fi if [ "$(ps -ef | grep -w 'lshttpd\|litespeed' | grep -v grep)" != "" ] ; then echo "LiteSpeed Enterprise could not be stopped." exit 1 else echo "LiteSpeed Enterprise has been stopped successfully." fi fi if [ -e "$AP_PIDFILE" ] && [ "$(ps -ef | grep -w "$AP_PID" | grep httpd | grep -v grep | grep -v lscgid)" != "" ] || [ "$(ps -ef | grep httpd | grep -v grep | grep -v lscgid)" != "" ] ; then echo "Stopping Apache..." service_manager "stop" "httpd" sleep 1 RETRY=30 CHECK=$(ps -ef | grep httpd | grep -v grep | grep -v lscgid) while [ "$RETRY" -gt 0 ] && [ "$CHECK" != "" ] ; do ((RETRY--)) sleep 1 CHECK=$(ps -ef | grep httpd | grep -v grep | grep -v lscgid) done if [ "$CHECK" != "" ] ; then pkill -9 httpd > /dev/null 2>&1 sleep 1 fi if [ "$(ps -ef | grep httpd | grep -v grep | grep -v lscgid)" != "" ] ; then echo "Apache could not be stopped." exit 1 else echo "Apache killed successfully." fi fi } INST_USER=$(id) INST_UID=$(expr "$INST_USER" : 'uid=\(.*\)(.*) gid=.*') INST_USER=$(expr "$INST_USER" : 'uid=.*(\(.*\)) gid=.*') if [ "$INST_UID" -ne 0 ]; then check_errs 1 "Only root user can switch web server!" fi if [ $# -ne 1 ] ; then echo "Illegal parameters = $# !" display_usage fi # set LSWSHOME cd "$(dirname "$0")" CURDIR=$(pwd) LSWSHOME=$(dirname "$(dirname "$CURDIR")") if [ "x$1" != "xapache" ] && [ "x$1" != "xlsws" ] ; then display_usage fi detect_control_panel if [ "$CP" = "WHM" ] || [ "$CP" = "PSA" ] ; then switch_cp "$1" elif [ "$CP" = "DA" ] ; then switch_da "$1" elif [ "$CP" = "CWP" ] ; then switch_cwp "$1" fi