Update install.sh

This commit is contained in:
2026-10-12 12:11:45 +03:00
parent 4474b64b05
commit 2740792fa4
+100 -116
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."
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
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
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,67 +72,85 @@ 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 [ "$answer" != "n" ] && [ "$answer" != "N" ]; then if [ "$ADD_DEVICE_ONLY" = "true" ] || { [ "$SKIP_CONFIG" = "false" ] && [ "$answer" != "n" ] && [ "$answer" != "N" ]; }; then
DEVICE_COUNT=1 DEVICE_COUNT=1
if [ "$ADD_DEVICE_ONLY" = "true" ]; then if [ "$ADD_DEVICE_ONLY" = "true" ]; then
DEVICE_COUNT=$(uci show openwrt_ha 2>/dev/null | grep -c "device[0-9]" || echo 0) DEVICE_COUNT=$(uci show openwrt_ha 2>/dev/null | grep -c "\.name=" || echo 0)
DEVICE_COUNT=$((DEVICE_COUNT + 1)) DEVICE_COUNT=$((DEVICE_COUNT + 1))
fi fi
while true; do while true; do
echo "" echo ""
echo "Device #$DEVICE_COUNT:" echo "--- Устройство #$DEVICE_COUNT ---"
DEVICE_NAME=$(read_with_default "Device Name" "Device $DEVICE_COUNT") printf "Имя устройства (например, 'Телефон'): "
read DEVICE_NAME
DEVICE_NAME=${DEVICE_NAME:-Устройство $DEVICE_COUNT}
while true; do 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)" echo "Введите MAC-адрес(а) через пробел (пример: 14:e0:1d:c7:05:76 или 14:e0:1d:c7:05:76 aa:bb:cc:dd:ee:ff)"
read -r -p "MAC(s): " DEVICE_MACS printf "MAC-адрес(а): "
read DEVICE_MACS
if [ -z "$DEVICE_MACS" ]; then if [ -z "$DEVICE_MACS" ]; then
warn "At least one MAC address is required." 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
warn "Invalid MAC format: $mac" warn "Неверный формат MAC: $mac"
ALL_VALID=false ALL_VALID=false
break break
fi fi
done done
[ "$ALL_VALID" = "true" ] && break [ "$ALL_VALID" = "true" ] && break
done done
echo "Device Type:" echo "Тип устройства:"
echo "1) Tracker (people, home/not_home)" echo "1) Трекер (люди, статусы home/not_home)"
echo "2) Alarm/IoT (devices, online/offline)" echo "2) Тревога/IoT (розетки, статусы online/offline)"
DEVICE_TYPE_NUM=$(read_with_default "Choose [1-2]" "1") printf "Выберите [1-2] [1]: "
read DEVICE_TYPE_NUM
DEVICE_TYPE_NUM=${DEVICE_TYPE_NUM:-1}
if [ "$DEVICE_TYPE_NUM" = "2" ]; then if [ "$DEVICE_TYPE_NUM" = "2" ]; then
DEVICE_TYPE="alarm" DEVICE_TYPE="alarm"
@@ -168,7 +160,9 @@ if [ "$SKIP_CONFIG" = "false" ] || [ "$ADD_DEVICE_ONLY" = "true" ]; then
DEFAULT_DELAY="30" DEFAULT_DELAY="30"
fi fi
DEVICE_DELAY=$(read_with_default "Delay before 'disconnected' (seconds)" "$DEFAULT_DELAY") printf "Задержка перед отправкой 'отключен' (сек) [$DEFAULT_DELAY]: "
read DEVICE_DELAY
DEVICE_DELAY=${DEVICE_DELAY:-$DEFAULT_DELAY}
DEVICE_ID="device${DEVICE_COUNT}" DEVICE_ID="device${DEVICE_COUNT}"
uci set openwrt_ha.${DEVICE_ID}='device' uci set openwrt_ha.${DEVICE_ID}='device'
@@ -177,17 +171,15 @@ if [ "$SKIP_CONFIG" = "false" ] || [ "$ADD_DEVICE_ONLY" = "true" ]; then
uci set openwrt_ha.${DEVICE_ID}.type="$DEVICE_TYPE" uci set openwrt_ha.${DEVICE_ID}.type="$DEVICE_TYPE"
uci set openwrt_ha.${DEVICE_ID}.delay="$DEVICE_DELAY" uci set openwrt_ha.${DEVICE_ID}.delay="$DEVICE_DELAY"
info "Device '$DEVICE_NAME' added." info "Устройство '$DEVICE_NAME' добавлено."
printf "Add another device? [Y/n]: "
read -r answer
[ "$answer" = "n" ] || [ "$answer" = "N" ] && break
printf "Добавить еще одно устройство? [Y/n]: "
read answer
case "$answer" in [nN]*) break ;; esac
DEVICE_COUNT=$((DEVICE_COUNT + 1)) DEVICE_COUNT=$((DEVICE_COUNT + 1))
done done
uci commit openwrt_ha uci commit openwrt_ha
fi fi
fi
if [ "$SKIP_CONFIG" = "false" ]; then if [ "$SKIP_CONFIG" = "false" ]; then
uci set openwrt_ha.main='mqtt' uci set openwrt_ha.main='mqtt'
@@ -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 на добавленном устройстве и проверьте лог через указанную задержку."