Merge branch 'community-scripts:main' into byparr
This commit is contained in:
214
misc/build.func
214
misc/build.func
@@ -535,35 +535,6 @@ base_settings() {
|
||||
TAGS="community-script,${var_tags:-}"
|
||||
ENABLE_FUSE=${var_fuse:-"${1:-no}"}
|
||||
ENABLE_TUN=${var_tun:-"${1:-no}"}
|
||||
ENABLE_NESTING=${var_nesting:-"${1:-1}"}
|
||||
ENABLE_KEYCTL=${var_keyctl:-"${1:-0}"}
|
||||
ALLOW_MOUNT_FS=${var_mount_fs:-""}
|
||||
ENABLE_MKNOD=${var_mknod:-"${1:-0}"}
|
||||
PROTECT_CT=${var_protection:-"${1:-no}"}
|
||||
CT_TIMEZONE=${var_timezone:-""}
|
||||
|
||||
# Normalize feature flags to 0/1 immediately (pct requires numeric values, not yes/no)
|
||||
# This must happen here before any usage of these variables
|
||||
case "${ENABLE_NESTING,,}" in
|
||||
yes | true) ENABLE_NESTING="1" ;;
|
||||
no | false) ENABLE_NESTING="0" ;;
|
||||
esac
|
||||
case "${ENABLE_KEYCTL,,}" in
|
||||
yes | true) ENABLE_KEYCTL="1" ;;
|
||||
no | false) ENABLE_KEYCTL="0" ;;
|
||||
esac
|
||||
case "${ENABLE_MKNOD,,}" in
|
||||
yes | true) ENABLE_MKNOD="1" ;;
|
||||
no | false) ENABLE_MKNOD="0" ;;
|
||||
esac
|
||||
case "${ENABLE_FUSE,,}" in
|
||||
yes | true) ENABLE_FUSE="1" ;;
|
||||
no | false) ENABLE_FUSE="0" ;;
|
||||
esac
|
||||
case "${PROTECT_CT,,}" in
|
||||
yes | true) PROTECT_CT="1" ;;
|
||||
no | false) PROTECT_CT="0" ;;
|
||||
esac
|
||||
|
||||
# Since these 2 are only defined outside of default_settings function, we add a temporary fallback. TODO: To align everything, we should add these as constant variables (e.g. OSTYPE and OSVERSION), but that would currently require updating the default_settings function for all existing scripts
|
||||
if [ -z "$var_os" ]; then
|
||||
@@ -1795,7 +1766,16 @@ install_script() {
|
||||
fi
|
||||
|
||||
NEXTID=$(pvesh get /cluster/nextid)
|
||||
timezone=$(cat /etc/timezone)
|
||||
|
||||
# Get timezone using timedatectl (Debian 13+ compatible)
|
||||
# Fallback to /etc/timezone for older systems
|
||||
if command -v timedatectl >/dev/null 2>&1; then
|
||||
timezone=$(timedatectl show --value --property=Timezone 2>/dev/null || echo "UTC")
|
||||
elif [ -f /etc/timezone ]; then
|
||||
timezone=$(cat /etc/timezone)
|
||||
else
|
||||
timezone="UTC"
|
||||
fi
|
||||
|
||||
# Show APP Header
|
||||
header_info
|
||||
@@ -2289,35 +2269,19 @@ build_container() {
|
||||
none) ;;
|
||||
esac
|
||||
|
||||
# Build FEATURES array with advanced settings
|
||||
# Note: All feature flags are already normalized to 0/1 in default_settings()
|
||||
# Proxmox requires each feature as a separate parameter, not comma-separated string
|
||||
FEATURES_ARRAY=()
|
||||
FEATURES_ARRAY+=("nesting=${ENABLE_NESTING}")
|
||||
|
||||
# keyctl: needed for Docker inside containers (systemd-networkd workaround)
|
||||
# Typically needed for unprivileged containers with Docker
|
||||
if [ "$CT_TYPE" == "1" ] || [ "$ENABLE_KEYCTL" == "1" ]; then
|
||||
FEATURES_ARRAY+=("keyctl=1")
|
||||
# Build FEATURES string (simple working version)
|
||||
if [ "$CT_TYPE" == "1" ]; then
|
||||
FEATURES="keyctl=1,nesting=1"
|
||||
else
|
||||
FEATURES="nesting=1"
|
||||
fi
|
||||
|
||||
# mknod: allow device node creation (requires kernel 5.3+, experimental)
|
||||
if [ "$ENABLE_MKNOD" == "1" ]; then
|
||||
FEATURES_ARRAY+=("mknod=1")
|
||||
if [ "$ENABLE_FUSE" == "yes" ]; then
|
||||
FEATURES="$FEATURES,fuse=1"
|
||||
fi
|
||||
|
||||
# FUSE: required for rclone, mergerfs, AppImage, etc.
|
||||
if [ "$ENABLE_FUSE" == "1" ]; then
|
||||
FEATURES_ARRAY+=("fuse=1")
|
||||
fi
|
||||
|
||||
# mount: allow specific filesystems (e.g., nfs, ext4, etc.)
|
||||
# Format: mount=fstype1;fstype2;fstype3 (semicolon-separated, not comma!)
|
||||
if [ -n "$ALLOW_MOUNT_FS" ]; then
|
||||
# Replace commas with semicolons for proper pct syntax
|
||||
ALLOW_MOUNT_FS_FORMATTED="${ALLOW_MOUNT_FS//,/;}"
|
||||
FEATURES_ARRAY+=("mount=$ALLOW_MOUNT_FS_FORMATTED")
|
||||
fi
|
||||
# NEW IMPLEMENTATION (Fixed): Build PCT_OPTIONS properly
|
||||
# Key insight: Bash cannot export arrays, so we build the options as a string
|
||||
|
||||
TEMP_DIR=$(mktemp -d)
|
||||
pushd "$TEMP_DIR" >/dev/null
|
||||
@@ -2326,19 +2290,11 @@ build_container() {
|
||||
else
|
||||
export FUNCTIONS_FILE_PATH="$(curl -fsSL https://raw.githubusercontent.com/luismco/ProxmoxVED/refs/heads/byparr/misc/install.func)"
|
||||
fi
|
||||
|
||||
# Core exports for install.func
|
||||
export DIAGNOSTICS="$DIAGNOSTICS"
|
||||
export RANDOM_UUID="$RANDOM_UUID"
|
||||
export SESSION_ID="$SESSION_ID"
|
||||
export BUILD_LOG="$BUILD_LOG"
|
||||
export INSTALL_LOG="/root/.install-${SESSION_ID}.log"
|
||||
export dev_mode="${dev_mode:-}"
|
||||
export DEV_MODE_MOTD="${DEV_MODE_MOTD:-false}"
|
||||
export DEV_MODE_KEEP="${DEV_MODE_KEEP:-false}"
|
||||
export DEV_MODE_TRACE="${DEV_MODE_TRACE:-false}"
|
||||
export DEV_MODE_PAUSE="${DEV_MODE_PAUSE:-false}"
|
||||
export DEV_MODE_BREAKPOINT="${DEV_MODE_BREAKPOINT:-false}"
|
||||
export DEV_MODE_LOGS="${DEV_MODE_LOGS:-false}"
|
||||
export DEV_MODE_DRYRUN="${DEV_MODE_DRYRUN:-false}"
|
||||
export CACHER="$APT_CACHER"
|
||||
export CACHER_IP="$APT_CACHER_IP"
|
||||
export tz="$timezone"
|
||||
@@ -2352,61 +2308,75 @@ build_container() {
|
||||
export CTTYPE="$CT_TYPE"
|
||||
export ENABLE_FUSE="$ENABLE_FUSE"
|
||||
export ENABLE_TUN="$ENABLE_TUN"
|
||||
export ENABLE_NESTING="$ENABLE_NESTING"
|
||||
export ENABLE_KEYCTL="$ENABLE_KEYCTL"
|
||||
export ENABLE_MKNOD="$ENABLE_MKNOD"
|
||||
export ALLOW_MOUNT_FS="$ALLOW_MOUNT_FS"
|
||||
export PROTECT_CT="$PROTECT_CT"
|
||||
export CT_TIMEZONE="$CT_TIMEZONE"
|
||||
export PCT_OSTYPE="$var_os"
|
||||
export PCT_OSVERSION="$var_version"
|
||||
export PCT_DISK_SIZE="$DISK_SIZE"
|
||||
|
||||
# Build PCT_OPTIONS array (not string) for proper parameter handling
|
||||
PCT_OPTIONS=()
|
||||
# DEV_MODE exports (optional, for debugging)
|
||||
export BUILD_LOG="$BUILD_LOG"
|
||||
export INSTALL_LOG="/root/.install-${SESSION_ID}.log"
|
||||
export dev_mode="${dev_mode:-}"
|
||||
export DEV_MODE_MOTD="${DEV_MODE_MOTD:-false}"
|
||||
export DEV_MODE_KEEP="${DEV_MODE_KEEP:-false}"
|
||||
export DEV_MODE_TRACE="${DEV_MODE_TRACE:-false}"
|
||||
export DEV_MODE_PAUSE="${DEV_MODE_PAUSE:-false}"
|
||||
export DEV_MODE_BREAKPOINT="${DEV_MODE_BREAKPOINT:-false}"
|
||||
export DEV_MODE_LOGS="${DEV_MODE_LOGS:-false}"
|
||||
export DEV_MODE_DRYRUN="${DEV_MODE_DRYRUN:-false}"
|
||||
|
||||
# Add features - each as separate -features parameter
|
||||
for feature in "${FEATURES_ARRAY[@]}"; do
|
||||
PCT_OPTIONS+=("-features" "$feature")
|
||||
done
|
||||
|
||||
PCT_OPTIONS+=("-hostname" "$HN")
|
||||
PCT_OPTIONS+=("-tags" "$TAGS")
|
||||
# Build PCT_OPTIONS as multi-line string
|
||||
PCT_OPTIONS_STRING=" -features $FEATURES
|
||||
-hostname $HN
|
||||
-tags $TAGS"
|
||||
|
||||
# Add storage if specified
|
||||
if [ -n "$SD" ]; then
|
||||
PCT_OPTIONS+=($SD) # Storage device flags (already formatted)
|
||||
PCT_OPTIONS_STRING="$PCT_OPTIONS_STRING
|
||||
$SD"
|
||||
fi
|
||||
|
||||
# Add nameserver if specified
|
||||
if [ -n "$NS" ]; then
|
||||
PCT_OPTIONS+=($NS) # Nameserver flags (already formatted)
|
||||
PCT_OPTIONS_STRING="$PCT_OPTIONS_STRING
|
||||
$NS"
|
||||
fi
|
||||
|
||||
# Network configuration (single string with all network parameters)
|
||||
PCT_OPTIONS+=($NET_STRING)
|
||||
# Network configuration
|
||||
PCT_OPTIONS_STRING="$PCT_OPTIONS_STRING
|
||||
$NET_STRING
|
||||
-onboot 1
|
||||
-cores $CORE_COUNT
|
||||
-memory $RAM_SIZE
|
||||
-unprivileged $CT_TYPE"
|
||||
|
||||
PCT_OPTIONS+=("-onboot" "1")
|
||||
PCT_OPTIONS+=("-cores" "$CORE_COUNT")
|
||||
PCT_OPTIONS+=("-memory" "$RAM_SIZE")
|
||||
PCT_OPTIONS+=("-unprivileged" "$CT_TYPE")
|
||||
|
||||
# Protection flag
|
||||
if [ "$PROTECT_CT" == "1" ]; then
|
||||
PCT_OPTIONS+=("-protection" "1")
|
||||
# Protection flag (if var_protection was set)
|
||||
if [ "${PROTECT_CT:-}" == "1" ] || [ "${PROTECT_CT:-}" == "yes" ]; then
|
||||
PCT_OPTIONS_STRING="$PCT_OPTIONS_STRING
|
||||
-protection 1"
|
||||
fi
|
||||
|
||||
# Timezone flag
|
||||
if [ -n "$CT_TIMEZONE" ]; then
|
||||
PCT_OPTIONS+=("-timezone" "$CT_TIMEZONE")
|
||||
# Timezone flag (if var_timezone was set)
|
||||
if [ -n "${CT_TIMEZONE:-}" ]; then
|
||||
PCT_OPTIONS_STRING="$PCT_OPTIONS_STRING
|
||||
-timezone $CT_TIMEZONE"
|
||||
fi
|
||||
|
||||
# Password flag (already formatted as "-password xxx")
|
||||
# Password (already formatted)
|
||||
if [ -n "$PW" ]; then
|
||||
PCT_OPTIONS+=($PW)
|
||||
PCT_OPTIONS_STRING="$PCT_OPTIONS_STRING
|
||||
$PW"
|
||||
fi
|
||||
|
||||
export PCT_OPTIONS
|
||||
# Export as string (this works, unlike arrays!)
|
||||
export PCT_OPTIONS="$PCT_OPTIONS_STRING"
|
||||
export TEMPLATE_STORAGE="${var_template_storage:-}"
|
||||
export CONTAINER_STORAGE="${var_container_storage:-}"
|
||||
|
||||
# # DEBUG: Show final PCT_OPTIONS being exported
|
||||
# echo "[DEBUG] PCT_OPTIONS to be exported:"
|
||||
# echo "$PCT_OPTIONS" | sed 's/^/ /'
|
||||
# echo "[DEBUG] Calling create_lxc_container..."
|
||||
|
||||
create_lxc_container || exit $?
|
||||
|
||||
LXC_CONFIG="/etc/pve/lxc/${CTID}.conf"
|
||||
@@ -2548,7 +2518,7 @@ EOF
|
||||
if [[ $gpu_count -eq 1 ]]; then
|
||||
# Automatic selection for single GPU
|
||||
selected_gpu="${available_gpus[0]}"
|
||||
msg_custom "⚙️" "${GN}" "Automatically configuring ${selected_gpu} GPU passthrough"
|
||||
msg_ok "Automatically configuring ${selected_gpu} GPU passthrough"
|
||||
else
|
||||
# Multiple GPUs - ask user
|
||||
echo -e "\n${INFO} Multiple GPU types detected:"
|
||||
@@ -2714,7 +2684,9 @@ EOF'
|
||||
fi
|
||||
|
||||
if pct exec "$CTID" -- test -e "/usr/share/zoneinfo/$tz"; then
|
||||
pct exec "$CTID" -- bash -c "tz='$tz'; echo \"\$tz\" >/etc/timezone && ln -sf \"/usr/share/zoneinfo/\$tz\" /etc/localtime"
|
||||
# Set timezone using symlink (Debian 13+ compatible)
|
||||
# Create /etc/timezone for backwards compatibility with older scripts
|
||||
pct exec "$CTID" -- bash -c "tz='$tz'; ln -sf \"/usr/share/zoneinfo/\$tz\" /etc/localtime && echo \"\$tz\" >/etc/timezone || true"
|
||||
else
|
||||
msg_warn "Skipping timezone setup – zone '$tz' not found in container"
|
||||
fi
|
||||
@@ -2747,8 +2719,8 @@ EOF'
|
||||
|
||||
# Show available logs
|
||||
echo ""
|
||||
[[ $build_log_copied == true ]] && echo -e "${GN}✔${CL} Container creation log: ${BL}/tmp/create-lxc-${CTID}-${SESSION_ID}.log${CL}"
|
||||
[[ $install_log_copied == true ]] && echo -e "${GN}✔${CL} Installation log: ${BL}/tmp/install-lxc-${CTID}-${SESSION_ID}.log${CL}"
|
||||
[[ "$build_log_copied" == true ]] && echo -e "${GN}✔${CL} Container creation log: ${BL}/tmp/create-lxc-${CTID}-${SESSION_ID}.log${CL}"
|
||||
[[ "$install_log_copied" == true ]] && echo -e "${GN}✔${CL} Installation log: ${BL}/tmp/install-lxc-${CTID}-${SESSION_ID}.log${CL}"
|
||||
fi
|
||||
|
||||
# Dev mode: Keep container or open breakpoint shell
|
||||
@@ -2888,7 +2860,7 @@ fix_gpu_gids() {
|
||||
return 0
|
||||
fi
|
||||
|
||||
msg_custom "🔧" "${BL}" "Detecting and setting correct GPU group IDs"
|
||||
msg_info "Detecting and setting correct GPU group IDs"
|
||||
|
||||
# Get actual GIDs from container
|
||||
local video_gid=$(pct exec "$CTID" -- sh -c "getent group video 2>/dev/null | cut -d: -f3")
|
||||
@@ -3091,7 +3063,7 @@ create_lxc_container() {
|
||||
msg_ok "LXC stack upgraded."
|
||||
if [[ "$do_retry" == "yes" ]]; then
|
||||
msg_info "Retrying container creation after upgrade"
|
||||
if pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" >>"$LOGFILE" 2>&1; then
|
||||
if pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" $PCT_OPTIONS >>"$LOGFILE" 2>&1; then
|
||||
msg_ok "Container created successfully after upgrade."
|
||||
return 0
|
||||
else
|
||||
@@ -3517,9 +3489,12 @@ create_lxc_container() {
|
||||
grep -q "root:100000:65536" /etc/subuid || echo "root:100000:65536" >>/etc/subuid
|
||||
grep -q "root:100000:65536" /etc/subgid || echo "root:100000:65536" >>/etc/subgid
|
||||
|
||||
# Assemble pct options
|
||||
PCT_OPTIONS=(${PCT_OPTIONS[@]:-${DEFAULT_PCT_OPTIONS[@]}})
|
||||
[[ " ${PCT_OPTIONS[*]} " =~ " -rootfs " ]] || PCT_OPTIONS+=(-rootfs "$CONTAINER_STORAGE:${PCT_DISK_SIZE:-8}")
|
||||
# PCT_OPTIONS is now a string (exported from build_container)
|
||||
# Add rootfs if not already specified
|
||||
if [[ ! "$PCT_OPTIONS" =~ "-rootfs" ]]; then
|
||||
PCT_OPTIONS="$PCT_OPTIONS
|
||||
-rootfs $CONTAINER_STORAGE:${PCT_DISK_SIZE:-8}"
|
||||
fi
|
||||
|
||||
# Lock by template file (avoid concurrent downloads/creates)
|
||||
lockfile="/tmp/template.${TEMPLATE}.lock"
|
||||
@@ -3533,11 +3508,22 @@ create_lxc_container() {
|
||||
}
|
||||
|
||||
LOGFILE="/tmp/pct_create_${CTID}_$(date +%Y%m%d_%H%M%S)_${SESSION_ID}.log"
|
||||
msg_debug "pct create command: pct create $CTID ${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE} ${PCT_OPTIONS[*]}"
|
||||
|
||||
# # DEBUG: Show the actual command that will be executed
|
||||
# echo "[DEBUG] ===== PCT CREATE COMMAND DETAILS ====="
|
||||
# echo "[DEBUG] CTID: $CTID"
|
||||
# echo "[DEBUG] Template: ${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}"
|
||||
# echo "[DEBUG] PCT_OPTIONS (will be word-split):"
|
||||
# echo "$PCT_OPTIONS" | sed 's/^/ /'
|
||||
# echo "[DEBUG] Full command line:"
|
||||
# echo " pct create $CTID ${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE} $PCT_OPTIONS"
|
||||
# echo "[DEBUG] ========================================"
|
||||
|
||||
msg_debug "pct create command: pct create $CTID ${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE} $PCT_OPTIONS"
|
||||
msg_debug "Logfile: $LOGFILE"
|
||||
|
||||
# First attempt
|
||||
if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" >"$LOGFILE" 2>&1; then
|
||||
# First attempt (PCT_OPTIONS is a multi-line string, use it directly)
|
||||
if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" $PCT_OPTIONS >"$LOGFILE" 2>&1; then
|
||||
msg_debug "Container creation failed on ${TEMPLATE_STORAGE}. Validating template..."
|
||||
|
||||
# Validate template file
|
||||
@@ -3556,7 +3542,7 @@ create_lxc_container() {
|
||||
fi
|
||||
|
||||
# Retry after repair
|
||||
if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" >>"$LOGFILE" 2>&1; then
|
||||
if ! pct create "$CTID" "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE}" $PCT_OPTIONS >>"$LOGFILE" 2>&1; then
|
||||
# Fallback to local storage if not already on local
|
||||
if [[ "$TEMPLATE_STORAGE" != "local" ]]; then
|
||||
msg_info "Retrying container creation with fallback to local storage..."
|
||||
@@ -3565,7 +3551,7 @@ create_lxc_container() {
|
||||
msg_info "Downloading template to local..."
|
||||
pveam download local "$TEMPLATE" >/dev/null 2>&1
|
||||
fi
|
||||
if ! pct create "$CTID" "local:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" >>"$LOGFILE" 2>&1; then
|
||||
if ! pct create "$CTID" "local:vztmpl/${TEMPLATE}" $PCT_OPTIONS >>"$LOGFILE" 2>&1; then
|
||||
# Local fallback also failed - check for LXC stack version issue
|
||||
if grep -qiE 'unsupported .* version' "$LOGFILE"; then
|
||||
echo
|
||||
@@ -3589,7 +3575,7 @@ create_lxc_container() {
|
||||
msg_error "Container creation failed. See $LOGFILE"
|
||||
if whiptail --yesno "pct create failed.\nDo you want to enable verbose debug mode and view detailed logs?" 12 70; then
|
||||
set -x
|
||||
pct create "$CTID" "local:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" 2>&1 | tee -a "$LOGFILE"
|
||||
pct create "$CTID" "local:vztmpl/${TEMPLATE}" $PCT_OPTIONS 2>&1 | tee -a "$LOGFILE"
|
||||
set +x
|
||||
fi
|
||||
exit 209
|
||||
@@ -3621,7 +3607,7 @@ create_lxc_container() {
|
||||
msg_error "Container creation failed. See $LOGFILE"
|
||||
if whiptail --yesno "pct create failed.\nDo you want to enable verbose debug mode and view detailed logs?" 12 70; then
|
||||
set -x
|
||||
pct create "$CTID" "local:vztmpl/${TEMPLATE}" "${PCT_OPTIONS[@]}" 2>&1 | tee -a "$LOGFILE"
|
||||
pct create "$CTID" "local:vztmpl/${TEMPLATE}" $PCT_OPTIONS 2>&1 | tee -a "$LOGFILE"
|
||||
set +x
|
||||
fi
|
||||
exit 209
|
||||
|
||||
Reference in New Issue
Block a user