????

Your IP : 52.15.91.151


Current Path : /usr/src/lsws/lsws-6.1.2/admin/misc/
Upload File :
Current File : //usr/src/lsws/lsws-6.1.2/admin/misc/lscmctl

#!/bin/sh

# /********************************************
# LiteSpeed Cache Management Script
#
# @author LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
# @copyright (c) 2017-2021
# *********************************************/

VERSION='1.11.2'
OS=$(uname -s)
SCRIPT_DIR=$(cd "$(dirname "${0}")" && pwd)

cd "${SCRIPT_DIR}" || { echo "Unable to cd to script dir ${SCRIPT_DIR}"; exit 1; }

LSWS_DIR=$(cd "${SCRIPT_DIR}/../.." && pwd)
PHP_SCRIPT="${LSWS_DIR}/add-ons/webcachemgr/bootstrap_cli.php"
SHARED_API_VERSION_FILE="${LSWS_DIR}/add-ons/webcachemgr/VERSION"
SHARED_API_MIN_VER_FILE="${LSWS_DIR}/add-ons/webcachemgr/MIN_VER"

YELLOW='\e[33m'
CYAN='\e[36m'
GREEN='\e[32m'
L_GRAY='\e[37m'
END_COLOR='\e[0m'

printHeader()
{
    # $1 title , $2 descr
	printf "\n${YELLOW}%s${END_COLOR}\n%s\n" "${1}" "${2}"
}

printLabelDesc()
{
	printf "\n${YELLOW}%s${END_COLOR} %s\n\n" "${1}" "${2}"
}

printCmdOption()
{
    printf "${CYAN}%s${END_COLOR} ${GREEN}%s${END_COLOR}\n" "${1}" "${2}"
    printf "    %s\n\n" "${3}" | fold -sw 80
}

printExample()
{
	printf "  ${L_GRAY}%s:${END_COLOR}\n" "${1}"
	printf "  ./lscmctl %s\n\n" "${2}"
}

printHelp()
{
	printHeader "LiteSpeed Cache Manager CLI Tool v${VERSION}"
	printLabelDesc 'Usage:' './lscmctl [-php path/to/php] command [flag/parameter]'
	printLabelDesc 'Possible Commands:'
    # shellcheck disable=SC2016
    printCmdOption 'setcacheroot' '[-svr <cache root>] [-vh <cache root>]' 'List/Set server and/or virtual host cache roots. This command will list the current server and virtual host cache roots when no additional input is given. Use -svr and -vh to set those cache roots. The '"'"'$'"'"' character is not allowed when setting virtual host cache root. Virtual host cache root values starting with a '"'"'/'"'"' will automatically have '"'"'/$vh_user'"'"' appended to the end (this format was chosen to maintain compatibility with CageFS).'
    printCmdOption 'setversion' '[{--list | --latest | <version>}]' 'List/Set active LSCWP version. This command will list the currently active version when no additional input is given. Use --list to show available versions or --latest to switch to the latest available version. A valid version number can also be provided to switch to that version specifically. This must be set before performing other lscmctl operations.'
	printCmdOption 'scan' '[-n] [-e]' 'Scan for all WordPress installations. This command will create an lscm.data file under the "lsws/admin/lscdata" directory. Add the -n flag to only discover new installations. By adding the -e flag, LSC-WP will be enabled on all installations after scanning is complete.'
	printCmdOption 'enable' '{-m | <wp path>}' 'Enables LSWCP for all discovered WordPress installations with the -m parameter or a single installation by providing the path to the WordPress installation directory.'
	printCmdOption 'disable' '{-m | <wp path>}' 'Disables LSWCP for all discovered WordPress installations with the -m parameter or a single installation by providing the path to the WordPress installation directory.'
    printCmdOption 'upgrade' '{-m | <wp path>}' 'Upgrade LSWCP for all discovered WordPress installations to the current active version with the -m parameter or a single installation by providing the path to the WordPress installation directory.'
    printCmdOption 'flag' '<wp path>' 'Flag a single WordPress installation. Flagged installations will be skipped during mass operations.'
    printCmdOption 'unflag' '{-m | <wp path>}' 'Unflag all discovered WordPress installations with the -m parameter or a single installation by providing the path to the WordPress installation directory. Flagged installations will be skipped during mass operations.'
    printCmdOption 'status' '<wp path>' 'Get the most up to date LSC-WP status for the provided WordPress installation.'
    printCmdOption 'dashnotify' '{-m | -wppath <wp path>} [-plugin <plugin slug>] {-msgfile <message file path> | -msg <message>}' 'Notify all discovered WordPress installations with the provided message (plain text or HTML) using the Dash Notifier WordPress plugin with the -m parameter or a single installation by providing the path to the WordPress installation directory. A plugin slug can be included to have an install/activate button for that plugin added to the message as well. Installations containing a '"'"'.dash_notifier_bypass'"'"' file will not be notified.'
	printCmdOption 'dashnotifyremove' '{-m | <wp path>}' 'Remove Dash Notifier plugin (and notification messages) from all discovered WordPress installations with the -m parameter or a single installation by providing the path to the WordPress installation directory.'
    printCmdOption 'cpanelplugin' '{--install | --uninstall | -autoinstall [{0 | 1}] | --fixconf}' '[cPanel/WHM Environment Only] Install or uninstall the LiteSpeed user-end plugin for cPanel for all cPanel accounts using the '"'"'--install'"'"' and '"'"'--uninstall'"'"' input flags. The plugin will appear as "LiteSpeed Web Cache Manager" under '"'"'Advanced'"'"' in the user'"'"'s cPanel dashboard. The '"'"'-autoinstall'"'"' input param can be used to check the current auto install status. When turned on, the cPanel plugin will be automatically installed when installing/updating the WHM plugin. Use '"'"'-autoinstall {0 | 1}'"'"' to manually turn this off and on respectively. The '"'"'--fixConf'"'"' input param can be used to re-populate the cPanel plugin'"'"'s configuration file values in case of an issue.'
    printCmdOption 'addinstalls' '{-wpinstall <wp path> <docroot> <server name> <site url>} | -wpinstallsfile <installs file path>}' 'Add a WordPress installation to existing scan data. This "custom" data will be stored in it'"'"'s own lscm.data.cust data file under the "lsws/admin/lscdata" directory. A single installation can be added using the -wpinstall parameter with space separated list of installation info in the required order (<wp path> <docroot> <server name> <site url>). Multiple installations can be added at once using the -wpinstallsfile parameter to provide the path to an installs file containing a newline separated list of installation info in the expected format.'
    printCmdOption '--update-lib' '' 'Update the lscmctl script and the required shared library to their latest versions only if the currently installed versions are no longer supported.'
    printCmdOption '--force-update-lib' '' 'Force update the lscmctl script and the required shared library to their latest versions. It is not recommended that this command be included in any cron jobs, use command '"'"'--update-lib'"'"' instead.'
    printHeader "Example Usage:"
    printExample 'List server and virtual host cache roots' 'setcacheroot'
    printExample 'Set virtual host cache root' 'setcacheroot -vh /path/to/ssd/lscache'
    printExample 'Display currently active LSCWP version' 'setversion'
    printExample 'Display selectable LSCWP versions' 'setversion --list'
    printExample 'Set active LSCWP version to latest available' 'setversion --latest'
    printExample 'Set active LSCWP version to v1.5' 'setversion 1.5'
	printExample 'Discover all installations' 'scan'
    printExample 'Discover new installations only, passing in path to PHP binary' '-php /path/to/php/ scan -n'
	printExample 'Enable LSC-WP on all discovered installations' 'enable -m'
	printExample 'Disable LSC-WP for a single installation' 'disable /home/user/public_html/wp'
    printExample 'Get LSC-WP status for a single installation' 'status /home/user/public_html/wp'
    printExample 'Send a simple dashboard message to a single discovered WordPress installation' 'dashnotify -wppath /path/to/wp/install -msg "Hello World!"'
    printExample 'Broadcast a dashboard message recommending the LiteSpeed Cache for WordPress plugin to all discovered WordPress installations' 'dashnotify -m -plugin litespeed-cache -msgfile /path/to/msg/file'
    printExample 'Remove dashboard notifications (and Dash Notifier plugin) from all discovered WordPress installations' 'dashnotifyremove -m'
    printExample '[cPanel/WHM Environment Only] Install the LiteSpeed user-end plugin for cPanel for all cPanel accounts' 'cpanelplugin --install'
    printExample '[cPanel/WHM Environment Only] Turn off auto install for the LiteSpeed user-end plugin for cPanel' 'cpanelplugin -autoinstall 0'
    printExample 'Add a single WordPress Installations to custom data file.' 'addinstalls -wpinstall /home/user/public_html/wp /home/user/public_html user.com user.com/wp'
    printExample 'Add multiple WordPress Installations to custom data file using an installs file.' 'addinstalls -wpinstallsfile /path/to/installs/file'
}

updateMinAPIVerFile()
{
    MIN_VER=$(wget -q https://www.litespeed.sh/sub/shared/MIN_VER -O -)
    RET=$?

    if [ "$RET" != "0" ] ; then
        errorExit "Failed to download latest MIN_VER file with wget exit status ${RET}."
    fi

    echo "${MIN_VER}" > "${SHARED_API_MIN_VER_FILE}"
}

apiNeedsUpdate()
{
    UPDATE_MIN_VER=1

    if [ -f "${SHARED_API_VERSION_FILE}" ] ; then
        test "$(find "${SHARED_API_VERSION_FILE}" -mmin -1440)"

        # shellcheck disable=SC2181
        if [ "${?}" = "0" ] ; then
            UPDATE_MIN_VER=0
        fi
    fi

    if [ ! -f "${SHARED_API_MIN_VER_FILE}" ] || [ $UPDATE_MIN_VER ] ; then
        updateMinAPIVerFile
    fi

    CURR_VER=$(cat "${SHARED_API_VERSION_FILE}")
    MIN_VER=$(cat "${SHARED_API_MIN_VER_FILE}")

    CURR_MAJOR=$(echo "${CURR_VER}" | awk -F"." '{print $1}')
    MIN_MAJOR=$(echo "${MIN_VER}" | awk -F"." '{print $1}')

    if [ "${CURR_MAJOR}" -lt "${MIN_MAJOR}" ] ; then
        return 0
    elif [ "${CURR_MAJOR}" -gt "${MIN_MAJOR}" ] ; then
        return 1
    fi

    CURR_MINOR=$(echo "${CURR_VER}" | awk -F"." '{print $2}')
    MIN_MINOR=$(echo "${MIN_VER}" | awk -F"." '{print $2}')

    if [ "${CURR_MINOR}" -lt "${MIN_MINOR}" ] ; then
        return 0
    elif [ "${CURR_MINOR}" -gt "${MIN_MINOR}" ] ; then
        return 1
    fi

    CURR_IMPROVEMENT=$(echo "${CURR_VER}" | awk -F"." '{print match($3, /[^ ]/) ? $3 : 0}')
    MIN_IMPROVEMENT=$(echo "${MIN_VER}" | awk -F"." '{print match($3, /[^ ]/) ? $3 : 0}')

    if [ "${CURR_IMPROVEMENT}" -lt "${MIN_IMPROVEMENT}" ] ; then
        return 0
    elif [ "${CURR_IMPROVEMENT}" -gt "${MIN_IMPROVEMENT}" ] ; then
        return 1
    fi

    CURR_PATCH=$(echo "${CURR_VER}" | awk -F"." '{print match($4, /[^ ]/) ? $4 : 0}')
    MIN_PATCH=$(echo "${MIN_VER}" | awk -F"." '{print match($4, /[^ ]/) ? $4 : 0}')

    if [ "${CURR_PATCH}" -lt "${MIN_PATCH}" ] ; then
        return 0
    elif [ "${CURR_PATCH}" -gt "${MIN_PATCH}" ] ; then
        return 1
    fi

    return 1
}

enforceMinAPIVer()
{
    if apiNeedsUpdate ; then
        echo "Automatically updating lscmctl script and required shared library"
        runUpdate
    fi
}

runUpdate()
{

    if [ "${1}" = "--update-lib" ] && ! apiNeedsUpdate ; then
        echo "Shared code library already meets minimum API version requirements."
        echo "Done!"
        return
    fi

    ADDONS_DIR=$(cd "${LSWS_DIR}/add-ons" && pwd)
    LOCAL_TAR_FILE="${ADDONS_DIR}/shared_latest.tar.gz"
    URL="https://shared.litespeed.sh/latest"

    echo "Downloading latest shared code tar file..."
    wget -q --tries=1 --no-check-certificate "${URL}" -O "${LOCAL_TAR_FILE}"

    RET=$?

    if [ "${RET}" != "0" ] ; then

        if [ -f "${LOCAL_TAR_FILE}" ] ; then
            /bin/rm -f "${LOCAL_TAR_FILE}"
        fi

        errorExit "Failed to download latest shared code with wget exit status ${RET}."
    fi

    MD5_VALUE=$(wget -q https://shared.litespeed.sh/latest/md5 -O -)

    if [ "${MD5_VALUE}" = "" ] ; then
        /bin/rm -f "${LOCAL_TAR_FILE}"
        errorExit "Failed to wget latest shared code md5 value."
    fi

    if [ "x${OS}" = "xFreeBSD" ] ; then
        LOCAL_MD5_VAL=$(md5 "${LOCAL_TAR_FILE}" | awk '{ print $4 }')
    else
        LOCAL_MD5_VAL=$(md5sum "${LOCAL_TAR_FILE}" | awk '{ print $1 }')
    fi

    echo "Checking tar file md5..."

    if [ "${MD5_VALUE}" != "${LOCAL_MD5_VAL}" ] ; then
        /bin/rm -f "${LOCAL_TAR_FILE}"
        errorExit "Md5 mismatch for shared code! Aborting."
    fi

    SHARED_CODE_DIR="${ADDONS_DIR}/webcachemgr"

    if [ -d "${SHARED_CODE_DIR}" ] ; then
        echo "Removing existing shared code directory..."
        /bin/rm -rf "${SHARED_CODE_DIR}"
    fi

    echo "Extracting downloaded shared code..."
    tar -xzf "${LOCAL_TAR_FILE}" -C "${ADDONS_DIR}"

    RET=$?

    if [ "${RET}" != "0" ] ; then
        /bin/rm -f "${LOCAL_TAR_FILE}"
        errorExit "Failed to extract tar.gz file with tar exit status ${RET}."
    fi

    echo "Removing local shared code tar file..."
    /bin/rm -f "${LOCAL_TAR_FILE}"

    echo "Updating lscmctl script..."
    /bin/mv -f "${ADDONS_DIR}/lscmctl" "${ADDONS_DIR}/../admin/misc/lscmctl"

    echo "Done!"
}

errorExit()
{
    printf "${YELLOW}ERROR: ${END_COLOR} %s\n\n" "${1}"
    exit 1
}

setPanelClassName()
{
    PANEL_CLASS_NAME=''

    x=$(/usr/local/cpanel/cpanel -V 2>/dev/null)

    if [ "${x}" ]; then
        PANEL_CLASS_NAME='\Lsc\Wp\Panel\CPanel'
        return
    fi

    x=$(plesk version 2>/dev/null)

    if [ "${x}" ]; then
        PANEL_CLASS_NAME='\Lsc\Wp\Panel\Plesk'
        return
    fi

    x=$(/usr/local/directadmin/directadmin v 2>/dev/null)

    if [ "${x}" ]; then
        PANEL_CLASS_NAME='\Lsc\Wp\Panel\DirectAdmin'
        return
    fi

    if [ -e "${LSWS_DIR}/admin/lscdata/custom" ]; then
        PANEL_CLASS_NAME='custom'
        return
    fi
}

selectPHP()
{
    if [ "${1}" = "-php" ]
    then
        if [ -x "${2}" ] ; then
            PHP_BIN="${2} -d disable_functions="
            return 2
        else
            errorExit "${2} not detected as a valid php binary."
        fi
    else
        #Use default admin php binary
        DEFAULT_PHP_BIN="${LSWS_DIR}/admin/fcgi-bin/admin_php5"
        OLS_DA_PHP_BIN="${LSWS_DIR}/admin/fcgi-bin/admin_php"

        if [ ! -x "${DEFAULT_PHP_BIN}" ] ; then

            if [ -x "${OLS_DA_PHP_BIN}" ] ; then
                DEFAULT_PHP_BIN="${OLS_DA_PHP_BIN}"
            else
                errorExit "Could not find default admin PHP binary."
            fi
        fi

        PHP_BIN="${DEFAULT_PHP_BIN} -c ${LSWS_DIR}/add-ons/webcachemgr/shared/webcachemgr.ini"
    fi
}

if [ "${1}" = "--help" ]
then
    printHelp
    exit 0
fi

if [ "${1}" = "--update-lib" ] || [ "${1}" = "--force-update-lib" ]
then
    runUpdate "${1}"
    exit 0;
fi

enforceMinAPIVer
setPanelClassName

if [ "${PANEL_CLASS_NAME}" = '' ] ; then
    errorExit 'Supported Control Panel not detected. Aborting!'
fi

selectPHP "${1}" "${2}"

if [ $? = 2 ] ; then
    shift 2
fi

if [ $# = 0 ] ; then
    errorExit "Missing input command. Try --help for a full list of available commands with examples."
fi

$PHP_BIN "${PHP_SCRIPT}" "${PANEL_CLASS_NAME}" "${@}"