From 2740792fa4c3ef3caacce5f8288d2ff6e237da09 Mon Sep 17 00:00:00 2001 From: sirmrak Date: Mon, 12 Oct 2026 12:11:45 +0300 Subject: [PATCH] Update install.sh --- install.sh | 296 +++++++++++++++++++++++++---------------------------- 1 file changed, 140 insertions(+), 156 deletions(-) diff --git a/install.sh b/install.sh index 605eee4..e6a1d0d 100644 --- a/install.sh +++ b/install.sh @@ -1,10 +1,10 @@ #!/bin/sh # OpenWrt HA Presence Tracker Installer -# Usage: sh <(wget --no-check-certificate -O - https://your-gitea-url/raw/branch/main/install.sh) +# Usage: sh <(wget --no-check-certificate -O - https://твой-домен/твой-репо/raw/branch/main/install.sh) set -e -# UPDATE THIS URL to the raw files directory of your Gitea repository +# ВАЖНО: Укажи здесь базовый 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" @@ -18,48 +18,25 @@ validate_mac() { echo "$1" | grep -qE "^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$" } -read_with_default() { - local prompt="$1" - local default="$2" - local result - - if [ -n "$default" ]; then - printf "%s [%s]: " "$prompt" "$default" - else - printf "%s: " "$prompt" - fi - - read -r result - - if [ -z "$result" ] && [ -n "$default" ]; then - echo "$default" - else - echo "$result" - fi -} - if [ "$(id -u)" -ne 0 ]; then - error "This script must be run as root." + error "Скрипт должен выполняться от имени root." exit 1 fi -info "Updating opkg and installing dependencies..." -if ! opkg update 2>/dev/null; then - warn "Failed to update opkg lists." - printf "Continue anyway? [y/N]: " - read -r answer - [ "$answer" != "y" ] && [ "$answer" != "Y" ] && exit 1 -fi - -PACKAGES_OK=true -opkg install mosquitto-client-nossl 2>/dev/null || PACKAGES_OK=false -opkg install hostapd-utils 2>/dev/null || PACKAGES_OK=false - -if [ "$PACKAGES_OK" = "false" ]; then - warn "Some packages failed to install." - printf "Continue anyway? [y/N]: " - read -r answer - [ "$answer" != "y" ] && [ "$answer" != "Y" ] && exit 1 +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 @@ -67,29 +44,26 @@ ADD_DEVICE_ONLY=false if [ -f "$CONFIG_FILE" ]; then echo "" - echo "Existing configuration detected." - echo "1) Update scripts (keep MQTT and device settings)" - echo "2) Add a new device" - echo "3) Uninstall completely" - echo "4) Exit" - printf "Choose [1-4]: " - read -r choice + 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 "Uninstalling..." + 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 - rm -f /etc/hostapd.user - rm -f /usr/bin/mqtt_ha_discovery.sh - rm -f "$CONFIG_FILE" + rm -f /etc/init.d/openwrt_presence /etc/hostapd.user /usr/bin/mqtt_ha_discovery.sh "$CONFIG_FILE" rm -rf "$STATES_DIR" - info "Uninstallation complete. Remove entities in Home Assistant manually." + info "Удаление завершено. Удалите сущности в Home Assistant вручную." exit 0 ;; *) exit 1 ;; @@ -98,95 +72,113 @@ fi if [ "$SKIP_CONFIG" = "false" ]; then echo "" - info "MQTT Broker Configuration:" - MQTT_HOST=$(read_with_default "MQTT Broker IP or Domain" "192.168.1.100") - MQTT_PORT=$(read_with_default "MQTT Port" "1883") - MQTT_USER=$(read_with_default "MQTT Username" "mqtt_user") - MQTT_PASS=$(read_with_default "MQTT Password" "mqtt_password") - BASE_TOPIC=$(read_with_default "Base MQTT Topic" "openwrt") + echo "=== Настройка MQTT брокера ===" + echo "(Нажмите Enter, чтобы использовать значение в скобках)" - info "Testing MQTT connection..." + 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 connection successful." + info "Подключение к MQTT успешно." else - warn "Failed to connect to MQTT broker." - printf "Continue anyway? [y/N]: " - read -r answer - [ "$answer" != "y" ] && [ "$answer" != "Y" ] && exit 1 + 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 "Add a device now? [Y/n]: " - read -r answer + 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 - if [ "$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 "device[0-9]" || 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 "" - echo "Device #$DEVICE_COUNT:" - DEVICE_NAME=$(read_with_default "Device Name" "Device $DEVICE_COUNT") + 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 - while true; do - echo "Enter MAC address(es) separated by space (e.g., 14:e0:1d:c7:05:76 aa:bb:cc:dd:ee:ff)" - read -r -p "MAC(s): " DEVICE_MACS - - if [ -z "$DEVICE_MACS" ]; then - warn "At least one MAC address is required." - continue - fi - - ALL_VALID=true - for mac in $DEVICE_MACS; do - if ! validate_mac "$mac"; then - warn "Invalid MAC format: $mac" - ALL_VALID=false - break - fi - done - - [ "$ALL_VALID" = "true" ] && break - done - - echo "Device Type:" - echo "1) Tracker (people, home/not_home)" - echo "2) Alarm/IoT (devices, online/offline)" - DEVICE_TYPE_NUM=$(read_with_default "Choose [1-2]" "1") - - if [ "$DEVICE_TYPE_NUM" = "2" ]; then - DEVICE_TYPE="alarm" - DEFAULT_DELAY="0" - else - DEVICE_TYPE="tracker" - DEFAULT_DELAY="30" + if [ -z "$DEVICE_MACS" ]; then + warn "Необходимо ввести хотя бы один MAC-адрес." + continue fi - DEVICE_DELAY=$(read_with_default "Delay before 'disconnected' (seconds)" "$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 '$DEVICE_NAME' added." - - printf "Add another device? [Y/n]: " - read -r answer - [ "$answer" = "n" ] || [ "$answer" = "N" ] && break - - DEVICE_COUNT=$((DEVICE_COUNT + 1)) + 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 - uci commit openwrt_ha - fi + + 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 @@ -199,55 +191,47 @@ if [ "$SKIP_CONFIG" = "false" ]; then uci commit openwrt_ha fi -info "Downloading files from repository..." -if ! wget --spider --no-check-certificate "$GITEA_RAW_URL/hostapd.user" 2>/dev/null; then - error "Cannot reach repository at: $GITEA_RAW_URL" +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" 2>/dev/null || exit 1 -wget --no-check-certificate -O /usr/bin/mqtt_ha_discovery.sh "$GITEA_RAW_URL/mqtt_ha_discovery.sh" 2>/dev/null || exit 1 -wget --no-check-certificate -O /etc/init.d/openwrt_presence "$GITEA_RAW_URL/openwrt_presence" 2>/dev/null || exit 1 +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 -for file in /etc/hostapd.user /usr/bin/mqtt_ha_discovery.sh /etc/init.d/openwrt_presence; do - if [ ! -s "$file" ] || grep -q "" "$file"; then - error "File $file downloaded incorrectly (possibly 404)." - exit 1 - fi -done +chmod +x /etc/hostapd.user /usr/bin/mqtt_ha_discovery.sh /etc/init.d/openwrt_presence -chmod +x /etc/hostapd.user -chmod +x /usr/bin/mqtt_ha_discovery.sh -chmod +x /etc/init.d/openwrt_presence - -info "Configuring autostart..." -/etc/init.d/openwrt_presence enable 2>/dev/null || exit 1 -/etc/init.d/openwrt_presence restart 2>/dev/null || exit 1 +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 "Service started, but hostapd_cli process not found." - echo "Check logs: logread | grep hostapd" - echo "Verify Wi-Fi interfaces with: iw dev" + warn "Служба запущена, но процесс hostapd_cli не найден." + echo "Проверьте логи: logread | grep hostapd" + echo "Возможно, ваши интерфейсы Wi-Fi называются не phy0-ap0/phy1-ap0 (проверьте через 'iw dev')" fi -info "Configuring Cron..." +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 is not installed. Run: opkg install cron" + warn "Cron не установлен. Установите вручную: opkg install cron" fi -info "Running initial discovery..." -/usr/bin/mqtt_ha_discovery.sh 2>/dev/null || warn "Initial discovery failed. Run manually later." +info "Первичная инициализация..." +/usr/bin/mqtt_ha_discovery.sh >/dev/null 2>&1 || warn "Инициализация завершилась с ошибкой." echo "" echo "==================================================" -info "Installation completed successfully!" +info "Установка успешно завершена!" echo "==================================================" -echo "To edit settings: vi /etc/config/openwrt_ha" -echo "To view logs: logread | grep wifi_tracker" -echo "To test: Turn off Wi-Fi on the added device and check logs after the delay." \ No newline at end of file +echo "Для редактирования настроек: vi /etc/config/openwrt_ha" +echo "Для просмотра логов: logread | grep wifi_tracker" +echo "Для проверки: выключите Wi-Fi на добавленном устройстве и проверьте лог через указанную задержку." \ No newline at end of file