librelad 3319614be4 fix(webui): route the migrate.json + peers.json writes through runFileWrite
Two webui-data generators wrote to a temp file via bare `cat > "$temp_file"`
then `runFileOp mv` to the final path. The temp file's path sits inside
$containers_dir/libreportal/frontend/data/<x>/generated/ — owned by the
dockerinstall user (the data plane). The generators run as the manager,
who can't open paths under that tree for write, so every WebUI update
hit:

    webui_backup_migrate.sh: line 125: …/migrate.json.tmp.<pid>: Permission denied
    mv: cannot stat '…/migrate.json.tmp.<pid>': No such file or directory
    webui_peers.sh: line 23: …/peers.json.tmp.<pid>: Permission denied
    mv: cannot stat '…/peers.json.tmp.<pid>': No such file or directory

Pipe the heredoc through `runFileWrite "$output_file"` instead — same
shape the 5 sibling generators in this dir (backup_app_status,
backup_locations, backup_passwords, backup_snapshots, backup_dashboard)
already use. runFileWrite routes the write via the install user that
owns the data tree, so the file lands on disk in one step (no temp +
mv dance needed). The unused `local temp_file=...` declarations dropped
out cleanly.

The trailing `runFileOp chmod 644 "$output_file"` stays — it's the only
guarantee the WebUI container (which reads these files RO) sees them as
world-readable regardless of dockerinstall's umask.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Signed-off-by: librelad <librelad@digitalangels.vip>
2026-05-26 22:53:10 +01:00

34 lines
1.0 KiB
Bash

#!/bin/bash
# Generate data/peers/generated/peers.json — drives the /peers WebUI page and
# is also read by the /backup/migrate tab to overlay friendly names on top of
# bare hostnames.
#
# This is just peerList wrapped with a generated_at envelope; no extra logic.
webuiGeneratePeers()
{
local output_dir="$containers_dir/libreportal/frontend/data/peers/generated"
local output_file="$output_dir/peers.json"
runFileOp mkdir -p "$output_dir"
local generated_at
generated_at=$(date -Iseconds)
local peers
peers=$(peerList 2>/dev/null)
[[ -z "$peers" ]] && peers='[]'
# Pipe the JSON straight through runFileWrite — the previous
# `cat > "$temp_file"` redirect failed because $temp_file sits in the
# dockerinstall-owned data/ tree and the manager can't open it for write.
# The mv that followed then errored with "No such file or directory".
runFileWrite "$output_file" <<EOF
{
"generated_at": "$generated_at",
"peers": $peers
}
EOF
runFileOp chmod 644 "$output_file" 2>/dev/null || true
}