/
opt
/
clwpos
/
Upload File
HOME
#!/bin/bash ####################################### # Timed-out wrapper around wp-cli # Arguments: # $1 - Path to PHP binary, full filesystem path # $2 - Path to Wordpress installation, full filesystem path # All the rest arguments ($@) are treated as WP-CLI command # Outputs: # Writes result to stdout ####################################### PATH_TO_PHP="$1" PATH_TO_WP="$2" shift 2; CODE=0 # WPOS wp-cli WP_CLI="/opt/clwpos/wp-cli" # Defaults for PHP PHP_EXTRA_OPTIONS="-d memory_limit=-1 -d open_basedir=none" PHP_DEFAULT_EXTENSIONS="phar" # pick other extensions based on PHP version PHP_VERSION_PARTS=($($PATH_TO_PHP -v | head -n1 | sed -n -e 's/^.* \([0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p' | tr '.' ' ')) PHP_VERSION_ID=$((PHP_VERSION_PARTS[0] * 10000 + PHP_VERSION_PARTS[1] * 100 + PHP_VERSION_PARTS[2])) # PHP 8.0 and above have json extension enabled by default if (( PHP_VERSION_ID < 80000 )); then PHP_DEFAULT_EXTENSIONS+=" json" fi # for PHP 8.2 and above mysqlnd must be loaded before mysqli if (( PHP_VERSION_ID >= 80200 )); then PHP_DEFAULT_EXTENSIONS+=" mysqlnd" fi PHP_DEFAULT_EXTENSIONS+=" mysqli" # explicitly drop PHP disable_functions directive in order to avoid errors like # 'Error: Cannot do 'launch': The PHP functions `proc_open()` and/or `proc_close()` are disabled' # during plugin manipulations PHP_DEFAULT_FUNCTIONS="-d disable_functions= -d display_errors=0 -d error_log=/dev/null" # Defaults for WP-CLI WP_CLI_DEFAULT_OPTS=("--skip-themes") # Must be first [0] # Passed via ENVVAR if [ -n "${SKIP_PLUGINS_LOADING}" ]; then WP_CLI_DEFAULT_OPTS+=("--skip-plugins") fi # Find wp-config.php WP_CONFIG_PATH="${PATH_TO_WP}/wp-config.php" if [ ! -e "${WP_CONFIG_PATH}" ]; then # It's ok for wp-config.php to be in a subdirectory PARENT_PATH=$(dirname "${PATH_TO_WP}") WP_CONFIG_PATH="${PARENT_PATH}/wp-config.php" fi # Comment constants if [ -e "${WP_CONFIG_PATH}" ]; then sed -i "/^[^#\/]*define\s*(\s*['\"]WP_DEBUG['\"]/s|^|//CL_DEFINE|" $WP_CONFIG_PATH sed -i "/^[^#\/]*define\s*(\s*['\"]WP_DEBUG_DISPLAY['\"]/s|^|//CL_DEFINE|" $WP_CONFIG_PATH sed -i "/^[^#\/]*define\s*(\s*['\"]DISABLE_WP_CRON['\"]/s|^|//CL_DEFINE|" $WP_CONFIG_PATH fi # Define constants WP_CLI_DEFAULT_OPTS+=("--exec=define('WP_DEBUG', true);") WP_CLI_DEFAULT_OPTS+=("--exec=define('WP_DEBUG_DISPLAY', false);") WP_CLI_DEFAULT_OPTS+=("--exec=define('DISABLE_WP_CRON', true);") # Default timeout, formatted as for timeout command (GNU coreutils) # 2 minutes (120 seconds) TIMEOUT="2m" # Construct PHP extensions to include EXTS="" for ext in $PHP_DEFAULT_EXTENSIONS do if ! $PATH_TO_PHP -m | grep -i "$ext" 1>/dev/null; then EXTS+=" -d extension=$ext.so" fi done # change current working directory # we need this because if php code has relative imports # it looks for scripts inside current directory first # e.g. some providers add require('wp-salt.php') to config # https://stackoverflow.com/questions/75823716/ # the overall approach of relative import is not correct, # but we still need patch for this cd "${PATH_TO_WP}" if [[ "$1" == "help" ]]; then exec timeout $TIMEOUT \ $PATH_TO_PHP $EXTS $PHP_EXTRA_OPTIONS $PHP_DEFAULT_FUNCTIONS \ $WP_CLI --path=$PATH_TO_WP "${WP_CLI_DEFAULT_OPTS[@]}" "$@" | cat else WP_CLI_RESULT=$(exec timeout $TIMEOUT \ $PATH_TO_PHP $EXTS $PHP_EXTRA_OPTIONS $PHP_DEFAULT_FUNCTIONS \ $WP_CLI --path=$PATH_TO_WP "${WP_CLI_DEFAULT_OPTS[@]}" "$@") WP_CLI_CODE=$? # Not 0 and not 1 because WP-CLI has commands that return status as the result of the command execution # For example plugin is-active, exit status 0 if active, otherwise 1 # Calling an error at the php level will return 255 # Let's try to run the command without --skip-themes if [ "$WP_CLI_CODE" -ne 0 ] && [ "$WP_CLI_CODE" -ne 1 ]; then echo "Retry without --skip-themes" >&2 unset WP_CLI_DEFAULT_OPTS[0] WP_CLI_RESULT=$(exec timeout $TIMEOUT \ $PATH_TO_PHP $EXTS $PHP_EXTRA_OPTIONS $PHP_DEFAULT_FUNCTIONS \ $WP_CLI --path=$PATH_TO_WP "${WP_CLI_DEFAULT_OPTS[@]}" "$@") WP_CLI_CODE=$? fi printf '%s' "$WP_CLI_RESULT" CODE=$WP_CLI_CODE fi cleanup() { if [ -e "${WP_CONFIG_PATH}" ]; then sed -i "s|^//CL_DEFINE||" $WP_CONFIG_PATH fi } trap cleanup EXIT exit $CODE