Big Update: Build.func Install.Func Create_LXC

This commit is contained in:
CanbiZ 2024-12-02 18:07:00 +01:00
parent 4bb5741707
commit 99fdc2f17e
3 changed files with 340 additions and 165 deletions

View File

@ -2,6 +2,7 @@
# Copyright (c) 2021-2024 tteck # Copyright (c) 2021-2024 tteck
# Author: tteck (tteckster) # Author: tteck (tteckster)
# Revision 1.0 (MickLesk 12/2024)
# License: MIT # License: MIT
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE # https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
@ -9,15 +10,27 @@
# if [ "$VERBOSE" == "yes" ]; then set -x; fi # if [ "$VERBOSE" == "yes" ]; then set -x; fi
# This function sets color variables for formatting output in the terminal # This function sets color variables for formatting output in the terminal
# Colors
YW=$(echo "\033[33m") YW=$(echo "\033[33m")
YWB=$(echo "\033[93m")
BL=$(echo "\033[36m") BL=$(echo "\033[36m")
RD=$(echo "\033[01;31m") RD=$(echo "\033[01;31m")
BGN=$(echo "\033[4;92m")
GN=$(echo "\033[1;92m") GN=$(echo "\033[1;92m")
DGN=$(echo "\033[32m")
# Formatting
CL=$(echo "\033[m") CL=$(echo "\033[m")
CM="${GN}${CL}" UL=$(echo "\033[4m")
CROSS="${RD}${CL}" BOLD=$(echo "\033[1m")
BFR="\\r\\033[K" BFR="\\r\\033[K"
HOLD=" " HOLD=" "
TAB=" "
# Icons
CM="${TAB}✔️${TAB}${CL}"
CROSS="${TAB}✖️${TAB}${CL}"
INFO="${TAB}💡${TAB}${CL}"
# This sets error handling options and defines the error_handler function to handle errors # This sets error handling options and defines the error_handler function to handle errors
set -Eeuo pipefail set -Eeuo pipefail
@ -36,19 +49,24 @@ function error_handler() {
# This function displays a spinner. # This function displays a spinner.
function spinner() { function spinner() {
local chars="/-\|" local frames=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local spin_i=0 local spin_i=0
local interval=0.1
printf "\e[?25l" printf "\e[?25l"
local color="${YWB}"
while true; do while true; do
printf "\r \e[36m%s\e[0m" "${chars:spin_i++%${#chars}:1}" printf "\r ${color}%s${CL}" "${frames[spin_i]}"
sleep 0.1 spin_i=$(( (spin_i + 1) % ${#frames[@]} ))
sleep "$interval"
done done
} }
# This function displays an informational message with a yellow color. # This function displays an informational message with a yellow color.
function msg_info() { function msg_info() {
local msg="$1" local msg="$1"
echo -ne " ${HOLD} ${YW}${msg} " echo -ne " ${TAB}${YW}${msg} "
spinner & spinner &
SPINNER_PID=$! SPINNER_PID=$!
} }
@ -58,7 +76,7 @@ function msg_ok() {
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
printf "\e[?25h" printf "\e[?25h"
local msg="$1" local msg="$1"
echo -e "${BFR} ${CM} ${GN}${msg}${CL}" echo -e "${BFR}${CM}${GN}${msg}${CL}"
} }
# This function displays a error message with a red color. # This function displays a error message with a red color.
@ -66,7 +84,7 @@ function msg_error() {
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
printf "\e[?25h" printf "\e[?25h"
local msg="$1" local msg="$1"
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" echo -e "${BFR}${CROSS}${RD}${msg}${CL}"
} }
# This checks for the presence of valid Container Storage and Template Storage locations # This checks for the presence of valid Container Storage and Template Storage locations
@ -119,7 +137,7 @@ function select_storage() {
else else
local STORAGE local STORAGE
while [ -z "${STORAGE:+x}" ]; do while [ -z "${STORAGE:+x}" ]; do
STORAGE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "Storage Pools" --radiolist \ STORAGE=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --title "Storage Pools" --radiolist \
"Which storage pool you would like to use for the ${CONTENT_LABEL,,}?\nTo make a selection, use the Spacebar.\n" \ "Which storage pool you would like to use for the ${CONTENT_LABEL,,}?\nTo make a selection, use the Spacebar.\n" \
16 $(($MSG_MAX_LENGTH + 23)) 6 \ 16 $(($MSG_MAX_LENGTH + 23)) 6 \
"${MENU[@]}" 3>&1 1>&2 2>&3) || exit "Menu aborted." "${MENU[@]}" 3>&1 1>&2 2>&3) || exit "Menu aborted."

View File

@ -1,3 +1,9 @@
# Copyright (c) 2021-2024 tteck
# Author: tteck (tteckster)
# Revision 1.0 (MickLesk 12/2024)
# License: MIT
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
variables() { variables() {
NSAPP=$(echo ${APP,,} | tr -d ' ') # This function sets the NSAPP variable by converting the value of the APP variable to lowercase and removing any spaces. NSAPP=$(echo ${APP,,} | tr -d ' ') # This function sets the NSAPP variable by converting the value of the APP variable to lowercase and removing any spaces.
var_install="${NSAPP}-install" # sets the var_install variable by appending "-install" to the value of NSAPP. var_install="${NSAPP}-install" # sets the var_install variable by appending "-install" to the value of NSAPP.
@ -6,6 +12,7 @@ variables() {
# This function sets various color variables using ANSI escape codes for formatting text in the terminal. # This function sets various color variables using ANSI escape codes for formatting text in the terminal.
color() { color() {
# Colors
YW=$(echo "\033[33m") YW=$(echo "\033[33m")
YWB=$(echo "\033[93m") YWB=$(echo "\033[93m")
BL=$(echo "\033[36m") BL=$(echo "\033[36m")
@ -13,11 +20,39 @@ color() {
BGN=$(echo "\033[4;92m") BGN=$(echo "\033[4;92m")
GN=$(echo "\033[1;92m") GN=$(echo "\033[1;92m")
DGN=$(echo "\033[32m") DGN=$(echo "\033[32m")
# Formatting
CL=$(echo "\033[m") CL=$(echo "\033[m")
CM="${GN}✓${CL}" UL=$(echo "\033[4m")
CROSS="${RD}✗${CL}" BOLD=$(echo "\033[1m")
BFR="\\r\\033[K" BFR="\\r\\033[K"
HOLD=" " HOLD=" "
TAB=" "
# Icons
CM="${TAB}✔️${TAB}${CL}"
CROSS="${TAB}✖️${TAB}${CL}"
INFO="${TAB}💡${TAB}${CL}"
OS="${TAB}🖥️${TAB}${CL}"
OSVERSION="${TAB}🌟${TAB}${CL}"
CONTAINERTYPE="${TAB}📦${TAB}${CL}"
DISKSIZE="${TAB}💾${TAB}${CL}"
CPUCORE="${TAB}🧠${TAB}${CL}"
RAMSIZE="${TAB}🛠️${TAB}${CL}"
SEARCH="${TAB}🔍${TAB}${CL}"
VERIFYPW="${TAB}🔐${TAB}${CL}"
CONTAINERID="${TAB}🆔${TAB}${CL}"
HOSTNAME="${TAB}🏠${TAB}${CL}"
BRIDGE="${TAB}🌉${TAB}${CL}"
NETWORK="${TAB}📡${TAB}${CL}"
GATEWAY="${TAB}🌐${TAB}${CL}"
DISABLEIPV6="${TAB}🚫${TAB}${CL}"
DEFAULT="${TAB}⚙️${TAB}${CL}"
MACADDRESS="${TAB}🔗${TAB}${CL}"
VLANTAG="${TAB}🏷️${TAB}${CL}"
ROOTSSH="${TAB}🔑${TAB}${CL}"
CREATING="${TAB}🚀${TAB}${CL}"
ADVANCED="${TAB}🧩${TAB}${CL}"
} }
# This function enables error handling in the script by setting options and defining a trap for the ERR signal. # This function enables error handling in the script by setting options and defining a trap for the ERR signal.
@ -39,21 +74,26 @@ error_handler() {
# This function displays a spinner. # This function displays a spinner.
spinner() { spinner() {
local chars="/-\|" local frames=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local spin_i=0 local spin_i=0
local interval=0.1
printf "\e[?25l" printf "\e[?25l"
local color="${YWB}"
while true; do while true; do
printf "\r \e[36m%s\e[0m" "${chars:spin_i++%${#chars}:1}" printf "\r ${color}%s${CL}" "${frames[spin_i]}"
sleep 0.1 spin_i=$(( (spin_i + 1) % ${#frames[@]} ))
sleep "$interval"
done done
} }
# This function displays an informational message with a yellow color. # This function displays an informational message with a yellow color.
msg_info() { msg_info() {
local msg="$1" local msg="$1"
echo -ne " ${HOLD} ${YW}${msg} " echo -ne " ${TAB}${YW}${msg} "
spinner & spinner &
SPINNER_PID=$! SPINNER_PID=$!
} }
# This function displays a success message with a green color. # This function displays a success message with a green color.
@ -61,7 +101,7 @@ msg_ok() {
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
printf "\e[?25h" printf "\e[?25h"
local msg="$1" local msg="$1"
echo -e "${BFR} ${CM} ${GN}${msg}${CL}" echo -e "${BFR}${CM}${GN}${msg}${CL}"
} }
# This function displays a error message with a red color. # This function displays a error message with a red color.
@ -69,7 +109,7 @@ msg_error() {
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
printf "\e[?25h" printf "\e[?25h"
local msg="$1" local msg="$1"
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" echo -e "${BFR}${CROSS}${RD}${msg}${CL}"
} }
# Check if the shell is using bash # Check if the shell is using bash
@ -97,7 +137,7 @@ root_check() {
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported. # This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
pve_check() { pve_check() {
if ! pveversion | grep -Eq "pve-manager/8.[1-3]"; then if ! pveversion | grep -Eq "pve-manager/8.[1-3]"; then
msg_error "This version of Proxmox Virtual Environment is not supported" msg_error "${CROSS}${RD}This version of Proxmox Virtual Environment is not supported"
echo -e "Requires Proxmox Virtual Environment Version 8.1 or later." echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
echo -e "Exiting..." echo -e "Exiting..."
sleep 2 sleep 2
@ -108,19 +148,31 @@ fi
# This function checks the system architecture and exits if it's not "amd64". # This function checks the system architecture and exits if it's not "amd64".
arch_check() { arch_check() {
if [ "$(dpkg --print-architecture)" != "amd64" ]; then if [ "$(dpkg --print-architecture)" != "amd64" ]; then
echo -e "\n ${CROSS} This script will not work with PiMox! \n" echo -e "\n ${INFO}${YWB}This script will not work with PiMox! \n"
echo -e "\n Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n" echo -e "\n ${YWB}Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n"
echo -e "Exiting..." echo -e "Exiting..."
sleep 2 sleep 2
exit exit
fi fi
} }
# This function sets the APP-Name into an ASCII Header in Slant, figlet needed on proxmox main node.
header_info() {
if ! command -v figlet &> /dev/null; then
apt-get install -y figlet &> /dev/null
fi
ascii_art=$(figlet -f slant "$APP")
clear
cat <<EOF
$ascii_art
EOF
}
# This function checks if the script is running through SSH and prompts the user to confirm if they want to proceed or exit. # This function checks if the script is running through SSH and prompts the user to confirm if they want to proceed or exit.
ssh_check() { ssh_check() {
if command -v pveversion >/dev/null 2>&1 && [ -n "${SSH_CLIENT:+x}" ]; then if command -v pveversion >/dev/null 2>&1 && [ -n "${SSH_CLIENT:+x}" ]; then
if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH DETECTED" --yesno "It's advisable to utilize the Proxmox shell rather than SSH, as there may be potential complications with variable retrieval. Proceed using SSH?" 10 72; then if whiptail --backtitle "ProxmoxVE Community-Scripts" --defaultno --title "SSH DETECTED" --yesno "It's advisable to utilize the Proxmox shell rather than SSH, as there may be potential complications with variable retrieval. Proceed using SSH?" 10 72; then
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Proceed using SSH" "You've chosen to proceed using SSH. If any issues arise, please run the script in the Proxmox shell before creating a repository issue." 10 72 whiptail --backtitle "ProxmoxVE Community-Scripts" --msgbox --title "Proceed using SSH" "You've chosen to proceed using SSH. If any issues arise, please run the script in the Proxmox shell before creating a repository issue." 10 72
else else
clear clear
echo "Exiting due to SSH usage. Please consider using the Proxmox shell." echo "Exiting due to SSH usage. Please consider using the Proxmox shell."
@ -129,52 +181,90 @@ ssh_check() {
fi fi
} }
base_settings() {
# Default Settings
CT_TYPE="1"
DISK_SIZE="4"
CORE_COUNT="1"
RAM_SIZE="1024"
VERBOSE="no"
PW=""
CT_ID=$NEXTID
HN=$NSAPP
BRG="vmbr0"
NET="dhcp"
GATE=""
APT_CACHER=""
APT_CACHER_IP=""
DISABLEIP6="no"
MTU=""
SD=""
NS=""
MAC=""
VLAN=""
SSH="no"
TAGS="community-script;"
# Changed From CT.sh
CT_TYPE=${var_unprivileged:-$CT_TYPE}
DISK_SIZE=${var_disk:-$DISK_SIZE}
CORE_COUNT=${var_cpu:-$CORE_COUNT}
RAM_SIZE=${var_ram:-$RAM_SIZE}
VERB=${var_verbose:-$VERBOSE}
TAGS="${TAGS}${var_tags:-}"
# 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
var_os="debian"
fi
if [ -z "$var_version" ]; then
var_version="12"
fi
}
# This function displays the default values for various settings. # This function displays the default values for various settings.
echo_default() { echo_default() {
echo -e "${DGN}Using Distribution: ${BGN}$var_os${CL}" # Convert CT_TYPE to description
echo -e "${DGN}Using $var_os Version: ${BGN}$var_version${CL}" CT_TYPE_DESC="Privileged"
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}" if [ "$CT_TYPE" -eq 1 ]; then
echo -e "${DGN}Using Root Password: ${BGN}Automatic Login${CL}" CT_TYPE_DESC="Unprivileged"
echo -e "${DGN}Using Container ID: ${BGN}$NEXTID${CL}" fi
echo -e "${DGN}Using Hostname: ${BGN}$NSAPP${CL}"
echo -e "${DGN}Using Disk Size: ${BGN}$var_disk${CL}${DGN}GB${CL}" # Output the selected values with icons
echo -e "${DGN}Allocated Cores ${BGN}$var_cpu${CL}" echo -e "${OS}${BOLD}${DGN}Operating System: ${BGN}$var_os${CL}"
echo -e "${DGN}Allocated Ram ${BGN}$var_ram${CL}" echo -e "${OSVERSION}${BOLD}${DGN}Version: ${BGN}$var_version${CL}"
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}" echo -e "${CONTAINERTYPE}${BOLD}${DGN}Container Type: ${BGN}$CT_TYPE_DESC${CL}"
echo -e "${DGN}Using Static IP Address: ${BGN}dhcp${CL}" echo -e "${DISKSIZE}${BOLD}${DGN}Disk Size: ${BGN}${DISK_SIZE}GB${CL}"
echo -e "${DGN}Using Gateway IP Address: ${BGN}Default${CL}" echo -e "${CPUCORE}${BOLD}${DGN}CPU Cores: ${BGN}${CORE_COUNT}${CL}"
echo -e "${DGN}Using Apt-Cacher IP Address: ${BGN}Default${CL}" echo -e "${RAMSIZE}${BOLD}${DGN}RAM Size: ${BGN}${RAM_SIZE}MB${CL}"
echo -e "${DGN}Disable IPv6: ${BGN}No${CL}" # Include VERBOSE if enabled
echo -e "${DGN}Using Interface MTU Size: ${BGN}Default${CL}" if [ "$VERB" == "yes" ]; then
echo -e "${DGN}Using DNS Search Domain: ${BGN}Host${CL}" echo -e "${SEARCH}${BOLD}${DGN}Verbose Mode: ${BGN}Enabled${CL}"
echo -e "${DGN}Using DNS Server Address: ${BGN}Host${CL}" fi
echo -e "${DGN}Using MAC Address: ${BGN}Default${CL}" echo -e "${CREATING}${BOLD}${BL}Creating a ${APP} LXC using the above default settings${CL}"
echo -e "${DGN}Using VLAN Tag: ${BGN}Default${CL}" echo -e " "
echo -e "${DGN}Enable Root SSH Access: ${BGN}No${CL}"
echo -e "${DGN}Enable Verbose Mode: ${BGN}No${CL}"
echo -e "${BL}Creating a ${APP} LXC using the above default settings${CL}"
} }
# This function is called when the user decides to exit the script. It clears the screen and displays an exit message. # This function is called when the user decides to exit the script. It clears the screen and displays an exit message.
exit-script() { exit-script() {
clear clear
echo -e "⚠ User exited script \n" echo -e "${CROSS}${RD}User exited script${CL}\n"
exit exit
} }
# This function allows the user to configure advanced settings for the script. # This function allows the user to configure advanced settings for the script.
advanced_settings() { advanced_settings() {
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Here is an instructional tip:" "To make a selection, use the Spacebar." 8 58 whiptail --backtitle "ProxmoxVE Community-Scripts" --msgbox --title "Here is an instructional tip:" "To make a selection, use the Spacebar." 8 58
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Default distribution for $APP" "${var_os} ${var_version} \n \nIf the default Linux distribution is not adhered to, script support will be discontinued. \n" 10 58 whiptail --backtitle "ProxmoxVE Community-Scripts" --msgbox --title "Default distribution for $APP" "${var_os} ${var_version} \n \nIf the default Linux distribution is not adhered to, script support will be discontinued. \n" 10 58
if [ "$var_os" != "alpine" ]; then if [ "$var_os" != "alpine" ]; then
var_os="" var_os=""
while [ -z "$var_os" ]; do while [ -z "$var_os" ]; do
if var_os=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DISTRIBUTION" --radiolist "Choose Distribution:" 10 58 2 \ if var_os=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --title "DISTRIBUTION" --radiolist "Choose Distribution:" 10 58 2 \
"debian" "" OFF \ "debian" "" OFF \
"ubuntu" "" OFF \ "ubuntu" "" OFF \
3>&1 1>&2 2>&3); then 3>&1 1>&2 2>&3); then
if [ -n "$var_os" ]; then if [ -n "$var_os" ]; then
echo -e "${DGN}Using Distribution: ${BGN}$var_os${CL}" echo -e "${OS}${DGN}Using Distribution: ${BGN}$var_os${CL}"
fi fi
else else
exit-script exit-script
@ -185,12 +275,12 @@ advanced_settings() {
if [ "$var_os" == "debian" ]; then if [ "$var_os" == "debian" ]; then
var_version="" var_version=""
while [ -z "$var_version" ]; do while [ -z "$var_version" ]; do
if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "DEBIAN VERSION" --radiolist "Choose Version" 10 58 2 \ if var_version=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --title "DEBIAN VERSION" --radiolist "Choose Version" 10 58 2 \
"11" "Bullseye" OFF \ "11" "Bullseye" OFF \
"12" "Bookworm" OFF \ "12" "Bookworm" OFF \
3>&1 1>&2 2>&3); then 3>&1 1>&2 2>&3); then
if [ -n "$var_version" ]; then if [ -n "$var_version" ]; then
echo -e "${DGN}Using $var_os Version: ${BGN}$var_version${CL}" echo -e "${OSVERSION}${DGN}Using $var_os Version: ${BGN}$var_version${CL}"
fi fi
else else
exit-script exit-script
@ -201,13 +291,14 @@ advanced_settings() {
if [ "$var_os" == "ubuntu" ]; then if [ "$var_os" == "ubuntu" ]; then
var_version="" var_version=""
while [ -z "$var_version" ]; do while [ -z "$var_version" ]; do
if var_version=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "UBUNTU VERSION" --radiolist "Choose Version" 10 58 3 \ if var_version=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --title "UBUNTU VERSION" --radiolist "Choose Version" 10 58 3 \
"20.04" "Focal" OFF \ "20.04" "Focal" OFF \
"22.04" "Jammy" OFF \ "22.04" "Jammy" OFF \
"24.04" "Noble" OFF \ "24.04" "Noble" OFF \
3>&1 1>&2 2>&3); then "24.10" "Oracular" OFF \
3>&1 1>&2 2>&3); then
if [ -n "$var_version" ]; then if [ -n "$var_version" ]; then
echo -e "${DGN}Using $var_os Version: ${BGN}$var_version${CL}" echo -e "${OSVERSION}${DGN}Using $var_os Version: ${BGN}$var_version${CL}"
fi fi
else else
exit-script exit-script
@ -217,12 +308,12 @@ advanced_settings() {
CT_TYPE="" CT_TYPE=""
while [ -z "$CT_TYPE" ]; do while [ -z "$CT_TYPE" ]; do
if CT_TYPE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \ if CT_TYPE=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
"1" "Unprivileged" OFF \ "1" "Unprivileged" OFF \
"0" "Privileged" OFF \ "0" "Privileged" OFF \
3>&1 1>&2 2>&3); then 3>&1 1>&2 2>&3); then
if [ -n "$CT_TYPE" ]; then if [ -n "$CT_TYPE" ]; then
echo -e "${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}" echo -e "${CONTAINERTYPE}${DGN}Using Container Type: ${BGN}$CT_TYPE${CL}"
fi fi
else else
exit-script exit-script
@ -230,17 +321,17 @@ advanced_settings() {
done done
while true; do while true; do
if PW1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --passwordbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD (leave blank for automatic login)" 3>&1 1>&2 2>&3); then if PW1=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --passwordbox "\nSet Root Password (needed for root ssh access)" 9 58 --title "PASSWORD (leave blank for automatic login)" 3>&1 1>&2 2>&3); then
if [[ ! -z "$PW1" ]]; then if [[ ! -z "$PW1" ]]; then
if [[ "$PW1" == *" "* ]]; then if [[ "$PW1" == *" "* ]]; then
whiptail --msgbox "Password cannot contain spaces. Please try again." 8 58 whiptail --msgbox "Password cannot contain spaces. Please try again." 8 58
elif [ ${#PW1} -lt 5 ]; then elif [ ${#PW1} -lt 5 ]; then
whiptail --msgbox "Password must be at least 5 characters long. Please try again." 8 58 whiptail --msgbox "Password must be at least 5 characters long. Please try again." 8 58
else else
if PW2=$(whiptail --backtitle "Proxmox VE Helper Scripts" --passwordbox "\nVerify Root Password" 9 58 --title "PASSWORD VERIFICATION" 3>&1 1>&2 2>&3); then if PW2=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --passwordbox "\nVerify Root Password" 9 58 --title "PASSWORD VERIFICATION" 3>&1 1>&2 2>&3); then
if [[ "$PW1" == "$PW2" ]]; then if [[ "$PW1" == "$PW2" ]]; then
PW="-password $PW1" PW="-password $PW1"
echo -e "${DGN}Using Root Password: ${BGN}********${CL}" echo -e "${VERIFYPW}${DGN}Using Root Password: ${BGN}********${CL}"
break break
else else
whiptail --msgbox "Passwords do not match. Please try again." 8 58 whiptail --msgbox "Passwords do not match. Please try again." 8 58
@ -252,7 +343,7 @@ advanced_settings() {
else else
PW1="Automatic Login" PW1="Automatic Login"
PW="" PW=""
echo -e "${DGN}Using Root Password: ${BGN}$PW1${CL}" echo -e "${VERIFYPW}${DGN}Using Root Password: ${BGN}$PW1${CL}"
break break
fi fi
else else
@ -261,89 +352,89 @@ advanced_settings() {
done done
if CT_ID=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then if CT_ID=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --inputbox "Set Container ID" 8 58 $NEXTID --title "CONTAINER ID" 3>&1 1>&2 2>&3); then
if [ -z "$CT_ID" ]; then if [ -z "$CT_ID" ]; then
CT_ID="$NEXTID" CT_ID="$NEXTID"
echo -e "${DGN}Using Container ID: ${BGN}$CT_ID${CL}" echo -e "${CONTAINERID}${DGN}Using Container ID: ${BGN}$CT_ID${CL}"
else else
echo -e "${DGN}Container ID: ${BGN}$CT_ID${CL}" echo -e "${CONTAINERID}${DGN}Container ID: ${BGN}$CT_ID${CL}"
fi fi
else else
exit exit
fi fi
if CT_NAME=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then if CT_NAME=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --inputbox "Set Hostname" 8 58 $NSAPP --title "HOSTNAME" 3>&1 1>&2 2>&3); then
if [ -z "$CT_NAME" ]; then if [ -z "$CT_NAME" ]; then
HN="$NSAPP" HN="$NSAPP"
else else
HN=$(echo ${CT_NAME,,} | tr -d ' ') HN=$(echo ${CT_NAME,,} | tr -d ' ')
fi fi
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}" echo -e "${HOSTNAME}${DGN}Using Hostname: ${BGN}$HN${CL}"
else else
exit-script exit-script
fi fi
if DISK_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then if DISK_SIZE=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --inputbox "Set Disk Size in GB" 8 58 $var_disk --title "DISK SIZE" 3>&1 1>&2 2>&3); then
if [ -z "$DISK_SIZE" ]; then if [ -z "$DISK_SIZE" ]; then
DISK_SIZE="$var_disk" DISK_SIZE="$var_disk"
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}" echo -e "${DISKSIZE}${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
else else
if ! [[ $DISK_SIZE =~ $INTEGER ]]; then if ! [[ $DISK_SIZE =~ $INTEGER ]]; then
echo -e "${RD} DISK SIZE MUST BE AN INTEGER NUMBER!${CL}" echo -e "{INFO}${HOLD}${RD} DISK SIZE MUST BE AN INTEGER NUMBER!${CL}"
advanced_settings advanced_settings
fi fi
echo -e "${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}" echo -e "${DISKSIZE}${DGN}Using Disk Size: ${BGN}$DISK_SIZE${CL}"
fi fi
else else
exit-script exit-script
fi fi
if CORE_COUNT=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then if CORE_COUNT=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --inputbox "Allocate CPU Cores" 8 58 $var_cpu --title "CORE COUNT" 3>&1 1>&2 2>&3); then
if [ -z "$CORE_COUNT" ]; then if [ -z "$CORE_COUNT" ]; then
CORE_COUNT="$var_cpu" CORE_COUNT="$var_cpu"
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}" echo -e "${CPUCORE}${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
else else
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}" echo -e "${CPUCORE}${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}"
fi fi
else else
exit-script exit-script
fi fi
if RAM_SIZE=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then if RAM_SIZE=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --inputbox "Allocate RAM in MiB" 8 58 $var_ram --title "RAM" 3>&1 1>&2 2>&3); then
if [ -z "$RAM_SIZE" ]; then if [ -z "$RAM_SIZE" ]; then
RAM_SIZE="$var_ram" RAM_SIZE="$var_ram"
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}" echo -e "${RAMSIZE}${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
else else
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}" echo -e "${RAMSIZE}${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}"
fi fi
else else
exit-script exit-script
fi fi
if BRG=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then if BRG=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3); then
if [ -z "$BRG" ]; then if [ -z "$BRG" ]; then
BRG="vmbr0" BRG="vmbr0"
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}" echo -e "${BRIDGE}${DGN}Using Bridge: ${BGN}$BRG${CL}"
else else
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}" echo -e "${BRIDGE}${DGN}Using Bridge: ${BGN}$BRG${CL}"
fi fi
else else
exit-script exit-script
fi fi
while true; do while true; do
NET=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Static IPv4 CIDR Address (/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3) NET=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --inputbox "Set a Static IPv4 CIDR Address (/24)" 8 58 dhcp --title "IP ADDRESS" 3>&1 1>&2 2>&3)
exit_status=$? exit_status=$?
if [ $exit_status -eq 0 ]; then if [ $exit_status -eq 0 ]; then
if [ "$NET" = "dhcp" ]; then if [ "$NET" = "dhcp" ]; then
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}" echo -e "${NETWORK}${DGN}Using IP Address: ${BGN}$NET${CL}"
break break
else else
if [[ "$NET" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}/([0-9]|[1-2][0-9]|3[0-2])$ ]]; then if [[ "$NET" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}/([0-9]|[1-2][0-9]|3[0-2])$ ]]; then
echo -e "${DGN}Using IP Address: ${BGN}$NET${CL}" echo -e "${NETWORK}${DGN}Using IP Address: ${BGN}$NET${CL}"
break break
else else
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox "$NET is an invalid IPv4 CIDR address. Please enter a valid IPv4 CIDR address or 'dhcp'" 8 58 whiptail --backtitle "ProxmoxVE Community-Scripts" --msgbox "$NET is an invalid IPv4 CIDR address. Please enter a valid IPv4 CIDR address or 'dhcp'" 8 58
fi fi
fi fi
else else
@ -353,54 +444,54 @@ advanced_settings() {
if [ "$NET" != "dhcp" ]; then if [ "$NET" != "dhcp" ]; then
while true; do while true; do
GATE1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Enter gateway IP address" 8 58 --title "Gateway IP" 3>&1 1>&2 2>&3) GATE1=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --inputbox "Enter gateway IP address" 8 58 --title "Gateway IP" 3>&1 1>&2 2>&3)
if [ -z "$GATE1" ]; then if [ -z "$GATE1" ]; then
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox "Gateway IP address cannot be empty" 8 58 whiptail --backtitle "ProxmoxVE Community-Scripts" --msgbox "Gateway IP address cannot be empty" 8 58
elif [[ ! "$GATE1" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then elif [[ ! "$GATE1" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox "Invalid IP address format" 8 58 whiptail --backtitle "ProxmoxVE Community-Scripts" --msgbox "Invalid IP address format" 8 58
else else
GATE=",gw=$GATE1" GATE=",gw=$GATE1"
echo -e "${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}" echo -e "${GATEWAY}${DGN}Using Gateway IP Address: ${BGN}$GATE1${CL}"
break break
fi fi
done done
else else
GATE="" GATE=""
echo -e "${DGN}Using Gateway IP Address: ${BGN}Default${CL}" echo -e "${GATEWAY}${DGN}Using Gateway IP Address: ${BGN}Default${CL}"
fi fi
if [ "$var_os" == "alpine" ]; then if [ "$var_os" == "alpine" ]; then
APT_CACHER="" APT_CACHER=""
APT_CACHER_IP="" APT_CACHER_IP=""
else else
if APT_CACHER_IP=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set APT-Cacher IP (leave blank for default)" 8 58 --title "APT-Cacher IP" 3>&1 1>&2 2>&3); then if APT_CACHER_IP=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --inputbox "Set APT-Cacher IP (leave blank for default)" 8 58 --title "APT-Cacher IP" 3>&1 1>&2 2>&3); then
APT_CACHER="${APT_CACHER_IP:+yes}" APT_CACHER="${APT_CACHER_IP:+yes}"
echo -e "${DGN}Using APT-Cacher IP Address: ${BGN}${APT_CACHER_IP:-Default}${CL}" echo -e "${NETWORK}${DGN}Using APT-Cacher IP Address: ${BGN}${APT_CACHER_IP:-Default}${CL}"
else else
exit-script exit-script
fi fi
fi fi
if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then if (whiptail --backtitle "ProxmoxVE Community-Scripts" --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58); then
DISABLEIP6="yes" DISABLEIP6="yes"
else else
DISABLEIP6="no" DISABLEIP6="no"
fi fi
echo -e "${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}" echo -e "${DISABLEIPV6}${DGN}Disable IPv6: ${BGN}$DISABLEIP6${CL}"
if MTU1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then if MTU1=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --inputbox "Set Interface MTU Size (leave blank for default)" 8 58 --title "MTU SIZE" 3>&1 1>&2 2>&3); then
if [ -z $MTU1 ]; then if [ -z $MTU1 ]; then
MTU1="Default" MTU1="Default"
MTU="" MTU=""
else else
MTU=",mtu=$MTU1" MTU=",mtu=$MTU1"
fi fi
echo -e "${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}" echo -e "${DEFAULT}${DGN}Using Interface MTU Size: ${BGN}$MTU1${CL}"
else else
exit-script exit-script
fi fi
if SD=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then if SD=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --inputbox "Set a DNS Search Domain (leave blank for HOST)" 8 58 --title "DNS Search Domain" 3>&1 1>&2 2>&3); then
if [ -z $SD ]; then if [ -z $SD ]; then
SX=Host SX=Host
SD="" SD=""
@ -408,72 +499,72 @@ advanced_settings() {
SX=$SD SX=$SD
SD="-searchdomain=$SD" SD="-searchdomain=$SD"
fi fi
echo -e "${DGN}Using DNS Search Domain: ${BGN}$SX${CL}" echo -e "${SEARCH}${DGN}Using DNS Search Domain: ${BGN}$SX${CL}"
else else
exit-script exit-script
fi fi
if NX=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then if NX=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --inputbox "Set a DNS Server IP (leave blank for HOST)" 8 58 --title "DNS SERVER IP" 3>&1 1>&2 2>&3); then
if [ -z $NX ]; then if [ -z $NX ]; then
NX=Host NX=Host
NS="" NS=""
else else
NS="-nameserver=$NX" NS="-nameserver=$NX"
fi fi
echo -e "${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}" echo -e "${NETWORK}${DGN}Using DNS Server IP Address: ${BGN}$NX${CL}"
else else
exit-script exit-script
fi fi
if MAC1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then if MAC1=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --inputbox "Set a MAC Address(leave blank for default)" 8 58 --title "MAC ADDRESS" 3>&1 1>&2 2>&3); then
if [ -z $MAC1 ]; then if [ -z $MAC1 ]; then
MAC1="Default" MAC1="Default"
MAC="" MAC=""
else else
MAC=",hwaddr=$MAC1" MAC=",hwaddr=$MAC1"
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}" echo -e "${MACADDRESS}${DGN}Using MAC Address: ${BGN}$MAC1${CL}"
fi fi
else else
exit-script exit-script
fi fi
if VLAN1=$(whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then if VLAN1=$(whiptail --backtitle "ProxmoxVE Community-Scripts" --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3); then
if [ -z $VLAN1 ]; then if [ -z $VLAN1 ]; then
VLAN1="Default" VLAN1="Default"
VLAN="" VLAN=""
else else
VLAN=",tag=$VLAN1" VLAN=",tag=$VLAN1"
fi fi
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}" echo -e "${VLANTAG}${DGN}Using Vlan: ${BGN}$VLAN1${CL}"
else else
exit-script exit-script
fi fi
if [[ "$PW" == -password* ]]; then if [[ "$PW" == -password* ]]; then
if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then if (whiptail --backtitle "ProxmoxVE Community-Scripts" --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58); then
SSH="yes" SSH="yes"
else else
SSH="no" SSH="no"
fi fi
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}" echo -e "${ROOTSSH}${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
else else
SSH="no" SSH="no"
echo -e "${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}" echo -e "${ROOTSSH}${DGN}Enable Root SSH Access: ${BGN}$SSH${CL}"
fi fi
if (whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then if (whiptail --backtitle "ProxmoxVE Community-Scripts" --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58); then
VERB="yes" VERB="yes"
else else
VERB="no" VERB="no"
fi fi
echo -e "${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}" echo -e "${SEARCH}${DGN}Enable Verbose Mode: ${BGN}$VERB${CL}"
if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then if (whiptail --backtitle "ProxmoxVE Community-Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create ${APP} LXC?" 10 58); then
echo -e "${RD}Creating a ${APP} LXC using the above advanced settings${CL}" echo -e "${CREATING}${RD}Creating a ${APP} LXC using the above advanced settings${CL}"
else else
clear clear
header_info header_info
echo -e "${RD}Using Advanced Settings${CL}" echo -e "${ADVANCED}${RD}Using Advanced Settings${CL}"
advanced_settings advanced_settings
fi fi
} }
@ -491,13 +582,14 @@ install_script() {
NEXTID=$(pvesh get /cluster/nextid) NEXTID=$(pvesh get /cluster/nextid)
timezone=$(cat /etc/timezone) timezone=$(cat /etc/timezone)
header_info header_info
if (whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then if (whiptail --backtitle "ProxmoxVE Community-Scripts" --title "SETTINGS" --yesno "Use Default Settings?" --no-button Advanced 10 58); then
header_info header_info
echo -e "${BL}Using Default Settings${CL}" echo -e "${DEFAULT}${BOLD}${BL}Using Default Settings${CL}"
default_settings base_settings
echo_default
else else
header_info header_info
echo -e "${RD}Using Advanced Settings${CL}" echo -e "${ADVANCED}${BOLD}${RD}Using Advanced Settings${CL}"
advanced_settings advanced_settings
fi fi
} }
@ -509,9 +601,14 @@ check_container_resources() {
# Check whether the current RAM is less than the required RAM or the CPU cores are less than required # Check whether the current RAM is less than the required RAM or the CPU cores are less than required
if [[ "$current_ram" -lt "$var_ram" ]] || [[ "$current_cpu" -lt "$var_cpu" ]]; then if [[ "$current_ram" -lt "$var_ram" ]] || [[ "$current_cpu" -lt "$var_cpu" ]]; then
echo -e "\n⚠️${HOLD} ${GN}Required: ${var_cpu} CPU, ${var_ram}MB RAM ${CL}| ${RD}Current: ${current_cpu} CPU, ${current_ram}MB RAM${CL}" echo -e "\n${INFO}${HOLD} ${GN}Required: ${var_cpu} CPU, ${var_ram}MB RAM ${CL}| ${RD}Current: ${current_cpu} CPU, ${current_ram}MB RAM${CL}"
echo -e "${YWB}Please ensure that the ${APP} LXC is configured with at least ${var_cpu} vCPU and ${var_ram} MB RAM for the build process.${CL}\n" echo -e "${YWB}Please ensure that the ${APP} LXC is configured with at least ${var_cpu} vCPU and ${var_ram} MB RAM for the build process.${CL}\n"
exit 1 read -r -p "${INFO}${HOLD} May cause data loss! ${INFO} Continue update with under-provisioned LXC? <yes/No> " prompt
# Check if the input is 'yes', otherwise exit with status 1
if [[ ! ${prompt,,} =~ ^(yes)$ ]]; then
echo -e "${CROSS}${HOLD} ${YWB}Exiting based on user input.${CL}"
exit 1
fi
else else
echo -e "" echo -e ""
fi fi
@ -524,11 +621,11 @@ check_container_storage() {
usage=$(( 100 * used_size / total_size )) usage=$(( 100 * used_size / total_size ))
if (( usage > 80 )); then if (( usage > 80 )); then
# Prompt the user for confirmation to continue # Prompt the user for confirmation to continue
echo -e "⚠️${HOLD} ${YWB}Warning: Storage is dangerously low (${usage}%).${CL}" echo -e "${INFO}${HOLD} ${YWB}Warning: Storage is dangerously low (${usage}%).${CL}"
read -r -p "Continue anyway? <y/N> " prompt read -r -p "Continue anyway? <y/N> " prompt
# Check if the input is 'y' or 'yes', otherwise exit with status 1 # Check if the input is 'y' or 'yes', otherwise exit with status 1
if [[ ! ${prompt,,} =~ ^(y|yes)$ ]]; then if [[ ! ${prompt,,} =~ ^(y|yes)$ ]]; then
echo -e "❌${HOLD} ${YWB}Exiting based on user input.${CL}" echo -e "${CROSS}${HOLD}${YWB}Exiting based on user input.${CL}"
exit 1 exit 1
fi fi
fi fi
@ -536,9 +633,9 @@ check_container_storage() {
start() { start() {
if command -v pveversion >/dev/null 2>&1; then if command -v pveversion >/dev/null 2>&1; then
if ! (whiptail --backtitle "Proxmox VE Helper Scripts" --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then if ! (whiptail --backtitle "ProxmoxVE Community-Scripts" --title "${APP} LXC" --yesno "This will create a New ${APP} LXC. Proceed?" 10 58); then
clear clear
echo -e "⚠ User exited script \n" exit_script
exit exit
fi fi
SPINNER_PID="" SPINNER_PID=""
@ -546,9 +643,9 @@ start() {
fi fi
if ! command -v pveversion >/dev/null 2>&1; then if ! command -v pveversion >/dev/null 2>&1; then
if ! (whiptail --backtitle "Proxmox VE Helper Scripts" --title "${APP} LXC UPDATE" --yesno "Support/Update functions for ${APP} LXC. Proceed?" 10 58); then if ! (whiptail --backtitle "ProxmoxVE Community-Scripts" --title "${APP} LXC UPDATE" --yesno "Support/Update functions for ${APP} LXC. Proceed?" 10 58); then
clear clear
echo -e "⚠ User exited script \n" exit_script
exit exit
fi fi
SPINNER_PID="" SPINNER_PID=""
@ -591,7 +688,7 @@ build_container() {
export PCT_OPTIONS=" export PCT_OPTIONS="
-features $FEATURES -features $FEATURES
-hostname $HN -hostname $HN
-tags proxmox-helper-scripts -tags $TAGS
$SD $SD
$NS $NS
-net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU -net0 name=eth0,bridge=$BRG$MAC,ip=$NET$GATE$VLAN$MTU
@ -661,8 +758,6 @@ EOF
pct exec "$CTID" -- /bin/sh -c 'cat <<EOF >/etc/apk/repositories pct exec "$CTID" -- /bin/sh -c 'cat <<EOF >/etc/apk/repositories
http://dl-cdn.alpinelinux.org/alpine/latest-stable/main http://dl-cdn.alpinelinux.org/alpine/latest-stable/main
http://dl-cdn.alpinelinux.org/alpine/latest-stable/community http://dl-cdn.alpinelinux.org/alpine/latest-stable/community
#http://dl-cdn.alpinelinux.org/alpine/v3.19/main
#http://dl-cdn.alpinelinux.org/alpine/v3.19/community
EOF' EOF'
pct exec "$CTID" -- ash -c "apk add bash >/dev/null" pct exec "$CTID" -- ash -c "apk add bash >/dev/null"
fi fi

View File

@ -1,18 +1,38 @@
# Copyright (c) 2021-2024 tteck
# Author: tteck (tteckster)
# Revision 1.0 (MickLesk 12/2024)
# License: MIT
# https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
# This function sets color variables for formatting output in the terminal # This function sets color variables for formatting output in the terminal
color() { color() {
# Colors
YW=$(echo "\033[33m") YW=$(echo "\033[33m")
YWB=$(echo "\033[93m")
BL=$(echo "\033[36m") BL=$(echo "\033[36m")
RD=$(echo "\033[01;31m") RD=$(echo "\033[01;31m")
BGN=$(echo "\033[4;92m")
GN=$(echo "\033[1;92m") GN=$(echo "\033[1;92m")
DGN=$(echo "\033[32m")
# Formatting
CL=$(echo "\033[m") CL=$(echo "\033[m")
BFR="\\r\\033[K"
BOLD=$(echo "\033[1m")
TAB=" "
# System
RETRY_NUM=10 RETRY_NUM=10
RETRY_EVERY=3 RETRY_EVERY=3
CM="${GN}✓${CL}"
CROSS="${RD}✗${CL}" # Icons
BFR="\\r\\033[K" CM="${TAB}✔️${TAB}${CL}"
HOLD=" " CROSS="${TAB}✖️${TAB}${CL}"
INFO="${TAB}💡${TAB}${CL}"
NETWORK="${TAB}📡${TAB}${CL}"
OS="${TAB}🖥️${TAB}${CL}"
OSVERSION="${TAB}🌟${TAB}${CL}"
HOSTNAME="${TAB}🏠${TAB}${CL}"
GATEWAY="${TAB}🌐${TAB}${CL}"
DEFAULT="${TAB}⚙️${TAB}${CL}"
} }
# This function enables IPv6 if it's not disabled and sets verbose mode if the global variable is set to "yes" # This function enables IPv6 if it's not disabled and sets verbose mode if the global variable is set to "yes"
@ -49,30 +69,34 @@ error_handler() {
# This function displays a spinner. # This function displays a spinner.
spinner() { spinner() {
local chars="/-\|" local frames=('⠋' '⠙' '⠹' '⠸' '⠼' '⠴' '⠦' '⠧' '⠇' '⠏')
local spin_i=0 local spin_i=0
local interval=0.1
printf "\e[?25l" printf "\e[?25l"
local color="${YWB}"
while true; do while true; do
printf "\r \e[36m%s\e[0m" "${chars:spin_i++%${#chars}:1}" printf "\r ${color}%s${CL}" "${frames[spin_i]}"
sleep 0.1 spin_i=$(( (spin_i + 1) % ${#frames[@]} ))
sleep "$interval"
done done
} }
# This function displays an informational message with a yellow color. # This function displays an informational message with a yellow color.
msg_info() { msg_info() {
local msg="$1" local msg="$1"
echo -ne " ${HOLD} ${YW}${msg} " echo -ne " ${TAB}${YW}${msg} "
spinner & spinner &
SPINNER_PID=$! SPINNER_PID=$!
} }
# This function displays a success message with a green color. # This function displays a success message with a green color.
msg_ok() { msg_ok() {
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
printf "\e[?25h" printf "\e[?25h"
local msg="$1" local msg="$1"
echo -e "${BFR} ${CM} ${GN}${msg}${CL}" echo -e "${BFR}${CM}${GN}${msg}${CL}"
} }
# This function displays a error message with a red color. # This function displays a error message with a red color.
@ -80,7 +104,7 @@ msg_error() {
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
printf "\e[?25h" printf "\e[?25h"
local msg="$1" local msg="$1"
echo -e "${BFR} ${CROSS} ${RD}${msg}${CL}" echo -e "${BFR}${CROSS}${RD}${msg}${CL}"
} }
# This function sets up the Container OS by generating the locale, setting the timezone, and checking the network connection # This function sets up the Container OS by generating the locale, setting the timezone, and checking the network connection
@ -102,7 +126,7 @@ setting_up_container() {
done done
if [ "$(hostname -I)" = "" ]; then if [ "$(hostname -I)" = "" ]; then
echo 1>&2 -e "\n${CROSS}${RD} No Network After $RETRY_NUM Tries${CL}" echo 1>&2 -e "\n${CROSS}${RD} No Network After $RETRY_NUM Tries${CL}"
echo -e " 🖧 Check Network Settings" echo -e "${NETWORK}Check Network Settings"
exit 1 exit 1
fi fi
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
@ -118,8 +142,10 @@ network_check() {
ipv4_connected=false ipv4_connected=false
ipv6_connected=false ipv6_connected=false
sleep 1 sleep 1
sysctl -w net.ipv6.conf.all.disable_ipv6=0 &>/dev/nul
sysctl -w net.ipv6.conf.default.disable_ipv6=0 &>/dev/nul
# Check IPv4 connectivity # Check IPv4 connectivity
if ping -c 1 -W 1 1.1.1.1 &>/dev/null; then if ping -c 1 -W 1 1.1.1.1 &>/dev/null || ping -c 1 -W 1 8.8.8.8 &>/dev/null || ping -c 1 -W 1 9.9.9.9 &>/dev/null; then
msg_ok "IPv4 Internet Connected"; msg_ok "IPv4 Internet Connected";
ipv4_connected=true ipv4_connected=true
else else
@ -127,7 +153,7 @@ network_check() {
fi fi
# Check IPv6 connectivity # Check IPv6 connectivity
if ping6 -c 1 -W 1 2606:4700:4700::1111 &>/dev/null; then if ping6 -c 1 -W 1 2606:4700:4700::1111 &>/dev/null || ping6 -c 1 -W 1 2001:4860:4860::8888 &>/dev/null || ping6 -c 1 -W 1 2620:fe::fe &>/dev/null; then
msg_ok "IPv6 Internet Connected"; msg_ok "IPv6 Internet Connected";
ipv6_connected=true ipv6_connected=true
else else
@ -138,9 +164,9 @@ network_check() {
if [[ $ipv4_connected == false && $ipv6_connected == false ]]; then if [[ $ipv4_connected == false && $ipv6_connected == false ]]; then
read -r -p "No Internet detected,would you like to continue anyway? <y/N> " prompt read -r -p "No Internet detected,would you like to continue anyway? <y/N> " prompt
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
echo -e " ⚠️ ${RD}Expect Issues Without Internet${CL}" echo -e "${INFO}${RD}Expect Issues Without Internet${CL}"
else else
echo -e " 🖧 Check Network Settings" echo -e "${NETWORK}Check Network Settings"
exit 1 exit 1
fi fi
fi fi
@ -166,21 +192,57 @@ fi
EOF EOF
chmod +x /usr/local/bin/apt-proxy-detect.sh chmod +x /usr/local/bin/apt-proxy-detect.sh
fi fi
$STD apt-get update if grep -qEi "debian|ubuntu" /etc/os-release; then
$STD apt-get -o Dpkg::Options::="--force-confold" -y dist-upgrade $STD apt-get update
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED $STD apt-get -o Dpkg::Options::="--force-confold" -y dist-upgrade
# RPM-based systems
elif grep -qEi "fedora|centos|rocky|almalinux" /etc/os-release; then
$STD dnf -y upgrade
# openSUSE
elif grep -qEi "opensuse" /etc/os-release; then
$STD zypper -n update
else
msg_error "Unsupported OS detected!"
exit 1
fi
msg_ok "Updated Container OS" msg_ok "Updated Container OS"
} }
# This function modifies the message of the day (motd) and SSH settings # This function modifies the message of the day (motd) and SSH settings
motd_ssh() { motd_ssh() {
echo "export TERM='xterm-256color'" >>/root/.bashrc # Set terminal to 256-color mode if not already set
echo -e "$APPLICATION LXC provided by https://helper-scripts.com/\n" >/etc/motd grep -qxF "export TERM='xterm-256color'" /root/.bashrc || echo "export TERM='xterm-256color'" >> /root/.bashrc
chmod -x /etc/update-motd.d/*
if [[ "${SSH_ROOT}" == "yes" ]]; then # Get the current private IP address
sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config IP=$(hostname -I | awk '{print $1}') # Private IP
systemctl restart sshd
# Get OS information (Debian / Ubuntu)
if [ -f "/etc/os-release" ]; then
OS_NAME=$(grep ^NAME /etc/os-release | cut -d= -f2 | tr -d '"')
OS_VERSION=$(grep ^VERSION_ID /etc/os-release | cut -d= -f2 | tr -d '"')
elif [ -f "/etc/debian_version" ]; then
OS_NAME="Debian"
OS_VERSION=$(cat /etc/debian_version)
fi fi
# Set MOTD with application info, system details
MOTD_FILE="/etc/motd"
if [ -f "$MOTD_FILE" ]; then
# Start MOTD with application info and link
echo -e "\n${BOLD}${APPLICATION} LXC Container${CL}" > "$MOTD_FILE"
echo -e "${TAB}${GATEWAY}${YW} Provided by: ${GN}community-scripts ORG ${YW}| Project: ${GN}ProxmoxVE ${YW}| GitHub: ${GN}https://github.com/community-scripts/ProxmoxVE${CL}\n" >> "$MOTD_FILE"
# Add system information with icons
echo -e "${TAB}${OS}${YW} OS: ${GN}${OS_NAME} ${OS_VERSION}${CL}" >> "$MOTD_FILE"
echo -e "${TAB}${OSVERSION}${YW} Version: ${GN}${OS_VERSION}${CL}" >> "$MOTD_FILE"
echo -e "${TAB}${HOSTNAME}${YW} Hostname: ${GN}$(hostname)${CL}" >> "$MOTD_FILE"
echo -e "${TAB}${INFO}${YW} IP Address: ${GN}${IP}${CL}" >> "$MOTD_FILE"
else
echo "MotD file does not exist!" >&2
fi
# Disable default MOTD scripts
chmod -x /etc/update-motd.d/*
} }
# This function customizes the container by modifying the getty service and enabling auto-login for the root user # This function customizes the container by modifying the getty service and enabling auto-login for the root user