mirror of
https://github.com/tteck/Proxmox.git
synced 2024-11-25 09:44:08 +01:00
ffd2fc3b86
Check to see if the apt-cacher-ng proxy is available before attempting to use it. If it's not available, the system will directly communicate with the apt repositories.
202 lines
6.5 KiB
Plaintext
202 lines
6.5 KiB
Plaintext
# This function sets color variables for formatting output in the terminal
|
|
color() {
|
|
YW=$(echo "\033[33m")
|
|
BL=$(echo "\033[36m")
|
|
RD=$(echo "\033[01;31m")
|
|
BGN=$(echo "\033[4;92m")
|
|
GN=$(echo "\033[1;92m")
|
|
DGN=$(echo "\033[32m")
|
|
CL=$(echo "\033[m")
|
|
RETRY_NUM=10
|
|
RETRY_EVERY=3
|
|
CM="${GN}✓${CL}"
|
|
CROSS="${RD}✗${CL}"
|
|
BFR="\\r\\033[K"
|
|
HOLD="-"
|
|
}
|
|
|
|
# This function enables IPv6 if it's not disabled and sets verbose mode if the global variable is set to "yes"
|
|
verb_ip6() {
|
|
if [ "$VERBOSE" = "yes" ]; then
|
|
STD=""
|
|
else STD="silent"; fi
|
|
silent() { "$@" >/dev/null 2>&1; }
|
|
if [ "$DISABLEIPV6" == "yes" ]; then
|
|
echo "net.ipv6.conf.all.disable_ipv6 = 1" >>/etc/sysctl.conf
|
|
$STD sysctl -p
|
|
fi
|
|
}
|
|
|
|
# This function sets error handling options and defines the error_handler function to handle errors
|
|
catch_errors() {
|
|
set -Eeuo pipefail
|
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
|
}
|
|
|
|
# This function handles errors
|
|
error_handler() {
|
|
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
|
|
printf "\e[?25h"
|
|
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}"
|
|
echo -e "\n$error_message"
|
|
if [[ "$line_number" -eq 23 ]]; then
|
|
echo -e "The silent function has suppressed the error, run the script with verbose mode enabled, which will provide more detailed output.\n"
|
|
fi
|
|
}
|
|
|
|
# This function displays a spinner.
|
|
spinner() {
|
|
printf "\e[?25l"
|
|
spinner="/-\\|/-\\|"
|
|
spin_i=0
|
|
while true; do
|
|
printf "\b%s" "${spinner:spin_i++%${#spinner}:1}"
|
|
sleep 0.1
|
|
done
|
|
}
|
|
|
|
# This function displays an informational message with a yellow color.
|
|
msg_info() {
|
|
local msg="$1"
|
|
echo -ne " ${HOLD} ${YW}${msg} "
|
|
spinner &
|
|
SPINNER_PID=$!
|
|
}
|
|
|
|
|
|
# This function displays a success message with a green color.
|
|
msg_ok() {
|
|
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
|
|
printf "\e[?25h"
|
|
local msg="$1"
|
|
echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
|
|
}
|
|
|
|
# This function displays a error message with a red color.
|
|
msg_error() {
|
|
if [ -n "$SPINNER_PID" ] && ps -p $SPINNER_PID > /dev/null; then kill $SPINNER_PID > /dev/null; fi
|
|
printf "\e[?25h"
|
|
local msg="$1"
|
|
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
|
|
setting_up_container() {
|
|
msg_info "Setting up Container OS"
|
|
sed -i "/$LANG/ s/\(^# \)//" /etc/locale.gen
|
|
locale-gen >/dev/null
|
|
echo $tz >/etc/timezone
|
|
ln -sf /usr/share/zoneinfo/$tz /etc/localtime
|
|
for ((i = RETRY_NUM; i > 0; i--)); do
|
|
if [ "$(hostname -I)" != "" ]; then
|
|
break
|
|
fi
|
|
echo 1>&2 -en "${CROSS}${RD} No Network! "
|
|
sleep $RETRY_EVERY
|
|
done
|
|
if [ "$(hostname -I)" = "" ]; then
|
|
echo 1>&2 -e "\n${CROSS}${RD} No Network After $RETRY_NUM Tries${CL}"
|
|
echo -e " 🖧 Check Network Settings"
|
|
exit 1
|
|
fi
|
|
rm -rf /usr/lib/python3.*/EXTERNALLY-MANAGED
|
|
systemctl disable -q --now systemd-networkd-wait-online.service
|
|
msg_ok "Set up Container OS"
|
|
msg_ok "Network Connected: ${BL}$(hostname -I)"
|
|
}
|
|
|
|
# This function checks the network connection by pinging a known IP address and prompts the user to continue if the internet is not connected
|
|
network_check() {
|
|
set +e
|
|
trap - ERR
|
|
# Check if IPv4 is being used
|
|
if ip -o -4 addr show | grep -q "scope global"; then
|
|
if ping -c 1 -W 1 1.1.1.1 &>/dev/null; then
|
|
msg_ok "IPv4 Internet Connected";
|
|
else
|
|
msg_error "IPv4 Internet Not Connected";
|
|
read -r -p "Would you like to continue anyway? <y/N> " prompt
|
|
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
|
echo -e " ⚠️ ${RD}Expect Issues Without Internet${CL}"
|
|
else
|
|
echo -e " 🖧 Check Network Settings"
|
|
exit 1
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Check if IPv6 is being used
|
|
if ip -o -6 addr show | grep -q "scope global"; then
|
|
if ping6 -c 1 -W 1 2606:4700:4700::1111 &>/dev/null; then
|
|
msg_ok "IPv6 Internet Connected";
|
|
else
|
|
msg_error "IPv6 Internet Not Connected";
|
|
read -r -p "Would you like to continue anyway? <y/N> " prompt
|
|
if [[ "${prompt,,}" =~ ^(y|yes)$ ]]; then
|
|
echo -e " ⚠️ ${RD}Expect Issues Without Internet${CL}"
|
|
else
|
|
echo -e " 🖧 Check Network Settings"
|
|
exit 1
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
RESOLVEDIP=$(getent hosts github.com | awk '{ print $1 }')
|
|
if [[ -z "$RESOLVEDIP" ]]; then msg_error "DNS Lookup Failure"; else msg_ok "DNS Resolved github.com to ${BL}$RESOLVEDIP${CL}"; fi
|
|
set -e
|
|
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
|
|
}
|
|
|
|
# This function updates the Container OS by running apt-get update and upgrade
|
|
update_os() {
|
|
msg_info "Updating Container OS"
|
|
if [[ "$CACHER" == "yes" ]]; then
|
|
echo "Acquire::http::Proxy-Auto-Detect \"/usr/local/bin/apt-proxy-detect.sh\";" >/etc/apt/apt.conf.d/00aptproxy
|
|
cat <<EOF >/usr/local/bin/apt-proxy-detect.sh
|
|
#!/bin/bash
|
|
if nc -w1 -z "${CACHER_IP}" 3142; then
|
|
echo -n "http://${CACHER_IP}:3142"
|
|
else
|
|
echo -n "DIRECT"
|
|
fi
|
|
EOF
|
|
chmod +x /usr/local/bin/apt-proxy-detect.sh
|
|
fi
|
|
$STD apt-get update
|
|
$STD apt-get -o Dpkg::Options::="--force-confold" -y dist-upgrade
|
|
msg_ok "Updated Container OS"
|
|
}
|
|
|
|
# This function modifies the message of the day (motd) and SSH settings
|
|
motd_ssh() {
|
|
echo "export TERM='xterm-256color'" >>/root/.bashrc
|
|
echo -e "$APPLICATION LXC provided by https://tteck.github.io/Proxmox/\n" >/etc/motd
|
|
chmod -x /etc/update-motd.d/*
|
|
if [[ "${SSH_ROOT}" == "yes" ]]; then
|
|
sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config
|
|
systemctl restart sshd
|
|
fi
|
|
}
|
|
|
|
# This function customizes the container by modifying the getty service and enabling auto-login for the root user
|
|
customize() {
|
|
if [[ "$PASSWORD" == "" ]]; then
|
|
msg_info "Customizing Container"
|
|
GETTY_OVERRIDE="/etc/systemd/system/container-getty@1.service.d/override.conf"
|
|
mkdir -p $(dirname $GETTY_OVERRIDE)
|
|
cat <<EOF >$GETTY_OVERRIDE
|
|
[Service]
|
|
ExecStart=
|
|
ExecStart=-/sbin/agetty --autologin root --noclear --keep-baud tty%I 115200,38400,9600 \$TERM
|
|
EOF
|
|
systemctl daemon-reload
|
|
systemctl restart $(basename $(dirname $GETTY_OVERRIDE) | sed 's/\.d//')
|
|
msg_ok "Customized Container"
|
|
fi
|
|
echo "bash -c \"\$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/ct/${app}.sh)\"" >/usr/bin/update
|
|
chmod +x /usr/bin/update
|
|
}
|