#!/bin/bash # Discovery helpers for cross-host migrate. All read-only — they query a # backup location's snapshot index, never touch live state. # # Three views, increasing specificity: # migrateDiscoverHosts — which hosts have snapshots in this location? # migrateDiscoverApps — which apps does have in this location? # migrateDiscoverAppDetail — newest snapshot + count for one host/app. # Resolve to the first enabled location when idx is unset. Returns "" if # nothing is enabled — callers should treat that as "nowhere to discover from." _migrateResolveLocation() { local idx="$1" if [[ -z "$idx" ]]; then idx=$(resticEnabledLocations | head -1) fi echo "$idx" } # List hostnames with at least one snapshot in the given location. One per line. migrateDiscoverHosts() { local idx idx=$(_migrateResolveLocation "$1") [[ -z "$idx" ]] && return 1 engineSnapshotsJson "$idx" 2>/dev/null \ | grep -o '"hostname":"[^"]*"' \ | sort -u \ | cut -d'"' -f4 } # List apps backed up by in this location. One slug per line. migrateDiscoverApps() { local idx idx=$(_migrateResolveLocation "$2") local host="$1" [[ -z "$idx" || -z "$host" ]] && return 1 engineSnapshotsJson "$idx" "" "$host" 2>/dev/null \ | grep -o '"app=[^"]*"' \ | sort -u \ | sed 's/"app=\(.*\)"/\1/' } # JSON detail for one host+app: snapshot count + latest id/date. # Output: {"host":"…","app":"…","snapshots":N,"latest_id":"…","latest_date":"…"} # Missing snapshots → snapshots=0, latest_*=null. migrateDiscoverAppDetail() { local host="$1" local app="$2" local idx idx=$(_migrateResolveLocation "$3") [[ -z "$idx" || -z "$host" || -z "$app" ]] && return 1 local json json=$(engineSnapshotsJson "$idx" "$app" "$host" 2>/dev/null) local count count=$(printf '%s' "$json" | grep -oc '"short_id":"' || echo 0) local latest_id="null" local latest_date="null" if (( count > 0 )); then # Restic prints snapshots in creation order — last one is newest. latest_id="\"$(printf '%s' "$json" \ | grep -o '"short_id":"[^"]*"' | tail -1 | cut -d'"' -f4)\"" latest_date="\"$(printf '%s' "$json" \ | grep -o '"time":"[^"]*"' | tail -1 | cut -d'"' -f4)\"" fi printf '{"host":"%s","app":"%s","loc_idx":%s,"snapshots":%s,"latest_id":%s,"latest_date":%s}\n' \ "$host" "$app" "$idx" "$count" "$latest_id" "$latest_date" } # Back-compat shim — older callers (and the existing CLI) used this name with # (idx, host) arg order. New code should call migrateDiscoverApps directly. migrateDiscoverAppsForHost() { local idx="$1" local host="$2" migrateDiscoverApps "$host" "$idx" }