LibrePortal/scripts/backup/locations/location_loader.sh
librelad c6d92bbc58 perf(backup): drop sudo overhead from sourceBackupLocations (Phase 6)
The location_loader's find ran through runFileOp (sudo -u libreportal),
which forks a sudo shell purely for the find call. configs/backup/
locations/ is already manager-owned (not in the dockerinstall-owned
containers tree), so the sudo step adds ~50 ms of process-creation
overhead for zero security benefit.

Plain `find` now, with a tiny [[ ! -r || ! -x ]] guard that falls
back to runFileOp if someone relocates the dir to a non-traversable
location. Same observable behaviour, ~50 ms saved per CLI invocation.

This is the simpler half of Phase 6 — the libreportal_configs scan
itself was already plain-find (only ~11 ms total for 22 files). The
remaining costly scan is app_configs against /libreportal-containers/,
which legitimately needs sudo because dockerinstall owns that tree.
Precompiling its content is possible but adds invalidation complexity
(updateConfigOption writes happen at runtime) — deferred for now;
better return on simpler interventions.

Signed-off-by: librelad <librelad@digitalangels.vip>
2026-05-26 21:39:22 +01:00

29 lines
1.1 KiB
Bash

#!/bin/bash
# Source every per-location location.config file so the CFG_BACKUP_LOC_<idx>_*
# variables are available in the env. Called from the libreportal_configs
# scan path (see scripts/source/loading/scan_files.sh) so it runs at the
# same time as the rest of the config files.
sourceBackupLocations()
{
local dir
dir=$(backupLocationsDir)
[[ ! -d "$dir" ]] && return 0
# configs/backup/locations/ lives in the manager-owned configs tree (not
# the dockerinstall-owned containers tree), so a plain find works fine.
# runFileOp was adding ~50 ms of sudo-shell overhead per invocation for
# no benefit. Fall back to runFileOp only if the directory isn't readable
# for some reason (relocated tree, custom permissions, …).
local find_cmd=(find)
if [[ ! -r "$dir" || ! -x "$dir" ]] && declare -f runFileOp >/dev/null 2>&1; then
find_cmd=(runFileOp find)
fi
local cfg
while IFS= read -r -d '' cfg; do
[[ -f "$cfg" ]] && source "$cfg"
done < <("${find_cmd[@]}" "$dir" -mindepth 2 -maxdepth 2 -name location.config -type f -print0 2>/dev/null)
}