From 3b48cd401acc75d222c7438c650ce13bb13e8ae1 Mon Sep 17 00:00:00 2001 From: Ivo Oskamp Date: Mon, 9 Feb 2026 17:12:53 +0100 Subject: [PATCH 1/4] Add Veeam parser support for "Job did not start on schedule" error notifications Extend Veeam parser to recognize and handle error notifications when a backup job fails to start on its scheduled time. This commonly occurs when proxy servers are offline or other infrastructure issues prevent job execution. Features: - Detects "Job did not start on schedule" pattern in subject line - Extracts backup type from subject (e.g., "Veeam Backup for Microsoft 365") - Extracts job name from subject after colon (e.g., "Backup MDS at Work") - Reads error message from plain text body (handles base64 UTF-16 encoding) - Sets overall_status to "Error" for failed-to-start jobs - Example message: "Proxy server was offline at the time the job was scheduled to run." This handles VBO365 and other Veeam backup types that send plain text error notifications instead of the usual HTML formatted reports. Co-Authored-By: Claude Sonnet 4.5 --- .../src/backend/app/parsers/veeam.py | 32 +++++++++++++++++++ docs/changelog-claude.md | 1 + 2 files changed, 33 insertions(+) diff --git a/containers/backupchecks/src/backend/app/parsers/veeam.py b/containers/backupchecks/src/backend/app/parsers/veeam.py index 297220d..ddd6464 100644 --- a/containers/backupchecks/src/backend/app/parsers/veeam.py +++ b/containers/backupchecks/src/backend/app/parsers/veeam.py @@ -1177,6 +1177,38 @@ def try_parse_veeam(msg: MailMessage) -> Tuple[bool, Dict, List[Dict]]: } return True, result, [] + # Job did not start on schedule: special error notification (no objects, plain text body). + # Example subject: "[Veeam Backup for Microsoft 365] Job did not start on schedule: Backup MDS at Work" + subject_lower = subject.lower() + if 'job did not start on schedule' in subject_lower: + # Extract backup type from subject (e.g., "Veeam Backup for Microsoft 365") + backup_type = None + for candidate in VEEAM_BACKUP_TYPES: + if candidate.lower() in subject_lower: + backup_type = candidate + break + if not backup_type: + backup_type = "Backup Job" + + # Extract job name after the colon (e.g., "Backup MDS at Work") + job_name = None + m_job = re.search(r'job did not start on schedule:\s*(.+)$', subject, re.IGNORECASE) + if m_job: + job_name = (m_job.group(1) or '').strip() + + # Get overall message from text_body (can be base64 encoded) + text_body = (getattr(msg, 'text_body', None) or '').strip() + overall_message = text_body if text_body else 'Job did not start on schedule' + + result = { + 'backup_software': 'Veeam', + 'backup_type': backup_type, + 'job_name': job_name or 'Unknown Job', + 'overall_status': 'Error', + 'overall_message': overall_message, + } + return True, result, [] + # Configuration Job detection (may not have object details) subj_lower = subject.lower() is_config_job = ('backup configuration job' in subj_lower) or ('configuration backup for' in html_lower) diff --git a/docs/changelog-claude.md b/docs/changelog-claude.md index 737a6f0..112ba3f 100644 --- a/docs/changelog-claude.md +++ b/docs/changelog-claude.md @@ -5,6 +5,7 @@ This file documents all changes made to this project via Claude Code. ## [2026-02-09] ### Added +- Extended Veeam parser to recognize "Job did not start on schedule" error notifications for Veeam Backup for Microsoft 365 (and other Veeam backup types) with job name extraction from subject and error message from plain text body (proxy server offline, scheduled run failed) - Added parser for Synology monthly drive health reports (backup software: Synology, backup type: Health Report, job name: Monthly Drive Health, informational only, no schedule learning) with support for both Dutch and English notifications ("schijfintegriteitsrapport"/"Drive Health Report") and automatic status detection (Healthy/Gezond → Success, problems → Warning) - Added "Cleanup orphaned jobs" maintenance option in Settings → Maintenance to delete jobs without valid customer links and their associated emails/runs permanently from database (useful when customers are removed) - Added "Preview orphaned jobs" button to show detailed list of jobs to be deleted with run/email counts before confirming deletion (verification step for safety) From acb9fbb0eabe311f8ba5b69f27f45a81c36aad30 Mon Sep 17 00:00:00 2001 From: Ivo Oskamp Date: Mon, 9 Feb 2026 17:13:17 +0100 Subject: [PATCH 2/4] Auto-commit local changes before build (2026-02-09 17:13:17) --- .last-branch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.last-branch b/.last-branch index f28f3a0..96fe18a 100644 --- a/.last-branch +++ b/.last-branch @@ -1 +1 @@ -v20260209-07-synology-drive-health-parser +v20260209-08-veeam-vbo365-not-started From 57196948a7ab7a7c91d615ea0ebe4ad919234851 Mon Sep 17 00:00:00 2001 From: Ivo Oskamp Date: Mon, 9 Feb 2026 17:17:47 +0100 Subject: [PATCH 3/4] Add v0.1.25 to website changelog Update changelog.md and changelog.py with comprehensive v0.1.25 release notes consolidating all changes from 2026-02-09: Sections: - Parser Enhancements: Synology (Drive Health, DSM Updates, ABB Skipped) and Veeam (Job Not Started) - Maintenance Improvements: Orphaned Jobs Cleanup, Test Email Generation - Data Privacy: Parser Registry Cleanup, Autotask Title Simplification - Bug Fixes: Responsive Navbar Overlap Fix This release focuses on parser coverage expansion and system maintenance capabilities while improving data privacy practices. Co-Authored-By: Claude Sonnet 4.5 --- .../backupchecks/src/backend/app/changelog.py | 107 ++++++++++++++++++ docs/changelog-claude.md | 2 + docs/changelog.md | 82 ++++++++++++++ 3 files changed, 191 insertions(+) diff --git a/containers/backupchecks/src/backend/app/changelog.py b/containers/backupchecks/src/backend/app/changelog.py index 4635aef..be83c4e 100644 --- a/containers/backupchecks/src/backend/app/changelog.py +++ b/containers/backupchecks/src/backend/app/changelog.py @@ -3,6 +3,113 @@ Changelog data structure for Backupchecks """ CHANGELOG = [ + { + "version": "v0.1.25", + "date": "2026-02-09", + "summary": "This release focuses on parser improvements and maintenance enhancements, adding support for new notification types across Synology and Veeam backup systems while improving system usability with orphaned job cleanup and test email generation features.", + "sections": [ + { + "title": "Parser Enhancements", + "type": "feature", + "subsections": [ + { + "subtitle": "Synology Parsers", + "changes": [ + "Monthly Drive Health Reports: New parser for Synology NAS drive health notifications with Dutch and English support", + "Supports 'Maandelijks schijfintegriteitsrapport' (Dutch) and 'Monthly Drive Health Report' (English) variants", + "Automatic status detection: Healthy/Gezond/No problem detected → Success, otherwise → Warning", + "Extracts hostname from subject or body pattern (Van/From NAS-HOSTNAME)", + "Backup type: 'Health Report', Job name: 'Monthly Drive Health' (informational only, excluded from schedule learning)", + "DSM Update Notifications - Extended Coverage: Added 4 new detection patterns for automatic installation announcements", + "New patterns: 'belangrijke DSM-update', 'kritieke oplossingen', 'wordt automatisch geïnstalleerd', 'is beschikbaar op'", + "Now recognizes 4 notification types: update cancelled, packages out-of-date, new update available, automatic installation scheduled", + "All patterns added to existing lists maintaining full backward compatibility", + "Active Backup for Business - Skipped Tasks: Extended parser to recognize skipped/ignored backup tasks", + "Detects Dutch ('genegeerd') and English ('skipped', 'ignored') status indicators as Warning status", + "Common scenario: Backup skipped because previous backup still running" + ] + }, + { + "subtitle": "Veeam Parsers", + "changes": [ + "Job Not Started Errors: New detection for 'Job did not start on schedule' error notifications", + "Recognizes VBO365 and other Veeam backup types that send plain text error notifications", + "Extracts backup type from subject (e.g., 'Veeam Backup for Microsoft 365')", + "Extracts job name from subject after colon (e.g., 'Backup MDS at Work')", + "Reads error message from plain text body (handles base64 UTF-16 encoding)", + "Sets overall_status to 'Error' for failed-to-start jobs", + "Example messages: 'Proxy server was offline at the time the job was scheduled to run.'" + ] + } + ] + }, + { + "title": "Maintenance Improvements", + "type": "feature", + "subsections": [ + { + "subtitle": "Orphaned Jobs Cleanup", + "changes": [ + "Added 'Cleanup orphaned jobs' option in Settings → Maintenance", + "Removes jobs without valid customer links (useful when customers are deleted)", + "Permanently deletes job records along with all associated emails and job runs", + "'Preview orphaned jobs' button shows detailed list before deletion with email and run counts", + "Safety verification step to prevent accidental deletion" + ] + }, + { + "subtitle": "Test Email Generation", + "changes": [ + "Added 'Generate test emails' feature in Settings → Maintenance", + "Three separate buttons to create fixed test email sets: Success, Warning, Error", + "Each set contains exactly 3 Veeam Backup Job emails with same job name 'Test-Backup-Job'", + "Different dates, objects, and statuses for reproducible testing scenarios", + "Proper status flow testing (success → warning → error progression)" + ] + } + ] + }, + { + "title": "Data Privacy", + "type": "improvement", + "subsections": [ + { + "subtitle": "Parser Registry Cleanup", + "changes": [ + "Replaced real customer names in parser registry examples with generic placeholders", + "Affected parsers: NTFS Auditing, QNAP Firmware Update, NAKIVO", + "Example format now uses: NAS-HOSTNAME, SERVER-HOSTNAME, VM-HOSTNAME, example.local", + "Ensures no customer information in codebase or version control" + ] + }, + { + "subtitle": "Autotask Integration", + "changes": [ + "Removed customer name from Autotask ticket title for concise display", + "Format changed from '[Backupchecks] Customer - Job Name - Status' to '[Backupchecks] Job Name - Status'", + "Reduces redundancy (customer already visible in ticket company field)" + ] + } + ] + }, + { + "title": "Bug Fixes", + "type": "bugfix", + "subsections": [ + { + "subtitle": "User Interface", + "changes": [ + "Fixed responsive navbar overlapping page content on smaller screens", + "Implemented dynamic padding adjustment using JavaScript", + "Measures actual navbar height on page load, window resize, and navbar collapse toggle", + "Automatically adjusts main content padding-top to prevent overlap", + "Debounced resize handler for performance" + ] + } + ] + } + ] + }, { "version": "v0.1.24", "date": "2026-02-09", diff --git a/docs/changelog-claude.md b/docs/changelog-claude.md index 112ba3f..e2e807c 100644 --- a/docs/changelog-claude.md +++ b/docs/changelog-claude.md @@ -15,6 +15,8 @@ This file documents all changes made to this project via Claude Code. - 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 +- Updated `docs/changelog.md` with comprehensive v0.1.25 release notes consolidating all changes from 2026-02-09 (Parser Enhancements for Synology and Veeam, Maintenance Improvements, Data Privacy, Bug Fixes) +- Updated `containers/backupchecks/src/backend/app/changelog.py` with v0.1.25 entry in Python structure for website display (4 sections with subsections matching changelog.md content) - Removed customer name from Autotask ticket title to keep titles concise (format changed from "[Backupchecks] Customer - Job Name - Status" to "[Backupchecks] Job Name - Status") - Replaced real customer names in parser registry examples with generic placeholders (NTFS Auditing, QNAP Firmware Update, NAKIVO) to prevent customer information in codebase diff --git a/docs/changelog.md b/docs/changelog.md index f85a124..bd181a5 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,3 +1,85 @@ +## v0.1.25 + +This release focuses on parser improvements and maintenance enhancements, adding support for new notification types across Synology and Veeam backup systems while improving system usability with orphaned job cleanup and test email generation features. + +### Parser Enhancements + +**Synology Parsers:** +- **Monthly Drive Health Reports**: New parser for Synology NAS drive health notifications + - Supports both Dutch ("Maandelijks schijfintegriteitsrapport", "Gezond") and English ("Monthly Drive Health Report", "Healthy") variants + - Automatic status detection: Healthy/Gezond/No problem detected → Success, otherwise → Warning + - Extracts hostname from subject or body pattern (Van/From NAS-HOSTNAME) + - Backup type: "Health Report", Job name: "Monthly Drive Health" + - Informational only (excluded from schedule learning and reporting logic) + - Registry entry added (order 237) for /parsers page visibility + +- **DSM Update Notifications - Extended Coverage**: Added support for additional DSM update notification variants + - New patterns: "belangrijke DSM-update", "kritieke oplossingen", "wordt automatisch geïnstalleerd", "is beschikbaar op" + - Now recognizes 4 different notification types under same job: + 1. Automatic update cancelled + 2. Packages out-of-date warnings + 3. New update available announcements + 4. Automatic installation scheduled notifications + - All patterns added to existing lists maintaining full backward compatibility + +- **Active Backup for Business - Skipped Tasks**: Extended parser to recognize skipped/ignored backup tasks + - Detects Dutch ("genegeerd") and English ("skipped", "ignored") status indicators + - Status mapping: Skipped/Ignored → Warning with "Skipped" message + - Common scenario: Backup skipped because previous backup still running + +**Veeam Parsers:** +- **Job Not Started Errors**: New detection for "Job did not start on schedule" error notifications + - Recognizes VBO365 and other Veeam backup types that send plain text error notifications + - Extracts backup type from subject (e.g., "Veeam Backup for Microsoft 365") + - Extracts job name from subject after colon (e.g., "Backup MDS at Work") + - Reads error message from plain text body (handles base64 UTF-16 encoding) + - Sets overall_status to "Error" for failed-to-start jobs + - Example messages: "Proxy server was offline at the time the job was scheduled to run." + +### Maintenance Improvements + +**Orphaned Jobs Cleanup:** +- Added "Cleanup orphaned jobs" option in Settings → Maintenance +- Removes jobs without valid customer links (useful when customers are deleted) +- Permanently deletes job records along with all associated emails and job runs +- "Preview orphaned jobs" button shows detailed list before deletion + - Displays job information with email and run counts + - Safety verification step to prevent accidental deletion + +**Test Email Generation:** +- Added "Generate test emails" feature in Settings → Maintenance +- Three separate buttons to create fixed test email sets for parser testing: + - Success emails (3 emails with success status) + - Warning emails (3 emails with warning status) + - Error emails (3 emails with error status) +- Each set contains exactly 3 Veeam Backup Job emails with: + - Same job name "Test-Backup-Job" for consistency + - Different dates, objects, and statuses + - Reproducible testing scenarios + - Proper status flow testing (success → warning → error progression) + +### Data Privacy + +**Parser Registry Cleanup:** +- Replaced real customer names in parser registry examples with generic placeholders +- Affected parsers: NTFS Auditing, QNAP Firmware Update, NAKIVO +- Example format now uses: NAS-HOSTNAME, SERVER-HOSTNAME, VM-HOSTNAME, example.local +- Ensures no customer information in codebase or version control + +**Autotask Integration:** +- Removed customer name from Autotask ticket title for concise display +- Format changed from "[Backupchecks] Customer - Job Name - Status" to "[Backupchecks] Job Name - Status" +- Reduces redundancy (customer already visible in ticket company field) + +### Bug Fixes + +**User Interface:** +- Fixed responsive navbar overlapping page content on smaller screens + - Implemented dynamic padding adjustment using JavaScript + - Measures actual navbar height on page load, window resize, and navbar collapse toggle + - Automatically adjusts main content padding-top to prevent overlap + - Debounced resize handler for performance + ## v0.1.24 ### Bug Fixes From d7f6de7c23d4a46a39c7dcaa86ca837ea96e9daa Mon Sep 17 00:00:00 2001 From: Ivo Oskamp Date: Mon, 9 Feb 2026 17:21:39 +0100 Subject: [PATCH 4/4] Release v0.1.25 on branch v20260209-08-veeam-vbo365-not-started (bump type 1) --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 9b95a5f..3e9fab8 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -v0.1.24 +v0.1.25