ウチのやや古いTeraStation(HS-DHTGL/R5)はUPSに対応してませんが、どこかで先人がハックしていないかとググったところ、「Tera Stationをremoteからshutdownする方法」というブログ記事を発見しました。なるほど、wgetコマンドを使ってWeb管理インターフェイスのシャットダウンを実行する訳ですね。早速試してみたところ、ウチのDHTGLちゃんWeb管理インターフェイスの仕様が変わったらしく上記記事のスクリプトは使用できませんでした。そこで基本アプローチを拝借しつつ、DHTGL用に改変を試みました(以下、ファームウェアは1.15での情報です)。
■解析編
まずそもそも元スクリプトはwgetのBASIC認証用のパラメーターで認証を突破してますが、DHTGLはBACIS認証ですらない。結構苦労しましたが、まとめると、
- /cgi-bin/top.cgiにPOSTでパラメーターを送ることで動作している(元スクリプトではts.cgi)
- gPage、gMode、gType、gKeyといったhidden値で実際の表示ページや動作を規定している
- ログインページから送られるhidden値はgPage=top、gMode=authでID、PWはそれぞれtxtAuthLoginUser、txtAuthLoginPasswordというフィールド名で送られる
- 一旦認証が通ると、gSSSとgRRRというhidden値が生成されセッション管理に用いられる
- シャットダウンの時は認証情報の代わりにgSSS、gRRRをつけ、gPage=maintenance、gMode=shutdown、gType=shutdownを送る
といった感じ。gSSSはセッション毎、gRRRはページ遷移毎にユニークに生成されてるっぽいです。gSSSは「07ae46da8acb13a7ba9c99acf3ef66f9」のような16進数値、gRRRは「463273411635750418」のような10進数値です。
つまり認証(gSSS、gRRR取得)とシャットダウン実行でwgetを2回実行する必要があるみたいでした。
■実装編
シェルスクリプトやsedに使い慣れてないのであまり綺麗な実装ではないですが晒してみます。うまいことすればTMPファイルを減らしたり無くしたりできそうなもんですが、よくわからなくて2つほど生成してます。もっとエレガントな方法があれば是非教えて下さい。
#!/bin/sh
#
# rc script to shutdown Tera Station by knakao
#
#REQUIRE LOGIN
WGET=/usr/bin/wget
SERVER=192.168.0.***
USER=admin
ADMIN_PASSWD=**********
URL="http://$SERVER/cgi-bin/top.cgi"
TMPFILE="/tmp/ts_shutdown.tmp"
TMPFILE2="/tmp/ts_shutdown2.tmp"
ts_down()
{
# Loging in as administrator
OPT="–post-data=txtAuthLoginUser=$USER&txtAuthLoginPassword=$ADMIN_PASSWD&gPage=top&gMode=auth -O $TMPFILE -q -T 5"
$WGET $OPT $URL
cat $TMPFILE | grep gSSS > $TMPFILE2
gSSS=sed 's/.*name="gSSS" value="\([^"]*\).*/\1/g' $TMPFILE2
#echo ‘Current gSSS is ‘$gSSS
gRRR=sed 's/.*name="gRRR" value="\([^"]*\).*/\1/g' $TMPFILE2
#echo ‘Current gRRR is ‘$gRRR
OPT="–post-data=gPage=maintenance&gMode=shutdown&gType=shutdown&gSSS=$gSSS&gRRR=$gRRR -o /dev/null -q -T 5"
$WGET $OPT $URL
rm -f $TMPFILE
rm -f $TMPFILE2
}
case $1 in
start)
;;
stop)
ts_down;
;;
esac
このファイルを実行可能にして/etc/init.d/terastation等として置きます(RedHat系)。赤字部分は適宜書き換えて下さい。
手動で実行するには
/etc/inin.d/terastation stop
などとします(なお当たり前ですがstartオプションは無視されます)。せっかくrcスクリプト形式なので適当な/etc/rc*.dディレクトリにシンボリックリンクを張るとか、/etc/rc.d/init.d/haltに書いておけば自動実行されるんですが、通常のメンテナンス時にも一緒にTeraStationまで落ちるのが難点ですね。UPSによるシャットダウンの時だけに実行できる仕組みがある場合はそちらを利用するのが良いでしょう。
あとTeraStation自体と途中のハブもUPSでまかなっていないと意味がないのでご注意を。