dev #3

Merged
Daemon merged 2 commits from dev into main 2025-12-16 14:32:22 +00:00

View File

@@ -1,108 +1,161 @@
#!/bin/bash #!/bin/bash
# Oprește execuția imediat dacă apare orice eroare
set -e set -e
# ============================
# VARIABILE GLOBALE
# ============================
# Directorul unde va fi instalat agentul
INSTALL_DIR="/opt/server-monitor" INSTALL_DIR="/opt/server-monitor"
# Scriptul agentului care va rula periodic
AGENT="$INSTALL_DIR/monitor-agent.sh" AGENT="$INSTALL_DIR/monitor-agent.sh"
# Fișierul de configurare (permisiuni restrictive)
CONFIG="$INSTALL_DIR/config.env" CONFIG="$INSTALL_DIR/config.env"
# Comanda rulată din cron (fără output)
CRON_CMD="$AGENT >/dev/null 2>&1" CRON_CMD="$AGENT >/dev/null 2>&1"
# Endpoint API unde se trimit datele
API_URL="https://itschool.pbcv.dev/api/report.php" API_URL="https://itschool.pbcv.dev/api/report.php"
# ============================ # ============================
# CHECK ROOT # VERIFICARE PERMISIUNI ROOT
# ============================ # ============================
# Scriptul trebuie rulat ca root (cron, /opt, system info)
if [[ $EUID -ne 0 ]]; then if [[ $EUID -ne 0 ]]; then
echo "Run as root (sudo)" echo "Run as root (sudo)"
exit 1 exit 1
fi fi
echo " Installing Server Monitor Agent..." echo "Installing Server Monitor Agent (IPv4 only)..."
# ============================ # ============================
# CREATE DIR # CREARE DIRECTOR DE INSTALARE
# ============================ # ============================
# Creează directorul dacă nu există
mkdir -p "$INSTALL_DIR" mkdir -p "$INSTALL_DIR"
# Permisiuni standard pentru directoare de sistem
chmod 755 "$INSTALL_DIR" chmod 755 "$INSTALL_DIR"
# ============================ # ============================
# CONFIG FILE # FIȘIER CONFIGURARE
# ============================ # ============================
# Stocăm variabilele configurabile separat
# (bun pentru securitate și extensibilitate)
cat > "$CONFIG" <<EOF cat > "$CONFIG" <<EOF
API_URL="$API_URL" API_URL="$API_URL"
EOF EOF
# Permisiuni restrictive (doar root poate citi)
chmod 600 "$CONFIG" chmod 600 "$CONFIG"
# ============================ # ============================
# AGENT SCRIPT # SCRIPT AGENT (RULEAZĂ DIN CRON)
# ============================ # ============================
cat > "$AGENT" <<'EOF' cat > "$AGENT" <<'EOF'
#!/bin/bash #!/bin/bash
set -e set -e
# Importă configurația
source /opt/server-monitor/config.env source /opt/server-monitor/config.env
# Numele mașinii
HOSTNAME=$(hostname) HOSTNAME=$(hostname)
# ============================ # ============================
# CPU # CPU
# ============================ # ============================
# Load average (1 minut)
CPU_LOAD=$(uptime | awk -F'load average:' '{print $2}' | cut -d',' -f1 | xargs) CPU_LOAD=$(uptime | awk -F'load average:' '{print $2}' | cut -d',' -f1 | xargs)
# Număr de core-uri CPU
CPU_CORES=$(nproc) CPU_CORES=$(nproc)
# ============================ # ============================
# RAM / SWAP # MEMORIE RAM / SWAP (MB)
# ============================ # ============================
# RAM total și utilizat
RAM_TOTAL=$(free -m | awk '/Mem:/ {print $2}') RAM_TOTAL=$(free -m | awk '/Mem:/ {print $2}')
RAM_USED=$(free -m | awk '/Mem:/ {print $3}') RAM_USED=$(free -m | awk '/Mem:/ {print $3}')
# SWAP total și utilizat
SWAP_TOTAL=$(free -m | awk '/Swap:/ {print $2}') SWAP_TOTAL=$(free -m | awk '/Swap:/ {print $2}')
SWAP_USED=$(free -m | awk '/Swap:/ {print $3}') SWAP_USED=$(free -m | awk '/Swap:/ {print $3}')
# ============================ # ============================
# DISK (KB) # DISK (KB, partiția /)
# ============================ # ============================
DISK_TOTAL=$(df -k / | awk 'NR==2 {print $2}') DISK_TOTAL=$(df -k / | awk 'NR==2 {print $2}')
DISK_USED=$(df -k / | awk 'NR==2 {print $3}') DISK_USED=$(df -k / | awk 'NR==2 {print $3}')
# ============================ # ============================
# NETWORK (bytes) # NETWORK IPv4 ONLY
# ============================ # ============================
IFACE=$(ip route get 1 | awk '{print $5; exit}')
# Detectează interfața activă IPv4
IFACE=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{print $5; exit}')
# Trafic RX / TX (bytes)
RX_BYTES=$(cat /sys/class/net/$IFACE/statistics/rx_bytes) RX_BYTES=$(cat /sys/class/net/$IFACE/statistics/rx_bytes)
TX_BYTES=$(cat /sys/class/net/$IFACE/statistics/tx_bytes) TX_BYTES=$(cat /sys/class/net/$IFACE/statistics/tx_bytes)
# ============================ # ============================
# PROCESSES # PROCESE
# ============================ # ============================
# Număr total de procese
PROC_TOTAL=$(ps ax --no-headers | wc -l) PROC_TOTAL=$(ps ax --no-headers | wc -l)
# Procese zombie (Z)
PROC_ZOMBIE=$(ps axo stat | grep -c Z || true) PROC_ZOMBIE=$(ps axo stat | grep -c Z || true)
# ============================ # ============================
# SYSTEMD # SYSTEMD SERVICES
# ============================ # ============================
# Servicii systemd eșuate
FAILED_SERVICES=$(systemctl --failed --no-legend 2>/dev/null | wc -l) FAILED_SERVICES=$(systemctl --failed --no-legend 2>/dev/null | wc -l)
# ============================ # ============================
# NETWORK PORTS # PORTURI DESCHISE (IPv4)
# ============================ # ============================
OPEN_PORTS=$(ss -lntu | tail -n +2 | wc -l)
# Porturi ascultate TCP/UDP IPv4
OPEN_PORTS=$(ss -4 -lntu | tail -n +2 | wc -l)
# ============================ # ============================
# OS / KERNEL # OS / KERNEL / ARHITECTURĂ
# ============================ # ============================
# Nume OS (fallback dacă lsb_release nu există)
OS_NAME=$(lsb_release -ds 2>/dev/null || grep PRETTY_NAME /etc/os-release | cut -d= -f2 | tr -d '"') OS_NAME=$(lsb_release -ds 2>/dev/null || grep PRETTY_NAME /etc/os-release | cut -d= -f2 | tr -d '"')
KERNEL=$(uname -r) KERNEL=$(uname -r)
ARCH=$(uname -m) ARCH=$(uname -m)
# ============================ # ============================
# UPTIME # UPTIME
# ============================ # ============================
UPTIME=$(uptime -p) UPTIME=$(uptime -p)
# ============================ # ============================
# SEND DATA # TRIMITERE DATE CĂTRE API
# FORȚAT IPv4 (-4)
# ============================ # ============================
curl -s -X POST "$API_URL" \
curl -4 -s -X POST "$API_URL" \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-d "{ -d "{
\"hostname\": \"$HOSTNAME\", \"hostname\": \"$HOSTNAME\",
@@ -136,19 +189,25 @@ curl -s -X POST "$API_URL" \
}" }"
EOF EOF
# Permite execuția agentului
chmod +x "$AGENT" chmod +x "$AGENT"
# ============================ # ============================
# CRON (free duplicate) # CRON JOB (FĂRĂ DUBLURI)
# ============================ # ============================
( crontab -l 2>/dev/null | grep -v "$AGENT" || true
(
# Păstrează ce există deja, elimină dublurile
crontab -l 2>/dev/null | grep -v "$AGENT" || true
# Rulează agentul la fiecare minut
echo "* * * * * $CRON_CMD" echo "* * * * * $CRON_CMD"
) | crontab - ) | crontab -
# ============================ # ============================
# FINAL # FINAL
# ============================ # ============================
echo " Server Monitor installed successfully"
echo "Server Monitor installed successfully (IPv4 only)"
echo "Reporting to: $API_URL" echo "Reporting to: $API_URL"
echo "Interval: every 1 minute" echo "Interval: every 1 minute"
echo " Test manual: $AGENT" echo "Manual test: $AGENT"