diff --git a/chromium-setup/emmc-provisioning/scripts/deploy-to-proxmox.sh b/chromium-setup/emmc-provisioning/scripts/deploy-to-proxmox.sh index c522614..893db1b 100755 --- a/chromium-setup/emmc-provisioning/scripts/deploy-to-proxmox.sh +++ b/chromium-setup/emmc-provisioning/scripts/deploy-to-proxmox.sh @@ -3,11 +3,12 @@ # LXC container (dashboard), usbboot (rpiboot), and PiShrink. Uses hostname "cm4-provisioning" # to find the container on redeploy; creates with next available ID if not found. # -# Redeploy (re-run) behaviour: skips steps that are already configured so you can update -# only what changed. Always updates: host scripts, dashboard files, env, systemd/udev. -# Skips when present: LXC creation, backups bind-mount (if same path), usbboot, PiShrink, -# LXC python3-flask and openssh-server apt installs. Set DEPLOY_ROOTFS_STORAGE to avoid -# storage prompt on redeploy. +# Redeploy (re-run) behaviour: checks first if the cm4-provisioning container exists; +# if so, skips storage selection. Skips other steps that are already configured so you +# can update only what changed. Always updates: host scripts, dashboard files, env, +# systemd/udev. Skips when present: LXC creation, backups bind-mount (if same path), +# usbboot, PiShrink, LXC python3-flask and openssh-server apt installs. Set +# DEPLOY_ROOTFS_STORAGE to avoid storage prompt on first deploy (when container is new). # # With host internet: installs usbboot and PiShrink so USB flash/backup and dashboard # Shrink/Compress work. The only manual step left is to add a golden image for Deploy. @@ -62,55 +63,85 @@ if [[ -n "$KEY_FILE" && -f "$KEY_FILE" ]]; then fi log "Deploying to $PROXMOX ..." -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' +log "[1/5] Checking if cm4-provisioning container exists and listing storage ..." +REMOTE_CHECK=$(ssh "$PROXMOX" "bash -s" << 'REMOTECHECK' +LXC_HOSTNAME="cm4-provisioning" +LXC_EXISTS=0 +for id in $(pct list 2>/dev/null | awk 'NR>1 {print $1}'); do + h=$(pct config "$id" 2>/dev/null | sed -n 's/^hostname: *//p') + if [[ "$h" == "$LXC_HOSTNAME" ]]; then LXC_EXISTS=1; break; fi +done +echo "LXC_EXISTS=$LXC_EXISTS" +pvesm status 2>/dev/null | awk 'NR>1 { sub(/^[ \t]+/, ""); if ($2!="pbs" && $3~/active/) print $1 }' +REMOTECHECK +) -# --- Ask user to select LXC rootfs storage (from host; PBS excluded) --- -# Normalize: trim leading spaces so first column is storage name (pvesm can align columns) -STORAGE_LIST=$(ssh "$PROXMOX" "pvesm status 2>/dev/null | awk 'NR>1 { sub(/^[ \t]+/, \"\"); if (\$2!=\"pbs\" && \$3~/active/) print \$1 }'" 2>/dev/null || true) +first_line= 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" +while IFS= read -r line; do + if [[ -z "$first_line" ]]; then + first_line="$line" 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" + [[ -n "$line" ]] && storages+=("$line") + fi +done <<< "$REMOTE_CHECK" + +if [[ "$first_line" == "LXC_EXISTS=1" ]]; then + LXC_ALREADY_EXISTS=1 + log "Container cm4-provisioning already exists; no storage selection needed." + if [[ ${#storages[@]} -eq 0 ]]; then + log "Error: no Proxmox storage found on host (needed for validation). Run on host: pvesm status" + exit 1 + fi + ROOTFS_STORAGE="${storages[0]}" + log "Using storage $ROOTFS_STORAGE for validation only." +else + LXC_ALREADY_EXISTS=0 + if [[ ${#storages[@]} -eq 0 ]]; then + log "Error: no Proxmox storage found on host (PBS excluded). Run on host: pvesm status" + exit 1 + fi + # --- Ask user to select LXC rootfs storage only when creating new container --- + 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 - echo "Invalid choice. Enter a number from 1 to ${#storages[@]}." 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 fi -log "[3/5] Running remote install (host + LXC) ..." +log "[2/5] Cleaning remote staging dir ..." +ssh "$PROXMOX" "rm -rf /tmp/emmc-provisioning-deploy" +log "[3/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' + +log "[4/5] Running remote install (host + LXC) ..." # 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' @@ -308,6 +339,7 @@ LXC_IP=$(pct exec "$CTID" -- hostname -I 2>/dev/null | awk '{print $1}') echo "${LXC_IP:-}" > "$DEPLOY/lxc_ip.txt" log "Deploy done on remote. LXC ID: $CTID" +# Heredoc terminator (must be at column 1, no leading space/tab) REMOTE # Read LXC IP written by remote (container hostname -I)