0%

梅林路由器pppoe折腾

梅林路由器pppoe折腾

网络通断检查

家中用的R7000网件洋垃圾, 刷的梅林系统. 用的移动的网, 由于移动给的光猫太垃圾, 就折腾了个桥接, 用洋垃圾去拨号联网, 移动给的路由器仅仅作为一个光猫用. 在梅林中可以通过配置pppoe来进行拨号, 其中有个设置是internet detection, 一开始没注意默认的是ppp echo, 结果发现经常会莫名其妙地断网.仔细观察了下路由器的日志, 才发现有的时候移动根本就不响应echo, 导致多次echo失败, pppd自己就重启了. 如果把这个选项关闭了, 就不会自行断网了. 但是这样也存在一个问题, 如果移动网络波动, 或者移动运营商强制换ip, 路由器根本不知道网络已经断了, 就导致无法联网了. 这也不能让人接收, 我总不能每次都手动去重新拨号吧, 于是就写了个脚本, 自动检查网络是否正常, 在多次检查失败后自动重启pppd. 这样我就可以完全不用管路由了.

脚本设计: 每隔1分钟尝试访问下百度, 如果访问失败, 则立即进入故障检查模式, 依次间隔2,4,8,16秒重试访问, 如果都失败那么就重启下pppd, 重启后下次网络检查时间间隔从4开始重新计算. 这样即使网络断了, 也能在30-50秒内重启网络, 并且偶尔的1-2次网络抖动导致的检查失败并不会导致pppd重启, 且网络抖动时快速重新检查以确定网络通断情况. 网络检查一旦失败后再成功, 就将下次检查时间设为上次成功检查的时间间隔的2倍, 直到达到1分钟间隔为止.

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
#!/bin/sh                                                                                                                                                      
target=www.baidu.com
fail_max=5
fail_cnt=0
# max possible fail time: 30s
timeout=5
interval=8
interval_max=64
interval_min=1
syslog_path=/tmp/syslog.log

# 检查网络状况, 返回1表示通, 返回0表示不通
function network()
{
local ret_code=`curl -I -s --connect-timeout ${timeout} ${target} -w %{http_code} | tail -n1`
if [ "x$ret_code" = "x200" ]; then
return 1
fi
return 0
}

function restart() {
# 重启前ping下114, 以确定网络的确断了
if ! ping 114.114.114.114 -w2;then
/sbin/service restart_wan
fi
}

#用于计算开始下次检查的时间间隔
function new_interval(){
if [ "x$1" = "x+" ];then
interval=$(($interval*2))
elif [ "x$1" = "x-" ];then
interval=$((2**($fail_max - $fail_cnt)))
else
interval=$((2*$fail_cnt))
fi
if [ $interval -gt $interval_max ];then
interval=$interval_max
elif [ $interval -le $interval_min ];then
interval=$interval_min
fi
}

function log() {
echo "$(date +'%Y-%m-%d %H:%M:%S'): $1" |tee -a $syslog_path
}

function runonce() {
if ps wT|grep -v grep|grep $0|awk '{print $1}'|grep -v $$;then
log "NET checker exists, skip run again."
exit 0
fi
}

function main()
{
runonce
while true;
do
network
ret1=$?
if [ "x$ret1" = "x1" ];then
if [ $fail_cnt -gt 0 ];then
new_interval -
else
new_interval +
fi
fail_cnt=0
log "NET OK, fail cnt: $fail_cnt, sleep: $interval."
else
fail_cnt=$(($fail_cnt+1))
new_interval
log "NET FAIL, fail cnt: $fail_cnt, sleep: $interval."
if [ $fail_cnt -ge $fail_max ];then
log "NET CHECK FAIL ALL, do wan restart"
restart
fail_cnt=0
interval=4
fi
fi
sleep $interval
done
}

main

保存以上代码到/jffs/scripts下, 命名net_checker.sh, 并使用chmod +x /jiff/scripts/net_checker.sh给其添加执行权限. 最后在梅林路由器的web管理界面中Tools->Script 下添加一个类型为WAN-START的脚本, 脚本配置输入/jiff/scripts/net_checker.sh, 并点击+号即可. 最后在外部网络配置中应用下配置, 重新刷新下WAN即可生效.

路由温度记录

夏天来了, 观察日志发现路由器偶尔还会重启, 怀疑是温度过热导致的, 但是日志中没有关于路由器温度的记录, 所以又搞了个脚本记录路由器温度, 并给路由器加了个风扇. 获得路由器的温度信息的方法如下:

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
#!/bin/sh
syslog_path="/tmp/syslog.log"
interval=30

function log() {
echo "$(date +'%Y-%m-%d %H:%M:%S'): $1" >> $syslog_path
}

function runonce() {
if ps wT|grep -v grep|grep $0|awk '{print $1}'|grep -v $$;then
log "Temperature checker exists, skip run again."
exit 0
fi
}

function main()
{
runonce
while true;
do
cpu=$(cat /proc/dmu/temperature)
wifi2=$(wl -i eth1 phy_tempsense)
wifi5=$(wl -i eth2 phy_tempsense)
log "Wifi2G: $wifi2, Wifi5G: $wifi5, $cpu"
sleep $interval
done
}

main