diff --git a/ct/alpine-grafana.sh b/ct/alpine-grafana.sh index 2126ecb9b..4fd32ec5d 100644 --- a/ct/alpine-grafana.sh +++ b/ct/alpine-grafana.sh @@ -20,43 +20,32 @@ color catch_errors function update_script() { - if ! apk -e info newt >/dev/null 2>&1; then - apk add -q newt - fi LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) - while true; do - CHOICE=$( - whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --menu "Select option" 11 58 3 \ - "1" "Check for Grafana Updates" \ - "2" "Allow 0.0.0.0 for listening" \ - "3" "Allow only ${LXCIP} for listening" 3>&2 2>&1 1>&3 - ) - exit_status=$? - if [ $exit_status == 1 ]; then - clear - exit-script - fi - header_info - case $CHOICE in - 1) - $STD apk -U upgrade - msg_ok "Updated successfully!" - exit - ;; - 2) - sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=0.0.0.0/g" /etc/conf.d/grafana - service grafana restart - msg_ok "Allowed listening on all interfaces!" - exit - ;; - 3) - sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=$LXCIP/g" /etc/conf.d/grafana - service grafana restart - msg_ok "Allowed listening only on ${LXCIP}!" - exit - ;; - esac - done + + CHOICE=$(msg_menu "Grafana Update Options" \ + "1" "Check for Grafana Updates" \ + "2" "Allow 0.0.0.0 for listening" \ + "3" "Allow only ${LXCIP} for listening") + + case $CHOICE in + 1) + $STD apk -U upgrade + msg_ok "Updated successfully!" + exit + ;; + 2) + sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=0.0.0.0/g" /etc/conf.d/grafana + service grafana restart + msg_ok "Allowed listening on all interfaces!" + exit + ;; + 3) + sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=$LXCIP/g" /etc/conf.d/grafana + service grafana restart + msg_ok "Allowed listening only on ${LXCIP}!" + exit + ;; + esac exit 0 } diff --git a/ct/alpine-loki.sh b/ct/alpine-loki.sh index 057506689..547aaf788 100644 --- a/ct/alpine-loki.sh +++ b/ct/alpine-loki.sh @@ -20,43 +20,32 @@ color catch_errors function update_script() { - if ! apk -e info newt >/dev/null 2>&1; then - apk add -q newt - fi LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) - while true; do - CHOICE=$( - whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --menu "Select option" 11 58 3 \ - "1" "Check for Loki Updates" \ - "2" "Allow 0.0.0.0 for listening" \ - "3" "Allow only ${LXCIP} for listening" 3>&2 2>&1 1>&3 - ) - exit_status=$? - if [ $exit_status == 1 ]; then - clear - exit-script - fi - header_info - case $CHOICE in - 1) - $STD apk -U upgrade - msg_ok "Updated successfully!" - exit - ;; - 2) - sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=0.0.0.0/g" /etc/conf.d/loki - service loki restart - msg_ok "Allowed listening on all interfaces!" - exit - ;; - 3) - sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=$LXCIP/g" /etc/conf.d/loki - service loki restart - msg_ok "Allowed listening only on ${LXCIP}!" - exit - ;; - esac - done + + CHOICE=$(msg_menu "Loki Update Options" \ + "1" "Check for Loki Updates" \ + "2" "Allow 0.0.0.0 for listening" \ + "3" "Allow only ${LXCIP} for listening") + + case $CHOICE in + 1) + $STD apk -U upgrade + msg_ok "Updated successfully!" + exit + ;; + 2) + sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=0.0.0.0/g" /etc/conf.d/loki + service loki restart + msg_ok "Allowed listening on all interfaces!" + exit + ;; + 3) + sed -i -e "s/cfg:server.http_addr=.*/cfg:server.http_addr=$LXCIP/g" /etc/conf.d/loki + service loki restart + msg_ok "Allowed listening only on ${LXCIP}!" + exit + ;; + esac exit 0 } diff --git a/ct/alpine-nextcloud.sh b/ct/alpine-nextcloud.sh index a0e8c5f68..16d25ec63 100644 --- a/ct/alpine-nextcloud.sh +++ b/ct/alpine-nextcloud.sh @@ -24,32 +24,22 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - if ! apk -e info newt >/dev/null 2>&1; then - apk add -q newt - fi - while true; do - CHOICE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 3 \ - "1" "Nextcloud Login Credentials" ON \ - "2" "Renew Self-signed Certificate" OFF \ - 3>&1 1>&2 2>&3) - exit_status=$? - if [ $exit_status == 1 ]; then - clear - exit-script - fi - header_info - case $CHOICE in - 1) - cat nextcloud.creds - exit - ;; - 2) - openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/nextcloud-selfsigned.key -out /etc/ssl/certs/nextcloud-selfsigned.crt -subj "/C=US/O=Nextcloud/OU=Domain Control Validated/CN=nextcloud.local" >/dev/null 2>&1 - rc-service nginx restart - exit - ;; - esac - done + + CHOICE=$(msg_menu "Nextcloud Options" \ + "1" "Nextcloud Login Credentials" \ + "2" "Renew Self-signed Certificate") + + case $CHOICE in + 1) + cat nextcloud.creds + exit + ;; + 2) + openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/nextcloud-selfsigned.key -out /etc/ssl/certs/nextcloud-selfsigned.crt -subj "/C=US/O=Nextcloud/OU=Domain Control Validated/CN=nextcloud.local" >/dev/null 2>&1 + rc-service nginx restart + exit + ;; + esac exit 0 } diff --git a/ct/alpine-redis.sh b/ct/alpine-redis.sh index 214bb20d5..3ac844272 100644 --- a/ct/alpine-redis.sh +++ b/ct/alpine-redis.sh @@ -20,47 +20,36 @@ color catch_errors function update_script() { - if ! apk -e info newt >/dev/null 2>&1; then - apk add -q newt - fi LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) - while true; do - CHOICE=$( - whiptail --backtitle "Proxmox VE Helper Scripts" --title "Redis Management" --menu "Select option" 11 58 3 \ - "1" "Update Redis" \ - "2" "Allow 0.0.0.0 for listening" \ - "3" "Allow only ${LXCIP} for listening" 3>&2 2>&1 1>&3 - ) - exit_status=$? - if [ $exit_status == 1 ]; then - clear - exit-script - fi - header_info - case $CHOICE in - 1) - msg_info "Updating Redis" - apk update && apk upgrade redis - rc-service redis restart - msg_ok "Updated successfully!" - exit - ;; - 2) - msg_info "Setting Redis to listen on all interfaces" - sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis.conf - rc-service redis restart - msg_ok "Redis now listens on all interfaces!" - exit - ;; - 3) - msg_info "Setting Redis to listen only on ${LXCIP}" - sed -i "s/^bind .*/bind ${LXCIP}/" /etc/redis.conf - rc-service redis restart - msg_ok "Redis now listens only on ${LXCIP}!" - exit - ;; - esac - done + + CHOICE=$(msg_menu "Redis Management" \ + "1" "Update Redis" \ + "2" "Allow 0.0.0.0 for listening" \ + "3" "Allow only ${LXCIP} for listening") + + case $CHOICE in + 1) + msg_info "Updating Redis" + apk update && apk upgrade redis + rc-service redis restart + msg_ok "Updated successfully!" + exit + ;; + 2) + msg_info "Setting Redis to listen on all interfaces" + sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis.conf + rc-service redis restart + msg_ok "Redis now listens on all interfaces!" + exit + ;; + 3) + msg_info "Setting Redis to listen only on ${LXCIP}" + sed -i "s/^bind .*/bind ${LXCIP}/" /etc/redis.conf + rc-service redis restart + msg_ok "Redis now listens only on ${LXCIP}!" + exit + ;; + esac } start diff --git a/ct/alpine-valkey.sh b/ct/alpine-valkey.sh index 131ae581d..35c482da2 100644 --- a/ct/alpine-valkey.sh +++ b/ct/alpine-valkey.sh @@ -20,48 +20,37 @@ color catch_errors function update_script() { - if ! apk -e info newt >/dev/null 2>&1; then - apk add -q newt - fi LXCIP=$(ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1) - while true; do - CHOICE=$( - whiptail --backtitle "Proxmox VE Helper Scripts" --title "Valkey Management" --menu "Select option" 11 58 3 \ - "1" "Update Valkey" \ - "2" "Allow 0.0.0.0 for listening" \ - "3" "Allow only ${LXCIP} for listening" 3>&2 2>&1 1>&3 - ) - exit_status=$? - if [ $exit_status == 1 ]; then - clear - exit-script - fi - header_info - case $CHOICE in - 1) - msg_info "Updating Valkey" - apk update && apk upgrade valkey - rc-service valkey restart - msg_ok "Updated Valkey" - msg_ok "Updated successfully!" - exit - ;; - 2) - msg_info "Setting Valkey to listen on all interfaces" - sed -i 's/^bind .*/bind 0.0.0.0/' /etc/valkey/valkey.conf - rc-service valkey restart - msg_ok "Valkey now listens on all interfaces!" - exit - ;; - 3) - msg_info "Setting Valkey to listen only on ${LXCIP}" - sed -i "s/^bind .*/bind ${LXCIP}/" /etc/valkey/valkey.conf - rc-service valkey restart - msg_ok "Valkey now listens only on ${LXCIP}!" - exit - ;; - esac - done + + CHOICE=$(msg_menu "Valkey Management" \ + "1" "Update Valkey" \ + "2" "Allow 0.0.0.0 for listening" \ + "3" "Allow only ${LXCIP} for listening") + + case $CHOICE in + 1) + msg_info "Updating Valkey" + apk update && apk upgrade valkey + rc-service valkey restart + msg_ok "Updated Valkey" + msg_ok "Updated successfully!" + exit + ;; + 2) + msg_info "Setting Valkey to listen on all interfaces" + sed -i 's/^bind .*/bind 0.0.0.0/' /etc/valkey/valkey.conf + rc-service valkey restart + msg_ok "Valkey now listens on all interfaces!" + exit + ;; + 3) + msg_info "Setting Valkey to listen only on ${LXCIP}" + sed -i "s/^bind .*/bind ${LXCIP}/" /etc/valkey/valkey.conf + rc-service valkey restart + msg_ok "Valkey now listens only on ${LXCIP}!" + exit + ;; + esac } start diff --git a/ct/alpine-vaultwarden.sh b/ct/alpine-vaultwarden.sh index 5f01700d5..c9610c08c 100644 --- a/ct/alpine-vaultwarden.sh +++ b/ct/alpine-vaultwarden.sh @@ -20,45 +20,38 @@ color catch_errors function update_script() { - if ! apk -e info newt >/dev/null 2>&1; then - apk add -q newt - fi - while true; do - CHOICE=$( - whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --menu "Select option" 11 58 2 \ - "1" "Update Vaultwarden" \ - "2" "Reset ADMIN_TOKEN" 3>&2 2>&1 1>&3 - ) - exit_status=$? - if [ $exit_status == 1 ]; then - clear - exit-script + CHOICE=$(msg_menu "Vaultwarden Update Options" \ + "1" "Update Vaultwarden" \ + "2" "Reset ADMIN_TOKEN") + + case $CHOICE in + 1) + $STD apk -U upgrade + rc-service vaultwarden restart -q + msg_ok "Updated successfully!" + exit + ;; + 2) + if [[ "${PHS_SILENT:-0}" == "1" ]]; then + msg_warn "Reset ADMIN_TOKEN requires interactive mode, skipping." + exit fi - header_info - case $CHOICE in - 1) - $STD apk -U upgrade - rc-service vaultwarden restart -q - msg_ok "Updated successfully!" - exit - ;; - 2) - if NEWTOKEN=$(whiptail --backtitle "Proxmox VE Helper Scripts" --passwordbox "Setup your ADMIN_TOKEN (make it strong)" 10 58 3>&1 1>&2 2>&3); then - if [[ -z "$NEWTOKEN" ]]; then exit-script; fi - if ! command -v argon2 >/dev/null 2>&1; then apk add argon2 &>/dev/null; fi - TOKEN=$(echo -n "${NEWTOKEN}" | argon2 "$(openssl rand -base64 32)" -e -id -k 19456 -t 2 -p 1) - if [[ ! -f /var/lib/vaultwarden/config.json ]]; then - sed -i "s|export ADMIN_TOKEN=.*|export ADMIN_TOKEN='${TOKEN}'|" /etc/conf.d/vaultwarden - else - sed -i "s|\"admin_token\": .*|\"admin_token\": \"${TOKEN}\",|" /var/lib/vaultwarden/config.json - fi - rc-service vaultwarden restart -q + read -r -s -p "Setup your ADMIN_TOKEN (make it strong): " NEWTOKEN + echo "" + if [[ -n "$NEWTOKEN" ]]; then + if ! command -v argon2 >/dev/null 2>&1; then apk add argon2 &>/dev/null; fi + TOKEN=$(echo -n "${NEWTOKEN}" | argon2 "$(openssl rand -base64 32)" -e -id -k 19456 -t 2 -p 1) + if [[ ! -f /var/lib/vaultwarden/config.json ]]; then + sed -i "s|export ADMIN_TOKEN=.*|export ADMIN_TOKEN='${TOKEN}'|" /etc/conf.d/vaultwarden + else + sed -i "s|\"admin_token\": .*|\"admin_token\": \"${TOKEN}\",|" /var/lib/vaultwarden/config.json fi - clear - exit - ;; - esac - done + rc-service vaultwarden restart -q + msg_ok "Admin token updated" + fi + exit + ;; + esac } start diff --git a/ct/cronicle.sh b/ct/cronicle.sh index 61847011f..1ad6ea667 100644 --- a/ct/cronicle.sh +++ b/ct/cronicle.sh @@ -23,10 +23,9 @@ function update_script() { header_info check_container_storage check_container_resources - UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 2 \ - "1" "Update ${APP}" ON \ - "2" "Install ${APP} Worker" OFF \ - 3>&1 1>&2 2>&3) + UPD=$(msg_menu "Cronicle Update Options" \ + "1" "Update ${APP}" \ + "2" "Install ${APP} Worker") if [ "$UPD" == "1" ]; then if [[ ! -d /opt/cronicle ]]; then diff --git a/ct/gitea-mirror.sh b/ct/gitea-mirror.sh index 65a84f479..271f166ab 100644 --- a/ct/gitea-mirror.sh +++ b/ct/gitea-mirror.sh @@ -31,18 +31,27 @@ function update_script() { APP_VERSION=$(grep -o '"version": *"[^"]*"' /opt/gitea-mirror/package.json | cut -d'"' -f4) if [[ $APP_VERSION =~ ^2\. ]]; then - if ! whiptail --backtitle "Gitea Mirror Update" --title "⚠️ VERSION 2.x DETECTED" --yesno \ - "WARNING: Version $APP_VERSION detected!\n\nUpdating from version 2.x will CLEAR ALL CONFIGURATION.\n\nThis includes:\n• API tokens\n• User settings\n• Repository configurations\n• All custom settings\n\nDo you want to continue with the update process?" 15 70 --defaultno; then + if [[ "${PHS_SILENT:-0}" == "1" ]]; then + msg_warn "Version $APP_VERSION detected. Major version upgrade requires interactive confirmation, skipping." + exit 75 + fi + msg_warn "WARNING: Version $APP_VERSION detected!" + msg_warn "Updating from version 2.x will CLEAR ALL CONFIGURATION." + msg_warn "This includes: API tokens, User settings, Repository configurations, All custom settings" + echo "" + read -r -p "Do you want to continue? (y/N): " CONFIRM + if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then exit 0 fi - - if ! whiptail --backtitle "Gitea Mirror Update" --title "⚠️ FINAL CONFIRMATION" --yesno \ - "FINAL WARNING: This update WILL clear all configuration!\n\nBEFORE PROCEEDING, please:\n\n• Copy API tokens to a safe location\n• Backup any custom configurations\n• Note down repository settings\n\nThis action CANNOT be undone!" 18 70 --defaultno; then - whiptail --backtitle "Gitea Mirror Update" --title "Update Cancelled" --msgbox "Update process cancelled. Please backup your configuration before proceeding." 8 60 + msg_warn "FINAL WARNING: This update WILL clear all configuration!" + msg_warn "Please ensure you have backed up API tokens, custom configurations, and repository settings." + echo "" + read -r -p "Final confirmation - proceed? (y/N): " CONFIRM2 + if [[ ! "$CONFIRM2" =~ ^[Yy]$ ]]; then + msg_info "Update cancelled. Please backup your configuration before proceeding." exit 0 fi - whiptail --backtitle "Gitea Mirror Update" --title "Proceeding with Update" --msgbox \ - "Proceeding with version $APP_VERSION update.\n\nAll configuration will be cleared as warned." 8 50 + msg_info "Proceeding with version $APP_VERSION update. All configuration will be cleared as warned." rm -rf /opt/gitea-mirror fi diff --git a/ct/homeassistant.sh b/ct/homeassistant.sh index 4a91af857..8c58b2ab2 100644 --- a/ct/homeassistant.sh +++ b/ct/homeassistant.sh @@ -27,12 +27,11 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \ - "1" "Update ALL Containers" ON \ - "2" "Remove ALL Unused Images" OFF \ - "3" "Install HACS" OFF \ - "4" "Install FileBrowser" OFF \ - 3>&1 1>&2 2>&3) + UPD=$(msg_menu "Home Assistant Update Options" \ + "1" "Update ALL Containers" \ + "2" "Remove ALL Unused Images" \ + "3" "Install HACS" \ + "4" "Install FileBrowser") if [ "$UPD" == "1" ]; then msg_info "Updating All Containers" diff --git a/ct/loki.sh b/ct/loki.sh index cd9c5869e..51713af43 100644 --- a/ct/loki.sh +++ b/ct/loki.sh @@ -29,21 +29,13 @@ function update_script() { exit 1 fi - while true; do - CHOICE=$( - whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --menu "Select option" 11 58 3 \ - "1" "Update Loki & Promtail" \ - "2" "Allow 0.0.0.0 for listening" \ - "3" "Allow only ${LOCAL_IP} for listening" 3>&2 2>&1 1>&3 - ) - exit_status=$? - if [ $exit_status == 1 ]; then - clear - exit-script - fi - header_info - case $CHOICE in - 1) + CHOICE=$(msg_menu "Loki Update Options" \ + "1" "Update Loki & Promtail" \ + "2" "Allow 0.0.0.0 for listening" \ + "3" "Allow only ${LOCAL_IP} for listening") + + case $CHOICE in + 1) msg_info "Stopping Loki" systemctl stop loki if systemctl is-active --quiet promtail 2>/dev/null || dpkg -s promtail >/dev/null 2>&1; then @@ -85,7 +77,6 @@ function update_script() { exit ;; esac - done exit 0 } diff --git a/ct/meilisearch.sh b/ct/meilisearch.sh index dc5e866d9..fd00028c1 100644 --- a/ct/meilisearch.sh +++ b/ct/meilisearch.sh @@ -24,10 +24,9 @@ function update_script() { check_container_storage check_container_resources - UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Meilisearch Update" --radiolist --cancel-button Exit-Script "Spacebar = Select" 10 58 2 \ - "1" "Update Meilisearch" ON \ - "2" "Update Meilisearch-UI" OFF \ - 3>&1 1>&2 2>&3) + UPD=$(msg_menu "Meilisearch Update Options" \ + "1" "Update Meilisearch" \ + "2" "Update Meilisearch-UI") if [ "$UPD" == "1" ]; then setup_meilisearch diff --git a/ct/nginxproxymanager.sh b/ct/nginxproxymanager.sh index 8abb75738..bace992c9 100644 --- a/ct/nginxproxymanager.sh +++ b/ct/nginxproxymanager.sh @@ -32,7 +32,7 @@ function update_script() { msg_error "The repository's GPG key uses SHA-1 signatures, which are no longer accepted by Debian as of February 1, 2026." msg_error "The issue is tracked in openresty/openresty#1097" msg_error "For more details, see: https://github.com/community-scripts/ProxmoxVE/issues/11406" - exit 1 + exit 75 if [[ $(grep -E '^VERSION_ID=' /etc/os-release) == *"12"* ]]; then msg_error "Wrong Debian version detected!" diff --git a/ct/node-red.sh b/ct/node-red.sh index 7a864fb69..5348e8932 100644 --- a/ct/node-red.sh +++ b/ct/node-red.sh @@ -27,10 +27,9 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 2 \ - "1" "Update ${APP}" ON \ - "2" "Install Themes" OFF \ - 3>&1 1>&2 2>&3) + UPD=$(msg_menu "Node-Red Update Options" \ + "1" "Update ${APP}" \ + "2" "Install Themes") if [ "$UPD" == "1" ]; then NODE_VERSION="22" setup_nodejs @@ -49,32 +48,31 @@ function update_script() { exit fi if [ "$UPD" == "2" ]; then - THEME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "NODE-RED THEMES" --radiolist --cancel-button Exit-Script "Choose Theme" 15 58 6 \ - "aurora" "" OFF \ - "cobalt2" "" OFF \ - "dark" "" OFF \ - "dracula" "" OFF \ - "espresso-libre" "" OFF \ - "github-dark" "" OFF \ - "github-dark-default" "" OFF \ - "github-dark-dimmed" "" OFF \ - "midnight-red" "" ON \ - "monoindustrial" "" OFF \ - "monokai" "" OFF \ - "monokai-dimmed" "" OFF \ - "noctis" "" OFF \ - "oceanic-next" "" OFF \ - "oled" "" OFF \ - "one-dark-pro" "" OFF \ - "one-dark-pro-darker" "" OFF \ - "solarized-dark" "" OFF \ - "solarized-light" "" OFF \ - "tokyo-night" "" OFF \ - "tokyo-night-light" "" OFF \ - "tokyo-night-storm" "" OFF \ - "totallyinformation" "" OFF \ - "zenburn" "" OFF \ - 3>&1 1>&2 2>&3) + THEME=$(msg_menu "Node-Red Themes" \ + "midnight-red" "Midnight Red (default)" \ + "aurora" "Aurora" \ + "cobalt2" "Cobalt2" \ + "dark" "Dark" \ + "dracula" "Dracula" \ + "espresso-libre" "Espresso Libre" \ + "github-dark" "GitHub Dark" \ + "github-dark-default" "GitHub Dark Default" \ + "github-dark-dimmed" "GitHub Dark Dimmed" \ + "monoindustrial" "Monoindustrial" \ + "monokai" "Monokai" \ + "monokai-dimmed" "Monokai Dimmed" \ + "noctis" "Noctis" \ + "oceanic-next" "Oceanic Next" \ + "oled" "OLED" \ + "one-dark-pro" "One Dark Pro" \ + "one-dark-pro-darker" "One Dark Pro Darker" \ + "solarized-dark" "Solarized Dark" \ + "solarized-light" "Solarized Light" \ + "tokyo-night" "Tokyo Night" \ + "tokyo-night-light" "Tokyo Night Light" \ + "tokyo-night-storm" "Tokyo Night Storm" \ + "totallyinformation" "TotallyInformation" \ + "zenburn" "Zenburn") header_info msg_info "Installing ${THEME} Theme" cd /root/.node-red diff --git a/ct/npmplus.sh b/ct/npmplus.sh index d9a0376ca..ccefec5c3 100644 --- a/ct/npmplus.sh +++ b/ct/npmplus.sh @@ -20,10 +20,9 @@ color catch_errors function update_script() { - UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE MODE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 14 60 2 \ - "1" "Check for Alpine Updates" OFF \ - "2" "Update NPMplus Docker Container" ON \ - 3>&1 1>&2 2>&3) + UPD=$(msg_menu "NPMplus Update Options" \ + "1" "Check for Alpine Updates" \ + "2" "Update NPMplus Docker Container") header_info "$APP" diff --git a/ct/plex.sh b/ct/plex.sh index e36f313c5..ce7be9d08 100644 --- a/ct/plex.sh +++ b/ct/plex.sh @@ -29,10 +29,9 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select \nplexupdate info >> https://github.com/mrworf/plexupdate" 10 59 2 \ - "1" "Update LXC" ON \ - "2" "Install plexupdate" OFF \ - 3>&1 1>&2 2>&3) + UPD=$(msg_menu "Plex Update Options" \ + "1" "Update LXC" \ + "2" "Install plexupdate") if [ "$UPD" == "1" ]; then msg_info "Updating ${APP} LXC" $STD apt update diff --git a/ct/podman-homeassistant.sh b/ct/podman-homeassistant.sh index bdedb0c5b..96c50e16d 100644 --- a/ct/podman-homeassistant.sh +++ b/ct/podman-homeassistant.sh @@ -27,12 +27,11 @@ function update_script() { msg_error "No ${APP} Installation Found!" exit fi - UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UPDATE" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 4 \ - "1" "Update system and containers" ON \ - "2" "Install HACS" OFF \ - "3" "Install FileBrowser" OFF \ - "4" "Remove ALL Unused Images" OFF \ - 3>&1 1>&2 2>&3) + UPD=$(msg_menu "Home Assistant Update Options" \ + "1" "Update system and containers" \ + "2" "Install HACS" \ + "3" "Install FileBrowser" \ + "4" "Remove ALL Unused Images") if [ "$UPD" == "1" ]; then msg_info "Updating ${APP} LXC" diff --git a/ct/vaultwarden.sh b/ct/vaultwarden.sh index ee7751176..028864348 100644 --- a/ct/vaultwarden.sh +++ b/ct/vaultwarden.sh @@ -31,11 +31,10 @@ function update_script() { VAULT=$(get_latest_github_release "dani-garcia/vaultwarden") WVRELEASE=$(get_latest_github_release "dani-garcia/bw_web_builds") - UPD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "SUPPORT" --radiolist --cancel-button Exit-Script "Spacebar = Select" 11 58 3 \ - "1" "VaultWarden $VAULT" ON \ - "2" "Web-Vault $WVRELEASE" OFF \ - "3" "Set Admin Token" OFF \ - 3>&1 1>&2 2>&3) + UPD=$(msg_menu "Vaultwarden Update Options" \ + "1" "VaultWarden $VAULT" \ + "2" "Web-Vault $WVRELEASE" \ + "3" "Set Admin Token") if [ "$UPD" == "1" ]; then if check_for_gh_release "vaultwarden" "dani-garcia/vaultwarden"; then @@ -92,8 +91,13 @@ function update_script() { fi if [ "$UPD" == "3" ]; then - if NEWTOKEN=$(whiptail --backtitle "Proxmox VE Helper Scripts" --passwordbox "Set the ADMIN_TOKEN" 10 58 3>&1 1>&2 2>&3); then - if [[ -z "$NEWTOKEN" ]]; then exit; fi + if [[ "${PHS_SILENT:-0}" == "1" ]]; then + msg_warn "Set Admin Token requires interactive mode, skipping." + exit + fi + read -r -s -p "Set the ADMIN_TOKEN: " NEWTOKEN + echo "" + if [[ -n "$NEWTOKEN" ]]; then ensure_dependencies argon2 TOKEN=$(echo -n "${NEWTOKEN}" | argon2 "$(openssl rand -base64 32)" -t 2 -m 16 -p 4 -l 64 -e) sed -i "s|ADMIN_TOKEN=.*|ADMIN_TOKEN='${TOKEN}'|" /opt/vaultwarden/.env diff --git a/misc/build.func b/misc/build.func index c4c078633..2c4f03230 100644 --- a/misc/build.func +++ b/misc/build.func @@ -3318,6 +3318,68 @@ configure_ssh_settings() { fi } +# ------------------------------------------------------------------------------ +# msg_menu() +# +# - Displays a numbered menu for update_script() functions +# - In silent mode (PHS_SILENT=1): auto-selects the default option +# - In interactive mode: shows menu via read with 10s timeout + default fallback +# - Usage: CHOICE=$(msg_menu "Title" "tag1" "Description 1" "tag2" "Desc 2" ...) +# - The first item is always the default +# - Returns the selected tag to stdout +# - If no valid selection or timeout, returns the default (first) tag +# ------------------------------------------------------------------------------ +msg_menu() { + local title="$1" + shift + + # Parse items into parallel arrays: tags[] and descriptions[] + local -a tags=() + local -a descs=() + while [[ $# -ge 2 ]]; do + tags+=("$1") + descs+=("$2") + shift 2 + done + + local default_tag="${tags[0]}" + local count=${#tags[@]} + + # Silent mode: return default immediately + if [[ -n "${PHS_SILENT+x}" ]] && [[ "${PHS_SILENT}" == "1" ]]; then + echo "$default_tag" + return 0 + fi + + # Display menu + echo "" + msg_custom "📋" "${BL}" "${title}" + echo "" + for i in "${!tags[@]}"; do + local marker=" " + [[ $i -eq 0 ]] && marker="* " + printf "${TAB3}${marker}%s) %s\n" "${tags[$i]}" "${descs[$i]}" + done + echo "" + + local selection="" + read -r -t 10 -p "${TAB3}Select [default=${default_tag}, timeout 10s]: " selection || true + + # Validate selection + if [[ -n "$selection" ]]; then + for tag in "${tags[@]}"; do + if [[ "$selection" == "$tag" ]]; then + echo "$selection" + return 0 + fi + done + msg_warn "Invalid selection '${selection}' - using default: ${default_tag}" + fi + + echo "$default_tag" + return 0 +} + # ------------------------------------------------------------------------------ # start() # diff --git a/tools/pve/update-apps.sh b/tools/pve/update-apps.sh index 71d7fcdb0..051d4f2a3 100644 --- a/tools/pve/update-apps.sh +++ b/tools/pve/update-apps.sh @@ -421,6 +421,8 @@ for container in $CHOICE; do if [ $exit_code -eq 0 ]; then msg_ok "Updated container $container" + elif [ $exit_code -eq 75 ]; then + echo -e "${YW}[WARN]${CL} Container $container skipped (requires interactive mode)" elif [ "$BACKUP_CHOICE" == "yes" ]; then msg_info "Restoring LXC from backup" pct stop $container