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.
This commit is contained in:
CanbiZ 2025-09-16 13:13:20 +02:00
parent d6a1183824
commit 4c4f4ecfe6

View File

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