Cudy TR3000旁路由,自定义LED指示灯控制脚本。

一、创建 LED 脚本

执行
1
nano /usr/bin/led-network-monitor.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/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桥接接口
LAN_BR="br-lan"

# 网络连通性检测地址
PING1="223.5.5.5"
PING2="114.114.114.114"

# 夜间起始小时、结束小时
NIGHT_START=18
NIGHT_END=6

# 状态检测周期(秒)
INTERVAL=15

# 开机等待延时,给系统和AdGuardHome预留初始化时间
sleep 30

# 校验LED设备文件是否存在
[ -e "$WHITE_LED" ] || exit 1
[ -e "$RED_LED" ] || exit 1

# 设置LED亮度,状态不变则跳过写入,减少IO
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"
}

# 获取当前小时,去除数字前导0
get_hour() {
date +%H | sed 's/^0//'
}

# 判断当前时段是否为夜间
is_night() {
H=$(get_hour)
if [ "$H" -ge "$NIGHT_START" ] || \
[ "$H" -lt "$NIGHT_END" ]; then
return 0
fi
return 1
}

# 外网连通检测,两个ping地址任意一个通即判定网络正常
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下任意端口物理up则链路正常
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

# 找不到物理端口时,不判定链路失败,交给外网检测逻辑
[ "$FOUND_PORT" = "0" ] && return 0
return 1
}

# 主循环,优先级:LAN物理链路 > 外网连通性 > 昼夜时间
while true; do
if ! lan_link_ok; then
set_led 0 255
elif ! internet_ok; then
set_led 0 255
elif is_night; then
set_led 0 0
else
set_led 255 0
fi

sleep "$INTERVAL"
done
赋予执行权限
1
chmod +x /usr/bin/led-network-monitor.sh

、建立 OpenWrt 后台服务

创建
1
nano /etc/init.d/led-network
1
2
3
4
5
6
7
8
9
10
11
#!/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
}
赋予执行权限
1
chmod +x /etc/init.d/led-network
设置开机自动启动
1
/etc/init.d/led-network enable

站内搜索

没有找到内容!