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>
34 lines
1.0 KiB
Bash
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
|
|
}
|