From a47551724b701baf8b37e1c51d30e1ea959460ce Mon Sep 17 00:00:00 2001 From: Bastian de Byl Date: Wed, 26 Aug 2026 18:33:57 -0400 Subject: [PATCH] fix: make the Discord world reset actually delete the world The reset script died on its very first line. log() piped through tee into zomboid/logs/world-reset.log, that directory was owned by the container's subuid, and the script runs as the podman user -- so tee returned EACCES and set -e killed the run before it stopped the server or touched a save. Every `@bot` reset since had been a no-op that reported nothing. Nothing mounts zomboid/logs into a container; it only holds output from host-side helpers running as the podman user, so it is now owned by that user rather than by the subuid the container volumes need. log() no longer treats the file as load-bearing either. stdout is already captured by the journal, so an unwritable log is worth continuing past rather than aborting a wipe over. Verified end to end by writing the trigger exactly as the bot does: server stopped, saves and player database deleted, service restarted. Co-Authored-By: Claude Opus 5 (1M context) --- .../podman/tasks/containers/home/zomboid.yml | 15 ++++++++++++++- ansible/roles/podman/tasks/main.yml | 2 +- .../podman/templates/zomboid/world-reset.sh.j2 | 7 ++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/ansible/roles/podman/tasks/containers/home/zomboid.yml b/ansible/roles/podman/tasks/containers/home/zomboid.yml index d6e9c01..7a9b10f 100644 --- a/ansible/roles/podman/tasks/containers/home/zomboid.yml +++ b/ansible/roles/podman/tasks/containers/home/zomboid.yml @@ -17,7 +17,20 @@ - "{{ zomboid_path }}/server" - "{{ zomboid_path }}/data" - "{{ zomboid_path }}/scripts" - - "{{ zomboid_path }}/logs" + +# Not a container volume -- nothing mounts it. It holds output from host-side +# helpers that run as {{ podman_user }}, so it must be owned by that user rather +# than the container's subuid. Getting this wrong silently broke world resets: +# the script's first log line failed with EACCES and set -e killed it before it +# stopped the server, so `@bot` resets did nothing at all. +- name: create zomboid host-side log directory + become: true + ansible.builtin.file: + path: "{{ zomboid_path }}/logs" + state: directory + owner: "{{ podman_user }}" + group: "{{ podman_user }}" + mode: 0755 - name: create podman bin directory become: true diff --git a/ansible/roles/podman/tasks/main.yml b/ansible/roles/podman/tasks/main.yml index 324ac88..bf5ac42 100644 --- a/ansible/roles/podman/tasks/main.yml +++ b/ansible/roles/podman/tasks/main.yml @@ -123,7 +123,7 @@ - import_tasks: containers/home/gregtime.yml vars: - image: localhost/greg-time-bot:3.16.1 + image: localhost/greg-time-bot:3.16.2 tags: gregtime # Gated on zomboid_enabled (roles/podman/defaults/main.yml) so it can be taken diff --git a/ansible/roles/podman/templates/zomboid/world-reset.sh.j2 b/ansible/roles/podman/templates/zomboid/world-reset.sh.j2 index d37cb23..12fc8d2 100644 --- a/ansible/roles/podman/templates/zomboid/world-reset.sh.j2 +++ b/ansible/roles/podman/templates/zomboid/world-reset.sh.j2 @@ -11,7 +11,12 @@ SAVES_PATH="{{ podman_home }}/.local/share/volumes/zomboid/data/Saves/Multiplaye DB_PATH="{{ podman_home }}/.local/share/volumes/zomboid/data/db/${SERVER_NAME}.db" log() { - echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOGFILE" + local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $1" + echo "$msg" + # stdout is already captured by the journal; the file is a convenience. + # Never let it be fatal -- an unwritable log used to abort the whole wipe + # on the very first line, under set -e. + echo "$msg" >> "$LOGFILE" 2>/dev/null || true } # Ensure XDG_RUNTIME_DIR is set for systemctl --user