#!/usr/bin/env bash # lib/cloud.sh — cloud storage provider abstraction. # Resolves SSR_CLOUD_DIR based on SSR_CLOUD_PROVIDER from config. ssr::cloud::resolve_dir() { local provider="${SSR_CLOUD_PROVIDER:-icloud}" custom="${SSR_CLOUD_PATH:-}" case "$provider" in icloud) printf '%s\n' "$HOME/Library/Mobile Documents/com~apple~CloudDocs" ;; dropbox) if [[ -d "$HOME/Library/CloudStorage" ]]; then find "$HOME/Library/CloudStorage" -maxdepth 1 -type d -name 'Dropbox*' -print -quit 2>/dev/null \ || printf '%s\n' "$HOME/Dropbox" else printf '%s\n' "$HOME/Dropbox" fi ;; googledrive) find "$HOME/Library/CloudStorage" -maxdepth 1 -type d -name 'GoogleDrive-*' -print -quit 2>/dev/null \ || ssr::die "Google Drive folder not found under ~/Library/CloudStorage" ;; onedrive) find "$HOME/Library/CloudStorage" -maxdepth 1 -type d -name 'OneDrive-*' -print -quit 2>/dev/null \ || ssr::die "OneDrive folder not found under ~/Library/CloudStorage" ;; custom) [[ -n "$custom" ]] || ssr::die "SSR_CLOUD_PROVIDER=custom requires SSR_CLOUD_PATH" printf '%s\n' "$custom" ;; *) ssr::die "Unknown SSR_CLOUD_PROVIDER: $provider (use: icloud|dropbox|googledrive|onedrive|custom)" ;; esac } # Returns the per-host backup directory under the cloud root. ssr::cloud::backup_dir() { local cloud host uuid cloud="$(ssr::cloud::resolve_dir)" host="$(hostname -s)" uuid="$(/usr/sbin/system_profiler SPHardwareDataType 2>/dev/null \ | awk '/Hardware UUID/ { print $3 }')" [[ -n "$uuid" ]] || uuid="no-uuid" local subdir="${SSR_BACKUP_SUBDIR:-BACKUP}" printf '%s/%s/%s - %s\n' "$cloud" "$subdir" "$host" "$uuid" } # Parent directory for Mackup file_system storage: same cloud subfolder as # per-host backups (SSR_BACKUP_SUBDIR). ~/.mackup.cfg sets path= and # directory=mackup — Mackup places files under /mackup/ (not SSR-controlled). ssr::cloud::mackup_dir() { local cloud subdir cloud="$(ssr::cloud::resolve_dir)" subdir="${SSR_BACKUP_SUBDIR:-BACKUP}" printf '%s/%s\n' "$cloud" "$subdir" } ssr::cloud::ensure_available() { local cloud cloud="$(ssr::cloud::resolve_dir)" [[ -d "$cloud" ]] || ssr::die "Cloud directory not available: $cloud" ssr::ok "Cloud provider: ${SSR_CLOUD_PROVIDER:-icloud} → $cloud" }