Выключение LED индикаторов openWRT по расписанию

Управление Led индикаторов openWRT по расписанию

Опубликовано: / Просмотрено: 7 /

И вначале реклама, небольшой блок. Прошу не сердиться и не вносить ее в фильтры блокировщиков.

подробнее о рекламодателе можно узнать внутри блока
Спасибо. А теперь сам материал.

С помощью нейронки Claude Sonnet написал скрипт, который выключает вечером светодиоды у роутера, а утром включает их обратно. Важно - тестировалось и работает на Cudy WR3000p под управлением openWRT 25.12.4. С обязательным пакетом mdio-tools. Если что, отказываюсь сразу от ответственности - у меня на тесте все работало,  но именно в такой связке - Cudy wr3000p + openwrt 25.12.4 + mdio-tools - это важно, у разных роутеров по разному записана конфигурация светодиодов.

Сам скрипт 

#!/bin/sh
# Управление светодиодами Cudy WR3000P (OpenWrt)
# Использование: led_control.sh {on|off|status}

SAVE_DIR="/tmp/led_state"
MDIO_DEFAULTS="/etc/led_mdio_defaults"

log() {
    logger -t led_control "$*"
    echo "[$(date '+%H:%M:%S')] $*"
}

# ─────────────────────────────────────────
# Чтение и сохранение исходных mdio значений
# (вызывается один раз при первом отключении)
# ─────────────────────────────────────────
save_mdio_defaults() {
    [ -f "$MDIO_DEFAULTS" ] && return 0
    LAN_VAL=$(mdio mt7530-0 0:0x1f raw 0x21 2>/dev/null | awk '{print $NF}')
    WAN_VAL=$(mdio mdio-bus 6:0x1f 0xd044 2>/dev/null  | awk '{print $NF}')
    printf "LAN_DEFAULT=%s\nWAN_DEFAULT=%s\n" "$LAN_VAL" "$WAN_VAL" > "$MDIO_DEFAULTS"
    log "Сохранены mdio-дефолты: LAN=$LAN_VAL WAN=$WAN_VAL"
}

get_default() {
    [ -f "$MDIO_DEFAULTS" ] || return 1
    grep "^${1}=" "$MDIO_DEFAULTS" | cut -d= -f2
}

# ─────────────────────────────────────────
# Сохранение состояния sysfs-светодиодов
# ─────────────────────────────────────────
save_sysfs_leds() {
    mkdir -p "$SAVE_DIR"
    for led_path in /sys/class/leds/*/; do
        [ -d "$led_path" ] || continue
        name=$(basename "$led_path")
        # Извлекаем активный триггер из скобок: "none [netdev] timer" → "netdev"
        raw=$(cat "${led_path}trigger" 2>/dev/null)
        if echo "$raw" | grep -q '\['; then
            trigger=$(echo "$raw" | sed 's/.*\[\([^]]*\)\].*/\1/')
        else
            trigger="none"
        fi
        echo "$trigger" > "$SAVE_DIR/${name}.trigger"
        cat "${led_path}brightness" 2>/dev/null > "$SAVE_DIR/${name}.brightness"
    done
}

# ─────────────────────────────────────────
# ВЫКЛЮЧЕНИЕ всех светодиодов
# ─────────────────────────────────────────
leds_off() {
    save_mdio_defaults

    # Сохранить sysfs-состояние только при первом вызове за сессию
    [ -d "$SAVE_DIR" ] || save_sysfs_leds

    # Отключить sysfs-светодиоды (WiFi, питание и т.д.)
    for led_path in /sys/class/leds/*/; do
        [ -d "$led_path" ] || continue
        echo none > "${led_path}trigger"  2>/dev/null
        echo 0    > "${led_path}brightness" 2>/dev/null
    done

    # Отключить LAN-светодиоды (коммутатор mt7530)
    mdio mt7530-0 0:0x1f raw 0x21 0x0008 2>/dev/null \
        && log "LAN LED: выключены" || log "LAN LED: ошибка mdio"

    # Отключить WAN-светодиод (внешний PHY)
    mdio mdio-bus 6:0x1f 0xd044 0x4089 2>/dev/null \
        && log "WAN LED: выключен" || log "WAN LED: ошибка mdio"

    log "Все светодиоды ВЫКЛЮЧЕНЫ"
}

# ─────────────────────────────────────────
# ВКЛЮЧЕНИЕ всех светодиодов
# ─────────────────────────────────────────
leds_on() {
    # ── LAN: восстановить сохранённое значение (или дефолт 0x0000) ──
    LAN_SAVED=$(get_default LAN_DEFAULT)
    # Если сохранённое — уже "выключено" (0x0008), используем 0x0000
    case "$LAN_SAVED" in
        0x0008|"") LAN_RESTORE="0x0000" ;;
        *)         LAN_RESTORE="$LAN_SAVED" ;;
    esac
    mdio mt7530-0 0:0x1f raw 0x21 "$LAN_RESTORE" 2>/dev/null \
        && log "LAN LED: включены (val=$LAN_RESTORE)" || log "LAN LED: ошибка mdio"

    # ── WAN: восстановить сохранённое значение ──
    WAN_SAVED=$(get_default WAN_DEFAULT)
    case "$WAN_SAVED" in
        0x4089|"") WAN_RESTORE="0x0021" ;;   # типовой дефолт link+activity
        *)         WAN_RESTORE="$WAN_SAVED" ;;
    esac
    mdio mdio-bus 6:0x1f 0xd044 "$WAN_RESTORE" 2>/dev/null \
        && log "WAN LED: включён (val=$WAN_RESTORE)" || log "WAN LED: ошибка mdio"

    # ── sysfs-светодиоды: восстановить сохранённые триггеры ──
    if [ -d "$SAVE_DIR" ]; then
        for led_path in /sys/class/leds/*/; do
            [ -d "$led_path" ] || continue
            name=$(basename "$led_path")
            tf="$SAVE_DIR/${name}.trigger"
            bf="$SAVE_DIR/${name}.brightness"
            [ -f "$tf" ] && echo "$(cat "$tf")" > "${led_path}trigger"    2>/dev/null
            [ -f "$bf" ] && echo "$(cat "$bf")" > "${led_path}brightness"  2>/dev/null
        done
    else
        # Нет сохранённого состояния — просто зажигаем
        for led_path in /sys/class/leds/*/; do
            [ -d "$led_path" ] || continue
            echo 1 > "${led_path}brightness" 2>/dev/null
        done
    fi

    log "Все светодиоды ВКЛЮЧЕНЫ"
}

# ─────────────────────────────────────────
# СТАТУС
# ─────────────────────────────────────────
status() {
    echo "╔══════════════════════════════════════════════════╗"
    echo "║            Статус светодиодов WR3000P            ║"
    echo "╚══════════════════════════════════════════════════╝"

    echo ""
    echo "── sysfs-светодиоды ──────────────────────────────"
    for led_path in /sys/class/leds/*/; do
        [ -d "$led_path" ] || continue
        name=$(basename "$led_path")
        raw=$(cat "${led_path}trigger" 2>/dev/null)
        if echo "$raw" | grep -q '\['; then
            trigger=$(echo "$raw" | sed 's/.*\[\([^]]*\)\].*/\1/')
        else
            trigger="none"
        fi
        brightness=$(cat "${led_path}brightness" 2>/dev/null)
        state="OFF"
        [ "$brightness" -gt 0 ] 2>/dev/null && state="ON "
        printf "  [%s] %-38s trigger=%s\n" "$state" "$name" "$trigger"
    done

    echo ""
    echo "── mdio-регистры ─────────────────────────────────"
    printf "  LAN  mt7530-0  reg 0x21: "
    mdio mt7530-0 0:0x1f raw 0x21 2>/dev/null || echo "ошибка чтения"
    printf "  WAN  mdio-bus  reg 0xd044: "
    mdio mdio-bus 6:0x1f 0xd044 2>/dev/null   || echo "ошибка чтения"

    if [ -f "$MDIO_DEFAULTS" ]; then
        echo ""
        echo "── Сохранённые дефолты ($MDIO_DEFAULTS) ──────"
        cat "$MDIO_DEFAULTS"
    fi

    if [ -d "$SAVE_DIR" ]; then
        echo ""
        echo "── Сохранённые sysfs-состояния ($SAVE_DIR) ───"
        ls "$SAVE_DIR/" | head -20
    fi
}

# ─────────────────────────────────────────
case "$1" in
    on)       leds_on  ;;
    off)      leds_off ;;
    status)   status   ;;
    *)
        echo "Использование: $(basename "$0") {on|off|status}"
        echo ""
        echo "  on     — включить все светодиоды"
        echo "  off    — выключить все светодиоды"
        echo "  status — показать текущее состояние"
        exit 1
        ;;
esac

Его через WinSCP положил в папку /root/led-night.sh

выдал права chmod +x /root/led-night.sh

Вначале считываем текущий статус, обязательно!!!

led_control.sh status

проверяем

led_control.sh off
led_control.sh on

и, если все нормально, далее в cron /etc/crontabs/root

0 23 * * * /root/led-night.sh off
0 8 * * * /root/led-night.sh on

Сам скрипт написан с помощью нейросети Claude Sonnet 4.5

а,  сам cron нужно не забыть активировать и запустить

/etc/init.d/cron enable
/etc/init.d/cron start

 


Теги: