Warn that Asterisk restore drops the Security Dashboard's ACL grants

restore replaces every file under the Asterisk directory with a fresh
extraction from the archive (rm -rf + mv in the new tree) -- every file is
a new inode, so any POSIX ACL grants the Security Dashboard holds on them
(_secdash_grant_asterisk_access's setfacl access to .env/config/logs/spool)
are gone, and were never on the new files to begin with. Confirmed live:
surfaces as "No permission to read .../.env" in the Extensions tab right
after a restore, on a box where the dashboard was already working fine.

The restore script can't fix this itself (runs standalone, no access to
services/*.sh's functions or the dashboard's service-user name), so it now
prints a reminder to re-run `sudo ./setup.sh security-dashboard` at the end
of a restore when the dashboard's systemd unit is present, plus a matching
note in the generated README.
This commit is contained in:
Claude
2026-08-17 01:33:29 +00:00
parent d7d630386c
commit 9b03d49cec
+37
View File
@@ -704,6 +704,30 @@ case "$cmd" in
echo "working directory followed the OLD directory when it got renamed" echo "working directory followed the OLD directory when it got renamed"
echo "aside). Run 'cd $HERE' again (or open a new shell) to see the" echo "aside). Run 'cd $HERE' again (or open a new shell) to see the"
echo "restored files." echo "restored files."
# The line above replaced $HERE's whole directory tree with a fresh
# extraction from the archive — every file in it is a brand-new
# inode, so any POSIX ACL grants the Security Dashboard holds on it
# (setfacl access to .env, config/, logs/, spool/ — see
# _secdash_grant_asterisk_access in services/security-dashboard.sh)
# went away with the old directory and were never on the new one to
# begin with. Confirmed live: this shows up as "No permission to
# read .../.env" in the dashboard's Extensions tab right after a
# restore, on a box where the dashboard was already installed and
# working fine before. It isn't a bug in the dashboard, and it isn't
# anything this restore script itself can safely fix from here (it
# runs standalone, with none of services/*.sh's functions or the
# dashboard's service-user name available to it) — the one working
# fix is re-running the dashboard's own installer, which regrants
# every ACL against whatever is on disk right now.
if systemctl list-unit-files 2>/dev/null | grep -q '^security-dashboard\.service'; then
echo ""
echo "The Security Dashboard is installed on this box. This restore replaced"
echo "every file under $HERE with fresh copies from the archive, which drops"
echo "the dashboard's file-read permissions on them (Extensions tab TURN/domain"
echo "details, etc.). Re-run to restore those:"
echo " sudo ./setup.sh security-dashboard"
fi
;; ;;
*) *)
@@ -1833,6 +1857,19 @@ this box's own directory — never leaving a second, wrongly-named directory
behind that would confuse every service that resolves Asterisk's layout behind that would confuse every service that resolves Asterisk's layout
(Security Dashboard, PSTN trunk, CrowdSec's Asterisk acquisition, Caddy). (Security Dashboard, PSTN trunk, CrowdSec's Asterisk acquisition, Caddy).
If the Security Dashboard is installed, \`restore\` prints a reminder to
re-run \`sudo ./setup.sh security-dashboard\` afterward. Every file under
\`${EA_DIR}\` gets replaced with a fresh extraction from the archive — new
inodes, none of which carry the dashboard's POSIX ACL grants (read access
to \`.env\`, \`config/\`, \`logs/\`, \`spool/\` — see
\`_secdash_grant_asterisk_access\` in \`services/security-dashboard.sh\`).
Confirmed live: this shows up as "No permission to read .../.env" in the
Extensions tab right after a restore, on a box where the dashboard was
already working fine beforehand. Re-running the dashboard's own installer
regrants everything against whatever's on disk now; this restore script
can't do it itself since it runs standalone, with none of \`services/*.sh\`'s
functions or the dashboard's service-user name available to it.
## VLANs / other subnets ## VLANs / other subnets
\`.env\` → \`HAS_VLANS\`/\`VLAN_SUBNETS\` lists extra networks (space-separated \`.env\` → \`HAS_VLANS\`/\`VLAN_SUBNETS\` lists extra networks (space-separated