#!/bin/bash set -e INSTALL_DIR="/opt/server-monitor" AGENT="$INSTALL_DIR/monitor-agent.sh" CONFIG="$INSTALL_DIR/config.env" CRON_CMD="$AGENT >/dev/null 2>&1" API_URL="https://itschool.pbcv.dev/api/report.php" # ============================ # CHECK ROOT # ============================ if [[ $EUID -ne 0 ]]; then echo " Run as root (sudo)" exit 1 fi echo " Installing Server Monitor Agent (IPv4 only)..." # ============================ # CREATE DIR # ============================ mkdir -p "$INSTALL_DIR" chmod 755 "$INSTALL_DIR" # ============================ # CONFIG FILE # ============================ cat > "$CONFIG" < "$AGENT" <<'EOF' #!/bin/bash set -e source /opt/server-monitor/config.env HOSTNAME=$(hostname) # ============================ # CPU # ============================ CPU_LOAD=$(uptime | awk -F'load average:' '{print $2}' | cut -d',' -f1 | xargs) CPU_CORES=$(nproc) # ============================ # RAM / SWAP # ============================ RAM_TOTAL=$(free -m | awk '/Mem:/ {print $2}') RAM_USED=$(free -m | awk '/Mem:/ {print $3}') SWAP_TOTAL=$(free -m | awk '/Swap:/ {print $2}') SWAP_USED=$(free -m | awk '/Swap:/ {print $3}') # ============================ # DISK (KB) # ============================ DISK_TOTAL=$(df -k / | awk 'NR==2 {print $2}') DISK_USED=$(df -k / | awk 'NR==2 {print $3}') # ============================ # NETWORK (IPv4 ONLY) # ============================ IFACE=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{print $5; exit}') RX_BYTES=$(cat /sys/class/net/$IFACE/statistics/rx_bytes) TX_BYTES=$(cat /sys/class/net/$IFACE/statistics/tx_bytes) # ============================ # PROCESSES # ============================ PROC_TOTAL=$(ps ax --no-headers | wc -l) PROC_ZOMBIE=$(ps axo stat | grep -c Z || true) # ============================ # SYSTEMD # ============================ FAILED_SERVICES=$(systemctl --failed --no-legend 2>/dev/null | wc -l) # ============================ # NETWORK PORTS (IPv4 ONLY) # ============================ OPEN_PORTS=$(ss -4 -lntu | tail -n +2 | wc -l) # ============================ # OS / KERNEL # ============================ OS_NAME=$(lsb_release -ds 2>/dev/null || grep PRETTY_NAME /etc/os-release | cut -d= -f2 | tr -d '"') KERNEL=$(uname -r) ARCH=$(uname -m) # ============================ # UPTIME # ============================ UPTIME=$(uptime -p) # ============================ # SEND DATA (IPv4 FORCED) # ============================ curl -4 -s -X POST "$API_URL" \ -H "Content-Type: application/json" \ -d "{ \"hostname\": \"$HOSTNAME\", \"cpu\": \"$CPU_LOAD\", \"cpu_cores\": $CPU_CORES, \"ram_used\": $RAM_USED, \"ram_total\": $RAM_TOTAL, \"swap_used\": $SWAP_USED, \"swap_total\": $SWAP_TOTAL, \"disk_used\": $DISK_USED, \"disk_total\": $DISK_TOTAL, \"rx_bytes\": $RX_BYTES, \"tx_bytes\": $TX_BYTES, \"processes\": $PROC_TOTAL, \"zombies\": $PROC_ZOMBIE, \"failed_services\": $FAILED_SERVICES, \"open_ports\": $OPEN_PORTS, \"os\": \"$OS_NAME\", \"kernel\": \"$KERNEL\", \"arch\": \"$ARCH\", \"uptime\": \"$UPTIME\" }" EOF chmod +x "$AGENT" # ============================ # CRON (no duplicates) # ============================ ( crontab -l 2>/dev/null | grep -v "$AGENT" || true echo "* * * * * $CRON_CMD" ) | crontab - # ============================ # FINAL # ============================ echo " Server Monitor installed successfully (IPv4 only)" echo " Reporting to: $API_URL" echo " Interval: every 1 minute" echo " Test manual: $AGENT"