From 4838a96dfbdc7b1c06f44afa095860e97bf9e26c Mon Sep 17 00:00:00 2001 From: tteckster Date: Sun, 17 Apr 2022 15:25:05 -0400 Subject: [PATCH 01/13] Update technitiumdns.sh --- ct/technitiumdns.sh | 430 ++++++++++++++++++++++++-------------------- 1 file changed, 233 insertions(+), 197 deletions(-) diff --git a/ct/technitiumdns.sh b/ct/technitiumdns.sh index 2d960480..9bab2b03 100644 --- a/ct/technitiumdns.sh +++ b/ct/technitiumdns.sh @@ -1,12 +1,21 @@ -#!/usr/bin/env bash +#!/usr/bin/env bash -ex +set -euo pipefail +shopt -s inherit_errexit nullglob + +NEXTID=$(pvesh get /cluster/nextid) +INTEGER='^[0-9]+$' YW=`echo "\033[33m"` BL=`echo "\033[36m"` RD=`echo "\033[01;31m"` -CM='\xE2\x9C\x94\033' +BGN=`echo "\033[4;92m"` GN=`echo "\033[1;92m"` +DGN=`echo "\033[32m"` CL=`echo "\033[m"` -APP="Technitium DNS" -HN=$(echo ${APP,,} | tr -d ' ') +BFR="\\r\\033[K" +HOLD="-" +CM="${GN}✓${CL}" +APP="Debian" +NSAPP=$(echo ${APP,,} | tr -d ' ') while true; do read -p "This will create a New ${APP} LXC. Proceed(y/n)?" yn case $yn in @@ -18,10 +27,9 @@ done clear function header_info { echo -e "${RD} - _______ _ _ _ _ |__ __| | | (_) | (_) - | | ___ ___| |__ _ __ _| |_ _ _ _ _ __ ___ + | | ___v3___| |__ _ __ _| |_ _ _ _ _ __ ___ | |/ _ \/ __| _ \| _ \| | __| | | | | _ _ \ | | __/ (__| | | | | | | | |_| | |_| | | | | | | |_|\___|\___|_| |_|_| |_|_|\__|_|\__,_|_| |_| |_| @@ -29,174 +37,221 @@ ${CL}" } header_info -show_menu(){ - printf " ${YW} 1)${YW} Privileged ${CL}\n" - printf " ${YW} 2)${GN} Unprivileged ${CL}\n" - printf "Please choose a Install Method and hit enter or ${RD}x${CL} to exit." - read opt +function msg_info() { + local msg="$1" + echo -ne " ${HOLD} ${YW}${msg}..." } -option_picked(){ - message1=${@:-"${CL}Error: No message passed"} - printf " ${YW}${message1}${CL}\n" -} -show_menu -while [ "$opt" != " " ] - do - case $opt in - 1) clear; - header_info; - option_picked "Using Privileged Install"; - IM=0 - break; - ;; - 2) clear; - header_info; - option_picked "Using Unprivileged Install"; - IM=1 - break; - ;; - - x)exit; - ;; - \n)exit; - ;; - *)clear; - option_picked "Please choose a Install Method from the menu"; - show_menu; - ;; - esac - done -show_menu2(){ - printf " ${YW} 1)${GN} Use Automatic Login ${CL}\n" - printf " ${YW} 2)${GN} Use Password (changeme) ${CL}\n" - - printf "Please choose a Password Type and hit enter or ${RD}x${CL} to exit." - read opt +function msg_ok() { + local msg="$1" + echo -e "${BFR} ${CM} ${GN}${msg}${CL}" } -option_picked(){ - message2=${@:-"${CL}Error: No message passed"} - printf " ${YW}${message1}${CL}\n" - printf " ${YW}${message2}${CL}\n" -} -show_menu2 -while [ "$opt" != " " ] - do - case $opt in - 1) clear; - header_info; - option_picked "Using Automatic Login"; - PW=" " - break; - ;; - 2) clear; - header_info; - option_picked "Using Password (changeme)"; - PW="-password changeme" - break; - ;; +function PVE_CHECK() { + PVE=$(pveversion | grep "pve-manager/7" | wc -l) - x)exit; - ;; - \n)exit; - ;; - *)clear; - option_picked "Please choose a Password Type from the menu"; - show_menu2; - ;; - esac - done -show_menu3(){ - printf " ${YW} 1)${GN} Automatic DHCP ${CL}\n" - printf " ${YW} 2)${GN} Manual DHCP ${CL}\n" - - printf "Please choose a DHCP Type and hit enter or ${RD}x${CL} to exit." - read opt -} - -option_picked(){ - message3=${@:-"${CL}Error: No message passed"} - printf " ${YW}${message1}${CL}\n" - printf " ${YW}${message2}${CL}\n" - printf " ${YW}${message3}${CL}\n" -} -show_menu3 -while [ "$opt" != " " ] - do - case $opt in - 1) clear; - header_info; - option_picked "Using Automatic DHCP"; - DHCP=" " - break; - ;; - 2) clear; - header_info; - option_picked "Using Manual DHCP"; - DHCP="1" - break; - ;; - - x)exit; - ;; - \n)exit; - ;; - *)clear; - option_picked "Please choose a DHCP Type from the menu"; - show_menu3; - ;; - esac - done - -set -o errexit -set -o errtrace -set -o nounset -set -o pipefail -shopt -s expand_aliases -alias die='EXIT=$? LINE=$LINENO error_exit' -trap die ERR -trap cleanup EXIT - -function error_exit() { - trap - ERR - local DEFAULT='Unknown failure occured.' - local REASON="\e[97m${1:-$DEFAULT}\e[39m" - local FLAG="\e[91m[ERROR] \e[93m$EXIT@$LINE" - msg "$FLAG $REASON" - [ ! -z ${CTID-} ] && cleanup_ctid - exit $EXIT -} -function warn() { - local REASON="\e[97m$1\e[39m" - local FLAG="\e[93m[WARNING]\e[39m" - msg "$FLAG $REASON" -} -function info() { - local REASON="$1" - local FLAG="\e[36m[INFO]\e[39m" - msg "$FLAG $REASON" -} -function msg() { - local TEXT="$1" - echo -e "$TEXT" -} -function cleanup_ctid() { - if $(pct status $CTID &>/dev/null); then - if [ "$(pct status $CTID | awk '{print $2}')" == "running" ]; then - pct stop $CTID + if [[ $PVE != 1 ]]; then + echo -e "${RD}This script requires Proxmox Virtual Environment 7.0 or greater${CL}" + echo -e "Exiting..." + sleep 2 + exit fi - pct destroy $CTID - elif [ "$(pvesm list $STORAGE --vmid $CTID)" != "" ]; then - pvesm free $ROOTFS - fi } -function cleanup() { - popd >/dev/null - rm -rf $TEMP_DIR + +function default_settings() { + clear + header_info + echo -e "${BL}Using Default Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}" + CT_TYPE="1" + echo -e "${DGN}Using CT Password ${BGN}Automatic Login${CL}" + PW=" " + echo -e "${DGN}Using ID ${BGN}$NEXTID${CL}" + CT_ID=$NEXTID + echo -e "${DGN}Using CT Name ${BGN}$NSAPP${CL}" + HN=$NSAPP + echo -e "${DGN}Using Disk Size ${BGN}2GB${CL}" + DISK_SIZE="2" + echo -e "${DGN}Using ${BGN}1vCPU${CL}" + CORE_COUNT="1" + echo -e "${DGN}Using ${BGN}512MiB${CL}${GN} RAM${CL}" + RAM_SIZE="512" + echo -e "${DGN}Using IP Address ${BGN}DHCP${CL}" + NET=dhcp + echo -e "${DGN}Using VLAN Tag ${BGN}NONE${CL}" + VLAN=" " } - if [ "$IM" == "1" ]; then + +function advanced_settings() { + clear + header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${YW}Type Privileged, or Press [ENTER] for Default: Unprivileged (${RD}NO DEVICE PASSTHROUGH${CL}${YW})" + read CT_TYPE1 + if [ -z $CT_TYPE1 ]; then CT_TYPE1="Unprivileged" CT_TYPE="1"; + echo -en "${DGN}Set CT Type ${BL}$CT_TYPE1${CL}" + else + CT_TYPE1="Privileged" + CT_TYPE="0" + echo -en "${DGN}Set CT Type ${BL}Privileged${CL}" + fi; +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${YW}Set Password, or Press [ENTER] for Default: Automatic Login " + read PW1 + if [ -z $PW1 ]; then PW1="Automatic Login" PW=" "; + echo -en "${DGN}Set CT ${BL}$PW1${CL}" + else + PW="-password $PW1" + echo -en "${DGN}Set CT Password ${BL}$PW1${CL}" + fi; +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${YW}Enter the CT ID, or Press [ENTER] to automatically generate (${NEXTID}) " + read CT_ID + if [ -z $CT_ID ]; then CT_ID=$NEXTID; fi; + echo -en "${DGN}Set CT ID To ${BL}$CT_ID${CL}" +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${YW}Enter CT Name (no-spaces), or Press [ENTER] for Default: $NSAPP " + read CT_NAME + if [ -z $CT_NAME ]; then + HN=$NSAPP + else + HN=$(echo ${CT_NAME,,} | tr -d ' ') + fi + echo -en "${DGN}Set CT Name To ${BL}$HN${CL}" +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${YW}Enter a Disk Size, or Press [ENTER] for Default: 2Gb " + read DISK_SIZE + if [ -z $DISK_SIZE ]; then DISK_SIZE="2"; fi; + if ! [[ $DISK_SIZE =~ $INTEGER ]] ; then echo "ERROR! DISK SIZE MUST HAVE INTEGER NUMBER!"; exit; fi; + echo -en "${DGN}Set Disk Size To ${BL}$DISK_SIZE${CL}" +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${YW}Allocate CPU cores, or Press [ENTER] for Default: 1 " + read CORE_COUNT + if [ -z $CORE_COUNT ]; then CORE_COUNT="1"; fi; + echo -en "${DGN}Set Cores To ${BL}$CORE_COUNT${CL}" +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 512 " + read RAM_SIZE + if [ -z $RAM_SIZE ]; then RAM_SIZE="512"; fi; + echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}" +echo -e " ${CM}${CL} \n" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${YW}Enter a IP Address, or Press [ENTER] for Default: DHCP " + read NET + if [ -z $NET ]; then NET="dhcp"; fi; + echo -en "${DGN}Set IP Address To ${BL}$NET${CL}" +echo -e " ${CM}${CL} \n" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" + echo -e "${YW}Enter a VLAN Tag, or Press [ENTER] for Default: NONE " + read VLAN1 + if [ -z $VLAN1 ]; then VLAN1="NONE" VLAN=" "; + echo -en "${DGN}Set VLAN Tag To ${BL}$VLAN1${CL}" + else + VLAN="-tag $VLAN1" + echo -en "${DGN}Set VLAN Tag To ${BL}$VLAN1${CL}" + fi; +echo -e " ${CM}${CL} \n" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" + echo -e "${DGN}Using VLAN Tag ${BGN}$VLAN1${CL}" + +read -p "Are these settings correct(y/n)? " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Yy]$ ]] +then + advanced_settings +fi +} + +function start_script() { + echo -e "${YW}Type Advanced, or Press [ENTER] for Default Settings " + read SETTINGS + if [ -z $SETTINGS ]; then default_settings; + else + advanced_settings + fi; +} + +start_script + +if [ "$CT_TYPE" == "1" ]; then FEATURES="nesting=1,keyctl=1" else FEATURES="nesting=1" @@ -205,19 +260,20 @@ function cleanup() { TEMP_DIR=$(mktemp -d) pushd $TEMP_DIR >/dev/null -export CTID=$(pvesh get /cluster/nextid) +export CTID=$CT_ID export PCT_OSTYPE=debian export PCT_OSVERSION=11 -export PCT_DISK_SIZE=2 +export PCT_DISK_SIZE=$DISK_SIZE export PCT_OPTIONS=" -features $FEATURES -hostname $HN - -net0 name=eth0,bridge=vmbr0,ip=dhcp + -net0 name=eth0,bridge=vmbr0,ip=$NET + $VLAN -onboot 1 - -cores 1 - -memory 512 - -unprivileged ${IM} - ${PW} + -cores $CORE_COUNT + -memory $RAM_SIZE + -unprivileged $CT_TYPE + $PW " bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit @@ -225,35 +281,15 @@ STORAGE_TYPE=$(pvesm status -storage $(pct config $CTID | grep rootfs | awk -F " if [ "$STORAGE_TYPE" == "zfspool" ]; then warn "Some addons may not work due to ZFS not supporting 'fallocate'." fi -LXC_CONFIG=/etc/pve/lxc/${CTID}.conf -cat <> $LXC_CONFIG -lxc.cgroup2.devices.allow: a -lxc.cap.drop: -EOF -if [ "$DHCP" == "1" ]; then -MAC=$(pct config $CTID \ -| grep -i hwaddr \ -| awk '{print substr($2, 31, length($3) 17 ) }') \ -echo -e "MAC Address ${BL}$MAC${CL}" - -dhcp_reservation(){ - printf "Please set DHCP reservation and press Enter." - read -} -dhcp_reservation -fi - -echo -en "${GN} Starting LXC Container... " +msg_info "Starting LXC Container" pct start $CTID -echo -e "${CM}${CL} \r" +msg_ok "Started LXC Container" -alias lxc-cmd="lxc-attach -n $CTID --" - -lxc-cmd bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/setup/$HN-install.sh)" || exit +lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/setup/technitiumdns-install.sh)" || exit IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') -echo -e "${GN}Successfully created ${APP} LXC to${CL} ${BL}$CTID${CL}. -${BL}${APP}${CL} should be reachable by going to the following URL. +msg_ok "Completed Successfully!\n" +echo -e "${APP} should be reachable by going to the following URL. ${BL}http://${IP}:5380${CL} \n" From d7c78e8575f7f0590d4f89ed5eef23328763bf31 Mon Sep 17 00:00:00 2001 From: tteckster Date: Sun, 17 Apr 2022 15:27:14 -0400 Subject: [PATCH 02/13] Create technitiumdns-v3.sh --- ct/technitiumdns-v3.sh | 295 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 ct/technitiumdns-v3.sh diff --git a/ct/technitiumdns-v3.sh b/ct/technitiumdns-v3.sh new file mode 100644 index 00000000..9bab2b03 --- /dev/null +++ b/ct/technitiumdns-v3.sh @@ -0,0 +1,295 @@ +#!/usr/bin/env bash -ex +set -euo pipefail +shopt -s inherit_errexit nullglob + +NEXTID=$(pvesh get /cluster/nextid) +INTEGER='^[0-9]+$' +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"` +BFR="\\r\\033[K" +HOLD="-" +CM="${GN}✓${CL}" +APP="Debian" +NSAPP=$(echo ${APP,,} | tr -d ' ') +while true; do + read -p "This will create a New ${APP} LXC. Proceed(y/n)?" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) exit;; + * ) echo "Please answer yes or no.";; + esac +done +clear +function header_info { +echo -e "${RD} + _______ _ _ _ _ + |__ __| | | (_) | (_) + | | ___v3___| |__ _ __ _| |_ _ _ _ _ __ ___ + | |/ _ \/ __| _ \| _ \| | __| | | | | _ _ \ + | | __/ (__| | | | | | | | |_| | |_| | | | | | | + |_|\___|\___|_| |_|_| |_|_|\__|_|\__,_|_| |_| |_| +${CL}" +} + +header_info + +function msg_info() { + local msg="$1" + echo -ne " ${HOLD} ${YW}${msg}..." +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR} ${CM} ${GN}${msg}${CL}" +} + +function PVE_CHECK() { + PVE=$(pveversion | grep "pve-manager/7" | wc -l) + + if [[ $PVE != 1 ]]; then + echo -e "${RD}This script requires Proxmox Virtual Environment 7.0 or greater${CL}" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function default_settings() { + clear + header_info + echo -e "${BL}Using Default Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}" + CT_TYPE="1" + echo -e "${DGN}Using CT Password ${BGN}Automatic Login${CL}" + PW=" " + echo -e "${DGN}Using ID ${BGN}$NEXTID${CL}" + CT_ID=$NEXTID + echo -e "${DGN}Using CT Name ${BGN}$NSAPP${CL}" + HN=$NSAPP + echo -e "${DGN}Using Disk Size ${BGN}2GB${CL}" + DISK_SIZE="2" + echo -e "${DGN}Using ${BGN}1vCPU${CL}" + CORE_COUNT="1" + echo -e "${DGN}Using ${BGN}512MiB${CL}${GN} RAM${CL}" + RAM_SIZE="512" + echo -e "${DGN}Using IP Address ${BGN}DHCP${CL}" + NET=dhcp + echo -e "${DGN}Using VLAN Tag ${BGN}NONE${CL}" + VLAN=" " +} + +function advanced_settings() { + clear + header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${YW}Type Privileged, or Press [ENTER] for Default: Unprivileged (${RD}NO DEVICE PASSTHROUGH${CL}${YW})" + read CT_TYPE1 + if [ -z $CT_TYPE1 ]; then CT_TYPE1="Unprivileged" CT_TYPE="1"; + echo -en "${DGN}Set CT Type ${BL}$CT_TYPE1${CL}" + else + CT_TYPE1="Privileged" + CT_TYPE="0" + echo -en "${DGN}Set CT Type ${BL}Privileged${CL}" + fi; +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${YW}Set Password, or Press [ENTER] for Default: Automatic Login " + read PW1 + if [ -z $PW1 ]; then PW1="Automatic Login" PW=" "; + echo -en "${DGN}Set CT ${BL}$PW1${CL}" + else + PW="-password $PW1" + echo -en "${DGN}Set CT Password ${BL}$PW1${CL}" + fi; +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${YW}Enter the CT ID, or Press [ENTER] to automatically generate (${NEXTID}) " + read CT_ID + if [ -z $CT_ID ]; then CT_ID=$NEXTID; fi; + echo -en "${DGN}Set CT ID To ${BL}$CT_ID${CL}" +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${YW}Enter CT Name (no-spaces), or Press [ENTER] for Default: $NSAPP " + read CT_NAME + if [ -z $CT_NAME ]; then + HN=$NSAPP + else + HN=$(echo ${CT_NAME,,} | tr -d ' ') + fi + echo -en "${DGN}Set CT Name To ${BL}$HN${CL}" +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${YW}Enter a Disk Size, or Press [ENTER] for Default: 2Gb " + read DISK_SIZE + if [ -z $DISK_SIZE ]; then DISK_SIZE="2"; fi; + if ! [[ $DISK_SIZE =~ $INTEGER ]] ; then echo "ERROR! DISK SIZE MUST HAVE INTEGER NUMBER!"; exit; fi; + echo -en "${DGN}Set Disk Size To ${BL}$DISK_SIZE${CL}" +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${YW}Allocate CPU cores, or Press [ENTER] for Default: 1 " + read CORE_COUNT + if [ -z $CORE_COUNT ]; then CORE_COUNT="1"; fi; + echo -en "${DGN}Set Cores To ${BL}$CORE_COUNT${CL}" +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 512 " + read RAM_SIZE + if [ -z $RAM_SIZE ]; then RAM_SIZE="512"; fi; + echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}" +echo -e " ${CM}${CL} \n" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${YW}Enter a IP Address, or Press [ENTER] for Default: DHCP " + read NET + if [ -z $NET ]; then NET="dhcp"; fi; + echo -en "${DGN}Set IP Address To ${BL}$NET${CL}" +echo -e " ${CM}${CL} \n" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" + echo -e "${YW}Enter a VLAN Tag, or Press [ENTER] for Default: NONE " + read VLAN1 + if [ -z $VLAN1 ]; then VLAN1="NONE" VLAN=" "; + echo -en "${DGN}Set VLAN Tag To ${BL}$VLAN1${CL}" + else + VLAN="-tag $VLAN1" + echo -en "${DGN}Set VLAN Tag To ${BL}$VLAN1${CL}" + fi; +echo -e " ${CM}${CL} \n" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" + echo -e "${DGN}Using VLAN Tag ${BGN}$VLAN1${CL}" + +read -p "Are these settings correct(y/n)? " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Yy]$ ]] +then + advanced_settings +fi +} + +function start_script() { + echo -e "${YW}Type Advanced, or Press [ENTER] for Default Settings " + read SETTINGS + if [ -z $SETTINGS ]; then default_settings; + else + advanced_settings + fi; +} + +start_script + +if [ "$CT_TYPE" == "1" ]; then + FEATURES="nesting=1,keyctl=1" + else + FEATURES="nesting=1" + fi + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null + +export CTID=$CT_ID +export PCT_OSTYPE=debian +export PCT_OSVERSION=11 +export PCT_DISK_SIZE=$DISK_SIZE +export PCT_OPTIONS=" + -features $FEATURES + -hostname $HN + -net0 name=eth0,bridge=vmbr0,ip=$NET + $VLAN + -onboot 1 + -cores $CORE_COUNT + -memory $RAM_SIZE + -unprivileged $CT_TYPE + $PW +" +bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit + +STORAGE_TYPE=$(pvesm status -storage $(pct config $CTID | grep rootfs | awk -F ":" '{print $2}') | awk 'NR>1 {print $2}') +if [ "$STORAGE_TYPE" == "zfspool" ]; then + warn "Some addons may not work due to ZFS not supporting 'fallocate'." +fi + +msg_info "Starting LXC Container" +pct start $CTID +msg_ok "Started LXC Container" + +lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/setup/technitiumdns-install.sh)" || exit + +IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') + +msg_ok "Completed Successfully!\n" +echo -e "${APP} should be reachable by going to the following URL. + ${BL}http://${IP}:5380${CL} \n" From a091aae1840e7952a503230979c000a26973a08e Mon Sep 17 00:00:00 2001 From: tteckster Date: Sun, 17 Apr 2022 15:28:11 -0400 Subject: [PATCH 03/13] Update and rename technitiumdns.sh to technitiumdns-v2.sh --- ct/technitiumdns-v2.sh | 259 ++++++++++++++++++++++++++++++++++++ ct/technitiumdns.sh | 295 ----------------------------------------- 2 files changed, 259 insertions(+), 295 deletions(-) create mode 100644 ct/technitiumdns-v2.sh delete mode 100644 ct/technitiumdns.sh diff --git a/ct/technitiumdns-v2.sh b/ct/technitiumdns-v2.sh new file mode 100644 index 00000000..2d960480 --- /dev/null +++ b/ct/technitiumdns-v2.sh @@ -0,0 +1,259 @@ +#!/usr/bin/env bash +YW=`echo "\033[33m"` +BL=`echo "\033[36m"` +RD=`echo "\033[01;31m"` +CM='\xE2\x9C\x94\033' +GN=`echo "\033[1;92m"` +CL=`echo "\033[m"` +APP="Technitium DNS" +HN=$(echo ${APP,,} | tr -d ' ') +while true; do + read -p "This will create a New ${APP} LXC. Proceed(y/n)?" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) exit;; + * ) echo "Please answer yes or no.";; + esac +done +clear +function header_info { +echo -e "${RD} + + _______ _ _ _ _ + |__ __| | | (_) | (_) + | | ___ ___| |__ _ __ _| |_ _ _ _ _ __ ___ + | |/ _ \/ __| _ \| _ \| | __| | | | | _ _ \ + | | __/ (__| | | | | | | | |_| | |_| | | | | | | + |_|\___|\___|_| |_|_| |_|_|\__|_|\__,_|_| |_| |_| +${CL}" +} + +header_info +show_menu(){ + printf " ${YW} 1)${YW} Privileged ${CL}\n" + printf " ${YW} 2)${GN} Unprivileged ${CL}\n" + + printf "Please choose a Install Method and hit enter or ${RD}x${CL} to exit." + read opt +} + +option_picked(){ + message1=${@:-"${CL}Error: No message passed"} + printf " ${YW}${message1}${CL}\n" +} +show_menu +while [ "$opt" != " " ] + do + case $opt in + 1) clear; + header_info; + option_picked "Using Privileged Install"; + IM=0 + break; + ;; + 2) clear; + header_info; + option_picked "Using Unprivileged Install"; + IM=1 + break; + ;; + + x)exit; + ;; + \n)exit; + ;; + *)clear; + option_picked "Please choose a Install Method from the menu"; + show_menu; + ;; + esac + done +show_menu2(){ + printf " ${YW} 1)${GN} Use Automatic Login ${CL}\n" + printf " ${YW} 2)${GN} Use Password (changeme) ${CL}\n" + + printf "Please choose a Password Type and hit enter or ${RD}x${CL} to exit." + read opt +} + +option_picked(){ + message2=${@:-"${CL}Error: No message passed"} + printf " ${YW}${message1}${CL}\n" + printf " ${YW}${message2}${CL}\n" +} +show_menu2 +while [ "$opt" != " " ] + do + case $opt in + 1) clear; + header_info; + option_picked "Using Automatic Login"; + PW=" " + break; + ;; + 2) clear; + header_info; + option_picked "Using Password (changeme)"; + PW="-password changeme" + break; + ;; + + x)exit; + ;; + \n)exit; + ;; + *)clear; + option_picked "Please choose a Password Type from the menu"; + show_menu2; + ;; + esac + done +show_menu3(){ + printf " ${YW} 1)${GN} Automatic DHCP ${CL}\n" + printf " ${YW} 2)${GN} Manual DHCP ${CL}\n" + + printf "Please choose a DHCP Type and hit enter or ${RD}x${CL} to exit." + read opt +} + +option_picked(){ + message3=${@:-"${CL}Error: No message passed"} + printf " ${YW}${message1}${CL}\n" + printf " ${YW}${message2}${CL}\n" + printf " ${YW}${message3}${CL}\n" +} +show_menu3 +while [ "$opt" != " " ] + do + case $opt in + 1) clear; + header_info; + option_picked "Using Automatic DHCP"; + DHCP=" " + break; + ;; + 2) clear; + header_info; + option_picked "Using Manual DHCP"; + DHCP="1" + break; + ;; + + x)exit; + ;; + \n)exit; + ;; + *)clear; + option_picked "Please choose a DHCP Type from the menu"; + show_menu3; + ;; + esac + done + +set -o errexit +set -o errtrace +set -o nounset +set -o pipefail +shopt -s expand_aliases +alias die='EXIT=$? LINE=$LINENO error_exit' +trap die ERR +trap cleanup EXIT + +function error_exit() { + trap - ERR + local DEFAULT='Unknown failure occured.' + local REASON="\e[97m${1:-$DEFAULT}\e[39m" + local FLAG="\e[91m[ERROR] \e[93m$EXIT@$LINE" + msg "$FLAG $REASON" + [ ! -z ${CTID-} ] && cleanup_ctid + exit $EXIT +} +function warn() { + local REASON="\e[97m$1\e[39m" + local FLAG="\e[93m[WARNING]\e[39m" + msg "$FLAG $REASON" +} +function info() { + local REASON="$1" + local FLAG="\e[36m[INFO]\e[39m" + msg "$FLAG $REASON" +} +function msg() { + local TEXT="$1" + echo -e "$TEXT" +} +function cleanup_ctid() { + if $(pct status $CTID &>/dev/null); then + if [ "$(pct status $CTID | awk '{print $2}')" == "running" ]; then + pct stop $CTID + fi + pct destroy $CTID + elif [ "$(pvesm list $STORAGE --vmid $CTID)" != "" ]; then + pvesm free $ROOTFS + fi +} +function cleanup() { + popd >/dev/null + rm -rf $TEMP_DIR +} + if [ "$IM" == "1" ]; then + FEATURES="nesting=1,keyctl=1" + else + FEATURES="nesting=1" + fi + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null + +export CTID=$(pvesh get /cluster/nextid) +export PCT_OSTYPE=debian +export PCT_OSVERSION=11 +export PCT_DISK_SIZE=2 +export PCT_OPTIONS=" + -features $FEATURES + -hostname $HN + -net0 name=eth0,bridge=vmbr0,ip=dhcp + -onboot 1 + -cores 1 + -memory 512 + -unprivileged ${IM} + ${PW} +" +bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit + +STORAGE_TYPE=$(pvesm status -storage $(pct config $CTID | grep rootfs | awk -F ":" '{print $2}') | awk 'NR>1 {print $2}') +if [ "$STORAGE_TYPE" == "zfspool" ]; then + warn "Some addons may not work due to ZFS not supporting 'fallocate'." +fi +LXC_CONFIG=/etc/pve/lxc/${CTID}.conf +cat <> $LXC_CONFIG +lxc.cgroup2.devices.allow: a +lxc.cap.drop: +EOF +if [ "$DHCP" == "1" ]; then +MAC=$(pct config $CTID \ +| grep -i hwaddr \ +| awk '{print substr($2, 31, length($3) 17 ) }') \ + +echo -e "MAC Address ${BL}$MAC${CL}" + +dhcp_reservation(){ + printf "Please set DHCP reservation and press Enter." + read +} +dhcp_reservation +fi + +echo -en "${GN} Starting LXC Container... " +pct start $CTID +echo -e "${CM}${CL} \r" + +alias lxc-cmd="lxc-attach -n $CTID --" + +lxc-cmd bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/setup/$HN-install.sh)" || exit + +IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') + +echo -e "${GN}Successfully created ${APP} LXC to${CL} ${BL}$CTID${CL}. +${BL}${APP}${CL} should be reachable by going to the following URL. + ${BL}http://${IP}:5380${CL} \n" diff --git a/ct/technitiumdns.sh b/ct/technitiumdns.sh deleted file mode 100644 index 9bab2b03..00000000 --- a/ct/technitiumdns.sh +++ /dev/null @@ -1,295 +0,0 @@ -#!/usr/bin/env bash -ex -set -euo pipefail -shopt -s inherit_errexit nullglob - -NEXTID=$(pvesh get /cluster/nextid) -INTEGER='^[0-9]+$' -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"` -BFR="\\r\\033[K" -HOLD="-" -CM="${GN}✓${CL}" -APP="Debian" -NSAPP=$(echo ${APP,,} | tr -d ' ') -while true; do - read -p "This will create a New ${APP} LXC. Proceed(y/n)?" yn - case $yn in - [Yy]* ) break;; - [Nn]* ) exit;; - * ) echo "Please answer yes or no.";; - esac -done -clear -function header_info { -echo -e "${RD} - _______ _ _ _ _ - |__ __| | | (_) | (_) - | | ___v3___| |__ _ __ _| |_ _ _ _ _ __ ___ - | |/ _ \/ __| _ \| _ \| | __| | | | | _ _ \ - | | __/ (__| | | | | | | | |_| | |_| | | | | | | - |_|\___|\___|_| |_|_| |_|_|\__|_|\__,_|_| |_| |_| -${CL}" -} - -header_info - -function msg_info() { - local msg="$1" - echo -ne " ${HOLD} ${YW}${msg}..." -} - -function msg_ok() { - local msg="$1" - echo -e "${BFR} ${CM} ${GN}${msg}${CL}" -} - -function PVE_CHECK() { - PVE=$(pveversion | grep "pve-manager/7" | wc -l) - - if [[ $PVE != 1 ]]; then - echo -e "${RD}This script requires Proxmox Virtual Environment 7.0 or greater${CL}" - echo -e "Exiting..." - sleep 2 - exit - fi -} - -function default_settings() { - clear - header_info - echo -e "${BL}Using Default Settings${CL}" - echo -e "${DGN}Using CT Type ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}" - CT_TYPE="1" - echo -e "${DGN}Using CT Password ${BGN}Automatic Login${CL}" - PW=" " - echo -e "${DGN}Using ID ${BGN}$NEXTID${CL}" - CT_ID=$NEXTID - echo -e "${DGN}Using CT Name ${BGN}$NSAPP${CL}" - HN=$NSAPP - echo -e "${DGN}Using Disk Size ${BGN}2GB${CL}" - DISK_SIZE="2" - echo -e "${DGN}Using ${BGN}1vCPU${CL}" - CORE_COUNT="1" - echo -e "${DGN}Using ${BGN}512MiB${CL}${GN} RAM${CL}" - RAM_SIZE="512" - echo -e "${DGN}Using IP Address ${BGN}DHCP${CL}" - NET=dhcp - echo -e "${DGN}Using VLAN Tag ${BGN}NONE${CL}" - VLAN=" " -} - -function advanced_settings() { - clear - header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${YW}Type Privileged, or Press [ENTER] for Default: Unprivileged (${RD}NO DEVICE PASSTHROUGH${CL}${YW})" - read CT_TYPE1 - if [ -z $CT_TYPE1 ]; then CT_TYPE1="Unprivileged" CT_TYPE="1"; - echo -en "${DGN}Set CT Type ${BL}$CT_TYPE1${CL}" - else - CT_TYPE1="Privileged" - CT_TYPE="0" - echo -en "${DGN}Set CT Type ${BL}Privileged${CL}" - fi; -echo -e " ${CM}${CL} \r" -sleep 1 -clear -header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${YW}Set Password, or Press [ENTER] for Default: Automatic Login " - read PW1 - if [ -z $PW1 ]; then PW1="Automatic Login" PW=" "; - echo -en "${DGN}Set CT ${BL}$PW1${CL}" - else - PW="-password $PW1" - echo -en "${DGN}Set CT Password ${BL}$PW1${CL}" - fi; -echo -e " ${CM}${CL} \r" -sleep 1 -clear -header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${YW}Enter the CT ID, or Press [ENTER] to automatically generate (${NEXTID}) " - read CT_ID - if [ -z $CT_ID ]; then CT_ID=$NEXTID; fi; - echo -en "${DGN}Set CT ID To ${BL}$CT_ID${CL}" -echo -e " ${CM}${CL} \r" -sleep 1 -clear -header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" - echo -e "${YW}Enter CT Name (no-spaces), or Press [ENTER] for Default: $NSAPP " - read CT_NAME - if [ -z $CT_NAME ]; then - HN=$NSAPP - else - HN=$(echo ${CT_NAME,,} | tr -d ' ') - fi - echo -en "${DGN}Set CT Name To ${BL}$HN${CL}" -echo -e " ${CM}${CL} \r" -sleep 1 -clear -header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" - echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" - echo -e "${YW}Enter a Disk Size, or Press [ENTER] for Default: 2Gb " - read DISK_SIZE - if [ -z $DISK_SIZE ]; then DISK_SIZE="2"; fi; - if ! [[ $DISK_SIZE =~ $INTEGER ]] ; then echo "ERROR! DISK SIZE MUST HAVE INTEGER NUMBER!"; exit; fi; - echo -en "${DGN}Set Disk Size To ${BL}$DISK_SIZE${CL}" -echo -e " ${CM}${CL} \r" -sleep 1 -clear -header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" - echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" - echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" - echo -e "${YW}Allocate CPU cores, or Press [ENTER] for Default: 1 " - read CORE_COUNT - if [ -z $CORE_COUNT ]; then CORE_COUNT="1"; fi; - echo -en "${DGN}Set Cores To ${BL}$CORE_COUNT${CL}" -echo -e " ${CM}${CL} \r" -sleep 1 -clear -header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" - echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" - echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" - echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 512 " - read RAM_SIZE - if [ -z $RAM_SIZE ]; then RAM_SIZE="512"; fi; - echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}" -echo -e " ${CM}${CL} \n" -sleep 1 -clear -header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" - echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" - echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" - echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" - echo -e "${YW}Enter a IP Address, or Press [ENTER] for Default: DHCP " - read NET - if [ -z $NET ]; then NET="dhcp"; fi; - echo -en "${DGN}Set IP Address To ${BL}$NET${CL}" -echo -e " ${CM}${CL} \n" -sleep 1 -clear -header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" - echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" - echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" - echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" - echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" - echo -e "${YW}Enter a VLAN Tag, or Press [ENTER] for Default: NONE " - read VLAN1 - if [ -z $VLAN1 ]; then VLAN1="NONE" VLAN=" "; - echo -en "${DGN}Set VLAN Tag To ${BL}$VLAN1${CL}" - else - VLAN="-tag $VLAN1" - echo -en "${DGN}Set VLAN Tag To ${BL}$VLAN1${CL}" - fi; -echo -e " ${CM}${CL} \n" -sleep 1 -clear -header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" - echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" - echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" - echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" - echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" - echo -e "${DGN}Using VLAN Tag ${BGN}$VLAN1${CL}" - -read -p "Are these settings correct(y/n)? " -n 1 -r -echo -if [[ ! $REPLY =~ ^[Yy]$ ]] -then - advanced_settings -fi -} - -function start_script() { - echo -e "${YW}Type Advanced, or Press [ENTER] for Default Settings " - read SETTINGS - if [ -z $SETTINGS ]; then default_settings; - else - advanced_settings - fi; -} - -start_script - -if [ "$CT_TYPE" == "1" ]; then - FEATURES="nesting=1,keyctl=1" - else - FEATURES="nesting=1" - fi - -TEMP_DIR=$(mktemp -d) -pushd $TEMP_DIR >/dev/null - -export CTID=$CT_ID -export PCT_OSTYPE=debian -export PCT_OSVERSION=11 -export PCT_DISK_SIZE=$DISK_SIZE -export PCT_OPTIONS=" - -features $FEATURES - -hostname $HN - -net0 name=eth0,bridge=vmbr0,ip=$NET - $VLAN - -onboot 1 - -cores $CORE_COUNT - -memory $RAM_SIZE - -unprivileged $CT_TYPE - $PW -" -bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit - -STORAGE_TYPE=$(pvesm status -storage $(pct config $CTID | grep rootfs | awk -F ":" '{print $2}') | awk 'NR>1 {print $2}') -if [ "$STORAGE_TYPE" == "zfspool" ]; then - warn "Some addons may not work due to ZFS not supporting 'fallocate'." -fi - -msg_info "Starting LXC Container" -pct start $CTID -msg_ok "Started LXC Container" - -lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/setup/technitiumdns-install.sh)" || exit - -IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') - -msg_ok "Completed Successfully!\n" -echo -e "${APP} should be reachable by going to the following URL. - ${BL}http://${IP}:5380${CL} \n" From eaab213b0516cac1be1e50e7e86248611080758c Mon Sep 17 00:00:00 2001 From: tteckster Date: Sun, 17 Apr 2022 15:31:57 -0400 Subject: [PATCH 04/13] Update technitiumdns-install.sh --- setup/technitiumdns-install.sh | 71 +++++++++++++++------------------- 1 file changed, 31 insertions(+), 40 deletions(-) diff --git a/setup/technitiumdns-install.sh b/setup/technitiumdns-install.sh index 525ed33b..934a053d 100644 --- a/setup/technitiumdns-install.sh +++ b/setup/technitiumdns-install.sh @@ -1,38 +1,30 @@ -#!/usr/bin/env bash - -set -o errexit -set -o errtrace -set -o nounset -set -o pipefail -shopt -s expand_aliases -alias die='EXIT=$? LINE=$LINENO error_exit' -trap die ERR -trap 'die "Script interrupted."' INT - -function error_exit() { - trap - ERR - local DEFAULT='Unknown failure occured.' - local REASON="\e[97m${1:-$DEFAULT}\e[39m" - local FLAG="\e[91m[ERROR:LXC] \e[93m$EXIT@$LINE" - msg "$FLAG $REASON" - exit $EXIT -} -function msg() { - local TEXT="$1" - echo -e "$TEXT" -} - +#!/usr/bin/env bash -ex +set -euo pipefail +shopt -s inherit_errexit nullglob +YW=`echo "\033[33m"` RD=`echo "\033[01;31m"` BL=`echo "\033[36m"` GN=`echo "\033[1;92m"` CL=`echo "\033[m"` -CM="${GN}✓${CL}" -CROSS="${RD}✗${CL}" RETRY_NUM=10 RETRY_EVERY=3 NUM=$RETRY_NUM +CM="${GN}✓${CL}" +CROSS="${RD}✗${CL}" +BFR="\\r\\033[K" +HOLD="-" -echo -en "${GN} Setting up Container OS... " +function msg_info() { + local msg="$1" + echo -ne " ${HOLD} ${YW}${msg}..." +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR} ${CM} ${GN}${msg}${CL}" +} + +msg_info "Setting up Container OS " sed -i "/$LANG/ s/\(^# \)//" /etc/locale.gen locale-gen >/dev/null while [ "$(hostname -I)" = "" ]; do @@ -45,27 +37,26 @@ while [ "$(hostname -I)" = "" ]; do exit 1 fi done -echo -e "${CM}${CL} \r" -echo -en "${GN} Network Connected: ${BL}$(hostname -I)${CL} " -echo -e "${CM}${CL} \r" +msg_ok "Set up Container OS" +msg_ok "Network Connected: ${BL}$(hostname -I)" -echo -en "${GN} Updating Container OS... " +msg_info "Updating Container OS" apt update &>/dev/null apt-get -qqy upgrade &>/dev/null -echo -e "${CM}${CL} \r" +msg_ok "Updated Container OS" -echo -en "${GN} Installing Dependencies... " +msg_info "Installing Dependencies" apt-get install -y curl &>/dev/null apt-get install -y sudo &>/dev/null -echo -e "${CM}${CL} \r" +msg_ok "Installed Dependencies" -echo -en "${GN} Installing Technitium DNS... " +msg_info "Installing Technitium DNS" curl -sSL https://download.technitium.com/dns/install.sh | sudo bash &>/dev/null -echo -e "${CM}${CL} \r" +msg_ok "Installed Technitium DNS" PASS=$(grep -w "root" /etc/shadow | cut -b6); if [[ $PASS != $ ]]; then -echo -en "${GN} Customizing Container... " +msg_info "Customizing Container" rm /etc/motd rm /etc/update-motd.d/10-uname touch ~/.hushlogin @@ -78,11 +69,11 @@ ExecStart=-/sbin/agetty --autologin root --noclear --keep-baud tty%I 115200,3840 EOF systemctl daemon-reload systemctl restart $(basename $(dirname $GETTY_OVERRIDE) | sed 's/\.d//') -echo -e "${CM}${CL} \r" +msg_ok "Customized Container" fi -echo -en "${GN} Cleanup... " +msg_info "Cleaning up" apt-get autoremove >/dev/null apt-get autoclean >/dev/null rm -rf /var/{cache,log}/* /var/lib/apt/lists/* -echo -e "${CM}${CL} \n" +msg_ok "Cleaned" From 6c89c3d48ab3e3ef284576a025e58e8fb383ec27 Mon Sep 17 00:00:00 2001 From: tteckster Date: Sun, 17 Apr 2022 15:36:13 -0400 Subject: [PATCH 05/13] Rename esphome.sh to esphome-v2.sh --- ct/{esphome.sh => esphome-v2.sh} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ct/{esphome.sh => esphome-v2.sh} (100%) diff --git a/ct/esphome.sh b/ct/esphome-v2.sh similarity index 100% rename from ct/esphome.sh rename to ct/esphome-v2.sh From 17fad9e4b7adf4be732900235876232ef6d5b197 Mon Sep 17 00:00:00 2001 From: tteckster Date: Sun, 17 Apr 2022 15:44:23 -0400 Subject: [PATCH 06/13] Update technitiumdns-v3.sh --- ct/technitiumdns-v3.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/technitiumdns-v3.sh b/ct/technitiumdns-v3.sh index 9bab2b03..f922fb0d 100644 --- a/ct/technitiumdns-v3.sh +++ b/ct/technitiumdns-v3.sh @@ -14,7 +14,7 @@ CL=`echo "\033[m"` BFR="\\r\\033[K" HOLD="-" CM="${GN}✓${CL}" -APP="Debian" +APP="Technitium DNS" NSAPP=$(echo ${APP,,} | tr -d ' ') while true; do read -p "This will create a New ${APP} LXC. Proceed(y/n)?" yn From f4fdb8c72c09584d08fef4a91c1c29a52fa21bef Mon Sep 17 00:00:00 2001 From: tteckster Date: Sun, 17 Apr 2022 15:48:25 -0400 Subject: [PATCH 07/13] Create esphome-v3.sh --- ct/esphome-v3.sh | 296 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 296 insertions(+) create mode 100644 ct/esphome-v3.sh diff --git a/ct/esphome-v3.sh b/ct/esphome-v3.sh new file mode 100644 index 00000000..f5180e74 --- /dev/null +++ b/ct/esphome-v3.sh @@ -0,0 +1,296 @@ +#!/usr/bin/env bash -ex +set -euo pipefail +shopt -s inherit_errexit nullglob + +NEXTID=$(pvesh get /cluster/nextid) +INTEGER='^[0-9]+$' +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"` +BFR="\\r\\033[K" +HOLD="-" +CM="${GN}✓${CL}" +APP="ESPHome" +NSAPP=$(echo ${APP,,} | tr -d ' ') +while true; do + read -p "This will create a New ${APP} LXC. Proceed(y/n)?" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) exit;; + * ) echo "Please answer yes or no.";; + esac +done +clear +function header_info { +echo -e "${RD} + ______ _____ _____ _ _ ____ __ __ ______ + | ____|/ ____| __ \| | | |/ __ \| \/ | ____| + | |__ | (___ | |__) | |__| | | | | \ / | |__ + | __| \___ \| ___/| __ | | | | |\/| | __| + | |____ ____) | | | | | | |__| | | | | |____ + |______|_____/|_| v3 |_| |_|\____/|_| |_|______| + +${CL}" +} + +header_info + +function msg_info() { + local msg="$1" + echo -ne " ${HOLD} ${YW}${msg}..." +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR} ${CM} ${GN}${msg}${CL}" +} + +function PVE_CHECK() { + PVE=$(pveversion | grep "pve-manager/7" | wc -l) + + if [[ $PVE != 1 ]]; then + echo -e "${RD}This script requires Proxmox Virtual Environment 7.0 or greater${CL}" + echo -e "Exiting..." + sleep 2 + exit + fi +} + +function default_settings() { + clear + header_info + echo -e "${BL}Using Default Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}" + CT_TYPE="1" + echo -e "${DGN}Using CT Password ${BGN}Automatic Login${CL}" + PW=" " + echo -e "${DGN}Using ID ${BGN}$NEXTID${CL}" + CT_ID=$NEXTID + echo -e "${DGN}Using CT Name ${BGN}$NSAPP${CL}" + HN=$NSAPP + echo -e "${DGN}Using Disk Size ${BGN}4GB${CL}" + DISK_SIZE="4" + echo -e "${DGN}Using ${BGN}2vCPU${CL}" + CORE_COUNT="2" + echo -e "${DGN}Using ${BGN}1024MiB${CL}${GN} RAM${CL}" + RAM_SIZE="1024" + echo -e "${DGN}Using IP Address ${BGN}DHCP${CL}" + NET=dhcp + echo -e "${DGN}Using VLAN Tag ${BGN}NONE${CL}" + VLAN=" " +} + +function advanced_settings() { + clear + header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${YW}Type Privileged, or Press [ENTER] for Default: Unprivileged (${RD}NO DEVICE PASSTHROUGH${CL}${YW})" + read CT_TYPE1 + if [ -z $CT_TYPE1 ]; then CT_TYPE1="Unprivileged" CT_TYPE="1"; + echo -en "${DGN}Set CT Type ${BL}$CT_TYPE1${CL}" + else + CT_TYPE1="Privileged" + CT_TYPE="0" + echo -en "${DGN}Set CT Type ${BL}Privileged${CL}" + fi; +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${YW}Set Password, or Press [ENTER] for Default: Automatic Login " + read PW1 + if [ -z $PW1 ]; then PW1="Automatic Login" PW=" "; + echo -en "${DGN}Set CT ${BL}$PW1${CL}" + else + PW="-password $PW1" + echo -en "${DGN}Set CT Password ${BL}$PW1${CL}" + fi; +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${YW}Enter the CT ID, or Press [ENTER] to automatically generate (${NEXTID}) " + read CT_ID + if [ -z $CT_ID ]; then CT_ID=$NEXTID; fi; + echo -en "${DGN}Set CT ID To ${BL}$CT_ID${CL}" +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${YW}Enter CT Name (no-spaces), or Press [ENTER] for Default: $NSAPP " + read CT_NAME + if [ -z $CT_NAME ]; then + HN=$NSAPP + else + HN=$(echo ${CT_NAME,,} | tr -d ' ') + fi + echo -en "${DGN}Set CT Name To ${BL}$HN${CL}" +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${YW}Enter a Disk Size, or Press [ENTER] for Default: 4Gb " + read DISK_SIZE + if [ -z $DISK_SIZE ]; then DISK_SIZE="4"; fi; + if ! [[ $DISK_SIZE =~ $INTEGER ]] ; then echo "ERROR! DISK SIZE MUST HAVE INTEGER NUMBER!"; exit; fi; + echo -en "${DGN}Set Disk Size To ${BL}$DISK_SIZE${CL}" +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${YW}Allocate CPU cores, or Press [ENTER] for Default: 2 " + read CORE_COUNT + if [ -z $CORE_COUNT ]; then CORE_COUNT="2"; fi; + echo -en "${DGN}Set Cores To ${BL}$CORE_COUNT${CL}" +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 1024 " + read RAM_SIZE + if [ -z $RAM_SIZE ]; then RAM_SIZE="1024"; fi; + echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}" +echo -e " ${CM}${CL} \n" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" + echo -e "${YW}Enter a IP Address, or Press [ENTER] for Default: DHCP " + read NET + if [ -z $NET ]; then NET="dhcp"; fi; + echo -en "${DGN}Set IP Address To ${BL}$NET${CL}" +echo -e " ${CM}${CL} \n" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" + echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" + echo -e "${YW}Enter a VLAN Tag, or Press [ENTER] for Default: NONE " + read VLAN1 + if [ -z $VLAN1 ]; then VLAN1="NONE" VLAN=" "; + echo -en "${DGN}Set VLAN Tag To ${BL}$VLAN1${CL}" + else + VLAN="-tag $VLAN1" + echo -en "${DGN}Set VLAN Tag To ${BL}$VLAN1${CL}" + fi; +echo -e " ${CM}${CL} \n" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" + echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" + echo -e "${DGN}Using VLAN Tag ${BGN}$VLAN1${CL}" + +read -p "Are these settings correct(y/n)? " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Yy]$ ]] +then + advanced_settings +fi +} + +function start_script() { + echo -e "${YW}Type Advanced, or Press [ENTER] for Default Settings " + read SETTINGS + if [ -z $SETTINGS ]; then default_settings; + else + advanced_settings + fi; +} + +start_script + +if [ "$CT_TYPE" == "1" ]; then + FEATURES="nesting=1,keyctl=1" + else + FEATURES="nesting=1" + fi + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null + +export CTID=$CT_ID +export PCT_OSTYPE=debian +export PCT_OSVERSION=11 +export PCT_DISK_SIZE=$DISK_SIZE +export PCT_OPTIONS=" + -features $FEATURES + -hostname $HN + -net0 name=eth0,bridge=vmbr0,ip=$NET + $VLAN + -onboot 1 + -cores $CORE_COUNT + -memory $RAM_SIZE + -unprivileged $CT_TYPE + $PW +" +bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit + +STORAGE_TYPE=$(pvesm status -storage $(pct config $CTID | grep rootfs | awk -F ":" '{print $2}') | awk 'NR>1 {print $2}') +if [ "$STORAGE_TYPE" == "zfspool" ]; then + warn "Some addons may not work due to ZFS not supporting 'fallocate'." +fi + +msg_info "Starting LXC Container" +pct start $CTID +msg_ok "Started LXC Container" + +lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/setup/esphome-install.sh)" || exit + +IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') + +msg_ok "Completed Successfully!\n" +echo -e "${APP} should be reachable by going to the following URL. + ${BL}http://${IP}:6052${CL} \n" From dd6fae7f776cac2aa8171d618b6c193f04d668fc Mon Sep 17 00:00:00 2001 From: tteckster Date: Sun, 17 Apr 2022 15:49:47 -0400 Subject: [PATCH 08/13] Update technitiumdns-v3.sh --- ct/technitiumdns-v3.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ct/technitiumdns-v3.sh b/ct/technitiumdns-v3.sh index f922fb0d..2ff5df72 100644 --- a/ct/technitiumdns-v3.sh +++ b/ct/technitiumdns-v3.sh @@ -75,7 +75,7 @@ function default_settings() { DISK_SIZE="2" echo -e "${DGN}Using ${BGN}1vCPU${CL}" CORE_COUNT="1" - echo -e "${DGN}Using ${BGN}512MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}512MiB${CL}${DGN} RAM${CL}" RAM_SIZE="512" echo -e "${DGN}Using IP Address ${BGN}DHCP${CL}" NET=dhcp @@ -191,7 +191,7 @@ header_info echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" echo -e "${YW}Enter a IP Address, or Press [ENTER] for Default: DHCP " read NET if [ -z $NET ]; then NET="dhcp"; fi; @@ -207,7 +207,7 @@ header_info echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" echo -e "${YW}Enter a VLAN Tag, or Press [ENTER] for Default: NONE " read VLAN1 @@ -228,7 +228,7 @@ header_info echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" echo -e "${DGN}Using VLAN Tag ${BGN}$VLAN1${CL}" From 962ce024ff02bb28472157715e6803e9cb029206 Mon Sep 17 00:00:00 2001 From: tteckster Date: Sun, 17 Apr 2022 15:50:36 -0400 Subject: [PATCH 09/13] Update esphome-v3.sh --- ct/esphome-v3.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ct/esphome-v3.sh b/ct/esphome-v3.sh index f5180e74..d738561d 100644 --- a/ct/esphome-v3.sh +++ b/ct/esphome-v3.sh @@ -76,7 +76,7 @@ function default_settings() { DISK_SIZE="4" echo -e "${DGN}Using ${BGN}2vCPU${CL}" CORE_COUNT="2" - echo -e "${DGN}Using ${BGN}1024MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}1024MiB${CL}${DGN} RAM${CL}" RAM_SIZE="1024" echo -e "${DGN}Using IP Address ${BGN}DHCP${CL}" NET=dhcp From 9b06cdc9cf8b80fb221bc9ab013e7031b86dcb7d Mon Sep 17 00:00:00 2001 From: tteckster Date: Sun, 17 Apr 2022 15:51:43 -0400 Subject: [PATCH 10/13] Update debian-v3.sh --- ct/debian-v3.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ct/debian-v3.sh b/ct/debian-v3.sh index 1567da12..d83514d7 100644 --- a/ct/debian-v3.sh +++ b/ct/debian-v3.sh @@ -75,7 +75,7 @@ function default_settings() { DISK_SIZE="2" echo -e "${DGN}Using ${BGN}1vCPU${CL}" CORE_COUNT="1" - echo -e "${DGN}Using ${BGN}512MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}512MiB${CL}${DGN} RAM${CL}" RAM_SIZE="512" echo -e "${DGN}Using IP Address ${BGN}DHCP${CL}" NET=dhcp @@ -191,7 +191,7 @@ header_info echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" echo -e "${YW}Enter a IP Address, or Press [ENTER] for Default: DHCP " read NET if [ -z $NET ]; then NET="dhcp"; fi; @@ -207,7 +207,7 @@ header_info echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" echo -e "${YW}Enter a VLAN Tag, or Press [ENTER] for Default: NONE " read VLAN1 @@ -228,7 +228,7 @@ header_info echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" echo -e "${DGN}Using VLAN Tag ${BGN}$VLAN1${CL}" From 034b88caa993eb534cce88d43dcd2657e733e602 Mon Sep 17 00:00:00 2001 From: tteckster Date: Sun, 17 Apr 2022 15:53:26 -0400 Subject: [PATCH 11/13] Update homeassistant-v3.sh --- ct/homeassistant-v3.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ct/homeassistant-v3.sh b/ct/homeassistant-v3.sh index 636d0fb1..54be579d 100644 --- a/ct/homeassistant-v3.sh +++ b/ct/homeassistant-v3.sh @@ -74,7 +74,7 @@ function default_settings() { DISK_SIZE="16" echo -e "${DGN}Using ${BGN}2vCPU${CL}" CORE_COUNT="2" - echo -e "${DGN}Using ${BGN}2048MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}2048MiB${CL}${DGN} RAM${CL}" RAM_SIZE="2048" echo -e "${DGN}Using IP Address ${BGN}DHCP${CL}" NET=dhcp @@ -190,7 +190,7 @@ header_info echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" echo -e "${YW}Enter a IP Address, or Press [ENTER] for Default: DHCP " read NET if [ -z $NET ]; then NET="dhcp"; fi; @@ -206,7 +206,7 @@ header_info echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" echo -e "${YW}Enter a VLAN Tag, or Press [ENTER] for Default: NONE " read VLAN1 @@ -227,7 +227,7 @@ header_info echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" echo -e "${DGN}Using VLAN Tag ${BGN}$VLAN1${CL}" From d16d459aa487efc4fc05319c2555374a9f037cb3 Mon Sep 17 00:00:00 2001 From: tteckster Date: Sun, 17 Apr 2022 15:54:43 -0400 Subject: [PATCH 12/13] Update zigbee2mqtt-v3.sh --- ct/zigbee2mqtt-v3.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ct/zigbee2mqtt-v3.sh b/ct/zigbee2mqtt-v3.sh index 597d2bb0..83da0308 100644 --- a/ct/zigbee2mqtt-v3.sh +++ b/ct/zigbee2mqtt-v3.sh @@ -76,7 +76,7 @@ function default_settings() { DISK_SIZE="4" echo -e "${DGN}Using ${BGN}2vCPU${CL}" CORE_COUNT="2" - echo -e "${DGN}Using ${BGN}1024MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}1024MiB${CL}${DGN} RAM${CL}" RAM_SIZE="1024" echo -e "${DGN}Using IP Address ${BGN}DHCP${CL}" NET=dhcp @@ -192,7 +192,7 @@ header_info echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" echo -e "${YW}Enter a IP Address, or Press [ENTER] for Default: DHCP " read NET if [ -z $NET ]; then NET="dhcp"; fi; @@ -208,7 +208,7 @@ header_info echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" echo -e "${YW}Enter a VLAN Tag, or Press [ENTER] for Default: NONE " read VLAN1 @@ -229,7 +229,7 @@ header_info echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" echo -e "${DGN}Using VLAN Tag ${BGN}$VLAN1${CL}" From 8942614fd2c847f7608dcaa07a415adcfe76d907 Mon Sep 17 00:00:00 2001 From: tteckster Date: Sun, 17 Apr 2022 16:12:14 -0400 Subject: [PATCH 13/13] Update esphome-install.sh --- setup/esphome-install.sh | 90 ++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 50 deletions(-) diff --git a/setup/esphome-install.sh b/setup/esphome-install.sh index 24e23f72..8017f631 100644 --- a/setup/esphome-install.sh +++ b/setup/esphome-install.sh @@ -1,38 +1,31 @@ -#!/usr/bin/env bash - -set -o errexit -set -o errtrace -set -o nounset -set -o pipefail -shopt -s expand_aliases -alias die='EXIT=$? LINE=$LINENO error_exit' -trap die ERR -trap 'die "Script interrupted."' INT - -function error_exit() { - trap - ERR - local DEFAULT='Unknown failure occured.' - local REASON="\e[97m${1:-$DEFAULT}\e[39m" - local FLAG="\e[91m[ERROR:LXC] \e[93m$EXIT@$LINE" - msg "$FLAG $REASON" - exit $EXIT -} -function msg() { - local TEXT="$1" - echo -e "$TEXT" -} +#!/usr/bin/env bash -ex +set -euo pipefail +shopt -s inherit_errexit nullglob +YW=`echo "\033[33m"` RD=`echo "\033[01;31m"` BL=`echo "\033[36m"` GN=`echo "\033[1;92m"` CL=`echo "\033[m"` -CM="${GN}✓${CL}" -CROSS="${RD}✗${CL}" RETRY_NUM=10 RETRY_EVERY=3 NUM=$RETRY_NUM +CM="${GN}✓${CL}" +CROSS="${RD}✗${CL}" +BFR="\\r\\033[K" +HOLD="-" -echo -en "${GN} Setting up Container OS... " +function msg_info() { + local msg="$1" + echo -ne " ${HOLD} ${YW}${msg}..." +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR} ${CM} ${GN}${msg}${CL}" +} + +msg_info "Setting up Container OS " sed -i "/$LANG/ s/\(^# \)//" /etc/locale.gen locale-gen >/dev/null while [ "$(hostname -I)" = "" ]; do @@ -45,31 +38,28 @@ while [ "$(hostname -I)" = "" ]; do exit 1 fi done -echo -e "${CM}${CL} \r" -echo -en "${GN} Network Connected: ${BL}$(hostname -I)${CL} " -echo -e "${CM}${CL} \r" +msg_ok "Set up Container OS" +msg_ok "Network Connected: ${BL}$(hostname -I)" -echo -en "${GN} Updating Container OS... " -apt-get update &>/dev/null +msg_info "Updating Container OS" +apt update &>/dev/null apt-get -qqy upgrade &>/dev/null -echo -e "${CM}${CL} \r" +msg_ok "Updated Container OS" -echo -en "${GN} Installing Dependencies... " -apt-get update &>/dev/null -apt-get -qqy install \ - curl \ - sudo &>/dev/null -echo -e "${CM}${CL} \r" +msg_info "Installing Dependencies" +apt-get install -y curl &>/dev/null +apt-get install -y sudo &>/dev/null +msg_ok "Installed Dependencies" -echo -en "${GN} Installing pip3... " -apt-get install python3-pip -y &>/dev/null -echo -e "${CM}${CL} \r" +msg_info "Installing pip3" +apt-get install -y python3-pip &>/dev/null +msg_ok "Installed pip3" -echo -en "${GN} Installing ESPHome... " +msg_info "Installing ESPHome" pip3 install esphome &>/dev/null -echo -e "${CM}${CL} \r" +msg_ok "Installed ESPHome" -echo -en "${GN} Installing ESPHome Dashboard... " +msg_info "Installing ESPHome Dashboard" pip3 install tornado esptool &>/dev/null service_path="/etc/systemd/system/esphomeDashboard.service" @@ -84,11 +74,11 @@ User=root WantedBy=multi-user.target" > $service_path systemctl enable esphomeDashboard.service &>/dev/null systemctl start esphomeDashboard -echo -e "${CM}${CL} \r" +msg_ok "Installed ESPHome Dashboard" PASS=$(grep -w "root" /etc/shadow | cut -b6); if [[ $PASS != $ ]]; then -echo -en "${GN} Customizing Container... " +msg_info "Customizing Container" rm /etc/motd rm /etc/update-motd.d/10-uname touch ~/.hushlogin @@ -101,11 +91,11 @@ ExecStart=-/sbin/agetty --autologin root --noclear --keep-baud tty%I 115200,3840 EOF systemctl daemon-reload systemctl restart $(basename $(dirname $GETTY_OVERRIDE) | sed 's/\.d//') -echo -e "${CM}${CL} \r" +msg_ok "Customized Container" fi - -echo -en "${GN} Cleanup... " + +msg_info "Cleaning up" apt-get autoremove >/dev/null apt-get autoclean >/dev/null rm -rf /var/{cache,log}/* /var/lib/apt/lists/* -echo -e "${CM}${CL} \n" +msg_ok "Cleaned"