From f6f9d550bc8f448bf48837660b20eea8078e5e7d Mon Sep 17 00:00:00 2001 From: Konstantin Renner Date: Tue, 7 Jul 2026 11:39:07 +0200 Subject: [PATCH] edge-host: fix settings-backup terminator check (trailing newline) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The zwave-js settings backup guard in #120 checked `tail -c1 == "}"`, but settings.json ends with "}\n" — so the last byte is a newline and the guard always skipped ("not }-terminated"), producing no backup. Strip trailing whitespace before the check so a valid, newline-terminated file is backed up while a genuinely truncated one is still rejected. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../roles/edge-host/templates/edge-zwave-settings-backup.j2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ansible/roles/edge-host/templates/edge-zwave-settings-backup.j2 b/ansible/roles/edge-host/templates/edge-zwave-settings-backup.j2 index 3f55c0fe..864288a3 100644 --- a/ansible/roles/edge-host/templates/edge-zwave-settings-backup.j2 +++ b/ansible/roles/edge-host/templates/edge-zwave-settings-backup.j2 @@ -11,8 +11,9 @@ bak="$src.bak" # Only back up a plausibly-intact file: non-empty and JSON-object-terminated. # This avoids overwriting a good backup with a truncated (mid-write) file. +# Ignore trailing whitespace — settings.json ends with "}\n". [ -s "$src" ] || { echo "settings.json missing/empty — skip"; exit 0; } -[ "$(tail -c1 "$src")" = "}" ] || { echo "settings.json not }-terminated (mid-write?) — skip"; exit 0; } +[ "$(tail -c 64 "$src" | tr -d '[:space:]' | tail -c1)" = "}" ] || { echo "settings.json not }-terminated (mid-write?) — skip"; exit 0; } # Skip if unchanged since the last backup. if [ -f "$bak" ] && cmp -s "$src" "$bak"; then -- 2.54.0