Create pve_status_report.sh
This commit is contained in:
137
pve_status_report.sh
Normal file
137
pve_status_report.sh
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
TELEGRAM_BOT_TOKEN="XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
|
||||||
|
TELEGRAM_CHAT_ID="-XXXXXXXXXX"
|
||||||
|
HOSTNAME="pve"
|
||||||
|
NOW=$(date "+%Y-%m-%d %H:%M")
|
||||||
|
CPU_CORES=$(nproc)
|
||||||
|
ONLINE=""
|
||||||
|
OFFLINE=""
|
||||||
|
|
||||||
|
# Uptime hôte
|
||||||
|
UPTIME_SEC=$(cut -d. -f1 /proc/uptime)
|
||||||
|
UPTIME_H=$((UPTIME_SEC / 3600))
|
||||||
|
UPTIME_M=$((UPTIME_SEC % 3600 / 60))
|
||||||
|
if [ "$UPTIME_H" -ge 24 ]; then
|
||||||
|
D=$((UPTIME_H / 24))
|
||||||
|
H=$((UPTIME_H % 24))
|
||||||
|
UPTIME="${D}j$(printf "%02d" $H)h"
|
||||||
|
else
|
||||||
|
UPTIME="${UPTIME_H}h$(printf "%02d" $UPTIME_M)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Ressources hôte
|
||||||
|
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print 100 - $8}' | cut -d. -f1)
|
||||||
|
LOAD_AVG=$(uptime | awk -F'load average:' '{ print $2 }' | sed 's/^ //')
|
||||||
|
MEM_TOTAL=$(free -m | awk '/Mem:/ { print $2 }')
|
||||||
|
MEM_USED=$(free -m | awk '/Mem:/ { print $3 }')
|
||||||
|
MEM_PERCENT=$(awk "BEGIN {printf \"%.1f\", $MEM_USED/$MEM_TOTAL*100}")
|
||||||
|
DISK_INFO=$(df -h / | awk 'NR==2')
|
||||||
|
DISK_USED=$(echo "$DISK_INFO" | awk '{print $3}')
|
||||||
|
DISK_TOTAL=$(echo "$DISK_INFO" | awk '{print $2}')
|
||||||
|
DISK_PERCENT=$(echo "$DISK_INFO" | awk '{gsub("%", "", $5); print $5}')
|
||||||
|
|
||||||
|
# LXC Containers
|
||||||
|
for ID in $(pct list | awk 'NR>1 {print $1}'); do
|
||||||
|
CONF="/etc/pve/lxc/${ID}.conf"
|
||||||
|
NAME=$(awk -F': ' '/^hostname:/ {print $2}' "$CONF")
|
||||||
|
STATUS=$(pct status "$ID" | awk '{print $2}')
|
||||||
|
MEM_TOTAL_MB=$(pct config "$ID" | awk '/memory:/ {print $2}')
|
||||||
|
[[ -z "$MEM_TOTAL_MB" ]] && MEM_TOTAL_MB=0
|
||||||
|
|
||||||
|
if [ "$STATUS" = "running" ]; then
|
||||||
|
# CPU usage from cgroup v2
|
||||||
|
STAT_FILE="/sys/fs/cgroup/lxc/${ID}/cpu.stat"
|
||||||
|
if [[ -f "$STAT_FILE" ]]; then
|
||||||
|
USAGE1=$(awk '/usage_usec/ {print $2}' "$STAT_FILE")
|
||||||
|
sleep 1
|
||||||
|
USAGE2=$(awk '/usage_usec/ {print $2}' "$STAT_FILE")
|
||||||
|
DELTA=$((USAGE2 - USAGE1))
|
||||||
|
CPU=$(awk -v d="$DELTA" -v c="$CPU_CORES" 'BEGIN {printf "%.1f", d / 10000 / c}')
|
||||||
|
else
|
||||||
|
CPU="0"
|
||||||
|
fi
|
||||||
|
|
||||||
|
MEM_MB=$(pct exec "$ID" -- free -m | awk '/Mem:/ {print $3}' 2>/dev/null || echo "0")
|
||||||
|
CT_UPTIME=$(pct exec "$ID" -- awk '{print int($1)}' /proc/uptime 2>/dev/null || echo "0")
|
||||||
|
UH=$((CT_UPTIME / 3600))
|
||||||
|
UM=$((CT_UPTIME % 3600 / 60))
|
||||||
|
if [ "$UH" -ge 24 ]; then
|
||||||
|
D=$((UH / 24))
|
||||||
|
H=$((UH % 24))
|
||||||
|
UPTIME_FMT="${D}j$(printf "%02d" $H)h"
|
||||||
|
else
|
||||||
|
UPTIME_FMT="${UH}h$(printf "%02d" $UM)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
ONLINE+="🟢 ${NAME} ${ID}
|
||||||
|
CPU ${CPU}%, RAM ${MEM_MB}/${MEM_TOTAL_MB} Mo, Uptime: ${UPTIME_FMT}"$'\n'
|
||||||
|
else
|
||||||
|
OFFLINE+="🔴 ${NAME} ${ID}
|
||||||
|
CPU 0%, RAM 0/${MEM_TOTAL_MB} Mo, Uptime: 0h00"$'\n'
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# QEMU VMs
|
||||||
|
for ID in $(qm list | awk 'NR>1 {print $1}'); do
|
||||||
|
CONF="/etc/pve/qemu-server/${ID}.conf"
|
||||||
|
NAME=$(awk -F': ' '/^name:/ {print $2}' "$CONF")
|
||||||
|
STATUS=$(qm status "$ID" | awk '{print $2}')
|
||||||
|
|
||||||
|
if [ "$STATUS" = "running" ]; then
|
||||||
|
INFO=$(qm status "$ID" --verbose)
|
||||||
|
PID=$(echo "$INFO" | awk '/^pid:/ {print $2}')
|
||||||
|
CPU="0"
|
||||||
|
if [[ "$PID" =~ ^[0-9]+$ ]]; then
|
||||||
|
CPU_LINE=$(ps -p "$PID" -o %cpu= 2>/dev/null)
|
||||||
|
CPU=$(awk -v val="${CPU_LINE:-0}" 'BEGIN {printf "%.1f", val}')
|
||||||
|
fi
|
||||||
|
[[ "$CPU" == "0.0" ]] && CPU="0"
|
||||||
|
|
||||||
|
MEM_USED=$(echo "$INFO" | awk '/^mem:/ {print int($2 / 1024 / 1024)}')
|
||||||
|
MEM_TOTAL=$(echo "$INFO" | awk '/^maxmem:/ {print int($2 / 1024 / 1024)}')
|
||||||
|
UPTIME_SEC=$(echo "$INFO" | awk '/^uptime:/ {print $2}')
|
||||||
|
UH=$((UPTIME_SEC / 3600))
|
||||||
|
UM=$((UPTIME_SEC % 3600 / 60))
|
||||||
|
if [ "$UH" -ge 24 ]; then
|
||||||
|
D=$((UH / 24))
|
||||||
|
H=$((UH % 24))
|
||||||
|
UPTIME_FMT="${D}j$(printf "%02d" $H)h"
|
||||||
|
else
|
||||||
|
UPTIME_FMT="${UH}h$(printf "%02d" $UM)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
ONLINE+="🟢 ${NAME} ${ID}
|
||||||
|
CPU ${CPU}%, RAM ${MEM_USED}/${MEM_TOTAL} Mo, Uptime: ${UPTIME_FMT}"$'\n'
|
||||||
|
else
|
||||||
|
MEM_TOTAL=$(qm config "$ID" | awk '/^memory:/ {print $2}')
|
||||||
|
[[ -z "$MEM_TOTAL" ]] && MEM_TOTAL=0
|
||||||
|
OFFLINE+="🔴 ${NAME} ${ID}
|
||||||
|
CPU 0%, RAM 0/${MEM_TOTAL} Mo, Uptime: 0h00"$'\n'
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Format message Telegram
|
||||||
|
REPORT="📊 État de PVE [${HOSTNAME}] – ${NOW}
|
||||||
|
|
||||||
|
🖥️ Hôte ${HOSTNAME}
|
||||||
|
CPU : ${CPU_USAGE} %
|
||||||
|
Charge moyenne : ${LOAD_AVG}
|
||||||
|
RAM : ${MEM_PERCENT} % (${MEM_USED} Mo / ${MEM_TOTAL} Mo)
|
||||||
|
Disque : ${DISK_PERCENT} % (${DISK_USED} / ${DISK_TOTAL})
|
||||||
|
Uptime : ${UPTIME}
|
||||||
|
|
||||||
|
📦 VM & CT :
|
||||||
|
|
||||||
|
🟢 En ligne :
|
||||||
|
${ONLINE:-Aucun}
|
||||||
|
|
||||||
|
🔴 Hors ligne :
|
||||||
|
${OFFLINE:-Aucun}
|
||||||
|
"
|
||||||
|
|
||||||
|
# Envoi Telegram
|
||||||
|
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
|
||||||
|
--data-urlencode "chat_id=${TELEGRAM_CHAT_ID}" \
|
||||||
|
--data-urlencode "text=${REPORT}"
|
||||||
Reference in New Issue
Block a user