From b591f4462662cda57d49730cb5dedd30af44e6d3 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 19 Feb 2026 06:16:03 +0000 Subject: [PATCH] Skip already-configured services on rerun, respect whiptail selection Three issues fixed: 1. SSH/VPN/Remote Desktop rerun detection: When services are already configured, ask a single "Reconfigure?" question instead of prompting through every individual service again. 2. Whiptail selection respected: When user selects specific services in the whiptail menu, skip all unrelated sections (linux-to-sync, Caddy Legacy, Kopia, local backup, cloud backup, UFW) instead of prompting for each one. 3. Import-photos.sh reminder: Clarify that import-photos.sh should be run AFTER the main setup script completes, not during. https://claude.ai/code/session_01NAtxAkC5t6YVb3gcP1VcX8 --- ubuntu-post-install.sh | 82 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 2 deletions(-) diff --git a/ubuntu-post-install.sh b/ubuntu-post-install.sh index 07f04b4..47a5f21 100644 --- a/ubuntu-post-install.sh +++ b/ubuntu-post-install.sh @@ -11,6 +11,7 @@ DRY_RUN=false UNATTENDED=false LOG_FILE="/var/log/post-install.log" +WHIPTAIL_USED=false show_help() { echo "Ubuntu 24.04 Post-Installation Script" @@ -1752,6 +1753,21 @@ apt install -y openssh-server || echo "Warning: OpenSSH server installation fail systemctl start ssh || echo "Warning: Failed to start SSH" systemctl enable ssh || echo "Warning: Failed to enable SSH" +# On rerun, skip SSH configuration if already set up +SKIP_SSH_CONFIG=false +if (systemctl is-active ssh &>/dev/null || systemctl is-active sshd &>/dev/null) && \ + { [ -f "$ACTUAL_HOME/.ssh/authorized_keys" ] && [ -s "$ACTUAL_HOME/.ssh/authorized_keys" ]; } || \ + [ -f "$ACTUAL_HOME/.ssh/id_rsa" ]; then + echo "" + echo "SSH is already configured on this system." + prompt_yn "Reconfigure SSH keys and authentication? (y/n):" "n" RECONFIG_SSH + if [ "$RECONFIG_SSH" != "y" ] && [ "$RECONFIG_SSH" != "Y" ]; then + SKIP_SSH_CONFIG=true + fi +fi + +if [ "$SKIP_SSH_CONFIG" != true ]; then + # Generate SSH key for this computer echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @@ -1925,6 +1941,8 @@ fi INSTALL_FAIL2BAN="${INSTALL_FAIL2BAN:-n}" +fi # End SKIP_SSH_CONFIG + # Docker Installation echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @@ -2130,6 +2148,27 @@ else echo "Skipping Samba installation." fi +# On rerun, skip VPN configuration if already set up +SKIP_VPN_CONFIG=false +if is_netbird_installed || is_wireguard_installed || is_tailscale_installed; then + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "VPN SERVICES" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "" + echo "VPN services already configured:" + is_netbird_installed && echo " ✓ NetBird" + is_wireguard_installed && echo " ✓ WireGuard" + is_tailscale_installed && echo " ✓ Tailscale" + echo "" + prompt_yn "Reconfigure VPN services? (y/n):" "n" RECONFIG_VPN + if [ "$RECONFIG_VPN" != "y" ] && [ "$RECONFIG_VPN" != "Y" ]; then + SKIP_VPN_CONFIG=true + fi +fi + +if [ "$SKIP_VPN_CONFIG" != true ]; then + # NetBird Installation echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @@ -2290,6 +2329,29 @@ else echo "Skipping Tailscale installation." fi +fi # End SKIP_VPN_CONFIG + +# On rerun, skip remote desktop configuration if already set up +SKIP_RD_CONFIG=false +if is_rustdesk_installed || is_teamviewer_installed || is_meshcentral_installed; then + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "REMOTE DESKTOP SERVICES" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "" + echo "Remote desktop services already configured:" + is_rustdesk_installed && echo " ✓ RustDesk" + is_teamviewer_installed && echo " ✓ TeamViewer" + is_meshcentral_installed && echo " ✓ MeshCentral Agent" + echo "" + prompt_yn "Reconfigure remote desktop services? (y/n):" "n" RECONFIG_RD + if [ "$RECONFIG_RD" != "y" ] && [ "$RECONFIG_RD" != "Y" ]; then + SKIP_RD_CONFIG=true + fi +fi + +if [ "$SKIP_RD_CONFIG" != true ]; then + # RustDesk Installation echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @@ -2451,6 +2513,8 @@ else echo "Skipping MeshCentral installation." fi +fi # End SKIP_RD_CONFIG + # ============================================================================ # SELF-HOSTED DOCKER APPLICATIONS (Optional) # ============================================================================ @@ -3451,7 +3515,7 @@ IMPORT_SCRIPT_BODY echo "" if [ -n "$EXISTING_PHOTOS_SOURCE" ] && [ "$IMMICH_STRATEGY" != "2" ]; then - echo " Import your existing photos:" + echo " Import your existing photos AFTER this script finishes:" echo " $IMMICH_DIR/import-photos.sh" echo "" echo " The script handles everything automatically:" @@ -3460,6 +3524,10 @@ IMPORT_SCRIPT_BODY echo " and imports all photos from $EXISTING_PHOTOS_SOURCE" echo " with EXIF dates preserved." echo "" + echo " NOTE: Run import-photos.sh separately after this setup" + echo " script has completed. It may take a while for large" + echo " photo collections." + echo "" echo " After import, open http://localhost:2283 to browse your photos." elif [ "$IMMICH_STRATEGY" = "2" ]; then echo " 1. Open http://localhost:2283 and create your admin account" @@ -5218,6 +5286,7 @@ MC_ENV fi # ---- LINUX-TO-SYNC (Private Repo) ---- + if [ "$WHIPTAIL_USED" != true ]; then echo "" echo "┌─────────────────────────────────────────────────────────────────┐" echo "│ LINUX-TO-SYNC - Private sync repository │" @@ -5296,6 +5365,7 @@ MC_ENV fi fi fi + fi # End WHIPTAIL_USED check for linux-to-sync # ---- JELLYFIN (Alternative to Emby) ---- if [ "$WHIPTAIL_USED" != true ] && [ -z "$INSTALL_JELLYFIN" ]; then @@ -5498,7 +5568,7 @@ FRIGATE_CONFIG # Note: This is the legacy Caddy installation # The newer installation above includes fail2ban support # This section is kept for backwards compatibility - if [ "$INSTALL_CADDY" != "y" ] && [ "$INSTALL_CADDY" != "Y" ]; then + if [ "$WHIPTAIL_USED" != true ] && [ "$INSTALL_CADDY" != "y" ] && [ "$INSTALL_CADDY" != "Y" ]; then echo "" echo "┌─────────────────────────────────────────────────────────────────┐" echo "│ CADDY - Automatic HTTPS reverse proxy (Legacy) │" @@ -6501,6 +6571,7 @@ WT_ENV # ============================================================================ # KOPIA BACKUP FOR DOCKER CONTAINERS # ============================================================================ + if [ "$WHIPTAIL_USED" != true ]; then echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "DOCKER CONTAINER BACKUP (Kopia)" @@ -6671,6 +6742,7 @@ RESTORE_SCRIPT echo "" fi fi + fi # End WHIPTAIL_USED check for Kopia echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" @@ -6690,6 +6762,7 @@ RESTORE_SCRIPT fi # Backup System (Optional) +if [ "$WHIPTAIL_USED" != true ]; then echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "LOCAL BACKUP SYSTEM (Optional)" @@ -6945,8 +7018,10 @@ TIMER else echo "Skipping local backup setup." fi +fi # End WHIPTAIL_USED check for local backup # Cloud Backup with rclone (Optional) +if [ "$WHIPTAIL_USED" != true ]; then echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "CLOUD BACKUP (Optional)" @@ -7175,8 +7250,10 @@ CLOUD_SCRIPT else echo "Skipping cloud backup setup." fi +fi # End WHIPTAIL_USED check for cloud backup # UFW Firewall Configuration (Optional) +if [ "$WHIPTAIL_USED" != true ]; then echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "UFW FIREWALL (Optional)" @@ -7360,6 +7437,7 @@ else fi CONFIGURE_UFW="${CONFIGURE_UFW:-n}" +fi # End WHIPTAIL_USED check for UFW # Full system upgrade (optional) echo ""