创建 LED 脚本

执行

nano /usr/bin/led-network-monitor.sh
#!/bin/sh

# ==========================================================
# Cudy TR3000 OpenWrt LED Network Monitor
#
# 旁路由模式
#
# 白灯:
# 06:00 - 18:00 网络正常 -> 常亮
# 18:00 - 06:00 网络正常 -> 关闭
#
# 红灯:
# 任意时间网络异常 -> 亮
#
# 优先级:
# 网络故障 > 时间规则
# ==========================================================


# =========================
# LED
# =========================

WHITE_LED="/sys/class/leds/white:status/brightness"
RED_LED="/sys/class/leds/red:power/brightness"


# =========================
# LAN Bridge
# =========================

LAN_BR="br-lan"


# =========================
# Internet 检测地址
# =========================

PING1="223.5.5.5"
PING2="114.114.114.114"


# =========================
# 时间
# 18:00 ~ 06:00 为夜间
# =========================

NIGHT_START=18
NIGHT_END=6


# =========================
# 检测周期
# =========================

INTERVAL=15


# =========================
# 开机等待
# 给 OpenWrt / 网络 / AdGuard Home
# 一些初始化时间
# =========================

sleep 30


# =========================
# 检查 LED 节点
# =========================

[ -e "$WHITE_LED" ] || exit 1
[ -e "$RED_LED" ] || exit 1


# =========================
# 设置 LED
# =========================

set_led()
{
WHITE="$1"
RED="$2"

CURRENT_WHITE=$(cat "$WHITE_LED" 2>/dev/null)
CURRENT_RED=$(cat "$RED_LED" 2>/dev/null)

# 状态没有变化,不重复写
if [ "$CURRENT_WHITE" = "$WHITE" ] &&
[ "$CURRENT_RED" = "$RED" ]
then
return
fi

echo "$WHITE" > "$WHITE_LED"
echo "$RED" > "$RED_LED"
}


# =========================
# 获取当前小时
# =========================

get_hour()
{
date +%H | sed 's/^0//'
}


# =========================
# 判断是否夜间
# 18:00 ~ 06:00
# =========================

is_night()
{
H=$(get_hour)

if [ "$H" -ge "$NIGHT_START" ] ||
[ "$H" -lt "$NIGHT_END" ]
then
return 0
fi

return 1
}


# =========================
# 检查 Internet
#
# 只要两个地址有一个成功
# 就认为网络正常
# =========================

internet_ok()
{
ping -I "$LAN_BR" -c 1 -W 1 "$PING1" \
>/dev/null 2>&1 && return 0

ping -I "$LAN_BR" -c 1 -W 1 "$PING2" \
>/dev/null 2>&1 && return 0

return 1
}


# =========================
# 检查 LAN 物理链路
#
# br-lan 下面的物理端口:
# 只要存在一个 carrier=1,
# 就认为有物理链路。
#
# 注意:
# 物理链路只是辅助判断,
# 真正的网络状态由 internet_ok
# 最终决定。
# =========================

lan_link_ok()
{
FOUND_PORT=0

for DEV in /sys/class/net/"$LAN_BR"/brif/*
do

[ -e "$DEV" ] || continue

PORT_NAME=$(basename "$DEV")
CARRIER_FILE="/sys/class/net/$PORT_NAME/carrier"

[ -f "$CARRIER_FILE" ] || continue

FOUND_PORT=1

LINK=$(cat "$CARRIER_FILE" 2>/dev/null)

if [ "$LINK" = "1" ]
then
return 0
fi

done

# 如果没有找到物理端口,
# 不单独判定失败,交给 Internet 检测
[ "$FOUND_PORT" = "0" ] && return 0

return 1
}


# =========================
# 主循环
# =========================

while true
do

# ======================================================
# 第一优先级:LAN物理链路
# ======================================================

if ! lan_link_ok
then

# LAN没有物理链路
# 红灯最高优先级

set_led 0 255

else

# ==================================================
# 第二优先级:Internet
# ==================================================

if ! internet_ok
then

# Internet断开
# 红灯最高优先级

set_led 0 255

else

# ==================================================
# 第三优先级:时间
# ==================================================

if is_night
then

# 夜间正常联网
# 白灯灭
# 红灯灭

set_led 0 0

else

# 白天正常联网
# 白灯亮
# 红灯灭

set_led 255 0

fi

fi

fi

sleep "$INTERVAL"

done

赋予执行权限

chmod +x /usr/bin/led-network-monitor.sh

建立 OpenWrt 后台服务

创建

nano /etc/init.d/led-network
#!/bin/sh /etc/rc.common

START=99

USE_PROCD=1

start_service()
{
procd_open_instance

procd_set_param command \
/usr/bin/led-network-monitor.sh

# 如果脚本异常退出,自动重启
procd_set_param respawn

procd_close_instance
}

赋予执行权限

chmod +x /etc/init.d/led-network

设置开机自动启动

/etc/init.d/led-network enable