From b414b3c33818bfc46faebc55cc3709c8b9260c7b Mon Sep 17 00:00:00 2001 From: Marius Date: Tue, 30 Sep 2025 02:12:25 +0300 Subject: [PATCH] vm 107 monitor --- proxmox/vm107-monitor.sh | 69 ++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 16 deletions(-) diff --git a/proxmox/vm107-monitor.sh b/proxmox/vm107-monitor.sh index 27dd53c..8975da0 100644 --- a/proxmox/vm107-monitor.sh +++ b/proxmox/vm107-monitor.sh @@ -4,6 +4,7 @@ HOSTNAME=$(hostname) DATE=$(date '+%Y-%m-%d %H:%M:%S') VM_ID=107 LOG_FILE="/var/log/vm107-monitor.log" +STATE_FILE="/var/run/vm107-last-state" check_vm_status() { local vm_status=$(qm status $VM_ID 2>/dev/null | grep -oP 'status: \K.*') @@ -39,27 +40,63 @@ CHECK_EXIT=$? STATUS=$(echo "$RESULT" | cut -d: -f1) ERROR_TYPE=$(echo "$RESULT" | cut -d: -f2) +# Citește starea anterioară +LAST_STATE="" +[ -f "$STATE_FILE" ] && LAST_STATE=$(cat "$STATE_FILE") + echo "$(date '+%Y-%m-%d %H:%M:%S'): VM $VM_ID status: $STATUS ($ERROR_TYPE)" >> "$LOG_FILE" -if [ $CHECK_EXIT -ne 0 ]; then - SUBJECT="VM $VM_ID $STATUS on $HOSTNAME" - BODY="VM $VM_ID Status: $STATUS\n" - BODY+="Error Type: $ERROR_TYPE\n" - BODY+="Check Time: $DATE\n" - BODY+="Host: $HOSTNAME\n\n" +# Verifică dacă starea s-a schimbat +CURRENT_STATE="$STATUS:$ERROR_TYPE" + +if [ "$LAST_STATE" != "$CURRENT_STATE" ]; then + # Starea s-a schimbat - trimite email + SEND_EMAIL=true - if [ "$STATUS" = "STOPPED" ]; then - BODY+="VM is stopped. To start: qm start $VM_ID" - elif [ "$ERROR_TYPE" = "INTERNAL_ERROR" ]; then - BODY+="VM has internal-error (KVM crash)." - elif [ "$ERROR_TYPE" = "PROCESS_MISSING" ]; then - BODY+="VM marked as running but process missing." + if [ $CHECK_EXIT -eq 0 ]; then + # VM acum e OK + if [[ "$LAST_STATE" == STOPPED:* ]] || [[ "$LAST_STATE" == ERROR:* ]]; then + # Era oprit/eroare, acum e pornit - trimite email de recovery + SUBJECT="✅ VM $VM_ID RECOVERED - Running on $HOSTNAME" + BODY="VM $VM_ID has RECOVERED and is now RUNNING\n" + BODY+="Previous state: $LAST_STATE\n" + BODY+="Current state: RUNNING\n" + BODY+="Recovery time: $DATE\n" + BODY+="Host: $HOSTNAME\n\n" + BODY+="VM is now operating normally." + else + # Altă tranziție către RUNNING - nu trimite email + SEND_EMAIL=false + fi + else + # VM are probleme + SUBJECT="⚠️ VM $VM_ID $STATUS on $HOSTNAME" + BODY="VM $VM_ID Status: $STATUS\n" + BODY+="Error Type: $ERROR_TYPE\n" + BODY+="Check Time: $DATE\n" + BODY+="Host: $HOSTNAME\n\n" + + if [ "$STATUS" = "STOPPED" ]; then + BODY+="VM is stopped. To start: qm start $VM_ID" + elif [ "$ERROR_TYPE" = "INTERNAL_ERROR" ]; then + BODY+="VM has internal-error (KVM crash)." + elif [ "$ERROR_TYPE" = "PROCESS_MISSING" ]; then + BODY+="VM marked as running but process missing." + fi fi - # Trimite email simplu prin mail command - echo -e "$BODY" | mail -s "$SUBJECT" root - - echo "$(date '+%Y-%m-%d %H:%M:%S'): Email sent for VM $VM_ID $STATUS" >> "$LOG_FILE" + # Trimite email dacă e necesar + if [ "$SEND_EMAIL" = true ]; then + echo -e "$BODY" | mail -s "$SUBJECT" root + echo "$(date '+%Y-%m-%d %H:%M:%S'): Email sent - state changed from '$LAST_STATE' to '$CURRENT_STATE'" >> "$LOG_FILE" + else + echo "$(date '+%Y-%m-%d %H:%M:%S'): State changed but no email needed" >> "$LOG_FILE" + fi +else + echo "$(date '+%Y-%m-%d %H:%M:%S'): No email - state unchanged ($CURRENT_STATE)" >> "$LOG_FILE" fi +# Salvează starea curentă +echo "$CURRENT_STATE" > "$STATE_FILE" + exit $CHECK_EXIT