diff --git a/ct/debian-v3.sh b/ct/debian-v3.sh index 0c11983d..1567da12 100644 --- a/ct/debian-v3.sh +++ b/ct/debian-v3.sh @@ -1,4 +1,7 @@ -#!/usr/bin/env bash +#!/usr/bin/env bash -ex +set -euo pipefail +shopt -s inherit_errexit nullglob + NEXTID=$(pvesh get /cluster/nextid) INTEGER='^[0-9]+$' YW=`echo "\033[33m"` @@ -248,58 +251,6 @@ function start_script() { start_script -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 [ "$CT_TYPE" == "1" ]; then FEATURES="nesting=1,keyctl=1" else @@ -335,9 +286,7 @@ msg_info "Starting LXC Container" pct start $CTID msg_ok "Started LXC Container" -alias lxc-cmd="lxc-attach -n $CTID --" - -lxc-cmd bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/setup/debian-install.s> +lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/setup/debian-install.sh)" || exit IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') diff --git a/ct/homeassistant-v3.sh b/ct/homeassistant-v3.sh index 22ab2ed3..636d0fb1 100644 --- a/ct/homeassistant-v3.sh +++ b/ct/homeassistant-v3.sh @@ -1,4 +1,6 @@ -#!/usr/bin/env bash +#!/usr/bin/env bash -ex +set -euo pipefail +shopt -s inherit_errexit nullglob NEXTID=$(pvesh get /cluster/nextid) INTEGER='^[0-9]+$' YW=`echo "\033[33m"` @@ -248,58 +250,6 @@ function start_script() { start_script -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 [ "$CT_TYPE" == "1" ]; then FEATURES="nesting=1,keyctl=1" else @@ -340,9 +290,7 @@ msg_info "Starting LXC Container" pct start $CTID msg_ok "Started LXC Container" -alias lxc-cmd="lxc-attach -n $CTID --" - -lxc-cmd bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/setup/homeassistant-install.sh)" || exit +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}') diff --git a/ct/zigbee2mqtt-v3.sh b/ct/zigbee2mqtt-v3.sh index 78efaead..597d2bb0 100644 --- a/ct/zigbee2mqtt-v3.sh +++ b/ct/zigbee2mqtt-v3.sh @@ -1,16 +1,20 @@ -#!/usr/bin/env bash +#!/usr/bin/env bash -ex +set -euo pipefail +shopt -s inherit_errexit nullglob NEXTID=$(pvesh get /cluster/nextid) INTEGER='^[0-9]+$' YW=`echo "\033[33m"` BL=`echo "\033[36m"` RD=`echo "\033[01;31m"` -CM='\xE2\x9C\x94\033' BGN=`echo "\033[4;92m"` -GN=`echo "\033[32m"` +GN=`echo "\033[1;92m"` +DGN=`echo "\033[32m"` CL=`echo "\033[m"` +BFR="\\r\\033[K" +HOLD="-" +CM="${GN}✓${CL}" APP="Zigbee2MQTT" NSAPP=$(echo ${APP,,} | tr -d ' ') - while true; do read -p "This will create a New ${APP} LXC. Proceed(y/n)?" yn case $yn in @@ -34,218 +38,200 @@ ${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" + +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 + fi } function default_settings() { - clear - header_info - echo -e "${BL}Using Default Settings${CL}" - echo -e "${GN}Using CT Type ${BGN}Privileged${CL}" - CT_TYPE="0" - echo -e "${GN}Using CT Password ${BGN}Automatic Login${CL}" - PW=" " - echo -e "${GN}Using ID ${BGN}$NEXTID${CL}" - CT_ID=$NEXTID - echo -e "${GN}Using CT Name ${BGN}$NSAPP${CL}" - HN=$NSAPP - echo -e "${GN}Using Disk Size ${BGN}4GB${CL}" - SIZEDISK="4" - echo -e "${GN}Using Storage ${BGN}local-lvm${CL}" - STORAGETYPE="local-lvm" - echo -e "${GN}Using ${BGN}2vCPU${CL}" - CORE_COUNT="2" - echo -e "${GN}Using ${BGN}1024MiB${CL}${GN} RAM${CL}" - RAM_SIZE="1024" - echo -e "${GN}Using IP Address ${BGN}DHCP${CL}" - NET=dhcp - echo -e "${GN}Using VLAN Tag ${BGN}NONE${CL}" - VLAN=" " + 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 ID ${BGN}$NEXTID${CL}" + CT_ID=$NEXTID + echo -e "${DGN}Using CT Name ${BGN}$NSAPP${CL}" + HN=$NSAPP + echo -e "${DGN}Using Disk Size ${BGN}4GB${CL}" + DISK_SIZE="4" + echo -e "${DGN}Using ${BGN}2vCPU${CL}" + CORE_COUNT="2" + echo -e "${DGN}Using ${BGN}1024MiB${CL}${GN} RAM${CL}" + RAM_SIZE="1024" + echo -e "${DGN}Using IP Address ${BGN}DHCP${CL}" + NET=dhcp + echo -e "${DGN}Using VLAN Tag ${BGN}NONE${CL}" + VLAN=" " } function advanced_settings() { - clear - header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${YW}Type Unprivileged, or Press [ENTER] for Default: Privileged " - read CT_TYPE1 - if [ -z $CT_TYPE1 ]; then CT_TYPE1="Privileged" - CT_TYPE="0" - echo -en "${GN}Set CT Type ${BL}$CT_TYPE1${CL}" - else - CT_TYPE1="Unprivileged" - CT_TYPE="1" - echo -en "${GN}Set CT Type ${BL}Unprivileged${CL} ${RD}NO DEVICE PASSTHROUGH${CL}" - fi; + 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 "${GN}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 "${GN}Set CT ${BL}$PW1${CL}" - else - PW="-password $PW1" - echo -en "${GN}Set CT Password ${BL}$PW1${CL}" - - fi; + 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 "${GN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${GN}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 "${GN}Set CT ID To ${BL}$CT_ID${CL}" + echo -e "${RD}Using 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 "${GN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${GN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${GN}Using ID ${BGN}$CT_ID${CL}" - echo -e "${YW}Enter CT Name (no-spaces), or Press [ENTER] for Default: $NSAPP " - read CT_NAME - if [ -z $CT_NAME ]; then - HN=$NSAPP - else - HN=$(echo ${CT_NAME,,} | tr -d ' ') - fi - echo -en "${GN}Set CT Name To ${BL}$HN${CL}" + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${YW}Enter CT Name (no-spaces), or Press [ENTER] for Default: $NSAPP " + read CT_NAME + if [ -z $CT_NAME ]; then + HN=$NSAPP + else + HN=$(echo ${CT_NAME,,} | tr -d ' ') + fi + echo -en "${DGN}Set CT Name To ${BL}$HN${CL}" echo -e " ${CM}${CL} \r" sleep 1 clear header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${GN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${GN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${GN}Using ID ${BGN}$CT_ID${CL}" - echo -e "${GN}Using CT Name ${BGN}$HN${CL}" - echo -e "${YW}Enter a Disk Size, or Press [ENTER] for Default: 4Gb " - read SIZEDISK - if [ -z $SIZEDISK ]; then SIZEDISK="4"; fi; - if ! [[ $SIZEDISK =~ $INTEGER ]] ; then echo "ERROR! SIZEDISK MUST HAVE INTEGER NUMBER!"; exit; fi; - echo -en "${GN}Set Disk Size To ${BL}$SIZEDISK${CL}" + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${YW}Enter a Disk Size, or Press [ENTER] for Default: 4Gb " + read DISK_SIZE + if [ -z $DISK_SIZE ]; then DISK_SIZE="4"; fi; + if ! [[ $DISK_SIZE =~ $INTEGER ]] ; then echo "ERROR! DISK SIZE MUST HAVE INTEGER NUMBER!"; exit; fi; + echo -en "${DGN}Set Disk Size To ${BL}$DISK_SIZE${CL}" echo -e " ${CM}${CL} \r" sleep 1 clear header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${GN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${GN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${GN}Using ID ${BGN}$CT_ID${CL}" - echo -e "${GN}Using CT Name ${BGN}$HN${CL}" - echo -e "${GN}Using Disk Size ${BGN}$SIZEDISK${CL}" - echo -e "${YW}Storages Available:${CL}" - echo " " - for stg in `pvesh get storage --noborder --noheader` - do - echo -e "${BL} - ${stg}${CL}" - done - echo " " - echo -e "${YW}Enter which storage to create the CT, or Press [ENTER] for Default: local-lvm " - read STORAGETYPE - if [ -z $STORAGETYPE ]; then STORAGETYPE="local-lvm"; fi; - echo -en "${GN}Set Storage To ${BL}$STORAGETYPE${CL}" + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${YW}Allocate CPU cores, or Press [ENTER] for Default: 2 " + read CORE_COUNT + if [ -z $CORE_COUNT ]; then CORE_COUNT="2"; fi; + echo -en "${DGN}Set Cores To ${BL}$CORE_COUNT${CL}" echo -e " ${CM}${CL} \r" sleep 1 clear header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${GN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${GN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${GN}Using ID ${BGN}$CT_ID${CL}" - echo -e "${GN}Using CT Name ${BGN}$HN${CL}" - echo -e "${GN}Using Disk Size ${BGN}$SIZEDISK${CL}" - echo -e "${GN}Using Storage ${BGN}$STORAGETYPE${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 "${GN}Set Cores To ${BL}$CORE_COUNT${CL}" -echo -e " ${CM}${CL} \r" -sleep 1 -clear -header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${GN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${GN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${GN}Using ID ${BGN}$CT_ID${CL}" - echo -e "${GN}Using CT Name ${BGN}$HN${CL}" - echo -e "${GN}Using Disk Size ${BGN}$SIZEDISK${CL}" - echo -e "${GN}Using Storage ${BGN}$STORAGETYPE${CL}" - echo -e "${GN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 1024 " - read RAM_SIZE - if [ -z $RAM_SIZE ]; then RAM_SIZE="1024"; fi; - echo -en "${GN}Set RAM To ${BL}$RAM_SIZE${CL}" + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 1024 " + read RAM_SIZE + if [ -z $RAM_SIZE ]; then RAM_SIZE="1024"; fi; + echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}" echo -e " ${CM}${CL} \n" sleep 1 clear header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${GN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${GN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${GN}Using ID ${BGN}$CT_ID${CL}" - echo -e "${GN}Using CT Name ${BGN}$HN${CL}" - echo -e "${GN}Using Disk Size ${BGN}$SIZEDISK${CL}" - echo -e "${GN}Using Storage ${BGN}$STORAGETYPE${CL}" - echo -e "${GN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${GN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" - echo -e "${YW}Enter a IP Address, or Press [ENTER] for Default: DHCP " - read NET - if [ -z $NET ]; then NET="dhcp"; fi; - echo -en "${GN}Set IP Address To ${BL}$NET${CL}" + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${YW}Enter a IP Address, or Press [ENTER] for Default: DHCP " + read NET + if [ -z $NET ]; then NET="dhcp"; fi; + echo -en "${DGN}Set IP Address To ${BL}$NET${CL}" echo -e " ${CM}${CL} \n" sleep 1 clear header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${GN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${GN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${GN}Using ID ${BGN}$CT_ID${CL}" - echo -e "${GN}Using CT Name ${BGN}$HN${CL}" - echo -e "${GN}Using Disk Size ${BGN}$SIZEDISK${CL}" - echo -e "${GN}Using Storage ${BGN}$STORAGETYPE${CL}" - echo -e "${GN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${GN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" - echo -e "${GN}Using IP Address ${BGN}$NET${CL}" - echo -e "${YW}Enter a VLAN Tag, or Press [ENTER] for Default: NONE " - read VLAN1 - if [ -z $VLAN1 ]; then VLAN1="NONE" VLAN=" "; - echo -en "${GN}Set VLAN Tag To ${BL}$VLAN1${CL}" - else - VLAN="-tag $VLAN1" - echo -en "${GN}Set VLAN Tag To ${BL}$VLAN1${CL}" - fi; + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" + echo -e "${YW}Enter a VLAN Tag, or Press [ENTER] for Default: NONE " + read VLAN1 + if [ -z $VLAN1 ]; then VLAN1="NONE" VLAN=" "; + echo -en "${DGN}Set VLAN Tag To ${BL}$VLAN1${CL}" + else + VLAN="-tag $VLAN1" + echo -en "${DGN}Set VLAN Tag To ${BL}$VLAN1${CL}" + fi; echo -e " ${CM}${CL} \n" sleep 1 clear header_info - echo -e "${RD}Using Advanced Settings${CL}" - echo -e "${GN}Using CT Type ${BGN}$CT_TYPE1${CL}" - echo -e "${GN}Using CT Password ${BGN}$PW1${CL}" - echo -e "${GN}Using ID ${BGN}$CT_ID${CL}" - echo -e "${GN}Using CT Name ${BGN}$HN${CL}" - echo -e "${GN}Using Disk Size ${BGN}$SIZEDISK${CL}" - echo -e "${GN}Using Storage ${BGN}$STORAGETYPE${CL}" - echo -e "${GN}Using ${BGN}${CORE_COUNT}vCPU${CL}" - echo -e "${GN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" - echo -e "${GN}Using IP Address ${BGN}$NET${CL}" - echo -e "${GN}Using VLAN Tag ${BGN}$VLAN1${CL}" + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${GN} RAM${CL}" + echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" + echo -e "${DGN}Using VLAN Tag ${BGN}$VLAN1${CL}" read -p "Are these settings correct(y/n)? " -n 1 -r echo @@ -263,56 +249,10 @@ function start_script() { advanced_settings fi; } -pve_check + start_script -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 [ "$CT_TYPE" == "1" ]; then +if [ "$CT_TYPE" == "1" ]; then FEATURES="nesting=1,keyctl=1" else FEATURES="nesting=1" @@ -324,7 +264,7 @@ pushd $TEMP_DIR >/dev/null export CTID=$CT_ID export PCT_OSTYPE=debian export PCT_OSVERSION=11 -export PCT_DISK_SIZE=$SIZEDISK +export PCT_DISK_SIZE=$DISK_SIZE export PCT_OPTIONS=" -features $FEATURES -hostname $HN @@ -354,14 +294,12 @@ lxc.mount.entry: /dev/ttyUSB0 dev/ttyUSB0 none bind,optional,create= lxc.mount.entry: /dev/ttyACM0 dev/ttyACM0 none bind,optional,create=file EOF -echo -en "${GN} Starting LXC Container... " +msg_info "Starting LXC Container" pct start $CTID -echo -e "${CM}${CL} \r" +msg_ok "Started LXC Container" -alias lxc-cmd="lxc-attach -n $CTID --" - -lxc-cmd bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/setup/zigbee2mqtt-install.sh)" || exit +lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/setup/zigbee2mqtt-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" +msg_ok "Completed Successfully!\n" diff --git a/ct/zwavejs2mqtt-v3.sh b/ct/zwavejs2mqtt-v3.sh new file mode 100644 index 00000000..5a47c301 --- /dev/null +++ b/ct/zwavejs2mqtt-v3.sh @@ -0,0 +1,306 @@ +#!/usr/bin/env bash -ex +set -euo pipefail +shopt -s inherit_errexit nullglob +NEXTID=$(pvesh get /cluster/nextid) +INTEGER='^[0-9]+$' +YW=`echo "\033[33m"` +BL=`echo "\033[36m"` +RD=`echo "\033[01;31m"` +BGN=`echo "\033[4;92m"` +GN=`echo "\033[1;92m"` +DGN=`echo "\033[32m"` +CL=`echo "\033[m"` +BFR="\\r\\033[K" +HOLD="-" +CM="${GN}✓${CL}" +APP="Zwavejs2MQTT" +NSAPP=$(echo ${APP,,} | tr -d ' ') +while true; do + read -p "This will create a New ${APP} LXC. Proceed(y/n)?" yn + case $yn in + [Yy]* ) break;; + [Nn]* ) exit;; + * ) echo "Please answer yes or no.";; + esac +done +clear +function header_info { +echo -e "${BL} + ______ _ ___ __ __ ____ _______ _______ + |___ / (_) |__ \| \/ |/ __ \__ __|__ __| + / /_ ____ ___ _____ _ ___ ) | \ / | | | | | | | | + / /\ \ /\ / / _ \ \ / / _ \ / __| / /| |\/| | | | | | | | | + / /__\ V V / (_| |\ V / __/ \__ \/ /_| | | | |__| | | | | | + /_____|\_/\_/ \__,_| \_/ \___| |___/____|_| |_|\___\_\ |_| 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 ID ${BGN}$NEXTID${CL}" + CT_ID=$NEXTID + echo -e "${DGN}Using CT Name ${BGN}$NSAPP${CL}" + HN=$NSAPP + echo -e "${DGN}Using Disk Size ${BGN}4GB${CL}" + DISK_SIZE="4" + echo -e "${DGN}Using ${BGN}2vCPU${CL}" + CORE_COUNT="2" + echo -e "${DGN}Using ${BGN}1024MiB${CL}${DGN} RAM${CL}" + RAM_SIZE="1024" + echo -e "${DGN}Using IP Address ${BGN}DHCP${CL}" + NET=dhcp + echo -e "${DGN}Using VLAN Tag ${BGN}NONE${CL}" + VLAN=" " +} + +function advanced_settings() { + clear + header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${YW}Type 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 ID ${BGN}$CT_ID${CL}" + echo -e "${YW}Enter CT Name (no-spaces), or Press [ENTER] for Default: $NSAPP " + read CT_NAME + if [ -z $CT_NAME ]; then + HN=$NSAPP + else + HN=$(echo ${CT_NAME,,} | tr -d ' ') + fi + echo -en "${DGN}Set CT Name To ${BL}$HN${CL}" +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${YW}Enter a Disk Size, or Press [ENTER] for Default: 4Gb " + read DISK_SIZE + if [ -z $DISK_SIZE ]; then DISK_SIZE="4"; fi; + if ! [[ $DISK_SIZE =~ $INTEGER ]] ; then echo "ERROR! DISK SIZE MUST HAVE INTEGER NUMBER!"; exit; fi; + echo -en "${DGN}Set Disk Size To ${BL}$DISK_SIZE${CL}" +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${YW}Allocate CPU cores, or Press [ENTER] for Default: 2 " + read CORE_COUNT + if [ -z $CORE_COUNT ]; then CORE_COUNT="2"; fi; + echo -en "${DGN}Set Cores To ${BL}$CORE_COUNT${CL}" +echo -e " ${CM}${CL} \r" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${YW}Allocate RAM in MiB, or Press [ENTER] for Default: 1024 " + read RAM_SIZE + if [ -z $RAM_SIZE ]; then RAM_SIZE="1024"; fi; + echo -en "${DGN}Set RAM To ${BL}$RAM_SIZE${CL}" +echo -e " ${CM}${CL} \n" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" + echo -e "${YW}Enter a IP Address, or Press [ENTER] for Default: DHCP " + read NET + if [ -z $NET ]; then NET="dhcp"; fi; + echo -en "${DGN}Set IP Address To ${BL}$NET${CL}" +echo -e " ${CM}${CL} \n" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" + echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" + echo -e "${YW}Enter a VLAN Tag, or Press [ENTER] for Default: NONE " + read VLAN1 + if [ -z $VLAN1 ]; then VLAN1="NONE" VLAN=" "; + echo -en "${DGN}Set VLAN Tag To ${BL}$VLAN1${CL}" + else + VLAN="-tag $VLAN1" + echo -en "${DGN}Set VLAN Tag To ${BL}$VLAN1${CL}" + fi; +echo -e " ${CM}${CL} \n" +sleep 1 +clear +header_info + echo -e "${RD}Using Advanced Settings${CL}" + echo -e "${DGN}Using CT Type ${BGN}$CT_TYPE1${CL}" + echo -e "${DGN}Using CT Password ${BGN}$PW1${CL}" + echo -e "${DGN}Using ID ${BGN}$CT_ID${CL}" + echo -e "${DGN}Using CT Name ${BGN}$HN${CL}" + echo -e "${DGN}Using Disk Size ${BGN}$DISK_SIZE${CL}" + echo -e "${DGN}Using ${BGN}${CORE_COUNT}vCPU${CL}" + echo -e "${DGN}Using ${BGN}${RAM_SIZE}MiB${CL}${DGN} RAM${CL}" + echo -e "${DGN}Using IP Address ${BGN}$NET${CL}" + echo -e "${DGN}Using VLAN Tag ${BGN}$VLAN1${CL}" + +read -p "Are these settings correct(y/n)? " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Yy]$ ]] +then + advanced_settings +fi +} + +function start_script() { + echo -e "${YW}Type Advanced, or Press [ENTER] for Default Settings " + read SETTINGS + if [ -z $SETTINGS ]; then default_settings; + else + advanced_settings + fi; +} + +start_script + +if [ "$CT_TYPE" == "1" ]; then + FEATURES="nesting=1,keyctl=1" + else + FEATURES="nesting=1" + fi + +TEMP_DIR=$(mktemp -d) +pushd $TEMP_DIR >/dev/null + +export CTID=$CT_ID +export PCT_OSTYPE=debian +export PCT_OSVERSION=11 +export PCT_DISK_SIZE=$DISK_SIZE +export PCT_OPTIONS=" + -features $FEATURES + -hostname $HN + -net0 name=eth0,bridge=vmbr0,ip=$NET + $VLAN + -onboot 1 + -cores $CORE_COUNT + -memory $RAM_SIZE + -unprivileged $CT_TYPE + $PW +" +bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/ct/create_lxc.sh)" || exit + +STORAGE_TYPE=$(pvesm status -storage $(pct config $CTID | grep rootfs | awk -F ":" '{print $2}') | awk 'NR>1 {print $2}') +if [ "$STORAGE_TYPE" == "zfspool" ]; then + warn "Some addons may not work due to ZFS not supporting 'fallocate'." +fi +LXC_CONFIG=/etc/pve/lxc/${CTID}.conf +cat <> $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 + +echo -en "${GN} Starting LXC Container... " +pct start $CTID +echo -e "${CM}${CL} \r" + +lxc-attach -n $CTID -- bash -c "$(wget -qLO - https://raw.githubusercontent.com/tteck/Proxmox/main/setup/zwavejs2mqtt-install.sh)" || exit + +IP=$(pct exec $CTID ip a s dev eth0 | sed -n '/inet / s/\// /p' | awk '{print $2}') + +msg_ok "Completed Successfully!\n" +echo -e "${APP} should be reachable by going to the following URL. + ${BL}http://${IP}:8091${CL} \n" diff --git a/setup/homeassistant-install.sh b/setup/homeassistant-install.sh index a27d5f8d..967f0765 100644 --- a/setup/homeassistant-install.sh +++ b/setup/homeassistant-install.sh @@ -1,26 +1,6 @@ -#!/usr/bin/env bash - -set -o errexit -set -o errtrace -set -o nounset -set -o pipefail -shopt -s expand_aliases -alias die='EXIT=$? LINE=$LINENO error_exit' -trap die ERR -trap 'die "Script interrupted."' INT - -function error_exit() { - trap - ERR - local DEFAULT='Unknown failure occured.' - local REASON="\e[97m${1:-$DEFAULT}\e[39m" - local FLAG="\e[91m[ERROR:LXC] \e[93m$EXIT@$LINE" - msg "$FLAG $REASON" - exit $EXIT -} -function msg() { - local TEXT="$1" - echo -e "$TEXT" -} +#!/usr/bin/env bash -ex +set -euo pipefail +shopt -s inherit_errexit nullglob YW=`echo "\033[33m"` RD=`echo "\033[01;31m"` diff --git a/setup/zigbee2mqtt-install.sh b/setup/zigbee2mqtt-install.sh index e752e3b8..9a0efcda 100644 --- a/setup/zigbee2mqtt-install.sh +++ b/setup/zigbee2mqtt-install.sh @@ -1,38 +1,31 @@ -#!/usr/bin/env bash - -set -o errexit -set -o errtrace -set -o nounset -set -o pipefail -shopt -s expand_aliases -alias die='EXIT=$? LINE=$LINENO error_exit' -trap die ERR -trap 'die "Script interrupted."' INT - -function error_exit() { - trap - ERR - local DEFAULT='Unknown failure occured.' - local REASON="\e[97m${1:-$DEFAULT}\e[39m" - local FLAG="\e[91m[ERROR:LXC] \e[93m$EXIT@$LINE" - msg "$FLAG $REASON" - exit $EXIT -} -function msg() { - local TEXT="$1" - echo -e "$TEXT" -} +#!/usr/bin/env bash -ex +set -euo pipefail +shopt -s inherit_errexit nullglob +YW=`echo "\033[33m"` RD=`echo "\033[01;31m"` BL=`echo "\033[36m"` GN=`echo "\033[1;92m"` CL=`echo "\033[m"` -CM="${GN}✓${CL}" -CROSS="${RD}✗${CL}" RETRY_NUM=10 RETRY_EVERY=3 NUM=$RETRY_NUM +CM="${GN}✓${CL}" +CROSS="${RD}✗${CL}" +BFR="\\r\\033[K" +HOLD="-" -echo -en "${GN} Setting up Container OS... " +function msg_info() { + local msg="$1" + echo -ne " ${HOLD} ${YW}${msg}..." +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR} ${CM} ${GN}${msg}${CL}" +} + +msg_info "Setting up Container OS " sed -i "/$LANG/ s/\(^# \)//" /etc/locale.gen locale-gen >/dev/null while [ "$(hostname -I)" = "" ]; do @@ -45,37 +38,37 @@ while [ "$(hostname -I)" = "" ]; do exit 1 fi done -echo -e "${CM}${CL} \r" -echo -en "${GN} Network Connected: ${BL}$(hostname -I)${CL} " -echo -e "${CM}${CL} \r" +msg_ok "Set up Container OS" +msg_ok "Network Connected: ${BL}$(hostname -I)" -echo -en "${GN} Updating Container OS... " +msg_info "Updating Container OS" apt update &>/dev/null apt-get -qqy upgrade &>/dev/null -echo -e "${CM}${CL} \r" +msg_ok "Updated Container OS" -echo -en "${GN} Installing Dependencies... " +msg_info "Installing Dependencies" apt-get install -y curl &>/dev/null apt-get install -y sudo &>/dev/null -echo -e "${CM}${CL} \r" +msg_ok "Installed Dependencies" -echo -en "${GN} Setting up Node.js Repository... " +msg_info "Setting up Node.js Repository" sudo curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - &>/dev/null -echo -e "${CM}${CL} \r" +msg_ok "Set up Node.js Repository" -echo -en "${GN} Installing Node.js... " +msg_info "Installing Node.js" sudo apt-get install -y nodejs git make g++ gcc &>/dev/null -echo -e "${CM}${CL} \r" +msg_ok "Installed Node.js" -echo -en "${GN} Setting up Zigbee2MQTT Repository... " +msg_info "Setting up Zigbee2MQTT Repository" sudo git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt &>/dev/null -echo -e "${CM}${CL} \r" +msg_ok "Set up Zigbee2MQTT Repository" -echo -en "${GN} Installing Zigbee2MQTT... " +msg_info "Installing Zigbee2MQTT" cd /opt/zigbee2mqtt &>/dev/null npm ci &>/dev/null -echo -e "${CM}${CL} \r" +msg_ok "Installed Zigbee2MQTT" +msg_info "Creating Service" service_path="/etc/systemd/system/zigbee2mqtt.service" echo "[Unit] Description=zigbee2mqtt @@ -90,9 +83,11 @@ User=root [Install] WantedBy=multi-user.target" > $service_path systemctl enable zigbee2mqtt.service &>/dev/null +msg_ok "Created Service" + PASS=$(grep -w "root" /etc/shadow | cut -b6); if [[ $PASS != $ ]]; then -echo -en "${GN} Customizing Container... " +msg_info "Customizing Container" rm /etc/motd rm /etc/update-motd.d/10-uname touch ~/.hushlogin @@ -105,11 +100,11 @@ ExecStart=-/sbin/agetty --autologin root --noclear --keep-baud tty%I 115200,3840 EOF systemctl daemon-reload systemctl restart $(basename $(dirname $GETTY_OVERRIDE) | sed 's/\.d//') -echo -e "${CM}${CL} \r" +msg_ok "Customized Container" fi -echo -en "${GN} Cleanup... " +msg_info "Cleaning up" apt-get autoremove >/dev/null apt-get autoclean >/dev/null rm -rf /var/{cache,log}/* /var/lib/apt/lists/* -echo -e "${CM}${CL} \n" +msg_ok "Cleaned" diff --git a/setup/zwavejs2mqtt-install.sh b/setup/zwavejs2mqtt-install.sh index ca1f71d0..5fe2f04c 100644 --- a/setup/zwavejs2mqtt-install.sh +++ b/setup/zwavejs2mqtt-install.sh @@ -1,38 +1,31 @@ -#!/usr/bin/env bash - -set -o errexit -set -o errtrace -set -o nounset -set -o pipefail -shopt -s expand_aliases -alias die='EXIT=$? LINE=$LINENO error_exit' -trap die ERR -trap 'die "Script interrupted."' INT - -function error_exit() { - trap - ERR - local DEFAULT='Unknown failure occured.' - local REASON="\e[97m${1:-$DEFAULT}\e[39m" - local FLAG="\e[91m[ERROR:LXC] \e[93m$EXIT@$LINE" - msg "$FLAG $REASON" - exit $EXIT -} -function msg() { - local TEXT="$1" - echo -e "$TEXT" -} +#!/usr/bin/env bash -ex +set -euo pipefail +shopt -s inherit_errexit nullglob +YW=`echo "\033[33m"` RD=`echo "\033[01;31m"` BL=`echo "\033[36m"` GN=`echo "\033[1;92m"` CL=`echo "\033[m"` -CM="${GN}✓${CL}" -CROSS="${RD}✗${CL}" RETRY_NUM=10 RETRY_EVERY=3 NUM=$RETRY_NUM +CM="${GN}✓${CL}" +CROSS="${RD}✗${CL}" +BFR="\\r\\033[K" +HOLD="-" -echo -en "${GN} Setting up Container OS... " +function msg_info() { + local msg="$1" + echo -ne " ${HOLD} ${YW}${msg}..." +} + +function msg_ok() { + local msg="$1" + echo -e "${BFR} ${CM} ${GN}${msg}${CL}" +} + +msg_info "Setting up Container OS " sed -i "/$LANG/ s/\(^# \)//" /etc/locale.gen locale-gen >/dev/null while [ "$(hostname -I)" = "" ]; do @@ -45,32 +38,29 @@ while [ "$(hostname -I)" = "" ]; do exit 1 fi done -echo -e "${CM}${CL} \r" -echo -en "${GN} Network Connected: ${BL}$(hostname -I)${CL} " -echo -e "${CM}${CL} \r" +msg_ok "Set up Container OS" +msg_ok "Network Connected: ${BL}$(hostname -I)" -echo -en "${GN} Updating Container OS... " +msg_info "Updating Container OS" apt update &>/dev/null apt-get -qqy upgrade &>/dev/null -echo -e "${CM}${CL} \r" +msg_ok "Updated Container OS" -echo -en "${GN} Installing Dependencies... " -apt-get update &>/dev/null -apt-get -qqy install \ - curl \ - sudo \ - unzip &>/dev/null -echo -e "${CM}${CL} \r" +msg_info "Installing Dependencies" +apt-get install -y curl &>/dev/null +apt-get install -y sudo &>/dev/null +apt-get install -y unzip &>/dev/null +msg_ok "Installed Dependencies" -echo -en "${GN} Installing Zwavejs2MQTT... " +msg_info "Installing Zwavejs2MQTT" mkdir /opt/zwavejs2mqtt cd /opt/zwavejs2mqtt mkdir store curl -s https://api.github.com/repos/zwave-js/zwavejs2mqtt/releases/latest | grep "browser_download_url.*zip" | cut -d : -f 2,3 | tr -d \" | wget -i - &>/dev/null unzip zwavejs2mqtt-v*.zip zwavejs2mqtt &>/dev/null -echo -e "${CM}${CL} \r" +msg_ok "Installed Zwavejs2MQTT" -echo -en "${GN} Creating Service... " +msg_info "Creating Service" service_path="/etc/systemd/system/zwavejs2mqtt.service" echo "[Unit] Description=ZWavejs2MQTT @@ -84,11 +74,11 @@ ExecStart=/opt/zwavejs2mqtt/zwavejs2mqtt WantedBy=multi-user.target" > $service_path systemctl start zwavejs2mqtt systemctl enable zwavejs2mqtt &>/dev/null -echo -e "${CM}${CL} \r" +msg_ok "Created Service" PASS=$(grep -w "root" /etc/shadow | cut -b6); if [[ $PASS != $ ]]; then -echo -en "${GN} Customizing Container... " +msg_info "Customizing Container" rm /etc/motd rm /etc/update-motd.d/10-uname touch ~/.hushlogin @@ -101,12 +91,12 @@ ExecStart=-/sbin/agetty --autologin root --noclear --keep-baud tty%I 115200,3840 EOF systemctl daemon-reload systemctl restart $(basename $(dirname $GETTY_OVERRIDE) | sed 's/\.d//') -echo -e "${CM}${CL} \r" +msg_ok "Customized Container" fi - -echo -en "${GN} Cleanup... " + +msg_info "Cleaning up" rm zwavejs2mqtt-v*.zip apt-get autoremove >/dev/null apt-get autoclean >/dev/null rm -rf /var/{cache,log}/* /var/lib/apt/lists/* -echo -e "${CM}${CL} \n" +msg_ok "Cleaned"