Merge branch 'v20260209-08-veeam-vbo365-not-started' into main

This commit is contained in:
Ivo Oskamp 2026-02-09 17:26:15 +01:00
commit 596fc94e69
6 changed files with 226 additions and 2 deletions

View File

@ -1 +1 @@
v20260209-07-synology-drive-health-parser v20260209-08-veeam-vbo365-not-started

View File

@ -3,6 +3,113 @@ Changelog data structure for Backupchecks
""" """
CHANGELOG = [ 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", "version": "v0.1.24",
"date": "2026-02-09", "date": "2026-02-09",

View File

@ -1177,6 +1177,38 @@ def try_parse_veeam(msg: MailMessage) -> Tuple[bool, Dict, List[Dict]]:
} }
return True, result, [] 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) # Configuration Job detection (may not have object details)
subj_lower = subject.lower() subj_lower = subject.lower()
is_config_job = ('backup configuration job' in subj_lower) or ('configuration backup for' in html_lower) is_config_job = ('backup configuration job' in subj_lower) or ('configuration backup for' in html_lower)

View File

@ -5,6 +5,7 @@ This file documents all changes made to this project via Claude Code.
## [2026-02-09] ## [2026-02-09]
### Added ### 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 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 "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) - 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)
@ -14,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 - 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 ### 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") - 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 - Replaced real customer names in parser registry examples with generic placeholders (NTFS Auditing, QNAP Firmware Update, NAKIVO) to prevent customer information in codebase

View File

@ -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 ## v0.1.24
### Bug Fixes ### Bug Fixes

View File

@ -1 +1 @@
v0.1.24 v0.1.25