#!/bin/bash
#
# watchdog.sh - Monitor and auto-restart revsocks server
# Run via cron every 30 min: */30 * * * * /opt/revsocks/watchdog.sh >> /opt/revsocks/watchdog.log 2>&1
#

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
OUTPUT_DIR="${SCRIPT_DIR}/output"
LOG="${SCRIPT_DIR}/watchdog.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

check_port() {
    ss -tlnp | grep -q ":${1} " && return 0 || return 1
}

log() {
    echo "[${DATE}] $1" >> "$LOG"
}

# Keep log under 1MB
if [ -f "$LOG" ] && [ $(stat -c%s "$LOG" 2>/dev/null || echo 0) -gt 1048576 ]; then
    tail -100 "$LOG" > "${LOG}.tmp" && mv "${LOG}.tmp" "$LOG"
fi

# ===== Check tunnel server (port 443) =====
if ! check_port 443; then
    log "ALERT: Port 443 DOWN - restarting server.py"
    
    # Kill old process if stuck
    pkill -f 'python3 server.py' 2>/dev/null
    sleep 2
    
    # Don't delete targets.json - preserve connected targets
    
    # Restart in tmux
    tmux kill-session -t rs 2>/dev/null
    sleep 1
    tmux new-session -d -s rs "cd ${OUTPUT_DIR} && python3 server.py"
    sleep 4
    
    if check_port 443; then
        log "OK: Port 443 restored"
    else
        log "CRITICAL: Port 443 still down after restart"
    fi
else
    log "OK: Port 443 listening"
fi

# ===== Check file server (port 8443) =====
if ! check_port 8443; then
    log "ALERT: Port 8443 DOWN - restarting file server"
    
    pkill -f 'http.server 8443' 2>/dev/null
    sleep 1
    
    tmux kill-session -t files 2>/dev/null
    sleep 1
    tmux new-session -d -s files "cd ${OUTPUT_DIR} && python3 -m http.server 8443"
    sleep 2
    
    if check_port 8443; then
        log "OK: Port 8443 restored"
    else
        log "CRITICAL: Port 8443 still down after restart"
    fi
else
    log "OK: Port 8443 listening"
fi

# ===== Check disk space =====
DISK_USE=$(df / | tail -1 | awk '{print $5}' | tr -d '%')
if [ "$DISK_USE" -gt 90 ]; then
    log "WARNING: Disk usage at ${DISK_USE}%"
fi

# ===== Check memory =====
MEM_FREE=$(free -m | awk '/Mem:/ {print $7}')
if [ "$MEM_FREE" -lt 100 ]; then
    log "WARNING: Low memory - ${MEM_FREE}MB free"
fi

# ===== Check web panel (port 8443) =====
if ! check_port 8443; then
    log "ALERT: Port 8443 DOWN - restarting web panel"
    pkill -f 'web_panel.py' 2>/dev/null
    sleep 1
    cd ${SCRIPT_DIR}/output && python3 web_panel.py &>/dev/null &
    sleep 2
    if check_port 8443; then
        log "OK: Port 8443 restored"
    else
        log "CRITICAL: Port 8443 still down"
    fi
else
    log "OK: Port 8443 listening"
fi
