From 1e352f4a7e7433b80851fa59267bdc6515a42db2 Mon Sep 17 00:00:00 2001 From: MacRimi Date: Fri, 20 Mar 2026 16:26:30 +0100 Subject: [PATCH] Update notification service --- AppImage/scripts/flask_server.py | 39 +++++++++++++++++----- AppImage/scripts/notification_templates.py | 10 ++++-- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/AppImage/scripts/flask_server.py b/AppImage/scripts/flask_server.py index 59f8b417..68a39d06 100644 --- a/AppImage/scripts/flask_server.py +++ b/AppImage/scripts/flask_server.py @@ -71,9 +71,10 @@ _PROXMOX_NODE_CACHE_TTL = 300 # seconds (5 minutes) def get_proxmox_node_name() -> str: """ - Retrieve the real Proxmox node name. + Retrieve the real Proxmox node name for the LOCAL node. - First tries reading from: `pvesh get /nodes` + - In a cluster, matches the local hostname against the node list - Uses an in-memory cache to avoid repeated API calls - Falls back to the short hostname if the API call fails """ @@ -85,6 +86,9 @@ def get_proxmox_node_name() -> str: if cached_name and (now - float(cached_ts)) < _PROXMOX_NODE_CACHE_TTL: return str(cached_name) + # Get local hostname for matching + local_hostname = socket.gethostname().split(".", 1)[0].lower() + # Try Proxmox API try: result = subprocess.run( @@ -98,19 +102,36 @@ def get_proxmox_node_name() -> str: if result.returncode == 0 and result.stdout: nodes = json.loads(result.stdout) if isinstance(nodes, list) and nodes: - node_name = nodes[0].get("node") - if node_name: - _PROXMOX_NODE_CACHE["name"] = node_name - _PROXMOX_NODE_CACHE["timestamp"] = now - return node_name + # In a cluster, find the node that matches local hostname + # Node names in Proxmox typically match the hostname + for node_info in nodes: + node_name = node_info.get("node", "") + if node_name.lower() == local_hostname: + _PROXMOX_NODE_CACHE["name"] = node_name + _PROXMOX_NODE_CACHE["timestamp"] = now + return node_name + + # If no exact match, try partial match (hostname might be truncated) + for node_info in nodes: + node_name = node_info.get("node", "") + if local_hostname.startswith(node_name.lower()) or node_name.lower().startswith(local_hostname): + _PROXMOX_NODE_CACHE["name"] = node_name + _PROXMOX_NODE_CACHE["timestamp"] = now + return node_name + + # Last resort: if single node cluster, use that node + if len(nodes) == 1: + node_name = nodes[0].get("node") + if node_name: + _PROXMOX_NODE_CACHE["name"] = node_name + _PROXMOX_NODE_CACHE["timestamp"] = now + return node_name except Exception as exc: logger.warning("Failed to get Proxmox node name from API: %s", exc) # Fallback: short hostname (without domain) - hostname = socket.gethostname() - short_hostname = hostname.split(".", 1)[0] - return short_hostname + return local_hostname # ------------------------------------------------------------------- diff --git a/AppImage/scripts/notification_templates.py b/AppImage/scripts/notification_templates.py index b0c7514b..8722ba7d 100644 --- a/AppImage/scripts/notification_templates.py +++ b/AppImage/scripts/notification_templates.py @@ -1406,7 +1406,8 @@ EMOJI USAGE β€” place ONE emoji at the START of EVERY non-empty line (title and ❌ failed / FAILED / error πŸ’₯ crash / collision / I/O error πŸ†˜ new critical health issue - πŸ“¦ backup started / updates available + πŸ“¦ updates available + πŸ’Ύ backup started πŸ†• new PVE version available πŸ”Ί escalated / severity increased πŸ“‹ health digest / persistent issues @@ -1436,6 +1437,7 @@ EMOJI USAGE β€” place ONE emoji at the START of EVERY non-empty line (title and βœ”οΈ status ok / success / completed ❌ status error / failed πŸ’½ size / tamaΓ±o / Grâße + πŸ’Ύ total backup size (summary line only) ⏱️ duration / tiempo / Dauer πŸ—„οΈ storage / almacenamiento / PBS πŸ—ƒοΈ archive path / ruta de archivo @@ -1459,6 +1461,8 @@ EMOJI USAGE β€” place ONE emoji at the START of EVERY non-empty line (title and 🚦 severity / severidad πŸ–₯️ node / nodo 🎯 target / destino + πŸ”Ή current version (pve_update) + 🟒 new version (pve_update) BLANK LINES FOR READABILITY β€” insert ONE blank line between logical sections within the body. Blank lines go BETWEEN groups, not before the first line or after the last line. @@ -1527,7 +1531,7 @@ EMOJI USAGE β€” place ONE emoji at the START of EVERY non-empty line (title and ⏱️ Duration: 00:01:10 πŸ—„οΈ Storage: ct/101/2026-03-17T22:04:29Z - πŸ“Š Total: 2 backups | πŸ“¦ 16.4 GiB | ⏱️ 00:05:31 + πŸ“Š Total: 2 backups | πŸ’Ύ 16.4 GiB | ⏱️ 00:05:31 EXAMPLE β€” backup partially failed (some ok, some failed): [TITLE] @@ -1546,7 +1550,7 @@ EMOJI USAGE β€” place ONE emoji at the START of EVERY non-empty line (title and πŸ’½ Size: 0 B ⏱️ Duration: 00:00:37 - πŸ“Š Total: 2 backups | ❌ 1 failed | πŸ“¦ 12.3 GiB | ⏱️ 00:04:58 + πŸ“Š Total: 2 backups | ❌ 1 failed | πŸ’Ύ 12.3 GiB | ⏱️ 00:04:58 EXAMPLE β€” disk I/O health warning: [TITLE]