#!/bin/sh # OpenWrt HA Presence Tracker Installer # Usage: sh <(wget --no-check-certificate -O - https://твой-домен/твой-репо/raw/branch/main/install.sh) set -e # ВАЖНО: Укажи здесь базовый RAW URL твоего репозитория Gitea (без имени файла install.sh в конце) GITEA_RAW_URL="https://git.darkmode.duckdns.org/sirmrak/openwrt-ha-presence/raw/branch/main/files" CONFIG_FILE="/etc/config/openwrt_ha" STATES_DIR="/tmp/mqtt_ha_states" info() { echo "[INFO] $1"; } warn() { echo "[WARN] $1"; } error() { echo "[ERROR] $1"; } validate_mac() { echo "$1" | grep -qE "^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$" } if [ "$(id -u)" -ne 0 ]; then error "Скрипт должен выполняться от имени root." exit 1 fi info "Проверка необходимых пакетов..." if opkg list-installed | grep -q "^mosquitto-client-nossl " && opkg list-installed | grep -q "^hostapd-utils "; then info "Пакеты mosquitto-client-nossl и hostapd-utils уже установлены. Пропускаем." 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]: " read answer case "$answer" in [yY]*) ;; *) exit 1 ;; esac fi fi SKIP_CONFIG=false ADD_DEVICE_ONLY=false if [ -f "$CONFIG_FILE" ]; then echo "" echo "Обнаружена существующая конфигурация." echo "1) Обновить скрипты (настройки будут сохранены)" echo "2) Добавить новое устройство" echo "3) Удалить интеграцию полностью" echo "4) Выход" printf "Выберите [1-4]: " 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 ;; *) exit 1 ;; esac fi if [ "$SKIP_CONFIG" = "false" ]; 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} echo "" info "Проверка подключения к MQTT..." if mosquitto_pub -h "$MQTT_HOST" -p "$MQTT_PORT" -u "$MQTT_USER" -P "$MQTT_PASS" \ -t "${BASE_TOPIC}/test/install" -m "ping" -I "installer_$$" -r 2>/dev/null; then info "Подключение к MQTT успешно." else warn "Не удалось подключиться к MQTT брокеру." printf "Продолжить установку всё равно? [y/N]: " read answer case "$answer" in [yY]*) ;; *) exit 1 ;; esac fi fi if [ "$SKIP_CONFIG" = "false" ] || [ "$ADD_DEVICE_ONLY" = "true" ]; then echo "" printf "Добавить устройство прямо сейчас? [Y/n]: " read answer case "$answer" in [nN]*) ADD_DEVICE_ONLY=false ;; esac fi if [ "$ADD_DEVICE_ONLY" = "true" ] || { [ "$SKIP_CONFIG" = "false" ] && [ "$answer" != "n" ] && [ "$answer" != "N" ]; }; then DEVICE_COUNT=1 if [ "$ADD_DEVICE_ONLY" = "true" ]; then DEVICE_COUNT=$(uci show openwrt_ha 2>/dev/null | grep -c "\.name=" || echo 0) DEVICE_COUNT=$((DEVICE_COUNT + 1)) fi while true; do echo "" echo "--- Устройство #$DEVICE_COUNT ---" printf "Имя устройства (например, 'Телефон'): " read DEVICE_NAME DEVICE_NAME=${DEVICE_NAME:-Устройство $DEVICE_COUNT} while true; do echo "Введите MAC-адрес(а) через пробел (пример: 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 warn "Неверный формат MAC: $mac" ALL_VALID=false break fi 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 [ "$DEVICE_TYPE_NUM" = "2" ]; then DEVICE_TYPE="alarm" DEFAULT_DELAY="0" else DEVICE_TYPE="tracker" DEFAULT_DELAY="30" fi printf "Задержка перед отправкой 'отключен' (сек) [$DEFAULT_DELAY]: " read DEVICE_DELAY DEVICE_DELAY=${DEVICE_DELAY:-$DEFAULT_DELAY} DEVICE_ID="device${DEVICE_COUNT}" uci set openwrt_ha.${DEVICE_ID}='device' uci set openwrt_ha.${DEVICE_ID}.name="$DEVICE_NAME" uci set openwrt_ha.${DEVICE_ID}.macs="$DEVICE_MACS" uci set openwrt_ha.${DEVICE_ID}.type="$DEVICE_TYPE" uci set openwrt_ha.${DEVICE_ID}.delay="$DEVICE_DELAY" info "Устройство '$DEVICE_NAME' добавлено." printf "Добавить еще одно устройство? [Y/n]: " read answer case "$answer" in [nN]*) break ;; esac DEVICE_COUNT=$((DEVICE_COUNT + 1)) done uci commit openwrt_ha fi if [ "$SKIP_CONFIG" = "false" ]; then 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 fi info "Загрузка файлов из репозитория..." if ! wget --spider --no-check-certificate "$GITEA_RAW_URL/hostapd.user" >/dev/null 2>&1; then error "Не удалось подключиться к репозиторию: $GITEA_RAW_URL" error "Проверьте правильность URL в начале скрипта install.sh" exit 1 fi wget --no-check-certificate -O /etc/hostapd.user "$GITEA_RAW_URL/hostapd.user" >/dev/null 2>&1 || exit 1 wget --no-check-certificate -O /usr/bin/mqtt_ha_discovery.sh "$GITEA_RAW_URL/mqtt_ha_discovery.sh" >/dev/null 2>&1 || exit 1 wget --no-check-certificate -O /etc/init.d/openwrt_presence "$GITEA_RAW_URL/openwrt_presence" >/dev/null 2>&1 || exit 1 chmod +x /etc/hostapd.user /usr/bin/mqtt_ha_discovery.sh /etc/init.d/openwrt_presence info "Настройка автозапуска..." /etc/init.d/openwrt_presence enable >/dev/null 2>&1 /etc/init.d/openwrt_presence restart >/dev/null 2>&1 sleep 2 if ! ps | grep -q "[h]ostapd_cli"; then warn "Служба запущена, но процесс hostapd_cli не найден." echo "Проверьте логи: logread | grep hostapd" echo "Возможно, ваши интерфейсы Wi-Fi называются не phy0-ap0/phy1-ap0 (проверьте через 'iw dev')" fi info "Настройка Cron..." if command -v crontab >/dev/null 2>&1; then if ! crontab -l 2>/dev/null | grep -q "mqtt_ha_discovery.sh"; then (crontab -l 2>/dev/null; echo "* * * * * /usr/bin/mqtt_ha_discovery.sh") | crontab - 2>/dev/null /etc/init.d/cron restart 2>/dev/null fi else warn "Cron не установлен. Установите вручную: opkg install cron" fi info "Первичная инициализация..." /usr/bin/mqtt_ha_discovery.sh >/dev/null 2>&1 || warn "Инициализация завершилась с ошибкой." echo "" echo "==================================================" info "Установка успешно завершена!" echo "==================================================" echo "Для редактирования настроек: vi /etc/config/openwrt_ha" echo "Для просмотра логов: logread | grep wifi_tracker" echo "Для проверки: выключите Wi-Fi на добавленном устройстве и проверьте лог через указанную задержку."