diff --git a/containers/backupchecks/src/backend/app/parsers/synology.py b/containers/backupchecks/src/backend/app/parsers/synology.py index 05339ab..8671df9 100644 --- a/containers/backupchecks/src/backend/app/parsers/synology.py +++ b/containers/backupchecks/src/backend/app/parsers/synology.py @@ -185,12 +185,14 @@ _ABB_SUBJECT_RE = re.compile(r"\bactive\s+backup\s+for\s+business\b", re.I) # Examples (NL): # "De back-uptaak vSphere-Task-1 op KANTOOR-NEW is voltooid." # "Virtuele machine back-uptaak vSphere-Task-1 op KANTOOR-NEW is gedeeltelijk voltooid." +# "back-uptaak vSphere-Task-1 op KANTOOR-NEW is genegeerd" # Examples (EN): # "The backup task vSphere-Task-1 on KANTOOR-NEW has completed." # "Virtual machine backup task vSphere-Task-1 on KANTOOR-NEW partially completed." +# "backup task vSphere-Task-1 on KANTOOR-NEW was skipped" _ABB_COMPLETED_RE = re.compile( - r"\b(?:virtuele\s+machine\s+)?(?:de\s+)?back-?up\s*taak\s+(?P.+?)\s+op\s+(?P[A-Za-z0-9._-]+)\s+is\s+(?Pvoltooid|gedeeltelijk\s+voltooid)\b" - r"|\b(?:virtual\s+machine\s+)?(?:the\s+)?back-?up\s+task\s+(?P.+?)\s+on\s+(?P[A-Za-z0-9._-]+)\s+(?:is\s+)?(?Pcompleted|finished|has\s+completed|partially\s+completed)\b", + r"\b(?:virtuele\s+machine\s+)?(?:de\s+)?back-?up\s*(?:taak|job)\s+(?:van\s+deze\s+taak\s+)?(?P.+?)\s+op\s+(?P[A-Za-z0-9._-]+)\s+is\s+(?Pvoltooid|gedeeltelijk\s+voltooid|genegeerd)\b" + r"|\b(?:virtual\s+machine\s+)?(?:the\s+)?back-?up\s+(?:task|job)\s+(?P.+?)\s+on\s+(?P[A-Za-z0-9._-]+)\s+(?:is\s+|was\s+)?(?Pcompleted|finished|has\s+completed|partially\s+completed|skipped|ignored)\b", re.I, ) @@ -242,6 +244,11 @@ def _parse_active_backup_for_business(subject: str, text: str) -> Tuple[bool, Di overall_status = "Warning" overall_message = "Partially completed" + # "genegeerd" / "skipped" / "ignored" should be treated as Warning + if "genegeerd" in status_raw or "skipped" in status_raw or "ignored" in status_raw: + overall_status = "Warning" + overall_message = "Skipped" + # Explicit failure wording overrides everything if _ABB_FAILED_RE.search(haystack): overall_status = "Error" diff --git a/docs/changelog-claude.md b/docs/changelog-claude.md index 584676f..7775c28 100644 --- a/docs/changelog-claude.md +++ b/docs/changelog-claude.md @@ -10,6 +10,7 @@ This file documents all changes made to this project via Claude Code. - Added "Generate test emails" feature in Settings → Maintenance with three separate buttons to create fixed test email sets (success/warning/error) in inbox for testing parsers and maintenance operations (each set contains exactly 3 Veeam Backup Job emails with the same job name "Test-Backup-Job" and different dates/objects/statuses for reproducible testing and proper status flow testing) - Added parser registry entry for Synology DSM automatic update cancelled notifications (backup software: Synology, backup type: Updates, informational only, no schedule learning) - Extended Synology DSM update parser with additional detection patterns ("Automatische DSM-update", "DSM-update op", "Packages on", "out-of-date", "Package Center", "new DSM update", "Auto Update has detected", "Update & Restore") and hostname extraction regex to recognize DSM update cancelled, out-of-date packages, and new update available notifications under same Updates job type while maintaining backward compatibility with existing patterns +- Extended Synology Active Backup for Business parser to recognize skipped/ignored backup tasks ("genegeerd", "skipped", "ignored") as Warning status when backup was skipped due to previous backup still running ### Changed - Removed customer name from Autotask ticket title to keep titles concise (format changed from "[Backupchecks] Customer - Job Name - Status" to "[Backupchecks] Job Name - Status")