@@ -1826,9 +1826,9 @@ advanced_settings() {
while [ $STEP -le $MAX_STEP ] ; do
while [ $STEP -le $MAX_STEP ] ; do
case $STEP in
case $STEP in
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 1: Container Type
# STEP 1: Container Type
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
1)
1)
local default_on = "ON"
local default_on = "ON"
local default_off = "OFF"
local default_off = "OFF"
@@ -1851,9 +1851,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 2: Root Password
# STEP 2: Root Password
# ════════════════════════════════════════<EFBFBD> <EFBFBD> <EFBFBD> ═══════════════════════════════<EFBFBD> <EFBFBD> <EFBFBD> ══
# ------------------------------------------------------------------------------
2)
2)
if PW1 = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
if PW1 = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
--title "ROOT PASSWORD" \
--title "ROOT PASSWORD" \
@@ -1905,9 +1905,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 3: Container ID
# STEP 3: Container ID
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
3)
3)
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
--title "CONTAINER ID" \
--title "CONTAINER ID" \
@@ -1939,9 +1939,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 4: Hostname
# STEP 4: Hostname
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
4)
4)
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
--title "HOSTNAME" \
--title "HOSTNAME" \
@@ -1962,9 +1962,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 5: Disk Size
# STEP 5: Disk Size
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
5)
5)
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
--title "DISK SIZE" \
--title "DISK SIZE" \
@@ -1983,9 +1983,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 6: CPU Cores
# STEP 6: CPU Cores
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
6)
6)
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
--title "CPU CORES" \
--title "CPU CORES" \
@@ -2004,9 +2004,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 7: RAM Size
# STEP 7: RAM Size
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
7)
7)
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
--title "RAM SIZE" \
--title "RAM SIZE" \
@@ -2025,9 +2025,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 8: Network Bridge
# STEP 8: Network Bridge
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
8)
8)
if [ [ ${# BRIDGE_MENU_OPTIONS [@] } -eq 0 ] ] ; then
if [ [ ${# BRIDGE_MENU_OPTIONS [@] } -eq 0 ] ] ; then
# Validate default bridge exists
# Validate default bridge exists
@@ -2063,9 +2063,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 9: IPv4 Configuration
# STEP 9: IPv4 Configuration
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
9)
9)
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
--title "IPv4 CONFIGURATION" \
--title "IPv4 CONFIGURATION" \
@@ -2160,9 +2160,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 10: IPv6 Configuration
# STEP 10: IPv6 Configuration
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
10)
10)
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
--title "IPv6 CONFIGURATION" \
--title "IPv6 CONFIGURATION" \
@@ -2235,9 +2235,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 11: MTU Size
# STEP 11: MTU Size
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
11)
11)
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
--title "MTU SIZE" \
--title "MTU SIZE" \
@@ -2255,9 +2255,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 12: DNS Search Domain
# STEP 12: DNS Search Domain
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
12)
12)
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
--title "DNS SEARCH DOMAIN" \
--title "DNS SEARCH DOMAIN" \
@@ -2271,9 +2271,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 13: DNS Server
# STEP 13: DNS Server
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
13)
13)
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
--title "DNS SERVER" \
--title "DNS SERVER" \
@@ -2287,9 +2287,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 14: MAC Address
# STEP 14: MAC Address
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
14)
14)
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
--title "MAC ADDRESS" \
--title "MAC ADDRESS" \
@@ -2307,9 +2307,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 15: VLAN Tag
# STEP 15: VLAN Tag
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
15)
15)
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
--title "VLAN TAG" \
--title "VLAN TAG" \
@@ -2327,9 +2327,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 16: Tags
# STEP 16: Tags
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
16)
16)
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
if result = $( whiptail --backtitle " Proxmox VE Helper Scripts [Step $STEP / $MAX_STEP ] " \
--title "CONTAINER TAGS" \
--title "CONTAINER TAGS" \
@@ -2349,18 +2349,18 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 17: SSH Settings
# STEP 17: SSH Settings
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
17)
17)
configure_ssh_settings " Step $STEP / $MAX_STEP "
configure_ssh_settings " Step $STEP / $MAX_STEP "
# configure_ssh_settings handles its own flow, always advance
# configure_ssh_settings handles its own flow, always advance
( ( STEP++) )
( ( STEP++) )
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 18: FUSE Support
# STEP 18: FUSE Support
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
18)
18)
local fuse_default_flag = "--defaultno"
local fuse_default_flag = "--defaultno"
[ [ " $_enable_fuse " = = "yes" || " $_enable_fuse " = = "1" ] ] && fuse_default_flag = ""
[ [ " $_enable_fuse " = = "yes" || " $_enable_fuse " = = "1" ] ] && fuse_default_flag = ""
@@ -2382,9 +2382,9 @@ advanced_settings() {
( ( STEP++) )
( ( STEP++) )
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 19: TUN/TAP Support
# STEP 19: TUN/TAP Support
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
19)
19)
local tun_default_flag = "--defaultno"
local tun_default_flag = "--defaultno"
[ [ " $_enable_tun " = = "yes" || " $_enable_tun " = = "1" ] ] && tun_default_flag = ""
[ [ " $_enable_tun " = = "yes" || " $_enable_tun " = = "1" ] ] && tun_default_flag = ""
@@ -2406,9 +2406,9 @@ advanced_settings() {
( ( STEP++) )
( ( STEP++) )
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 20: Nesting Support
# STEP 20: Nesting Support
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
20)
20)
local nesting_default_flag = ""
local nesting_default_flag = ""
[ [ " $_enable_nesting " = = "0" || " $_enable_nesting " = = "no" ] ] && nesting_default_flag = "--defaultno"
[ [ " $_enable_nesting " = = "0" || " $_enable_nesting " = = "no" ] ] && nesting_default_flag = "--defaultno"
@@ -2436,9 +2436,9 @@ advanced_settings() {
( ( STEP++) )
( ( STEP++) )
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 21: GPU Passthrough
# STEP 21: GPU Passthrough
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
21)
21)
local gpu_default_flag = "--defaultno"
local gpu_default_flag = "--defaultno"
[ [ " $_enable_gpu " = = "yes" ] ] && gpu_default_flag = ""
[ [ " $_enable_gpu " = = "yes" ] ] && gpu_default_flag = ""
@@ -2460,9 +2460,9 @@ advanced_settings() {
( ( STEP++) )
( ( STEP++) )
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 22: Keyctl Support (Docker/systemd)
# STEP 22: Keyctl Support (Docker/systemd)
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
22)
22)
local keyctl_default_flag = "--defaultno"
local keyctl_default_flag = "--defaultno"
[ [ " $_enable_keyctl " = = "1" ] ] && keyctl_default_flag = ""
[ [ " $_enable_keyctl " = = "1" ] ] && keyctl_default_flag = ""
@@ -2484,9 +2484,9 @@ advanced_settings() {
( ( STEP++) )
( ( STEP++) )
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 23: APT Cacher Proxy
# STEP 23: APT Cacher Proxy
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
23)
23)
local apt_cacher_default_flag = "--defaultno"
local apt_cacher_default_flag = "--defaultno"
[ [ " $_apt_cacher " = = "yes" ] ] && apt_cacher_default_flag = ""
[ [ " $_apt_cacher " = = "yes" ] ] && apt_cacher_default_flag = ""
@@ -2516,9 +2516,9 @@ advanced_settings() {
( ( STEP++) )
( ( STEP++) )
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 24: Container Timezone
# STEP 24: Container Timezone
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
24)
24)
local tz_hint = " $_ct_timezone "
local tz_hint = " $_ct_timezone "
[ [ -z " $tz_hint " ] ] && tz_hint = "(empty - will use host timezone)"
[ [ -z " $tz_hint " ] ] && tz_hint = "(empty - will use host timezone)"
@@ -2541,9 +2541,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 25: Container Protection
# STEP 25: Container Protection
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
25)
25)
local protect_default_flag = "--defaultno"
local protect_default_flag = "--defaultno"
[ [ " $_protect_ct " = = "yes" || " $_protect_ct " = = "1" ] ] && protect_default_flag = ""
[ [ " $_protect_ct " = = "yes" || " $_protect_ct " = = "1" ] ] && protect_default_flag = ""
@@ -2565,9 +2565,9 @@ advanced_settings() {
( ( STEP++) )
( ( STEP++) )
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 26: Device Node Creation (mknod)
# STEP 26: Device Node Creation (mknod)
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
26)
26)
local mknod_default_flag = "--defaultno"
local mknod_default_flag = "--defaultno"
[ [ " $_enable_mknod " = = "1" ] ] && mknod_default_flag = ""
[ [ " $_enable_mknod " = = "1" ] ] && mknod_default_flag = ""
@@ -2589,9 +2589,9 @@ advanced_settings() {
( ( STEP++) )
( ( STEP++) )
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 27: Mount Filesystems
# STEP 27: Mount Filesystems
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
27)
27)
local mount_hint = ""
local mount_hint = ""
[ [ -n " $_mount_fs " ] ] && mount_hint = " $_mount_fs " || mount_hint = "(none)"
[ [ -n " $_mount_fs " ] ] && mount_hint = " $_mount_fs " || mount_hint = "(none)"
@@ -2608,9 +2608,9 @@ advanced_settings() {
fi
fi
; ;
; ;
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# STEP 28: Verbose Mode & Confirmation
# STEP 28: Verbose Mode & Confirmation
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
28)
28)
local verbose_default_flag = "--defaultno"
local verbose_default_flag = "--defaultno"
[ [ " $_verbose " = = "yes" ] ] && verbose_default_flag = ""
[ [ " $_verbose " = = "yes" ] ] && verbose_default_flag = ""
@@ -2676,9 +2676,9 @@ Advanced:
esac
esac
done
done
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
# Apply all collected values to global variables
# Apply all collected values to global variables
# ═══════════════════════════════════════════════════════════════════════════
# ------------------------------------------------------------------------------
CT_TYPE = " $_ct_type "
CT_TYPE = " $_ct_type "
PW = " $_pw "
PW = " $_pw "
CT_ID = " $_ct_id "
CT_ID = " $_ct_id "
@@ -2895,6 +2895,9 @@ echo_default() {
echo -e " ${ DISKSIZE } ${ BOLD } ${ DGN } Disk Size: ${ BGN } ${ DISK_SIZE } GB ${ CL } "
echo -e " ${ DISKSIZE } ${ BOLD } ${ DGN } Disk Size: ${ BGN } ${ DISK_SIZE } GB ${ CL } "
echo -e " ${ CPUCORE } ${ BOLD } ${ DGN } CPU Cores: ${ BGN } ${ CORE_COUNT } ${ CL } "
echo -e " ${ CPUCORE } ${ BOLD } ${ DGN } CPU Cores: ${ BGN } ${ CORE_COUNT } ${ CL } "
echo -e " ${ RAMSIZE } ${ BOLD } ${ DGN } RAM Size: ${ BGN } ${ RAM_SIZE } MiB ${ CL } "
echo -e " ${ RAMSIZE } ${ BOLD } ${ DGN } RAM Size: ${ BGN } ${ RAM_SIZE } MiB ${ CL } "
if [ [ " $( dpkg --print-architecture) " = = "arm64" ] ] ; then
echo -e " ${ INFO } ${ BOLD } ${ DGN } Architecture: ${ BGN } arm64 ${ CL } "
fi
if [ [ -n " ${ var_gpu :- } " && " ${ var_gpu } " = = "yes" ] ] ; then
if [ [ -n " ${ var_gpu :- } " && " ${ var_gpu } " = = "yes" ] ] ; then
echo -e " ${ GPU } ${ BOLD } ${ DGN } GPU Passthrough: ${ BGN } Enabled ${ CL } "
echo -e " ${ GPU } ${ BOLD } ${ DGN } GPU Passthrough: ${ BGN } Enabled ${ CL } "
fi
fi
@@ -3425,6 +3428,9 @@ start() {
set_std_mode
set_std_mode
ensure_profile_loaded
ensure_profile_loaded
get_lxc_ip
get_lxc_ip
if [ [ " $( dpkg --print-architecture) " = = "arm64" ] ] && declare -f update_script_arm64 >/dev/null 2>& 1; then
update_script_arm64
fi
update_script
update_script
update_motd_ip
update_motd_ip
cleanup_lxc
cleanup_lxc
@@ -3453,6 +3459,9 @@ start() {
esac
esac
ensure_profile_loaded
ensure_profile_loaded
get_lxc_ip
get_lxc_ip
if [ [ " $( dpkg --print-architecture) " = = "arm64" ] ] && declare -f update_script_arm64 >/dev/null 2>& 1; then
update_script_arm64
fi
update_script
update_script
update_motd_ip
update_motd_ip
cleanup_lxc
cleanup_lxc
@@ -4076,7 +4085,11 @@ EOF'
msg_warn " Skipping timezone setup – zone ' $tz ' not found in container "
msg_warn " Skipping timezone setup – zone ' $tz ' not found in container "
fi
fi
pct exec " $CTID " -- bash -c "apt-get update 2>&1 && apt-get install -y sudo curl mc gnupg2 jq 2>&1" >>" $BUILD_LOG " 2>& 1 || {
local _base_pkgs = "sudo curl mc gnupg2 jq"
if [ [ " ${ ARCH :- amd64 } " = = "arm64" ] ] ; then
_base_pkgs += " openssh-server wget gcc"
fi
pct exec " $CTID " -- bash -c " apt-get update 2>&1 && apt-get install -y ${ _base_pkgs } 2>&1 " >>" $BUILD_LOG " 2>& 1 || {
msg_error "apt-get base packages installation failed"
msg_error "apt-get base packages installation failed"
install_exit_code = 1
install_exit_code = 1
}
}
@@ -4107,7 +4120,16 @@ EOF'
# that sends "configuring" status AFTER the host already reported "failed"
# that sends "configuring" status AFTER the host already reported "failed"
export CONTAINER_INSTALLING = true
export CONTAINER_INSTALLING = true
lxc-attach -n " $CTID " -- bash -c " $( curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/install/${ var_install } .sh) "
local _install_script
_install_script = " $( curl -fsSL " https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/install/ ${ var_install } .sh " ) "
if [ [ " $ARCH " = = "arm64" ] ] ; then
local _arm_script
_arm_script = " $( curl -fsSL " https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/install/arm/ ${ var_install } .sh " 2>/dev/null || true ) "
if [ [ -n " $_arm_script " ] ] ; then
_install_script = " ${ _arm_script } " $'\n' " ${ _install_script } "
fi
fi
lxc-attach -n " $CTID " -- bash -c " $_install_script "
local lxc_exit = $?
local lxc_exit = $?
unset CONTAINER_INSTALLING
unset CONTAINER_INSTALLING
@@ -4485,7 +4507,16 @@ EOF'
# Re-run install script in existing container (don't destroy/recreate)
# Re-run install script in existing container (don't destroy/recreate)
set +Eeuo pipefail
set +Eeuo pipefail
trap - ERR
trap - ERR
lxc-attach -n " $CTID " -- bash -c " $( curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/install/${ var_install } .sh) "
local _install_script
_install_script = " $( curl -fsSL " https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/install/ ${ var_install } .sh " ) "
if [ [ " $ARCH " = = "arm64" ] ] ; then
local _arm_script
_arm_script = " $( curl -fsSL " https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/install/arm/ ${ var_install } .sh " 2>/dev/null || true ) "
if [ [ -n " $_arm_script " ] ] ; then
_install_script = " ${ _arm_script } " $'\n' " ${ _install_script } "
fi
fi
lxc-attach -n " $CTID " -- bash -c " $_install_script "
local apt_retry_exit = $?
local apt_retry_exit = $?
set -Eeuo pipefail
set -Eeuo pipefail
trap 'error_handler' ERR
trap 'error_handler' ERR
@@ -5004,6 +5035,72 @@ create_lxc_container() {
esac
esac
}
}
ARCH = " $( dpkg --print-architecture) "
# Maps OS type + version to the release variant name used by ARM64 template sources.
arm64_template_variant( ) {
case " $1 " in
debian)
case " $2 " in
12 | 12.*) echo "bookworm" ; ; 13 | 13.*) echo "trixie" ; ;
*) echo "trixie" ; ;
esac
; ;
alpine) echo "3.22" ; ;
ubuntu)
case " $2 " in
24.04* | noble) echo "noble" ; ; 24.10* | oracular) echo "oracular" ; ;
*) echo "jammy" ; ;
esac
; ;
*) return 1 ; ;
esac
}
# Downloads an ARM64 LXC rootfs template to $1.
# Debian: fetches latest release from community-scripts/debian-arm64-lxc on GitHub.
# Others: fetches from jenkins.linuxcontainers.org.
download_arm64_template( ) {
local dest = " $1 " url
mkdir -p " $( dirname " $dest " ) " || {
msg_error "Cannot create template dir."
exit 207
}
if [ [ " $PCT_OSTYPE " = = "debian" ] ] ; then
url = $( curl -fsSL "https://api.github.com/repos/community-scripts/debian-arm64-lxc/releases/latest" |
grep -Eo " https://[^\"]*debian- ${ CUSTOM_TEMPLATE_VARIANT } -arm64-rootfs\.tar\.xz " | head -n1)
[ [ -n " $url " ] ] || {
msg_error " Could not find Debian ${ CUSTOM_TEMPLATE_VARIANT } ARM64 template URL. "
exit 207
}
else
url = " https://jenkins.linuxcontainers.org/job/image- ${ PCT_OSTYPE } /architecture=arm64,release= ${ CUSTOM_TEMPLATE_VARIANT } ,variant=default/lastStableBuild/artifact/rootfs.tar.xz "
fi
msg_info " Downloading ${ PCT_OSTYPE ^ } ${ CUSTOM_TEMPLATE_VARIANT } ARM64 template "
if ! curl -fsSL -o " $dest " " $url " ; then
msg_error " Failed to download ARM64 template from: $url "
exit 208
fi
msg_ok "Downloaded ARM64 LXC template"
}
# Architecture-aware template download wrapper.
# Optional $1 overrides destination path (for local-storage fallback).
download_template( ) {
local dest = " ${ 1 :- $TEMPLATE_PATH } "
if [ [ " $ARCH " = = "arm64" ] ] ; then
download_arm64_template " $dest "
else
pveam download " $TEMPLATE_STORAGE " " $TEMPLATE " >>" ${ BUILD_LOG :- /dev/null } " 2>& 1 || {
msg_error " Failed to download template ' $TEMPLATE ' to storage ' $TEMPLATE_STORAGE ' "
exit 222
}
fi
}
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# Required input variables
# Required input variables
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
@@ -5140,6 +5237,40 @@ create_lxc_container() {
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# Template discovery & validation
# Template discovery & validation
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
CUSTOM_TEMPLATE_VARIANT = ""
if [ [ " $ARCH " = = "arm64" ] ] ; then
# ARM64: use custom template download from linuxcontainers.org / GitHub
msg_info "Preparing ARM64 template"
CUSTOM_TEMPLATE_VARIANT = $( arm64_template_variant " $PCT_OSTYPE " " ${ PCT_OSVERSION :- } " ) || {
msg_error " No ARM64 template mapping for ${ PCT_OSTYPE } ${ PCT_OSVERSION :- latest } "
exit 207
}
TEMPLATE = " ${ PCT_OSTYPE } - ${ CUSTOM_TEMPLATE_VARIANT } -rootfs.tar.xz "
TEMPLATE_SOURCE = "custom-arm64"
# Resolve template path: pvesm → storage.cfg fallback → default
TEMPLATE_PATH = " $( pvesm path " ${ TEMPLATE_STORAGE } :vztmpl/ ${ TEMPLATE } " 2>/dev/null || true ) "
if [ [ -z " $TEMPLATE_PATH " ] ] ; then
local _tpl_base
_tpl_base = $( awk -v s = " $TEMPLATE_STORAGE " '$1==s {f=1} f && /path/ {print $2; exit}' /etc/pve/storage.cfg)
TEMPLATE_PATH = " ${ _tpl_base :- /var/lib/vz } /template/cache/ $TEMPLATE "
fi
# Download if missing, too small, or corrupt (single pass)
if [ [ ! -f " $TEMPLATE_PATH " ] ] ; then
download_arm64_template " $TEMPLATE_PATH "
elif [ [ " $( stat -c%s " $TEMPLATE_PATH " ) " -lt 1000000 ] ] || ! tar -tf " $TEMPLATE_PATH " & >/dev/null; then
msg_warn "Local template invalid – re-downloading."
rm -f " $TEMPLATE_PATH "
download_arm64_template " $TEMPLATE_PATH "
else
msg_ok " Template ${ BL } $TEMPLATE ${ CL } found locally. "
fi
else
TEMPLATE_SEARCH = " ${ PCT_OSTYPE } - ${ PCT_OSVERSION :- } "
TEMPLATE_SEARCH = " ${ PCT_OSTYPE } - ${ PCT_OSVERSION :- } "
case " $PCT_OSTYPE " in
case " $PCT_OSTYPE " in
debian | ubuntu) TEMPLATE_PATTERN = "-standard_" ; ;
debian | ubuntu) TEMPLATE_PATTERN = "-standard_" ; ;
@@ -5236,7 +5367,7 @@ create_lxc_container() {
exit 0
exit 0
fi
fi
else
else
msg_error " No ${ PCT_OSTYPE } templates available at all "
msg_error " No ${ PCT_OSTYPE } templates available "
exit 225
exit 225
fi
fi
fi
fi
@@ -5272,7 +5403,7 @@ create_lxc_container() {
done
done
echo ""
echo ""
read -p " Select version [1- ${# AVAILABLE_VERSIONS [@] } ] or Enter to exit: " choice </dev/tty
read -p " Select version [1- ${# AVAILABLE_VERSIONS [@] } ] or press Enter to exit: " choice </dev/tty
if [ [ " $choice " = ~ ^[ 0-9] +$ ] ] && [ [ " $choice " -ge 1 ] ] && [ [ " $choice " -le ${# AVAILABLE_VERSIONS [@] } ] ] ; then
if [ [ " $choice " = ~ ^[ 0-9] +$ ] ] && [ [ " $choice " -ge 1 ] ] && [ [ " $choice " -le ${# AVAILABLE_VERSIONS [@] } ] ] ; then
export var_version = " ${ AVAILABLE_VERSIONS [ $(( choice - 1 )) ] } "
export var_version = " ${ AVAILABLE_VERSIONS [ $(( choice - 1 )) ] } "
@@ -5345,21 +5476,21 @@ create_lxc_container() {
NEED_DOWNLOAD = 0
NEED_DOWNLOAD = 0
if [ [ ! -f " $TEMPLATE_PATH " ] ] ; then
if [ [ ! -f " $TEMPLATE_PATH " ] ] ; then
msg_info "Template not present locally – will download."
msg_info "Template not present locally, will download it ."
NEED_DOWNLOAD = 1
NEED_DOWNLOAD = 1
elif [ [ ! -r " $TEMPLATE_PATH " ] ] ; then
elif [ [ ! -r " $TEMPLATE_PATH " ] ] ; then
msg_error "Template file exists but is not readable – check permissions."
msg_error "Template file exists but is not readable, check permissions."
exit 221
exit 221
elif [ [ " $( stat -c%s " $TEMPLATE_PATH " ) " -lt 1000000 ] ] ; then
elif [ [ " $( stat -c%s " $TEMPLATE_PATH " ) " -lt 1000000 ] ] ; then
if [ [ -n " $ONLINE_TEMPLATE " ] ] ; then
if [ [ -n " $ONLINE_TEMPLATE " ] ] ; then
msg_warn "Template file too small (<1MB) – re-downloading."
msg_warn "Template file too small (<1MB), re-downloading."
NEED_DOWNLOAD = 1
NEED_DOWNLOAD = 1
else
else
msg_warn "Template looks too small, but no online version exists. Keeping local file."
msg_warn "Template looks too small, but no online version exists. Keeping local file."
fi
fi
elif ! tar -tf " $TEMPLATE_PATH " & >/dev/null; then
elif ! tar -tf " $TEMPLATE_PATH " & >/dev/null; then
if [ [ -n " $ONLINE_TEMPLATE " ] ] ; then
if [ [ -n " $ONLINE_TEMPLATE " ] ] ; then
msg_warn "Template appears corrupted – re-downloading."
msg_warn "Template appears corrupted, re-downloading."
NEED_DOWNLOAD = 1
NEED_DOWNLOAD = 1
else
else
msg_warn "Template appears corrupted, but no online version exists. Keeping local file."
msg_warn "Template appears corrupted, but no online version exists. Keeping local file."
@@ -5398,6 +5529,7 @@ create_lxc_container() {
msg_error " Template $TEMPLATE not available in storage $TEMPLATE_STORAGE after download. "
msg_error " Template $TEMPLATE not available in storage $TEMPLATE_STORAGE after download. "
exit 223
exit 223
fi
fi
fi
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# Dynamic preflight for Debian 13.x: offer upgrade if available (no hard mins)
# Dynamic preflight for Debian 13.x: offer upgrade if available (no hard mins)
@@ -5475,19 +5607,13 @@ create_lxc_container() {
if [ [ ! -s " $TEMPLATE_PATH " || " $( stat -c%s " $TEMPLATE_PATH " 2>/dev/null || echo 0) " -lt 1000000 ] ] ; then
if [ [ ! -s " $TEMPLATE_PATH " || " $( stat -c%s " $TEMPLATE_PATH " 2>/dev/null || echo 0) " -lt 1000000 ] ] ; then
msg_info "Template file missing or too small – downloading"
msg_info "Template file missing or too small – downloading"
rm -f " $TEMPLATE_PATH "
rm -f " $TEMPLATE_PATH "
pveam download " $TEMPLATE_STORAGE " " $TEMPLATE " >>" ${ BUILD_LOG :- /dev/null } " 2>& 1 || {
download_template
msg_error " Failed to download template ' $TEMPLATE ' to storage ' $TEMPLATE_STORAGE ' "
exit 222
}
msg_ok "Template downloaded"
msg_ok "Template downloaded"
elif ! tar -tf " $TEMPLATE_PATH " & >/dev/null; then
elif ! tar -tf " $TEMPLATE_PATH " & >/dev/null; then
if [ [ -n " $ONLINE_TEMPLATE " ] ] ; then
if [ [ " $ARCH " = = "arm64" || -n " $ONLINE_TEMPLATE " ] ] ; then
msg_info "Template appears corrupted – re-downloading"
msg_info "Template appears corrupted – re-downloading"
rm -f " $TEMPLATE_PATH "
rm -f " $TEMPLATE_PATH "
pveam download " $TEMPLATE_STORAGE " " $TEMPLATE " >>" ${ BUILD_LOG :- /dev/null } " 2>& 1 || {
download_template
msg_error " Failed to re-download template ' $TEMPLATE ' "
exit 222
}
msg_ok "Template re-downloaded"
msg_ok "Template re-downloaded"
else
else
msg_warn "Template appears corrupted, but no online version exists. Skipping re-download."
msg_warn "Template appears corrupted, but no online version exists. Skipping re-download."
@@ -5508,7 +5634,7 @@ create_lxc_container() {
if grep -qiE 'unable to open|corrupt|invalid' " $LOGFILE " ; then
if grep -qiE 'unable to open|corrupt|invalid' " $LOGFILE " ; then
msg_info "Template may be corrupted – re-downloading"
msg_info "Template may be corrupted – re-downloading"
rm -f " $TEMPLATE_PATH "
rm -f " $TEMPLATE_PATH "
pveam download " $TEMPLATE_STORAGE " " $TEMPLATE " >>" ${ BUILD_LOG :- /dev/null } " 2>& 1
download_template
msg_ok "Template re-downloaded"
msg_ok "Template re-downloaded"
fi
fi
@@ -5521,7 +5647,11 @@ create_lxc_container() {
if [ [ ! -f " $LOCAL_TEMPLATE_PATH " ] ] ; then
if [ [ ! -f " $LOCAL_TEMPLATE_PATH " ] ] ; then
msg_ok "Trying local storage fallback"
msg_ok "Trying local storage fallback"
msg_info "Downloading template to local"
msg_info "Downloading template to local"
if [ [ " $ARCH " = = "arm64" ] ] ; then
download_arm64_template " $LOCAL_TEMPLATE_PATH "
else
pveam download local " $TEMPLATE " >>" ${ BUILD_LOG :- /dev/null } " 2>& 1
pveam download local " $TEMPLATE " >>" ${ BUILD_LOG :- /dev/null } " 2>& 1
fi
msg_ok "Template downloaded to local"
msg_ok "Template downloaded to local"
else
else
msg_ok "Trying local storage fallback"
msg_ok "Trying local storage fallback"