diff --git a/chromium-setup/emmc-provisioning/scripts/deploy-to-proxmox.sh b/chromium-setup/emmc-provisioning/scripts/deploy-to-proxmox.sh index fac5b6c..b250d2f 100755 --- a/chromium-setup/emmc-provisioning/scripts/deploy-to-proxmox.sh +++ b/chromium-setup/emmc-provisioning/scripts/deploy-to-proxmox.sh @@ -10,7 +10,7 @@ # Example: ./deploy-to-proxmox.sh root@10.20.30.152 # # Optional env: -# DEPLOY_ROOTFS_STORAGE=name — LXC rootfs storage (default: auto-detect: local-lvm, local, local-zfs, or first active) +# DEPLOY_ROOTFS_STORAGE=name — LXC rootfs storage (if set and valid, skips interactive choice; otherwise script lists storages and asks for number) # CM4_BACKUPS_HOST_PATH=/path — host dir for backups; bind-mounted into LXC # DEPLOY_LXC_ROOT_PASSWORD=secret — set root password in LXC and enable SSH # DEPLOY_LXC_SSH_KEY=/path/to/pub — copy this key to LXC root (default: ~/.ssh/id_ed25519.pub or id_rsa.pub) @@ -55,34 +55,66 @@ log "[1/5] Cleaning remote staging dir ..." ssh "$PROXMOX" "rm -rf /tmp/emmc-provisioning-deploy" log "[2/5] Rsync repo to $PROXMOX ..." rsync -a "$REPO_DIR/" "$PROXMOX:/tmp/emmc-provisioning-deploy/" --exclude='.git' --exclude='scripts/deploy-to-proxmox.sh' --exclude='scripts/deploy-*.log' + +# --- Ask user to select LXC rootfs storage (from host; PBS excluded) --- +STORAGE_LIST=$(ssh "$PROXMOX" "pvesm status 2>/dev/null | awk 'NR>1 && \$2!=\"pbs\" && \$3~/active/ {print \$1}'" 2>/dev/null || true) +storages=() +while IFS= read -r line; do [[ -n "$line" ]] && storages+=("$line"); done <<< "$STORAGE_LIST" +if [[ ${#storages[@]} -eq 0 ]]; then + log "Error: no Proxmox storage found on host (PBS excluded). Run on host: pvesm status" + exit 1 +fi +# If DEPLOY_ROOTFS_STORAGE is set and in the list, use it without prompting +if [[ -n "${DEPLOY_ROOTFS_STORAGE:-}" ]]; then + for s in "${storages[@]}"; do + if [[ "$s" == "$DEPLOY_ROOTFS_STORAGE" ]]; then + ROOTFS_STORAGE="$DEPLOY_ROOTFS_STORAGE" + log "Using storage: $ROOTFS_STORAGE (from DEPLOY_ROOTFS_STORAGE)" + break + fi + done +fi +if [[ -z "${ROOTFS_STORAGE:-}" ]]; then + echo "" + echo "Available storage on $PROXMOX (PBS excluded):" + for i in "${!storages[@]}"; do echo " $((i+1))) ${storages[i]}"; done + echo "" + if [[ ${#storages[@]} -eq 1 ]]; then + ROOTFS_STORAGE="${storages[0]}" + log "Using only available storage: $ROOTFS_STORAGE" + elif [[ ! -t 0 ]]; then + ROOTFS_STORAGE="${storages[0]}" + log "No TTY: using first storage $ROOTFS_STORAGE" + else + while true; do + read -r -p "Select storage (1-${#storages[@]}): " num + if [[ "$num" =~ ^[0-9]+$ ]] && [[ "$num" -ge 1 ]] && [[ "$num" -le ${#storages[@]} ]]; then + ROOTFS_STORAGE="${storages[num-1]}" + log "Using storage: $ROOTFS_STORAGE" + break + fi + echo "Invalid choice. Enter a number from 1 to ${#storages[@]}." + done + fi +fi + log "[3/5] Running remote install (host + LXC) ..." -# Pass optional LXC SSH vars (base64) so remote can set password and add key +# Pass optional LXC SSH vars (base64) and selected storage ssh "$PROXMOX" "ROOTFS_STORAGE='$ROOTFS_STORAGE' CM4_BACKUPS_HOST_PATH='${CM4_BACKUPS_HOST_PATH:-}' DEPLOY_SSH_KEY_B64='${DEPLOY_SSH_KEY_B64:-}' DEPLOY_LXC_PWD_B64='${DEPLOY_LXC_PWD_B64:-}'" bash -s << 'REMOTE' set -e DEPLOY=/tmp/emmc-provisioning-deploy +ROOTFS_STORAGE="${ROOTFS_STORAGE:?ROOTFS_STORAGE not set}" BACKUPS_HOST_PATH="${CM4_BACKUPS_HOST_PATH:-}" LXC_HOSTNAME="cm4-provisioning" log() { echo "[$(date -Iseconds)] $*"; } -# --- Auto-select LXC rootfs storage if not set or not available --- -_storage_exists() { pvesm status 2>/dev/null | awk -v s="$1" 'NR>1 && $1==s && $3=="active" {exit(0)} END{exit(1)}'; } -if [[ -n "${ROOTFS_STORAGE:-}" ]] && _storage_exists "$ROOTFS_STORAGE"; then - : # use provided and existing storage -else - ROOTFS_STORAGE="" - for cand in local-lvm local local-zfs; do - if _storage_exists "$cand"; then - ROOTFS_STORAGE="$cand" - break - fi - done - if [[ -z "$ROOTFS_STORAGE" ]]; then - ROOTFS_STORAGE=$(pvesm status 2>/dev/null | awk 'NR>1 && $3=="active" {print $1; exit}') - fi - [[ -z "$ROOTFS_STORAGE" ]] && { log "Error: no Proxmox storage found. Run: pvesm status"; exit 1; } - log "Using storage: $ROOTFS_STORAGE" +# Storage already chosen interactively; validate it exists on host +if ! pvesm status 2>/dev/null | awk -v s="$ROOTFS_STORAGE" 'NR>1 && $1==s && $2!="pbs" && $3~/active/ {exit(0)} END{exit(1)}'; then + log "Error: storage $ROOTFS_STORAGE not found or not valid on host" + exit 1 fi +log "Using storage: $ROOTFS_STORAGE" # --- Find existing LXC by hostname or use next available ID --- CTID=""