#!/usr/bin/env bash
# Copyright (c) 2021-2023 tteck
# Author: tteck (tteckster)
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
if [ " $VERBOSE " = "yes" ] ; then set -x; STD = "" ; else STD = "silent" ; fi
silent( ) { " $@ " > /dev/null 2>& 1; }
if [ " $DISABLEIPV6 " = = "yes" ] ; then echo "net.ipv6.conf.all.disable_ipv6 = 1" >>/etc/sysctl.conf; $STD sysctl -p; fi
YW = $( echo "\033[33m" )
RD = $( echo "\033[01;31m" )
BL = $( echo "\033[36m" )
GN = $( echo "\033[1;92m" )
CL = $( echo "\033[m" )
RETRY_NUM = 10
RETRY_EVERY = 3
CM = " ${ GN } ✓ ${ CL } "
CROSS = " ${ RD } ✗ ${ CL } "
BFR = "\\r\\033[K"
HOLD = "-"
set -Eeuo pipefail
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
function error_handler( ) {
local exit_code = " $? "
local line_number = " $1 "
local command = " $2 "
local error_message = " ${ RD } [ERROR] ${ CL } in line ${ RD } $line_number ${ CL } : exit code ${ RD } $exit_code ${ CL } : while executing command ${ YW } $command ${ CL } "
echo -e " \n $error_message \n "
}
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 msg_error( ) {
local msg = " $1 "
echo -e " ${ BFR } ${ CROSS } ${ RD } ${ msg } ${ CL } "
}
msg_info "Setting up Container OS "
sed -i " / $LANG / s/\(^# \)// " /etc/locale.gen
locale-gen >/dev/null
for ( ( i = RETRY_NUM; i>0; i--) ) ; do
if [ " $( hostname -I) " != "" ] ; then
break
fi
echo 1>& 2 -en " ${ CROSS } ${ RD } No Network! "
sleep $RETRY_EVERY
done
if [ " $( hostname -I) " = "" ] ; then
echo 1>& 2 -e " \n ${ CROSS } ${ RD } No Network After $RETRY_NUM Tries ${ CL } "
echo -e " 🖧 Check Network Settings"
exit 1
fi
msg_ok "Set up Container OS"
msg_ok " Network Connected: ${ BL } $( hostname -I) "
set +e
trap - ERR
if ping -c 1 -W 1 1.1.1.1 & > /dev/null; then msg_ok "Internet Connected" ; else
msg_error "Internet NOT Connected"
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
fi
RESOLVEDIP = $( getent hosts github.com | awk '{ print $1 }' )
if [ [ -z " $RESOLVEDIP " ] ] ; then msg_error "DNS Lookup Failure" ; else msg_ok " DNS Resolved github.com to ${ BL } $RESOLVEDIP ${ CL } " ; fi
set -e
trap 'error_handler $LINENO "$BASH_COMMAND"' ERR
msg_info "Updating Container OS"
$STD apt-get update
$STD apt-get -y upgrade
msg_ok "Updated Container OS"
msg_info "Installing Dependencies"
$STD apt-get install -y curl
$STD apt-get install -y sudo
$STD apt-get install -y mc
$STD apt-get install -y gnupg
msg_ok "Installed Dependencies"
msg_info "Setting Phoscon Repository"
$STD apt-key add <( curl -fsSL http://phoscon.de/apt/deconz.pub.key)
sh -c " echo 'deb [arch=amd64] http://phoscon.de/apt/deconz $( lsb_release -cs) main' > /etc/apt/sources.list.d/deconz.list "
msg_ok "Setup Phoscon Repository"
msg_info "Installing deConz"
$STD apt-get update
$STD apt-get install -y deconz
msg_ok "Installed deConz"
msg_info "Creating Service"
service_path = "/lib/systemd/system/deconz.service"
echo " [Unit]
Description = deCONZ: ZigBee gateway -- REST API
Wants = deconz-init.service deconz-update.service
StartLimitIntervalSec = 0
[ Service]
User = root
ExecStart = /usr/bin/deCONZ -platform minimal --http-port= 80
Restart = on-failure
RestartSec = 30
AmbientCapabilities = CAP_NET_BIND_SERVICE CAP_KILL CAP_SYS_BOOT CAP_SYS_TIME
[ Install]
WantedBy = multi-user.target" > $service_path
$STD systemctl enable --now deconz
msg_ok "Created Service"
echo "export TERM='xterm-256color'" >>/root/.bashrc
echo -e " $APPLICATION LXC provided by https://tteck.github.io/Proxmox/\n " > /etc/motd
chmod -x /etc/update-motd.d/*
if ! getent shadow root | grep -q "^root:[^\!*]" ; then
msg_info "Customizing Container"
GETTY_OVERRIDE = "/etc/systemd/system/container-getty@1.service.d/override.conf"
mkdir -p $( dirname $GETTY_OVERRIDE )
cat <<EOF >$GE TTY_OVERRIDE
[ Service]
ExecStart =
ExecStart = -/sbin/agetty --autologin root --noclear --keep-baud tty%I 115200,38400,9600 \$ TERM
EOF
systemctl daemon-reload
systemctl restart $( basename $( dirname $GETTY_OVERRIDE ) | sed 's/\.d//' )
msg_ok "Customized Container"
fi
if [ [ " ${ SSH_ROOT } " = = "yes" ] ] ; then sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config; systemctl restart sshd; fi
msg_info "Cleaning up"
$STD apt-get autoremove
$STD apt-get autoclean
msg_ok "Cleaned"