梅林路由器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
timeout=5 interval=8 interval_max=64 interval_min=1 syslog_path=/tmp/syslog.log 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() { 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
|