Update install.sh

This commit is contained in:
2026-10-12 12:11:45 +03:00
parent 4474b64b05
commit 2740792fa4
+140 -156
View File
@@ -1,10 +1,10 @@
#!/bin/sh #!/bin/sh
# OpenWrt HA Presence Tracker Installer # 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 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" GITEA_RAW_URL="https://git.darkmode.duckdns.org/sirmrak/openwrt-ha-presence/raw/branch/main/files"
CONFIG_FILE="/etc/config/openwrt_ha" 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}$" 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 if [ "$(id -u)" -ne 0 ]; then
error "This script must be run as root." error "Скрипт должен выполняться от имени root."
exit 1 exit 1
fi fi
info "Updating opkg and installing dependencies..." info "Проверка необходимых пакетов..."
if ! opkg update 2>/dev/null; then if opkg list-installed | grep -q "^mosquitto-client-nossl " && opkg list-installed | grep -q "^hostapd-utils "; then
warn "Failed to update opkg lists." info "Пакеты mosquitto-client-nossl и hostapd-utils уже установлены. Пропускаем."
printf "Continue anyway? [y/N]: " else
read -r answer info "Установка отсутствующих зависимостей..."
[ "$answer" != "y" ] && [ "$answer" != "Y" ] && exit 1 opkg update >/dev/null 2>&1 || warn "Не удалось обновить списки opkg."
fi opkg install mosquitto-client-nossl hostapd-utils >/dev/null 2>&1 || warn "Не удалось установить пакеты."
PACKAGES_OK=true if ! opkg list-installed | grep -q "^mosquitto-client-nossl " || ! opkg list-installed | grep -q "^hostapd-utils "; then
opkg install mosquitto-client-nossl 2>/dev/null || PACKAGES_OK=false warn "Не удалось установить необходимые пакеты."
opkg install hostapd-utils 2>/dev/null || PACKAGES_OK=false printf "Продолжить установку всё равно? [y/N]: "
read answer
if [ "$PACKAGES_OK" = "false" ]; then case "$answer" in [yY]*) ;; *) exit 1 ;; esac
warn "Some packages failed to install." fi
printf "Continue anyway? [y/N]: "
read -r answer
[ "$answer" != "y" ] && [ "$answer" != "Y" ] && exit 1
fi fi
SKIP_CONFIG=false SKIP_CONFIG=false
@@ -67,29 +44,26 @@ ADD_DEVICE_ONLY=false
if [ -f "$CONFIG_FILE" ]; then if [ -f "$CONFIG_FILE" ]; then
echo "" echo ""
echo "Existing configuration detected." echo "Обнаружена существующая конфигурация."
echo "1) Update scripts (keep MQTT and device settings)" echo "1) Обновить скрипты (настройки будут сохранены)"
echo "2) Add a new device" echo "2) Добавить новое устройство"
echo "3) Uninstall completely" echo "3) Удалить интеграцию полностью"
echo "4) Exit" echo "4) Выход"
printf "Choose [1-4]: " printf "Выберите [1-4]: "
read -r choice read choice
case "$choice" in case "$choice" in
1) SKIP_CONFIG=true ;; 1) SKIP_CONFIG=true ;;
2) SKIP_CONFIG=true; ADD_DEVICE_ONLY=true ;; 2) SKIP_CONFIG=true; ADD_DEVICE_ONLY=true ;;
3) 3)
info "Uninstalling..." info "Удаление..."
crontab -l 2>/dev/null | grep -v "mqtt_ha_discovery.sh" | crontab - 2>/dev/null || true 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/cron restart 2>/dev/null || true
/etc/init.d/openwrt_presence stop 2>/dev/null || true /etc/init.d/openwrt_presence stop 2>/dev/null || true
/etc/init.d/openwrt_presence disable 2>/dev/null || true /etc/init.d/openwrt_presence disable 2>/dev/null || true
rm -f /etc/init.d/openwrt_presence rm -f /etc/init.d/openwrt_presence /etc/hostapd.user /usr/bin/mqtt_ha_discovery.sh "$CONFIG_FILE"
rm -f /etc/hostapd.user
rm -f /usr/bin/mqtt_ha_discovery.sh
rm -f "$CONFIG_FILE"
rm -rf "$STATES_DIR" rm -rf "$STATES_DIR"
info "Uninstallation complete. Remove entities in Home Assistant manually." info "Удаление завершено. Удалите сущности в Home Assistant вручную."
exit 0 exit 0
;; ;;
*) exit 1 ;; *) exit 1 ;;
@@ -98,95 +72,113 @@ fi
if [ "$SKIP_CONFIG" = "false" ]; then if [ "$SKIP_CONFIG" = "false" ]; then
echo "" echo ""
info "MQTT Broker Configuration:" echo "=== Настройка MQTT брокера ==="
MQTT_HOST=$(read_with_default "MQTT Broker IP or Domain" "192.168.1.100") echo "(Нажмите Enter, чтобы использовать значение в скобках)"
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")
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" \ 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 -t "${BASE_TOPIC}/test/install" -m "ping" -I "installer_$$" -r 2>/dev/null; then
info "MQTT connection successful." info "Подключение к MQTT успешно."
else else
warn "Failed to connect to MQTT broker." warn "Не удалось подключиться к MQTT брокеру."
printf "Continue anyway? [y/N]: " printf "Продолжить установку всё равно? [y/N]: "
read -r answer read answer
[ "$answer" != "y" ] && [ "$answer" != "Y" ] && exit 1 case "$answer" in [yY]*) ;; *) exit 1 ;; esac
fi fi
fi fi
if [ "$SKIP_CONFIG" = "false" ] || [ "$ADD_DEVICE_ONLY" = "true" ]; then if [ "$SKIP_CONFIG" = "false" ] || [ "$ADD_DEVICE_ONLY" = "true" ]; then
echo "" echo ""
printf "Add a device now? [Y/n]: " printf "Добавить устройство прямо сейчас? [Y/n]: "
read -r answer 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 while true; do
DEVICE_COUNT=1 echo ""
if [ "$ADD_DEVICE_ONLY" = "true" ]; then echo "--- Устройство #$DEVICE_COUNT ---"
DEVICE_COUNT=$(uci show openwrt_ha 2>/dev/null | grep -c "device[0-9]" || echo 0) printf "Имя устройства (например, 'Телефон'): "
DEVICE_COUNT=$((DEVICE_COUNT + 1)) read DEVICE_NAME
fi DEVICE_NAME=${DEVICE_NAME:-Устройство $DEVICE_COUNT}
while true; do while true; do
echo "" echo "Введите MAC-адрес(а) через пробел (пример: 14:e0:1d:c7:05:76 или 14:e0:1d:c7:05:76 aa:bb:cc:dd:ee:ff)"
echo "Device #$DEVICE_COUNT:" printf "MAC-адрес(а): "
DEVICE_NAME=$(read_with_default "Device Name" "Device $DEVICE_COUNT") read DEVICE_MACS
while true; do if [ -z "$DEVICE_MACS" ]; then
echo "Enter MAC address(es) separated by space (e.g., 14:e0:1d:c7:05:76 aa:bb:cc:dd:ee:ff)" warn "Необходимо ввести хотя бы один MAC-адрес."
read -r -p "MAC(s): " DEVICE_MACS continue
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"
fi fi
DEVICE_DELAY=$(read_with_default "Delay before 'disconnected' (seconds)" "$DEFAULT_DELAY") ALL_VALID=true
for mac in $DEVICE_MACS; do
DEVICE_ID="device${DEVICE_COUNT}" if ! validate_mac "$mac"; then
uci set openwrt_ha.${DEVICE_ID}='device' warn "Неверный формат MAC: $mac"
uci set openwrt_ha.${DEVICE_ID}.name="$DEVICE_NAME" ALL_VALID=false
uci set openwrt_ha.${DEVICE_ID}.macs="$DEVICE_MACS" break
uci set openwrt_ha.${DEVICE_ID}.type="$DEVICE_TYPE" fi
uci set openwrt_ha.${DEVICE_ID}.delay="$DEVICE_DELAY" done
[ "$ALL_VALID" = "true" ] && break
info "Device '$DEVICE_NAME' added."
printf "Add another device? [Y/n]: "
read -r answer
[ "$answer" = "n" ] || [ "$answer" = "N" ] && break
DEVICE_COUNT=$((DEVICE_COUNT + 1))
done 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 fi
if [ "$SKIP_CONFIG" = "false" ]; then if [ "$SKIP_CONFIG" = "false" ]; then
@@ -199,55 +191,47 @@ if [ "$SKIP_CONFIG" = "false" ]; then
uci commit openwrt_ha uci commit openwrt_ha
fi fi
info "Downloading files from repository..." info "Загрузка файлов из репозитория..."
if ! wget --spider --no-check-certificate "$GITEA_RAW_URL/hostapd.user" 2>/dev/null; then if ! wget --spider --no-check-certificate "$GITEA_RAW_URL/hostapd.user" >/dev/null 2>&1; then
error "Cannot reach repository at: $GITEA_RAW_URL" error "Не удалось подключиться к репозиторию: $GITEA_RAW_URL"
error "Проверьте правильность URL в начале скрипта install.sh"
exit 1 exit 1
fi fi
wget --no-check-certificate -O /etc/hostapd.user "$GITEA_RAW_URL/hostapd.user" 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" 2>/dev/null || 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" 2>/dev/null || 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 chmod +x /etc/hostapd.user /usr/bin/mqtt_ha_discovery.sh /etc/init.d/openwrt_presence
if [ ! -s "$file" ] || grep -q "<html>" "$file"; then
error "File $file downloaded incorrectly (possibly 404)."
exit 1
fi
done
chmod +x /etc/hostapd.user info "Настройка автозапуска..."
chmod +x /usr/bin/mqtt_ha_discovery.sh /etc/init.d/openwrt_presence enable >/dev/null 2>&1
chmod +x /etc/init.d/openwrt_presence /etc/init.d/openwrt_presence restart >/dev/null 2>&1
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
sleep 2 sleep 2
if ! ps | grep -q "[h]ostapd_cli"; then if ! ps | grep -q "[h]ostapd_cli"; then
warn "Service started, but hostapd_cli process not found." warn "Служба запущена, но процесс hostapd_cli не найден."
echo "Check logs: logread | grep hostapd" echo "Проверьте логи: logread | grep hostapd"
echo "Verify Wi-Fi interfaces with: iw dev" echo "Возможно, ваши интерфейсы Wi-Fi называются не phy0-ap0/phy1-ap0 (проверьте через 'iw dev')"
fi fi
info "Configuring Cron..." info "Настройка Cron..."
if command -v crontab >/dev/null 2>&1; then if command -v crontab >/dev/null 2>&1; then
if ! crontab -l 2>/dev/null | grep -q "mqtt_ha_discovery.sh"; 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 (crontab -l 2>/dev/null; echo "* * * * * /usr/bin/mqtt_ha_discovery.sh") | crontab - 2>/dev/null
/etc/init.d/cron restart 2>/dev/null /etc/init.d/cron restart 2>/dev/null
fi fi
else else
warn "Cron is not installed. Run: opkg install cron" warn "Cron не установлен. Установите вручную: opkg install cron"
fi fi
info "Running initial discovery..." info "Первичная инициализация..."
/usr/bin/mqtt_ha_discovery.sh 2>/dev/null || warn "Initial discovery failed. Run manually later." /usr/bin/mqtt_ha_discovery.sh >/dev/null 2>&1 || warn "Инициализация завершилась с ошибкой."
echo "" echo ""
echo "==================================================" echo "=================================================="
info "Installation completed successfully!" info "Установка успешно завершена!"
echo "==================================================" echo "=================================================="
echo "To edit settings: vi /etc/config/openwrt_ha" echo "Для редактирования настроек: vi /etc/config/openwrt_ha"
echo "To view logs: logread | grep wifi_tracker" echo "Для просмотра логов: logread | grep wifi_tracker"
echo "To test: Turn off Wi-Fi on the added device and check logs after the delay." echo "Для проверки: выключите Wi-Fi на добавленном устройстве и проверьте лог через указанную задержку."