From c4f23ab21b5e3c2babf5220e6165c2a77b047eeb Mon Sep 17 00:00:00 2001 From: Paul Jickling Date: Tue, 7 Jul 2026 15:25:52 -0400 Subject: [PATCH] add mattermost webhook function --- tracker.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tracker.py b/tracker.py index 630ffa1..d0e84f6 100644 --- a/tracker.py +++ b/tracker.py @@ -43,10 +43,21 @@ def build_entry(vm: dict) -> dict: } +def notify_mattermost(webhook_url: str, expiring_soon: list[dict], days: int) -> None: + lines = [f"#### {len(expiring_soon)} VM(s) expiring within the next {days} days"] + for vm in expiring_soon: + lines.append( + f"- [{vm['name']}]({vm['netbox_url']}) ({vm['tenant']}) — expires {vm['expire_date']}" + ) + resp = requests.post(webhook_url, json={"text": "\n".join(lines)}, timeout=30) + resp.raise_for_status() + + def main() -> None: token = os.environ["NETBOX_TOKEN"] netbox_url = os.environ.get("NETBOX_URL", "https://netbox.ethquokkaops.io").rstrip("/") expiring_soon_days = int(os.environ.get("EXPIRING_SOON_DAYS", "7")) + mm_webhook_url = os.environ.get("MM_WEBHOOK_URL") today = datetime.now(timezone.utc).date() try: @@ -94,6 +105,14 @@ def main() -> None: "no_expiry": no_expiry, }, indent=2)) + if mm_webhook_url and expiring_soon: + try: + notify_mattermost(mm_webhook_url, expiring_soon, expiring_soon_days) + except requests.exceptions.RequestException as e: + log.error(f"Mattermost webhook request failed: {e}") + raise SystemExit(1) + log.info(f"Notified Mattermost about {len(expiring_soon)} expiring VM(s)") + if __name__ == "__main__": main()