Edit File: cptools_dispatcher.sh
#!/bin/bash # Dispatcher for both 5s unchatter jobs and 8h maintenance jobs REMOVE_QUEUE="/usr/local/cptools/ip_remove_queue.txt" QUEUE="/usr/local/cptools/usrunchatter_queue.txt" IP_QUEUE="/usr/local/cptools/ip_unblock_queue.txt" LAST_RUN_FILE="/usr/local/cptools/last_run.txt" PID_FILE="/usr/local/cptools/scripts.pid" START_FILE="/usr/local/cptools/script.start" SETTINGS="/usr/local/cptools/settings.conf" if [ -f "$SETTINGS" ]; then freq=$(grep -o '"frequency"[[:space:]]*:[[:space:]]*"[^"]*"' "$SETTINGS" \ | sed 's/.*"frequency"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/' ) case "$freq" in hourly) LONG_INTERVAL=$((3600)) ;; four) LONG_INTERVAL=$((6*3600)) ;; twice) LONG_INTERVAL=$((12*3600)) ;; once) LONG_INTERVAL=$((24*3600)) ;; 2day) LONG_INTERVAL=$((48*3600)) ;; 5day) LONG_INTERVAL=$((120*3600)) ;; week) LONG_INTERVAL=$((7*24*3600)) ;; *) LONG_INTERVAL=$((8*3600)) ;; # fallback esac else LONG_INTERVAL=0 fi # Initialize last run from file or 0 if [[ -f "$LAST_RUN_FILE" ]]; then LAST_RUN=$(cat "$LAST_RUN_FILE") else LAST_RUN=0 fi # Function: check if a PID is running pid_is_running() { local pid="$1" if [[ -z "$pid" || ! "$pid" =~ ^[0-9]+$ ]]; then return 1 fi if [[ -d "/proc/$pid" ]]; then return 0 else return 1 fi } while true; do NOW=$(date +%s) # ---- 10s unchatter queue ---- if [ -f "$QUEUE" ]; then TMP="/tmp/unchatter.$$" cp "$QUEUE" "$TMP" && : > "$QUEUE" while IFS= read -r user; do [ -z "$user" ] && continue echo "Processing unchatter for $user" /usr/local/cptools/unchatter.cgi "$user" done < "$TMP" rm -f "$TMP" fi # ---- 10s IP unblock queue ---- if [ -f "$IP_QUEUE" ]; then TMP="/tmp/ipqueue.$$" cp "$IP_QUEUE" "$TMP" && : > "$IP_QUEUE" while IFS="|" read -r user ip ts; do [ -z "$user" ] && continue [ -z "$ip" ] && continue homedir=$(getent passwd "$user" | cut -d: -f6) htaccess="$homedir/public_html/.htaccess" if [ -f "$htaccess" ]; then echo "Processing IP unblock for $user ($ip)" chattr -i "$htaccess" 2>/dev/null # Add RewriteCond for this IP if not already present if ! grep -q "$ip" "$htaccess"; then sed -i "/# --- Optional: allow your own IP ---/a RewriteCond %{REMOTE_ADDR} ^${ip//./\\.}\$" "$htaccess" fi # Ensure RewriteRule exists after the conditions if ! grep -q "RewriteRule ^ - \[L\]" "$htaccess"; then sed -i "/RewriteCond %{REMOTE_ADDR}/a RewriteRule ^ - [L]" "$htaccess" fi chattr +i "$htaccess" 2>/dev/null echo "$(date '+%F %T') Added $ip for $user" >> /var/log/cptools_ip_unblock.log else echo "$(date '+%F %T') ? .htaccess not found for $user" >> /var/log/cptools_ip_unblock.log fi done < "$TMP" rm -f "$TMP" fi # ---- 10s IP remove queue ---- if [ -f "$REMOVE_QUEUE" ]; then TMP="/tmp/ipremove.$$" cp "$REMOVE_QUEUE" "$TMP" && : > "$REMOVE_QUEUE" while IFS="|" read -r user ip ts; do [ -z "$user" ] && continue [ -z "$ip" ] && continue homedir=$(getent passwd "$user" | cut -d: -f6) htaccess="$homedir/public_html/.htaccess" if [ -f "$htaccess" ]; then echo "Processing IP removal for $user ($ip)" chattr -i "$htaccess" 2>/dev/null # Remove RewriteCond for this IP sed -i "/RewriteCond[[:space:]]\+%{REMOTE_ADDR}.*${ip//./\\.}/d" "$htaccess" chattr +i "$htaccess" 2>/dev/null echo "$(date '+%F %T') Removed $ip for $user" >> /var/log/cptools_ip_unblock.log else echo "$(date '+%F %T') ? .htaccess not found for $user" >> /var/log/cptools_ip_unblock.log fi done < "$TMP" rm -f "$TMP" fi #============================ Start to send reply to abuse emails ============================================= # ---- 5-minute task ---- if [[ -z "$LAST_5MIN_RUN" ]]; then LAST_5MIN_RUN=0 fi if (( NOW - LAST_5MIN_RUN >= 300 )); then LOGFILE="/usr/local/cptools/DC_Abusebot/dc_bot_cron.log" CONF="/usr/local/cptools/abuseadmin_config.json" echo "[5MIN TASK] $(date '+%F %T') Checking dc_bot setting..." >> "$LOGFILE" dc_bot_value="false" if [[ -f "$CONF" ]]; then # Try to extract dc_bot value (requires jq if available) if command -v jq >/dev/null 2>&1; then dc_bot_value=$(jq -r '.dc_bot' "$CONF" 2>/dev/null) else # Fallback grep/sed parser if jq not installed dc_bot_value=$(grep -o '"dc_bot"[[:space:]]*:[[:space:]]*[^,}]*' "$CONF" | sed 's/.*:[[:space:]]*//;s/[[:space:]]//g;s/"//g') fi fi if [[ "$dc_bot_value" == "true" ]]; then echo "[5MIN TASK] $(date '+%F %T') dc_bot=true -> executing dc_bot..." >> "$LOGFILE" /usr/local/cptools/DC_Abusebot/dc_bot --cron_exec >> "$LOGFILE" 2>&1 echo "[5MIN TASK] $(date '+%F %T') dc_bot execution completed." >> "$LOGFILE" else echo "[5MIN TASK] $(date '+%F %T') dc_bot=false -> skipping execution." >> "$LOGFILE" fi echo "[5MIN TASK] $(date '+%F %T') Completed 5-minute cycle." >> "$LOGFILE" LAST_5MIN_RUN=$NOW fi #============================ End to send reply to abuse emails ============================================= # ---- scheduled task ---- if (( LONG_INTERVAL > 0 )) && (( NOW - LAST_RUN >= LONG_INTERVAL )); then echo "Touch script tracking START" echo "" > "/usr/local/cptools/script.start" echo "Touch script tracking END" # Refuse if already running if [[ -f "$START_FILE" && -f "$PID_FILE" ]]; then old_pid=$(cat "$PID_FILE") if pid_is_running "$old_pid"; then echo "scripts.sh already running (PID: $old_pid), skipping..." sleep 10 continue else rm -f "$START_FILE" "$PID_FILE" # stale fi fi /usr/local/cptools/scripts.sh --system & pid=$! echo "$pid" > "$PID_FILE" LAST_RUN=$NOW echo "$NOW" > "$LAST_RUN_FILE" echo "[STARTED] $(date '+%d-%B-%Y %I:%M %p %Z') : PID $pid" \ >> /usr/local/cpanel/whostmgr/docroot/cgi/cptools/execution.log fi sleep 10 done