サーバーと一緒にUPS非対応なTeraStationをシャットダウンする

Pocket

ウチのやや古い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でまかなっていないと意味がないのでご注意を。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)