Update install.sh

This commit is contained in:
2026-10-12 12:39:14 +03:00
parent f7965654f9
commit 26c1b3bb2d
+120 -86
View File
@@ -29,7 +29,7 @@ else
info "Установка зависимостей..." info "Установка зависимостей..."
opkg update >/dev/null 2>&1 || warn "Не удалось обновить списки opkg." opkg update >/dev/null 2>&1 || warn "Не удалось обновить списки opkg."
opkg install mosquitto-client-nossl hostapd-utils >/dev/null 2>&1 || warn "Не удалось установить пакеты." opkg install mosquitto-client-nossl hostapd-utils >/dev/null 2>&1 || warn "Не удалось установить пакеты."
if ! opkg list-installed | grep -q "^mosquitto-client-nossl " || ! opkg list-installed | grep -q "^hostapd-utils "; then if ! opkg list-installed | grep -q "^mosquitto-client-nossl " || ! opkg list-installed | grep -q "^hostapd-utils "; then
warn "Не удалось установить необходимые пакеты." warn "Не удалось установить необходимые пакеты."
printf "Продолжить всё равно? [y/N]: " printf "Продолжить всё равно? [y/N]: "
@@ -38,59 +38,91 @@ else
fi fi
fi fi
# === МЕНЮ ПРИ СУЩЕСТВУЮЩЕМ КОНФИГЕ === # === ОПРЕДЕЛЕНИЕ СОСТОЯНИЯ КОНФИГА ===
SKIP_CONFIG=false MQTT_CONFIGURED=false
ADD_DEVICE_ONLY=false
if [ -f "$CONFIG_FILE" ]; then if [ -f "$CONFIG_FILE" ]; then
if uci -q get openwrt_ha.main.host >/dev/null 2>&1; then
MQTT_CONFIGURED=true
fi
fi
# === МЕНЮ ПРИ НАСТРОЕННОМ MQTT ===
ACTION="install" # install | update | add_device | change_mqtt | uninstall
if [ "$MQTT_CONFIGURED" = "true" ]; then
CURRENT_HOST=$(uci get openwrt_ha.main.host)
echo "" echo ""
echo "Обнаружена существующая конфигурация." echo "Обнаружена конфигурация (MQTT: $CURRENT_HOST)."
echo "1) Обновить скрипты (настройки сохранятся)" echo "1) Обновить скрипты (настройки сохранятся)"
echo "2) Добавить новое устройство" echo "2) Добавить новое устройство"
echo "3) Удалить интеграцию полностью" echo "3) Изменить настройки MQTT"
echo "4) Выход" echo "4) Удалить интеграцию полностью"
printf "Выберите [1-4]: " echo "5) Выход"
printf "Выберите [1-5]: "
read choice read choice
case "$choice" in case "$choice" in
1) SKIP_CONFIG=true ;; 1) ACTION="update" ;;
2) SKIP_CONFIG=true; ADD_DEVICE_ONLY=true ;; 2) ACTION="add_device" ;;
3) 3) ACTION="change_mqtt" ;;
info "Удаление..." 4) ACTION="uninstall" ;;
crontab -l 2>/dev/null | grep -v "mqtt_ha_discovery.sh" | crontab - 2>/dev/null || true
/etc/init.d/cron restart 2>/dev/null || true
/etc/init.d/openwrt_presence stop 2>/dev/null || true
/etc/init.d/openwrt_presence disable 2>/dev/null || true
rm -f /etc/init.d/openwrt_presence /etc/hostapd.user /usr/bin/mqtt_ha_discovery.sh "$CONFIG_FILE"
rm -rf "$STATES_DIR"
info "Удаление завершено. Удалите сущности в Home Assistant вручную."
exit 0
;;
*) exit 1 ;; *) exit 1 ;;
esac esac
fi fi
# === ВВОД НАСТРОЕК MQTT (только при первой установке) === # === УДАЛЕНИЕ ===
if [ "$SKIP_CONFIG" = "false" ]; then if [ "$ACTION" = "uninstall" ]; then
info "Удаление..."
crontab -l 2>/dev/null | grep -v "mqtt_ha_discovery.sh" | crontab - 2>/dev/null || true
/etc/init.d/cron restart 2>/dev/null || true
/etc/init.d/openwrt_presence stop 2>/dev/null || true
/etc/init.d/openwrt_presence disable 2>/dev/null || true
rm -f /etc/init.d/openwrt_presence /etc/hostapd.user /usr/bin/mqtt_ha_discovery.sh "$CONFIG_FILE"
rm -rf "$STATES_DIR"
info "Удаление завершено. Удалите сущности в Home Assistant вручную."
exit 0
fi
# === ВВОД НАСТРОЕК MQTT ===
if [ "$ACTION" = "install" ] || [ "$ACTION" = "change_mqtt" ]; then
echo "" echo ""
echo "=== Настройка MQTT брокера ===" echo "=== Настройка MQTT брокера ==="
echo "(Нажмите Enter для значения по умолчанию)" echo "(Нажмите Enter для значения по умолчанию)"
printf "IP или домен MQTT брокера [192.168.1.100]: " if [ "$MQTT_CONFIGURED" = "true" ]; then
read MQTT_HOST; MQTT_HOST=${MQTT_HOST:-192.168.1.100} DEFAULT_HOST=$(uci get openwrt_ha.main.host)
DEFAULT_PORT=$(uci get openwrt_ha.main.port)
printf "Порт MQTT [1883]: " DEFAULT_USER=$(uci get openwrt_ha.main.user)
read MQTT_PORT; MQTT_PORT=${MQTT_PORT:-1883} DEFAULT_PASS=$(uci get openwrt_ha.main.pass)
DEFAULT_TOPIC=$(uci get openwrt_ha.main.base_topic)
printf "Логин MQTT [mqtt_user]: " else
read MQTT_USER; MQTT_USER=${MQTT_USER:-mqtt_user} DEFAULT_HOST="192.168.1.100"
DEFAULT_PORT="1883"
printf "Пароль MQTT [mqtt_password]: " DEFAULT_USER="mqtt_user"
read MQTT_PASS; MQTT_PASS=${MQTT_PASS:-mqtt_password} DEFAULT_PASS="mqtt_password"
DEFAULT_TOPIC="openwrt"
printf "Базовый топик MQTT [openwrt]: " fi
read BASE_TOPIC; BASE_TOPIC=${BASE_TOPIC:-openwrt}
printf "IP или домен MQTT брокера [%s]: " "$DEFAULT_HOST"
read MQTT_HOST
if [ -z "$MQTT_HOST" ]; then MQTT_HOST="$DEFAULT_HOST"; fi
printf "Порт MQTT [%s]: " "$DEFAULT_PORT"
read MQTT_PORT
if [ -z "$MQTT_PORT" ]; then MQTT_PORT="$DEFAULT_PORT"; fi
printf "Логин MQTT [%s]: " "$DEFAULT_USER"
read MQTT_USER
if [ -z "$MQTT_USER" ]; then MQTT_USER="$DEFAULT_USER"; fi
printf "Пароль MQTT [%s]: " "$DEFAULT_PASS"
read MQTT_PASS
if [ -z "$MQTT_PASS" ]; then MQTT_PASS="$DEFAULT_PASS"; fi
printf "Базовый топик MQTT [%s]: " "$DEFAULT_TOPIC"
read BASE_TOPIC
if [ -z "$BASE_TOPIC" ]; then BASE_TOPIC="$DEFAULT_TOPIC"; fi
echo "" echo ""
info "Проверка подключения к MQTT..." info "Проверка подключения к MQTT..."
if mosquitto_pub -h "$MQTT_HOST" -p "$MQTT_PORT" -u "$MQTT_USER" -P "$MQTT_PASS" \ if mosquitto_pub -h "$MQTT_HOST" -p "$MQTT_PORT" -u "$MQTT_USER" -P "$MQTT_PASS" \
@@ -102,54 +134,57 @@ if [ "$SKIP_CONFIG" = "false" ]; then
read answer read answer
case "$answer" in [yY]*) ;; *) exit 1 ;; esac case "$answer" in [yY]*) ;; *) exit 1 ;; esac
fi fi
# === СКАЧИВАНИЕ И ЗАПОЛНЕНИЕ КОНФИГА === # === СОХРАНЕНИЕ MQTT ЧЕРЕЗ UCI ===
info "Скачивание шаблона конфигурации..." [ -f "$CONFIG_FILE" ] || touch "$CONFIG_FILE"
wget --no-check-certificate -O "$CONFIG_FILE" "$GITEA_RAW_URL/openwrt_ha" >/dev/null 2>&1 || exit 1 uci set openwrt_ha.main='mqtt'
uci set openwrt_ha.main.host="$MQTT_HOST"
# Заполняем секцию MQTT uci set openwrt_ha.main.port="$MQTT_PORT"
sed -i "/config mqtt 'main'/,/^$/ { uci set openwrt_ha.main.user="$MQTT_USER"
s|option host '.*'|option host '${MQTT_HOST}'| uci set openwrt_ha.main.pass="$MQTT_PASS"
s|option port '.*'|option port '${MQTT_PORT}'| uci set openwrt_ha.main.base_topic="$BASE_TOPIC"
s|option user '.*'|option user '${MQTT_USER}'| uci commit openwrt_ha
s|option pass '.*'|option pass '${MQTT_PASS}'| info "Настройки MQTT сохранены."
s|option base_topic '.*'|option base_topic '${BASE_TOPIC}'|
}" "$CONFIG_FILE"
info "Конфигурация создана: $CONFIG_FILE"
fi fi
# === ДОБАВЛЕНИЕ УСТРОЙСТВ === # === ДОБАВЛЕНИЕ УСТРОЙСТВ ===
if [ "$SKIP_CONFIG" = "false" ] || [ "$ADD_DEVICE_ONLY" = "true" ]; then ASK_DEVICES=false
if [ "$ACTION" = "install" ] || [ "$ACTION" = "change_mqtt" ] || [ "$ACTION" = "add_device" ]; then
ASK_DEVICES=true
fi
if [ "$ASK_DEVICES" = "true" ]; then
echo "" echo ""
printf "Добавить устройство прямо сейчас? [Y/n]: " printf "Добавить устройство прямо сейчас? [Y/n]: "
read answer read answer
case "$answer" in [nN]*) SKIP_DEVICES=true ;; *) SKIP_DEVICES=false ;; esac case "$answer" in [nN]*) ASK_DEVICES=false ;; esac
fi fi
if [ "$SKIP_DEVICES" != "true" ]; then if [ "$ASK_DEVICES" = "true" ]; then
# Определяем номер следующего устройства # Находим первый свободный индекс
DEVICE_COUNT=$(grep -c "^config device" "$CONFIG_FILE" 2>/dev/null || echo 0) DEVICE_COUNT=1
DEVICE_COUNT=$((DEVICE_COUNT + 1)) while uci -q get "openwrt_ha.device${DEVICE_COUNT}" >/dev/null 2>&1; do
DEVICE_COUNT=$((DEVICE_COUNT + 1))
done
while true; do while true; do
echo "" echo ""
echo "--- Устройство #$DEVICE_COUNT ---" echo "--- Устройство #$DEVICE_COUNT ---"
printf "Имя устройства (например, 'Телефон'): " printf "Имя устройства (например, 'Телефон'): "
read DEVICE_NAME read DEVICE_NAME
DEVICE_NAME=${DEVICE_NAME:-Устройство $DEVICE_COUNT} if [ -z "$DEVICE_NAME" ]; then DEVICE_NAME="Устройство $DEVICE_COUNT"; fi
while true; do while true; do
echo "Введите MAC-адрес(а) через пробел" echo "Введите MAC-адрес(а) через пробел"
echo "Пример: 14:e0:1d:c7:05:76 или 14:e0:1d:c7:05:76 aa:bb:cc:dd:ee:ff" echo "Пример: 14:e0:1d:c7:05:76 или 14:e0:1d:c7:05:76 aa:bb:cc:dd:ee:ff"
printf "MAC-адрес(а): " printf "MAC-адрес(а): "
read DEVICE_MACS read DEVICE_MACS
if [ -z "$DEVICE_MACS" ]; then if [ -z "$DEVICE_MACS" ]; then
warn "Необходимо ввести хотя бы один MAC-адрес." warn "Необходимо ввести хотя бы один MAC-адрес."
continue continue
fi fi
ALL_VALID=true ALL_VALID=true
for mac in $DEVICE_MACS; do for mac in $DEVICE_MACS; do
if ! validate_mac "$mac"; then if ! validate_mac "$mac"; then
@@ -160,14 +195,14 @@ if [ "$SKIP_DEVICES" != "true" ]; then
done done
[ "$ALL_VALID" = "true" ] && break [ "$ALL_VALID" = "true" ] && break
done done
echo "Тип устройства:" echo "Тип устройства:"
echo "1) Трекер (люди, статусы home/not_home)" echo "1) Трекер (люди, статусы home/not_home)"
echo "2) Тревога/IoT (розетки, статусы online/offline)" echo "2) Тревога/IoT (розетки, статусы online/offline)"
printf "Выберите [1-2] [1]: " printf "Выберите [1-2] [1]: "
read DEVICE_TYPE_NUM read DEVICE_TYPE_NUM
DEVICE_TYPE_NUM=${DEVICE_TYPE_NUM:-1} if [ -z "$DEVICE_TYPE_NUM" ]; then DEVICE_TYPE_NUM="1"; fi
if [ "$DEVICE_TYPE_NUM" = "2" ]; then if [ "$DEVICE_TYPE_NUM" = "2" ]; then
DEVICE_TYPE="alarm" DEVICE_TYPE="alarm"
DEFAULT_DELAY="0" DEFAULT_DELAY="0"
@@ -175,23 +210,21 @@ if [ "$SKIP_DEVICES" != "true" ]; then
DEVICE_TYPE="tracker" DEVICE_TYPE="tracker"
DEFAULT_DELAY="30" DEFAULT_DELAY="30"
fi fi
printf "Задержка перед отправкой 'отключен' (сек) [$DEFAULT_DELAY]: "
read DEVICE_DELAY
DEVICE_DELAY=${DEVICE_DELAY:-$DEFAULT_DELAY}
# Дописываем секцию устройства в конец конфига
cat >> "$CONFIG_FILE" << EOF
config device 'device${DEVICE_COUNT}' printf "Задержка перед отправкой 'отключен' (сек) [%s]: " "$DEFAULT_DELAY"
option name '${DEVICE_NAME}' read DEVICE_DELAY
option macs '${DEVICE_MACS}' if [ -z "$DEVICE_DELAY" ]; then DEVICE_DELAY="$DEFAULT_DELAY"; fi
option type '${DEVICE_TYPE}'
option delay '${DEVICE_DELAY}' # Сохраняем через uci
EOF uci set "openwrt_ha.device${DEVICE_COUNT}"='device'
uci set "openwrt_ha.device${DEVICE_COUNT}.name"="$DEVICE_NAME"
uci set "openwrt_ha.device${DEVICE_COUNT}.macs"="$DEVICE_MACS"
uci set "openwrt_ha.device${DEVICE_COUNT}.type"="$DEVICE_TYPE"
uci set "openwrt_ha.device${DEVICE_COUNT}.delay"="$DEVICE_DELAY"
uci commit openwrt_ha
info "Устройство '$DEVICE_NAME' добавлено." info "Устройство '$DEVICE_NAME' добавлено."
printf "Добавить еще одно устройство? [Y/n]: " printf "Добавить еще одно устройство? [Y/n]: "
read answer read answer
case "$answer" in [nN]*) break ;; esac case "$answer" in [nN]*) break ;; esac
@@ -244,7 +277,8 @@ echo "=================================================="
info "Установка успешно завершена!" info "Установка успешно завершена!"
echo "==================================================" echo "=================================================="
echo "Конфигурация: vi /etc/config/openwrt_ha" echo "Конфигурация: vi /etc/config/openwrt_ha"
echo "Логи: logread | grep wifi_tracker" echo "Просмотр: uci show openwrt_ha"
echo "Логи: logread | grep wifi_tracker"
echo "" echo ""
echo "Для проверки: выключите Wi-Fi на добавленном устройстве" echo "Для проверки: выключите Wi-Fi на добавленном устройстве"
echo "и проверьте лог через указанную задержку." echo "и проверьте лог через указанную задержку."