Build 2026 tracker from old intro and template months

This commit is contained in:
andersen committed 2026-02-26 15:08:42 -05:00
1 parent 9ef3f3b390
commit 2e6a41bf69
4 files changed
+81

No files matched your search

Binary file not shown.
+7
View File
@@ -1,6 +1,13 @@
# Changelog
## 2026-02-26
- Added `scripts/build_2026_tracker_workbook.py` to build `2026_Nessus_Remediation_Tracker.xlsx` with:
- `Intro` sheet copied from `OLD_Tracker.xlsx`
- current generated `Remediations` and `Template` sheets
- month sheets (`January`..`December`) cloned from `Template`
- exclusion of `CVETracker`, `testing`, and historical month CVE data
- Updated 2026 workbook generation to preserve `Intro` in-place from `OLD_Tracker.xlsx` (including original sheet outline/formatting fidelity).
- Set freeze panes to `A2` on `Template` and all month sheets in `2026_Nessus_Remediation_Tracker.xlsx`.
- Added `WIKI.md` quick usage guide with setup, workbook workflow, key formats, validation, and push/mirror steps.
- Simplified `Remediations` status options to `exception`, `exception - permanent`, in-progress variants, and `resolved`.
- Added `Excepted until (date)` to `Remediations` and `Template`, with overdue-date highlighting (red) when the date has passed.
+8
View File
@@ -67,6 +67,14 @@ python3 scripts/build_tracker_workbook.py
Output file: `nessus_remediation_tracker.xlsx`
## Generate 2026 tracker workbook
```bash
python3 scripts/build_2026_tracker_workbook.py
```
Output file: `2026_Nessus_Remediation_Tracker.xlsx`
## Validate workbook output
```bash
+66
View File
@@ -0,0 +1,66 @@
#!/usr/bin/env python3
"""Build the 2026 Nessus remediation tracker workbook."""
from __future__ import annotations
from pathlib import Path
from openpyxl import load_workbook
from build_tracker_workbook import MAX_TEMPLATE_ROWS
from build_tracker_workbook import build_remediations_sheet
from build_tracker_workbook import build_template_sheet
OLD_TRACKER_FILE = Path("OLD_Tracker.xlsx")
OUTPUT_FILE = Path("2026_Nessus_Remediation_Tracker.xlsx")
MONTH_SHEETS = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
]
def main() -> None:
if not OLD_TRACKER_FILE.exists():
raise FileNotFoundError(f"Missing required input file: {OLD_TRACKER_FILE}")
wb = load_workbook(OLD_TRACKER_FILE)
if "Intro" not in wb.sheetnames:
raise ValueError(f"Sheet 'Intro' not found in {OLD_TRACKER_FILE}")
for sheet_name in list(wb.sheetnames):
if sheet_name != "Intro":
wb.remove(wb[sheet_name])
scratch = wb.create_sheet("Scratch")
wb.active = wb.index(scratch)
build_remediations_sheet(wb)
build_template_sheet(wb, MAX_TEMPLATE_ROWS)
template_ws = wb["Template"]
template_ws.freeze_panes = "A2"
for month in MONTH_SHEETS:
month_ws = wb.copy_worksheet(template_ws)
month_ws.title = month
month_ws.freeze_panes = "A2"
ordered_sheets = ["Intro", "Remediations", "Template", *MONTH_SHEETS]
wb._sheets = [wb[name] for name in ordered_sheets]
temp_output = OUTPUT_FILE.with_suffix(".tmp.xlsx")
wb.save(temp_output)
temp_output.replace(OUTPUT_FILE)
print(f"Wrote {OUTPUT_FILE}")
if __name__ == "__main__":
main()