Sh3ll



Directory :  /scripts2/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

Current File : //scripts2/clean_action_scheduler_cpanel.sh
#!/bin/bash

set -o pipefail

WPT_BIN="/usr/local/cpanel/3rdparty/wp-toolkit/bin/wpt-cli.sh"
LOG_FILE="/var/log/clean_action_scheduler_wptoolkit_cpanel.log"
LOCK_FILE="/var/run/clean_action_scheduler_wptoolkit_cpanel.lock"

RETENTION_DAYS="30"
RETENTION_TEXT="${RETENTION_DAYS} days ago"
COMMAND_TIMEOUT="900"

# Print output to console and also append it to the log file
exec > >(tee -a "$LOG_FILE") 2>&1

echo "============================================================"
echo "Start time: $(date '+%F %T')"
echo "Server: $(hostname)"
echo "Log file: $LOG_FILE"
echo "Retention: $RETENTION_TEXT"
echo "============================================================"

if [ -f "$LOCK_FILE" ]; then
    echo "ERROR: Lock file exists: $LOCK_FILE"
    echo "Another cleanup process may already be running."
    exit 1
fi

touch "$LOCK_FILE"
trap 'rm -f "$LOCK_FILE"' EXIT

if [ ! -x "$WPT_BIN" ]; then
    echo "ERROR: WP Toolkit CLI was not found or is not executable: $WPT_BIN"
    exit 1
fi

if command -v wp >/dev/null 2>&1; then
    WP_BIN="$(command -v wp)"
elif [ -x /usr/local/bin/wp ]; then
    WP_BIN="/usr/local/bin/wp"
elif [ -x /usr/bin/wp ]; then
    WP_BIN="/usr/bin/wp"
else
    echo "ERROR: WP-CLI binary was not found."
    exit 1
fi

echo "WP Toolkit binary: $WPT_BIN"
echo "WP-CLI binary: $WP_BIN"
echo "------------------------------------------------------------"

TMP_LIST="/tmp/wptoolkit_instances_$$.txt"
TMP_IDS="/tmp/wptoolkit_instance_ids_$$.txt"

"$WPT_BIN" --list > "$TMP_LIST" 2>&1

if [ ! -s "$TMP_LIST" ]; then
    echo "ERROR: WP Toolkit returned an empty list."
    rm -f "$TMP_LIST" "$TMP_IDS"
    exit 1
fi

awk '
    /^[[:space:]]*[0-9]+[[:space:]]/ {
        print $1
    }
' "$TMP_LIST" | sort -n | uniq > "$TMP_IDS"

if [ ! -s "$TMP_IDS" ]; then
    echo "ERROR: Could not extract instance IDs from WP Toolkit output."
    echo "Raw output:"
    cat "$TMP_LIST"
    rm -f "$TMP_LIST" "$TMP_IDS"
    exit 1
fi

echo "Detected instance IDs:"
cat "$TMP_IDS"
echo "------------------------------------------------------------"

TOTAL_FOUND=0
TOTAL_PROCESSED=0
TOTAL_SKIPPED=0
TOTAL_FAILED=0

while read -r INSTANCE_ID; do
    [ -z "$INSTANCE_ID" ] && continue

    TOTAL_FOUND=$((TOTAL_FOUND + 1))

    echo ""
    echo "------------------------------------------------------------"
    echo "Instance ID: $INSTANCE_ID"
    echo "Time: $(date '+%F %T')"

    INSTANCE_LINE="$(awk -v id="$INSTANCE_ID" '$1 == id {print}' "$TMP_LIST")"
    echo "Instance info: $INSTANCE_LINE"

    WP_PATH="$("$WPT_BIN" --wp-cli -instance-id "$INSTANCE_ID" -- --allow-root eval 'echo ABSPATH;' 2>/dev/null | tail -n 1)"
    WP_PATH="$(echo "$WP_PATH" | tr -d '\r' | sed 's#/$##')"

    if [ -z "$WP_PATH" ]; then
        echo "SKIPPED: Could not detect WordPress ABSPATH from WP Toolkit."
        TOTAL_SKIPPED=$((TOTAL_SKIPPED + 1))
        continue
    fi

    echo "Detected WordPress path: $WP_PATH"

    if [ ! -f "$WP_PATH/wp-config.php" ]; then
        echo "SKIPPED: wp-config.php was not found at: $WP_PATH"
        TOTAL_SKIPPED=$((TOTAL_SKIPPED + 1))
        continue
    fi

    if ! timeout 90 "$WP_BIN" --allow-root --path="$WP_PATH" core is-installed >/dev/null 2>&1; then
        echo "SKIPPED: WordPress is not properly detected by WP-CLI."
        TOTAL_SKIPPED=$((TOTAL_SKIPPED + 1))
        continue
    fi

    SITE_URL="$("$WP_BIN" --allow-root --path="$WP_PATH" option get siteurl 2>/dev/null)"
    DB_NAME="$("$WP_BIN" --allow-root --path="$WP_PATH" config get DB_NAME 2>/dev/null)"
    TABLE_PREFIX="$("$WP_BIN" --allow-root --path="$WP_PATH" db prefix 2>/dev/null)"

    echo "Site URL: ${SITE_URL:-unknown}"
    echo "Database: ${DB_NAME:-unknown}"
    echo "Table prefix: ${TABLE_PREFIX:-unknown}"

    if [ -z "$TABLE_PREFIX" ]; then
        echo "SKIPPED: Could not detect table prefix."
        TOTAL_SKIPPED=$((TOTAL_SKIPPED + 1))
        continue
    fi

    ACTIONS_TABLE="${TABLE_PREFIX}actionscheduler_actions"
    LOGS_TABLE="${TABLE_PREFIX}actionscheduler_logs"

    ACTIONS_EXISTS="$("$WP_BIN" --allow-root --path="$WP_PATH" db query \
        "SHOW TABLES LIKE '${ACTIONS_TABLE}';" --skip-column-names 2>/dev/null)"

    LOGS_EXISTS="$("$WP_BIN" --allow-root --path="$WP_PATH" db query \
        "SHOW TABLES LIKE '${LOGS_TABLE}';" --skip-column-names 2>/dev/null)"

    if [ -z "$ACTIONS_EXISTS" ]; then
        echo "SKIPPED: Action Scheduler actions table was not found."
        TOTAL_SKIPPED=$((TOTAL_SKIPPED + 1))
        continue
    fi

    echo "Action Scheduler actions table found: $ACTIONS_TABLE"

    if [ -n "$LOGS_EXISTS" ]; then
        echo "Action Scheduler logs table found: $LOGS_TABLE"
    else
        echo "WARNING: Action Scheduler logs table was not found."
    fi

    if timeout 90 "$WP_BIN" --allow-root --path="$WP_PATH" action-scheduler --help >/dev/null 2>&1; then
        echo "Action Scheduler WP-CLI command is available."

        echo "Cleaning completed actions older than: $RETENTION_TEXT"

        timeout "$COMMAND_TIMEOUT" "$WP_BIN" --allow-root --path="$WP_PATH" \
            action-scheduler clean --status=complete --before="$RETENTION_TEXT"

        RC_COMPLETE=$?

        if [ "$RC_COMPLETE" -ne 0 ]; then
            echo "WARNING: Completed actions cleanup failed. Exit code: $RC_COMPLETE"
            TOTAL_FAILED=$((TOTAL_FAILED + 1))
        else
            echo "OK: Completed actions cleanup finished."
        fi

        echo "Cleaning failed actions older than: $RETENTION_TEXT"

        timeout "$COMMAND_TIMEOUT" "$WP_BIN" --allow-root --path="$WP_PATH" \
            action-scheduler clean --status=failed --before="$RETENTION_TEXT"

        RC_FAILED=$?

        if [ "$RC_FAILED" -ne 0 ]; then
            echo "WARNING: Failed actions cleanup failed. Exit code: $RC_FAILED"
            TOTAL_FAILED=$((TOTAL_FAILED + 1))
        else
            echo "OK: Failed actions cleanup finished."
        fi

    else
        echo "Action Scheduler WP-CLI command is not available."
        echo "Using SQL fallback cleanup."

        echo "Counting old actions before cleanup..."

        "$WP_BIN" --allow-root --path="$WP_PATH" db query "
SELECT status, COUNT(*) AS total
FROM \`${ACTIONS_TABLE}\`
WHERE status IN ('complete','failed')
  AND scheduled_date_gmt < UTC_TIMESTAMP() - INTERVAL ${RETENTION_DAYS} DAY
GROUP BY status;
"

        if [ -n "$LOGS_EXISTS" ]; then
            echo "Deleting logs for old completed/failed actions..."

            timeout "$COMMAND_TIMEOUT" "$WP_BIN" --allow-root --path="$WP_PATH" db query "
DELETE l
FROM \`${LOGS_TABLE}\` l
INNER JOIN \`${ACTIONS_TABLE}\` a
  ON a.action_id = l.action_id
WHERE a.status IN ('complete','failed')
  AND a.scheduled_date_gmt < UTC_TIMESTAMP() - INTERVAL ${RETENTION_DAYS} DAY;
"
            RC_LOGS=$?
        else
            RC_LOGS=0
        fi

        echo "Deleting old completed/failed actions..."

        timeout "$COMMAND_TIMEOUT" "$WP_BIN" --allow-root --path="$WP_PATH" db query "
DELETE
FROM \`${ACTIONS_TABLE}\`
WHERE status IN ('complete','failed')
  AND scheduled_date_gmt < UTC_TIMESTAMP() - INTERVAL ${RETENTION_DAYS} DAY;
"
        RC_ACTIONS=$?

        if [ "$RC_LOGS" -ne 0 ] || [ "$RC_ACTIONS" -ne 0 ]; then
            echo "WARNING: SQL fallback cleanup failed. Logs RC=$RC_LOGS Actions RC=$RC_ACTIONS"
            TOTAL_FAILED=$((TOTAL_FAILED + 1))
        else
            echo "OK: SQL fallback cleanup finished."
        fi

        echo "Counting old actions after cleanup..."

        "$WP_BIN" --allow-root --path="$WP_PATH" db query "
SELECT status, COUNT(*) AS total
FROM \`${ACTIONS_TABLE}\`
WHERE status IN ('complete','failed')
  AND scheduled_date_gmt < UTC_TIMESTAMP() - INTERVAL ${RETENTION_DAYS} DAY
GROUP BY status;
"
    fi

    TOTAL_PROCESSED=$((TOTAL_PROCESSED + 1))
    echo "Finished instance ID: $INSTANCE_ID"

done < "$TMP_IDS"

rm -f "$TMP_LIST" "$TMP_IDS"

echo ""
echo "============================================================"
echo "End time: $(date '+%F %T')"
echo "Total found: $TOTAL_FOUND"
echo "Processed: $TOTAL_PROCESSED"
echo "Skipped: $TOTAL_SKIPPED"
echo "Failed operations: $TOTAL_FAILED"
echo "Cleanup job finished."
echo "============================================================"

Sh3LL