forked from tteck/Proxmox
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
256 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,256 @@ | ||
#!/usr/bin/env bash | ||
echo -e "Loading..." | ||
GEN_MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /:/g' | tr '[:lower:]' '[:upper:]') | ||
NEXTID=$(pvesh get /cluster/nextid) | ||
LATEST=$(curl -sX GET "https://api.github.com/repos/home-assistant/operating-system/releases" | awk '/tag_name/{print $4;exit}' FS='[""]') | ||
STABLE=$(curl -s https://raw.githubusercontent.com/home-assistant/version/master/stable.json | grep "ova" | awk '{print substr($2, 2, length($2)-3) }') | ||
YW=`echo "\033[33m"` | ||
BL=`echo "\033[36m"` | ||
HA=`echo "\033[1;34m"` | ||
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 | ||
trap cleanup EXIT | ||
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 | ||
[ ! -z ${VMID-} ] && cleanup_vmid | ||
exit $EXIT | ||
} | ||
function cleanup_vmid() { | ||
if $(qm status $VMID &>/dev/null); then | ||
if [ "$(qm status $VMID | awk '{print $2}')" == "running" ]; then | ||
qm stop $VMID | ||
fi | ||
qm destroy $VMID | ||
fi | ||
} | ||
function cleanup() { | ||
popd >/dev/null | ||
rm -rf $TEMP_DIR | ||
} | ||
TEMP_DIR=$(mktemp -d) | ||
pushd $TEMP_DIR >/dev/null | ||
if (whiptail --title "HOME ASSISTANT OS VM" --yesno "This will create a New Home Assistant OS VM. Proceed?" 10 58); then | ||
echo "User selected Yes" | ||
else | ||
clear | ||
echo -e "⚠ User exited script \n" | ||
exit | ||
fi | ||
function header_info { | ||
echo -e "${RD} | ||
____ _ __ ___ __ _____ ____ _____ | ||
/ __ \(_) / |/ /___ _ __ / / / / | / __ \/ ___/ | ||
/ /_/ / /v4_/ /|_/ / __ \| |/_/ / /_/ / /| |/ / / /\__ \ | ||
/ ____/ /___/ / / / /_/ /> < / __ / ___ / /_/ /___/ / | ||
/_/ /_/ /_/ /_/\____/_/|_| /_/ /_/_/ |_\____//____/ | ||
${CL}" | ||
} | ||
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 default_settings() { | ||
echo -e "${DGN}Using HAOS Version: ${BGN}${STABLE}${CL}" | ||
BRANCH=${STABLE} | ||
echo -e "${DGN}Using Virtual Machine ID: ${BGN}$NEXTID${CL}" | ||
VMID=$NEXTID | ||
echo -e "${DGN}Using Hostname: ${BGN}haos${STABLE}${CL}" | ||
HN=haos${STABLE} | ||
echo -e "${DGN}Allocated Cores: ${BGN}2${CL}" | ||
CORE_COUNT="2" | ||
echo -e "${DGN}Allocated RAM: ${BGN}4096${CL}" | ||
RAM_SIZE="4096" | ||
echo -e "${DGN}Using Bridge: ${BGN}vmbr0${CL}" | ||
BRG="vmbr0" | ||
echo -e "${DGN}Using MAC Address: ${BGN}$GEN_MAC${CL}" | ||
MAC=$GEN_MAC | ||
echo -e "${DGN}Using VLAN: ${BGN}Default${CL}" | ||
VLAN="" | ||
echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}" | ||
START_VM="yes" | ||
echo -e "${BL}Creating a HAOS VM using the above default settings${CL}" | ||
} | ||
function advanced_settings() { | ||
BRANCH=$(whiptail --title "HAOS VERSION" --radiolist "Choose Version" 10 58 2 \ | ||
"$STABLE" "Stable" ON \ | ||
"$LATEST" "Latest" OFF \ | ||
3>&1 1>&2 2>&3) | ||
exitstatus=$? | ||
if [ $exitstatus = 0 ]; then | ||
echo -e "${DGN}Using HAOS Version: ${BGN}$BRANCH${CL}" | ||
else | ||
exit | ||
fi | ||
VMID=$(whiptail --inputbox "Set Virtual Machine ID" 8 58 $NEXTID --title "VIRTUAL MACHINE ID" 3>&1 1>&2 2>&3) | ||
exitstatus=$? | ||
if [ $exitstatus = 0 ]; then | ||
echo -e "${DGN}Using Virtual Machine ID: ${BGN}$VMID${CL}" | ||
else | ||
exit | ||
fi | ||
VM_NAME=$(whiptail --inputbox "Set Hostname" 8 58 haos${STABLE} --title "HOSTNAME" 3>&1 1>&2 2>&3) | ||
exitstatus=$? | ||
if [ $exitstatus = 0 ]; then | ||
HN=$(echo ${VM_NAME,,} | tr -d ' ') | ||
echo -e "${DGN}Using Hostname: ${BGN}$HN${CL}" | ||
else | ||
exit | ||
fi | ||
CORE_COUNT=$(whiptail --inputbox "Allocate CPU Cores" 8 58 2 --title "CORE COUNT" 3>&1 1>&2 2>&3) | ||
exitstatus=$? | ||
if [ $exitstatus = 0 ]; then | ||
echo -e "${DGN}Allocated Cores: ${BGN}$CORE_COUNT${CL}" | ||
else | ||
exit | ||
fi | ||
RAM_SIZE=$(whiptail --inputbox "Allocate RAM in MiB" 8 58 4096 --title "RAM" 3>&1 1>&2 2>&3) | ||
exitstatus=$? | ||
if [ $exitstatus = 0 ]; then | ||
echo -e "${DGN}Allocated RAM: ${BGN}$RAM_SIZE${CL}" | ||
else | ||
exit | ||
fi | ||
BRG=$(whiptail --inputbox "Set a Bridge" 8 58 vmbr0 --title "BRIDGE" 3>&1 1>&2 2>&3) | ||
exitstatus=$? | ||
if [ $exitstatus = 0 ]; then | ||
echo -e "${DGN}Using Bridge: ${BGN}$BRG${CL}" | ||
else | ||
exit | ||
fi | ||
MAC1=$(whiptail --inputbox "Set a MAC Address" 8 58 $GEN_MAC --title "MAC ADDRESS" 3>&1 1>&2 2>&3) | ||
exitstatus=$? | ||
if [ $exitstatus = 0 ]; then | ||
MAC="$MAC1" | ||
echo -e "${DGN}Using MAC Address: ${BGN}$MAC1${CL}" | ||
else | ||
exit | ||
fi | ||
VLAN1=$(whiptail --inputbox "Set a Vlan(leave blank for default)" 8 58 --title "VLAN" 3>&1 1>&2 2>&3) | ||
exitstatus=$? | ||
if [ $exitstatus = 0 ]; then | ||
if [ -z $VLAN1 ]; then VLAN1="Default" VLAN=""; | ||
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}" | ||
else | ||
VLAN=",tag=$VLAN1" | ||
echo -e "${DGN}Using Vlan: ${BGN}$VLAN1${CL}" | ||
fi | ||
fi | ||
if (whiptail --title "START VIRTUAL MACHINE" --yesno "Start VM when completed?" 10 58); then | ||
echo -e "${DGN}Start VM when completed: ${BGN}yes${CL}" | ||
START_VM="yes" | ||
else | ||
echo -e "${DGN}Start VM when completed: ${BGN}no${CL}" | ||
START_VM="no" | ||
fi | ||
if (whiptail --title "ADVANCED SETTINGS COMPLETE" --yesno "Ready to create HAOS ${BRANCH} VM?" 10 58); then | ||
echo -e "${RD}Creating a HAOS VM using the above advanced settings${CL}" | ||
else | ||
clear | ||
header_info | ||
echo -e "${RD}Using Advanced Settings${CL}" | ||
advanced_settings | ||
fi | ||
} | ||
function start_script() { | ||
if (whiptail --title "SETTINGS" --yesno "Use Default Settings?" 10 58); then | ||
clear | ||
header_info | ||
echo -e "${BL}Using Default Settings${CL}" | ||
default_settings | ||
else | ||
clear | ||
header_info | ||
echo -e "${RD}Using Advanced Settings${CL}" | ||
advanced_settings | ||
fi | ||
} | ||
start_script | ||
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 images | awk 'NR>1') | ||
if [ $((${#STORAGE_MENU[@]}/3)) -eq 0 ]; then | ||
echo -e "'Disk image' 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 HAOS VM?\n\n" \ | ||
16 $(($MSG_MAX_LENGTH + 23)) 6 \ | ||
"${STORAGE_MENU[@]}" 3>&1 1>&2 2>&3) || exit | ||
done | ||
fi | ||
msg_ok "Using ${CL}${BL}$STORAGE${CL} ${GN}for Storage Location." | ||
msg_ok "Virtual Machine ID is ${CL}${BL}$VMID${CL}." | ||
msg_info "Getting URL for Home Assistant ${BRANCH} Disk Image" | ||
URL=https://github.com/home-assistant/operating-system/releases/download/${BRANCH}/haos_generic-aarch64-${BRANCH}.qcow2.xz | ||
sleep 2 | ||
msg_ok "${CL}${BL}${URL}${CL}" | ||
wget -q --show-progress $URL | ||
echo -en "\e[1A\e[0K" | ||
FILE=$(basename $URL) | ||
msg_ok "Downloaded ${CL}${BL}haos_generic-aarch64-${BRANCH}.qcow2.xz${CL}" | ||
msg_info "Extracting Disk Image" | ||
unxz $FILE | ||
STORAGE_TYPE=$(pvesm status -storage $STORAGE | awk 'NR>1 {print $2}') | ||
case $STORAGE_TYPE in | ||
nfs|dir) | ||
DISK_EXT=".qcow2" | ||
DISK_REF="$VMID/" | ||
DISK_IMPORT="-format qcow2" | ||
esac | ||
for i in {0,1}; do | ||
disk="DISK$i" | ||
eval DISK${i}=vm-${VMID}-disk-${i}${DISK_EXT:-} | ||
eval DISK${i}_REF=${STORAGE}:${DISK_REF:-}${!disk} | ||
done | ||
msg_ok "Extracted Disk Image" | ||
msg_info "Creating HAOS VM" | ||
qm create $VMID -agent 1 -tablet 0 -localtime 1 -bios ovmf -cores $CORE_COUNT -memory $RAM_SIZE -name $HN -net0 virtio,bridge=$BRG,macaddr=$MAC$VLAN \ | ||
-onboot 1 -ostype l26 -scsihw virtio-scsi-pci | ||
pvesm alloc $STORAGE $VMID $DISK0 128 1>&/dev/null | ||
qm importdisk $VMID ${FILE%.*} $STORAGE ${DISK_IMPORT:-} 1>&/dev/null | ||
qm set $VMID \ | ||
-efidisk0 ${DISK0_REF},size=128K \ | ||
-scsi0 ${DISK1_REF},discard=on,size=32G,ssd=1 >/dev/null | ||
qm set $VMID \ | ||
-boot order=scsi0 >/dev/null | ||
qm set $VMID -description "# Home Assistant OS | ||
### https://github.com/tteck/Proxmox" >/dev/null | ||
msg_ok "Created HAOS VM ${CL}${BL}(${HN})" | ||
if [ "$START_VM" == "yes" ]; then | ||
msg_info "Starting Home Assistant OS VM" | ||
qm start $VMID | ||
msg_ok "Started Home Assistant OS VM" | ||
fi | ||
msg_ok "Completed Successfully!\n" |