#!/bin/bash restoreFirstRunDiscover() { local idx="$1" if ! resticLocationEnabled "$idx"; then isError "Location $idx is not enabled" return 1 fi resticEnvExport "$idx" || return 1 # Via runBackupOp rather than its own sudo: this was the one backup-engine # call bypassing that funnel, so it silently missed the -E fix for sudo-rs # (and the -H that puts restic's cache under the backup user's HOME). runBackupOp restic snapshots --tag engine=libreportal --json --no-lock 2>/dev/null local rc=$? resticEnvUnset return $rc } # Restore a host's apps onto this machine. # # With no app list this is a WHOLE-HOST restore: the apps are discovered from # the repository and filtered through the preflight. Both halves matter. # # Discovery, because an explicit list has to survive the CLI wrapper's fixed # positional slots to get here — a 13-app restore arrived as four, restored # those, and reported success. The wrapper now forwards the real argv, but a # whole-host restore that never builds a list cannot be truncated at all. # # The preflight, because the installer prints its report in a separate process, # so the decision it made there is gone by the time this runs. Without # re-applying it, an app the user was told would be skipped — one this version # no longer ships, or one too big for the disk — gets restored anyway. restoreFirstRunBulk() { local idx="$1" local source_host="$2" shift 2 local apps_to_restore=("$@") local -i preflighted=0 if [[ ${#apps_to_restore[@]} -eq 0 ]]; then restorePreflightReport "$idx" "$source_host" >/dev/null 2>&1 apps_to_restore=("${RESTORE_PREFLIGHT_OK[@]}") preflighted=1 fi if [[ ${#apps_to_restore[@]} -eq 0 ]]; then isError "No apps to restore for '$source_host' in this repository" return 1 fi isHeader "First-run bulk restore from $(resticLocationName "$idx") (host=$source_host)" (( preflighted )) && isNotice "Restoring ${#apps_to_restore[@]} apps the preflight approved." # Count what actually landed. A per-app failure must not be reported as a # complete restore — that is how "4 apps restored" read as success when # nine had gone missing. local app local -i ok=0 bad=0 local -a failed=() for app in "${apps_to_restore[@]}"; do if restoreAppStart "$app" "latest" "$idx" "$source_host"; then ok=$(( ok + 1 )) else bad=$(( bad + 1 )); failed+=("$app") fi done if (( bad > 0 )); then isError "First-run restore finished with failures — $ok of ${#apps_to_restore[@]} restored" isNotice "Failed: ${failed[*]}" return 1 fi isSuccessful "First-run restore complete — $ok apps restored" return 0 }