removing temp changes

This commit is contained in:
GoldenSpring 2026-01-21 14:59:33 +03:00
parent cbf9c2567d
commit b015b7b891
No known key found for this signature in database
GPG Key ID: 75701174BCB6A808
2 changed files with 4124 additions and 3826 deletions

View File

@ -1,5 +1,5 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2025 community-scripts ORG
# Copyright (c) 2021-2026 community-scripts ORG
# Author: tteck (tteckster) | MickLesk | michelroegl-brunner
# License: MIT | https://github.com/community-scripts/ProxmoxVED/raw/branch/main/LICENSE
# Revision: 1
@ -311,7 +311,10 @@ update_motd_ip() {
# - Falls back to warning if no keys provided
# ------------------------------------------------------------------------------
install_ssh_keys_into_ct() {
[[ "$SSH" != "yes" ]] && return 0
[[ "${SSH:-no}" != "yes" ]] && return 0
# Ensure SSH_KEYS_FILE is defined (may not be set if advanced_settings was skipped)
: "${SSH_KEYS_FILE:=}"
if [[ -n "$SSH_KEYS_FILE" && -s "$SSH_KEYS_FILE" ]]; then
msg_info "Installing selected SSH keys into CT ${CTID}"
@ -394,6 +397,90 @@ find_host_ssh_keys() {
)
}
# ==============================================================================
# SECTION 3B: IP RANGE SCANNING
# ==============================================================================
# ------------------------------------------------------------------------------
# ip_to_int() / int_to_ip()
#
# - Converts IP address to integer and vice versa for range iteration
# ------------------------------------------------------------------------------
ip_to_int() {
local IFS=.
read -r i1 i2 i3 i4 <<<"$1"
echo $(((i1 << 24) + (i2 << 16) + (i3 << 8) + i4))
}
int_to_ip() {
local ip=$1
echo "$(((ip >> 24) & 0xFF)).$(((ip >> 16) & 0xFF)).$(((ip >> 8) & 0xFF)).$((ip & 0xFF))"
}
# ------------------------------------------------------------------------------
# resolve_ip_from_range()
#
# - Takes an IP range in format "10.0.0.1/24-10.0.0.10/24"
# - Pings each IP in the range to find the first available one
# - Returns the first free IP with CIDR notation
# - Sets NET_RESOLVED to the resolved IP or empty on failure
# ------------------------------------------------------------------------------
resolve_ip_from_range() {
local range="$1"
local ip_cidr_regex='^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/([0-9]{1,2})$'
local ip_start ip_end
# Parse range: "10.0.0.1/24-10.0.0.10/24"
ip_start="${range%%-*}"
ip_end="${range##*-}"
if [[ ! "$ip_start" =~ $ip_cidr_regex ]] || [[ ! "$ip_end" =~ $ip_cidr_regex ]]; then
NET_RESOLVED=""
return 1
fi
local ip1="${ip_start%%/*}"
local ip2="${ip_end%%/*}"
local cidr="${ip_start##*/}"
local start_int=$(ip_to_int "$ip1")
local end_int=$(ip_to_int "$ip2")
for ((ip_int = start_int; ip_int <= end_int; ip_int++)); do
local ip=$(int_to_ip $ip_int)
msg_info "Checking IP: $ip"
if ! ping -c 1 -W 1 "$ip" >/dev/null 2>&1; then
NET_RESOLVED="$ip/$cidr"
msg_ok "Found free IP: ${BGN}$NET_RESOLVED${CL}"
return 0
fi
done
NET_RESOLVED=""
msg_error "No free IP found in range $range"
return 1
}
# ------------------------------------------------------------------------------
# is_ip_range()
#
# - Checks if a string is an IP range (contains - and looks like IP/CIDR)
# - Returns 0 if it's a range, 1 otherwise
# ------------------------------------------------------------------------------
is_ip_range() {
local value="$1"
local ip_start ip_end
if [[ "$value" == *-* ]] && [[ "$value" != "dhcp" ]]; then
local ip_cidr_regex='^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/([0-9]{1,2})$'
ip_start="${value%%-*}"
ip_end="${value##*-}"
if [[ "$ip_start" =~ $ip_cidr_regex ]] && [[ "$ip_end" =~ $ip_cidr_regex ]]; then
return 0
fi
fi
return 1
}
# ==============================================================================
# SECTION 4: STORAGE & RESOURCE MANAGEMENT
# ==============================================================================
@ -506,6 +593,18 @@ base_settings() {
HN=${var_hostname:-$NSAPP}
BRG=${var_brg:-"vmbr0"}
NET=${var_net:-"dhcp"}
# Resolve IP range if NET contains a range (e.g., 192.168.1.100/24-192.168.1.200/24)
if is_ip_range "$NET"; then
msg_info "Scanning IP range: $NET"
if resolve_ip_from_range "$NET"; then
NET="$NET_RESOLVED"
else
msg_error "Could not find free IP in range. Falling back to DHCP."
NET="dhcp"
fi
fi
IPV6_METHOD=${var_ipv6_method:-"none"}
IPV6_STATIC=${var_ipv6_static:-""}
GATE=${var_gateway:-""}
@ -535,9 +634,16 @@ base_settings() {
TAGS="community-script,${var_tags:-}"
ENABLE_FUSE=${var_fuse:-"${1:-no}"}
ENABLE_TUN=${var_tun:-"${1:-no}"}
ENABLE_KEYCTL=${var_keyctl:-0}
ENABLE_MKNOD=${var_mknod:-0}
# Additional settings that may be skipped if advanced_settings is not run (e.g., App Defaults)
ENABLE_GPU=${var_gpu:-"no"}
ENABLE_NESTING=${var_nesting:-"1"}
ENABLE_KEYCTL=${var_keyctl:-"0"}
ENABLE_MKNOD=${var_mknod:-"0"}
MOUNT_FS=${var_mount_fs:-""}
PROTECT_CT=${var_protection:-"no"}
CT_TIMEZONE=${var_timezone:-"$timezone"}
[[ "${CT_TIMEZONE:-}" == Etc/* ]] && CT_TIMEZONE="host" # pct doesn't accept Etc/* zones
# 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
@ -587,6 +693,13 @@ load_vars_file() {
[[ "$var_key" != var_* ]] && continue
_is_whitelisted "$var_key" || continue
# Strip inline comments (everything after unquoted #)
# Handle: var=value # comment OR var="value" # comment
if [[ ! "$var_val" =~ ^[\"\'] ]]; then
# Unquoted value: strip from first #
var_val="${var_val%%#*}"
fi
# Strip quotes
if [[ "$var_val" =~ ^\"(.*)\"$ ]]; then
var_val="${BASH_REMATCH[1]}"
@ -594,6 +707,9 @@ load_vars_file() {
var_val="${BASH_REMATCH[1]}"
fi
# Trim trailing whitespace
var_val="${var_val%"${var_val##*[![:space:]]}"}"
# Set only if not already exported
[[ -z "${!var_key+x}" ]] && export "${var_key}=${var_val}"
fi
@ -696,12 +812,18 @@ var_fuse=no
var_tun=no
# Advanced Settings (Proxmox-official features)
# var_nesting: Allow nesting (required for Docker/LXC in CT)
var_nesting=1
# var_keyctl: Allow keyctl() - needed for Docker (systemd-networkd workaround)
var_keyctl=0
# var_mknod: Allow device node creation (requires kernel 5.3+, experimental)
var_mknod=0
var_mount_fs=""
# var_mount_fs: Allow specific filesystems: nfs,fuse,ext4,etc (leave empty for defaults)
var_mount_fs=
# var_protection: Prevent accidental deletion of container
var_protection=no
var_timezone=""
# var_timezone: Container timezone (e.g. Europe/Berlin, leave empty for host timezone)
var_timezone=
var_tags=community-script
var_verbose=no
@ -3124,6 +3246,9 @@ EOF'
;;
debian | ubuntu | devuan)
# First install locales package (required for locale-gen on minimal templates)
pct exec "$CTID" -- bash -c "apt-get update >/dev/null && apt-get install -y locales >/dev/null 2>&1 || true"
# Locale setup for Debian-based
pct exec "$CTID" -- bash -c "sed -i '/$LANG/ s/^# //' /etc/locale.gen 2>/dev/null || true"
pct exec "$CTID" -- bash -c "locale_line=\$(grep -v '^#' /etc/locale.gen 2>/dev/null | grep -E '^[a-zA-Z]' | awk '{print \$1}' | head -n 1) && \
@ -3150,33 +3275,128 @@ EOF'
fedora | rockylinux | almalinux | centos)
# RHEL-based: Fedora, Rocky, AlmaLinux, CentOS
pct exec "$CTID" -- bash -c "dnf install -y curl sudo mc jq procps-ng >/dev/null 2>&1 || yum install -y curl sudo mc jq procps-ng >/dev/null 2>&1" || {
# Detect OS major version for EL10+ compatibility (DNF 5, different packages)
local rhel_version
rhel_version=$(pct exec "$CTID" -- bash -c "grep -oP '(?<=VERSION_ID=\")[0-9]+' /etc/os-release 2>/dev/null || echo 9")
# First run makecache to ensure repos are ready (critical for fresh templates)
msg_info "Initializing package manager (this may take a moment)..."
if ! pct exec "$CTID" -- bash -c "dnf makecache --refresh 2>&1 || yum makecache 2>&1" >/dev/null 2>&1; then
msg_warn "Package cache update had issues, continuing anyway..."
fi
# Build package list - EL10+ may not have glibc-langpack-en in same form
local rhel_packages="curl sudo mc jq which tar procps-ng ncurses"
if [[ "$rhel_version" -lt 10 ]]; then
rhel_packages="$rhel_packages glibc-langpack-en"
else
# EL10 uses glibc-all-langpacks or langpacks-en
rhel_packages="$rhel_packages langpacks-en glibc-all-langpacks"
fi
# Install base packages with better error handling
local install_log="/tmp/dnf_install_${CTID}.log"
if ! pct exec "$CTID" -- bash -c "dnf install -y $rhel_packages 2>&1 | tee $install_log; exit \${PIPESTATUS[0]}" >/dev/null 2>&1; then
# Check if it's just missing optional packages
if pct exec "$CTID" -- bash -c "rpm -q curl sudo mc jq which tar procps-ng" >/dev/null 2>&1; then
msg_warn "Some optional packages may have failed, but core packages installed"
else
# Real failure - try minimal install
msg_warn "Full package install failed, trying minimal set..."
if ! pct exec "$CTID" -- bash -c "dnf install -y curl sudo jq which tar 2>&1" >/dev/null 2>&1; then
msg_error "dnf/yum base packages installation failed"
pct exec "$CTID" -- bash -c "cat $install_log 2>/dev/null" || true
exit 1
}
fi
fi
fi
# Set locale for RHEL-based systems
pct exec "$CTID" -- bash -c "localectl set-locale LANG=en_US.UTF-8 2>/dev/null || echo 'LANG=en_US.UTF-8' > /etc/locale.conf" || true
# Timezone setup for RHEL
if [[ -z "${tz:-}" ]]; then
tz=$(timedatectl show --property=Timezone --value 2>/dev/null || echo "Etc/UTC")
fi
[[ "${tz:-}" == Etc/* ]] && tz="UTC"
if pct exec "$CTID" -- test -e "/usr/share/zoneinfo/$tz"; then
pct exec "$CTID" -- bash -c "timedatectl set-timezone '$tz' 2>/dev/null || ln -sf '/usr/share/zoneinfo/$tz' /etc/localtime" || true
fi
;;
opensuse)
# openSUSE
pct exec "$CTID" -- bash -c "zypper --non-interactive install curl sudo mc jq >/dev/null" || {
# openSUSE - special handling for terminal/locale issues
# Use --gpg-auto-import-keys to avoid interactive prompts that cause hangs
msg_info "Initializing package manager for openSUSE..."
pct exec "$CTID" -- bash -c "zypper --gpg-auto-import-keys --non-interactive refresh 2>&1" >/dev/null 2>&1 || true
# Install packages - ncurses and terminfo are CRITICAL for terminal to work
if ! pct exec "$CTID" -- bash -c "zypper --gpg-auto-import-keys --non-interactive install -y curl sudo mc jq glibc-locale ncurses terminfo-base 2>&1" >/dev/null 2>&1; then
# Try without glibc-locale
if ! pct exec "$CTID" -- bash -c "zypper --gpg-auto-import-keys --non-interactive install -y curl sudo mc jq ncurses terminfo-base 2>&1" >/dev/null 2>&1; then
msg_error "zypper base packages installation failed"
exit 1
}
fi
fi
# Fix 'unknown terminal type' error - set TERM in multiple places
pct exec "$CTID" -- bash -c "localectl set-locale LANG=en_US.UTF-8 2>/dev/null || echo 'LANG=en_US.UTF-8' > /etc/locale.conf" || true
# Set TERM globally for all users
pct exec "$CTID" -- bash -c "cat > /etc/profile.d/term.sh << 'EOFTERM'
# Fix terminal type for LXC containers
if [ -z \"\$TERM\" ] || [ \"\$TERM\" = \"dumb\" ] || [ \"\$TERM\" = \"-\" ]; then
export TERM=xterm-256color
fi
EOFTERM
chmod +x /etc/profile.d/term.sh" || true
# Also set in /etc/environment for non-login shells
pct exec "$CTID" -- bash -c "grep -q '^TERM=' /etc/environment 2>/dev/null || echo 'TERM=xterm-256color' >> /etc/environment" || true
;;
gentoo)
# Gentoo - emerge is slow, only install essentials
pct exec "$CTID" -- bash -c "emerge --quiet app-misc/jq net-misc/curl app-misc/mc >/dev/null 2>&1" || {
msg_warn "Gentoo base packages installation incomplete - may need manual setup"
# Gentoo - OpenRC based, emerge is slow
# Use emerge-webrsync (faster, uses http instead of rsync)
msg_info "Syncing Gentoo portage via webrsync (faster than rsync)..."
pct exec "$CTID" -- bash -c "emerge-webrsync 2>&1" >/dev/null 2>&1 || {
msg_warn "emerge-webrsync failed, trying emerge --sync..."
pct exec "$CTID" -- bash -c "emerge --sync 2>&1" >/dev/null 2>&1 || true
}
# Install curl FIRST - it's required for install.func to work
msg_info "Installing essential packages for Gentoo..."
if ! pct exec "$CTID" -- bash -c "emerge --quiet --noreplace net-misc/curl 2>&1" >/dev/null 2>&1; then
msg_error "Failed to install curl on Gentoo - this is required"
exit 1
fi
# Install remaining packages
pct exec "$CTID" -- bash -c "emerge --quiet --noreplace app-misc/jq app-misc/mc sys-libs/ncurses 2>&1" >/dev/null 2>&1 || {
msg_warn "Some Gentoo packages may need manual setup"
}
# Set TERM for Gentoo
pct exec "$CTID" -- bash -c "echo 'export TERM=xterm-256color' >> /etc/profile.d/term.sh && chmod +x /etc/profile.d/term.sh" || true
;;
openeuler)
# openEuler (RHEL-compatible)
pct exec "$CTID" -- bash -c "dnf install -y curl sudo mc jq >/dev/null" || {
# openEuler (RHEL-compatible, uses DNF)
# Note: Template was patched with /etc/redhat-release in create_container
msg_info "Initializing package manager for openEuler..."
pct exec "$CTID" -- bash -c "dnf makecache --refresh 2>&1" >/dev/null 2>&1 || true
# openEuler package names may differ from RHEL
local euler_packages="curl sudo mc jq procps-ng ncurses"
if ! pct exec "$CTID" -- bash -c "dnf install -y $euler_packages 2>&1" >/dev/null 2>&1; then
# Try without procps-ng (might be just 'procps' in openEuler)
if ! pct exec "$CTID" -- bash -c "dnf install -y curl sudo mc jq ncurses 2>&1" >/dev/null 2>&1; then
msg_error "dnf base packages installation failed"
exit 1
}
fi
fi
# Set locale
pct exec "$CTID" -- bash -c "echo 'LANG=en_US.UTF-8' > /etc/locale.conf" || true
;;
*)
@ -3199,7 +3419,7 @@ EOF'
set +Eeuo pipefail # Disable ALL error handling temporarily
trap - ERR # Remove ERR trap completely
lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://raw.githubusercontent.com/GoldenSpringness/ProxmoxVED/refs/heads/feature/sonobarr/install/${var_install}.sh)"
lxc-attach -n "$CTID" -- bash -c "$(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/install/${var_install}.sh)"
local lxc_exit=$?
set -Eeuo pipefail # Re-enable error handling
@ -3286,7 +3506,7 @@ EOF'
if [[ "${DEV_MODE_MOTD:-false}" == "true" ]]; then
echo -e "${TAB}${HOLD}${DGN}Setting up MOTD and SSH for debugging...${CL}"
if pct exec "$CTID" -- bash -c "
source <(curl -fsSL https://raw.githubusercontent.com/GoldenSpringness/ProxmoxVED/refs/heads/feature/sonobarr/misc/install.func)
source <(curl -fsSL https://git.community-scripts.org/community-scripts/ProxmoxVED/raw/branch/main/misc/install.func)
declare -f motd_ssh >/dev/null 2>&1 && motd_ssh || true
" >/dev/null 2>&1; then
local ct_ip=$(pct exec "$CTID" ip a s dev eth0 2>/dev/null | awk '/inet / {print $2}' | cut -d/ -f1)
@ -3723,12 +3943,19 @@ create_lxc_container() {
# Template discovery & validation
# Supported OS types (pveam available): alpine, almalinux, centos, debian,
# devuan, fedora, gentoo, openeuler, opensuse, rockylinux, ubuntu
# Template naming conventions:
# - Debian/Ubuntu/Devuan: <os>-<version>-standard_<date>_<arch>.tar.zst
# - Alpine/Fedora/Rocky/CentOS/AlmaLinux/openEuler: <os>-<version>-default_<date>_<arch>.tar.xz
# - Gentoo: gentoo-current-openrc_<date>_<arch>.tar.xz (note: underscore before date!)
# - openSUSE: opensuse-<version>-default_<date>_<arch>.tar.xz
# - CentOS: centos-<version>-stream-default_<date>_<arch>.tar.xz (note: stream in name)
# ------------------------------------------------------------------------------
TEMPLATE_SEARCH="${PCT_OSTYPE}-${PCT_OSVERSION:-}"
case "$PCT_OSTYPE" in
debian | ubuntu | devuan) TEMPLATE_PATTERN="-standard_" ;;
alpine | fedora | rocky | rockylinux | centos | almalinux | openeuler) TEMPLATE_PATTERN="-default_" ;;
gentoo) TEMPLATE_PATTERN="-current-openrc" ;;
alpine | fedora | rockylinux | almalinux | openeuler) TEMPLATE_PATTERN="-default_" ;;
centos) TEMPLATE_PATTERN="-stream-default_" ;;
gentoo) TEMPLATE_PATTERN="-openrc_" ;; # Pattern: gentoo-current-openrc_<date> (underscore!)
opensuse) TEMPLATE_PATTERN="-default_" ;;
*) TEMPLATE_PATTERN="" ;;
esac
@ -3790,14 +4017,27 @@ create_lxc_container() {
echo "[DEBUG] No template found for ${PCT_OSTYPE} ${PCT_OSVERSION}, searching for alternatives..."
# Get all available versions for this OS type
# Special handling for Gentoo which uses 'current' instead of numeric version
if [[ "$PCT_OSTYPE" == "gentoo" ]]; then
mapfile -t AVAILABLE_VERSIONS < <(
pveam available -section system 2>/dev/null |
grep -E '\.(tar\.zst|tar\.xz|tar\.gz)$' |
awk -F'\t' '{print $1}' |
grep "^${PCT_OSTYPE}-" |
sed -E "s/.*${PCT_OSTYPE}-([0-9]+(\.[0-9]+)?).*/\1/" |
sort -u -V 2>/dev/null
awk '{print $2}' |
grep "^gentoo-" |
sed -E 's/gentoo-([^-]+)-.*/\1/' |
sort -u 2>/dev/null || sort -u
)
else
mapfile -t AVAILABLE_VERSIONS < <(
pveam available -section system 2>/dev/null |
grep -E '\.(tar\.zst|tar\.xz|tar\.gz)$' |
awk '{print $2}' |
grep "^${PCT_OSTYPE}-" |
sed -E "s/${PCT_OSTYPE}-([0-9]+(\.[0-9]+)?).*/\1/" |
grep -E '^[0-9]' |
sort -u -V 2>/dev/null || sort -u
)
fi
if [[ ${#AVAILABLE_VERSIONS[@]} -gt 0 ]]; then
echo ""
@ -4043,6 +4283,43 @@ create_lxc_container() {
LOGFILE="/tmp/pct_create_${CTID}_$(date +%Y%m%d_%H%M%S)_${SESSION_ID}.log"
# ------------------------------------------------------------------------------
# openEuler Template Patch: Create /etc/redhat-release inside template
# PVE's post_create_hook expects this file for RHEL-family OS detection
# Without it, container creation fails with "error in setup task"
# ------------------------------------------------------------------------------
if [[ "${var_os:-}" == "openeuler" ]]; then
msg_info "Patching openEuler template for PVE compatibility..."
local TEMP_EXTRACT_DIR="/tmp/openeuler_template_patch_$$"
local PATCHED_TEMPLATE="${TEMPLATE_PATH%.tar.xz}_patched.tar.xz"
# Only patch if not already patched
if [[ ! -f "$PATCHED_TEMPLATE" ]]; then
mkdir -p "$TEMP_EXTRACT_DIR"
# Extract template
if tar -xf "$TEMPLATE_PATH" -C "$TEMP_EXTRACT_DIR" 2>/dev/null; then
# Create /etc/redhat-release if it doesn't exist
if [[ ! -f "$TEMP_EXTRACT_DIR/etc/redhat-release" ]]; then
echo "openEuler release ${var_version:-25.03}" >"$TEMP_EXTRACT_DIR/etc/redhat-release"
fi
# Repack template
if tar -cJf "$PATCHED_TEMPLATE" -C "$TEMP_EXTRACT_DIR" . 2>/dev/null; then
# Replace original with patched version
mv "$PATCHED_TEMPLATE" "$TEMPLATE_PATH"
msg_ok "openEuler template patched successfully"
else
msg_warn "Failed to repack template, trying without patch..."
fi
else
msg_warn "Failed to extract template for patching, trying without patch..."
fi
rm -rf "$TEMP_EXTRACT_DIR"
fi
fi
# # DEBUG: Show the actual command that will be executed
# echo "[DEBUG] ===== PCT CREATE COMMAND DETAILS ====="
# echo "[DEBUG] CTID: $CTID"

View File

@ -1,4 +1,4 @@
# Copyright (c) 2021-2025 community-scripts ORG
# Copyright (c) 2021-2026 community-scripts ORG
# Author: tteck (tteckster)
# Co-Author: MickLesk
# Co-Author: michelroegl-brunner
@ -551,12 +551,12 @@ get_ip() {
# Try hostname -I first (most common)
if command -v hostname &>/dev/null; then
ip=$(hostname -I 2>/dev/null | awk '{print $1}')
ip=$(hostname -I 2>/dev/null | awk '{print $1}' || true)
fi
# Fallback to ip command
if [[ -z "$ip" ]] && command -v ip &>/dev/null; then
ip=$(ip -4 addr show scope global | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | head -1)
ip=$(ip -4 addr show scope global | awk '/inet /{print $2}' | cut -d/ -f1 | head -1)
fi
# Fallback to ifconfig
@ -780,7 +780,7 @@ echo -e "${BOLD:-}${YW:-}${APPLICATION:-Container} LXC Container - DEV Repositor
echo -e "${RD:-}WARNING: This is a DEVELOPMENT version (ProxmoxVED). Do NOT use in production!${CL:-}"
echo -e "${YW:-} OS: ${GN:-}${os_name} - Version: ${os_version}${CL:-}"
echo -e "${YW:-} Hostname: ${GN:-}\$(hostname)${CL:-}"
echo -e "${YW:-} IP Address: ${GN:-}\$(hostname -I 2>/dev/null | awk '{print \$1}' || ip -4 addr show scope global | grep -oP '(?<=inet\s)\\d+(\\.\\d+){3}' | head -1)${CL:-}"
echo -e "${YW:-} IP Address: ${GN:-}\$(hostname -I 2>/dev/null | awk '{print \$1}' || ip -4 addr show scope global | awk '/inet /{print \$2}' | cut -d/ -f1 | head -1)${CL:-}"
echo -e "${YW:-} Repository: ${GN:-}https://github.com/community-scripts/ProxmoxVED${CL:-}"
echo ""
EOF
@ -898,11 +898,32 @@ EOF
;;
sysvinit)
# Devuan/older systems - modify inittab with flexible runlevel matching
# Devuan/older systems - modify inittab for auto-login
# Devuan 5 (daedalus) uses SysVinit with various inittab formats
# CRITICAL: LXC uses /dev/console, NOT tty1! pct console connects to console device
if [[ -f /etc/inittab ]]; then
# Match various runlevel patterns (23, 2345, 12345, etc.) and both getty/agetty
sed -i 's|^1:[0-9]*:respawn:/sbin/a\?getty.*|1:2345:respawn:/sbin/agetty --autologin root tty1 38400 linux|' /etc/inittab
# Backup original inittab
cp /etc/inittab /etc/inittab.bak 2>/dev/null || true
# First, enable autologin on tty1 (for direct access)
sed -i 's|^1:[0-9]*:respawn:.*/\(a\?getty\).*|1:2345:respawn:/sbin/agetty --autologin root --noclear tty1 38400 linux|' /etc/inittab
# CRITICAL: Add console entry for LXC - this is what pct console uses!
# Check if there's already a console getty entry
if ! grep -qE '^[^#].*respawn.*console' /etc/inittab; then
# Add new console entry for LXC
echo "" >>/etc/inittab
echo "# LXC console autologin (added by community-scripts)" >>/etc/inittab
echo "co:2345:respawn:/sbin/agetty --autologin root --noclear console 115200,38400,9600 linux" >>/etc/inittab
else
# Enable autologin on existing console entry
sed -i 's|^[^#]*:[0-9]*:respawn:.*/\(a\?getty\).*console.*|co:2345:respawn:/sbin/agetty --autologin root --noclear console 115200,38400,9600 linux|' /etc/inittab
fi
# Force a reload of inittab - try multiple methods
telinit q &>/dev/null || init q &>/dev/null || kill -1 1 &>/dev/null || true
fi
touch /root/.hushlogin
;;
esac