diff --git a/install.sh b/install.sh index c897dd7..11c42ea 100644 --- a/install.sh +++ b/install.sh @@ -29,7 +29,7 @@ else info "Установка зависимостей..." opkg update >/dev/null 2>&1 || warn "Не удалось обновить списки opkg." 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 warn "Не удалось установить необходимые пакеты." printf "Продолжить всё равно? [y/N]: " @@ -38,59 +38,91 @@ else fi fi -# === МЕНЮ ПРИ СУЩЕСТВУЮЩЕМ КОНФИГЕ === -SKIP_CONFIG=false -ADD_DEVICE_ONLY=false - +# === ОПРЕДЕЛЕНИЕ СОСТОЯНИЯ КОНФИГА === +MQTT_CONFIGURED=false 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 "Обнаружена конфигурация (MQTT: $CURRENT_HOST)." echo "1) Обновить скрипты (настройки сохранятся)" echo "2) Добавить новое устройство" - echo "3) Удалить интеграцию полностью" - echo "4) Выход" - printf "Выберите [1-4]: " + echo "3) Изменить настройки MQTT" + echo "4) Удалить интеграцию полностью" + echo "5) Выход" + printf "Выберите [1-5]: " read choice - + case "$choice" in - 1) SKIP_CONFIG=true ;; - 2) SKIP_CONFIG=true; ADD_DEVICE_ONLY=true ;; - 3) - 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 - ;; + 1) ACTION="update" ;; + 2) ACTION="add_device" ;; + 3) ACTION="change_mqtt" ;; + 4) ACTION="uninstall" ;; *) exit 1 ;; esac 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 "=== Настройка MQTT брокера ===" echo "(Нажмите Enter для значения по умолчанию)" - - printf "IP или домен MQTT брокера [192.168.1.100]: " - read MQTT_HOST; MQTT_HOST=${MQTT_HOST:-192.168.1.100} - - printf "Порт MQTT [1883]: " - read MQTT_PORT; MQTT_PORT=${MQTT_PORT:-1883} - - printf "Логин MQTT [mqtt_user]: " - read MQTT_USER; MQTT_USER=${MQTT_USER:-mqtt_user} - - printf "Пароль MQTT [mqtt_password]: " - read MQTT_PASS; MQTT_PASS=${MQTT_PASS:-mqtt_password} - - printf "Базовый топик MQTT [openwrt]: " - read BASE_TOPIC; BASE_TOPIC=${BASE_TOPIC:-openwrt} - + + if [ "$MQTT_CONFIGURED" = "true" ]; then + DEFAULT_HOST=$(uci get openwrt_ha.main.host) + DEFAULT_PORT=$(uci get openwrt_ha.main.port) + DEFAULT_USER=$(uci get openwrt_ha.main.user) + DEFAULT_PASS=$(uci get openwrt_ha.main.pass) + DEFAULT_TOPIC=$(uci get openwrt_ha.main.base_topic) + else + DEFAULT_HOST="192.168.1.100" + DEFAULT_PORT="1883" + DEFAULT_USER="mqtt_user" + DEFAULT_PASS="mqtt_password" + DEFAULT_TOPIC="openwrt" + fi + + 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 "" info "Проверка подключения к MQTT..." 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 case "$answer" in [yY]*) ;; *) exit 1 ;; esac fi - - # === СКАЧИВАНИЕ И ЗАПОЛНЕНИЕ КОНФИГА === - info "Скачивание шаблона конфигурации..." - wget --no-check-certificate -O "$CONFIG_FILE" "$GITEA_RAW_URL/openwrt_ha" >/dev/null 2>&1 || exit 1 - - # Заполняем секцию MQTT - sed -i "/config mqtt 'main'/,/^$/ { - s|option host '.*'|option host '${MQTT_HOST}'| - s|option port '.*'|option port '${MQTT_PORT}'| - s|option user '.*'|option user '${MQTT_USER}'| - s|option pass '.*'|option pass '${MQTT_PASS}'| - s|option base_topic '.*'|option base_topic '${BASE_TOPIC}'| - }" "$CONFIG_FILE" - - info "Конфигурация создана: $CONFIG_FILE" + + # === СОХРАНЕНИЕ MQTT ЧЕРЕЗ UCI === + [ -f "$CONFIG_FILE" ] || touch "$CONFIG_FILE" + uci set openwrt_ha.main='mqtt' + uci set openwrt_ha.main.host="$MQTT_HOST" + uci set openwrt_ha.main.port="$MQTT_PORT" + uci set openwrt_ha.main.user="$MQTT_USER" + uci set openwrt_ha.main.pass="$MQTT_PASS" + uci set openwrt_ha.main.base_topic="$BASE_TOPIC" + uci commit openwrt_ha + info "Настройки MQTT сохранены." 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 "" printf "Добавить устройство прямо сейчас? [Y/n]: " read answer - case "$answer" in [nN]*) SKIP_DEVICES=true ;; *) SKIP_DEVICES=false ;; esac + case "$answer" in [nN]*) ASK_DEVICES=false ;; esac fi -if [ "$SKIP_DEVICES" != "true" ]; then - # Определяем номер следующего устройства - DEVICE_COUNT=$(grep -c "^config device" "$CONFIG_FILE" 2>/dev/null || echo 0) - DEVICE_COUNT=$((DEVICE_COUNT + 1)) - +if [ "$ASK_DEVICES" = "true" ]; then + # Находим первый свободный индекс + 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 echo "" echo "--- Устройство #$DEVICE_COUNT ---" printf "Имя устройства (например, 'Телефон'): " read DEVICE_NAME - DEVICE_NAME=${DEVICE_NAME:-Устройство $DEVICE_COUNT} - + if [ -z "$DEVICE_NAME" ]; then DEVICE_NAME="Устройство $DEVICE_COUNT"; fi + while true; do echo "Введите MAC-адрес(а) через пробел" echo "Пример: 14:e0:1d:c7:05:76 или 14:e0:1d:c7:05:76 aa:bb:cc:dd:ee:ff" printf "MAC-адрес(а): " read DEVICE_MACS - + if [ -z "$DEVICE_MACS" ]; then warn "Необходимо ввести хотя бы один MAC-адрес." continue fi - + ALL_VALID=true for mac in $DEVICE_MACS; do if ! validate_mac "$mac"; then @@ -160,14 +195,14 @@ if [ "$SKIP_DEVICES" != "true" ]; then done [ "$ALL_VALID" = "true" ] && break done - + echo "Тип устройства:" echo "1) Трекер (люди, статусы home/not_home)" echo "2) Тревога/IoT (розетки, статусы online/offline)" printf "Выберите [1-2] [1]: " 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 DEVICE_TYPE="alarm" DEFAULT_DELAY="0" @@ -175,23 +210,21 @@ if [ "$SKIP_DEVICES" != "true" ]; then DEVICE_TYPE="tracker" DEFAULT_DELAY="30" fi - - printf "Задержка перед отправкой 'отключен' (сек) [$DEFAULT_DELAY]: " - read DEVICE_DELAY - DEVICE_DELAY=${DEVICE_DELAY:-$DEFAULT_DELAY} - - # Дописываем секцию устройства в конец конфига - cat >> "$CONFIG_FILE" << EOF -config device 'device${DEVICE_COUNT}' - option name '${DEVICE_NAME}' - option macs '${DEVICE_MACS}' - option type '${DEVICE_TYPE}' - option delay '${DEVICE_DELAY}' -EOF - + printf "Задержка перед отправкой 'отключен' (сек) [%s]: " "$DEFAULT_DELAY" + read DEVICE_DELAY + if [ -z "$DEVICE_DELAY" ]; then DEVICE_DELAY="$DEFAULT_DELAY"; fi + + # Сохраняем через uci + 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' добавлено." - + printf "Добавить еще одно устройство? [Y/n]: " read answer case "$answer" in [nN]*) break ;; esac @@ -244,7 +277,8 @@ echo "==================================================" info "Установка успешно завершена!" echo "==================================================" echo "Конфигурация: vi /etc/config/openwrt_ha" -echo "Логи: logread | grep wifi_tracker" +echo "Просмотр: uci show openwrt_ha" +echo "Логи: logread | grep wifi_tracker" echo "" echo "Для проверки: выключите Wi-Fi на добавленном устройстве" echo "и проверьте лог через указанную задержку." \ No newline at end of file