2025-01-01 13:37:29 +01:00
# Copyright (c) 2021-2025 tteck
2024-12-16 12:41:51 +01:00
# Author: tteck (tteckster)
# Co-Author: MickLesk
2025-01-29 14:26:23 +01:00
# Co-Author: michelroegl-brunner
2025-01-31 09:37:51 +01:00
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
2024-12-16 12:41:51 +01:00
2023-03-22 20:48:20 -04:00
variables( ) {
2025-04-09 15:30:54 +02:00
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.
2025-02-24 11:18:38 +01:00
var_install = " ${ NSAPP } -install " # sets the var_install variable by appending "-install" to the value of NSAPP.
INTEGER = '^[0-9]+([.][0-9]+)?$' # it defines the INTEGER regular expression pattern.
PVEHOST_NAME = $( hostname) # gets the Proxmox Hostname and sets it to Uppercase
DIAGNOSTICS = "yes" # sets the DIAGNOSTICS variable to "yes", used for the API call.
METHOD = "default" # sets the METHOD variable to "default", used for the API call.
2025-02-03 23:40:22 +01:00
RANDOM_UUID = " $( cat /proc/sys/kernel/random/uuid) " # generates a random UUID and sets it to the RANDOM_UUID variable.
2025-06-20 13:28:06 +02:00
CT_TYPE = ${ var_unprivileged :- $CT_TYPE }
2023-03-22 20:48:20 -04:00
}
2025-02-05 16:29:19 +01:00
2025-04-01 10:25:46 +02:00
source <( curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
2023-03-22 20:48:20 -04:00
2025-06-20 13:28:06 +02:00
if command -v curl >/dev/null 2>& 1; then
source <( curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
load_functions
#echo "(build.func) Loaded core.func via curl"
elif command -v wget >/dev/null 2>& 1; then
source <( wget -qO- https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/core.func)
load_functions
#echo "(build.func) Loaded core.func via wget"
fi
2023-05-15 18:55:53 -04:00
# This function enables error handling in the script by setting options and defining a trap for the ERR signal.
2023-03-22 20:48:20 -04:00
catch_errors( ) {
set -Eeuo pipefail
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
}
2023-05-15 18:55:53 -04:00
# This function is called when an error occurs. It receives the exit code, line number, and command that caused the error, and displays an error message.
2023-03-22 20:48:20 -04:00
error_handler( ) {
2025-04-01 10:25:46 +02:00
source /dev/stdin <<< $( curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/api.func)
2024-01-06 17:15:45 -05:00
printf "\e[?25h"
2023-03-22 20:48:20 -04:00
local exit_code = " $? "
local line_number = " $1 "
local command = " $2 "
local error_message = " ${ RD } [ERROR] ${ CL } in line ${ RD } $line_number ${ CL } : exit code ${ RD } $exit_code ${ CL } : while executing command ${ YW } $command ${ CL } "
2025-02-24 11:18:38 +01:00
post_update_to_api "failed" " ${ command } "
2023-05-06 17:17:37 -04:00
echo -e " \n $error_message \n "
2023-03-22 20:48:20 -04:00
}
2024-02-21 19:51:36 -05:00
# Check if the shell is using bash
shell_check( ) {
if [ [ " $( basename " $SHELL " ) " != "bash" ] ] ; then
clear
2024-02-22 23:44:30 -05:00
msg_error "Your default shell is currently not set to Bash. To use these scripts, please switch to the Bash shell."
2024-02-21 19:51:36 -05:00
echo -e "\nExiting..."
sleep 2
exit
fi
}
2023-09-26 17:55:13 -04:00
# Run as root only
2024-02-21 19:51:36 -05:00
root_check( ) {
2023-09-26 19:18:57 -04:00
if [ [ " $( id -u) " -ne 0 || $( ps -o comm = -p $PPID ) = = "sudo" ] ] ; then
clear
msg_error "Please run this script as root."
echo -e "\nExiting..."
sleep 2
exit
fi
2023-09-26 19:16:25 -04:00
}
2023-09-26 17:55:13 -04:00
2023-05-15 18:55:53 -04:00
# This function checks the version of Proxmox Virtual Environment (PVE) and exits if the version is not supported.
2023-03-22 20:48:20 -04:00
pve_check( ) {
2025-04-09 16:13:01 +02:00
if ! pveversion | grep -Eq "pve-manager/8\.[0-4](\.[0-9]+)*" ; then
2024-12-16 12:41:51 +01:00
msg_error " ${ CROSS } ${ RD } This version of Proxmox Virtual Environment is not supported "
2024-06-30 10:18:37 -04:00
echo -e "Requires Proxmox Virtual Environment Version 8.1 or later."
2023-03-22 20:48:20 -04:00
echo -e "Exiting..."
sleep 2
exit
2025-01-29 14:26:23 +01:00
fi
2023-03-22 20:48:20 -04:00
}
2025-01-29 14:26:23 +01:00
# When a node is running tens of containers, it's possible to exceed the kernel's cryptographic key storage allocations.
2025-01-20 09:19:47 +01:00
# These are tuneable, so verify if the currently deployment is approaching the limits, advise the user on how to tune the limits, and exit the script.
# https://cleveruptime.com/docs/files/proc-key-users | https://docs.kernel.org/security/keys/core.html
maxkeys_check( ) {
# Read kernel parameters
per_user_maxkeys = $( cat /proc/sys/kernel/keys/maxkeys 2>/dev/null || echo 0)
per_user_maxbytes = $( cat /proc/sys/kernel/keys/maxbytes 2>/dev/null || echo 0)
# Exit if kernel parameters are unavailable
if [ [ " $per_user_maxkeys " -eq 0 || " $per_user_maxbytes " -eq 0 ] ] ; then
echo -e " ${ CROSS } ${ RD } Error: Unable to read kernel parameters. Ensure proper permissions. ${ CL } "
exit 1
fi
# Fetch key usage for user ID 100000 (typical for containers)
used_lxc_keys = $( awk '/100000:/ {print $2}' /proc/key-users 2>/dev/null || echo 0)
used_lxc_bytes = $( awk '/100000:/ {split($5, a, "/"); print a[1]}' /proc/key-users 2>/dev/null || echo 0)
# Calculate thresholds and suggested new limits
threshold_keys = $(( per_user_maxkeys - 100 ))
threshold_bytes = $(( per_user_maxbytes - 1000 ))
new_limit_keys = $(( per_user_maxkeys * 2 ))
new_limit_bytes = $(( per_user_maxbytes * 2 ))
# Check if key or byte usage is near limits
failure = 0
if [ [ " $used_lxc_keys " -gt " $threshold_keys " ] ] ; then
echo -e " ${ CROSS } ${ RD } Warning: Key usage is near the limit ( ${ used_lxc_keys } / ${ per_user_maxkeys } ). ${ CL } "
echo -e " ${ INFO } Suggested action: Set ${ GN } kernel.keys.maxkeys= ${ new_limit_keys } ${ CL } in ${ BOLD } /etc/sysctl.d/98-community-scripts.conf ${ CL } . "
failure = 1
fi
if [ [ " $used_lxc_bytes " -gt " $threshold_bytes " ] ] ; then
echo -e " ${ CROSS } ${ RD } Warning: Key byte usage is near the limit ( ${ used_lxc_bytes } / ${ per_user_maxbytes } ). ${ CL } "
echo -e " ${ INFO } Suggested action: Set ${ GN } kernel.keys.maxbytes= ${ new_limit_bytes } ${ CL } in ${ BOLD } /etc/sysctl.d/98-community-scripts.conf ${ CL } . "
failure = 1
fi
# Provide next steps if issues are detected
if [ [ " $failure " -eq 1 ] ] ; then
echo -e " ${ INFO } To apply changes, run: ${ BOLD } service procps force-reload ${ CL } "
exit 1
fi
echo -e " ${ CM } ${ GN } All kernel key limits are within safe thresholds. ${ CL } "
}
2023-05-15 18:55:53 -04:00
# This function checks the system architecture and exits if it's not "amd64".
2023-03-22 20:48:20 -04:00
arch_check( ) {
if [ " $( dpkg --print-architecture) " != "amd64" ] ; then
2024-12-16 12:41:51 +01:00
echo -e " \n ${ INFO } ${ YWB } This script will not work with PiMox! \n "
echo -e " \n ${ YWB } Visit https://github.com/asylumexp/Proxmox for ARM64 support. \n "
2023-03-22 20:48:20 -04:00
echo -e "Exiting..."
sleep 2
exit
fi
}
2024-12-28 20:37:58 +01:00
# Function to get the current IP address based on the distribution
get_current_ip( ) {
if [ -f /etc/os-release ] ; then
# Check for Debian/Ubuntu (uses hostname -I)
if grep -qE 'ID=debian|ID=ubuntu' /etc/os-release; then
CURRENT_IP = $( hostname -I | awk '{print $1}' )
# Check for Alpine (uses ip command)
elif grep -q 'ID=alpine' /etc/os-release; then
CURRENT_IP = $( ip -4 addr show eth0 | awk '/inet / {print $2}' | cut -d/ -f1 | head -n 1)
else
CURRENT_IP = "Unknown"
fi
fi
echo " $CURRENT_IP "
}
# Function to update the IP address in the MOTD file
update_motd_ip( ) {
MOTD_FILE = "/etc/motd"
2025-01-29 14:26:23 +01:00
2024-12-28 20:37:58 +01:00
if [ -f " $MOTD_FILE " ] ; then
# Remove existing IP Address lines to prevent duplication
sed -i '/IP Address:/d' " $MOTD_FILE "
2025-01-29 14:26:23 +01:00
2024-12-28 20:37:58 +01:00
IP = $( get_current_ip)
# Add the new IP address
2025-02-24 11:18:38 +01:00
echo -e " ${ TAB } ${ NETWORK } ${ YW } IP Address: ${ GN } ${ IP } ${ CL } " >>" $MOTD_FILE "
2024-12-28 20:37:58 +01:00
fi
}
2023-05-15 18:55:53 -04:00
# This function checks if the script is running through SSH and prompts the user to confirm if they want to proceed or exit.
2023-03-26 11:06:28 -04:00
ssh_check( ) {
2024-12-16 12:41:51 +01:00
if [ -n " ${ SSH_CLIENT : +x } " ] ; then
2024-02-23 15:12:30 -05:00
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
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
else
clear
echo "Exiting due to SSH usage. Please consider using the Proxmox shell."
exit
2023-03-26 11:11:13 -04:00
fi
2023-03-26 11:06:28 -04:00
fi
}
2024-12-16 12:41:51 +01:00
base_settings( ) {
# Default Settings
CT_TYPE = "1"
DISK_SIZE = "4"
CORE_COUNT = "1"
RAM_SIZE = "1024"
VERBOSE = " ${ 1 :- 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"
2025-01-13 16:04:59 +01:00
SSH_AUTHORIZED_KEY = ""
2024-12-16 12:41:51 +01:00
TAGS = "community-script;"
2025-06-20 13:28:06 +02:00
ENABLE_FUSE = " ${ 1 :- no } "
ENABLE_TUN = " ${ 1 :- no } "
2025-01-13 16:04:59 +01:00
2024-12-16 12:41:51 +01:00
# Override default settings with variables from ct script
2024-12-16 16:41:01 -05:00
CT_TYPE = ${ var_unprivileged :- $CT_TYPE }
2024-12-16 12:41:51 +01:00
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 :- } "
2025-05-22 14:32:27 +02:00
ENABLE_FUSE = " ${ var_fuse :- $ENABLE_FUSE } "
ENABLE_TUN = " ${ var_tun :- $ENABLE_TUN } "
2025-01-13 16:04:59 +01:00
2024-12-16 12:41:51 +01:00
# 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
}
2025-05-16 15:48:18 +02:00
write_config( ) {
2025-05-20 11:00:58 +02:00
mkdir -p /opt/community-scripts
2025-05-16 15:48:18 +02:00
# This function writes the configuration to a file.
2025-06-19 18:48:35 +02:00
if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "Write configfile" --yesno "Do you want to write the selections to a config file?" 10 60; then
2025-05-16 15:48:18 +02:00
FILEPATH = " /opt/community-scripts/ ${ NSAPP } .conf "
if [ [ ! -f $FILEPATH ] ] ; then
cat <<EOF >"$FILE PATH"
# ${NSAPP} Configuration File
# Generated on $(date)
CT_TYPE = " ${ CT_TYPE } "
DISK_SIZE = " ${ DISK_SIZE } "
2025-06-07 20:57:55 +02:00
CORE_COUNT = " ${ CORE_COUNT } "
2025-05-16 15:48:18 +02:00
RAM_SIZE = " ${ RAM_SIZE } "
HN = " ${ HN } "
BRG = " ${ BRG } "
APT_CACHER_IP = " ${ APT_CACHER_IP :- none } "
DISABLEIP6 = " ${ DISABLEIP6 } "
2025-06-02 14:16:11 +02:00
PW = '${PW:-none}'
2025-05-16 15:48:18 +02:00
SSH = " ${ SSH } "
SSH_AUTHORIZED_KEY = " ${ SSH_AUTHORIZED_KEY } "
VERBOSE = " ${ VERBOSE } "
TAGS = " ${ TAGS :- none } "
VLAN = " ${ VLAN :- none } "
MTU = " ${ MTU :- 1500 } "
GATE = " ${ GATE :- none } "
SD = " ${ SD :- none } "
MAC = " ${ MAC :- none } "
NS = " ${ NS :- none } "
NET = " ${ NET } "
2025-06-02 14:16:11 +02:00
FUSE = " ${ ENABLE_FUSE } "
2025-05-16 15:48:18 +02:00
EOF
echo -e " ${ INFO } ${ BOLD } ${ GN } Writing configuration to ${ FILEPATH } ${ CL } "
else
echo -e " ${ INFO } ${ BOLD } ${ RD } Configuration file already exists at ${ FILEPATH } ${ CL } "
2025-06-19 18:48:35 +02:00
if whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "Overwrite configfile" --yesno "Do you want to overwrite the existing config file?" 10 60; then
2025-05-22 14:32:27 +02:00
rm -f " $FILEPATH "
cat <<EOF >"$FILE PATH"
2025-05-16 15:48:18 +02:00
# ${NSAPP} Configuration File
# Generated on $(date)
CT_TYPE = " ${ CT_TYPE } "
DISK_SIZE = " ${ DISK_SIZE } "
2025-06-07 20:57:55 +02:00
CORE_COUNT = " ${ CORE_COUNT } "
2025-05-16 15:48:18 +02:00
RAM_SIZE = " ${ RAM_SIZE } "
HN = " ${ HN } "
BRG = " ${ BRG } "
APT_CACHER_IP = " ${ APT_CACHER_IP :- none } "
DISABLEIP6 = " ${ DISABLEIP6 } "
2025-06-02 14:16:11 +02:00
PW = '${PW:-none}'
2025-05-16 15:48:18 +02:00
SSH = " ${ SSH } "
SSH_AUTHORIZED_KEY = " ${ SSH_AUTHORIZED_KEY } "
VERBOSE = " ${ VERBOSE } "
TAGS = " ${ TAGS :- none } "
VLAN = " ${ VLAN :- none } "
MTU = " ${ MTU :- 1500 } "
GATE = " ${ GATE :- none } "
SD = " ${ SD :- none } "
MAC = " ${ MAC :- none } "
NS = " ${ NS :- none } "
NET = " ${ NET } "
2025-06-02 14:16:11 +02:00
FUSE = " ${ ENABLE_FUSE } "
2025-05-16 15:48:18 +02:00
EOF
echo -e " ${ INFO } ${ BOLD } ${ GN } Writing configuration to ${ FILEPATH } ${ CL } "
else
echo -e " ${ INFO } ${ BOLD } ${ RD } Configuration file not overwritten ${ CL } "
fi
fi
fi
}
2023-05-15 18:55:53 -04:00
# This function displays the default values for various settings.
2023-03-22 20:48:20 -04:00
echo_default( ) {
2024-12-16 12:41:51 +01:00
# Convert CT_TYPE to description
CT_TYPE_DESC = "Unprivileged"
if [ " $CT_TYPE " -eq 0 ] ; then
CT_TYPE_DESC = "Privileged"
fi
# Output the selected values with icons
echo -e " ${ OS } ${ BOLD } ${ DGN } Operating System: ${ BGN } $var_os ${ CL } "
echo -e " ${ OSVERSION } ${ BOLD } ${ DGN } Version: ${ BGN } $var_version ${ CL } "
echo -e " ${ CONTAINERTYPE } ${ BOLD } ${ DGN } Container Type: ${ BGN } $CT_TYPE_DESC ${ CL } "
2025-01-13 16:04:59 +01:00
echo -e " ${ DISKSIZE } ${ BOLD } ${ DGN } Disk Size: ${ BGN } ${ DISK_SIZE } GB ${ CL } "
2024-12-16 12:41:51 +01:00
echo -e " ${ CPUCORE } ${ BOLD } ${ DGN } CPU Cores: ${ BGN } ${ CORE_COUNT } ${ CL } "
2025-01-13 16:04:59 +01:00
echo -e " ${ RAMSIZE } ${ BOLD } ${ DGN } RAM Size: ${ BGN } ${ RAM_SIZE } MiB ${ CL } "
2024-12-16 12:41:51 +01:00
echo -e " ${ CONTAINERID } ${ BOLD } ${ DGN } Container ID: ${ BGN } ${ CT_ID } ${ CL } "
if [ " $VERB " = = "yes" ] ; then
echo -e " ${ SEARCH } ${ BOLD } ${ DGN } Verbose Mode: ${ BGN } Enabled ${ CL } "
fi
echo -e " ${ CREATING } ${ BOLD } ${ BL } Creating a ${ APP } LXC using the above default settings ${ CL } "
echo -e " "
2023-03-22 20:48:20 -04:00
}
2025-05-06 09:50:11 +02:00
# This function is called when the user decides to exit the script. It clears the screen and displays an exit message.
exit_script( ) {
clear
echo -e " \n ${ CROSS } ${ RD } User exited script ${ CL } \n "
exit
}
2023-05-15 18:55:53 -04:00
# This function allows the user to configure advanced settings for the script.
2023-03-22 20:48:20 -04:00
advanced_settings( ) {
2023-09-09 05:13:17 -04:00
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox --title "Here is an instructional tip:" "To make a selection, use the Spacebar." 8 58
2024-12-16 12:41:51 +01:00
# Setting Default Tag for Advanced Settings
2024-12-27 19:42:13 +01:00
TAGS = " community-script; ${ var_tags :- } "
2025-01-20 18:03:27 +01:00
CT_DEFAULT_TYPE = " ${ CT_TYPE } "
2023-04-23 18:09:32 -04:00
CT_TYPE = ""
while [ -z " $CT_TYPE " ] ; do
2025-01-29 14:26:23 +01:00
if [ " $CT_DEFAULT_TYPE " = = "1" ] ; then
2025-01-20 18:03:27 +01:00
if CT_TYPE = $( whiptail --backtitle "Proxmox VE Helper Scripts" --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
"1" "Unprivileged" ON \
"0" "Privileged" OFF \
3>& 1 1>& 2 2>& 3) ; then
if [ -n " $CT_TYPE " ] ; then
CT_TYPE_DESC = "Unprivileged"
if [ " $CT_TYPE " -eq 0 ] ; then
CT_TYPE_DESC = "Privileged"
fi
2025-04-09 15:30:54 +02:00
echo -e " ${ OS } ${ BOLD } ${ DGN } Operating System: ${ BGN } $var_os ${ CL } "
echo -e " ${ OSVERSION } ${ BOLD } ${ DGN } Version: ${ BGN } $var_version ${ CL } "
2025-01-20 18:03:27 +01:00
echo -e " ${ CONTAINERTYPE } ${ BOLD } ${ DGN } Container Type: ${ BGN } $CT_TYPE_DESC ${ CL } "
2024-12-16 12:41:51 +01:00
fi
2025-01-20 18:03:27 +01:00
else
exit_script
fi
fi
if [ " $CT_DEFAULT_TYPE " = = "0" ] ; then
if CT_TYPE = $( whiptail --backtitle "Proxmox VE Helper Scripts" --title "CONTAINER TYPE" --radiolist "Choose Type" 10 58 2 \
"1" "Unprivileged" OFF \
"0" "Privileged" ON \
3>& 1 1>& 2 2>& 3) ; then
if [ -n " $CT_TYPE " ] ; then
CT_TYPE_DESC = "Unprivileged"
if [ " $CT_TYPE " -eq 0 ] ; then
CT_TYPE_DESC = "Privileged"
fi
2025-04-09 15:30:54 +02:00
echo -e " ${ OS } ${ BOLD } ${ DGN } Operating System: ${ BGN } $var_os ${ CL } "
echo -e " ${ OSVERSION } ${ BOLD } ${ DGN } Version: ${ BGN } $var_version ${ CL } "
2025-01-20 18:03:27 +01:00
echo -e " ${ CONTAINERTYPE } ${ BOLD } ${ DGN } Container Type: ${ BGN } $CT_TYPE_DESC ${ CL } "
fi
else
exit_script
2023-04-23 18:09:32 -04:00
fi
2023-03-23 00:09:04 -04:00
fi
2023-04-23 18:09:32 -04:00
done
2023-03-22 20:48:20 -04:00
2025-06-20 13:32:57 +02:00
while true; do
2024-05-31 16:00:33 -04:00
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
2025-06-20 13:28:06 +02:00
# Empty = Autologin
if [ [ -z " $PW1 " ] ] ; then
2024-04-23 06:55:18 -04:00
PW = ""
2025-06-20 13:28:06 +02:00
PW1 = "Automatic Login"
2024-12-16 12:41:51 +01:00
echo -e " ${ VERIFYPW } ${ BOLD } ${ DGN } Root Password: ${ BGN } $PW1 ${ CL } "
2024-04-23 06:55:18 -04:00
break
fi
2025-06-20 13:28:06 +02:00
# Invalid: contains spaces
if [ [ " $PW1 " = = *" " * ] ] ; then
whiptail --msgbox "Password cannot contain spaces." 8 58
continue
fi
# Invalid: too short
if ( ( ${# PW1 } < 5) ) ; then
whiptail --msgbox "Password must be at least 5 characters." 8 58
continue
fi
# Confirm password
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 [ [ " $PW1 " = = " $PW2 " ] ] ; then
PW = " -password $PW1 "
echo -e " ${ VERIFYPW } ${ BOLD } ${ DGN } Root Password: ${ BGN } ******** ${ CL } "
break
else
whiptail --msgbox "Passwords do not match. Please try again." 8 58
fi
else
exit_script
fi
2023-03-22 20:48:20 -04:00
else
2024-12-16 12:41:51 +01:00
exit_script
2023-03-22 20:48:20 -04:00
fi
2024-04-23 06:55:18 -04:00
done
2023-03-22 20:48:20 -04:00
2025-04-09 15:30:54 +02:00
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
2023-03-22 20:48:20 -04:00
if [ -z " $CT_ID " ] ; then
CT_ID = " $NEXTID "
2024-12-16 12:41:51 +01:00
echo -e " ${ CONTAINERID } ${ BOLD } ${ DGN } Container ID: ${ BGN } $CT_ID ${ CL } "
2023-03-22 20:48:20 -04:00
else
2024-12-16 12:41:51 +01:00
echo -e " ${ CONTAINERID } ${ BOLD } ${ DGN } Container ID: ${ BGN } $CT_ID ${ CL } "
2023-03-22 20:48:20 -04:00
fi
else
2025-05-06 09:03:18 +02:00
exit_script
2023-03-22 20:48:20 -04:00
fi
2025-06-19 18:48:35 +02:00
while true; do
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 [ -z " $CT_NAME " ] ; then
HN = " $NSAPP "
else
HN = $( echo " ${ CT_NAME ,, } " | tr -d ' ' )
fi
2025-06-20 13:32:57 +02:00
# Hostname validate (RFC 1123)
2025-06-19 18:48:35 +02:00
if [ [ " $HN " = ~ ^[ a-z0-9] ( [ -a-z0-9] *[ a-z0-9] ) ?$ ] ] ; then
echo -e " ${ HOSTNAME } ${ BOLD } ${ DGN } Hostname: ${ BGN } $HN ${ CL } "
break
else
whiptail --backtitle "Proxmox VE Helper Scripts" \
--msgbox " ❌ Invalid hostname: ' $HN '\n\nOnly lowercase letters, digits and hyphens (-) are allowed.\nUnderscores (_) or other characters are not permitted! " 10 70
fi
2023-03-22 20:48:20 -04:00
else
2025-06-19 18:48:35 +02:00
exit_script
2023-03-22 20:48:20 -04:00
fi
2025-06-19 18:48:35 +02:00
done
while true; do
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) || exit_script
2023-03-22 20:48:20 -04:00
if [ -z " $DISK_SIZE " ] ; then
DISK_SIZE = " $var_disk "
2025-06-19 18:48:35 +02:00
fi
if [ [ " $DISK_SIZE " = ~ ^[ 1-9] [ 0-9] *$ ] ] ; then
2025-01-13 16:04:59 +01:00
echo -e " ${ DISKSIZE } ${ BOLD } ${ DGN } Disk Size: ${ BGN } ${ DISK_SIZE } GB ${ CL } "
2025-06-19 18:48:35 +02:00
break
2023-03-22 20:48:20 -04:00
else
2025-06-19 18:48:35 +02:00
whiptail --msgbox "Disk size must be a positive integer!" 8 58
2023-03-22 20:48:20 -04:00
fi
2025-06-19 18:48:35 +02:00
done
while true; do
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) || exit_script
2023-03-22 20:48:20 -04:00
if [ -z " $CORE_COUNT " ] ; then
CORE_COUNT = " $var_cpu "
2025-06-19 18:48:35 +02:00
fi
if [ [ " $CORE_COUNT " = ~ ^[ 1-9] [ 0-9] *$ ] ] ; then
2024-12-16 12:41:51 +01:00
echo -e " ${ CPUCORE } ${ BOLD } ${ DGN } CPU Cores: ${ BGN } $CORE_COUNT ${ CL } "
2025-06-19 18:48:35 +02:00
break
2023-03-22 20:48:20 -04:00
else
2025-06-19 18:48:35 +02:00
whiptail --msgbox "CPU core count must be a positive integer!" 8 58
2023-03-22 20:48:20 -04:00
fi
2025-06-19 18:48:35 +02:00
done
while true; do
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) || exit_script
2023-03-22 20:48:20 -04:00
if [ -z " $RAM_SIZE " ] ; then
RAM_SIZE = " $var_ram "
2025-06-19 18:48:35 +02:00
fi
if [ [ " $RAM_SIZE " = ~ ^[ 1-9] [ 0-9] *$ ] ] ; then
2025-01-13 16:04:59 +01:00
echo -e " ${ RAMSIZE } ${ BOLD } ${ DGN } RAM Size: ${ BGN } ${ RAM_SIZE } MiB ${ CL } "
2025-06-19 18:48:35 +02:00
break
2023-03-22 20:48:20 -04:00
else
2025-06-19 18:48:35 +02:00
whiptail --msgbox "RAM size must be a positive integer!" 8 58
2023-03-22 20:48:20 -04:00
fi
2025-06-19 18:48:35 +02:00
done
2023-03-22 20:48:20 -04:00
2025-05-13 18:44:06 +02:00
BRIDGES = ""
IFACE_FILEPATH_LIST = "/etc/network/interfaces" $'\n' $( find "/etc/network/interfaces.d/" -type f)
2025-05-15 10:31:37 +02:00
OLD_IFS = $IFS
IFS = $'\n'
2025-05-13 18:44:06 +02:00
for iface_filepath in ${ IFACE_FILEPATH_LIST } ; do
iface_indexes_tmpfile = $( mktemp -q -u '.iface-XXXX' )
2025-05-15 10:31:37 +02:00
( grep -Pn '^\s*iface' " ${ iface_filepath } " | cut -d':' -f1 && wc -l " ${ iface_filepath } " | cut -d' ' -f1) |
2025-05-16 09:39:29 +02:00
awk 'FNR==1 {line=$0; next} {print line":"$0-1; line=$0}' >" ${ iface_indexes_tmpfile } " || true
2025-05-13 18:44:06 +02:00
if [ -f " ${ iface_indexes_tmpfile } " ] ; then
2025-05-15 10:31:37 +02:00
while read -r pair; do
start = $( echo " ${ pair } " | cut -d':' -f1)
end = $( echo " ${ pair } " | cut -d':' -f2)
2025-05-13 18:44:06 +02:00
2025-05-15 12:53:21 +02:00
if awk " NR >= ${ start } && NR <= ${ end } " " ${ iface_filepath } " | grep -qP '^\s*(bridge[-_](ports|stp|fd|vlan-aware|vids)|ovs_type\s+OVSBridge)\b' ; then
2025-05-15 10:31:37 +02:00
iface_name = $( sed " ${ start } q;d " " ${ iface_filepath } " | awk '{print $2}' )
BRIDGES = " ${ iface_name } " $'\n' " ${ BRIDGES } "
fi
2025-05-13 18:44:06 +02:00
2025-05-15 10:31:37 +02:00
done <" ${ iface_indexes_tmpfile } "
rm -f " ${ iface_indexes_tmpfile } "
2025-05-13 18:44:06 +02:00
fi
done
IFS = $OLD_IFS
BRIDGES = $( echo " $BRIDGES " | grep -v '^\s*$' | sort | uniq)
2025-05-08 15:50:34 +02:00
if [ [ -z " $BRIDGES " ] ] ; then
BRG = "vmbr0"
echo -e " ${ BRIDGE } ${ BOLD } ${ DGN } Bridge: ${ BGN } $BRG ${ CL } "
2023-03-22 20:48:20 -04:00
else
2025-05-08 16:17:48 +02:00
BRG = $( whiptail --backtitle "Proxmox VE Helper Scripts" --menu "Select network bridge:" 15 40 6 $( echo " $BRIDGES " | awk '{print $0, "Bridge"}' ) 3>& 1 1>& 2 2>& 3)
2025-05-15 10:31:37 +02:00
if [ -z " $BRG " ] ; then
exit_script
else
echo -e " ${ BRIDGE } ${ BOLD } ${ DGN } Bridge: ${ BGN } $BRG ${ CL } "
fi
2023-03-22 20:48:20 -04:00
fi
2023-05-06 04:24:18 -04:00
while true; do
2023-09-09 05:13:17 -04:00
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)
2023-05-06 04:24:18 -04:00
exit_status = $?
if [ $exit_status -eq 0 ] ; then
if [ " $NET " = "dhcp" ] ; then
2024-12-16 12:41:51 +01:00
echo -e " ${ NETWORK } ${ BOLD } ${ DGN } IP Address: ${ BGN } $NET ${ CL } "
2023-05-06 04:24:18 -04:00
break
else
if [ [ " $NET " = ~ ^( [ 0-9] { 1,3} \. ) { 3} [ 0-9] { 1,3} /( [ 0-9] | [ 1-2] [ 0-9] | 3[ 0-2] ) $ ] ] ; then
2024-12-16 12:41:51 +01:00
echo -e " ${ NETWORK } ${ BOLD } ${ DGN } IP Address: ${ BGN } $NET ${ CL } "
2023-05-06 04:24:18 -04:00
break
else
2023-09-09 05:13:17 -04:00
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
2023-05-06 04:24:18 -04:00
fi
fi
2023-03-22 20:48:20 -04:00
else
2024-12-16 12:41:51 +01:00
exit_script
2023-03-22 20:48:20 -04:00
fi
2023-05-06 04:24:18 -04:00
done
2023-03-22 20:48:20 -04:00
2023-05-11 14:15:10 -04:00
if [ " $NET " != "dhcp" ] ; then
while true; do
2023-09-09 05:13:17 -04:00
GATE1 = $( whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Enter gateway IP address" 8 58 --title "Gateway IP" 3>& 1 1>& 2 2>& 3)
2023-05-11 14:15:10 -04:00
if [ -z " $GATE1 " ] ; then
2023-09-09 05:13:17 -04:00
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox "Gateway IP address cannot be empty" 8 58
2023-05-11 14:15:10 -04:00
elif [ [ ! " $GATE1 " = ~ ^( [ 0-9] { 1,3} \. ) { 3} [ 0-9] { 1,3} $ ] ] ; then
2023-09-09 05:13:17 -04:00
whiptail --backtitle "Proxmox VE Helper Scripts" --msgbox "Invalid IP address format" 8 58
2023-05-11 14:15:10 -04:00
else
GATE = " ,gw= $GATE1 "
2024-12-16 12:41:51 +01:00
echo -e " ${ GATEWAY } ${ BOLD } ${ DGN } Gateway IP Address: ${ BGN } $GATE1 ${ CL } "
2023-05-11 14:15:10 -04:00
break
fi
done
else
GATE = ""
2024-12-16 12:41:51 +01:00
echo -e " ${ GATEWAY } ${ BOLD } ${ DGN } Gateway IP Address: ${ BGN } Default ${ CL } "
2023-05-11 14:15:10 -04:00
fi
2023-03-22 20:48:20 -04:00
2024-02-12 10:36:02 -05:00
if [ " $var_os " = = "alpine" ] ; then
APT_CACHER = ""
2024-02-12 10:38:37 -05:00
APT_CACHER_IP = ""
2024-02-12 10:36:02 -05:00
else
2025-01-20 18:03:27 +01:00
if APT_CACHER_IP = $( whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set APT-Cacher IP (leave blank for none)" 8 58 --title "APT-Cacher IP" 3>& 1 1>& 2 2>& 3) ; then
2024-02-12 07:17:23 -05:00
APT_CACHER = " ${ APT_CACHER_IP : +yes } "
2024-12-16 12:41:51 +01:00
echo -e " ${ NETWORK } ${ BOLD } ${ DGN } APT-Cacher IP Address: ${ BGN } ${ APT_CACHER_IP :- Default } ${ CL } "
2024-02-12 07:17:23 -05:00
else
2024-12-16 12:41:51 +01:00
exit_script
2024-02-12 07:17:23 -05:00
fi
2024-01-12 15:00:42 -05:00
fi
2023-09-09 05:13:17 -04:00
if ( whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "IPv6" --yesno "Disable IPv6?" 10 58) ; then
2023-03-22 20:48:20 -04:00
DISABLEIP6 = "yes"
else
DISABLEIP6 = "no"
fi
2024-12-16 12:41:51 +01:00
echo -e " ${ DISABLEIPV6 } ${ BOLD } ${ DGN } Disable IPv6: ${ BGN } $DISABLEIP6 ${ CL } "
2023-03-22 20:48:20 -04:00
2025-03-21 11:44:07 +01:00
if MTU1 = $( whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Interface MTU Size (leave blank for default [The MTU of your selected vmbr, default is 1500])" 8 58 --title "MTU SIZE" 3>& 1 1>& 2 2>& 3) ; then
2025-04-09 15:30:54 +02:00
if [ -z " $MTU1 " ] ; then
2023-03-22 20:48:20 -04:00
MTU1 = "Default"
MTU = ""
else
MTU = " ,mtu= $MTU1 "
fi
2024-12-16 12:41:51 +01:00
echo -e " ${ DEFAULT } ${ BOLD } ${ DGN } Interface MTU Size: ${ BGN } $MTU1 ${ CL } "
2023-03-22 20:48:20 -04:00
else
2024-12-16 12:41:51 +01:00
exit_script
2023-03-22 20:48:20 -04:00
fi
2023-09-09 05:13:17 -04:00
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
2025-04-09 15:30:54 +02:00
if [ -z " $SD " ] ; then
2023-03-22 20:48:20 -04:00
SX = Host
SD = ""
else
SX = $SD
SD = " -searchdomain= $SD "
fi
2024-12-16 12:41:51 +01:00
echo -e " ${ SEARCH } ${ BOLD } ${ DGN } DNS Search Domain: ${ BGN } $SX ${ CL } "
2023-03-22 20:48:20 -04:00
else
2024-12-16 12:41:51 +01:00
exit_script
2023-03-22 20:48:20 -04:00
fi
2023-09-09 05:13:17 -04:00
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
2025-04-09 15:30:54 +02:00
if [ -z " $NX " ] ; then
2023-03-22 20:48:20 -04:00
NX = Host
NS = ""
else
NS = " -nameserver= $NX "
fi
2024-12-16 12:41:51 +01:00
echo -e " ${ NETWORK } ${ BOLD } ${ DGN } DNS Server IP Address: ${ BGN } $NX ${ CL } "
2023-03-22 20:48:20 -04:00
else
2024-12-16 12:41:51 +01:00
exit_script
2023-03-22 20:48:20 -04:00
fi
2025-01-20 18:03:27 +01:00
if MAC1 = $( whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a MAC Address(leave blank for generated MAC)" 8 58 --title "MAC ADDRESS" 3>& 1 1>& 2 2>& 3) ; then
2025-04-09 15:30:54 +02:00
if [ -z " $MAC1 " ] ; then
2023-03-22 20:48:20 -04:00
MAC1 = "Default"
MAC = ""
else
MAC = " ,hwaddr= $MAC1 "
2024-12-16 12:41:51 +01:00
echo -e " ${ MACADDRESS } ${ BOLD } ${ DGN } MAC Address: ${ BGN } $MAC1 ${ CL } "
2023-03-22 20:48:20 -04:00
fi
else
2024-12-16 12:41:51 +01:00
exit_script
2023-03-22 20:48:20 -04:00
fi
2025-01-20 18:03:27 +01:00
if VLAN1 = $( whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set a Vlan(leave blank for no VLAN)" 8 58 --title "VLAN" 3>& 1 1>& 2 2>& 3) ; then
2025-04-09 15:30:54 +02:00
if [ -z " $VLAN1 " ] ; then
2023-03-22 20:48:20 -04:00
VLAN1 = "Default"
VLAN = ""
else
VLAN = " ,tag= $VLAN1 "
fi
2024-12-16 12:41:51 +01:00
echo -e " ${ VLANTAG } ${ BOLD } ${ DGN } Vlan: ${ BGN } $VLAN1 ${ CL } "
2023-03-22 20:48:20 -04:00
else
2024-12-16 12:41:51 +01:00
exit_script
2023-03-22 20:48:20 -04:00
fi
2025-04-09 15:30:54 +02:00
if ADV_TAGS = $( whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "Set Custom Tags?[If you remove all, there will be no tags!]" 8 58 " ${ TAGS } " --title "Advanced Tags" 3>& 1 1>& 2 2>& 3) ; then
2025-01-10 13:17:44 +01:00
if [ -n " ${ ADV_TAGS } " ] ; then
2025-01-29 14:26:23 +01:00
ADV_TAGS = $( echo " $ADV_TAGS " | tr -d '[:space:]' )
TAGS = " ${ ADV_TAGS } "
2025-01-14 14:29:08 +01:00
else
2025-01-20 15:11:42 +01:00
TAGS = ";"
2025-01-10 13:17:44 +01:00
fi
2025-01-29 14:26:23 +01:00
echo -e " ${ NETWORK } ${ BOLD } ${ DGN } Tags: ${ BGN } $TAGS ${ CL } "
else
exit_script
2025-01-10 13:17:44 +01:00
fi
2025-06-19 18:48:35 +02:00
SSH_AUTHORIZED_KEY = " $( whiptail --backtitle "Proxmox VE Helper Scripts" --inputbox "SSH Authorized key for root (leave empty for none)" 8 58 --title "SSH Key" 3>& 1 1>& 2 2>& 3) "
2025-05-16 09:49:16 +02:00
if [ [ -z " ${ SSH_AUTHORIZED_KEY } " ] ] ; then
SSH_AUTHORIZED_KEY = ""
fi
if [ [ " $PW " = = -password* || -n " $SSH_AUTHORIZED_KEY " ] ] ; then
2025-06-19 18:48:35 +02:00
if ( whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "SSH ACCESS" --yesno "Enable Root SSH Access?" 10 58) ; then
2023-05-11 14:04:12 -04:00
SSH = "yes"
else
SSH = "no"
fi
2024-12-16 12:41:51 +01:00
echo -e " ${ ROOTSSH } ${ BOLD } ${ DGN } Root SSH Access: ${ BGN } $SSH ${ CL } "
2023-03-22 20:48:20 -04:00
else
SSH = "no"
2024-12-16 12:41:51 +01:00
echo -e " ${ ROOTSSH } ${ BOLD } ${ DGN } Root SSH Access: ${ BGN } $SSH ${ CL } "
2023-03-22 20:48:20 -04:00
fi
2025-06-02 14:16:11 +02:00
if ( whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "FUSE Support" --yesno "Enable FUSE support?\nRequired for tools like rclone, mergerfs, AppImage, etc." 10 58) ; then
2025-05-22 14:32:27 +02:00
ENABLE_FUSE = "yes"
else
ENABLE_FUSE = "no"
fi
echo -e " ${ FUSE } ${ BOLD } ${ DGN } Enable FUSE Support: ${ BGN } $ENABLE_FUSE ${ CL } "
2025-01-13 16:04:59 +01:00
2023-09-09 05:13:17 -04:00
if ( whiptail --backtitle "Proxmox VE Helper Scripts" --defaultno --title "VERBOSE MODE" --yesno "Enable Verbose Mode?" 10 58) ; then
2025-06-20 13:28:06 +02:00
VERBOSE = "yes"
2023-03-22 20:48:20 -04:00
else
2025-06-20 13:28:06 +02:00
VERBOSE = "no"
2023-03-22 20:48:20 -04:00
fi
2025-06-20 13:28:06 +02:00
echo -e " ${ SEARCH } ${ BOLD } ${ DGN } Verbose Mode: ${ BGN } $VERBOSE ${ CL } "
2023-03-22 20:48:20 -04:00
2023-09-09 05:13:17 -04:00
if ( whiptail --backtitle "Proxmox VE Helper Scripts" --title "ADVANCED SETTINGS COMPLETE" --yesno " Ready to create ${ APP } LXC? " 10 58) ; then
2024-12-16 12:41:51 +01:00
echo -e " ${ CREATING } ${ BOLD } ${ RD } Creating a ${ APP } LXC using the above advanced settings ${ CL } "
2025-05-20 11:00:58 +02:00
write_config
2023-03-22 20:48:20 -04:00
else
clear
header_info
2024-12-20 10:04:27 +01:00
echo -e " ${ ADVANCED } ${ BOLD } ${ RD } Using Advanced Settings on node $PVEHOST_NAME ${ CL } "
2023-03-22 20:48:20 -04:00
advanced_settings
fi
}
2025-02-24 11:18:38 +01:00
diagnostics_check( ) {
2025-01-29 14:26:23 +01:00
if ! [ -d "/usr/local/community-scripts" ] ; then
2025-02-24 11:18:38 +01:00
mkdir -p /usr/local/community-scripts
fi
2025-01-29 14:26:23 +01:00
2025-02-24 11:18:38 +01:00
if ! [ -f "/usr/local/community-scripts/diagnostics" ] ; then
if ( whiptail --backtitle "Proxmox VE Helper Scripts" --title "DIAGNOSTICS" --yesno "Send Diagnostics of LXC Installation?\n\n(This only transmits data without user data, just RAM, CPU, LXC name, ...)" 10 58) ; then
cat <<EOF >/usr/local/community-scripts/diagnostics
2025-01-29 14:26:23 +01:00
DIAGNOSTICS = yes
#This file is used to store the diagnostics settings for the Community-Scripts API.
#https://github.com/community-scripts/ProxmoxVE/discussions/1836
#Your diagnostics will be sent to the Community-Scripts API for troubleshooting/statistical purposes.
#You can review the data at https://community-scripts.github.io/ProxmoxVE/data
#If you do not wish to send diagnostics, please set the variable 'DIAGNOSTICS' to "no" in /usr/local/community-scripts/diagnostics, or use the menue.
#This will disable the diagnostics feature.
#To send diagnostics, set the variable 'DIAGNOSTICS' to "yes" in /usr/local/community-scripts/diagnostics, or use the menue.
#This will enable the diagnostics feature.
#The following information will be sent:
#"ct_type"
#"disk_size"
#"core_count"
#"ram_size"
#"os_type"
#"os_version"
#"disableip6"
#"nsapp"
#"method"
#"pve_version"
2025-02-03 10:05:41 +01:00
#"status"
2025-01-29 14:26:23 +01:00
#If you have any concerns, please review the source code at /misc/build.func
EOF
DIAGNOSTICS = "yes"
else
cat <<EOF >/usr/local/community-scripts/diagnostics
DIAGNOSTICS = no
#This file is used to store the diagnostics settings for the Community-Scripts API.
#https://github.com/community-scripts/ProxmoxVE/discussions/1836
#Your diagnostics will be sent to the Community-Scripts API for troubleshooting/statistical purposes.
#You can review the data at https://community-scripts.github.io/ProxmoxVE/data
#If you do not wish to send diagnostics, please set the variable 'DIAGNOSTICS' to "no" in /usr/local/community-scripts/diagnostics, or use the menue.
#This will disable the diagnostics feature.
#To send diagnostics, set the variable 'DIAGNOSTICS' to "yes" in /usr/local/community-scripts/diagnostics, or use the menue.
#This will enable the diagnostics feature.
#The following information will be sent:
#"ct_type"
#"disk_size"
#"core_count"
#"ram_size"
#"os_type"
#"os_version"
#"disableip6"
#"nsapp"
#"method"
#"pve_version"
2025-02-03 10:05:41 +01:00
#"status"
2025-01-29 14:26:23 +01:00
#If you have any concerns, please review the source code at /misc/build.func
EOF
DIAGNOSTICS = "no"
fi
else
DIAGNOSTICS = $( awk -F '=' '/^DIAGNOSTICS/ {print $2}' /usr/local/community-scripts/diagnostics)
fi
}
2023-03-22 20:48:20 -04:00
install_script( ) {
2024-02-21 18:26:12 -05:00
pve_check
2024-02-21 19:51:36 -05:00
shell_check
root_check
arch_check
ssh_check
2025-01-20 09:19:47 +01:00
maxkeys_check
2025-01-29 14:26:23 +01:00
diagnostics_check
2024-02-21 19:51:36 -05:00
2023-04-30 05:56:05 -04:00
if systemctl is-active -q ping-instances.service; then
2023-10-15 11:19:54 -04:00
systemctl -q stop ping-instances.service
2023-04-30 05:56:05 -04:00
fi
2023-03-22 20:48:20 -04:00
NEXTID = $( pvesh get /cluster/nextid)
2023-03-23 12:31:19 -04:00
timezone = $( cat /etc/timezone)
2023-03-22 20:48:20 -04:00
header_info
2024-12-16 12:41:51 +01:00
while true; do
2025-01-29 14:26:23 +01:00
2024-12-16 12:41:51 +01:00
CHOICE = $( whiptail --backtitle "Proxmox VE Helper Scripts" --title "SETTINGS" --menu "Choose an option:" \
2025-04-28 16:04:42 +02:00
18 60 6 \
2024-12-16 12:41:51 +01:00
"1" "Default Settings" \
"2" "Default Settings (with verbose)" \
"3" "Advanced Settings" \
2025-04-10 21:06:27 +02:00
"4" "Use Config File" \
"5" "Diagnostic Settings" \
"6" "Exit" --nocancel --default-item "1" 3>& 1 1>& 2 2>& 3)
2024-12-16 12:41:51 +01:00
if [ $? -ne 0 ] ; then
echo -e " ${ CROSS } ${ RD } Menu canceled. Exiting. ${ CL } "
exit 0
fi
case $CHOICE in
2025-01-29 14:26:23 +01:00
1)
header_info
echo -e " ${ DEFAULT } ${ BOLD } ${ BL } Using Default Settings on node $PVEHOST_NAME ${ CL } "
2025-06-20 13:28:06 +02:00
VERBOSE = "no"
2025-01-29 14:26:23 +01:00
METHOD = "default"
2025-06-20 13:28:06 +02:00
base_settings " $VERBOSE "
2025-01-29 14:26:23 +01:00
echo_default
break
; ;
2)
header_info
2025-04-02 10:07:25 +02:00
echo -e " ${ DEFAULT } ${ BOLD } ${ BL } Using Default Settings on node $PVEHOST_NAME ( ${ VERBOSE_CROPPED } Verbose) ${ CL } "
2025-06-20 13:28:06 +02:00
VERBOSE = "yes"
2025-01-29 14:26:23 +01:00
METHOD = "default"
2025-06-20 13:28:06 +02:00
base_settings " $VERBOSE "
2025-01-29 14:26:23 +01:00
echo_default
break
; ;
3)
header_info
echo -e " ${ ADVANCED } ${ BOLD } ${ RD } Using Advanced Settings on node $PVEHOST_NAME ${ CL } "
METHOD = "advanced"
2025-02-13 15:03:18 +01:00
base_settings
2025-01-29 14:26:23 +01:00
advanced_settings
break
; ;
2025-02-24 11:18:38 +01:00
4)
2025-04-10 21:06:27 +02:00
header_info
echo -e " ${ INFO } ${ HOLD } ${ GN } Using Config File on node $PVEHOST_NAME ${ CL } "
2025-05-20 11:00:58 +02:00
METHOD = "config_file"
2025-05-16 15:48:18 +02:00
source <( curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/config-file.func)
2025-04-10 21:06:27 +02:00
config_file
break
; ;
5)
2025-02-24 11:18:38 +01:00
if [ [ $DIAGNOSTICS = = "yes" ] ] ; then
if whiptail --backtitle "Proxmox VE Helper Scripts" --title "DIAGNOSTICS SETTINGS" --yesno " Send Diagnostics of LXC Installation?\n\nCurrent setting: ${ DIAGNOSTICS } " 10 58 \
--yes-button "No" --no-button "Back" ; then
DIAGNOSTICS = "no"
sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=no/' /usr/local/community-scripts/diagnostics
whiptail --backtitle "Proxmox VE Helper Scripts" --title "DIAGNOSTICS SETTINGS" --msgbox " Diagnostics settings changed to ${ DIAGNOSTICS } . " 8 58
fi
else
if whiptail --backtitle "Proxmox VE Helper Scripts" --title "DIAGNOSTICS SETTINGS" --yesno " Send Diagnostics of LXC Installation?\n\nCurrent setting: ${ DIAGNOSTICS } " 10 58 \
--yes-button "Yes" --no-button "Back" ; then
DIAGNOSTICS = "yes"
sed -i 's/^DIAGNOSTICS=.*/DIAGNOSTICS=yes/' /usr/local/community-scripts/diagnostics
whiptail --backtitle "Proxmox VE Helper Scripts" --title "DIAGNOSTICS SETTINGS" --msgbox " Diagnostics settings changed to ${ DIAGNOSTICS } . " 8 58
fi
fi
; ;
2025-04-10 21:06:27 +02:00
6)
2025-01-29 14:26:23 +01:00
echo -e " ${ CROSS } ${ RD } Exiting. ${ CL } "
exit 0
; ;
*)
echo -e " ${ CROSS } ${ RD } Invalid option, please try again. ${ CL } "
; ;
2024-12-16 12:41:51 +01:00
esac
done
2023-03-22 20:48:20 -04:00
}
2024-11-15 18:13:14 +01:00
check_container_resources( ) {
# Check actual RAM & Cores
2024-12-07 22:42:40 +01:00
current_ram = $( free -m | awk 'NR==2{print $2}' )
2025-01-13 16:04:59 +01:00
current_cpu = $( nproc)
2024-11-15 18:13:14 +01:00
# 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
2024-12-16 12:41:51 +01:00
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 } "
2024-11-15 18:13:14 +01:00
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 "
2025-02-10 17:29:33 +08:00
echo -ne " ${ INFO } ${ HOLD } May cause data loss! ${ INFO } Continue update with under-provisioned LXC? <yes/No> "
read -r prompt
2024-12-16 12:41:51 +01:00
# 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
2024-11-15 18:13:14 +01:00
else
echo -e ""
fi
}
check_container_storage( ) {
# Check if the /boot partition is more than 80% full
total_size = $( df /boot --output= size | tail -n 1)
local used_size = $( df /boot --output= used | tail -n 1)
2025-02-24 11:18:38 +01:00
usage = $(( 100 * used_size / total_size))
if ( ( usage > 80) ) ; then
2024-11-15 18:13:14 +01:00
# Prompt the user for confirmation to continue
2024-12-16 12:41:51 +01:00
echo -e " ${ INFO } ${ HOLD } ${ YWB } Warning: Storage is dangerously low ( ${ usage } %). ${ CL } "
2025-02-10 17:29:33 +08:00
echo -ne "Continue anyway? <y/N> "
read -r prompt
2024-11-15 18:13:14 +01:00
# Check if the input is 'y' or 'yes', otherwise exit with status 1
if [ [ ! ${ prompt ,, } = ~ ^( y| yes) $ ] ] ; then
2024-12-16 12:41:51 +01:00
echo -e " ${ CROSS } ${ HOLD } ${ YWB } Exiting based on user input. ${ CL } "
2024-11-15 18:13:14 +01:00
exit 1
fi
fi
}
2023-03-22 20:48:20 -04:00
start( ) {
2025-06-20 13:32:57 +02:00
source <( curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/tools.func)
if command -v pveversion >/dev/null 2>& 1; then
2023-03-22 20:48:20 -04:00
install_script
2025-06-20 13:28:06 +02:00
else
2025-02-24 11:18:38 +01:00
CHOICE = $( whiptail --backtitle "Proxmox VE Helper Scripts" --title " ${ APP } LXC Update/Setting " --menu \
" Support/Update functions for ${ APP } LXC. Choose an option: " \
12 60 3 \
"1" "YES (Silent Mode)" \
"2" "YES (Verbose Mode)" \
"3" "NO (Cancel Update)" --nocancel --default-item "1" 3>& 1 1>& 2 2>& 3)
case " $CHOICE " in
1)
2025-06-20 13:28:06 +02:00
VERBOSE = "no"
2025-02-24 11:18:38 +01:00
set_std_mode
; ;
2)
2025-06-20 13:28:06 +02:00
VERBOSE = "yes"
2025-02-24 11:18:38 +01:00
set_std_mode
; ;
3)
2023-03-22 20:48:20 -04:00
clear
2024-12-16 12:41:51 +01:00
exit_script
2023-03-22 20:48:20 -04:00
exit
2025-02-24 11:18:38 +01:00
; ;
esac
2023-03-22 20:48:20 -04:00
update_script
fi
}
2023-05-15 18:55:53 -04:00
# This function collects user settings and integrates all the collected information.
2023-03-22 20:48:20 -04:00
build_container( ) {
2025-06-20 13:28:06 +02:00
# if [ "$VERBOSE" == "yes" ]; then set -x; fi
2023-03-23 07:33:03 -04:00
2023-12-06 20:13:12 -05:00
if [ " $CT_TYPE " = = "1" ] ; then
FEATURES = "keyctl=1,nesting=1"
else
FEATURES = "nesting=1"
2023-03-23 07:33:03 -04:00
fi
2025-05-22 14:32:27 +02:00
if [ " $ENABLE_FUSE " = = "yes" ] ; then
FEATURES = " $FEATURES ,fuse=1 "
fi
2025-01-29 14:26:23 +01:00
if [ [ $DIAGNOSTICS = = "yes" ] ] ; then
post_to_api
fi
2023-12-06 20:13:12 -05:00
2023-03-22 20:48:20 -04:00
TEMP_DIR = $( mktemp -d)
2025-04-09 15:30:54 +02:00
pushd " $TEMP_DIR " >/dev/null
2023-03-23 12:51:53 -04:00
if [ " $var_os " = = "alpine" ] ; then
2025-04-01 10:25:46 +02:00
export FUNCTIONS_FILE_PATH = " $( curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/alpine-install.func) "
2023-03-23 12:51:53 -04:00
else
2025-04-01 10:25:46 +02:00
export FUNCTIONS_FILE_PATH = " $( curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/install.func) "
2024-01-12 12:09:32 -05:00
fi
2025-06-10 09:24:20 +02:00
export DIAGNOSTICS = " $DIAGNOSTICS "
2025-02-04 13:23:20 +01:00
export RANDOM_UUID = " $RANDOM_UUID "
2024-01-12 15:00:42 -05:00
export CACHER = " $APT_CACHER "
export CACHER_IP = " $APT_CACHER_IP "
2023-03-22 20:48:20 -04:00
export tz = " $timezone "
export DISABLEIPV6 = " $DISABLEIP6 "
export APPLICATION = " $APP "
2023-08-17 09:26:44 -04:00
export app = " $NSAPP "
2023-05-15 05:53:35 -04:00
export PASSWORD = " $PW "
2025-06-20 13:28:06 +02:00
export VERBOSE = " $VERBOSE "
2023-03-22 20:48:20 -04:00
export SSH_ROOT = " ${ SSH } "
2025-01-15 15:01:24 +01:00
export SSH_AUTHORIZED_KEY
2023-03-22 20:48:20 -04:00
export CTID = " $CT_ID "
2023-05-14 11:43:17 -04:00
export CTTYPE = " $CT_TYPE "
2025-05-22 14:32:27 +02:00
export ENABLE_FUSE = " $ENABLE_FUSE "
export ENABLE_TUN = " $ENABLE_TUN "
2023-03-22 20:48:20 -04:00
export PCT_OSTYPE = " $var_os "
export PCT_OSVERSION = " $var_version "
export PCT_DISK_SIZE = " $DISK_SIZE "
export PCT_OPTIONS = "
-features $FEATURES
-hostname $HN
2024-12-16 12:41:51 +01:00
-tags $TAGS
2023-03-22 20:48:20 -04:00
$SD
$NS
-net0 name = eth0,bridge= $BRG $MAC ,ip= $NET $GATE $VLAN $MTU
-onboot 1
-cores $CORE_COUNT
-memory $RAM_SIZE
-unprivileged $CT_TYPE
$PW
"
2023-05-15 18:55:53 -04:00
# This executes create_lxc.sh and creates the container and .conf file
2025-06-19 18:50:23 +02:00
bash -c " $( curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/create_lxc.sh) " $?
2023-03-23 04:22:01 -04:00
2023-03-22 20:48:20 -04:00
LXC_CONFIG = /etc/pve/lxc/${ CTID } .conf
if [ " $CT_TYPE " = = "0" ] ; then
2025-04-09 15:30:54 +02:00
cat <<EOF >>" $LXC_CONFIG "
2023-07-11 17:38:19 -04:00
# USB passthrough
2023-03-22 20:48:20 -04:00
lxc.cgroup2.devices.allow: a
lxc.cap.drop:
lxc.cgroup2.devices.allow: c 188:* rwm
lxc.cgroup2.devices.allow: c 189:* rwm
lxc.mount.entry: /dev/serial/by-id dev/serial/by-id none bind,optional,create= dir
lxc.mount.entry: /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create= file
lxc.mount.entry: /dev/ttyUSB1 dev/ttyUSB1 none bind,optional,create= file
lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create= file
lxc.mount.entry: /dev/ttyACM1 dev/ttyACM1 none bind,optional,create= file
EOF
2023-03-23 00:09:04 -04:00
fi
if [ " $CT_TYPE " = = "0" ] ; then
2025-06-02 18:14:47 +02:00
if [ [ " $APP " = = "Channels" || " $APP " = = "Emby" || " $APP " = = "ErsatzTV" || " $APP " = = "Frigate" || " $APP " = = "Jellyfin" || " $APP " = = "Plex" || " $APP " = = "immich" || " $APP " = = "Tdarr" || " $APP " = = "Open WebUI" || " $APP " = = "Unmanic" || " $APP " = = "Ollama" || " $APP " = = "FileFlows" ] ] ; then
2025-04-09 15:30:54 +02:00
cat <<EOF >>" $LXC_CONFIG "
2023-07-11 17:38:19 -04:00
# VAAPI hardware transcoding
2023-03-23 00:09:04 -04:00
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.cgroup2.devices.allow: c 29:0 rwm
lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create= file
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create= dir
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create= file
2023-03-22 20:14:35 -06:00
EOF
2023-03-23 00:09:04 -04:00
fi
2024-04-25 14:36:47 -04:00
else
2025-06-02 18:14:47 +02:00
if [ [ " $APP " = = "Channels" || " $APP " = = "Emby" || " $APP " = = "ErsatzTV" || " $APP " = = "Frigate" || " $APP " = = "Jellyfin" || " $APP " = = "Plex" || " $APP " = = "immich" || " $APP " = = "Tdarr" || " $APP " = = "Open WebUI" || " $APP " = = "Unmanic" || " $APP " = = "Ollama" || " $APP " = = "FileFlows" ] ] ; then
2024-05-01 14:38:15 -04:00
if [ [ -e "/dev/dri/renderD128" ] ] ; then
if [ [ -e "/dev/dri/card0" ] ] ; then
2025-04-09 15:30:54 +02:00
cat <<EOF >>" $LXC_CONFIG "
2024-04-25 14:36:47 -04:00
# VAAPI hardware transcoding
dev0: /dev/dri/card0,gid= 44
dev1: /dev/dri/renderD128,gid= 104
EOF
2024-05-01 14:38:15 -04:00
else
2025-04-09 15:30:54 +02:00
cat <<EOF >>" $LXC_CONFIG "
2024-04-25 14:36:47 -04:00
# VAAPI hardware transcoding
dev0: /dev/dri/card1,gid= 44
dev1: /dev/dri/renderD128,gid= 104
EOF
2024-05-01 14:38:15 -04:00
fi
2024-04-25 14:36:47 -04:00
fi
fi
2023-03-22 20:48:20 -04:00
fi
2023-03-23 00:09:04 -04:00
2025-05-22 14:32:27 +02:00
if [ " $ENABLE_TUN " = = "yes" ] ; then
cat <<EOF >>" $LXC_CONFIG "
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create= file
EOF
fi
2025-06-22 20:06:25 +02:00
}
2025-06-22 20:16:16 +02:00
# This starts the container and executes <app>-install.sh
2025-06-22 19:54:55 +02:00
msg_info "Starting LXC Container"
pct start " $CTID "
msg_ok "Started LXC Container"
msg_info "Customizing LXC Container"
2025-06-22 20:16:16 +02:00
: " ${ tz : =Etc/UTC } "
2025-06-22 19:54:55 +02:00
if [ " $var_os " = = "alpine" ] ; then
sleep 3
pct exec " $CTID " -- /bin/sh -c ' cat <<EOF >/etc/apk/repositories
2024-06-30 09:35:33 -04:00
http://dl-cdn.alpinelinux.org/alpine/latest-stable/main
http://dl-cdn.alpinelinux.org/alpine/latest-stable/community
2024-01-16 22:24:33 -05:00
EOF'
2025-06-22 19:54:55 +02:00
pct exec " $CTID " -- ash -c "apk add bash newt curl openssh nano mc ncurses >/dev/null"
else
sleep 3
pct exec " $CTID " -- bash -c " sed -i '/ $LANG / s/^# //' /etc/locale.gen "
pct exec " $CTID " -- bash -c " locale_line=\$(grep -v '^#' /etc/locale.gen | grep -E '^[a-zA-Z]' | awk '{print \$1}' | head -n 1) && \
2025-06-20 13:28:06 +02:00
echo LANG = \$ locale_line >/etc/default/locale && \
locale-gen >/dev/null && \
export LANG = \$ locale_line"
2025-06-22 19:54:55 +02:00
if pct exec " $CTID " -- test -e " /usr/share/zoneinfo/ $tz " ; then
2025-06-20 13:28:06 +02:00
pct exec " $CTID " -- bash -c " echo $tz >/etc/timezone && ln -sf /usr/share/zoneinfo/ $tz /etc/localtime "
2025-06-22 19:54:55 +02:00
else
msg_info " Skipping timezone setup – zone ' $tz ' not found in container "
2025-06-20 13:28:06 +02:00
fi
2025-06-22 19:54:55 +02:00
pct exec " $CTID " -- bash -c "apt-get update >/dev/null && apt-get install -y sudo curl mc gnupg2 >/dev/null"
fi
msg_ok "Customized LXC Container"
lxc-attach -n " $CTID " -- bash -c " $( curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/install/" $var_install " .sh) " $?
2023-03-22 20:48:20 -04:00
2023-05-15 18:55:53 -04:00
# This function sets the description of the container.
2023-03-22 20:48:20 -04:00
description( ) {
IP = $( pct exec " $CTID " ip a s dev eth0 | awk '/inet / {print $2}' | cut -d/ -f1)
2023-11-27 09:01:41 -05:00
2024-11-12 16:54:39 +01:00
# Generate LXC Description
2025-01-29 14:26:23 +01:00
DESCRIPTION = $(
cat <<EOF
2024-11-12 16:54:39 +01:00
<div align = 'center' >
<a href = 'https://Helper-Scripts.com' target = '_blank' rel = 'noopener noreferrer' >
<img src = 'https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/misc/images/logo-81x112.png' alt = 'Logo' style = 'width:81px;height:112px;' />
</a>
<h2 style = 'font-size: 24px; margin: 20px 0;' >${ APP } LXC</h2>
<p style = 'margin: 16px 0;' >
<a href = 'https://ko-fi.com/community_scripts' target = '_blank' rel = 'noopener noreferrer' >
<img src = 'https://img.shields.io/badge/☕-Buy us a coffee-blue' alt = 'spend Coffee' />
</a>
</p>
2025-05-13 18:44:06 +02:00
2024-11-12 16:54:39 +01:00
<span style = 'margin: 0 10px;' >
<i class = "fa fa-github fa-fw" style = "color: #f5f5f5;" ></i>
<a href = 'https://github.com/community-scripts/ProxmoxVE' target = '_blank' rel = 'noopener noreferrer' style = 'text-decoration: none; color: #00617f;' >GitHub</a>
</span>
<span style = 'margin: 0 10px;' >
<i class = "fa fa-comments fa-fw" style = "color: #f5f5f5;" ></i>
<a href = 'https://github.com/community-scripts/ProxmoxVE/discussions' target = '_blank' rel = 'noopener noreferrer' style = 'text-decoration: none; color: #00617f;' >Discussions</a>
</span>
<span style = 'margin: 0 10px;' >
<i class = "fa fa-exclamation-circle fa-fw" style = "color: #f5f5f5;" ></i>
<a href = 'https://github.com/community-scripts/ProxmoxVE/issues' target = '_blank' rel = 'noopener noreferrer' style = 'text-decoration: none; color: #00617f;' >Issues</a>
</span>
</div>
EOF
2025-01-29 14:26:23 +01:00
)
2024-11-12 16:54:39 +01:00
# Set Description in LXC
pct set " $CTID " -description " $DESCRIPTION "
2023-11-27 09:01:41 -05:00
2023-04-30 05:56:05 -04:00
if [ [ -f /etc/systemd/system/ping-instances.service ] ] ; then
2023-05-06 04:24:18 -04:00
systemctl start ping-instances.service
2023-04-30 05:56:05 -04:00
fi
2025-02-24 11:18:38 +01:00
2025-02-04 13:23:20 +01:00
post_update_to_api "done" "none"
2024-01-13 21:11:58 -05:00
}
2025-01-30 18:19:05 +01:00
2025-05-06 09:50:11 +02:00
api_exit_script( ) {
2025-02-24 11:18:38 +01:00
exit_code = $? # Capture the exit status of the last executed command
2025-02-05 16:29:19 +01:00
#200 exit codes indicate error in create_lxc.sh
#100 exit codes indicate error in install.func
2025-03-27 11:51:40 +01:00
if [ $exit_code -ne 0 ] ; then
2025-02-05 16:29:19 +01:00
case $exit_code in
2025-03-27 11:51:40 +01:00
100) post_update_to_api "failed" "100: Unexpected error in create_lxc.sh" ; ;
101) post_update_to_api "failed" "101: No network connection detected in create_lxc.sh" ; ;
200) post_update_to_api "failed" "200: LXC creation failed in create_lxc.sh" ; ;
201) post_update_to_api "failed" "201: Invalid Storage class in create_lxc.sh" ; ;
202) post_update_to_api "failed" "202: User aborted menu in create_lxc.sh" ; ;
203) post_update_to_api "failed" "203: CTID not set in create_lxc.sh" ; ;
204) post_update_to_api "failed" "204: PCT_OSTYPE not set in create_lxc.sh" ; ;
205) post_update_to_api "failed" "205: CTID cannot be less than 100 in create_lxc.sh" ; ;
206) post_update_to_api "failed" "206: CTID already in use in create_lxc.sh" ; ;
207) post_update_to_api "failed" "207: Template not found in create_lxc.sh" ; ;
208) post_update_to_api "failed" "208: Error downloading template in create_lxc.sh" ; ;
209) post_update_to_api "failed" "209: Container creation failed, but template is intact in create_lxc.sh" ; ;
*) post_update_to_api "failed" " Unknown error, exit code: $exit_code in create_lxc.sh " ; ;
2025-02-05 16:29:19 +01:00
esac
2025-02-24 11:18:38 +01:00
fi
2025-02-05 16:29:19 +01:00
}
2025-05-06 09:50:11 +02:00
trap 'api_exit_script' EXIT
2025-02-05 16:29:19 +01:00
trap 'post_update_to_api "failed" "$BASH_COMMAND"' ERR
2025-02-24 11:18:38 +01:00
trap 'post_update_to_api "failed" "INTERRUPTED"' SIGINT
2025-02-05 16:29:19 +01:00
trap 'post_update_to_api "failed" "TERMINATED"' SIGTERM