From 4c4f4ecfe6ae91dc0e075fb12ee6c8b2e8f22e1d Mon Sep 17 00:00:00 2001 From: CanbiZ <47820557+MickLesk@users.noreply.github.com> Date: Tue, 16 Sep 2025 13:13:20 +0200 Subject: [PATCH] Refactor and modernize build.func script Refactored case statements and conditional checks to use more idiomatic and consistent Bash syntax. Replaced German comments with English, improved readability by splitting long lines, and standardized variable assignments. Enhanced maintainability by using case/esac and if/then constructs, and replaced double-bracketed conditionals with POSIX-compliant single brackets where appropriate. --- misc/build.func | 402 +++++++++++++++++++++++++----------------------- 1 file changed, 209 insertions(+), 193 deletions(-) diff --git a/misc/build.func b/misc/build.func index a2a8837c..65a1d9ba 100644 --- a/misc/build.func +++ b/misc/build.func @@ -1192,7 +1192,10 @@ _is_whitelisted_key() { _sanitize_value() { # Disallow Command-Substitution / Shell-Meta case "$1" in - *'$('*|*'`'*|*';'*|*'&'*|*'<('* ) echo ""; return 0 ;; + *'$('* | *'`'* | *';'* | *'&'* | *'<('*) + echo "" + return 0 + ;; esac echo "$1" } @@ -1205,7 +1208,8 @@ _load_vars_file_to_map() { [[ -f "$file" ]] || return 0 local line while IFS= read -r line || [[ -n "$line" ]]; do - line="${line#"${line%%[![:space:]]*}"}"; line="${line%"${line##*[![:space:]]}"}" + line="${line#"${line%%[![:space:]]*}"}" + line="${line%"${line##*[![:space:]]}"}" [[ -z "$line" || "$line" == \#* ]] && continue if [[ "$line" =~ ^([A-Za-z_][A-Za-z0-9_]*)=(.*)$ ]]; then local k="${BASH_REMATCH[1]}" @@ -1225,8 +1229,10 @@ _build_vars_diff() { local oldf="$1" newf="$2" local k local -A OLD=() NEW=() - _load_vars_file_to_map "$oldf"; for k in "${!_VARS_IN[@]}"; do OLD["$k"]="${_VARS_IN[$k]}"; done - _load_vars_file_to_map "$newf"; for k in "${!_VARS_IN[@]}"; do NEW["$k"]="${_VARS_IN[$k]}"; done + _load_vars_file_to_map "$oldf" + for k in "${!_VARS_IN[@]}"; do OLD["$k"]="${_VARS_IN[$k]}"; done + _load_vars_file_to_map "$newf" + for k in "${!_VARS_IN[@]}"; do NEW["$k"]="${_VARS_IN[$k]}"; done local out out+="# Diff for ${APP} (${NSAPP})\n" @@ -1262,58 +1268,70 @@ _build_vars_diff() { printf "%b" "$out" } -# Baut aus der aktuellen Advanced-Auswahl eine temporäre .vars-Datei +# Build a temporary .vars file from current advanced settings _build_current_app_vars_tmp() { - local tmpf - tmpf="$(mktemp -p /tmp "${NSAPP:-app}.vars.new.XXXXXX")" + tmpf="$(mktemp /tmp/${NSAPP:-app}.vars.new.XXXXXX)" # NET/GW - local _net="${NET:-}" - local _gate="" - [[ "${GATE:-}" =~ ^,gw= ]] && _gate="${GATE#,gw=}" - - # IPv6 - local _ipv6_method="${IPV6_METHOD:-auto}" - local _ipv6_static="" - local _ipv6_gateway="" - case "$_ipv6_method" in - static) - _ipv6_static="${IPV6_ADDR:-}" - _ipv6_gateway="${IPV6_GATE:-}" - ;; + _net="${NET:-}" + _gate="" + case "${GATE:-}" in + ,gw=*) _gate=$(echo "$GATE" | sed 's/^,gw=//') ;; esac - # MTU/VLAN/MAC - local _mtu="" _vlan="" _mac="" - [[ "${MTU:-}" =~ ^,mtu= ]] && _mtu="${MTU#,mtu=}" - [[ "${VLAN:-}" =~ ^,tag= ]] && _vlan="${VLAN#,tag=}" - [[ "${MAC:-}" =~ ^,hwaddr=]] && _mac="${MAC#,hwaddr=}" + # IPv6 + _ipv6_method="${IPV6_METHOD:-auto}" + _ipv6_static="" + _ipv6_gateway="" + if [ "$_ipv6_method" = "static" ]; then + _ipv6_static="${IPV6_ADDR:-}" + _ipv6_gateway="${IPV6_GATE:-}" + fi - # DNS/SD - local _ns="" _searchdomain="" - [[ "${NS:-}" =~ ^-nameserver= ]] && _ns="${NS#-nameserver=}" - [[ "${SD:-}" =~ ^-searchdomain= ]] && _searchdomain="${SD#-searchdomain=}" + # MTU/VLAN/MAC + _mtu="" + _vlan="" + _mac="" + case "${MTU:-}" in + ,mtu=*) _mtu=$(echo "$MTU" | sed 's/^,mtu=//') ;; + esac + case "${VLAN:-}" in + ,tag=*) _vlan=$(echo "$VLAN" | sed 's/^,tag=//') ;; + esac + case "${MAC:-}" in + ,hwaddr=*) _mac=$(echo "$MAC" | sed 's/^,hwaddr=//') ;; + esac + + # DNS / Searchdomain + _ns="" + _searchdomain="" + case "${NS:-}" in + -nameserver=*) _ns=$(echo "$NS" | sed 's/^-nameserver=//') ;; + esac + case "${SD:-}" in + -searchdomain=*) _searchdomain=$(echo "$SD" | sed 's/^-searchdomain=//') ;; + esac # SSH / APT / Features - local _ssh="${SSH:-no}" - local _ssh_auth="${SSH_AUTHORIZED_KEY:-}" - local _apt_cacher="${APT_CACHER:-}" - local _apt_cacher_ip="${APT_CACHER_IP:-}" - local _fuse="${ENABLE_FUSE:-no}" - local _tun="${ENABLE_TUN:-no}" - local _tags="${TAGS:-}" - local _verbose="${VERBOSE:-no}" + _ssh="${SSH:-no}" + _ssh_auth="${SSH_AUTHORIZED_KEY:-}" + _apt_cacher="${APT_CACHER:-}" + _apt_cacher_ip="${APT_CACHER_IP:-}" + _fuse="${ENABLE_FUSE:-no}" + _tun="${ENABLE_TUN:-no}" + _tags="${TAGS:-}" + _verbose="${VERBOSE:-no}" - # Typ/Resourcen/Identity - local _unpriv="${CT_TYPE:-1}" - local _cpu="${CORE_COUNT:-1}" - local _ram="${RAM_SIZE:-1024}" - local _disk="${DISK_SIZE:-4}" - local _hostname="${HN:-$NSAPP}" + # Type / Resources / Identity + _unpriv="${CT_TYPE:-1}" + _cpu="${CORE_COUNT:-1}" + _ram="${RAM_SIZE:-1024}" + _disk="${DISK_SIZE:-4}" + _hostname="${HN:-$NSAPP}" - # Storage (falls vorhanden) - local _tpl_storage="${TEMPLATE_STORAGE:-}" - local _ct_storage="${CONTAINER_STORAGE:-}" + # Storage + _tpl_storage="${TEMPLATE_STORAGE:-}" + _ct_storage="${CONTAINER_STORAGE:-}" { echo "# App-specific defaults for ${APP} (${NSAPP})" @@ -1325,33 +1343,33 @@ _build_current_app_vars_tmp() { echo "var_ram=$(_sanitize_value "$_ram")" echo "var_disk=$(_sanitize_value "$_disk")" - [[ -n "${BRG:-}" ]] && echo "var_brg=$(_sanitize_value "$BRG")" - [[ -n "$_net" ]] && echo "var_net=$(_sanitize_value "$_net")" - [[ -n "$_gate" ]] && echo "var_gateway=$(_sanitize_value "$_gate")" - [[ -n "$_mtu" ]] && echo "var_mtu=$(_sanitize_value "$_mtu")" - [[ -n "$_vlan" ]] && echo "var_vlan=$(_sanitize_value "$_vlan")" - [[ -n "$_mac" ]] && echo "var_mac=$(_sanitize_value "$_mac")" - [[ -n "$_ns" ]] && echo "var_ns=$(_sanitize_value "$_ns")" + [ -n "${BRG:-}" ] && echo "var_brg=$(_sanitize_value "$BRG")" + [ -n "$_net" ] && echo "var_net=$(_sanitize_value "$_net")" + [ -n "$_gate" ] && echo "var_gateway=$(_sanitize_value "$_gate")" + [ -n "$_mtu" ] && echo "var_mtu=$(_sanitize_value "$_mtu")" + [ -n "$_vlan" ] && echo "var_vlan=$(_sanitize_value "$_vlan")" + [ -n "$_mac" ] && echo "var_mac=$(_sanitize_value "$_mac")" + [ -n "$_ns" ] && echo "var_ns=$(_sanitize_value "$_ns")" - [[ -n "$_ipv6_method" ]] && echo "var_ipv6_method=$(_sanitize_value "$_ipv6_method")" - [[ -n "$_ipv6_static" ]] && echo "var_ipv6_static=$(_sanitize_value "$_ipv6_static")" + [ -n "$_ipv6_method" ] && echo "var_ipv6_method=$(_sanitize_value "$_ipv6_method")" + [ -n "$_ipv6_static" ] && echo "var_ipv6_static=$(_sanitize_value "$_ipv6_static")" - [[ -n "$_ssh" ]] && echo "var_ssh=$(_sanitize_value "$_ssh")" - [[ -n "$_ssh_auth" ]] && echo "var_ssh_authorized_key=$(_sanitize_value "$_ssh_auth")" + [ -n "$_ssh" ] && echo "var_ssh=$(_sanitize_value "$_ssh")" + [ -n "$_ssh_auth" ] && echo "var_ssh_authorized_key=$(_sanitize_value "$_ssh_auth")" - [[ -n "$_apt_cacher" ]] && echo "var_apt_cacher=$(_sanitize_value "$_apt_cacher")" - [[ -n "$_apt_cacher_ip" ]] && echo "var_apt_cacher_ip=$(_sanitize_value "$_apt_cacher_ip")" + [ -n "$_apt_cacher" ] && echo "var_apt_cacher=$(_sanitize_value "$_apt_cacher")" + [ -n "$_apt_cacher_ip" ] && echo "var_apt_cacher_ip=$(_sanitize_value "$_apt_cacher_ip")" - [[ -n "$_fuse" ]] && echo "var_fuse=$(_sanitize_value "$_fuse")" - [[ -n "$_tun" ]] && echo "var_tun=$(_sanitize_value "$_tun")" - [[ -n "$_tags" ]] && echo "var_tags=$(_sanitize_value "$_tags")" - [[ -n "$_verbose" ]] && echo "var_verbose=$(_sanitize_value "$_verbose")" + [ -n "$_fuse" ] && echo "var_fuse=$(_sanitize_value "$_fuse")" + [ -n "$_tun" ] && echo "var_tun=$(_sanitize_value "$_tun")" + [ -n "$_tags" ] && echo "var_tags=$(_sanitize_value "$_tags")" + [ -n "$_verbose" ] && echo "var_verbose=$(_sanitize_value "$_verbose")" - [[ -n "$_hostname" ]] && echo "var_hostname=$(_sanitize_value "$_hostname")" - [[ -n "$_searchdomain" ]] && echo "var_searchdomain=$(_sanitize_value "$_searchdomain")" + [ -n "$_hostname" ] && echo "var_hostname=$(_sanitize_value "$_hostname")" + [ -n "$_searchdomain" ] && echo "var_searchdomain=$(_sanitize_value "$_searchdomain")" - [[ -n "$_tpl_storage" ]] && echo "var_template_storage=$(_sanitize_value "$_tpl_storage")" - [[ -n "$_ct_storage" ]] && echo "var_container_storage=$(_sanitize_value "$_ct_storage")" + [ -n "$_tpl_storage" ] && echo "var_template_storage=$(_sanitize_value "$_tpl_storage")" + [ -n "$_ct_storage" ] && echo "var_container_storage=$(_sanitize_value "$_ct_storage")" } >"$tmpf" echo "$tmpf" @@ -1398,38 +1416,37 @@ maybe_offer_save_app_defaults() { --title "APP DEFAULTS – ${APP}" \ --menu "Differences detected. What do you want to do?" 20 78 10 \ "Update Defaults" "Write new values to ${app_vars_path}" \ - "Keep Current" "Keep existing defaults (no changes)" \ - "View Diff" "Show a detailed diff" \ - "Cancel" "Abort without changes" \ + "Keep Current" "Keep existing defaults (no changes)" \ + "View Diff" "Show a detailed diff" \ + "Cancel" "Abort without changes" \ --default-item "Update Defaults" \ 3>&1 1>&2 2>&3)" || { sel="Cancel"; } case "$sel" in - "Update Defaults") - install -m 0644 "$new_tmp" "$app_vars_path" - msg_ok "Updated app defaults: ${app_vars_path}" - break - ;; - "Keep Current") - msg_info "Keeping current app defaults: ${app_vars_path}" - break - ;; - "View Diff") - whiptail --backtitle "[dev] Proxmox VE Helper Scripts" \ - --title "Diff – ${APP}" \ - --scrolltext --textbox "$diff_tmp" 25 100 - ;; - "Cancel"|*) - msg_info "Canceled. No changes to app defaults." - break - ;; + "Update Defaults") + install -m 0644 "$new_tmp" "$app_vars_path" + msg_ok "Updated app defaults: ${app_vars_path}" + break + ;; + "Keep Current") + msg_info "Keeping current app defaults: ${app_vars_path}" + break + ;; + "View Diff") + whiptail --backtitle "[dev] Proxmox VE Helper Scripts" \ + --title "Diff – ${APP}" \ + --scrolltext --textbox "$diff_tmp" 25 100 + ;; + "Cancel" | *) + msg_info "Canceled. No changes to app defaults." + break + ;; esac done rm -f "$new_tmp" "$diff_tmp" } - install_script() { pve_check shell_check @@ -1450,31 +1467,31 @@ install_script() { # --- PRESET support --- if [ -n "${PRESET:-}" ]; then case "$PRESET" in - DEFAULT | default | 1) - CHOICE="1" - ;; - VERBOSE | verbose | 2) - CHOICE="2" - ;; - ADVANCED | advanced | 3) - CHOICE="3" - ;; - MYDEFAULTS | mydefaults | 4) - CHOICE="4" - ;; - APPDEFAULTS | appdefaults | 5) - CHOICE="5" - ;; - DIAGNOSTICS | diagnostics | 6) - CHOICE="6" - ;; - STORAGE | storage | 7) - CHOICE="7" - ;; - *) - echo -e "\n${CROSS}${RD}Invalid PRESET value: ${PRESET}${CL}\n" - exit 1 - ;; + DEFAULT | default | 1) + CHOICE="1" + ;; + VERBOSE | verbose | 2) + CHOICE="2" + ;; + ADVANCED | advanced | 3) + CHOICE="3" + ;; + MYDEFAULTS | mydefaults | 4) + CHOICE="4" + ;; + APPDEFAULTS | appdefaults | 5) + CHOICE="5" + ;; + DIAGNOSTICS | diagnostics | 6) + CHOICE="6" + ;; + STORAGE | storage | 7) + CHOICE="7" + ;; + *) + echo -e "\n${CROSS}${RD}Invalid PRESET value: ${PRESET}${CL}\n" + exit 1 + ;; esac else # Build dynamic menu @@ -1507,77 +1524,77 @@ install_script() { fi case $CHOICE in - 1) + 1) + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings on node $PVEHOST_NAME${CL}" + VERBOSE="no" + METHOD="default" + base_settings "$VERBOSE" + echo_default + ;; + 2) + header_info + echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings on node $PVEHOST_NAME (Verbose)${CL}" + VERBOSE="yes" + METHOD="default" + base_settings "$VERBOSE" + echo_default + ;; + 3) + header_info + echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Install on node $PVEHOST_NAME${CL}" + METHOD="advanced" + base_settings + advanced_settings + maybe_offer_save_app_defaults + ;; + 4) + default_var_settings || { + msg_error "Failed to apply default.vars" + exit 1 + } + ;; + 5) + # App Defaults + if [ -f "$(get_app_defaults_path)" ]; then header_info - echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings on node $PVEHOST_NAME${CL}" - VERBOSE="no" - METHOD="default" - base_settings "$VERBOSE" - echo_default - ;; - 2) - header_info - echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings on node $PVEHOST_NAME (Verbose)${CL}" - VERBOSE="yes" - METHOD="default" - base_settings "$VERBOSE" - echo_default - ;; - 3) - header_info - echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Install on node $PVEHOST_NAME${CL}" - METHOD="advanced" + echo -e "${DEFAULT}${BOLD}${BL}Using App Defaults for ${APP} on node $PVEHOST_NAME${CL}" + METHOD="appdefaults" base_settings - advanced_settings - maybe_offer_save_app_defaults - ;; - 4) - default_var_settings || { - msg_error "Failed to apply default.vars" - exit 1 - } - ;; - 5) - # App Defaults - if [ -f "$(get_app_defaults_path)" ]; then - header_info - echo -e "${DEFAULT}${BOLD}${BL}Using App Defaults for ${APP} on node $PVEHOST_NAME${CL}" - METHOD="appdefaults" - base_settings - _load_vars_file "$(get_app_defaults_path)" - echo_default - else - msg_error "No App Defaults available for ${APP}" - exit 1 + _load_vars_file "$(get_app_defaults_path)" + echo_default + else + msg_error "No App Defaults available for ${APP}" + exit 1 + fi + ;; + 6) + if [[ $DIAGNOSTICS == "yes" ]]; then + if whiptail --backtitle "[dev] Proxmox VE Helper Scripts" --title "DIAGNOSTIC SETTINGS" --yesno "Send Diagnostics?\n\nCurrent: ${DIAGNOSTICS}" 10 58 \ + --yes-button "No" --no-button "Back"; then + DIAGNOSTICS="no" + sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=no/' /usr/local/community-scripts/diagnostics + whiptail --msgbox "Diagnostics set to ${DIAGNOSTICS}." 8 58 fi - ;; - 6) - if [[ $DIAGNOSTICS == "yes" ]]; then - if whiptail --backtitle "[dev] Proxmox VE Helper Scripts" --title "DIAGNOSTIC SETTINGS" --yesno "Send Diagnostics?\n\nCurrent: ${DIAGNOSTICS}" 10 58 \ - --yes-button "No" --no-button "Back"; then - DIAGNOSTICS="no" - sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=no/' /usr/local/community-scripts/diagnostics - whiptail --msgbox "Diagnostics set to ${DIAGNOSTICS}." 8 58 - fi - else - if whiptail --backtitle "[dev] Proxmox VE Helper Scripts" --title "DIAGNOSTIC SETTINGS" --yesno "Send Diagnostics?\n\nCurrent: ${DIAGNOSTICS}" 10 58 \ - --yes-button "Yes" --no-button "Back"; then - DIAGNOSTICS="yes" - sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=yes/' /usr/local/community-scripts/diagnostics - whiptail --msgbox "Diagnostics set to ${DIAGNOSTICS}." 8 58 - fi + else + if whiptail --backtitle "[dev] Proxmox VE Helper Scripts" --title "DIAGNOSTIC SETTINGS" --yesno "Send Diagnostics?\n\nCurrent: ${DIAGNOSTICS}" 10 58 \ + --yes-button "Yes" --no-button "Back"; then + DIAGNOSTICS="yes" + sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=yes/' /usr/local/community-scripts/diagnostics + whiptail --msgbox "Diagnostics set to ${DIAGNOSTICS}." 8 58 fi - ;; - 7) - storage_settings_menu - ;; - 8) - echo -e "\n${CROSS}${RD}Script terminated.${CL}\n" - exit 0 - ;; - *) - echo -e "${CROSS}${RD}Invalid option, please try again.${CL}" - ;; + fi + ;; + 7) + storage_settings_menu + ;; + 8) + echo -e "\n${CROSS}${RD}Script terminated.${CL}\n" + exit 0 + ;; + *) + echo -e "${CROSS}${RD}Invalid option, please try again.${CL}" + ;; esac } @@ -1653,21 +1670,20 @@ storage_settings_menu() { "${menu_items[@]}" 3>&1 1>&2 2>&3) || return 0 case "$choice" in - 1) - check_storage_or_prompt "/usr/local/community-scripts/default.vars" - ;; - 2) - if [ -f "$(get_app_defaults_path)" ]; then - check_storage_or_prompt "$(get_app_defaults_path)" - fi - ;; - 3) - return 0 - ;; + 1) + check_storage_or_prompt "/usr/local/community-scripts/default.vars" + ;; + 2) + if [ -f "$(get_app_defaults_path)" ]; then + check_storage_or_prompt "$(get_app_defaults_path)" + fi + ;; + 3) + return 0 + ;; esac } - check_container_resources() { # Check actual RAM & Cores current_ram=$(free -m | awk 'NR==2{print $2}')