家里宽带是电信的100M光纤。不过有时候会莫名其妙断线,而且只能通过重启路由器来解决。(10000反映多次未果。。。)
于是没办法,写了个nodejs脚本(这是我第一个nodejs程序好吗)来判断是否断线并重启路由器。
本文所用路由器型号为Netgear 6300 v2
主要思路:
检查 http://10.0.0.1/ADV_home2.htm
根据内容里的:Domain Name Server 是否存在有效的DNS来判断是否断线
如果断线,则提交相应的数据(buttonSelect=2)使Netgear路由器重启
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 |
/* 若Netgear 6300 v2网络断线,重启路由。 https://blog.bbdd.ltd */ var http = require('http'); var qs = require('querystring'); function substrAfter(s, subs, length){ return s.substr(s.indexOf(subs) + subs.length, length); } function checkRestart(){ var options = { hostname: '10.0.0.1', path: '/ADV_home2.htm', auth: 'admin:password' }; console.log('check...' + new Date()); var req = http.request(options, function (res){ var _s = ''; res.on('data', function (chunk){ _s += chunk; }); res.on('end', function() { var s = substrAfter(_s, '<form action="newgui_adv_home.cgi?id=', 10000); if (s.match(/^(\d+)/)) { var sid = RegExp.$1; _s = substrAfter(s, '>Domain Name Server', 300); if (_s.match(/>(\d{1,3}\.){3}\d{1,3}</) && RegExp.$1 != '0.') { console.log('ok'); } else { console.log(_s); restart(sid); } } }); }).on('error', function(e) { console.log('****error: ' + e.message); }); req.end(); }; function restart(sid){ var data = {buttonSelect:2, wantype:'pppoe', enable_apmode:0}; var query = qs.stringify(data); var options = { hostname: '10.0.0.1', path: 'newgui_adv_home.cgi?id=' + sid, method: 'POST', auth: 'admin:password', headers:{ 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': query.length } }; console.log('restart...'); var req = http.request(options, function(res) { res.on('data', function (chunk) { ; }); }).on('error', function(e) { console.log('****error: ' + e.message); }); req.write(query); req.end(); } checkRestart(); setInterval(checkRestart, 60000); |