Baffaloルータの自動再起動スクリプト
Baffaloのルータはお手頃価格で良いけど、たまに反応が悪くなる。
再起動するとなおるので、自動で再起動させてみようと思った。
まずいろいろ調べてみる。
"cgi-bin/cgi?req=inp&req=waiting_page.html"を呼び出すと再起動&「お待ちください」画面が表示されるが直接呼んでみると、不正だといわれる…。
もう少し調べてみると、再起動ボタンのある"cgi-bin/cgi?req=frm&frm=init.html"というページに隠しフィールドが2つある。
sWebSessionidとsWebSessionnumの2つ。
これらの値はページが呼び出される度に新しくなるので、これを使って不正かのチェックをしているようだ。
■Try 1■
まずはC#で簡単なプログラムを書いてみる。
ページの取得→パースしてsWebSessionidとsWebSessionnumを取得→再起動ページにPOST。
ルータのWebサーバがお行儀悪いので?、「サーバによってプロトコル違反が発生しました。」と例外が発生してしまう。
これはconfigファイルのsettingsに
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.net> <settings> <httpWebRequest useUnsafeHeaderParsing="true" /> </settings> <system.net> </configuration>
と記述することで回避できるのだけど、C#のバグ?でHttpWebRequestを続けて使うと接続が強制的に閉じられてしまう。
KeepAliveをfalseにしてもだめ、その他いろいろやったけど技術不足で断念。
■Try 2■
じゃあ今度はLinuxからwgetでやってみよう。
ページの取得→sedでsWebSessionidとsWebSessionnumを取得→wgetでページにPOST
POSTする段階で、401 Unauthorisedとでる。--http-userを指定しても、"http://root:*password*@"としてもダメなので断念。
■Try 3■
Windows Scripting Hostでやってみる。
IEオブジェクトを作成→ページ表示→ボタンクリック
Dim myIE Set myIE = WScript.CreateObject("InternetExplorer.Application") myIE.Visible = false myIE.Navigate "http://ルータのアドレス/cgi-bin/cgi?req=frm&frm=init.html" '本当はここでちゃんとページ読み込みチェックが必要 WScript.Sleep 500 myIE.document.forms(0).elements(0).click()
上手くいった。
なんか、ユーザの操作を真似するにはWSH最強だなあ。