|
Directory : /scripts2/ |
#!/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 "============================================================"