2022-09-29 17:09:06 +02:00
#!/usr/bin/env bash
2022-12-22 22:04:51 +02:00
if [ " $VERBOSE " = = "yes" ] ; then set -x; fi
2022-10-30 03:04:45 +02:00
YW = $( echo "\033[33m" )
RD = $( echo "\033[01;31m" )
BL = $( echo "\033[36m" )
GN = $( echo "\033[1;92m" )
CL = $( echo "\033[m" )
2022-09-29 17:09:06 +02:00
RETRY_NUM = 10
RETRY_EVERY = 3
NUM = $RETRY_NUM
CM = " ${ GN } ✓ ${ CL } "
CROSS = " ${ RD } ✗ ${ CL } "
BFR = "\\r\\033[K"
HOLD = "-"
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( ) {
2022-10-30 03:04:45 +02:00
local msg = " $1 "
echo -ne " ${ HOLD } ${ YW } ${ msg } ... "
2022-09-29 17:09:06 +02:00
}
function msg_ok( ) {
2022-10-30 03:04:45 +02:00
local msg = " $1 "
echo -e " ${ BFR } ${ CM } ${ GN } ${ msg } ${ CL } "
2022-09-29 17:09:06 +02:00
}
function msg_error( ) {
2022-10-30 03:04:45 +02:00
local msg = " $1 "
echo -e " ${ BFR } ${ CROSS } ${ RD } ${ msg } ${ CL } "
2022-09-29 17:09:06 +02:00
}
msg_info "Setting up Container OS "
sed -i " / $LANG / s/\(^# \)// " /etc/locale.gen
locale-gen >/dev/null
while [ " $( hostname -I) " = "" ] ; do
2022-10-30 03:04:45 +02:00
echo 1>& 2 -en " ${ CROSS } ${ RD } No Network! "
2022-09-29 17:09:06 +02:00
sleep $RETRY_EVERY
( ( NUM--) )
2022-10-30 03:04:45 +02:00
if [ $NUM -eq 0 ] ; then
echo 1>& 2 -e " ${ CROSS } ${ RD } No Network After $RETRY_NUM Tries ${ CL } "
2022-09-29 17:09:06 +02:00
exit 1
fi
done
msg_ok "Set up Container OS"
msg_ok " Network Connected: ${ BL } $( hostname -I) "
2022-10-22 11:52:33 +02:00
set +e
alias die = ''
2022-10-30 03:04:45 +02:00
if nc -zw1 8.8.8.8 443; then msg_ok "Internet Connected" ; else
msg_error "Internet NOT Connected"
2022-11-13 13:44:26 +02:00
read -r -p "Would you like to continue anyway? <y/N> " prompt
if [ [ $prompt = = "y" || $prompt = = "Y" || $prompt = = "yes" || $prompt = = "Yes" ] ] ; then
echo -e " ⚠️ ${ RD } Expect Issues Without Internet ${ CL } "
else
echo -e " 🖧 Check Network Settings"
exit 1
fi
2022-10-30 03:04:45 +02:00
fi
2022-09-29 17:09:06 +02:00
RESOLVEDIP = $( nslookup "github.com" | awk -F':' '/^Address: / { matched = 1 } matched { print $2}' | xargs)
2022-10-30 03:04:45 +02:00
if [ [ -z " $RESOLVEDIP " ] ] ; then msg_error "DNS Lookup Failure" ; else msg_ok " DNS Resolved github.com to $RESOLVEDIP " ; fi
2022-10-22 11:52:33 +02:00
alias die = 'EXIT=$? LINE=$LINENO error_exit'
set -e
2022-09-29 17:09:06 +02:00
msg_info "Updating Container OS"
apt-get update & >/dev/null
apt-get -y upgrade & >/dev/null
msg_ok "Updated Container OS"
2022-12-16 14:59:52 +02:00
msg_info "Installing Dependencies (Patience)"
2022-09-29 17:09:06 +02:00
apt-get install -y \
2022-12-16 14:59:52 +02:00
make \
build-essential \
2022-10-30 03:04:45 +02:00
libjpeg-dev \
libpcap-dev \
2022-12-16 14:59:52 +02:00
libssl-dev \
2022-10-30 03:04:45 +02:00
zlib1g-dev \
2022-12-16 14:59:52 +02:00
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
2022-12-17 22:37:12 +02:00
libmariadb-dev-compat \
2022-10-30 03:04:45 +02:00
autoconf \
2022-12-16 14:59:52 +02:00
git \
curl \
sudo \
llvm \
libncursesw5-dev \
xz-utils \
2022-12-17 22:37:12 +02:00
tzdata \
bluez \
2022-12-16 14:59:52 +02:00
tk-dev \
libxml2-dev \
libxmlsec1-dev \
libffi-dev \
2022-10-30 03:04:45 +02:00
libopenjp2-7 \
libtiff5 \
libturbojpeg0-dev \
2022-12-16 14:59:52 +02:00
liblzma-dev & >/dev/null
2022-09-29 17:09:06 +02:00
msg_ok "Installed Dependencies"
2022-12-17 22:37:12 +02:00
msg_info "Installing Linux D-Bus Message Broker"
cat <<EOF >>/etc/apt/sources.list
deb http://deb.debian.org/debian bullseye-backports main contrib non-free
deb-src http://deb.debian.org/debian bullseye-backports main contrib non-free
EOF
apt-get update & >/dev/null
apt-get -t bullseye-backports install -y dbus-broker & >/dev/null
systemctl enable --now dbus-broker.service & >/dev/null
msg_ok "Installed Linux D-Bus Message Broker"
2022-12-16 14:59:52 +02:00
msg_info "Installing pyenv"
git clone https://github.com/pyenv/pyenv.git ~/.pyenv & >/dev/null
set +e
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init --path)"\nfi' >> ~/.bashrc
msg_ok "Installed pyenv"
. ~/.bashrc
set -e
msg_info "Installing Python 3.10.8"
pyenv install 3.10.8 & >/dev/null
pyenv global 3.10.8
msg_ok "Installed Python 3.10.8"
2022-12-28 22:10:36 +02:00
read -r -p " Use the Beta Branch? <y/N> " prompt
if [ [ $prompt = = "y" || $prompt = = "Y" || $prompt = = "yes" || $prompt = = "Yes" ] ] ; then
BR = "--pre "
else
BR = ""
fi
2022-09-29 17:09:06 +02:00
msg_info "Installing Home Assistant-Core"
2022-10-30 03:04:45 +02:00
mkdir /srv/homeassistant
2022-09-29 17:09:06 +02:00
cd /srv/homeassistant
python3 -m venv .
2022-10-30 03:04:45 +02:00
source bin/activate
2022-12-17 22:37:12 +02:00
pip install --upgrade pip & >/dev/null
2022-09-29 17:09:06 +02:00
python3 -m pip install wheel & >/dev/null
2022-12-17 22:37:12 +02:00
pip install mysqlclient & >/dev/null
pip install psycopg2-binary & >/dev/null
2022-12-28 22:10:36 +02:00
pip install ${ BR } homeassistant & >/dev/null
2022-09-29 17:09:06 +02:00
msg_ok "Installed Home Assistant-Core"
2022-12-17 22:37:12 +02:00
# fix for inconsistent versions, hopefully the HA team will get this fixed
2022-12-28 22:49:57 +02:00
if [ " ${ BR } " = = "--pre " ] ; then
2022-12-29 13:11:45 +02:00
sed -i '{s/dbus-fast==1.82.0/dbus-fast==1.83.1/g; s/bleak==0.19.2/bleak==0.19.5/g}' /srv/homeassistant/lib/python3.10/site-packages/homeassistant/package_constraints.txt
sed -i '{s/dbus-fast==1.82.0/dbus-fast==1.83.1/g; s/bleak==0.19.2/bleak==0.19.5/g}' /srv/homeassistant/lib/python3.10/site-packages/homeassistant/components/bluetooth/manifest.json
2022-12-28 22:49:57 +02:00
else
2022-12-29 13:11:45 +02:00
sed -i '{s/dbus-fast==1.75.0/dbus-fast==1.83.1/g; s/bleak==0.19.2/bleak==0.19.5/g}' /srv/homeassistant/lib/python3.10/site-packages/homeassistant/package_constraints.txt
sed -i '{s/dbus-fast==1.75.0/dbus-fast==1.83.1/g; s/bleak==0.19.2/bleak==0.19.5/g}' /srv/homeassistant/lib/python3.10/site-packages/homeassistant/components/bluetooth/manifest.json
2022-12-28 22:49:57 +02:00
fi
2022-12-17 22:37:12 +02:00
2022-09-29 17:09:06 +02:00
msg_info "Creating Service"
2022-10-30 03:04:45 +02:00
cat <<EOF >/etc/systemd/system/homeassistant.service
2022-09-29 17:09:06 +02:00
[ Unit]
Description = Home Assistant
After = network-online.target
[ Service]
Type = simple
WorkingDirectory = /root/.homeassistant
ExecStart = /srv/homeassistant/bin/hass -c "/root/.homeassistant"
2022-10-03 02:19:43 +02:00
RestartForceExitStatus = 100
2022-09-29 17:09:06 +02:00
[ Install]
WantedBy = multi-user.target
EOF
systemctl enable homeassistant & >/dev/null
msg_ok "Created Service"
2022-10-30 03:04:45 +02:00
PASS = $( grep -w "root" /etc/shadow | cut -b6)
if [ [ $PASS != $ ] ] ; then
msg_info "Customizing Container"
chmod -x /etc/update-motd.d/*
touch ~/.hushlogin
GETTY_OVERRIDE = "/etc/systemd/system/container-getty@1.service.d/override.conf"
mkdir -p $( dirname $GETTY_OVERRIDE )
cat <<EOF >$GE TTY_OVERRIDE
2022-09-29 17:09:06 +02:00
[ Service]
ExecStart =
ExecStart = -/sbin/agetty --autologin root --noclear --keep-baud tty%I 115200,38400,9600 \$ TERM
EOF
2022-10-30 03:04:45 +02:00
systemctl daemon-reload
systemctl restart $( basename $( dirname $GETTY_OVERRIDE ) | sed 's/\.d//' )
msg_ok "Customized Container"
fi
2022-11-23 19:34:11 +02:00
if [ [ " ${ SSH_ROOT } " = = "yes" ] ] ; then
2022-12-19 18:08:29 +02:00
sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config
systemctl restart sshd
2022-11-23 19:34:11 +02:00
fi
2022-10-30 03:04:45 +02:00
2022-09-29 17:09:06 +02:00
msg_info "Cleaning up"
apt-get autoremove >/dev/null
apt-get autoclean >/dev/null
msg_ok "Cleaned"