Самый надежный и правильный способ заставить лампочку гореть при наличии интернета в OpenWrt — использовать встроенный механизм `netdev` для триггеров. Он работает на уровне ядра, не тратит ресурсы процессора (в отличие от скриптов с бесконечным циклом) и автоматически отслеживает состояние интерфейса.
Однако если вам нужен именно кастомный скрипт (например, чтобы проверять доступность конкретного сайта через туннель VPN), ниже приведены оба варианта.
### Вариант 1: Правильный системный способ (через UCI)
Этот метод использует штатные средства системы. Лампочка будет загораться, как только WAN-интерфейс получит IP-адрес и поднимется.
**1. Узнайте имя вашего WAN-интерфейса**
Обычно это `wan`, но может быть `eth0.2`, `pppoe-wan` или другое. Выполните:
`ifstatus wan | grep '"up"'`
Если в ответе `"up": true`, значит это нужный интерфейс.
**2. Посмотрите доступные светодиоды**
Зайдите в веб-интерфейс LuCI -> Система -> LED Configuration. Там будут перечислены все физические светодиоды роутера (обычно они называются `green:lan`, `blue:wifi`, `amber:wan` и т.д.). Запомните точное имя того, который хотите использовать.
**3. Настройте триггер через консоль**
Выполните следующие команды, заменив `phy0-led` на реальное имя вашего светодиода из предыдущего шага:
```bash
# Устанавливаем триггер на активность сетевого устройства
uci set system.led_wan.trigger='netdev'
# Привязываем к нашему WAN-интерфейсу
uci set system.led_wan.dev='wan'
# Зажигаем при линке (поднятии интерфейса)
uci set system.led_wan.mode='link'
# Можно добавить 'tx rx', чтобы лампочка мигала при передаче данных:
# uci set system.led_wan.mode='link tx rx'
uci commit system
/etc/init.d/led restart
```
*Примечание: вместо секции `system.led_wan` можно использовать любое уникальное имя, например `system.internet_led`. Если вы настраиваете светодиод впервые, перед командами `set` может потребоваться создать секцию командой `uci add system led_wan`.*
Теперь, как только кабель провайдера подключен и интернет поднят, лампочка загорится.
### Вариант 2: Скрипт с проверкой реального интернета (пинг до 8.8.8.8)
Этот вариант подходит, если у вас сложная схема подключения (например, L2TP/PPTP сессия поднята, но провайдер не пускает в сеть, или трафик идет через VPN). Скрипт будет пинговать Google DNS и зажигать лампочку только при успешном ответе.
**1. Создайте файл скрипта:**
Подключитесь по SSH и выполните:
`vi /etc/check_internet.sh`
Нажмите `i` для входа в режим редактирования и вставьте код:
```bash
#!/bin/sh
# Имя светодиода (посмотрите в /sys/class/leds/)
LED="зеленая:система"
# Интерфейс, который должен быть поднят (необязательно, но полезно)
WAN_IF="wan"
# Что пингуем
TARGET="8.8.8.8"
# Количество пакетов
COUNT=2
# Проверяем, есть ли физический линк на WAN-порту
if ! ip link show "$WAN_IF" up >/dev/null 2>&1; then
# Выключаем светодиод, если кабеля нет
echo "none" > "/sys/class/leds/$LED/trigger"
echo "0" > "/sys/class/leds/$LED/brightness"
exit 0
fi
# Пингуем интернет
if ping -c $COUNT -W 2 -q $TARGET >/dev/null 2>&1; then
# Интернет есть, включаем светодиод
echo "default-on" > "/sys/class/leds/$LED/trigger"
else
# Интернета нет, выключаем
echo "none" > "/sys/class/leds/$LED/trigger"
echo "0" > "/sys/class/leds/$LED/brightness"
fi
```
Чтобы сохранить файл в редакторе `vi`: нажмите `Esc`, введите `:wq` и нажмите `Enter`.
*Обязательно замените значение переменной `LED` на актуальное имя папки из `/sys/class/leds/` (например, `tp-link:blue:wps` или `ath9k-phy0`).*
**2. Сделайте его исполняемым:**
`chmod +x /etc/check_internet.sh`
**3. Добавьте скрипт в автозагрузку и планировщик (cron):**
Скрипт нужно запускать периодически. Откройте планировщик:
`crontab -e`
Добавьте строку, которая будет запускать проверку каждые 30 секунд (планировщик cron в OpenWrt поддерживает шаг */30):
`*/1 * * * * /etc/check_internet.sh`
Или, если версия busybox старая и не поддерживает шаги меньше минуты, используйте цикл внутри самого скрипта, добавив в конец файла `/etc/rc.local` перед строкой `exit 0` такую конструкцию для запуска в фоне:
`(while :; do /etc/check_internet.sh; sleep 30; done) &`
### Как узнать точное имя светодиода?
Зайдите в систему по SSH и выполните команду:
`ls /sys/class/leds/`
Вы увидите список папок, например: `tp-link:green:system`, `ath9k-phy0`, `orange:wan`. Используйте одно из этих имен в переменной `LED` в скрипте выше.
