Reverts the 2>/dev/null band-aids and fixes the root cause. The manager-run install boot scans app configs under /docker/containers AS the container user (runFileOp). But init.sh's initFolders creates that dir manager-owned, and the handover to the container user happened later (start_preinstall), AFTER the boot scans — so the scans ran as the container user against a dir it didn't own yet: "find: '/docker/containers/': Permission denied" (cosmetic; the dir is empty that early, but it's the wrong ownership at the wrong time). Add initContainerLayer() to init.sh's root phase (after initGIT + initUpdateConfigs, before the manager-run handoff): rootless-only, it creates the docker-install user if missing and chowns /docker/containers to it (751). The later rootless setup is now idempotent — it finds the user existing and just (re)asserts its password + daemon config (moved updateDockerInstallPassword out of the create-only branch). Rooted is unaffected (containers stay manager-owned, which the manager reads). Result: by the time the boot scans run, /docker/containers is owned by the user doing the scanning — no permission error, nothing suppressed. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> Signed-off-by: librelad <librelad@digitalangels.vip>
74 lines
2.9 KiB
Bash
Executable File
74 lines
2.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
sourceScanFiles()
|
|
{
|
|
local load_type="$1"
|
|
local file_pattern
|
|
|
|
# Specific LibrePortal config files
|
|
if [ "$load_type" = "libreportal_configs" ]; then
|
|
# Load new subdirectory config files only (no more old structure fallback)
|
|
local folder_dir="$configs_dir"
|
|
|
|
# Load new subdirectory config files with exclusions
|
|
while IFS= read -r -d '' file; do
|
|
if [ -f "$file" ]; then
|
|
local filename=$(basename "$file")
|
|
local should_load=true
|
|
|
|
# Skip .category files and excluded files
|
|
if [[ "$file" =~ \.category$ ]] || [[ "$filename" == "app_categories" ]]; then
|
|
should_load=false
|
|
fi
|
|
|
|
if [ "$should_load" = true ]; then
|
|
source "$file"
|
|
# echo "$load_type NEW FILE $file"
|
|
fi
|
|
fi
|
|
done < <(find "$folder_dir" -maxdepth 2 -type f ! -name "*.category" ! -name "config_*" ! -name ".*" -print0)
|
|
|
|
# Per-location backup configs live nested at depth 3
|
|
# (configs/backup/locations/<idx>/location.config) — source them via
|
|
# the dedicated loader so CFG_BACKUP_LOC_<idx>_* vars are populated.
|
|
if declare -f sourceBackupLocations >/dev/null 2>&1; then
|
|
sourceBackupLocations
|
|
fi
|
|
|
|
# Specific for LibrePortal app container configs
|
|
elif [ "$load_type" = "app_configs" ]; then
|
|
local file_pattern="*.config"
|
|
local folder_dir="$containers_dir"
|
|
|
|
# Specific for LibrePortal app install scripts
|
|
elif [ "$load_type" = "containers" ]; then
|
|
local file_pattern="*.sh"
|
|
local folder_dir="$install_containers_dir"
|
|
else
|
|
echo "Invalid load type: $load_type"
|
|
fi
|
|
|
|
# Scanning function for other types (not libreportal_configs).
|
|
# app_configs live under /docker/containers (owned by the docker install user
|
|
# and not list-readable by the manager), so enumerate them AS that user via
|
|
# runFileOp; the manager still sources each (the .config files are o+r). The
|
|
# 'containers' install templates are manager-owned, so a plain find suffices.
|
|
if [ "$load_type" != "libreportal_configs" ]; then
|
|
local scan_op=""
|
|
[[ "$load_type" == "app_configs" ]] && scan_op="runFileOp"
|
|
while IFS= read -r -d '' file; do
|
|
if [ -f "$file" ]; then
|
|
source "$file"
|
|
# echo "$load_type FILE $file"
|
|
fi
|
|
done < <($scan_op find "$folder_dir" -maxdepth 3 -type d \( -name 'resources' \) -prune -o -type f -name "$file_pattern" -print0)
|
|
fi
|
|
|
|
# Load the categories from the file into an array
|
|
if [ "$load_type" = "libreportal_configs" ]; then
|
|
if [ -f "$configs_dir/app_categories" ]; then
|
|
mapfile -t app_categories < $configs_dir/app_categories
|
|
fi
|
|
fi
|
|
}
|