diff --git a/scripts/functions.sh b/scripts/functions.sh index db51fae..48b6bc2 100644 --- a/scripts/functions.sh +++ b/scripts/functions.sh @@ -42,6 +42,9 @@ get_last_ver(){ } get_live_ver(){ + if [[ ! -e $1 ]]; then + exit + fi local current_ver=$(readlink -f $1) - echo ${current_ver#*-} + echo ${current_ver##*-} } diff --git a/scripts/homeassistant/setup.sh b/scripts/homeassistant/setup.sh index fca53e0..cf4fc66 100755 --- a/scripts/homeassistant/setup.sh +++ b/scripts/homeassistant/setup.sh @@ -8,6 +8,10 @@ source /var/db/repos/container/scripts/functions.sh action=${1:-} +log_dir=/var/log/calculate/cl-setup +rm -rf $log_dir +mkdir -p $log_dir + script_path=$(dirname $(readlink -f $0)) for script in $script_path/step/*.sh; do source "$script" @@ -19,10 +23,21 @@ for i in ${daemon_restart[@]}; do rc-service -s $i stop done + + if [[ ! -e /etc/runlevels/default/homeassistant ]]; then - cl-setup-system - rc-update -u + + echo 'Launch preparation' + ebegin 'Final setup' + cl-setup-system >>$log_dir/setup.log + rc-update -u >>$log_dir/setup.log + eend + + ebegin 'Starting services' + openrc >>$log_dir/setup.log + eend +else + openrc fi -openrc echo "All is done! Open the link ${ini[homeassistant.protocol]}://${ini[homeassistant.domain]} on your browser." diff --git a/scripts/homeassistant/step/1-install.sh b/scripts/homeassistant/step/1-install.sh index 44dbf1f..ba4cc76 100644 --- a/scripts/homeassistant/step/1-install.sh +++ b/scripts/homeassistant/step/1-install.sh @@ -13,7 +13,7 @@ configure() { local work_dir="$home_dir/versions/homeassistant-$last_ver" local live_dir="$home_dir/homeassistant-live" local live_ver="$(get_live_ver $live_dir)" - + if [[ $action == 'check' ]]; then if [[ $live_ver == $last_ver ]]; then einfo "homeassistant: the latest version is installed $live_ver" @@ -29,12 +29,15 @@ configure() { chmod 700 $home_dir chown homeassistant: $home_dir fi + + touch $log_dir/homeassistant.log + chown homeassistant: $log_dir/homeassistant.log if [[ $live_ver != $last_ver ]]; then - if [[ $live_ver != '' ]]; then - echo Update Home Assistant - else + if [[ $live_ver == '' ]]; then echo Install Home Assistant + else + echo Update Home Assistant fi su - homeassistant -s /bin/bash -c "$(cat <<- EOF @@ -48,15 +51,15 @@ configure() { eend ebegin 'Install all Python dependencies' - python -m pip install wheel &>>/tmp/homeassistant.log + python -m pip install wheel &>>$log_dir/homeassistant.log eend ebegin 'Install Home Assistant $last_ver' - pip install homeassistant==$last_ver &>>/tmp/homeassistant.log + pip install homeassistant==$last_ver &>>$log_dir/homeassistant.log eend ebegin 'Install PostgreSQL dependencies' - pip install psycopg2 &>>/tmp/homeassistant.log + pip install psycopg2 &>>$log_dir/homeassistant.log eend rm -f $live_dir diff --git a/scripts/homeassistant/step/2-postgresql.sh b/scripts/homeassistant/step/2-postgresql.sh index 46f7422..ddaa5c9 100644 --- a/scripts/homeassistant/step/2-postgresql.sh +++ b/scripts/homeassistant/step/2-postgresql.sh @@ -8,18 +8,29 @@ configure() { return fi - emerge --config postgresql - + echo 'Setting up PostgreSQL' pg_ver=$(ls /etc/init.d/postgresql-*); pg_ver=${pg_ver##*-} - /etc/init.d/postgresql-$pg_ver start + ebegin "Configuring PostgreSQL $pg_ver" + emerge --config postgresql &>>$log_dir/postgresql.log + eend + + ebegin 'Starting PostgreSQL' + rc-service postgresql-$pg_ver start >>$log_dir/postgresql.log + eend - psql -U postgres -c "ALTER USER postgres WITH PASSWORD '${ini[postgresql.postgres_password]}'" + ebegin 'Database creation' + psql -U postgres -c "ALTER USER postgres WITH PASSWORD '${ini[postgresql.postgres_password]}'" >>$log_dir/postgresql.log createuser -U postgres ${ini[postgresql.homeassistant_user]} createdb -U postgres ${ini[postgresql.homeassistant_database]} -O ${ini[postgresql.homeassistant_user]} - psql -U postgres -c "ALTER USER ${ini[postgresql.homeassistant_user]} WITH PASSWORD '${ini[postgresql.homeassistant_password]}'" + psql -U postgres -c "ALTER USER ${ini[postgresql.homeassistant_user]} WITH PASSWORD '${ini[postgresql.homeassistant_password]}'" >>$log_dir/postgresql.log + eend - cl-core-setup -n postgresql -f + ebegin 'Updating permissions' + cl-core-setup -n postgresql -f >>$log_dir/postgresql.log + eend - /etc/init.d/postgresql-$pg_ver restart + ebegin 'Restart the server' + rc-service postgresql-$pg_ver restart >>$log_dir/postgresql.log + eend } diff --git a/scripts/homeassistant/step/3-zigbee2mqtt.sh b/scripts/homeassistant/step/3-zigbee2mqtt.sh index 767ed88..a3e622b 100644 --- a/scripts/homeassistant/step/3-zigbee2mqtt.sh +++ b/scripts/homeassistant/step/3-zigbee2mqtt.sh @@ -16,6 +16,11 @@ configure() { local live_dir="$home_dir/zigbee2mqtt-live" local live_ver="$(get_live_ver $live_dir)" + # проверим на наличие устройства + if [[ ${ini[zigbee2mqtt.dev]:-} == "" ]]; then + return + fi + if [[ $action == 'check' ]]; then if [[ $live_ver == $last_ver ]]; then einfo "zigbee2mqtt: the latest version is installed $live_ver" @@ -32,11 +37,14 @@ configure() { chown zigbee2mqtt: $home_dir fi + touch $log_dir/zigbee2mqtt.log + chown zigbee2mqtt: $log_dir/zigbee2mqtt.log + if [[ $live_ver != $last_ver ]]; then - if [[ $live_ver != '' ]]; then - echo Update Zigbee2MQTT - else + if [[ $live_ver == '' ]]; then echo Install Zigbee2MQTT + else + echo Update Zigbee2MQTT fi su - zigbee2mqtt -s /bin/bash -c "$(cat <<- EOF @@ -71,28 +79,30 @@ configure() { eend ebegin 'Upgrade pip, wheel and setuptools' - pip install --upgrade pip wheel setuptools &>>/tmp/zigbee2mqtt.log + pip install --upgrade pip wheel setuptools &>>$log_dir/zigbee2mqtt.log eend - ebegin 'Install node environment' - pip install nodeenv &>>/tmp/zigbee2mqtt.log + ebegin 'Install Node environment' + pip install nodeenv &>>$log_dir/zigbee2mqtt.log eend - ebegin 'Init node environment ${ini[zigbee2mqtt.nodeenv]}' - nodeenv -p -n ${ini[zigbee2mqtt.nodeenv]} &>>/tmp/zigbee2mqtt.log + ebegin 'Init Node environment ${ini[zigbee2mqtt.nodeenv]}' + nodeenv -p -n ${ini[zigbee2mqtt.nodeenv]} &>>$log_dir/zigbee2mqtt.log eend einfo 'Install dependencies' cd zigbee2mqtt-live - npm ci &>>/tmp/zigbee2mqtt.log + npm ci &>>$log_dir/zigbee2mqtt.log cd EOF )" - if [[ $live_ver == '' ]]; then + if [[ $live_ver != '' ]]; then + eval $__result=zigbee2mqtt # демон который следует перезагрузить + else ebegin 'Setup zigbee2mqtt' - mv /etc/zigbee2mqtt/configuration.yaml /etc/zigbee2mqtt/configuration.yaml.old - cat > /etc/zigbee2mqtt/configuration.yaml << EOF + mv /var/calculate/zigbee2mqtt/configuration.yaml /var/calculate/zigbee2mqtt/configuration.yaml.old + cat > /var/calculate/zigbee2mqtt/configuration.yaml << EOF # Home Assistant integration (MQTT discovery) homeassistant: true @@ -117,10 +127,8 @@ frontend: port: 8080 host: 127.0.0.1 EOF - chown zigbee2mqtt: /etc/zigbee2mqtt/configuration.yaml + chown zigbee2mqtt: /var/calculate/zigbee2mqtt/configuration.yaml eend - - eval $__result=zigbee2mqtt # демон который следует перезагрузить fi fi } diff --git a/scripts/homeassistant/step/4-hass-configurator.sh b/scripts/homeassistant/step/4-hass-configurator.sh new file mode 100644 index 0000000..aea9c91 --- /dev/null +++ b/scripts/homeassistant/step/4-hass-configurator.sh @@ -0,0 +1,119 @@ +# +# Функция configure() устанавливает HASS Configurator +# +# Параметры: +# $1 = check - проверка обновлений, в противном случае установка или обновление +# $2 - возвращает имя модуля для перезагрузки в случае выполненного обновления +# Guide: https://github.com/danielperna84/hass-configurator +configure() { + local action=$1 + local __result=$2 + + local home_dir=/var/calculate/www/hass-configurator + local last_ver="$(get_last_ver danielperna84/hass-configurator github)" + local work_dir="$home_dir/versions/hass-configurator-$last_ver" + local live_dir="$home_dir/hass-configurator-live" + local live_ver="$(get_live_ver $live_dir)" + + if [[ $action == 'check' ]]; then + if [[ $live_ver == $last_ver ]]; then + einfo "hass-configurator: the latest version is installed $live_ver" + else + einfo "hass-configurator: $last_ver update available, $live_ver installed" + eval $__result=1 # наличие обновления + fi + return + fi + + # выйдем если все настроено + if [[ -e /var/calculate/hass-configurator/settings.conf ]]; then + return + fi + + if [[ ! -e $home_dir ]]; then + mkdir -p $home_dir + chmod 700 $home_dir/versions + chown hass-configurator: $home_dir + fi + + touch $log_dir/hass-configurator.log + chown hass-configurator: $log_dir/hass-configurator.log + + if [[ $live_ver != $last_ver ]]; then + if [[ $live_ver == '' ]]; then + echo Install HASS Configurator + else + echo Update Configurator + fi + + su - hass-configurator -s /bin/bash -c "$(cat <<- EOF + set -ueo pipefail + export PATH="/lib/rc/bin:$PATH" + + ebegin Download hass-configurator ${last_ver} + wget https://github.com/danielperna84/hass-configurator/archive/refs/tags/${last_ver}.zip \ + -O hass-configurator-${last_ver}.zip &>>$log_dir/hass-configurator.log + eend + + ebegin 'Extract the archive' + unzip -q -d versions hass-configurator-${last_ver}.zip + rm hass-configurator-${last_ver}.zip + ln -sf versions/hass-configurator-${last_ver} hass-configurator-live + eend + + ebegin 'Create a virtualenv' + python -m venv hass-configurator-live/.venv + eend + + ebegin 'Activate environment' + source hass-configurator-live/.venv/bin/activate + eend + + ebegin 'Upgrade pip and wheel' + pip install --upgrade pip wheel &>>$log_dir/hass-configurator.log + eend + + ebegin 'Install HASS Configurator' + pip install hass-configurator &>>$log_dir/hass-configurator.log + eend + EOF + )" + fi + + if [[ $live_ver != '' ]]; then + eval $__result=hass-assistant # демон который следует перезагрузить + else + ebegin 'Setup HASS Configurator' + cat > /var/calculate/hass-configurator/settings.conf << EOF +{ + "LISTENIP": "127.0.0.1", + "PORT": 3218, + "GIT": false, + "BASEPATH": null, + "ENFORCE_BASEPATH": false, + "SSL_CERTIFICATE": null, + "SSL_KEY": null, + "IGNORE_SSL": false, + "HASS_API": "http://127.0.0.1:8123/api/", + "HASS_WS_API": null, + "HASS_API_PASSWORD": null, + "USERNAME": null, + "PASSWORD": null, + "ALLOWED_NETWORKS": [], + "ALLOWED_DOMAINS": [], + "BANNED_IPS": [], + "BANLIMIT": 0, + "IGNORE_PATTERN": [], + "DIRSFIRST": false, + "SESAME": null, + "SESAME_TOTP_SECRET": null, + "VERIFY_HOSTNAME": null, + "ENV_PREFIX": "HC_", + "NOTIFY_SERVICE": "persistent_notification.create" +} +EOF + chown hass-configurator: /var/calculate/hass-configurator/settings.conf + eend + fi +} + diff --git a/scripts/homeassistant/step/4-hass-configurator.sh- b/scripts/homeassistant/step/4-hass-configurator.sh- deleted file mode 100644 index 64b5b9f..0000000 --- a/scripts/homeassistant/step/4-hass-configurator.sh- +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash -# Guide: https://github.com/danielperna84/hass-configurator - -set -ueo pipefail -export PATH="/lib/rc/bin:$PATH" - -test -e ~/hass-configurator-live && exit - -SCRIPT=$(readlink -f $0) -[[ $UID == 0 ]] && exec su - hass-configurator -s /bin/bash -c "$SCRIPT" - -. /var/db/repos/container/scripts/functions.sh -. /var/db/repos/calculate/scripts/ini.sh - -cd -ver=$(curl -s https://api.github.com/repos/danielperna84/hass-configurator/releases/latest | grep tag_name | cut -d '"' -f 4) && echo "Latest hass-configurator version is ${ver}" -[[ -z $ver ]] && eerror 'The latest version of hass-configurator is not defined!' - -wget -q https://github.com/danielperna84/hass-configurator/archive/refs/tags/${ver}.zip -O hass-configurator-${ver}.zip -einfo 'Extract the archive' -unzip -q -d versions hass-configurator-${ver}.zip -rm hass-configurator-${ver}.zip -ln -sf versions/hass-configurator-${ver} hass-configurator-live - -einfo 'Install python env' -python -m venv hass-configurator-live/.venv - -einfo 'Activate environment' -. hass-configurator-live/.venv/bin/activate - -einfo 'Upgrade pip and wheel' -pip install --upgrade pip wheel - -einfo 'Install HASS Configurator' -pip install hass-configurator - -echo '. ~/hass-configurator-live/.venv/bin/activate' >> .bashrc -echo '. ~/hass-configurator-live/.venv/bin/activate' >> .bash_profile - -ebegin 'Setup HASS Configurator' -if [[ ! -e /etc/hass-configurator/settings.conf ]]; then - cat > /etc/hass-configurator/settings.conf << EOF -{ - "LISTENIP": "127.0.0.1", - "PORT": 3218, - "GIT": false, - "BASEPATH": null, - "ENFORCE_BASEPATH": false, - "SSL_CERTIFICATE": null, - "SSL_KEY": null, - "IGNORE_SSL": false, - "HASS_API": "http://127.0.0.1:8123/api/", - "HASS_WS_API": null, - "HASS_API_PASSWORD": null, - "USERNAME": null, - "PASSWORD": null, - "ALLOWED_NETWORKS": [], - "ALLOWED_DOMAINS": [], - "BANNED_IPS": [], - "BANLIMIT": 0, - "IGNORE_PATTERN": [], - "DIRSFIRST": false, - "SESAME": null, - "SESAME_TOTP_SECRET": null, - "VERIFY_HOSTNAME": null, - "ENV_PREFIX": "HC_", - "NOTIFY_SERVICE": "persistent_notification.create" -} -EOF -fi -eend diff --git a/scripts/homeassistant/step/5-config.sh b/scripts/homeassistant/step/5-config.sh index df133c9..4016195 100644 --- a/scripts/homeassistant/step/5-config.sh +++ b/scripts/homeassistant/step/5-config.sh @@ -3,31 +3,32 @@ # configure() { # выйдем если все настроено - grep -q ^http: /etc/homeassistant/configuration.yaml &>/dev/null && return || true + grep -q ^http: /var/calculate/homeassistant/configuration.yaml &>/dev/null && return || true local home_dir=/var/calculate/www/homeassistant local live_dir="$home_dir/homeassistant-live" local config_dir="/var/calculate/homeassistant" - if [[ -e $config_dir ]]; then - return - else + if [[ ! -e $config_dir ]]; then mkdir -p $config_dir chmod 700 $config_dir chown homeassistant: $config_dir fi + touch $log_dir/config.log + chown homeassistant: $log_dir/config.log + su - homeassistant -s /bin/bash -c "$(cat <<- EOF set -ueo pipefail export PATH="/lib/rc/bin:$PATH" source $live_dir/bin/activate - hass --config /etc/homeassistant >/dev/null & + hass --config /var/calculate/homeassistant &>>$log_dir/config.log & id_hass=\$! echo - einfon "Check for the first start Home Assistant " + einfon "Waiting for the first start Home Assistant " while ! curl http://127.0.0.1:8123 2>/dev/null; do echo -n . sleep 1 @@ -37,7 +38,7 @@ configure() { EOF )" - cat >> /etc/homeassistant/configuration.yaml << EOF + cat >> /var/calculate/homeassistant/configuration.yaml << EOF http: server_host: 127.0.0.1 @@ -48,13 +49,22 @@ recorder: db_url: postgresql://${ini[postgresql.homeassistant_user]}:${ini[postgresql.homeassistant_password]}@127.0.0.1/${ini[postgresql.homeassistant_database]} panel_iframe: +EOF + if [[ -e /var/calculate/zigbee2mqtt ]]; then + cat >> /var/calculate/homeassistant/configuration.yaml << EOF zigbee: title: Zigbee2mqtt url: ${ini[homeassistant.protocol]}://${ini[homeassistant.domain]}/${ini[nginx.zigbee2mqtt_subpath]} icon: mdi:zigbee +EOF + fi + + if [[ -e /var/calculate/hass-configurator ]]; then + cat >> /var/calculate/homeassistant/configuration.yaml << EOF configurator: title: Configurator icon: mdi:wrench url: ${ini[homeassistant.protocol]}://${ini[homeassistant.domain]}/${ini[nginx.hass-configurator_subpath]} EOF + fi }