mirror of https://github.com/tteck/Proxmox.git
purge (#884)
parent
fce1839580
commit
049b2cf770
@ -1,162 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
|
|
||||||
while true; do |
|
||||||
read -p "This will create a New AdGuard Home LXC. Proceed(y/n)?" yn |
|
||||||
case $yn in |
|
||||||
[Yy]* ) break;; |
|
||||||
[Nn]* ) exit;; |
|
||||||
* ) echo "Please answer yes or no.";; |
|
||||||
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' |
|
||||||
CHECKMARK='\033[0;32m\xE2\x9C\x94\033[0m' |
|
||||||
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 [ ! -z ${MOUNT+x} ]; then |
|
||||||
pct unmount $CTID |
|
||||||
fi |
|
||||||
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 |
|
||||||
} |
|
||||||
function load_module() { |
|
||||||
if ! $(lsmod | grep -Fq $1); then |
|
||||||
modprobe $1 &>/dev/null || \ |
|
||||||
die "Failed to load '$1' module." |
|
||||||
fi |
|
||||||
MODULES_PATH=/etc/modules |
|
||||||
if ! $(grep -Fxq "$1" $MODULES_PATH); then |
|
||||||
echo "$1" >> $MODULES_PATH || \ |
|
||||||
die "Failed to add '$1' module to load at boot." |
|
||||||
fi |
|
||||||
} |
|
||||||
TEMP_DIR=$(mktemp -d) |
|
||||||
pushd $TEMP_DIR >/dev/null |
|
||||||
|
|
||||||
wget -qL https://raw.githubusercontent.com/tteck/Proxmox/main/setup/adguard_setup.sh |
|
||||||
|
|
||||||
load_module overlay |
|
||||||
|
|
||||||
while read -r line; do |
|
||||||
TAG=$(echo $line | awk '{print $1}') |
|
||||||
TYPE=$(echo $line | awk '{printf "%-10s", $2}') |
|
||||||
FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') |
|
||||||
ITEM=" Type: $TYPE Free: $FREE " |
|
||||||
OFFSET=2 |
|
||||||
if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then |
|
||||||
MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) |
|
||||||
fi |
|
||||||
STORAGE_MENU+=( "$TAG" "$ITEM" "OFF" ) |
|
||||||
done < <(pvesm status -content rootdir | awk 'NR>1') |
|
||||||
if [ $((${#STORAGE_MENU[@]}/3)) -eq 0 ]; then |
|
||||||
warn "'Container' needs to be selected for at least one storage location." |
|
||||||
die "Unable to detect valid storage location." |
|
||||||
elif [ $((${#STORAGE_MENU[@]}/3)) -eq 1 ]; then |
|
||||||
STORAGE=${STORAGE_MENU[0]} |
|
||||||
else |
|
||||||
while [ -z "${STORAGE:+x}" ]; do |
|
||||||
STORAGE=$(whiptail --title "Storage Pools" --radiolist \ |
|
||||||
"Which storage pool you would like to use for the container?\n\n" \ |
|
||||||
16 $(($MSG_MAX_LENGTH + 23)) 6 \ |
|
||||||
"${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit |
|
||||||
done |
|
||||||
fi |
|
||||||
info "Using '$STORAGE' for storage location." |
|
||||||
|
|
||||||
CTID=$(pvesh get /cluster/nextid) |
|
||||||
info "LXC ID is $CTID." |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Updating LXC Template List... \e[0m" |
|
||||||
pveam update >/dev/null |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Downloading LXC Template... \e[0m" |
|
||||||
OSTYPE=debian |
|
||||||
OSVERSION=${OSTYPE}-11 |
|
||||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($OSVERSION.*\)/\1/p" | sort -t - -k 2 -V) |
|
||||||
TEMPLATE="${TEMPLATES[-1]}" |
|
||||||
pveam download local $TEMPLATE >/dev/null || |
|
||||||
die "A problem occured while downloading the LXC template." |
|
||||||
|
|
||||||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') |
|
||||||
case $STORAGE_TYPE in |
|
||||||
dir|nfs) |
|
||||||
DISK_EXT=".raw" |
|
||||||
DISK_REF="$CTID/" |
|
||||||
;; |
|
||||||
zfspool) |
|
||||||
DISK_PREFIX="subvol" |
|
||||||
DISK_FORMAT="subvol" |
|
||||||
;; |
|
||||||
esac |
|
||||||
DISK=${DISK_PREFIX:-vm}-${CTID}-disk-0${DISK_EXT-} |
|
||||||
ROOTFS=${STORAGE}:${DISK_REF-}${DISK} |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Creating LXC... \e[0m" |
|
||||||
DISK_SIZE=2G |
|
||||||
pvesm alloc $STORAGE $CTID $DISK $DISK_SIZE --format ${DISK_FORMAT:-raw} >/dev/null |
|
||||||
if [ "$STORAGE_TYPE" == "zfspool" ]; then |
|
||||||
warn "Some containers may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
else |
|
||||||
mkfs.ext4 $(pvesm path $ROOTFS) &>/dev/null |
|
||||||
fi |
|
||||||
ARCH=$(dpkg --print-architecture) |
|
||||||
HOSTNAME=adguard |
|
||||||
TEMPLATE_STRING="local:vztmpl/${TEMPLATE}" |
|
||||||
pct create $CTID $TEMPLATE_STRING -arch $ARCH -features nesting=1 \ |
|
||||||
-hostname $HOSTNAME -net0 name=eth0,bridge=vmbr0,ip=dhcp -onboot 1 -cores 1 -memory 512 \ |
|
||||||
-ostype $OSTYPE -rootfs $ROOTFS,size=$DISK_SIZE -storage $STORAGE >/dev/null |
|
||||||
|
|
||||||
MOUNT=$(pct mount $CTID | cut -d"'" -f 2) |
|
||||||
ln -fs $(readlink /etc/localtime) ${MOUNT}/etc/localtime |
|
||||||
pct unmount $CTID && unset MOUNT |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Starting LXC... \e[0m" |
|
||||||
pct start $CTID |
|
||||||
pct push $CTID adguard_setup.sh /adguard_setup.sh -perms 755 |
|
||||||
pct exec $CTID /adguard_setup.sh |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
info "Successfully created a AdGuard Home LXC to $CTID" |
|
||||||
echo -e "\e[1;92m AdGuard Home Setup should be reachable by going to the following URL. |
|
||||||
http://${IP}:3000 |
|
||||||
\e[0m" |
|
||||||
@ -1,256 +0,0 @@ |
|||||||
#!/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"` |
|
||||||
while true; do |
|
||||||
read -p "This will create a New Adguard Home 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 "${GN} |
|
||||||
_ _ |
|
||||||
/\ | | | | |
|
||||||
/ \ __| | __ _ _ _ __ _ _ __ __| | |
|
||||||
/ /\ \ / _ |/ _ | | | |/ _ | __/ _ | |
|
||||||
/ ____ \ (_| | (_| | |_| | (_| | | | (_| | |
|
||||||
/_/ \_\__,_|\__, |\__,_|\__,_|_| \__,_| |
|
||||||
__/ | |
|
||||||
|___/ |
|
||||||
|
|
||||||
${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 adguard |
|
||||||
-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 |
|
||||||
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/adguard-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 Adguard Home LXC to${CL} ${BL}$CTID${CL}. |
|
||||||
${GN}Adguard${CL} Setup should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:3000${CL} \n" |
|
||||||
|
|
||||||
@ -1,358 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="Adguard" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${GN} |
|
||||||
_ _ |
|
||||||
/\ | | | | |
|
||||||
/ \ __| | __ _ _ _ __ _ _ __ __| | |
|
||||||
/ /\ \ / _ |/ _ | | | |/ _ | __/ _ | |
|
||||||
/ ____ \ (_| | (_| | |_| | (_| | | | (_| | |
|
||||||
/_/ \_\__,_|\__, |\__,_|\__,_|_| \__,_| |
|
||||||
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 CT 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}2${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="2" |
|
||||||
echo -e "${DGN}Using ${BGN}1${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="1" |
|
||||||
echo -e "${DGN}Using ${BGN}512${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="512" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 2 " |
|
||||||
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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}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}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/adguard-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# AdGuard Home LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "Adguard Setup should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:3000${CL} \n" |
|
||||||
@ -1,253 +0,0 @@ |
|||||||
#!/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"` |
|
||||||
while true; do |
|
||||||
read -p "This will create a New Daemon Sync Server 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 "${BL} |
|
||||||
_____ _____ |
|
||||||
| __ \ / ____| |
|
||||||
| | | | __ _ ___ _ __ ___ ___ _ __ | (___ _ _ _ __ ___ |
|
||||||
| | | |/ _ |/ _ \ _ _ \ / _ \| _ \ \___ \| | | | _ \ / __| |
|
||||||
| |__| | (_| | __/ | | | | | (_) | | | | ____) | |_| | | | | (__ |
|
||||||
|_____/ \__,_|\___|_| |_| |_|\___/|_| |_| |_____/ \__, |_| |_|\___| |
|
||||||
__/ | |
|
||||||
|___/ |
|
||||||
${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=8 |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname daemonsync |
|
||||||
-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 |
|
||||||
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/daemonsync-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 Daemon Sync Server LXC to${CL} ${BL}$CTID${CL}. |
|
||||||
Daemon Sync should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:8084${CL} \n" |
|
||||||
@ -1,358 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="Daemon Sync" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${BL} |
|
||||||
_____ _____ |
|
||||||
| __ \ / ____| |
|
||||||
| | | | __ _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 CT 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}8${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="8" |
|
||||||
echo -e "${DGN}Using ${BGN}1${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="1" |
|
||||||
echo -e "${DGN}Using ${BGN}512${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="512" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 8 " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="8"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}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}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/daemonsync-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:8084${CL} \n" |
|
||||||
@ -1,254 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
clear |
|
||||||
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"` |
|
||||||
while true; do |
|
||||||
read -p "This will create a New Dashy 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=3 |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname dashy |
|
||||||
-net0 name=eth0,bridge=vmbr0,ip=dhcp |
|
||||||
-onboot 1 |
|
||||||
-cores 2 |
|
||||||
-memory 2048 |
|
||||||
-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 |
|
||||||
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/dashy-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 Dashy LXC to${CL} ${BL}$CTID${CL}. |
|
||||||
${BL}Dashy${CL} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:4000${CL} \n" |
|
||||||
@ -1,358 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="Dashy" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 CT 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}3${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="3" |
|
||||||
echo -e "${DGN}Using ${BGN}2${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="2" |
|
||||||
echo -e "${DGN}Using ${BGN}2048${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="2048" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 3 " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="3"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 2048 " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="2048"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/dashy-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:4000${CL} \n" |
|
||||||
@ -1,165 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
|
|
||||||
while true; do |
|
||||||
read -p "This will create a New Debian 11 LXC Container. Proceed(y/n)?" yn |
|
||||||
case $yn in |
|
||||||
[Yy]* ) break;; |
|
||||||
[Nn]* ) exit;; |
|
||||||
* ) echo "Please answer yes or no.";; |
|
||||||
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' |
|
||||||
CHECKMARK='\033[0;32m\xE2\x9C\x94\033[0m' |
|
||||||
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 [ ! -z ${MOUNT+x} ]; then |
|
||||||
pct unmount $CTID |
|
||||||
fi |
|
||||||
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 |
|
||||||
} |
|
||||||
function load_module() { |
|
||||||
if ! $(lsmod | grep -Fq $1); then |
|
||||||
modprobe $1 &>/dev/null || \ |
|
||||||
die "Failed to load '$1' module." |
|
||||||
fi |
|
||||||
MODULES_PATH=/etc/modules |
|
||||||
if ! $(grep -Fxq "$1" $MODULES_PATH); then |
|
||||||
echo "$1" >> $MODULES_PATH || \ |
|
||||||
die "Failed to add '$1' module to load at boot." |
|
||||||
fi |
|
||||||
} |
|
||||||
TEMP_DIR=$(mktemp -d) |
|
||||||
pushd $TEMP_DIR >/dev/null |
|
||||||
|
|
||||||
wget -qL https://raw.githubusercontent.com/tteck/Proxmox/main/setup/debian11_setup.sh |
|
||||||
|
|
||||||
load_module overlay |
|
||||||
|
|
||||||
while read -r line; do |
|
||||||
TAG=$(echo $line | awk '{print $1}') |
|
||||||
TYPE=$(echo $line | awk '{printf "%-10s", $2}') |
|
||||||
FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') |
|
||||||
ITEM=" Type: $TYPE Free: $FREE " |
|
||||||
OFFSET=2 |
|
||||||
if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then |
|
||||||
MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) |
|
||||||
fi |
|
||||||
STORAGE_MENU+=( "$TAG" "$ITEM" "OFF" ) |
|
||||||
done < <(pvesm status -content rootdir | awk 'NR>1') |
|
||||||
if [ $((${#STORAGE_MENU[@]}/3)) -eq 0 ]; then |
|
||||||
warn "'Container' needs to be selected for at least one storage location." |
|
||||||
die "Unable to detect valid storage location." |
|
||||||
elif [ $((${#STORAGE_MENU[@]}/3)) -eq 1 ]; then |
|
||||||
STORAGE=${STORAGE_MENU[0]} |
|
||||||
else |
|
||||||
while [ -z "${STORAGE:+x}" ]; do |
|
||||||
STORAGE=$(whiptail --title "Storage Pools" --radiolist \ |
|
||||||
"Which storage pool you would like to use for the container?\n\n" \ |
|
||||||
16 $(($MSG_MAX_LENGTH + 23)) 6 \ |
|
||||||
"${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit |
|
||||||
done |
|
||||||
fi |
|
||||||
info "Using '$STORAGE' for storage location." |
|
||||||
|
|
||||||
CTID=$(pvesh get /cluster/nextid) |
|
||||||
info "Container ID is $CTID." |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Updating LXC Template List... \e[0m" |
|
||||||
pveam update >/dev/null |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Downloading LXC Template... \e[0m" |
|
||||||
OSTYPE=debian |
|
||||||
OSVERSION=${OSTYPE}-11 |
|
||||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($OSVERSION.*\)/\1/p" | sort -t - -k 2 -V) |
|
||||||
TEMPLATE="${TEMPLATES[-1]}" |
|
||||||
pveam download local $TEMPLATE >/dev/null || |
|
||||||
die "A problem occured while downloading the LXC template." |
|
||||||
|
|
||||||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') |
|
||||||
case $STORAGE_TYPE in |
|
||||||
dir|nfs) |
|
||||||
DISK_EXT=".raw" |
|
||||||
DISK_REF="$CTID/" |
|
||||||
;; |
|
||||||
zfspool) |
|
||||||
DISK_PREFIX="subvol" |
|
||||||
DISK_FORMAT="subvol" |
|
||||||
;; |
|
||||||
esac |
|
||||||
DISK=${DISK_PREFIX:-vm}-${CTID}-disk-0${DISK_EXT-} |
|
||||||
ROOTFS=${STORAGE}:${DISK_REF-}${DISK} |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Creating LXC Container... \e[0m" |
|
||||||
DISK_SIZE=2G |
|
||||||
pvesm alloc $STORAGE $CTID $DISK $DISK_SIZE --format ${DISK_FORMAT:-raw} >/dev/null |
|
||||||
if [ "$STORAGE_TYPE" == "zfspool" ]; then |
|
||||||
warn "Some containers may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
else |
|
||||||
mkfs.ext4 $(pvesm path $ROOTFS) &>/dev/null |
|
||||||
fi |
|
||||||
ARCH=$(dpkg --print-architecture) |
|
||||||
HOSTNAME=debian11 |
|
||||||
TEMPLATE_STRING="local:vztmpl/${TEMPLATE}" |
|
||||||
pct create $CTID $TEMPLATE_STRING -arch $ARCH -features nesting=1 \ |
|
||||||
-hostname $HOSTNAME -net0 name=eth0,bridge=vmbr0,ip=dhcp -onboot 1 -cores 1 -memory 512\ |
|
||||||
-ostype $OSTYPE -rootfs $ROOTFS,size=$DISK_SIZE -storage $STORAGE >/dev/null |
|
||||||
|
|
||||||
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf |
|
||||||
cat <<EOF >> $LXC_CONFIG |
|
||||||
lxc.cgroup2.devices.allow: a |
|
||||||
lxc.cap.drop: |
|
||||||
EOF |
|
||||||
|
|
||||||
MOUNT=$(pct mount $CTID | cut -d"'" -f 2) |
|
||||||
ln -fs $(readlink /etc/localtime) ${MOUNT}/etc/localtime |
|
||||||
pct unmount $CTID && unset MOUNT |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Starting LXC Container... \e[0m" |
|
||||||
pct start $CTID |
|
||||||
pct push $CTID debian11_setup.sh /debian11_setup.sh -perms 755 |
|
||||||
pct exec $CTID /debian11_setup.sh |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
info "Successfully created a Debian 11 LXC Container to $CTID at IP Address ${IP}" |
|
||||||
@ -1,257 +0,0 @@ |
|||||||
#!/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[32m"` |
|
||||||
CL=`echo "\033[m"` |
|
||||||
APP="Debian" |
|
||||||
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 applications may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
fi |
|
||||||
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf |
|
||||||
cat <<EOF >> $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}. \n" |
|
||||||
@ -1,357 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
APP="Debian" |
|
||||||
var_disk="2" |
|
||||||
var_cpu="1" |
|
||||||
var_ram="512" |
|
||||||
var_os="debian" |
|
||||||
var_version="11" |
|
||||||
NEXTID=$(pvesh get /cluster/nextid) |
|
||||||
INTEGER='^[0-9]+$' |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
var_install="${NSAPP}-install" |
|
||||||
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}" |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
function msg_info() { |
|
||||||
local msg="$1" |
|
||||||
echo -ne " ${HOLD} ${YW}${msg}..." |
|
||||||
} |
|
||||||
|
|
||||||
function msg_ok() { |
|
||||||
local msg="$1" |
|
||||||
echo -e "${BFR} ${CM} ${GN}${msg}${CL}" |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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} |
|
||||||
_____ _ _ |
|
||||||
| __ \ | | (_) |
|
||||||
| | | | ___| |__ _ __ _ _ __ |
|
||||||
| | | |/ _ \ _ \| |/ _ | _ \ |
|
||||||
| |__| | __/ |_) | | (_| | | | | |
|
||||||
|_${YW}v3${RD}__/ \___|_.__/|_|\__,_|_| |_| |
|
||||||
${CL}" |
|
||||||
} |
|
||||||
|
|
||||||
header_info |
|
||||||
|
|
||||||
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 CT 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}$var_disk${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="$var_disk" |
|
||||||
echo -e "${DGN}Using ${BGN}$var_cpu${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="$var_cpu" |
|
||||||
echo -e "${DGN}Using ${BGN}$var_ram${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="$var_ram" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: $var_disk " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="$var_disk"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${YW}Allocate CPU cores, or Press [ENTER] for Default: $var_cpu " |
|
||||||
read CORE_COUNT |
|
||||||
if [ -z $CORE_COUNT ]; then CORE_COUNT="$var_cpu"; fi; |
|
||||||
echo -en "${DGN}Set Cores To ${BL}$CORE_COUNT${CL}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: $var_ram " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="$var_ram"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 |
|
||||||
|
|
||||||
export CTID=$CT_ID |
|
||||||
export PCT_OSTYPE=$var_os |
|
||||||
export PCT_OSVERSION=$var_version |
|
||||||
export PCT_DISK_SIZE=$DISK_SIZE |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname $HN |
|
||||||
-net0 name=eth0,bridge=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/$var_install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
@ -1,371 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
APP="deCONZ" |
|
||||||
var_disk="4" |
|
||||||
var_cpu="2" |
|
||||||
var_ram="1024" |
|
||||||
var_os="ubuntu" |
|
||||||
var_version="20.04" |
|
||||||
NEXTID=$(pvesh get /cluster/nextid) |
|
||||||
INTEGER='^[0-9]+$' |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
var_install="${NSAPP}-install" |
|
||||||
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}" |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
function msg_info() { |
|
||||||
local msg="$1" |
|
||||||
echo -ne " ${HOLD} ${YW}${msg}..." |
|
||||||
} |
|
||||||
|
|
||||||
function msg_ok() { |
|
||||||
local msg="$1" |
|
||||||
echo -e "${BFR} ${CM} ${GN}${msg}${CL}" |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${YW} |
|
||||||
_ _____ |
|
||||||
| | / ____| |
|
||||||
__| | v3_| | ___ _ __ ____ |
|
||||||
/ _ |/ _ \ | / _ \| _ \|_ / |
|
||||||
| (_| | __/ |___| (_) | | | |/ / |
|
||||||
\__,_|\___|\_____\___/|_| |_/___| |
|
||||||
${CL}" |
|
||||||
} |
|
||||||
|
|
||||||
header_info |
|
||||||
|
|
||||||
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}Privileged${CL}" |
|
||||||
CT_TYPE="0" |
|
||||||
echo -e "${DGN}Using CT Password ${BGN}Automatic Login${CL}" |
|
||||||
PW=" " |
|
||||||
echo -e "${DGN}Using CT 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}$var_disk${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="$var_disk" |
|
||||||
echo -e "${DGN}Using ${BGN}$var_cpu${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="$var_cpu" |
|
||||||
echo -e "${DGN}Using ${BGN}$var_ram${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="$var_ram" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 Unprivileged, or Press [ENTER] for Default: Privileged" |
|
||||||
read CT_TYPE1 |
|
||||||
if [ -z $CT_TYPE1 ]; then CT_TYPE1="Privileged" CT_TYPE="0"; |
|
||||||
echo -en "${DGN}Set CT Type ${BL}$CT_TYPE1${CL}" |
|
||||||
else |
|
||||||
CT_TYPE1="Unprivileged" |
|
||||||
CT_TYPE="1" |
|
||||||
echo -en "${DGN}Set CT Type ${BL}Unprivileged${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 CT 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 CT 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: $var_disk " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="$var_disk"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${YW}Allocate CPU cores, or Press [ENTER] for Default: $var_cpu " |
|
||||||
read CORE_COUNT |
|
||||||
if [ -z $CORE_COUNT ]; then CORE_COUNT="$var_cpu"; fi; |
|
||||||
echo -en "${DGN}Set Cores To ${BL}$CORE_COUNT${CL}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: $var_ram " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="$var_ram"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 |
|
||||||
|
|
||||||
export CTID=$CT_ID |
|
||||||
export PCT_OSTYPE=$var_os |
|
||||||
export PCT_OSVERSION=$var_version |
|
||||||
export PCT_DISK_SIZE=$DISK_SIZE |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname $HN |
|
||||||
-net0 name=eth0,bridge=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf |
|
||||||
cat <<EOF >> $LXC_CONFIG |
|
||||||
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/ttyACM0 dev/ttyACM0 none bind,optional,create=file |
|
||||||
lxc.mount.entry: /dev/ttyACM1 dev/ttyACM1 none bind,optional,create=file |
|
||||||
EOF |
|
||||||
|
|
||||||
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/$var_install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}${CL} \n" |
|
||||||
@ -1,312 +0,0 @@ |
|||||||
#!/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"` |
|
||||||
while true; do |
|
||||||
read -p "This will create a New Docker 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 "${BL} |
|
||||||
_____ _ |
|
||||||
| __ \ | | |
|
||||||
| | | | ___ ___| | _____ _ __ |
|
||||||
| | | |/ _ \ / __| |/ / _ \ __| |
|
||||||
| |__| | (_) | (__| < __/ | |
|
||||||
|_____/ \___/ \___|_|\_\___|_| |
|
||||||
${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 " ${RD} If Using ZFS, You Have Storage Driver Options${CL}\n" |
|
||||||
printf " ${RD} Non ZFS, Select Standard overlay2 Storage Driver${CL}\n" |
|
||||||
printf " ${YW} 1)${GN} Use fuse-overlayfs Storage Driver${CL}\n" |
|
||||||
printf " ${YW} 2)${GN} Use Standard overlay2 Storage Driver${CL}\n" |
|
||||||
|
|
||||||
printf "Please choose a Storage Driver 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 fuse-overlayfs Storage Driver"; |
|
||||||
STORAGE_DRIVER="fuse" |
|
||||||
break; |
|
||||||
;; |
|
||||||
2) clear; |
|
||||||
header_info; |
|
||||||
option_picked "Using overlay2 Storage Driver"; |
|
||||||
STORAGE_DRIVER=" " |
|
||||||
break; |
|
||||||
;; |
|
||||||
|
|
||||||
x)exit; |
|
||||||
;; |
|
||||||
\n)exit; |
|
||||||
;; |
|
||||||
*)clear; |
|
||||||
option_picked "Please choose a Storage Driver from the menu"; |
|
||||||
show_menu3; |
|
||||||
;; |
|
||||||
esac |
|
||||||
done |
|
||||||
show_menu4(){ |
|
||||||
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(){ |
|
||||||
message4=${@:-"${CL}Error: No message passed"} |
|
||||||
printf " ${YW}${message1}${CL}\n" |
|
||||||
printf " ${YW}${message2}${CL}\n" |
|
||||||
printf " ${YW}${message3}${CL}\n" |
|
||||||
printf " ${YW}${message4}${CL}\n" |
|
||||||
} |
|
||||||
show_menu4 |
|
||||||
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_menu4; |
|
||||||
;; |
|
||||||
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" ] && [ "$STORAGE_DRIVER" == " " ]; then |
|
||||||
FEATURES="nesting=1,keyctl=1" |
|
||||||
elif |
|
||||||
[ "$IM" == "1" ] && [ "$STORAGE_DRIVER" == "fuse" ]; then |
|
||||||
FEATURES="nesting=1,keyctl=1,fuse=1" |
|
||||||
elif |
|
||||||
[ "$IM" == "0" ] && [ "$STORAGE_DRIVER" == "fuse" ]; then |
|
||||||
FEATURES="nesting=1,fuse=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=4 |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname docker |
|
||||||
-net0 name=eth0,bridge=vmbr0,ip=dhcp |
|
||||||
-onboot 1 |
|
||||||
-cores 2 |
|
||||||
-memory 2048 |
|
||||||
-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 |
|
||||||
wget -qL -O fuse-overlayfs https://github.com/containers/fuse-overlayfs/releases/download/v1.8.2/fuse-overlayfs-x86_64 |
|
||||||
warn "Some containers may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
fi |
|
||||||
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf |
|
||||||
cat <<EOF >> $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" |
|
||||||
|
|
||||||
if [ "$STORAGE_TYPE" == "zfspool" ] && [ "$STORAGE_DRIVER" == "fuse" ]; then |
|
||||||
pct push $CTID fuse-overlayfs /usr/local/bin/fuse-overlayfs -perms 755 |
|
||||||
info "Using ${BL}fuse-overlayfs${CL} Storage Driver." |
|
||||||
else |
|
||||||
info "Using ${BL}overlay2${CL} Storage Driver." |
|
||||||
fi |
|
||||||
|
|
||||||
alias lxc-cmd="lxc-attach -n $CTID --" |
|
||||||
|
|
||||||
lxc-cmd bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/setup/docker-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 Docker LXC to${CL} ${BL}$CTID${CL}. \n" |
|
||||||
@ -1,361 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="Docker" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${BL} |
|
||||||
_____ _ |
|
||||||
| __ \ | | |
|
||||||
| | | | ___ ___| | _____ _ __ |
|
||||||
| |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 CT 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}4${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="4" |
|
||||||
echo -e "${DGN}Using ${BGN}2${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="2" |
|
||||||
echo -e "${DGN}Using ${BGN}2048${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="2048" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 4 " |
|
||||||
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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 2048 " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="2048"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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; |
|
||||||
} |
|
||||||
|
|
||||||
PVE_CHECK |
|
||||||
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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf |
|
||||||
cat <<EOF >> $LXC_CONFIG |
|
||||||
lxc.cgroup2.devices.allow: a |
|
||||||
lxc.cap.drop: |
|
||||||
EOF |
|
||||||
|
|
||||||
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/docker-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
@ -1,188 +0,0 @@ |
|||||||
#!/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"` |
|
||||||
|
|
||||||
while true; do |
|
||||||
read -p "This will create a New ESPHome LXC Container. 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 "${CL} |
|
||||||
______ _____ _____ _ _ ____ __ __ ______ |
|
||||||
| ____|/ ____| __ \| | | |/ __ \| \/ | ____| |
|
||||||
| |__ | (___ | |__) | |__| | | | | \ / | |__ |
|
||||||
| __| \___ \| ___/| __ | | | | |\/| | __| |
|
||||||
| |____ ____) | | | | | | |__| | | | | |____ |
|
||||||
|______|_____/|_| |_| |_|\____/|_| |_|______| |
|
||||||
|
|
||||||
${CL}" |
|
||||||
} |
|
||||||
|
|
||||||
header_info |
|
||||||
|
|
||||||
set -o errexit |
|
||||||
set -o errtrace |
|
||||||
set -o nounset |
|
||||||
set -o pipefail |
|
||||||
shopt -s expand_aliases |
|
||||||
alias die='EXIT=$? LINE=$LINENO error_exit' |
|
||||||
CHECKMARK='\033[0;32m\xE2\x9C\x94\033[0m' |
|
||||||
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 [ ! -z ${MOUNT+x} ]; then |
|
||||||
pct unmount $CTID |
|
||||||
fi |
|
||||||
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 |
|
||||||
} |
|
||||||
function load_module() { |
|
||||||
if ! $(lsmod | grep -Fq $1); then |
|
||||||
modprobe $1 &>/dev/null || \ |
|
||||||
die "Failed to load '$1' module." |
|
||||||
fi |
|
||||||
MODULES_PATH=/etc/modules |
|
||||||
if ! $(grep -Fxq "$1" $MODULES_PATH); then |
|
||||||
echo "$1" >> $MODULES_PATH || \ |
|
||||||
die "Failed to add '$1' module to load at boot." |
|
||||||
fi |
|
||||||
} |
|
||||||
TEMP_DIR=$(mktemp -d) |
|
||||||
pushd $TEMP_DIR >/dev/null |
|
||||||
|
|
||||||
wget -qL https://raw.githubusercontent.com/tteck/Proxmox/main/setup/esphome_setup.sh |
|
||||||
|
|
||||||
load_module overlay |
|
||||||
|
|
||||||
while read -r line; do |
|
||||||
TAG=$(echo $line | awk '{print $1}') |
|
||||||
TYPE=$(echo $line | awk '{printf "%-10s", $2}') |
|
||||||
FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') |
|
||||||
ITEM=" Type: $TYPE Free: $FREE " |
|
||||||
OFFSET=2 |
|
||||||
if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then |
|
||||||
MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) |
|
||||||
fi |
|
||||||
STORAGE_MENU+=( "$TAG" "$ITEM" "OFF" ) |
|
||||||
done < <(pvesm status -content rootdir | awk 'NR>1') |
|
||||||
if [ $((${#STORAGE_MENU[@]}/3)) -eq 0 ]; then |
|
||||||
warn "'Container' needs to be selected for at least one storage location." |
|
||||||
die "Unable to detect valid storage location." |
|
||||||
elif [ $((${#STORAGE_MENU[@]}/3)) -eq 1 ]; then |
|
||||||
STORAGE=${STORAGE_MENU[0]} |
|
||||||
else |
|
||||||
while [ -z "${STORAGE:+x}" ]; do |
|
||||||
STORAGE=$(whiptail --title "Storage Pools" --radiolist \ |
|
||||||
"Which storage pool you would like to use for the container?\n\n" \ |
|
||||||
16 $(($MSG_MAX_LENGTH + 23)) 6 \ |
|
||||||
"${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit |
|
||||||
done |
|
||||||
fi |
|
||||||
info "Using ${BL}$STORAGE${CL} for storage location." |
|
||||||
|
|
||||||
CTID=$(pvesh get /cluster/nextid) |
|
||||||
info "Container ID is ${BL}$CTID.${CL}" |
|
||||||
|
|
||||||
echo -en "${GN} Updating LXC Template List... " |
|
||||||
pveam update >/dev/null |
|
||||||
echo -e "${CM}${CL} \r" |
|
||||||
|
|
||||||
echo -en "${GN} Downloading LXC Template... " |
|
||||||
OSTYPE=debian |
|
||||||
OSVERSION=${OSTYPE}-11 |
|
||||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($OSVERSION.*\)/\1/p" | sort -t - -k 2 -V) |
|
||||||
TEMPLATE="${TEMPLATES[-1]}" |
|
||||||
pveam download local $TEMPLATE >/dev/null || |
|
||||||
die "A problem occured while downloading the LXC template." |
|
||||||
|
|
||||||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') |
|
||||||
case $STORAGE_TYPE in |
|
||||||
dir|nfs) |
|
||||||
DISK_EXT=".raw" |
|
||||||
DISK_REF="$CTID/" |
|
||||||
;; |
|
||||||
zfspool) |
|
||||||
DISK_PREFIX="subvol" |
|
||||||
DISK_FORMAT="subvol" |
|
||||||
;; |
|
||||||
esac |
|
||||||
DISK=${DISK_PREFIX:-vm}-${CTID}-disk-0${DISK_EXT-} |
|
||||||
ROOTFS=${STORAGE}:${DISK_REF-}${DISK} |
|
||||||
echo -e "${CM}${CL} \r" |
|
||||||
|
|
||||||
echo -en "${GN} Creating LXC Container... " |
|
||||||
DISK_SIZE=4G |
|
||||||
pvesm alloc $STORAGE $CTID $DISK $DISK_SIZE --format ${DISK_FORMAT:-raw} >/dev/null |
|
||||||
if [ "$STORAGE_TYPE" == "zfspool" ]; then |
|
||||||
warn "Some containers may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
else |
|
||||||
mkfs.ext4 $(pvesm path $ROOTFS) &>/dev/null |
|
||||||
fi |
|
||||||
ARCH=$(dpkg --print-architecture) |
|
||||||
HOSTNAME=esphome |
|
||||||
TEMPLATE_STRING="local:vztmpl/${TEMPLATE}" |
|
||||||
pct create $CTID $TEMPLATE_STRING -arch $ARCH -features nesting=1 \ |
|
||||||
-hostname $HOSTNAME -net0 name=eth0,bridge=vmbr0,ip=dhcp -onboot 1 -cores 2 -memory 1024 \ |
|
||||||
-ostype $OSTYPE -rootfs $ROOTFS,size=$DISK_SIZE -storage $STORAGE >/dev/null |
|
||||||
|
|
||||||
MOUNT=$(pct mount $CTID | cut -d"'" -f 2) |
|
||||||
ln -fs $(readlink /etc/localtime) ${MOUNT}/etc/localtime |
|
||||||
pct unmount $CTID && unset MOUNT |
|
||||||
echo -e "${CM}${CL} \r" |
|
||||||
|
|
||||||
echo -en "${GN} Starting LXC Container... " |
|
||||||
pct start $CTID |
|
||||||
pct push $CTID esphome_setup.sh /esphome_setup.sh -perms 755 |
|
||||||
echo -e "${CM}${CL} \r" |
|
||||||
pct exec $CTID /esphome_setup.sh |
|
||||||
|
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
info "Successfully created ESPHome LXC Container to ${BL}$CTID${CL}" |
|
||||||
echo -e "${CL} ESPHome should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:6052${CL} |
|
||||||
\n" |
|
||||||
@ -1,259 +0,0 @@ |
|||||||
#!/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="ESPHome" |
|
||||||
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=4 |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname $HN |
|
||||||
-net0 name=eth0,bridge=vmbr0,ip=dhcp |
|
||||||
-onboot 1 |
|
||||||
-cores 2 |
|
||||||
-memory 1024 |
|
||||||
-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 <<EOF >> $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}:6052${CL} \n" |
|
||||||
@ -1,357 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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 ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 CT 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}4${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="4" |
|
||||||
echo -e "${DGN}Using ${BGN}2${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="2" |
|
||||||
echo -e "${DGN}Using ${BGN}1024${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="1024" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 4 " |
|
||||||
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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}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}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:6052${CL} \n" |
|
||||||
@ -1,252 +0,0 @@ |
|||||||
#!/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"` |
|
||||||
while true; do |
|
||||||
read -p "This will create a New Grafana 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 "${YW} |
|
||||||
_____ __ |
|
||||||
/ ____| / _| |
|
||||||
| | __ _ __ __ _| |_ __ _ _ __ __ _ |
|
||||||
| | |_ | __/ _ | _/ _ | _ \ / _ | |
|
||||||
| |__| | | | (_| | || (_| | | | | (_| | |
|
||||||
\_____|_| \__,_|_| \__,_|_| |_|\__,_| |
|
||||||
|
|
||||||
${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 grafana |
|
||||||
-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 |
|
||||||
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/grafana-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 Grafana LXC to${CL} ${BL}$CTID${CL}. |
|
||||||
${BL}Grafana${CL} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:3000${CL} \n" |
|
||||||
@ -1,356 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="Grafana" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${YW} |
|
||||||
_____ __ |
|
||||||
/ ____| / _| |
|
||||||
| | __ _ __ __ _| |_ __ _ _ __ __ _ |
|
||||||
| | |_ | __/ _ | _/ _ | _ \ / _ | |
|
||||||
| |__| | | | (_| | || (_| | | | | (_| | |
|
||||||
\_____|_|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 CT 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}2${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="2" |
|
||||||
echo -e "${DGN}Using ${BGN}1${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="1" |
|
||||||
echo -e "${DGN}Using ${BGN}512${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="512" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 2 " |
|
||||||
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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}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}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/grafana-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:3000${CL} \n" |
|
||||||
@ -1,359 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
APP="grocy" |
|
||||||
var_disk="2" |
|
||||||
var_cpu="1" |
|
||||||
var_ram="512" |
|
||||||
var_os="debian" |
|
||||||
var_version="11" |
|
||||||
NEXTID=$(pvesh get /cluster/nextid) |
|
||||||
INTEGER='^[0-9]+$' |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
var_install="${NSAPP}-install" |
|
||||||
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}" |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
function msg_info() { |
|
||||||
local msg="$1" |
|
||||||
echo -ne " ${HOLD} ${YW}${msg}..." |
|
||||||
} |
|
||||||
|
|
||||||
function msg_ok() { |
|
||||||
local msg="$1" |
|
||||||
echo -e "${BFR} ${CM} ${GN}${msg}${CL}" |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${YW} |
|
||||||
__ _ _ __ ___ ___ _ _ |
|
||||||
/ _ | __/ _ \ / __| | | | |
|
||||||
| (_| | | | (_) | (__| |_| | |
|
||||||
\__, |_| \___/ \___|\__, | |
|
||||||
__/ | v3 __/ | |
|
||||||
|___/ |___/ |
|
||||||
${CL}" |
|
||||||
} |
|
||||||
|
|
||||||
header_info |
|
||||||
|
|
||||||
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 CT 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}$var_disk${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="$var_disk" |
|
||||||
echo -e "${DGN}Using ${BGN}$var_cpu${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="$var_cpu" |
|
||||||
echo -e "${DGN}Using ${BGN}$var_ram${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="$var_ram" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: $var_disk " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="$var_disk"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${YW}Allocate CPU cores, or Press [ENTER] for Default: $var_cpu " |
|
||||||
read CORE_COUNT |
|
||||||
if [ -z $CORE_COUNT ]; then CORE_COUNT="$var_cpu"; fi; |
|
||||||
echo -en "${DGN}Set Cores To ${BL}$CORE_COUNT${CL}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: $var_ram " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="$var_ram"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 |
|
||||||
|
|
||||||
export CTID=$CT_ID |
|
||||||
export PCT_OSTYPE=$var_os |
|
||||||
export PCT_OSVERSION=$var_version |
|
||||||
export PCT_DISK_SIZE=$DISK_SIZE |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname $HN |
|
||||||
-net0 name=eth0,bridge=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/$var_install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}${CL} \n" |
|
||||||
@ -1,259 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
PP=`echo "\e[1;35m"` |
|
||||||
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="Heimdall Dashboard" |
|
||||||
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 "${PP} |
|
||||||
_ _ _ _ _ _ _____ _ _ _ |
|
||||||
| | | | (_) | | | | | | __ \ | | | | | | |
|
||||||
| |__| | ___ _ _ __ ___ __| | __ _| | | | | | | __ _ ___| |__ | |__ ___ __ _ _ __ __| | |
|
||||||
| __ |/ _ \ | _ _ \ / _ |/ _ | | | | | | |/ _ / __| _ \| _ \ / _ \ / _ | __/ _ | |
|
||||||
| | | | __/ | | | | | | (_| | (_| | | | | |__| | (_| \__ \ | | | |_) | (_) | (_| | | | (_| | |
|
||||||
|_| |_|\___|_|_| |_| |_|\__,_|\__,_|_|_| |_____/ \__,_|___/_| |_|_.__/ \___/ \__,_|_| \__,_| |
|
||||||
${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 press [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 press [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 press [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 <<EOF >> $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}:7990${CL} \n" |
|
||||||
@ -1,357 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
NEXTID=$(pvesh get /cluster/nextid) |
|
||||||
INTEGER='^[0-9]+$' |
|
||||||
PP=`echo "\e[1;35m"` |
|
||||||
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="Heimdall Dashboard" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${PP} |
|
||||||
_ _ _ _ _ _ _____ _ _ _ |
|
||||||
| | | | (_) | | | | | | __ \ | | | | | | |
|
||||||
| |__| | ___ _ _ __ ___ __| | __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 CT 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}2${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="2" |
|
||||||
echo -e "${DGN}Using ${BGN}1${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="1" |
|
||||||
echo -e "${DGN}Using ${BGN}512${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="512" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 2 " |
|
||||||
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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}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}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/heimdalldashboard-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:7990${CL} \n" |
|
||||||
@ -1,176 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
|
|
||||||
while true; do |
|
||||||
read -p "This will create a New Home Assistant Container LXC. Proceed(y/n)?" yn |
|
||||||
case $yn in |
|
||||||
[Yy]* ) break;; |
|
||||||
[Nn]* ) exit;; |
|
||||||
* ) echo "Please answer yes or no.";; |
|
||||||
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' |
|
||||||
CHECKMARK='\033[0;32m\xE2\x9C\x94\033[0m' |
|
||||||
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 [ ! -z ${MOUNT+x} ]; then |
|
||||||
pct unmount $CTID |
|
||||||
fi |
|
||||||
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 |
|
||||||
} |
|
||||||
function load_module() { |
|
||||||
if ! $(lsmod | grep -Fq $1); then |
|
||||||
modprobe $1 &>/dev/null || \ |
|
||||||
die "Failed to load '$1' module." |
|
||||||
fi |
|
||||||
MODULES_PATH=/etc/modules |
|
||||||
if ! $(grep -Fxq "$1" $MODULES_PATH); then |
|
||||||
echo "$1" >> $MODULES_PATH || \ |
|
||||||
die "Failed to add '$1' module to load at boot." |
|
||||||
fi |
|
||||||
} |
|
||||||
TEMP_DIR=$(mktemp -d) |
|
||||||
pushd $TEMP_DIR >/dev/null |
|
||||||
|
|
||||||
wget -qL https://raw.githubusercontent.com/tteck/Proxmox/main/setup/ha_setup.sh |
|
||||||
|
|
||||||
load_module overlay |
|
||||||
|
|
||||||
while read -r line; do |
|
||||||
TAG=$(echo $line | awk '{print $1}') |
|
||||||
TYPE=$(echo $line | awk '{printf "%-10s", $2}') |
|
||||||
FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') |
|
||||||
ITEM=" Type: $TYPE Free: $FREE " |
|
||||||
OFFSET=2 |
|
||||||
if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then |
|
||||||
MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) |
|
||||||
fi |
|
||||||
STORAGE_MENU+=( "$TAG" "$ITEM" "OFF" ) |
|
||||||
done < <(pvesm status -content rootdir | awk 'NR>1') |
|
||||||
if [ $((${#STORAGE_MENU[@]}/3)) -eq 0 ]; then |
|
||||||
warn "'Container' needs to be selected for at least one storage location." |
|
||||||
die "Unable to detect valid storage location." |
|
||||||
elif [ $((${#STORAGE_MENU[@]}/3)) -eq 1 ]; then |
|
||||||
STORAGE=${STORAGE_MENU[0]} |
|
||||||
else |
|
||||||
while [ -z "${STORAGE:+x}" ]; do |
|
||||||
STORAGE=$(whiptail --title "Storage Pools" --radiolist \ |
|
||||||
"Which storage pool you would like to use for the container?\n\n" \ |
|
||||||
16 $(($MSG_MAX_LENGTH + 23)) 6 \ |
|
||||||
"${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit |
|
||||||
done |
|
||||||
fi |
|
||||||
info "Using '$STORAGE' for storage location." |
|
||||||
CTID=$(pvesh get /cluster/nextid) |
|
||||||
info "Container ID is $CTID." |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Updating LXC Template List... \e[0m" |
|
||||||
pveam update >/dev/null |
|
||||||
echo -e "${CHECKMARK} \e[1;92m Downloading LXC Template... \e[0m" |
|
||||||
OSTYPE=debian |
|
||||||
OSVERSION=${OSTYPE}-11 |
|
||||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($OSVERSION.*\)/\1/p" | sort -t - -k 2 -V) |
|
||||||
TEMPLATE="${TEMPLATES[-1]}" |
|
||||||
pveam download local $TEMPLATE >/dev/null || |
|
||||||
die "A problem occured while downloading the LXC template." |
|
||||||
|
|
||||||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') |
|
||||||
case $STORAGE_TYPE in |
|
||||||
dir|nfs) |
|
||||||
DISK_EXT=".raw" |
|
||||||
DISK_REF="$CTID/" |
|
||||||
;; |
|
||||||
zfspool) |
|
||||||
DISK_PREFIX="subvol" |
|
||||||
DISK_FORMAT="subvol" |
|
||||||
;; |
|
||||||
esac |
|
||||||
DISK=${DISK_PREFIX:-vm}-${CTID}-disk-0${DISK_EXT-} |
|
||||||
ROOTFS=${STORAGE}:${DISK_REF-}${DISK} |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Creating LXC Container... \e[0m" |
|
||||||
DISK_SIZE=8G |
|
||||||
pvesm alloc $STORAGE $CTID $DISK $DISK_SIZE --format ${DISK_FORMAT:-raw} >/dev/null |
|
||||||
if [ "$STORAGE_TYPE" == "zfspool" ]; then |
|
||||||
wget -qL -O fuse-overlayfs https://github.com/containers/fuse-overlayfs/releases/download/v1.8.2/fuse-overlayfs-x86_64 |
|
||||||
warn "Some containers may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
else |
|
||||||
mkfs.ext4 $(pvesm path $ROOTFS) &>/dev/null |
|
||||||
fi |
|
||||||
ARCH=$(dpkg --print-architecture) |
|
||||||
HOSTNAME=homeassistant |
|
||||||
TEMPLATE_STRING="local:vztmpl/${TEMPLATE}" |
|
||||||
if [ "$STORAGE_TYPE" == "zfspool" ]; then |
|
||||||
CT_FEATURES="fuse=1,keyctl=1,mknod=1,nesting=1" |
|
||||||
else |
|
||||||
CT_FEATURES="nesting=1" |
|
||||||
fi |
|
||||||
pct create $CTID $TEMPLATE_STRING -arch $ARCH -features $CT_FEATURES \ |
|
||||||
-hostname $HOSTNAME -net0 name=eth0,bridge=vmbr0,ip=dhcp -onboot 1 -cores 2 -memory 2048 \ |
|
||||||
-ostype $OSTYPE -rootfs $ROOTFS,size=$DISK_SIZE -storage $STORAGE >/dev/null |
|
||||||
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf |
|
||||||
cat <<EOF >> $LXC_CONFIG |
|
||||||
lxc.cgroup2.devices.allow: a |
|
||||||
lxc.cap.drop: |
|
||||||
EOF |
|
||||||
|
|
||||||
MOUNT=$(pct mount $CTID | cut -d"'" -f 2) |
|
||||||
ln -fs $(readlink /etc/localtime) ${MOUNT}/etc/localtime |
|
||||||
pct unmount $CTID && unset MOUNT |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Starting LXC Container... \e[0m" |
|
||||||
pct start $CTID |
|
||||||
if [ "$STORAGE_TYPE" == "zfspool" ]; then |
|
||||||
pct push $CTID fuse-overlayfs /usr/local/bin/fuse-overlayfs -perms 755 |
|
||||||
info "Using fuse-overlayfs." |
|
||||||
fi |
|
||||||
pct push $CTID ha_setup.sh /ha_setup.sh -perms 755 |
|
||||||
pct exec $CTID /ha_setup.sh |
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
info "Successfully Created Home Assistant Container LXC to $CTID." |
|
||||||
msg " |
|
||||||
|
|
||||||
Home Assistant should be reachable by going to the following URL. |
|
||||||
|
|
||||||
http://${IP}:8123 |
|
||||||
" |
|
||||||
@ -1,316 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
YW=`echo "\033[33m"` |
|
||||||
BL=`echo "\033[94m"` |
|
||||||
RD=`echo "\033[01;31m"` |
|
||||||
CM='\xE2\x9C\x94\033' |
|
||||||
GN=`echo "\033[1;92m"` |
|
||||||
CL=`echo "\033[m"` |
|
||||||
while true; do |
|
||||||
read -p "This will create a New Home Assistant Container 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 "${BL} |
|
||||||
_ _ _ _ |
|
||||||
| | (_) | | | | |
|
||||||
| |__ ___ _ __ ___ ___ __ _ ___ ___ _ ___| |_ __ _ _ __ | |_ |
|
||||||
| _ \ / _ \| _ _ \ / _ \/ _ / __/ __| / __| __/ _ | _ \| __| |
|
||||||
| | | | (_) | | | | | | __/ (_| \__ \__ \ \__ \ || (_| | | | | |_ |
|
||||||
|_| |_|\___/|_| |_| |_|\___|\__,_|___/___/_|___/\__\__,_|_| |_|\__| |
|
||||||
|
|
||||||
${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 " ${RD} If Using ZFS, You Have Storage Driver Options${CL}\n" |
|
||||||
printf " ${RD} Non ZFS, Select Standard overlay2 Storage Driver${CL}\n" |
|
||||||
printf " ${YW} 1)${GN} Use fuse-overlayfs Storage Driver${CL}\n" |
|
||||||
printf " ${YW} 2)${GN} Use Standard overlay2 Storage Driver${CL}\n" |
|
||||||
|
|
||||||
printf "Please choose a Storage Driver 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 fuse-overlayfs Storage Driver"; |
|
||||||
STORAGE_DRIVER="fuse" |
|
||||||
break; |
|
||||||
;; |
|
||||||
2) clear; |
|
||||||
header_info; |
|
||||||
option_picked "Using overlay2 Storage Driver"; |
|
||||||
STORAGE_DRIVER=" " |
|
||||||
break; |
|
||||||
;; |
|
||||||
|
|
||||||
x)exit; |
|
||||||
;; |
|
||||||
\n)exit; |
|
||||||
;; |
|
||||||
*)clear; |
|
||||||
option_picked "Please choose a Storage Driver from the menu"; |
|
||||||
show_menu3; |
|
||||||
;; |
|
||||||
esac |
|
||||||
done |
|
||||||
show_menu4(){ |
|
||||||
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(){ |
|
||||||
message4=${@:-"${CL}Error: No message passed"} |
|
||||||
printf " ${YW}${message1}${CL}\n" |
|
||||||
printf " ${YW}${message2}${CL}\n" |
|
||||||
printf " ${YW}${message3}${CL}\n" |
|
||||||
printf " ${YW}${message4}${CL}\n" |
|
||||||
} |
|
||||||
show_menu4 |
|
||||||
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_menu4; |
|
||||||
;; |
|
||||||
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" ] && [ "$STORAGE_DRIVER" == " " ]; then |
|
||||||
FEATURES="nesting=1,keyctl=1" |
|
||||||
elif |
|
||||||
[ "$IM" == "1" ] && [ "$STORAGE_DRIVER" == "fuse" ]; then |
|
||||||
FEATURES="nesting=1,keyctl=1,fuse=1" |
|
||||||
elif |
|
||||||
[ "$IM" == "0" ] && [ "$STORAGE_DRIVER" == "fuse" ]; then |
|
||||||
FEATURES="nesting=1,fuse=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=16 |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname homeassistant |
|
||||||
-net0 name=eth0,bridge=vmbr0,ip=dhcp |
|
||||||
-onboot 1 |
|
||||||
-cores 2 |
|
||||||
-memory 2048 |
|
||||||
-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 |
|
||||||
wget -qL -O fuse-overlayfs https://github.com/containers/fuse-overlayfs/releases/download/v1.8.2/fuse-overlayfs-x86_64 |
|
||||||
warn "Some containers may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
fi |
|
||||||
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf |
|
||||||
cat <<EOF >> $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" |
|
||||||
|
|
||||||
if [ "$STORAGE_TYPE" == "zfspool" ] && [ "$STORAGE_DRIVER" == "fuse" ]; then |
|
||||||
pct push $CTID fuse-overlayfs /usr/local/bin/fuse-overlayfs -perms 755 |
|
||||||
info "Using ${BL}fuse-overlayfs${CL} Storage Driver." |
|
||||||
else |
|
||||||
info "Using ${BL}overlay2${CL} Storage Driver." |
|
||||||
fi |
|
||||||
|
|
||||||
alias lxc-cmd="lxc-attach -n $CTID --" |
|
||||||
|
|
||||||
lxc-cmd bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/setup/homeassistant-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 Home Assistant Container LXC to${CL} ${BL}$CTID${CL}. |
|
||||||
${BL}Home Assistant${CL} should be reachable by going to the following URL. |
|
||||||
|
|
||||||
${BL}http://${IP}:8123${CL} \n" |
|
||||||
@ -1,365 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="Home Assistant" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${BL} |
|
||||||
_ _ _ _ |
|
||||||
| | ${YW}v3${CL}${BL} (_) | | | | |
|
||||||
| |__ ___ _ __ ___ ___ __ _ ___ ___ _ ___| |_ __ _ _ __ | |_ |
|
||||||
| _ \ / _ \| _ _ \ / _ \/ _ / __/ __| / __| __/ _ | _ \| __| |
|
||||||
| | | | (_) | | | | | | __/ (_| \__ \__ \ \__ \ || (_| | | | | |_ |
|
||||||
|_| |_|\___/|_| |_| |_|\___|\__,_|___/___/_|___/\__\__,_|_| |_|\__| |
|
||||||
${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 CT 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}16${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="16" |
|
||||||
echo -e "${DGN}Using ${BGN}2${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="2" |
|
||||||
echo -e "${DGN}Using ${BGN}2048${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="2048" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 16 " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="16"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 2048 " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="2048"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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; |
|
||||||
} |
|
||||||
|
|
||||||
PVE_CHECK |
|
||||||
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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf |
|
||||||
cat <<EOF >> $LXC_CONFIG |
|
||||||
lxc.cgroup2.devices.allow: a |
|
||||||
lxc.cap.drop: |
|
||||||
EOF |
|
||||||
|
|
||||||
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/homeassistant-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:8123${CL} |
|
||||||
Portainer should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:9000${CL}\n" |
|
||||||
@ -1,251 +0,0 @@ |
|||||||
#!/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"` |
|
||||||
while true; do |
|
||||||
read -p "This will create a New Homebridge 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 "${YW} |
|
||||||
_ _ ____ __ __ ______ ____ _____ _____ _____ _____ ______ |
|
||||||
| | | |/ __ \| \/ | ____| _ \| __ \|_ _| __ \ / ____| ____| |
|
||||||
| |__| | | | | \ / | |__ | |_) | |__) | | | | | | | | __| |__ |
|
||||||
| __ | | | | |\/| | __| | _ <| _ / | | | | | | | |_ | __| |
|
||||||
| | | | |__| | | | | |____| |_) | | \ \ _| |_| |__| | |__| | |____ |
|
||||||
|_| |_|\____/|_| |_|______|____/|_| \_\_____|_____/ \_____|______| |
|
||||||
${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=4 |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname homebridge |
|
||||||
-net0 name=eth0,bridge=vmbr0,ip=dhcp |
|
||||||
-onboot 1 |
|
||||||
-cores 1 |
|
||||||
-memory 1024 |
|
||||||
-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 |
|
||||||
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/homebridge-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 Homebridge LXC to${CL} ${BL}$CTID${CL}. |
|
||||||
${BL}Homebridge${CL} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:8581${CL} \n" |
|
||||||
@ -1,356 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="Homebridge" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${YW} |
|
||||||
_ _ ____ __ __ ______ ____ _____ _____ _____ _____ ______ |
|
||||||
| | | |/ __ \| \/ | ____| _ \| __ \|_ _| __ \ / ____| ____| |
|
||||||
| |__| | | | | \ / | |__ | |_) | |__) | | | | | | | | __| |__ |
|
||||||
| __ | | | | |\/| | __| | _ <| _ / | | | | | | | |_ | __| |
|
||||||
| | | | |__| | | | | |____| |_) | | \ \ _| |_| |__| | |__| | |____ |
|
||||||
|_|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 CT 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}4${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="4" |
|
||||||
echo -e "${DGN}Using ${BGN}1${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="1" |
|
||||||
echo -e "${DGN}Using ${BGN}1024${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="1024" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 4 " |
|
||||||
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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}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}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/homebridge-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "Homebridge should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:8581${CL} \n" |
|
||||||
@ -1,250 +0,0 @@ |
|||||||
#!/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"` |
|
||||||
while true; do |
|
||||||
read -p "This will create a New InfluxDB 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 "${YW} |
|
||||||
_____ __ _ _____ ____ |
|
||||||
|_ _| / _| | | __ \| _ \ |
|
||||||
| | _ __ | |_| |_ ___ _| | | | |_) | |
|
||||||
| | | _ \| _| | | | \ \/ / | | | _ < |
|
||||||
_| |_| | | | | | | |_| |> <| |__| | |_) | |
|
||||||
|_____|_| |_|_| |_|\__,_/_/\_\_____/|____/ |
|
||||||
with Telegraf |
|
||||||
${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=8 |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname influxdb |
|
||||||
-net0 name=eth0,bridge=vmbr0,ip=dhcp |
|
||||||
-onboot 1 |
|
||||||
-cores 2 |
|
||||||
-memory 2048 |
|
||||||
-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 |
|
||||||
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/influxdb-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 InfluxDB LXC to${CL} ${BL}$CTID${CL}. \n" |
|
||||||
@ -1,355 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="InfluxDB" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${YW} |
|
||||||
_____ __ _ _____ ____ |
|
||||||
|_ _| / _| | | __ \| _ \ |
|
||||||
| | _ __ | |_| |_ v3___ _| | | | |_) | |
|
||||||
| | | _ \| _| | | | \ \/ / | | | _ < |
|
||||||
_| |_| | | | | | | |_| |> <| |__| | |_) | |
|
||||||
|_____|_| |_|_| |_|\__,_/_/\_\_____/|____/ |
|
||||||
with Telegraf |
|
||||||
${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 CT 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}8${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="8" |
|
||||||
echo -e "${DGN}Using ${BGN}2${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="2" |
|
||||||
echo -e "${DGN}Using ${BGN}2048${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="2048" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 8 " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="8"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 2048 " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="2048"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/influxdb-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
@ -1,356 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="ioBroker" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${BL} |
|
||||||
_ ____ _ |
|
||||||
(_) | _ \ | | |
|
||||||
_ ___ | |_) |_ __ ___ | | _____ _ __ |
|
||||||
| |/ _ \| _ <| __/ _ \| |/ / _ \ __| |
|
||||||
| | (_) | |_) | | | (_) | < __/ | |
|
||||||
|_|\___/|____/|_|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 CT 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}8${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="8" |
|
||||||
echo -e "${DGN}Using ${BGN}2${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="2" |
|
||||||
echo -e "${DGN}Using ${BGN}2048${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="2048" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 8 " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="8"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 2048 " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="2048"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/iobroker-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:8081${CL} \n" |
|
||||||
@ -1,171 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
|
|
||||||
while true; do |
|
||||||
read -p "This will create a Jellyfin Media Server LXC Container. Proceed(y/n)?" yn |
|
||||||
case $yn in |
|
||||||
[Yy]* ) break;; |
|
||||||
[Nn]* ) exit;; |
|
||||||
* ) echo "Please answer yes or no.";; |
|
||||||
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 |
|
||||||
CHECKMARK='\033[0;32m\xE2\x9C\x94\033[0m' |
|
||||||
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 [ ! -z ${MOUNT+x} ]; then |
|
||||||
pct unmount $CTID |
|
||||||
fi |
|
||||||
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 |
|
||||||
} |
|
||||||
function load_module() { |
|
||||||
if ! $(lsmod | grep -Fq $1); then |
|
||||||
modprobe $1 &>/dev/null || \ |
|
||||||
die "Failed to load '$1' module." |
|
||||||
fi |
|
||||||
MODULES_PATH=/etc/modules |
|
||||||
if ! $(grep -Fxq "$1" $MODULES_PATH); then |
|
||||||
echo "$1" >> $MODULES_PATH || \ |
|
||||||
die "Failed to add '$1' module to load at boot." |
|
||||||
fi |
|
||||||
} |
|
||||||
TEMP_DIR=$(mktemp -d) |
|
||||||
pushd $TEMP_DIR >/dev/null |
|
||||||
|
|
||||||
wget -qL https://raw.githubusercontent.com/tteck/Proxmox/main/setup/jellyfin_setup.sh |
|
||||||
|
|
||||||
load_module overlay |
|
||||||
|
|
||||||
while read -r line; do |
|
||||||
TAG=$(echo $line | awk '{print $1}') |
|
||||||
TYPE=$(echo $line | awk '{printf "%-10s", $2}') |
|
||||||
FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') |
|
||||||
ITEM=" Type: $TYPE Free: $FREE " |
|
||||||
OFFSET=2 |
|
||||||
if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then |
|
||||||
MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) |
|
||||||
fi |
|
||||||
STORAGE_MENU+=( "$TAG" "$ITEM" "OFF" ) |
|
||||||
done < <(pvesm status -content rootdir | awk 'NR>1') |
|
||||||
if [ $((${#STORAGE_MENU[@]}/3)) -eq 0 ]; then |
|
||||||
warn "'Container' needs to be selected for at least one storage location." |
|
||||||
die "Unable to detect valid storage location." |
|
||||||
elif [ $((${#STORAGE_MENU[@]}/3)) -eq 1 ]; then |
|
||||||
STORAGE=${STORAGE_MENU[0]} |
|
||||||
else |
|
||||||
while [ -z "${STORAGE:+x}" ]; do |
|
||||||
STORAGE=$(whiptail --title "Storage Pools" --radiolist \ |
|
||||||
"Which storage pool you would like to use for the container?\n\n" \ |
|
||||||
16 $(($MSG_MAX_LENGTH + 23)) 6 \ |
|
||||||
"${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit |
|
||||||
done |
|
||||||
fi |
|
||||||
info "Using '$STORAGE' for Storage Location." |
|
||||||
|
|
||||||
CTID=$(pvesh get /cluster/nextid) |
|
||||||
info "Container ID is $CTID." |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Updating LXC Template List... \e[0m" |
|
||||||
pveam update >/dev/null |
|
||||||
echo -e "${CHECKMARK} \e[1;92m Downloading LXC Template... \e[0m" |
|
||||||
OSTYPE=ubuntu |
|
||||||
OSVERSION=${OSTYPE}-20.04 |
|
||||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($OSVERSION.*\)/\1/p" | sort -t - -k 2 -V) |
|
||||||
TEMPLATE="${TEMPLATES[-1]}" |
|
||||||
pveam download local $TEMPLATE >/dev/null || |
|
||||||
die "A problem occured while downloading the LXC template." |
|
||||||
|
|
||||||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') |
|
||||||
case $STORAGE_TYPE in |
|
||||||
dir|nfs) |
|
||||||
DISK_EXT=".raw" |
|
||||||
DISK_REF="$CTID/" |
|
||||||
;; |
|
||||||
zfspool) |
|
||||||
DISK_PREFIX="subvol" |
|
||||||
DISK_FORMAT="subvol" |
|
||||||
;; |
|
||||||
esac |
|
||||||
DISK=${DISK_PREFIX:-vm}-${CTID}-disk-0${DISK_EXT-} |
|
||||||
ROOTFS=${STORAGE}:${DISK_REF-}${DISK} |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Creating LXC Container... \e[0m" |
|
||||||
DISK_SIZE=8G |
|
||||||
pvesm alloc $STORAGE $CTID $DISK $DISK_SIZE --format ${DISK_FORMAT:-raw} >/dev/null |
|
||||||
if [ "$STORAGE_TYPE" == "zfspool" ]; then |
|
||||||
warn "Some containers may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
else |
|
||||||
mkfs.ext4 $(pvesm path $ROOTFS) &>/dev/null |
|
||||||
fi |
|
||||||
ARCH=$(dpkg --print-architecture) |
|
||||||
HOSTNAME=jellyfin |
|
||||||
TEMPLATE_STRING="local:vztmpl/${TEMPLATE}" |
|
||||||
pct create $CTID $TEMPLATE_STRING -arch $ARCH -features nesting=1 \ |
|
||||||
-hostname $HOSTNAME -net0 name=eth0,bridge=vmbr0,ip=dhcp -onboot 1 -cores 2 -memory 2048\ |
|
||||||
-ostype $OSTYPE -rootfs $ROOTFS,size=$DISK_SIZE -storage $STORAGE >/dev/null |
|
||||||
|
|
||||||
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf |
|
||||||
cat <<EOF >> $LXC_CONFIG |
|
||||||
lxc.cgroup2.devices.allow: a |
|
||||||
lxc.cap.drop: |
|
||||||
lxc.cgroup2.devices.allow: c 226:0 rwm |
|
||||||
lxc.cgroup2.devices.allow: c 226:128 rwm |
|
||||||
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir |
|
||||||
lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file |
|
||||||
lxc.mount.entry: /dev/dri/renderD128 dev/renderD128 none bind,optional,create=file |
|
||||||
EOF |
|
||||||
|
|
||||||
MOUNT=$(pct mount $CTID | cut -d"'" -f 2) |
|
||||||
ln -fs $(readlink /etc/localtime) ${MOUNT}/etc/localtime |
|
||||||
pct unmount $CTID && unset MOUNT |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Starting LXC Container... \e[0m" |
|
||||||
pct start $CTID |
|
||||||
pct push $CTID jellyfin_setup.sh /jellyfin_setup.sh -perms 755 |
|
||||||
pct exec $CTID /jellyfin_setup.sh |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
info "Successfully Created Jellyfin Media Server LXC to $CTID." |
|
||||||
echo -e "\e[1;92m Jellyfin Media Server should be reachable by going to the following URL. |
|
||||||
http://${IP}:8096 |
|
||||||
\e[0m" |
|
||||||
@ -1,370 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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}" |
|
||||||
CROSS="${RD}✗${CL}" |
|
||||||
APP="Jellyfin" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${DGN} |
|
||||||
_ _ _ __ _ |
|
||||||
| | | | | / _(_) |
|
||||||
| | ___| | |_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}Privileged${CL}" |
|
||||||
CT_TYPE="0" |
|
||||||
echo -e "${DGN}Using CT Password ${BGN}Automatic Login${CL}" |
|
||||||
PW=" " |
|
||||||
echo -e "${DGN}Using CT 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}8${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="8" |
|
||||||
echo -e "${DGN}Using ${BGN}2${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="2" |
|
||||||
echo -e "${DGN}Using ${BGN}2048${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="2048" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 ${CROSS}${YW}Unprivileged, or Press [ENTER] for Default: Privileged" |
|
||||||
read CT_TYPE1 |
|
||||||
if [ -z $CT_TYPE1 ]; then CT_TYPE1="Privileged" CT_TYPE="0"; |
|
||||||
echo -en "${DGN}Set CT Type ${BL}$CT_TYPE1${CL}" |
|
||||||
else |
|
||||||
CT_TYPE1="Unprivileged" |
|
||||||
CT_TYPE="1" |
|
||||||
echo -en "${DGN}Set CT Type ${BL}Unprivileged${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 CT 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 CT 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: 8 " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="8"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 2048 " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="2048"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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; |
|
||||||
} |
|
||||||
|
|
||||||
PVE_CHECK |
|
||||||
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=ubuntu |
|
||||||
export PCT_OSVERSION=20.04 |
|
||||||
export PCT_DISK_SIZE=$DISK_SIZE |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname $HN |
|
||||||
-net0 name=eth0,bridge=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf |
|
||||||
cat <<EOF >> $LXC_CONFIG |
|
||||||
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/renderD128 none bind,optional,create=file |
|
||||||
EOF |
|
||||||
|
|
||||||
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/jellyfin-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "Jellyfin Media Server should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:8096${CL}\n" |
|
||||||
@ -1,360 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
APP="Keycloak" |
|
||||||
var_disk="4" |
|
||||||
var_cpu="2" |
|
||||||
var_ram="2048" |
|
||||||
var_os="debian" |
|
||||||
var_version="11" |
|
||||||
NEXTID=$(pvesh get /cluster/nextid) |
|
||||||
INTEGER='^[0-9]+$' |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
var_install="${NSAPP}-install" |
|
||||||
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}" |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
function msg_info() { |
|
||||||
local msg="$1" |
|
||||||
echo -ne " ${HOLD} ${YW}${msg}..." |
|
||||||
} |
|
||||||
|
|
||||||
function msg_ok() { |
|
||||||
local msg="$1" |
|
||||||
echo -e "${BFR} ${CM} ${GN}${msg}${CL}" |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 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 CT 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}$var_disk${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="$var_disk" |
|
||||||
echo -e "${DGN}Using ${BGN}$var_cpu${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="$var_cpu" |
|
||||||
echo -e "${DGN}Using ${BGN}$var_ram${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="$var_ram" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: $var_disk " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="$var_disk"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${YW}Allocate CPU cores, or Press [ENTER] for Default: $var_cpu " |
|
||||||
read CORE_COUNT |
|
||||||
if [ -z $CORE_COUNT ]; then CORE_COUNT="$var_cpu"; fi; |
|
||||||
echo -en "${DGN}Set Cores To ${BL}$CORE_COUNT${CL}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: $var_ram " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="$var_ram"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 |
|
||||||
|
|
||||||
export CTID=$CT_ID |
|
||||||
export PCT_OSTYPE=$var_os |
|
||||||
export PCT_OSVERSION=$var_version |
|
||||||
export PCT_DISK_SIZE=$DISK_SIZE |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname $HN |
|
||||||
-net0 name=eth0,bridge=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/$var_install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:8080${CL} \n" |
|
||||||
@ -1,359 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
APP="MagicMirror" |
|
||||||
var_disk="3" |
|
||||||
var_cpu="1" |
|
||||||
var_ram="512" |
|
||||||
var_os="debian" |
|
||||||
var_version="11" |
|
||||||
NEXTID=$(pvesh get /cluster/nextid) |
|
||||||
INTEGER='^[0-9]+$' |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
var_install="${NSAPP}-install" |
|
||||||
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}" |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
function msg_info() { |
|
||||||
local msg="$1" |
|
||||||
echo -ne " ${HOLD} ${YW}${msg}..." |
|
||||||
} |
|
||||||
|
|
||||||
function msg_ok() { |
|
||||||
local msg="$1" |
|
||||||
echo -e "${BFR} ${CM} ${GN}${msg}${CL}" |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${BL} |
|
||||||
__ __ _____ _____ _____ __ __ _____ _____ _____ ____ _____ |
|
||||||
| \/ | /\ / ____|_ _/ ____| \/ |_ _| __ \| __ \ / __ \| __ \ |
|
||||||
| \ / | / \ | | __ | || | | \ / | | | | |__) | |__) | | | | |__) | |
|
||||||
| |\/| | / /\ \| | |_ | | || | v3 | |\/| | | | | _ /| _ /| | | | _ / |
|
||||||
| | | |/ ____ \ |__| |_| || |____| | | |_| |_| | \ \| | \ \| |__| | | \ \ |
|
||||||
|_| |_/_/ \_\_____|_____\_____|_| |_|_____|_| \_\_| \_\ ____/|_| \_\ |
|
||||||
${CL}" |
|
||||||
} |
|
||||||
|
|
||||||
header_info |
|
||||||
|
|
||||||
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 CT 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}$var_disk${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="$var_disk" |
|
||||||
echo -e "${DGN}Using ${BGN}$var_cpu${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="$var_cpu" |
|
||||||
echo -e "${DGN}Using ${BGN}$var_ram${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="$var_ram" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: $var_disk " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="$var_disk"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${YW}Allocate CPU cores, or Press [ENTER] for Default: $var_cpu " |
|
||||||
read CORE_COUNT |
|
||||||
if [ -z $CORE_COUNT ]; then CORE_COUNT="$var_cpu"; fi; |
|
||||||
echo -en "${DGN}Set Cores To ${BL}$CORE_COUNT${CL}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: $var_ram " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="$var_ram"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 |
|
||||||
|
|
||||||
export CTID=$CT_ID |
|
||||||
export PCT_OSTYPE=$var_os |
|
||||||
export PCT_OSVERSION=$var_version |
|
||||||
export PCT_DISK_SIZE=$DISK_SIZE |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname $HN |
|
||||||
-net0 name=eth0,bridge=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/$var_install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:8080${CL} \n" |
|
||||||
@ -1,168 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
|
|
||||||
while true; do |
|
||||||
read -p "This will create a New Mariadb LXC Container. Proceed(y/n)?" yn |
|
||||||
case $yn in |
|
||||||
[Yy]* ) break;; |
|
||||||
[Nn]* ) exit;; |
|
||||||
* ) echo "Please answer yes or no.";; |
|
||||||
esac |
|
||||||
done |
|
||||||
clear |
|
||||||
set -o errexit |
|
||||||
set -o errtrace |
|
||||||
set -o nounset |
|
||||||
set -o pipefail |
|
||||||
shopt -s expand_aliases |
|
||||||
alias die='EXIT=$? LINE=$LINENO error_exit' |
|
||||||
BL=`echo "\033[36m"` |
|
||||||
CM='\xE2\x9C\x94\033' |
|
||||||
GN=`echo "\033[1;92m"` |
|
||||||
CL=`echo "\033[m"` |
|
||||||
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 [ ! -z ${MOUNT+x} ]; then |
|
||||||
pct unmount $CTID |
|
||||||
fi |
|
||||||
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 |
|
||||||
} |
|
||||||
function load_module() { |
|
||||||
if ! $(lsmod | grep -Fq $1); then |
|
||||||
modprobe $1 &>/dev/null || \ |
|
||||||
die "Failed to load '$1' module." |
|
||||||
fi |
|
||||||
MODULES_PATH=/etc/modules |
|
||||||
if ! $(grep -Fxq "$1" $MODULES_PATH); then |
|
||||||
echo "$1" >> $MODULES_PATH || \ |
|
||||||
die "Failed to add '$1' module to load at boot." |
|
||||||
fi |
|
||||||
} |
|
||||||
TEMP_DIR=$(mktemp -d) |
|
||||||
pushd $TEMP_DIR >/dev/null |
|
||||||
|
|
||||||
wget -qL https://raw.githubusercontent.com/tteck/Proxmox/main/setup/mariadb_setup.sh |
|
||||||
|
|
||||||
load_module overlay |
|
||||||
|
|
||||||
while read -r line; do |
|
||||||
TAG=$(echo $line | awk '{print $1}') |
|
||||||
TYPE=$(echo $line | awk '{printf "%-10s", $2}') |
|
||||||
FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') |
|
||||||
ITEM=" Type: $TYPE Free: $FREE " |
|
||||||
OFFSET=2 |
|
||||||
if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then |
|
||||||
MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) |
|
||||||
fi |
|
||||||
STORAGE_MENU+=( "$TAG" "$ITEM" "OFF" ) |
|
||||||
done < <(pvesm status -content rootdir | awk 'NR>1') |
|
||||||
if [ $((${#STORAGE_MENU[@]}/3)) -eq 0 ]; then |
|
||||||
warn "'Container' needs to be selected for at least one storage location." |
|
||||||
die "Unable to detect valid storage location." |
|
||||||
elif [ $((${#STORAGE_MENU[@]}/3)) -eq 1 ]; then |
|
||||||
STORAGE=${STORAGE_MENU[0]} |
|
||||||
else |
|
||||||
while [ -z "${STORAGE:+x}" ]; do |
|
||||||
STORAGE=$(whiptail --title "Storage Pools" --radiolist \ |
|
||||||
"Which storage pool you would like to use for the container?\n\n" \ |
|
||||||
16 $(($MSG_MAX_LENGTH + 23)) 6 \ |
|
||||||
"${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit |
|
||||||
done |
|
||||||
fi |
|
||||||
info "Using ${BL}${STORAGE}${CL} for Storage Location." |
|
||||||
|
|
||||||
CTID=$(pvesh get /cluster/nextid) |
|
||||||
info "Container ID is ${BL}${CTID}${CL}." |
|
||||||
|
|
||||||
echo -en "${GN} Updating LXC Template List... " |
|
||||||
pveam update >/dev/null |
|
||||||
echo -e "${CM}${CL} \r" |
|
||||||
|
|
||||||
echo -en "${GN} Downloading LXC Template... " |
|
||||||
OSTYPE=debian |
|
||||||
OSVERSION=${OSTYPE}-11 |
|
||||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($OSVERSION.*\)/\1/p" | sort -t - -k 2 -V) |
|
||||||
TEMPLATE="${TEMPLATES[-1]}" |
|
||||||
pveam download local $TEMPLATE >/dev/null || |
|
||||||
die "A problem occured while downloading the LXC template." |
|
||||||
|
|
||||||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') |
|
||||||
case $STORAGE_TYPE in |
|
||||||
dir|nfs) |
|
||||||
DISK_EXT=".raw" |
|
||||||
DISK_REF="$CTID/" |
|
||||||
;; |
|
||||||
zfspool) |
|
||||||
DISK_PREFIX="subvol" |
|
||||||
DISK_FORMAT="subvol" |
|
||||||
;; |
|
||||||
esac |
|
||||||
DISK=${DISK_PREFIX:-vm}-${CTID}-disk-0${DISK_EXT-} |
|
||||||
ROOTFS=${STORAGE}:${DISK_REF-}${DISK} |
|
||||||
echo -e "${CM}${CL} \r" |
|
||||||
|
|
||||||
echo -en "${GN} Creating LXC Container... " |
|
||||||
DISK_SIZE=4G |
|
||||||
pvesm alloc $STORAGE $CTID $DISK $DISK_SIZE --format ${DISK_FORMAT:-raw} >/dev/null |
|
||||||
if [ "$STORAGE_TYPE" == "zfspool" ]; then |
|
||||||
warn "Some containers may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
else |
|
||||||
mkfs.ext4 $(pvesm path $ROOTFS) &>/dev/null |
|
||||||
fi |
|
||||||
ARCH=$(dpkg --print-architecture) |
|
||||||
HOSTNAME=mariadb |
|
||||||
TEMPLATE_STRING="local:vztmpl/${TEMPLATE}" |
|
||||||
pct create $CTID $TEMPLATE_STRING -arch $ARCH -features nesting=1 \ |
|
||||||
-hostname $HOSTNAME -net0 name=eth0,bridge=vmbr0,ip=dhcp -onboot 1 -cores 1 -memory 1024 \ |
|
||||||
-ostype $OSTYPE -rootfs $ROOTFS,size=$DISK_SIZE -storage $STORAGE >/dev/null |
|
||||||
|
|
||||||
MOUNT=$(pct mount $CTID | cut -d"'" -f 2) |
|
||||||
ln -fs $(readlink /etc/localtime) ${MOUNT}/etc/localtime |
|
||||||
pct unmount $CTID && unset MOUNT |
|
||||||
echo -e "${CM}${CL} \r" |
|
||||||
|
|
||||||
echo -en "${GN} Starting LXC Container... " |
|
||||||
pct start $CTID |
|
||||||
pct push $CTID mariadb_setup.sh /mariadb_setup.sh -perms 755 |
|
||||||
echo -e "${CM}${CL} \r" |
|
||||||
pct exec $CTID /mariadb_setup.sh |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
info "${GN} Successfully created a MariaDB LXC Container to ${BL}${CTID}${CL}" |
|
||||||
echo -e "${CL} Adminer should be reachable by going to the following URL. |
|
||||||
${BL} http://${IP}/adminer/ ${CL}" |
|
||||||
@ -1,252 +0,0 @@ |
|||||||
#!/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"` |
|
||||||
while true; do |
|
||||||
read -p "This will create a New Mariadb 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 "${BL} |
|
||||||
__ __ _ _ _ |
|
||||||
| \/ | (_) | | | |
|
||||||
| \ / | __ _ _ __ _ __ _ __| | |__ |
|
||||||
| |\/| |/ _ | __| |/ _ |/ _ | _ \ |
|
||||||
| | | | (_| | | | | (_| | (_| | |_) | |
|
||||||
|_| |_|\__,_|_| |_|\__,_|\__,_|_.__/ |
|
||||||
|
|
||||||
${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=4 |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname mariadb |
|
||||||
-net0 name=eth0,bridge=vmbr0,ip=dhcp |
|
||||||
-onboot 1 |
|
||||||
-cores 1 |
|
||||||
-memory 1024 |
|
||||||
-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 |
|
||||||
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/mariadb-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 Mariadb LXC to${CL} ${BL}$CTID${CL}. |
|
||||||
${BL}Adminer${CL} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}/adminer/${CL} \n" |
|
||||||
@ -1,356 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="MariaDB" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${BL} |
|
||||||
__ __ _ _ _ |
|
||||||
| \/ | (_) | | | |
|
||||||
| \ / | __ _ _ __ _ __ _ __| | |__ |
|
||||||
| |\/| |/ _ | __| |/ _ |/ _ | _ \ |
|
||||||
| | | | (_| | | | | (_| | (_| | |_) | |
|
||||||
|_| |_|\__,_|_|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 CT 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}4${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="4" |
|
||||||
echo -e "${DGN}Using ${BGN}1${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="1" |
|
||||||
echo -e "${DGN}Using ${BGN}1024${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="1024" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 4 " |
|
||||||
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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}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}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/mariadb-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "Adminer should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}/adminer/${CL} \n" |
|
||||||
@ -1,258 +0,0 @@ |
|||||||
#!/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="MeshCentral" |
|
||||||
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 "${BL} |
|
||||||
__ __ _ _____ _ _ |
|
||||||
| \/ | | | / ____| | | | | |
|
||||||
| \ / | ___ ___| |__ | | ___ _ __ | |_ _ __ __ _| | |
|
||||||
| |\/| |/ _ \/ __| _ \| | / _ \ _ \| __| __/ _ | | |
|
||||||
| | | | __/\__ \ | | | |___| __/ | | | |_| | | (_| | | |
|
||||||
|_| |_|\___||___/_| |_|\_____\___|_| |_|\__|_| \__,_|_| |
|
||||||
${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 applications may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
fi |
|
||||||
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf |
|
||||||
cat <<EOF >> $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}. |
|
||||||
${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}${CL} \n" |
|
||||||
@ -1,356 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="MeshCentral" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${BL} |
|
||||||
__ __ _ _____ _ _ |
|
||||||
| \/ | | | / ____| | | | | |
|
||||||
| \ / | ___ ___| |__ | | ___ _ __ | |_ _ __ __ _| | |
|
||||||
| |\/| |/ _ \/ __| _ \| | 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 CT 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}2${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="2" |
|
||||||
echo -e "${DGN}Using ${BGN}1${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="1" |
|
||||||
echo -e "${DGN}Using ${BGN}512${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="512" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 2 " |
|
||||||
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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}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}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/meshcentral-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}${CL} \n" |
|
||||||
@ -1,168 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
|
|
||||||
while true; do |
|
||||||
read -p "This will create a New MotionEye NVR LXC Container. Proceed(y/n)?" yn |
|
||||||
case $yn in |
|
||||||
[Yy]* ) break;; |
|
||||||
[Nn]* ) exit;; |
|
||||||
* ) echo "Please answer yes or no.";; |
|
||||||
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' |
|
||||||
CHECKMARK='\033[0;32m\xE2\x9C\x94\033[0m' |
|
||||||
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 [ ! -z ${MOUNT+x} ]; then |
|
||||||
pct unmount $CTID |
|
||||||
fi |
|
||||||
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 |
|
||||||
} |
|
||||||
function load_module() { |
|
||||||
if ! $(lsmod | grep -Fq $1); then |
|
||||||
modprobe $1 &>/dev/null || \ |
|
||||||
die "Failed to load '$1' module." |
|
||||||
fi |
|
||||||
MODULES_PATH=/etc/modules |
|
||||||
if ! $(grep -Fxq "$1" $MODULES_PATH); then |
|
||||||
echo "$1" >> $MODULES_PATH || \ |
|
||||||
die "Failed to add '$1' module to load at boot." |
|
||||||
fi |
|
||||||
} |
|
||||||
TEMP_DIR=$(mktemp -d) |
|
||||||
pushd $TEMP_DIR >/dev/null |
|
||||||
|
|
||||||
wget -qL https://raw.githubusercontent.com/tteck/Proxmox/main/setup/motioneye_setup.sh |
|
||||||
|
|
||||||
load_module overlay |
|
||||||
|
|
||||||
while read -r line; do |
|
||||||
TAG=$(echo $line | awk '{print $1}') |
|
||||||
TYPE=$(echo $line | awk '{printf "%-10s", $2}') |
|
||||||
FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') |
|
||||||
ITEM=" Type: $TYPE Free: $FREE " |
|
||||||
OFFSET=2 |
|
||||||
if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then |
|
||||||
MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) |
|
||||||
fi |
|
||||||
STORAGE_MENU+=( "$TAG" "$ITEM" "OFF" ) |
|
||||||
done < <(pvesm status -content rootdir | awk 'NR>1') |
|
||||||
if [ $((${#STORAGE_MENU[@]}/3)) -eq 0 ]; then |
|
||||||
warn "'Container' needs to be selected for at least one storage location." |
|
||||||
die "Unable to detect valid storage location." |
|
||||||
elif [ $((${#STORAGE_MENU[@]}/3)) -eq 1 ]; then |
|
||||||
STORAGE=${STORAGE_MENU[0]} |
|
||||||
else |
|
||||||
while [ -z "${STORAGE:+x}" ]; do |
|
||||||
STORAGE=$(whiptail --title "Storage Pools" --radiolist \ |
|
||||||
"Which storage pool you would like to use for the container?\n\n" \ |
|
||||||
16 $(($MSG_MAX_LENGTH + 23)) 6 \ |
|
||||||
"${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit |
|
||||||
done |
|
||||||
fi |
|
||||||
info "Using '$STORAGE' for storage location." |
|
||||||
|
|
||||||
CTID=$(pvesh get /cluster/nextid) |
|
||||||
info "Container ID is $CTID." |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Updating LXC Template List... \e[0m" |
|
||||||
pveam update >/dev/null |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Downloading LXC Template... \e[0m" |
|
||||||
OSTYPE=debian |
|
||||||
OSVERSION=${OSTYPE}-11 |
|
||||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($OSVERSION.*\)/\1/p" | sort -t - -k 2 -V) |
|
||||||
TEMPLATE="${TEMPLATES[-1]}" |
|
||||||
pveam download local $TEMPLATE >/dev/null || |
|
||||||
die "A problem occured while downloading the LXC template." |
|
||||||
|
|
||||||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') |
|
||||||
case $STORAGE_TYPE in |
|
||||||
dir|nfs) |
|
||||||
DISK_EXT=".raw" |
|
||||||
DISK_REF="$CTID/" |
|
||||||
;; |
|
||||||
zfspool) |
|
||||||
DISK_PREFIX="subvol" |
|
||||||
DISK_FORMAT="subvol" |
|
||||||
;; |
|
||||||
esac |
|
||||||
DISK=${DISK_PREFIX:-vm}-${CTID}-disk-0${DISK_EXT-} |
|
||||||
ROOTFS=${STORAGE}:${DISK_REF-}${DISK} |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Creating LXC Container... \e[0m" |
|
||||||
DISK_SIZE=8G |
|
||||||
pvesm alloc $STORAGE $CTID $DISK $DISK_SIZE --format ${DISK_FORMAT:-raw} >/dev/null |
|
||||||
if [ "$STORAGE_TYPE" == "zfspool" ]; then |
|
||||||
warn "Some containers may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
else |
|
||||||
mkfs.ext4 $(pvesm path $ROOTFS) &>/dev/null |
|
||||||
fi |
|
||||||
ARCH=$(dpkg --print-architecture) |
|
||||||
HOSTNAME=motioneye |
|
||||||
TEMPLATE_STRING="local:vztmpl/${TEMPLATE}" |
|
||||||
pct create $CTID $TEMPLATE_STRING -arch $ARCH -features nesting=1 \ |
|
||||||
-hostname $HOSTNAME -net0 name=eth0,bridge=vmbr0,ip=dhcp -onboot 1 -cores 2 -memory 2048\ |
|
||||||
-ostype $OSTYPE -rootfs $ROOTFS,size=$DISK_SIZE -storage $STORAGE >/dev/null |
|
||||||
|
|
||||||
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf |
|
||||||
cat <<EOF >> $LXC_CONFIG |
|
||||||
lxc.cgroup2.devices.allow: a |
|
||||||
lxc.cap.drop: |
|
||||||
EOF |
|
||||||
|
|
||||||
MOUNT=$(pct mount $CTID | cut -d"'" -f 2) |
|
||||||
ln -fs $(readlink /etc/localtime) ${MOUNT}/etc/localtime |
|
||||||
pct unmount $CTID && unset MOUNT |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Starting LXC Container... \e[0m" |
|
||||||
pct start $CTID |
|
||||||
pct push $CTID motioneye_setup.sh /motioneye_setup.sh -perms 755 |
|
||||||
pct exec $CTID /motioneye_setup.sh |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
info "Successfully Created MotionEye LXC to $CTID." |
|
||||||
echo -e "\e[1;92m MotionEye NVR should be reachable by going to the following URL. |
|
||||||
http://${IP}:8765 |
|
||||||
\e[0m" |
|
||||||
@ -1,258 +0,0 @@ |
|||||||
#!/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="Motioneye" |
|
||||||
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 "${BL} |
|
||||||
__ __ ____ _______ _____ ____ _ _ ________ ________ |
|
||||||
| \/ |/ __ \__ __|_ _/ __ \| \ | | ____\ \ / / ____| |
|
||||||
| \ / | | | | | | | || | | | \| | |__ \ \_/ /| |__ |
|
||||||
| |\/| | | | | | | | || | | | | __| \ / | __| |
|
||||||
| | | | |__| | | | _| || |__| | |\ | |____ | | | |____ |
|
||||||
|_| |_|\____/ |_| |_____\____/|_| \_|______| |_| |______| |
|
||||||
${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=8 |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname $HN |
|
||||||
-net0 name=eth0,bridge=vmbr0,ip=dhcp |
|
||||||
-onboot 1 |
|
||||||
-cores 2 |
|
||||||
-memory 2048 |
|
||||||
-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 <<EOF >> $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}:8765${CL} \n" |
|
||||||
@ -1,356 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="Motioneye" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${BL} |
|
||||||
__ __ ____ _______ _____ ____ _ _ ________ ________ |
|
||||||
| \/ |/ __ \__ __|_ _/ __ \| \ | | ____\ \ / / ____| |
|
||||||
| \ / | | | | | | | || | | | \| | |__ \ \_/ /| |__ |
|
||||||
| |\/| | | | | | | | || | | | | __| \ / | __| |
|
||||||
| | | | |__| | | | 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 CT 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}8${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="8" |
|
||||||
echo -e "${DGN}Using ${BGN}2${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="2" |
|
||||||
echo -e "${DGN}Using ${BGN}2048${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="2048" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 8 " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="8"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 2048 " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="2048"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/motioneye-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:8765${CL} \n" |
|
||||||
@ -1,158 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
|
|
||||||
while true; do |
|
||||||
read -p "This will create a New MQTT LXC Container. Proceed(y/n)?" yn |
|
||||||
case $yn in |
|
||||||
[Yy]* ) break;; |
|
||||||
[Nn]* ) exit;; |
|
||||||
* ) echo "Please answer yes or no.";; |
|
||||||
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' |
|
||||||
CHECKMARK='\033[0;32m\xE2\x9C\x94\033[0m' |
|
||||||
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 [ ! -z ${MOUNT+x} ]; then |
|
||||||
pct unmount $CTID |
|
||||||
fi |
|
||||||
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 |
|
||||||
} |
|
||||||
function load_module() { |
|
||||||
if ! $(lsmod | grep -Fq $1); then |
|
||||||
modprobe $1 &>/dev/null || \ |
|
||||||
die "Failed to load '$1' module." |
|
||||||
fi |
|
||||||
MODULES_PATH=/etc/modules |
|
||||||
if ! $(grep -Fxq "$1" $MODULES_PATH); then |
|
||||||
echo "$1" >> $MODULES_PATH || \ |
|
||||||
die "Failed to add '$1' module to load at boot." |
|
||||||
fi |
|
||||||
} |
|
||||||
TEMP_DIR=$(mktemp -d) |
|
||||||
pushd $TEMP_DIR >/dev/null |
|
||||||
|
|
||||||
wget -qL https://raw.githubusercontent.com/tteck/Proxmox/main/setup/mqtt_setup.sh |
|
||||||
|
|
||||||
load_module overlay |
|
||||||
|
|
||||||
while read -r line; do |
|
||||||
TAG=$(echo $line | awk '{print $1}') |
|
||||||
TYPE=$(echo $line | awk '{printf "%-10s", $2}') |
|
||||||
FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') |
|
||||||
ITEM=" Type: $TYPE Free: $FREE " |
|
||||||
OFFSET=2 |
|
||||||
if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then |
|
||||||
MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) |
|
||||||
fi |
|
||||||
STORAGE_MENU+=( "$TAG" "$ITEM" "OFF" ) |
|
||||||
done < <(pvesm status -content rootdir | awk 'NR>1') |
|
||||||
if [ $((${#STORAGE_MENU[@]}/3)) -eq 0 ]; then |
|
||||||
warn "'Container' needs to be selected for at least one storage location." |
|
||||||
die "Unable to detect valid storage location." |
|
||||||
elif [ $((${#STORAGE_MENU[@]}/3)) -eq 1 ]; then |
|
||||||
STORAGE=${STORAGE_MENU[0]} |
|
||||||
else |
|
||||||
while [ -z "${STORAGE:+x}" ]; do |
|
||||||
STORAGE=$(whiptail --title "Storage Pools" --radiolist \ |
|
||||||
"Which storage pool you would like to use for the container?\n\n" \ |
|
||||||
16 $(($MSG_MAX_LENGTH + 23)) 6 \ |
|
||||||
"${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit |
|
||||||
done |
|
||||||
fi |
|
||||||
info "Using '$STORAGE' for storage location." |
|
||||||
|
|
||||||
CTID=$(pvesh get /cluster/nextid) |
|
||||||
info "Container ID is $CTID." |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Updating LXC Template List... \e[0m" |
|
||||||
pveam update >/dev/null |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Downloading LXC Template... \e[0m" |
|
||||||
OSTYPE=debian |
|
||||||
OSVERSION=${OSTYPE}-11 |
|
||||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($OSVERSION.*\)/\1/p" | sort -t - -k 2 -V) |
|
||||||
TEMPLATE="${TEMPLATES[-1]}" |
|
||||||
pveam download local $TEMPLATE >/dev/null || |
|
||||||
die "A problem occured while downloading the LXC template." |
|
||||||
|
|
||||||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') |
|
||||||
case $STORAGE_TYPE in |
|
||||||
dir|nfs) |
|
||||||
DISK_EXT=".raw" |
|
||||||
DISK_REF="$CTID/" |
|
||||||
;; |
|
||||||
zfspool) |
|
||||||
DISK_PREFIX="subvol" |
|
||||||
DISK_FORMAT="subvol" |
|
||||||
;; |
|
||||||
esac |
|
||||||
DISK=${DISK_PREFIX:-vm}-${CTID}-disk-0${DISK_EXT-} |
|
||||||
ROOTFS=${STORAGE}:${DISK_REF-}${DISK} |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Creating LXC Container... \e[0m" |
|
||||||
DISK_SIZE=2G |
|
||||||
pvesm alloc $STORAGE $CTID $DISK $DISK_SIZE --format ${DISK_FORMAT:-raw} >/dev/null |
|
||||||
if [ "$STORAGE_TYPE" == "zfspool" ]; then |
|
||||||
warn "Some containers may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
else |
|
||||||
mkfs.ext4 $(pvesm path $ROOTFS) &>/dev/null |
|
||||||
fi |
|
||||||
ARCH=$(dpkg --print-architecture) |
|
||||||
HOSTNAME=mqtt |
|
||||||
TEMPLATE_STRING="local:vztmpl/${TEMPLATE}" |
|
||||||
pct create $CTID $TEMPLATE_STRING -arch $ARCH -features nesting=1 \ |
|
||||||
-hostname $HOSTNAME -net0 name=eth0,bridge=vmbr0,ip=dhcp -onboot 1 -cores 1 -memory 512 \ |
|
||||||
-ostype $OSTYPE -rootfs $ROOTFS,size=$DISK_SIZE -storage $STORAGE >/dev/null |
|
||||||
|
|
||||||
MOUNT=$(pct mount $CTID | cut -d"'" -f 2) |
|
||||||
ln -fs $(readlink /etc/localtime) ${MOUNT}/etc/localtime |
|
||||||
pct unmount $CTID && unset MOUNT |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Starting LXC Container... \e[0m" |
|
||||||
pct start $CTID |
|
||||||
pct push $CTID mqtt_setup.sh /mqtt_setup.sh -perms 755 |
|
||||||
pct exec $CTID /mqtt_setup.sh |
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
info "Successfully created a MQTT LXC Container to $CTID at IP Address ${IP}" |
|
||||||
@ -1,250 +0,0 @@ |
|||||||
#!/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"` |
|
||||||
while true; do |
|
||||||
read -p "This will create a New MQTT 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 "${BL} |
|
||||||
__ __ ____ _______ _______ |
|
||||||
| \/ |/ __ \__ __|__ __| |
|
||||||
| \ / | | | | | | | | |
|
||||||
| |\/| | | | | | | | | |
|
||||||
| | | | |__| | | | | | |
|
||||||
|_| |_|\___\_\ |_| |_| |
|
||||||
|
|
||||||
${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 mqtt |
|
||||||
-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 |
|
||||||
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/mqtt-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 MQTT LXC to${CL} ${BL}$CTID${CL}. \n" |
|
||||||
@ -1,354 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="MQTT" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${BL} |
|
||||||
__ __ ____ _______ _______ |
|
||||||
| \/ |/ __ \__ __|__ __| |
|
||||||
| \ / | | | | | | | | |
|
||||||
| |\/| | | | | | | | | |
|
||||||
| | | | |__| | | | | | |
|
||||||
|_| |_|\___\_\ |_| 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 CT 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}2${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="2" |
|
||||||
echo -e "${DGN}Using ${BGN}1${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="1" |
|
||||||
echo -e "${DGN}Using ${BGN}512${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="512" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 2 " |
|
||||||
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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}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}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/mqtt-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
@ -1,356 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="n8n" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 CT 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}3${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="3" |
|
||||||
echo -e "${DGN}Using ${BGN}2${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="2" |
|
||||||
echo -e "${DGN}Using ${BGN}2048${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="2048" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 3 " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="3"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 2048 " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="2048"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/n8n-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:5678${CL} \n" |
|
||||||
@ -1,162 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
|
|
||||||
#!/usr/bin/env bash |
|
||||||
while true; do |
|
||||||
read -p "This will create a New Nginx Proxy Manager LXC Container. Proceed(y/n)?" yn |
|
||||||
case $yn in |
|
||||||
[Yy]* ) break;; |
|
||||||
[Nn]* ) exit;; |
|
||||||
* ) echo "Please answer yes or no.";; |
|
||||||
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' |
|
||||||
CHECKMARK='\033[0;32m\xE2\x9C\x94\033[0m' |
|
||||||
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 [ ! -z ${MOUNT+x} ]; then |
|
||||||
pct unmount $CTID |
|
||||||
fi |
|
||||||
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 |
|
||||||
} |
|
||||||
function load_module() { |
|
||||||
if ! $(lsmod | grep -Fq $1); then |
|
||||||
modprobe $1 &>/dev/null || \ |
|
||||||
die "Failed to load '$1' module." |
|
||||||
fi |
|
||||||
MODULES_PATH=/etc/modules |
|
||||||
if ! $(grep -Fxq "$1" $MODULES_PATH); then |
|
||||||
echo "$1" >> $MODULES_PATH || \ |
|
||||||
die "Failed to add '$1' module to load at boot." |
|
||||||
fi |
|
||||||
} |
|
||||||
TEMP_DIR=$(mktemp -d) |
|
||||||
pushd $TEMP_DIR >/dev/null |
|
||||||
|
|
||||||
wget -qL https://raw.githubusercontent.com/tteck/Proxmox/main/setup/npm_setup.sh |
|
||||||
|
|
||||||
load_module overlay |
|
||||||
|
|
||||||
while read -r line; do |
|
||||||
TAG=$(echo $line | awk '{print $1}') |
|
||||||
TYPE=$(echo $line | awk '{printf "%-10s", $2}') |
|
||||||
FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') |
|
||||||
ITEM=" Type: $TYPE Free: $FREE " |
|
||||||
OFFSET=2 |
|
||||||
if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then |
|
||||||
MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) |
|
||||||
fi |
|
||||||
STORAGE_MENU+=( "$TAG" "$ITEM" "OFF" ) |
|
||||||
done < <(pvesm status -content rootdir | awk 'NR>1') |
|
||||||
if [ $((${#STORAGE_MENU[@]}/3)) -eq 0 ]; then |
|
||||||
warn "'Container' needs to be selected for at least one storage location." |
|
||||||
die "Unable to detect valid storage location." |
|
||||||
elif [ $((${#STORAGE_MENU[@]}/3)) -eq 1 ]; then |
|
||||||
STORAGE=${STORAGE_MENU[0]} |
|
||||||
else |
|
||||||
while [ -z "${STORAGE:+x}" ]; do |
|
||||||
STORAGE=$(whiptail --title "Storage Pools" --radiolist \ |
|
||||||
"Which storage pool you would like to use for the container?\n\n" \ |
|
||||||
16 $(($MSG_MAX_LENGTH + 23)) 6 \ |
|
||||||
"${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit |
|
||||||
done |
|
||||||
fi |
|
||||||
info "Using '$STORAGE' for storage location." |
|
||||||
|
|
||||||
CTID=$(pvesh get /cluster/nextid) |
|
||||||
info "LXC ID is $CTID." |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Updating LXC Template List... \e[0m" |
|
||||||
pveam update >/dev/null |
|
||||||
echo -e "${CHECKMARK} \e[1;92m Downloading LXC Template... \e[0m" |
|
||||||
OSTYPE=debian |
|
||||||
OSVERSION=${OSTYPE}-11 |
|
||||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($OSVERSION.*\)/\1/p" | sort -t - -k 2 -V) |
|
||||||
TEMPLATE="${TEMPLATES[-1]}" |
|
||||||
pveam download local $TEMPLATE >/dev/null || |
|
||||||
die "A problem occured while downloading the LXC template." |
|
||||||
|
|
||||||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') |
|
||||||
case $STORAGE_TYPE in |
|
||||||
dir|nfs) |
|
||||||
DISK_EXT=".raw" |
|
||||||
DISK_REF="$CTID/" |
|
||||||
;; |
|
||||||
zfspool) |
|
||||||
DISK_PREFIX="subvol" |
|
||||||
DISK_FORMAT="subvol" |
|
||||||
;; |
|
||||||
esac |
|
||||||
DISK=${DISK_PREFIX:-vm}-${CTID}-disk-0${DISK_EXT-} |
|
||||||
ROOTFS=${STORAGE}:${DISK_REF-}${DISK} |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Creating LXC... \e[0m" |
|
||||||
DISK_SIZE=3G |
|
||||||
pvesm alloc $STORAGE $CTID $DISK $DISK_SIZE --format ${DISK_FORMAT:-raw} >/dev/null |
|
||||||
if [ "$STORAGE_TYPE" == "zfspool" ]; then |
|
||||||
warn "Some containers may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
else |
|
||||||
mkfs.ext4 $(pvesm path $ROOTFS) &>/dev/null |
|
||||||
fi |
|
||||||
ARCH=$(dpkg --print-architecture) |
|
||||||
HOSTNAME=npm |
|
||||||
TEMPLATE_STRING="local:vztmpl/${TEMPLATE}" |
|
||||||
pct create $CTID $TEMPLATE_STRING -arch $ARCH -features nesting=1 \ |
|
||||||
-hostname $HOSTNAME -net0 name=eth0,bridge=vmbr0,ip=dhcp -onboot 1 -cores 1 -memory 1024 \ |
|
||||||
-ostype $OSTYPE -rootfs $ROOTFS,size=$DISK_SIZE -storage $STORAGE >/dev/null |
|
||||||
|
|
||||||
MOUNT=$(pct mount $CTID | cut -d"'" -f 2) |
|
||||||
ln -fs $(readlink /etc/localtime) ${MOUNT}/etc/localtime |
|
||||||
pct unmount $CTID && unset MOUNT |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Starting LXC... \e[0m" |
|
||||||
pct start $CTID |
|
||||||
pct push $CTID npm_setup.sh /npm_setup.sh -perms 755 |
|
||||||
pct exec $CTID /npm_setup.sh |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
info "Successfully Created Nginx Proxy Manager LXC to $CTID." |
|
||||||
echo -e "\e[1;92m Nginx Proxy Manager should be reachable by going to the following URL. |
|
||||||
http://${IP}:81 |
|
||||||
\e[0m" |
|
||||||
@ -1,251 +0,0 @@ |
|||||||
#!/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"` |
|
||||||
while true; do |
|
||||||
read -p "This will create a New Nginx Proxy Manager 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=3 |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname npm |
|
||||||
-net0 name=eth0,bridge=vmbr0,ip=dhcp |
|
||||||
-onboot 1 |
|
||||||
-cores 1 |
|
||||||
-memory 1024 |
|
||||||
-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 |
|
||||||
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/nginx-proxy-manager-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 Nginx Proxy Manager LXC to${CL} ${BL}$CTID${CL}. |
|
||||||
Nginx Proxy Manager should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:81${CL} \n" |
|
||||||
@ -1,356 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="Nginx Proxy Manager" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 CT 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}3${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="3" |
|
||||||
echo -e "${DGN}Using ${BGN}1${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="1" |
|
||||||
echo -e "${DGN}Using ${BGN}1024${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="1024" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 3 " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="3"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}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}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/nginx-proxy-manager-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:81${CL} \n" |
|
||||||
@ -1,258 +0,0 @@ |
|||||||
#!/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="NocoDB" |
|
||||||
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 "${YW} |
|
||||||
_ _ _____ ____ |
|
||||||
| \ | | | __ \| _ \ |
|
||||||
| \| | ___ ___ ___ | | | | |_) | |
|
||||||
| |/ _ \ / __/ _ \| | | | _ < |
|
||||||
| |\ | (_) | (_| (_) | |__| | |_) | |
|
||||||
|_| \_|\___/ \___\___/|_____/|____/ |
|
||||||
${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=4 |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname $HN |
|
||||||
-net0 name=eth0,bridge=vmbr0,ip=dhcp |
|
||||||
-onboot 1 |
|
||||||
-cores 1 |
|
||||||
-memory 1024 |
|
||||||
-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 applications may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
fi |
|
||||||
LXC_CONFIG=/etc/pve/lxc/${CTID}.conf |
|
||||||
cat <<EOF >> $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}:8080/dashboard${CL}\n" |
|
||||||
@ -1,356 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="NocoDB" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${YW} |
|
||||||
_ _ _____ ____ |
|
||||||
| \ | | | __ \| _ \ |
|
||||||
| \| | ___ 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 CT 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}4${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="4" |
|
||||||
echo -e "${DGN}Using ${BGN}1${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="1" |
|
||||||
echo -e "${DGN}Using ${BGN}1024${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="1024" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 4 " |
|
||||||
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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}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}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/nocodb-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:8080/dashboard${CL}\n" |
|
||||||
@ -1,161 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
|
|
||||||
while true; do |
|
||||||
read -p "This will create a New Node-Red LXC Container. Proceed(y/n)?" yn |
|
||||||
case $yn in |
|
||||||
[Yy]* ) break;; |
|
||||||
[Nn]* ) exit;; |
|
||||||
* ) echo "Please answer yes or no.";; |
|
||||||
esac |
|
||||||
done |
|
||||||
clear |
|
||||||
set -o errexit |
|
||||||
set -o errtrace |
|
||||||
set -o nounset |
|
||||||
set -o pipefail |
|
||||||
shopt -s expand_aliases |
|
||||||
alias die='EXIT=$? LINE=$LINENO error_exit' |
|
||||||
CHECKMARK='\033[0;32m\xE2\x9C\x94\033[0m' |
|
||||||
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 [ ! -z ${MOUNT+x} ]; then |
|
||||||
pct unmount $CTID |
|
||||||
fi |
|
||||||
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 |
|
||||||
} |
|
||||||
function load_module() { |
|
||||||
if ! $(lsmod | grep -Fq $1); then |
|
||||||
modprobe $1 &>/dev/null || \ |
|
||||||
die "Failed to load '$1' module." |
|
||||||
fi |
|
||||||
MODULES_PATH=/etc/modules |
|
||||||
if ! $(grep -Fxq "$1" $MODULES_PATH); then |
|
||||||
echo "$1" >> $MODULES_PATH || \ |
|
||||||
die "Failed to add '$1' module to load at boot." |
|
||||||
fi |
|
||||||
} |
|
||||||
TEMP_DIR=$(mktemp -d) |
|
||||||
pushd $TEMP_DIR >/dev/null |
|
||||||
|
|
||||||
wget -qL https://raw.githubusercontent.com/tteck/Proxmox/main/setup/node-red_setup.sh |
|
||||||
|
|
||||||
load_module overlay |
|
||||||
|
|
||||||
while read -r line; do |
|
||||||
TAG=$(echo $line | awk '{print $1}') |
|
||||||
TYPE=$(echo $line | awk '{printf "%-10s", $2}') |
|
||||||
FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') |
|
||||||
ITEM=" Type: $TYPE Free: $FREE " |
|
||||||
OFFSET=2 |
|
||||||
if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then |
|
||||||
MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) |
|
||||||
fi |
|
||||||
STORAGE_MENU+=( "$TAG" "$ITEM" "OFF" ) |
|
||||||
done < <(pvesm status -content rootdir | awk 'NR>1') |
|
||||||
if [ $((${#STORAGE_MENU[@]}/3)) -eq 0 ]; then |
|
||||||
warn "'Container' needs to be selected for at least one storage location." |
|
||||||
die "Unable to detect valid storage location." |
|
||||||
elif [ $((${#STORAGE_MENU[@]}/3)) -eq 1 ]; then |
|
||||||
STORAGE=${STORAGE_MENU[0]} |
|
||||||
else |
|
||||||
while [ -z "${STORAGE:+x}" ]; do |
|
||||||
STORAGE=$(whiptail --title "Storage Pools" --radiolist \ |
|
||||||
"Which storage pool you would like to use for the container?\n\n" \ |
|
||||||
16 $(($MSG_MAX_LENGTH + 23)) 6 \ |
|
||||||
"${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit |
|
||||||
done |
|
||||||
fi |
|
||||||
info "Using '$STORAGE' for storage location." |
|
||||||
|
|
||||||
CTID=$(pvesh get /cluster/nextid) |
|
||||||
info "Container ID is $CTID." |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Updating LXC Template List... \e[0m" |
|
||||||
pveam update >/dev/null |
|
||||||
echo -e "${CHECKMARK} \e[1;92m Downloading LXC Template... \e[0m" |
|
||||||
OSTYPE=debian |
|
||||||
OSVERSION=${OSTYPE}-11 |
|
||||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($OSVERSION.*\)/\1/p" | sort -t - -k 2 -V) |
|
||||||
TEMPLATE="${TEMPLATES[-1]}" |
|
||||||
pveam download local $TEMPLATE >/dev/null || |
|
||||||
die "A problem occured while downloading the LXC template." |
|
||||||
|
|
||||||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') |
|
||||||
case $STORAGE_TYPE in |
|
||||||
dir|nfs) |
|
||||||
DISK_EXT=".raw" |
|
||||||
DISK_REF="$CTID/" |
|
||||||
;; |
|
||||||
zfspool) |
|
||||||
DISK_PREFIX="subvol" |
|
||||||
DISK_FORMAT="subvol" |
|
||||||
;; |
|
||||||
esac |
|
||||||
DISK=${DISK_PREFIX:-vm}-${CTID}-disk-0${DISK_EXT-} |
|
||||||
ROOTFS=${STORAGE}:${DISK_REF-}${DISK} |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Creating LXC Container... \e[0m" |
|
||||||
DISK_SIZE=4G |
|
||||||
pvesm alloc $STORAGE $CTID $DISK $DISK_SIZE --format ${DISK_FORMAT:-raw} >/dev/null |
|
||||||
if [ "$STORAGE_TYPE" == "zfspool" ]; then |
|
||||||
warn "Some containers may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
else |
|
||||||
mkfs.ext4 $(pvesm path $ROOTFS) &>/dev/null |
|
||||||
fi |
|
||||||
ARCH=$(dpkg --print-architecture) |
|
||||||
HOSTNAME=nodered |
|
||||||
TEMPLATE_STRING="local:vztmpl/${TEMPLATE}" |
|
||||||
pct create $CTID $TEMPLATE_STRING -arch $ARCH -features nesting=1 \ |
|
||||||
-hostname $HOSTNAME -net0 name=eth0,bridge=vmbr0,ip=dhcp -onboot 1 -cores 1 -memory 1024 \ |
|
||||||
-ostype $OSTYPE -rootfs $ROOTFS,size=$DISK_SIZE -storage $STORAGE >/dev/null |
|
||||||
|
|
||||||
MOUNT=$(pct mount $CTID | cut -d"'" -f 2) |
|
||||||
ln -fs $(readlink /etc/localtime) ${MOUNT}/etc/localtime |
|
||||||
pct unmount $CTID && unset MOUNT |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Starting LXC Container... \e[0m" |
|
||||||
pct start $CTID |
|
||||||
pct push $CTID node-red_setup.sh /node-red_setup.sh -perms 755 |
|
||||||
pct exec $CTID /node-red_setup.sh |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
info "Successfully Created Node-Red LXC to $CTID." |
|
||||||
echo -e "\e[1;92m Node-Red should be reachable by going to the following URL. |
|
||||||
http://${IP}:1880 |
|
||||||
\e[0m" |
|
||||||
@ -1,253 +0,0 @@ |
|||||||
#!/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"` |
|
||||||
while true; do |
|
||||||
read -p "This will create a New Node-Red 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=4 |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname node-red |
|
||||||
-net0 name=eth0,bridge=vmbr0,ip=dhcp |
|
||||||
-onboot 1 |
|
||||||
-cores 1 |
|
||||||
-memory 1024 |
|
||||||
-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 |
|
||||||
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/node-red-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 Node-Red LXC to${CL} ${BL}$CTID${CL}. |
|
||||||
${RD}Node-Red${CL} should be reachable by going to the following URL. |
|
||||||
|
|
||||||
${BL}http://${IP}:1880${CL} \n" |
|
||||||
@ -1,356 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="Node Red" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 CT 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}4${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="4" |
|
||||||
echo -e "${DGN}Using ${BGN}1${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="1" |
|
||||||
echo -e "${DGN}Using ${BGN}1024${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="1024" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 4 " |
|
||||||
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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}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}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/node-red-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:1880${CL} \n" |
|
||||||
@ -1,252 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
clear |
|
||||||
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"` |
|
||||||
while true; do |
|
||||||
read -p "This will create a New Omada Controller 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 "${BL} |
|
||||||
____ _ _____ _ _ _ |
|
||||||
/ __ \ | | / ____| | | | | | |
|
||||||
| | | |_ __ ___ __ _ __| | __ _ | | ___ _ __ | |_ _ __ ___ | | | ___ _ __ |
|
||||||
| | | | _ _ \ / _ |/ _ |/ _ | | | / _ \| _ \| __| __/ _ \| | |/ _ \ __| |
|
||||||
| |__| | | | | | | (_| | (_| | (_| | | |___| (_) | | | | |_| | | (_) | | | __/ | |
|
||||||
\____/|_| |_| |_|\__,_|\__,_|\__,_| \_____\___/|_| |_|\__|_| \___/|_|_|\___|_| |
|
||||||
${CL}" |
|
||||||
} |
|
||||||
|
|
||||||
header_info |
|
||||||
show_menu(){ |
|
||||||
printf " ${YW} 1)${YW} Privileged ${CL}\n" |
|
||||||
printf " ${YW} 2)${GN} Unprivileged ${CL}\n" |
|
||||||
|
|
||||||
printf "Please choose an 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=ubuntu |
|
||||||
export PCT_OSVERSION=20.04 |
|
||||||
export PCT_DISK_SIZE=8 |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname omada |
|
||||||
-net0 name=eth0,bridge=vmbr0,ip=dhcp |
|
||||||
-onboot 1 |
|
||||||
-cores 2 |
|
||||||
-memory 2048 |
|
||||||
-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 |
|
||||||
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/omada-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 Omada Controller LXC to${CL} ${BL}$CTID${CL}. |
|
||||||
${BL}Omada${CL} should be reachable by going to the following URL. |
|
||||||
${BL}https://${IP}:8043${CL} \n" |
|
||||||
@ -1,356 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
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="Omada" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${BL} |
|
||||||
____ _ _____ _ _ _ |
|
||||||
/ __ \ | | / ____| | | | | | |
|
||||||
| | | |_ __ ___ 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 CT 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}8${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="8" |
|
||||||
echo -e "${DGN}Using ${BGN}1${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="2" |
|
||||||
echo -e "${DGN}Using ${BGN}512${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="2048" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 8 " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="8"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 2048 " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="2048"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=ubuntu |
|
||||||
export PCT_OSVERSION=20.04 |
|
||||||
export PCT_DISK_SIZE=$DISK_SIZE |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname $HN |
|
||||||
-net0 name=eth0,bridge=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/omada-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}https://${IP}:8043${CL} \n" |
|
||||||
@ -1,361 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
APP="openHAB" |
|
||||||
var_disk="8" |
|
||||||
var_cpu="2" |
|
||||||
var_ram="2048" |
|
||||||
var_os="debian" |
|
||||||
var_version="11" |
|
||||||
NEXTID=$(pvesh get /cluster/nextid) |
|
||||||
INTEGER='^[0-9]+$' |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
var_install="${NSAPP}-install" |
|
||||||
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}" |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
function msg_info() { |
|
||||||
local msg="$1" |
|
||||||
echo -ne " ${HOLD} ${YW}${msg}..." |
|
||||||
} |
|
||||||
|
|
||||||
function msg_ok() { |
|
||||||
local msg="$1" |
|
||||||
echo -e "${BFR} ${CM} ${GN}${msg}${CL}" |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${YW} |
|
||||||
_ _ ____ |
|
||||||
| | | | /\ | _ \ |
|
||||||
___ _ __ ___ _ __ | |__| | / \ | |_) | |
|
||||||
/ _ \| _ \ / _ \ _ \| __ | / /\ \ | _ < |
|
||||||
| (_) | |_) | __/ | | | | | |/ ____ \| |_) | |
|
||||||
\___/| .__/ \___|_| |_|_| |_/_/ v3 \_\____/ |
|
||||||
| | |
|
||||||
|_| |
|
||||||
${CL}" |
|
||||||
} |
|
||||||
|
|
||||||
header_info |
|
||||||
|
|
||||||
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}Privileged${CL}" |
|
||||||
CT_TYPE="0" |
|
||||||
echo -e "${DGN}Using CT Password ${BGN}Automatic Login${CL}" |
|
||||||
PW=" " |
|
||||||
echo -e "${DGN}Using CT 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}$var_disk${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="$var_disk" |
|
||||||
echo -e "${DGN}Using ${BGN}$var_cpu${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="$var_cpu" |
|
||||||
echo -e "${DGN}Using ${BGN}$var_ram${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="$var_ram" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 Unprivileged, or Press [ENTER] for Default: Privileged" |
|
||||||
read CT_TYPE1 |
|
||||||
if [ -z $CT_TYPE1 ]; then CT_TYPE1="Privileged" CT_TYPE="0"; |
|
||||||
echo -en "${DGN}Set CT Type ${BL}$CT_TYPE1${CL}" |
|
||||||
else |
|
||||||
CT_TYPE1="Unprivileged" |
|
||||||
CT_TYPE="1" |
|
||||||
echo -en "${DGN}Set CT Type ${BL}Unprivileged${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 CT 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 CT 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: $var_disk " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="$var_disk"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${YW}Allocate CPU cores, or Press [ENTER] for Default: $var_cpu " |
|
||||||
read CORE_COUNT |
|
||||||
if [ -z $CORE_COUNT ]; then CORE_COUNT="$var_cpu"; fi; |
|
||||||
echo -en "${DGN}Set Cores To ${BL}$CORE_COUNT${CL}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: $var_ram " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="$var_ram"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 |
|
||||||
|
|
||||||
export CTID=$CT_ID |
|
||||||
export PCT_OSTYPE=$var_os |
|
||||||
export PCT_OSVERSION=$var_version |
|
||||||
export PCT_DISK_SIZE=$DISK_SIZE |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname $HN |
|
||||||
-net0 name=eth0,bridge=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/$var_install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:8080${CL}\n" |
|
||||||
@ -1,259 +0,0 @@ |
|||||||
#!/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"` |
|
||||||
PP=`echo "\e[1;35m"` |
|
||||||
APP="PhotoPrism" |
|
||||||
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 "${PP} |
|
||||||
_____ _ _ _____ _ |
|
||||||
| __ \| | | | | __ \ (_) |
|
||||||
| |__) | |__ ___ | |_ ___ | |__) | __ _ ___ _ __ ___ |
|
||||||
| ___/| _ \ / _ \| __/ _ \| ___/ __| / __| _ _ \ |
|
||||||
| | | | | | (_) | || (_) | | | | | \__ \ | | | | | |
|
||||||
|_| |_| |_|\___/ \__\___/|_| |_| |_|___/_| |_| |_| |
|
||||||
${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=8 |
|
||||||
export PCT_OPTIONS=" |
|
||||||
-features $FEATURES |
|
||||||
-hostname $HN |
|
||||||
-net0 name=eth0,bridge=vmbr0,ip=dhcp |
|
||||||
-onboot 1 |
|
||||||
-cores 2 |
|
||||||
-memory 2048 |
|
||||||
-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 <<EOF >> $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}. |
|
||||||
${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:2342${CL} \n" |
|
||||||
@ -1,357 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
echo -e "Loading..." |
|
||||||
NEXTID=$(pvesh get /cluster/nextid) |
|
||||||
INTEGER='^[0-9]+$' |
|
||||||
PP=`echo "\e[1;35m"` |
|
||||||
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="PhotoPrism" |
|
||||||
NSAPP=$(echo ${APP,,} | tr -d ' ') |
|
||||||
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 |
|
||||||
|
|
||||||
function error_exit() { |
|
||||||
trap - ERR |
|
||||||
local reason="Unknown failure occurred." |
|
||||||
local msg="${1:-$reason}" |
|
||||||
local flag="${RD}‼ ERROR ${CL}$EXIT@$LINE" |
|
||||||
echo -e "$flag $msg" 1>&2 |
|
||||||
exit $EXIT |
|
||||||
} |
|
||||||
|
|
||||||
while true; do |
|
||||||
clear |
|
||||||
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 "${PP} |
|
||||||
_____ _ _ _____ _ |
|
||||||
| __ \| | | | | __ \ (_) |
|
||||||
| |__) | |__ ___ | |_ ___ | |__) | __ _ ___ _ __ ___ |
|
||||||
| ___/| _ \ / _ \| __/ _ \| ___/ __| / __| _ _ \ |
|
||||||
| | | | | | (_) | || (_) | | | | | \__ \ | | | | | |
|
||||||
|_| 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 CT 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}8${CL}${DGN}GB${CL}" |
|
||||||
DISK_SIZE="8" |
|
||||||
echo -e "${DGN}Using ${BGN}2${CL}${DGN}vCPU${CL}" |
|
||||||
CORE_COUNT="2" |
|
||||||
echo -e "${DGN}Using ${BGN}2048${CL}${DGN}MiB RAM${CL}" |
|
||||||
RAM_SIZE="2048" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}vmbr0${CL}" |
|
||||||
BRG="vmbr0" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}DHCP${CL}" |
|
||||||
NET=dhcp |
|
||||||
echo -e "${DGN}Using Gateway Address ${BGN}NONE${CL}" |
|
||||||
GATE="" |
|
||||||
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 CT 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 CT 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: 8 " |
|
||||||
read DISK_SIZE |
|
||||||
if [ -z $DISK_SIZE ]; then DISK_SIZE="8"; 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}${DGN}GB${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${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}${DGN}vCPU${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 2048 " |
|
||||||
read RAM_SIZE |
|
||||||
if [ -z $RAM_SIZE ]; then RAM_SIZE="2048"; fi; |
|
||||||
echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}${DGN}MiB RAM${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${YW}Enter a Bridge, or Press [ENTER] for Default: vmbr0 " |
|
||||||
read BRG |
|
||||||
if [ -z $BRG ]; then BRG="vmbr0"; fi; |
|
||||||
echo -en "${DGN}Set Bridge To ${BL}$BRG${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${YW}Enter a Static IPv4 CIDR Address, or Press [ENTER] for Default: DHCP " |
|
||||||
read NET |
|
||||||
if [ -z $NET ]; then NET="dhcp"; fi; |
|
||||||
echo -en "${DGN}Set Static 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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${YW}Enter a Gateway IP (mandatory if static IP is used), or Press [ENTER] for Default: NONE " |
|
||||||
read GATE1 |
|
||||||
if [ -z $GATE1 ]; then GATE1="NONE" GATE=""; |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${CL}" |
|
||||||
else |
|
||||||
GATE=",gw=$GATE1" |
|
||||||
echo -en "${DGN}Set Gateway IP To ${BL}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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 CT ID ${BGN}$CT_ID${CL}" |
|
||||||
echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" |
|
||||||
echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}${DGN}GB${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${CORE_COUNT}${CL}${DGN}vCPU${CL}" |
|
||||||
echo -e "${DGN}Using ${BGN}${RAM_SIZE}${CL}${DGN}MiB RAM${CL}" |
|
||||||
echo -e "${DGN}Using Bridge ${BGN}${BRG}${CL}" |
|
||||||
echo -e "${DGN}Using Static IP Address ${BGN}$NET${CL}" |
|
||||||
echo -e "${DGN}Using Gateway IP Address ${BGN}$GATE1${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=$BRG,ip=$NET$GATE$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 |
|
||||||
|
|
||||||
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/photoprism-install.sh)" || exit |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
|
|
||||||
pct set $CTID -description "# ${APP} LXC |
|
||||||
### https://github.com/tteck/Proxmox" |
|
||||||
|
|
||||||
msg_ok "Completed Successfully!\n" |
|
||||||
echo -e "${APP} should be reachable by going to the following URL. |
|
||||||
${BL}http://${IP}:2342${CL} \n" |
|
||||||
@ -1,162 +0,0 @@ |
|||||||
#!/usr/bin/env bash |
|
||||||
|
|
||||||
while true; do |
|
||||||
read -p "This will create a New Pi-hole LXC. Proceed(y/n)?" yn |
|
||||||
case $yn in |
|
||||||
[Yy]* ) break;; |
|
||||||
[Nn]* ) exit;; |
|
||||||
* ) echo "Please answer yes or no.";; |
|
||||||
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' |
|
||||||
CHECKMARK='\033[0;32m\xE2\x9C\x94\033[0m' |
|
||||||
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 [ ! -z ${MOUNT+x} ]; then |
|
||||||
pct unmount $CTID |
|
||||||
fi |
|
||||||
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 |
|
||||||
} |
|
||||||
function load_module() { |
|
||||||
if ! $(lsmod | grep -Fq $1); then |
|
||||||
modprobe $1 &>/dev/null || \ |
|
||||||
die "Failed to load '$1' module." |
|
||||||
fi |
|
||||||
MODULES_PATH=/etc/modules |
|
||||||
if ! $(grep -Fxq "$1" $MODULES_PATH); then |
|
||||||
echo "$1" >> $MODULES_PATH || \ |
|
||||||
die "Failed to add '$1' module to load at boot." |
|
||||||
fi |
|
||||||
} |
|
||||||
TEMP_DIR=$(mktemp -d) |
|
||||||
pushd $TEMP_DIR >/dev/null |
|
||||||
|
|
||||||
wget -qL https://raw.githubusercontent.com/tteck/Proxmox/main/setup/pihole_setup.sh |
|
||||||
|
|
||||||
load_module overlay |
|
||||||
|
|
||||||
while read -r line; do |
|
||||||
TAG=$(echo $line | awk '{print $1}') |
|
||||||
TYPE=$(echo $line | awk '{printf "%-10s", $2}') |
|
||||||
FREE=$(echo $line | numfmt --field 4-6 --from-unit=K --to=iec --format %.2f | awk '{printf( "%9sB", $6)}') |
|
||||||
ITEM=" Type: $TYPE Free: $FREE " |
|
||||||
OFFSET=2 |
|
||||||
if [[ $((${#ITEM} + $OFFSET)) -gt ${MSG_MAX_LENGTH:-} ]]; then |
|
||||||
MSG_MAX_LENGTH=$((${#ITEM} + $OFFSET)) |
|
||||||
fi |
|
||||||
STORAGE_MENU+=( "$TAG" "$ITEM" "OFF" ) |
|
||||||
done < <(pvesm status -content rootdir | awk 'NR>1') |
|
||||||
if [ $((${#STORAGE_MENU[@]}/3)) -eq 0 ]; then |
|
||||||
warn "'Container' needs to be selected for at least one storage location." |
|
||||||
die "Unable to detect valid storage location." |
|
||||||
elif [ $((${#STORAGE_MENU[@]}/3)) -eq 1 ]; then |
|
||||||
STORAGE=${STORAGE_MENU[0]} |
|
||||||
else |
|
||||||
while [ -z "${STORAGE:+x}" ]; do |
|
||||||
STORAGE=$(whiptail --title "Storage Pools" --radiolist \ |
|
||||||
"Which storage pool you would like to use for the container?\n\n" \ |
|
||||||
16 $(($MSG_MAX_LENGTH + 23)) 6 \ |
|
||||||
"${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit |
|
||||||
done |
|
||||||
fi |
|
||||||
info "Using '$STORAGE' for storage location." |
|
||||||
|
|
||||||
CTID=$(pvesh get /cluster/nextid) |
|
||||||
info "LXC ID is $CTID." |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Updating LXC Template List... \e[0m" |
|
||||||
pveam update >/dev/null |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Downloading LXC Template... \e[0m" |
|
||||||
OSTYPE=debian |
|
||||||
OSVERSION=${OSTYPE}-11 |
|
||||||
mapfile -t TEMPLATES < <(pveam available -section system | sed -n "s/.*\($OSVERSION.*\)/\1/p" | sort -t - -k 2 -V) |
|
||||||
TEMPLATE="${TEMPLATES[-1]}" |
|
||||||
pveam download local $TEMPLATE >/dev/null || |
|
||||||
die "A problem occured while downloading the LXC template." |
|
||||||
|
|
||||||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') |
|
||||||
case $STORAGE_TYPE in |
|
||||||
dir|nfs) |
|
||||||
DISK_EXT=".raw" |
|
||||||
DISK_REF="$CTID/" |
|
||||||
;; |
|
||||||
zfspool) |
|
||||||
DISK_PREFIX="subvol" |
|
||||||
DISK_FORMAT="subvol" |
|
||||||
;; |
|
||||||
esac |
|
||||||
DISK=${DISK_PREFIX:-vm}-${CTID}-disk-0${DISK_EXT-} |
|
||||||
ROOTFS=${STORAGE}:${DISK_REF-}${DISK} |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Creating LXC... \e[0m" |
|
||||||
DISK_SIZE=2G |
|
||||||
pvesm alloc $STORAGE $CTID $DISK $DISK_SIZE --format ${DISK_FORMAT:-raw} >/dev/null |
|
||||||
if [ "$STORAGE_TYPE" == "zfspool" ]; then |
|
||||||
warn "Some containers may not work properly due to ZFS not supporting 'fallocate'." |
|
||||||
else |
|
||||||
mkfs.ext4 $(pvesm path $ROOTFS) &>/dev/null |
|
||||||
fi |
|
||||||
ARCH=$(dpkg --print-architecture) |
|
||||||
HOSTNAME=pi-hole |
|
||||||
TEMPLATE_STRING="local:vztmpl/${TEMPLATE}" |
|
||||||
pct create $CTID $TEMPLATE_STRING -arch $ARCH -features nesting=1 \ |
|
||||||
-hostname $HOSTNAME -net0 name=eth0,bridge=vmbr0,ip=dhcp -onboot 1 -cores 1 -memory 512 \ |
|
||||||
-ostype $OSTYPE -rootfs $ROOTFS,size=$DISK_SIZE -storage $STORAGE >/dev/null |
|
||||||
|
|
||||||
MOUNT=$(pct mount $CTID | cut -d"'" -f 2) |
|
||||||
ln -fs $(readlink /etc/localtime) ${MOUNT}/etc/localtime |
|
||||||
pct unmount $CTID && unset MOUNT |
|
||||||
|
|
||||||
echo -e "${CHECKMARK} \e[1;92m Starting LXC... \e[0m" |
|
||||||
pct start $CTID |
|
||||||
pct push $CTID pihole_setup.sh /pihole_setup.sh -perms 755 |
|
||||||
pct exec $CTID /pihole_setup.sh |
|
||||||
|
|
||||||
IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') |
|
||||||
info "Successfully created a Pi-hole LXC to $CTID" |
|
||||||
echo -e "\e[1;92m Pi-hole should be reachable by going to the following URL. |
|
||||||
http://${IP} |
|
||||||
\e[0m" |
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue