Send access log (GUI Proxmox

apoile

New Member
Jan 15, 2024
1
0
1
Hello everyone, I hope to do something appreciated by sharing this script, which allows sending a message on telegram for each access to the proxmox gui.
#!/bin/bash

TELEGRAM_BOT_TOKEN="YOUR TOKEN"
TELEGRAM_CHAT_ID="YOUR CHAT ID"
LAST_LOG_FILE="/root/last_pve_login.log"


# Funzione per codificare HTML in Bash usando Python
html_encode() {
python3 -c "import sys; from html import escape; print(escape(sys.stdin.read()))"
}

# Recupera il timestamp dell'ultimo accesso analizzato
if [[ -f "$LAST_LOG_FILE" ]]; then
LAST_TIMESTAMP=$(cat "$LAST_LOG_FILE" 2>/dev/null || echo 0)
else
LAST_TIMESTAMP=0
fi

# Se è vuoto, impostiamo "un'ora fa"
if [ -z "$LAST_TIMESTAMP" ] || [ "$LAST_TIMESTAMP" -eq 0 ]; then
LAST_TIMESTAMP=$(date +%s -d "1 hour ago")
fi

echo "Monitoraggio attivo da timestamp: $LAST_TIMESTAMP"

# Monitoriamo solo i log nuovi
sudo journalctl -u pvedaemon -o cat -f --since "@$LAST_TIMESTAMP" | grep --line-buffered -E "successful auth for user|authentication failure" | while read -r line; do
NEW_TIMESTAMP=$(date +%s)
USER=$(echo "$line" | grep -oP "user '?\K[^' ]+")
LOG_DATE=$(echo "$line" | grep -oP '\[\K[^\]]+')

if [[ "$line" == *"successful auth for user"* ]]; then
IP=$(echo "$line" | grep -oP "from IP '\K[^']+" || echo "Sconosciuto")
STATUS="✅ Accesso riuscito"
else
IP=$(echo "$line" | grep -oP "rhost=\K[^ ]+" || echo "Sconosciuto")
STATUS="❌ Accesso fallito"
fi

# Se IP è ancora sconosciuto, proviamo a recuperarlo dai log di "pveproxy"
if [[ "$IP" == "Sconosciuto" ]]; then
LAST_IP=$(sudo grep "$LOG_DATE" /var/log/pveproxy/access.log | grep " $USER " | tail -n 1 | grep -oP '(?<=::ffff:)\d+\.\d+\.\d+\.\d+')
if [[ -n "$LAST_IP" ]]; then
IP="$LAST_IP"
fi
fi

# Escape sicuro per Telegram
USER_ESCAPED=$(echo "$USER" | html_encode)
IP_ESCAPED=$(echo "$IP" | html_encode)

# Il log deve essere HTML-escaped
LOG_ESCAPED=$(echo "$line" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')

# Costruiamo il messaggio per Telegram
MESSAGE=$(cat <<EOF
<b> Tentativo di accesso a Proxmox</b>

<b>Stato:</b> $STATUS
<b>Utente:</b> $USER_ESCAPED
<b>IP:</b> $IP_ESCAPED

<b>Log:</b>
$LOG_ESCAPED
EOF
)

# Invia il messaggio a Telegram senza --data-urlencode
RESPONSE=$(curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage" \
-d chat_id="$TELEGRAM_CHAT_ID" \
-d parse_mode="HTML" \
-d text="$MESSAGE")

if echo "$RESPONSE" | jq -e '.ok == true' >/dev/null; then
echo "Messaggio Telegram inviato con successo!"
else
echo "Errore nell'invio del messaggio Telegram. Risposta: $RESPONSE"
fi

echo "$NEW_TIMESTAMP" > "$LAST_LOG_FILE"
done