《Linuxサーバ遠隔電源制御》

WakeOnModem/WakeOnLanを使用しない遠隔サーバ電源制御方法  JULY-AUGUST 2002

 ここではWakeOnLan/WakeOnModemに対応していないマザーボード・LANカード・モデムカード
でも遠隔起動が出来るんだぞという方法にトライしたものである。

・背景
どうやってやるんだろう?
Webや携帯電話から制御したい
IPアドレスが変わったら?
このままでは危ない!
電源起動装置の製作
動作確認と改造
運用してみて…改造パート2
バグ対処・残された課題…
参考ページ
■背景(ADSL導入・Linuxサーバを立ち上げるまでの経緯) ISDNからADSLに乗り換えた為、今までのIDSN-TAは不要になったが、家庭内LANを組んでいたので 複数台のPCからWebアクセスするには別にルータが必要となった。 親戚宅に不要となったPCがあるというので、ルータ購入するんだったらそのPCにLinux-OSを インストールしてルータを構築しちまおうと考えた。 そもそもLinux-OSが普及している背景として一世代前のPCに再び活躍の場を与えるものとして 脚光浴びたことに他ならない…と私は勝手に思っている。  しかし最近のDistributionではpentium2、400MHz以上を推奨と謳っているものもあるようで 一世代前いや二世代前のPCではやはり役不足のようになるようでさびしい限りだ。 但しこれはクライアントマシンとして使用する場合の話であって、Xを立上げたりせず サーバとして運用する場合には一世代前のPCでも、そんなに問題にはならないだろう。  ここでいう一世代前のPCといっている今回の頂きもののターゲットマシンは、初代pentium 166MHzのWin95マシンである。メモリも32MB、HardDiskに至っては1.5GBというさびしさである。 ルータとして動いてくれればいいというわけでLinuxMagazine2002/6月号に付録でついてきた VineLinuxのVersion2.5をインストールしてブロードバンドルータを構築したのだった。 無事ルータを構築すると次なる欲求が…。 「料金定額制」で常時接続が可能である。常時インターネットに繋がっているということは、 クライアントPCとしては、ネットサーフィンし放題ということになるだろうが、逆に、自宅のPCを インタネット上に共有ファイルサーバとして公開して使えるということにもなる。 実際、ルータといっても元々はPCであり、本当のルータよりはよっぽど高機能であるしOSも汎用的な Linuxであることからサーバ運用が出来るはずである。 流石にサーバとして使うには余りにあまりなので、ちょっとだけ増強。とは言っても 元々廃棄されるところを頂いてきたのだからそんなに投資するのも考え物というわけで、 やはり拾ってきた8MBのメモリを2枚差し、秋葉原のジャンク屋で2680-で購入した3GBのHD を増設、すッころがっていたLANカードを2枚差して、各種サーバを立ち上げた。 自宅サーバでホームページ公開もできるが、ADSLは下り方向(Web⇒自宅)はサクサク行っても 登り方向(自宅⇒Web)がちとトロイので、不特定多数によるアクセス頻発にはとても耐えられなさそう。 するとアクセスするのは限られた者、限られた時間となるので、常時接続する意味はあまりない。 すると必要なときにサーバを立上げファイル転送や各種作業をしたのち電源オフ!で十分なのである。 そこで遠隔でLinuxサーバの電源ON・OFFができないものか?それも古いパソコンで! という話になったのである
■どうやってやるんだろう? 本題である「遠隔でLinuxサーバの電源ON・OFF」ができないものか調べてみた。 telnetサーバやSSHサーバを立ち上げれば、外部からログインして、shutdownコマンドで 電源を落とせることは確認できたので、あとは何とか起動をかけたい。 一般的な仕様は一般的な仕様として、どうせ自作するのだから自分の環境、PCにあった 仕様にすると割り切ることにした。 そしてコストがかからないこと。これが一番。設備投資はもちろん、運用管理費というと 大げさだがサーバを立ち上げるのにイチイチ電話代がかかるのは馬鹿馬鹿しい。 そもそもタダでもらってきたパソコンに無償OSのLinuxである。 次にあまりに手間がかからないこと。自作といってもプリント基板のエッチングからでは 手間かかりすぎですし、肝心なサーバのメンテナンスが追いつきません。 (※以下に述べるが実は結構手間がかかった) ということでこんな感じになりますかね。 ■仕様 ○ADSLモデムも普段は電源を落とし、Linuxサーバと連動して起動されること。  ・これにより待機電力を最小に抑える。  ・CRTはそもそも電源投入しておかないが、PCから電源供給をされているので   連動して起動されるのでこの点は問題なし。  ・そもそもWakeOnLan/WakeOnModemに対応していないハードなので、ADSLモデムが   起動されていても意味がない。 ○ADSLモデムが待機中は電源が落ちているため、遠隔起動は電話(アナログ回線)をトリガにする。  ・どこからでも起動がかけられる。たとえば携帯電話でも起動できる。 ○電話は呼出しのみで起動するようにし、オフフックしてDTMF音の解析などは行わない。  ・課金されたら電気代抑える意味ないじゃん。 ○PCの電源ボタンがトリガ検出形式っぽいので、それに対応できる方式にする。 ○再起動中(reboot)の着信を考慮すること。 ○起動する意図のない着信であってもPCが起動する点は今後の検討とし、  現段階では遠隔ログイン+shutdownコマンドによる電源断としておく。 検討・設計 ○電話の着信を何で検出するか。  上記参考ページではモデムによって検出しているが  今回のターゲットマシンではモデムはISAボードである。  ⇒待機中にモデムへの通電が必要となってしまうのと、ISAボードへの改造が必要と   なるので内臓モデムを使用する方法は見送る。  ⇒ワンダーキットから電話着信センサーキット(BELL-22)なるものが2950円で発売さ   れているのでこれを使う。  ⇒電話着信センサーには3段階のモードがあるらしい。(BY取説)   断続ON/OFF、着信中ON、継続ON。ともかく着信によってリレーのONは出来そう。 ○起動中の着信による影響  PCの電源ボタンがトリガ形式(ちょっと押して離す)なので、ON/OFFでは  同じ動作をするので、起動中に着信があった場合、今度は電源が切れてしまう。  単純に電話着信センサーのリレーだけでのPCの電源制御は駄目。  ⇒サーバ起動中は、PC電源の出力の有無で判定する。  ⇒回路としてはこんな感じ。2つのリレーを使った方式(案)   リレー@:PC電源ボタンに並列に入れ着信を契機に開閉。(待機中開放/着信で閉)。        (電話着信センサーのリレー)   リレーA:リレー@に直列に入れPCの電源に連動して開閉。(PC電源ON中開放/PC電源OFFで閉)。  (1)初期状態。 リレー@:Open /リレーA:Close  (2)着信。   リレー@:Colse/リレーA:Close 電話着信センサーによってPC電源ON。  (3)PC起動。  リレー@:Close/リレーA:Open PC電源ONによりPC電源ボタン開。  (4)着信終了。 リレー@:Open /リレーA:Open 電話着信センサーによってリレー@開放。運用状態。  (5)起動中着信。リレー@:Close/リレーA:Open PC電源ONのままなので電源SWは何もせず。  (6)着信終了。 リレー@:Open /リレーA:Open 電話着信センサーによってリレー@開放。運用状態。  (7)PC電源断。 リレー@:Open /リレーA:Close PC電源OFFによりPC電源ボタン閉。初期状態。  電話着信センサーは着信中リレー閉状態で、着信終了でリレー開放状態となる仕様。 ○起動する意図のない着信であってもPCが起動してしまう。  ⇒デフォルトでは起動後一定時間後に終了処理を走らせる。   継続する際には終了処理をキャンセルする等。  ⇒(具体案)   @周期的(cron)に電源管理フラグ(ファイル)を参照し、結果によってshutdownコマンドを実行。    但しPC起動時の初回のみはこの処理をスキップする。   (理由:起動完了直後のcron起動によるshutdownを回避するため)   Aフラグはlogin時に解除する。ログアウト時に再設定するかは検討。 ⇒⇒Webサーバの運用もするのでログアウト時の電源断フラグセットはしない。    (※)Web上でも電源管理フラグの制御が出来れば、携帯端末からの電源管理が可能になる。   Bなおshutdown時にはフラグは電源断に設定するようスクリプトを修正する。   (理由:保守者によるshutdown後に、着信があった場合サーバは上がりっぱなしになる)    さらにreboot時にはフラグは通常運転に設定する。   (理由:rebootするときは保守者が介在する場合と考えられるため、default電源断はおかしい) ■電源断判別フラグ

$echo "KEEP" > /home/httpd/html/poff/poff_flag
$chmod 666 /home/httpd/html/poff/poff_flag

■@/etc/cron.d/に以下のスクリプトを置いて10分毎に起動させるようにした。

$ls -l /etc/cron.d/poff_chk
-rw-r--r--    1 root     root           71 Jul  5 10:29 /etc/cron.d/poff_chk
$cat /etc/cron.d/poff_chk
# look in time 10 minutes.
*/10 * * * *    root    /etc/cron.poff_chk

■@電源断判別スクリプト⇒実行権をつけるのを忘れずに!

$ls -l /etc/cron.poff_chk
-rwxr-xr-x    1 root     root          899 Jul  9 14:31 /etc/cron.poff_chk
$cat /etc/cron.poff_chk 
#!/bin/sh
# 10分毎に/etc/cron.d/poff_chkから呼び出されるスクリプト

CHK_DIR="/home/httpd/html/poff"
CHK_FILE="$CHK_DIR/poff_flag"

# 電源断フラグ(ファイル)が無ければOFF状態で生成。
#
#[ -f $CHK_DIR ] || mkdir $CHK_DIR ; chmod 777 $CHK_DIR
#[ -f $CHK_FILE ] || echo "OFF" > $CHK_FILE ; chmod 666 $CHK_FILE

# 電源断フラグ(ファイル)を参照し
# 'OFF'ならばshutdown -h(halt)コマンドを実行。次回起動時のdefaultは'INIT'
# 'REBOOT'ならばshutdown -r(reboot)コマンドを実行。次回起動時のdefaultは'KEEP'
# 'INIT'ならば'OFF'にして次回cron起動時にシャットダウンするよう設定。
# 'KEEP'ならば何もしない。

if [ "OFF" = `cat $CHK_FILE` ] ; then
    echo "SERVER SHUTDOWN!!!" | mail -s "SERVER INFO." s-tomoki@jp-t.ne.jp ◆シャットダウン時にメールで通知◆
    /usr/bin/shutdown -h now

elif [ "REBOOT" = `cat $CHK_FILE` ] ; then
    echo "SERVER REBOOT!" | mail -s "SERVER INFO." s-tomoki@jp-t.ne.jp ◆再起動時にメールで通知◆
    /usr/bin/shutdown -r now

elif [ "INIT" = `cat $CHK_FILE` ] ; then
    echo "OFF" > $CHK_FILE

else
    echo "KEEP" > $CHK_FILE

fi

■Aログイン時に自動電源断を解除するには、/etc/bashrcに以下の一行を追加する。

echo "KEEP" > /home/httpd/html/poff/poff_flag

■Bshutdown時に自動電源断フラグを設定するには、 shutdownスクリプト'/usr/bin/shutdown'に以下の2行を追加する。

$ls -l /usr/bin/shutdown
-rwxr-xr-x    1 root   root  620 Jul  9 14:33 /usr/bin/shutdown
$cat /usr/bin/shutdown
#!/bin/sh
# Try to do the right thing for programs that rely on "/usr/bin/shutdown -r now"
# to shut down the machine.
echo "INIT" > /home/httpd/html/poff/poff_flag ◆この行を追加◆
prog=/sbin/shutdown
now=
for flag in $* ; do
        if test ${flag} = "-h" ; then
                prog=/usr/bin/halt
        elif test ${flag} = "-p" ; then
                prog="/usr/bin/halt -p "
        elif test ${flag} = "-r" ; then
                echo "KEEP" > /home/httpd/html/poff/poff_flag ◆この行を追加◆
                prog=/usr/bin/reboot
        elif test ${flag} = "now" ; then
                now=$flag
        else
                args="$args $flag"
        fi
done
if [ -z "$args" -a "$prog" != /sbin/shutdown ] ; then
        exec $prog $args
else
        exec /sbin/shutdown $args $now
fi

ここまでで、サーバ電源投入した後、一定時間ログインされない場合はシャットダウン。つまり 「起動する意図のない着信でPCが起動した場合」の対処が出来ました。
■Webや携帯電話からの電源管理 さて電源投入が出来たとしても自宅サーバにログインしないことにはまもなくシャットダウンされてしまう。 HTMLファイルのロード(つまりホームページの参照)だけをしたいときや、FTPによるファイル転送のみ をしたいといったときに、telnetやSSHクライアントによるアクセスが出来ない場合は、データ転送中に サーバがシャットダウンしてしまうということになってしまう。 そこで…Webや携帯電話からの電源管理ができないかなぁ。  要求仕様(自分の^^;)としては…  ○携帯電話やIEなどでの電源断フラグの設定値の変更をしたい。  ○電源管理するpageにはアクセス制限がかけられるようにしたい。   ⇒ブラウザ上では手法が確認できてます。携帯からの方法がまだ見つかってません。  ○入力としてはチェックボックスのようなものを表示して、こんな感じにしたいなあ。 --------------------------- <<サーバ電源管理>>   現在の状態:[XXXXX]   □通常運転 □再起動 □シャットダウン     [設定] ---------------------------   CGI? JavaScript? とかってそういうことが出来るものなの?  (調査…数日経過後、実現方法がみつかりましたmOm) ■CGIプログラムによる電源制御フラグの設定。(CGIについては巻末参照) (1)ブラウザから参照・制御出来るようにHTML言語で電源制御ページを作成する。  (2)CGIプログラムを起動し、制御パラメータを渡す。  (3)CGIプログラムは入力されたパラメータによって電源制御処理を実行する。   (パターンA)入力パラメータを電源制御フラグに設定するのみで、 実際の処理(reboot,shutdown)はcronに任せる。   (パターンB)入力されたパラメータによって実際の処理を実行する。        (×) 直接shutdownコマンドはpasswordを聞いてきて実行できなかった。 ■電源制御ページのソースファイル(HTML)

$ls -l /home/httpd/html/poff/index.html
-rw-r--r--  1 suzuki suzuki 442 Jul  5 16:37 /home/httpd/html/poff/index.html
$cat /home/httpd/html/poff/index.html
<HTML>
<HEAD>
<TITLE>すずきさんちのサーバ制御</TITLE>
</HEAD>
<BODY>
<FORM ACTION="/cgi-bin/poff_flagset.cgi" METHOD="POST">
すずきさんちのサーバをどうするね?<BR>
<INPUT TYPE="radio" NAME="CONTROL" VALUE="KEEP">通常運転<BR>
<INPUT TYPE="radio" NAME="CONTROL" VALUE="REBOOT">再起動<BR>
<INPUT TYPE="radio" NAME="CONTROL" VALUE="OFF">とめる<BR>
<INPUT TYPE="SUBMIT" NAME="SUBMIT" VALUE="送信">
<INPUT TYPE="RESET" NAME="RESET" VALUE="クリア">
<br>
</FORM>
</BODY>
</HTML>

■電源制御パラメータ処理プログラム(シェルによるCGI)

$ls -l /home/httpd/cgi-bin/poff_flagset.cgi
-rwxr-xr-x    1 root root  2175 Jul  9 14:55 /home/httpd/cgi-bin/poff_flagset.cgi
$cat /home/httpd/cgi-bin/poff_flagset.cgi
#! /bin/sh

before=`cat /home/httpd/html/poff/poff_flag`

#htmlからのパラメータを受信
read param

# '&'と'='をスペースに置き換え、1番目のパラメータ(name)を取りだしている。
name=`echo "$param" | sed -n '/CONTROL/s/=/ /pg' |
        sed -n '/CONTROL/s/&/ /pg'| awk '{print $1}'`

# '&'と'='をスペースに置き換え、2番目のパラメータ(value)を取りだしている。
value=`echo "$param" | sed -n '/CONTROL/s/=/ /pg' |
        sed -n '/CONTROL/s/&/ /pg'| awk '{print $2}'`

# 残り時間の計算
time=`date | awk '{print $4}' | sed -n '/:/s/:/ /pg' | awk '{print $2}'`
if [ $time -lt 10 ]; then
    r_time=`expr 10 - $time`
elif [ $time -lt 20 ]; then
    r_time=`expr 20 - $time`
elif [ $time -lt 30 ]; then
    r_time=`expr 30 - $time`
elif [ $time -lt 40 ]; then
    r_time=`expr 40 - $time`
elif [ $time -lt 50 ]; then
    r_time=`expr 50 - $time`
else
    r_time=`expr 60 - $time`
fi

if [ $before = "OFF" ] ; then
    bword="$r_time分後にシャットダウン"
elif [ $before = "INIT" ] ; then
    bword="`expr $r_time + 10`分後にシャットダウン"
elif [ $before = "REBOOT" ] ; then
    bword="$r_time分後に再起動"
else
    bword="通常運転"
fi

# WebPage作成スクリプト

echo "Content-type:text/html"
echo ""
echo "<head><title>すずきさんちのサーバ制御</title></head>"
echo "<body>"
echo "サーバ情報<br><br>"
if [ "CONTROL" = "$name" ] ; then
    if [ $before = $value ] ; then
        echo "状況は変わってござらんよ。"
    else
        echo "$value" > /home/httpd/html/poff/poff_flag
        echo "状況が変わったでござる。"
        echo "今までは<font color=blue>$bword</font>するつもりであったが、"
        before=`cat /home/httpd/html/poff/poff_flag`
    fi
fi

# echo "<br>今は`cat /home/httpd/html/poff/poff_flag`だよ<br><br>"
if [ "OFF" = $before ] ; then
    echo "今から<font color=red>$r_time分後にシャットダウン</font>するダニよ<br>"
elif [ "INIT" = $before ] ; then
    echo "今から<font color=red>`expr $r_time + 10`分後にシャットダウン</font>するダニよ<\
br>"
elif [ "REBOOT" = $before ] ; then
    echo "今から<font color=red>$r_time分後に再起動</font>するダニよ<br>"
else
    echo "<font color=blue>通常運転中</font>でござるよ<br>"
fi


echo "<br>`date | awk '{print $2,$3,$4}'`</br>"

echo "</body>"


■あれ?もしかして…。 ○CGIプログラムでHTML言語によってホームページを作っているので  CGIプログラム内に始めに表示しているページも組み込めるのですね。  いま気が付きました…。(^_^;)  ようするに、電源制御ページ(html)自体を、CGIプログラムによって 作成すればいいんですね。

$cat /home/httpd/cgi-bin/server_mng.cgi
#! /bin/sh

(中略)

# WebPage作成スクリプト

echo "Content-type:text/html"
echo ""
echo "<head><title>すずきさんちのサーバ制御</title></head>"
echo "<body>"
echo "すずきさんちのサーバ情報<br>"
if [ "CONTROL" = "$name" ] ; then
    if [ $before = $value ] ; then
        echo "状況は変わってござらんよ。"
    else
        echo "$value" > /home/httpd/html/poff/poff_flag
        echo "状況が変わったでござる。"
        echo "今までは<font color=blue>$bword</font>するつもりであったが、"
        before=`cat /home/httpd/html/poff/poff_flag`
    fi
fi

# echo "<br>今は`cat /home/httpd/html/poff/poff_flag`だよ<br><br>"
if [ "OFF" = $before ] ; then
    echo "今から<font color=red>$r_time分後にシャットダウン</font>するダニよ<br>"
elif [ "INIT" = $before ] ; then
    echo "今から<font color=red>`expr $r_time + 10`分後にシャットダウン</font>するダニよ<\
br>"
elif [ "REBOOT" = $before ] ; then
    echo "今から<font color=red>$r_time分後に再起動</font>するダニよ<br>"
else
    echo "<font color=blue>通常運転中</font>でござるよ<br>"
fi

echo "`date | awk '{print $2,$3,$4}'`<br><br>"
◆----電源制御ページを作成するスクリプトを記述する-----◆
echo "<FORM ACTION="/cgi-bin/server_mng.cgi" METHOD="POST">"
echo "どうするね?<BR>"
echo "<INPUT TYPE="radio" NAME="CONTROL" VALUE="KEEP">通常運転<BR>"
echo "<INPUT TYPE="radio" NAME="CONTROL" VALUE="REBOOT">再起動<BR>"
echo "<INPUT TYPE="radio" NAME="CONTROL" VALUE="OFF">シャットダウン<BR>"
echo "<INPUT TYPE="SUBMIT" NAME="SUBMIT" VALUE="送信">"
echo "<INPUT TYPE="RESET" NAME="RESET" VALUE="クリア">"
echo "</FORM>"
◆--------ここまで--------◆
echo "</body>"



■IPアドレスが変わったら?(メールで通知) 自宅サーバのIPアドレスは、サーバ起動時にDHCPによってプロバイダから取得しているため 固定IPアドレスではありません。そこでサーバ起動時にはDHCPによって取得したIPアドレスを メールで通知するようにすれば、いくらIPアドレスが変わっても全然大丈夫っ!! 以下のコマンド行をどこかに書けば…というわけでとりあえず ⇒/etc/rc.d/init.d/httpdスクリプトのstart()関数の中に記述しました。

$cat /etc/rc.d/init.d/httpd
(中略)
start() {
        echo -n $"Starting $prog: "
        daemon $httpd `moduleargs` $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch /var/lock/subsys/httpd
# httpd start message send to Administrator.2002/7/9 tomoki  ◆追加◆
        echo "WEBサーバが起動したよぉ〜ん。`/bin/date | awk '{print $2,$3,$4}'` http://`/\
sbin/ifconfig eth1 | sed -n '/inet/p' | cut -f2 -d: | cut -f1 -d" "`/cgi-bin/server_mng.c\
gi" | nkf -s | mail s-tomoki@jp-t.ne.jp
        return $RETVAL
}
(中略)

■IPアドレスが変わったら?(ジャンプページ) 更にというかついでにというか…上記のIPアドレスを契約プロバイダ等の不変かつ常時 アクセス可能なWebページからリンクできるようにしておけばDDNSサービスを利用しなく てもIPアドレスを気にせずに自宅サーバにアクセスできるようになりますね! ということで、IPアドレス自動通知シェルスクリプトを書いて、さっきと同じところに 追記します。

$cat /etc/rc.d/init.d/httpd
(中略)
start() {
        echo -n $"Starting $prog: "
        daemon $httpd `moduleargs` $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch /var/lock/subsys/httpd

# IP-address sending SCRIPT.         ◆追加◆
        /home/httpd/html/poff/send_ip_adr.sh

# httpd start message send to Administrator.2002/7/9 tomoki
        echo "WEBサーバが起動したよぉ〜ん。`/bin/date | awk '{print $2,$3,$4}'` http://`/\
sbin/ifconfig eth1 | sed -n '/inet/p' | cut -f2 -d: | cut -f1 -d" "`/cgi-bin/server_mng.c\
gi" | nkf -s | mail s-tomoki@jp-t.ne.jp

        return $RETVAL
}
(中略)

◆IPアドレス自動通知シェルスクリプト

$cat /home/httpd/html/poff/send_ip_adr.sh
#!/bin/sh

INTERFACE=eth1                              # target IP-address interface
UPFILE="/home/httpd/html/poff/jump.html"    # update HTML file name
ADDRDAT="/home/httpd/html/poff/addr.dat"    # IP-address stored file name

#Research IP-address by "ifconfig" command.
IPADDR=`/sbin/ifconfig $INTERFACE | sed -n 2p | cut -f2 -d: | cut -f1 -d" "`

#if IP-address stored file not exist, make that file and into "none" charactor.
[ -f $ADDRDAT ] || echo "none" > $ADDRDAT

#Compare old IP-addres and new IP-address.
#if IP-address is not change then this script is exit.
[ $IPADDR = `cat $ADDRDAT` ] && exit 0

#echo "IP-address is changing."

#make HTML file
echo "<HTML>" > $UPFILE
echo "<TITLE>すずきさんちのサーバへ</TITLE>" >> $UPFILE
echo "<A HREF=\"http://$IPADDR/suzuki\">すずきさんちサーバ</A><BR><BR>" >> $UPFILE
echo "</HTML>" >> $UPFILE

#HTML file update by ftp
ftp -n www.ann.hi-ho.ne.jp << EOF_FTP
user myname hogehoge
cd html/jump
ascii
prompt
put $UPFILE index.html
quit
EOF_FTP

echo $IPADDR > $ADDRDAT



■このままでは危ない! ○ここまで作成して、お気づきかもしれませんが、この状態だと電源断ページに アクセスできる誰もが、サーバの電源断、再起動を出来てしまいます。 それはあまりに危険すぎるのでセキュリティUPのためにパスワードを設定しましょう。 ここではテキスト入力をさせて、それを設定してある文と比較するだけのものです。

# WebPage作成スクリプト
(中略)
echo "Content-type:text/html"
(中略)◆--パスワード解析処理--◆
        if [ $authorize_value = "password" ] ; then
            echo "認証成功!<br>"
        else
            echo "合い言葉が違うでござる。状況は変わらんでござる。"
        fi
(中略)◆--パスワード入力画面の作成--◆
echo "<FORM ACTION="/cgi-bin/server_mng.cgi" METHOD="POST">"
echo "合い言葉は?<BR>"
echo "<INPUT TYPE="PASSWORD" SIZE="12" NAME="AUTHORIZE" VALUE=""><BR>"
echo "</FORM>"
(中略)


■もうちょっとCGIプログラムをきれいにします。 (※)パラメータがこれ以上増えるならPerlかCで書いたほうがいいかな。(ボソボソ)

$cat /home/httpd/cgi-bin/server_mng.cgi
#! /bin/sh

CHK_DIR="/home/httpd/html/poff"
CHK_FILE="$CHK_DIR/poff_flag"

before=`cat $CHK_FILE`

# 
からのパラメータを受信 read param # '&'と'='をスペースに置き換えてwordの配列をつくている。(nameの次がvalue) param1=`echo "$param" | sed -n 's/=/ /pg' | sed -n 's/&/ /pg'` #valueの抽出 count=1 for name in $param1; do count=`expr $count + 1` if [ "CONTROL" = "$name" ] ; then control_name=$name control_value=`echo "$param1" | awk '{print $'$count'}'` fi if [ "AUTHORIZE" = "$name" ] ; then authorize_value=`echo "$param1" | awk '{print $'$count'}'` fi done # cron起動までの残り時間の計算 #time=`date | awk '{print $4}' | sed -n '/:/s/:/ /pg' | awk '{print $2}'` time=`date +%M` if [ $time -lt 10 ]; then r_time=`expr 10 - $time` elif [ $time -lt 20 ]; then r_time=`expr 20 - $time` elif [ $time -lt 30 ]; then r_time=`expr 30 - $time` elif [ $time -lt 40 ]; then r_time=`expr 40 - $time` elif [ $time -lt 50 ]; then r_time=`expr 50 - $time` else r_time=`expr 60 - $time` fi r_time=`$r_time - 1` if [ $before = "OFF" ] ; then bword="$r_time分後にシャットダウン" elif [ $before = "INIT" ] ; then bword="`expr $r_time + 10`分後にシャットダウン" elif [ $before = "REBOOT" ] ; then bword="$r_time分後に再起動" else bword="通常運転" fi # # WebPage作成スクリプト # echo "Content-type:text/html" echo "" echo "<head><title>すずきさんちのサーバ制御</title></head>" echo "<body>" echo "すずきさんちのサーバ情報<br>" if [ "CONTROL" = "$control_name" ] ; then if [ $before = $control_value ] ; then echo "状況は変わってござらんよ。" else if [ $authorize_value = "*******" ] ; then # echo "認証成功!<br>" echo "$control_value" > $CHK_FILE echo "状況が変わったでござる。" echo "今までは<font color=blue>$bword</font>するつもりであったが、" before=`cat $CHK_FILE` else echo "合い言葉が違うでござる。状況は変わらんでござる。" fi fi fi # echo "<br>今は`cat $CHK_FILE`だよ<br><br>" if [ "OFF" = $before ] ; then echo "今から<font color=red>$r_time分後にシャットダウン</font>するダニよ<br>" elif [ "INIT" = $before ] ; then echo "今から<font color=red>`expr $r_time + 10`分後にシャットダウン</font>するダニよ<\ br>" elif [ "REBOOT" = $before ] ; then echo "今から<font color=red>$r_time分後に再起動</font>するダニよ<br>" else echo "<font color=blue>通常運転中</font>でござるよ<br>" fi echo "`date | awk '{print $2,$3,$4}'`<br><br>" echo "<FORM ACTION="/cgi-bin/server_mng.cgi" METHOD="POST">" echo "どうするね?<BR>" echo "<INPUT TYPE="radio" NAME="CONTROL" VALUE="KEEP">通常運転<BR>" echo "<INPUT TYPE="radio" NAME="CONTROL" VALUE="REBOOT">再起動<BR>" echo "<INPUT TYPE="radio" NAME="CONTROL" VALUE="OFF">シャットダウン<BR>" echo "合い言葉は?<BR>" echo "<INPUT TYPE="PASSWORD" SIZE="12" NAME="AUTHORIZE" VALUE=""><BR>" echo "<INPUT TYPE="SUBMIT" NAME="SUBMIT" VALUE="送信">" echo "<INPUT TYPE="RESET" NAME="RESET" VALUE="クリア">" echo "</FORM>" echo "</body>"


■肝心の電源起動装置(!?)の製作準備 ワンダーキット社製のBELL-22というものを使用します。 動作概要としては、RJ11から入ってくるRINGING信号によってフォトカプラを起動し、 それをトリガにインバータ回路をドライブしLow→Hiの状態をつくってリレーを動作 させるというものです。インバータ回路の部分でRINGING信号に応じてON/OFF、 着信中はON、着信後もONの3つの動作モードが設定できるというものです。 キットなのでちょいちょいとハンダ付けして組みあがります。電源回路は 安定化されていないので3端子ボルテージレギュレータで安定化します。 7805シリーズでいいやと思ったのですが、いかんせん常時通電させるシステム(!?) です。出来るだけ待機消費電力は抑えたい… このキットの消費電力は待機時で1μA、動作時で70mAとあります。レギュレータは定格の 40%までならヒートシンク(放熱板)はなくてもよさそうな記事があったので、せっかくの 電力を熱にしちゃもったいないので定格の40%以下に収まるものを選びます。 7805でも1A用、500mA用、300mA用、100mA用とあるようですが、70mA÷40%=170mA以上 ま、適当に買ったのが1A用だったので十分でしょう…と思いきや落とし穴が… この78XXシリーズって結構入力電圧が高くないといけないみたいなんです。 5V取り出すのにレギュレータ自身が動作するのと抵抗やら、リップル平滑(※)のため に2〜3V以上必要らしい。6V300mA程度のDCアダプタでは安定動作しなさそう。 9V600mAのDCアダプタが手元?足元?にすっころがっているんでこれで十分なんですが、 なーんか納得いかないなあー。 調べてみると、低ドロップ・レギュレータなるものがあって(けっこう常識なのか?) 0.5V程度の差でOKなる製品が出ているようですね。これだと余計な発熱もしなさそうだし 良さそうですぞ。私のJUNK箱にないのが残念…とりあえず3端子レギュレータと外見も 同じようなので、とりあえずは7805ちゃんで安定化回路作っときますか。 (※)リップル平滑:交流の波形分を平らな直流に均(ナラ)すこと ○サーバが起動していることを検出する。 AT互換機の電源プラグは4つの端子のコネクタです。この電源によってサーバの起動を検出します。 規格では5V/GND/GND/12Vのようですが一応テスタで見てみるとドンピシャ合ってました。 ■まだ作ってもいないけど今後の改良点… ○ワンギリはお嫌い?  サーバ起動のために着信させてすぐ切る、つまり「ワンギリ」するわけですが、  これが自宅に家族がいる場合や、留守電が即起動する場合には、ちょいとうっとうしい。  なんとかサーバが起動するまでは電話がならないようにできないものか…  いや起動は一瞬だから、着信ベル1回分待ち合わせが出来ないか…  せっかく着信センサーは、RINGING毎にON/OFFが出来るのだから、  これをカウントできるようなことが出来ればいいはずである。  これは調査と実験が必要。。 ○やっぱり最終兵器は必要か…強制電源断の方法  カーネルパニックになった場合には再起動(REBOOT)する方法とか、  WatchDogTimeeなどを用意するという方法も紹介されている。が、  サーバは通常に運転しているようにみえてネットワーク関連だけの  障害が発生した場合は、どうしたもんかね。まさにネットワークを  介しての遠隔操作ができない状態で、サーバ自身が再起動するトリガもないのだ。  @周期的にpingよるヘルスチェックを行い、タイムアウト発生で再起動させる。  A電話による強制電源断  まあ、いろいろな対策があるとは思うのだが、結局は最終兵器が必要ではないかと  思うのだ。
■電源起動装置の動作確認と改造  着信センサキットを組み上げて動作確認すると…うお?動かんぞ?! フォトカプラの受け側(電話線側でない方)をショートさせて擬似着信させども LEDは点灯せずリレーも動かず…当然電話線に直接つないでも動くわけもなく… しぶしぶテスタでインバータの入出力電圧を測っていく。 まずRINGING信号検出直後のフォトカプラの出力。着信なしでHi=正常。着信ありでLow=正常。 続くインバータの第1段直後。着信なしでLow=正常。着信ありでHi=正常。 続く第2段直後。着信なしでLow=正常。着信ありでもLow=異常!と思ったらカチッと 音がしてLED点灯、リレーが動作した。んん?何じゃこれは?擬似着信をずーっと続けていると リレーが動作するようだ。一応動いているみたいだなあと思って電話線につなぐが相変わらず 動作せず。(泣) 種明かしをすれば単純なことなんだけど。 実は第二段のインバータ回路部分は着信ではない瞬間的なノイズなどによる誤動作防止のため、 ある一定時間(1秒くらい)着信があるまで待ち合わせる回路のよう。 ここに使われているコンデンサの値を他の個所のものと間違えて取り付けたため、 待ち時間が長くなりすぎ(5秒くらい)ていたようなのだ。 着信信号(RINGING)は4秒鳴って1秒やむという繰り返しなので、5秒も待ってしまうと 着信信号が鳴っていることを検出できなかったというわけだ。 「怪我の功名」 ここでハタとひらめいた。 このインバータ回路を使えば、逆に好みの遅延回路ができるではないか! 前述していたが、サーバ起動のために「ワンギリ」するのでこの着信音がうっとしいが ある一定時間遅延させてから鳴るようにすればワンギリは気にならなくなる。 逆にあまりに遅延させると電話をかけた相手にとってはなかなか電話に出ないように 思われるという問題はあるが。 いままでの仕様(?!)では1回路2接点のリレーを2個使っての電源投入制御をしようとしていたが 遅延回路を使ってのワンギリ対応機能の実現を考えてみた。 お断り:あくまで流用パーツ&流用知識で実現どぇす。(笑)  ⇒こんな風にしてみる。2回路2接点2つと1回路2接点1つを使った方式。   @着信起動リレー:着信を契機に開閉。 回路@:電話線用。リレーBと直列接続し電話線の接続/切断を制御する。 回路A:サーバ電源制御用。着信時にサーバ電源制御線をショートする。(元々の仕様)   Aサーバ電源連動リレー:サーバ電源と連動し開閉。(サーバ電源断中で開放/サーバ起動で閉)。 回路@:電話線用。サーバ起動時にリレー@回路@とリレーBをバイパスし、サーバ起動中に 着信があった場合の「ワン切り対応機能」を無効化する。 回路A:サーバ電源制御用。リレー@の回路Aと直列接続し、サーバ起動中に着信が あった場合のサーバ電源制御動作をスキップさせる。(元の仕様部分)   B着信遅延起動リレー:着信後遅延してから開閉。(待機中開放/着信で閉)。 回路@のみ:電話線用。リレー@の回路@と直列接続し電話線の接続/切断を制御する。 基本的なサーバ起動Lineはそのままに、電話Lineを着信したら切断し、タイミングをとって再接続する。   着信起動リレーの回路@と着信遅延起動リレーのNO同士、NC同士を結線し共にリレー起動時にショートし   どちらかのリレーが動作していないとき切れている状態を作り出しているのがミソ。リレーでEOR回路を   形成しているのどぇす。 さて完成前から改造開始です。そんなんで動くんかいな(笑)。タイミング取得のための インバータ回路は別IC&別基盤で組むとケースに収まらない&めんどくさい。 元々のキットのインバータIC4582(?だっけ)には6つのインバータが入っていて、 そのうちの2つでラッチ回路(一旦検出した状態を保持しつづける)を形成している。 今回の仕様ではサーバの電源起動は一瞬でありラッチ回路は必要ない。したがってその 2つのインバータ部分を流用しよう。 (追加する回路図) 何の創作もありゃしない。もとの回路の入力2段目とリレーのドライブ部分をくっつけただけ。 これをHi-Lowの状態を考慮して期待する状態となる個所に接続する。多分、LEDの4.7kΩの前あたりかな。 実験でここで動作するのか試してみることに・・・。 更に… 着信があった場合に電話機より早く検出しリレーを動作させなければ意味がない。 元々の待ち合わせ時間が1秒くらいだったのをコンデンサ容量を減らし0.5秒くらいにした。 ワンギリのみで電話のベルを鳴らさないようなタイミング、これが難しい。コンデンサの容量の 計算式もあるのだろうが、得意の実験君でだいたい4秒くらいになるようにしてみました。 さてサーバSWラインはまだつないでないけど、電話線につないでアダプタをコンセントに差しこむ。 携帯電話で自宅に電話をかける…すると着信してLED点灯、呼出し音はならず。数秒して追加した回路の LED点灯、その後に呼出し音が鳴り出したときは思わずガッツポーズっ!! うへへへっ。ばっちりじゃん。電話機の受話器を上げて耳にすると…うわっなんじゃこりゃ、すんげぇ ノイズが乗っている…。一応通話、呼出しは出来るものの、この装置を追加したことによって ノイズが入るのが気に入らない。ツイストペアの片方だけを引き回した所為なのか、フェライトコア 入れないと駄目なのかな。ユニバーサルでなくちゃんとパターンを起こした基板でないとだめなのかな。 シールドすればいいのかな。うーん、うーん、いろいろ考えたりツイストペアの文献を当たってみたけど イマイチ改造の改造ってやりたくないんだよなぁ。しぶしぶツイストペアなんだからより線加工してみよう かと基板をながめてました。と、RJ-11のピンがショートしていることに気づいた。4芯のうち使用しているのは 2芯なので、この2芯がショートしていたら電話もかからないのでそこは大丈夫らしいが、未使用線に ショートしているからノイズがのるの?疑問に思いながらショートをはずすと見事にノイズ解消っ! 今後気をつけましょうね。>自分 さてあとはケースを加工して、レギュレータの放熱対策もしてコネクタを取り付けて完成です。
■運用してみて…改造パート2 (夏休みの宿題?!) ○使い勝手向上策/着信のたんびにサーバ起動もうっとうしい… 『一定時間内にワンギリ2回で起動』に出来ないかな。 さて、一旦完成を見た自動電源投入器だが、実際に運用してみると、自分ちの電話が鳴るたび サーバが起動するわけで、そんなに頻繁にないと踏んでそういう仕様にしたわけなんですが… 意外とかかってくるもんだな。友人、知人の類はそうでないにしても新聞やら不動産やら 勧誘、セールスの電話で自宅サーバが起動されるというのはへぼすぎる仕様だな。 当初、電話でサーバ起動の発端となった記事では、ISDN回線でTAにそれなりの機能があったらしく 着信+内線指定ということが出来たので、サーバ起動用の回線があるような背景だったらしい。 あいにくIDSNからADSLに乗り換えたことによって、自宅サーバを立ち上げた私にとっては皮肉な話である。 で、ともかくこのままでもいいんだけど、着信のたんびにサーバ起動もうっとうしいってんで、 少し頻度を落とす…たとえば『一定時間内にワンギリ2回で起動』とか、と考えたわけです。 「一定時間」を作り出すのにすぐに思いつくのは555というICを使ったタイマです。 でも買ってくるのがめんどくさい。WEBを探してたらトランジスタタイマ なるものが紹介されていたのでこれを流用することにしようっと。 さて、あとはどうやって1回目の着信を無視させるかだな… 購入の手間があるので手元にあるパーツ(トランジスタ、リレー)で実現する方法をいろいろ考えたんだが どうもみてもカウンタICを使った方が簡単そう。いろいろ調べてた過程で部品の通販のWebサイトを見つけ た。  電子部品のネットショップ 「部品屋ドットコム」 秋葉原いくのがうっとうしいからといって佐賀県にあるショップから送ってもらうのも 何なんだが、それでも電車賃より送料・代引き手数料の方が安いので利用することに。 ■改造パート2 「設計・検討」 その1  H→Lをカウントし4bit2進数で出力する10進数カウンタIC(74LS90)と、2進数入力を値に対応するpinに H→L出力するIC(74LS138/74LS139)を使ったシグナルシュミレータの回路図を見つけたのでこれを参考に カウンタ部を作ろうと思って部品を発注したが、データシートを良く見ると、カウンタ出力がLowLevelになるので、 これではリレーを駆動するためにはインバータ(H⇔L反転)回路が必要になる。しかたない。この案はボツとなる… その2  デジタルICについてもうちょっと調べると、もっと便利なICが世の中にはいっぱい出回っていることに気づく。 H→LもしくはL→Hをカウントし、カウントした値に対応するpinにL→H出力するデコードIC(4017)というものが ある。これでいいじゃん。再度部品注文することに。1個150円くらいのIC入手にだいぶ手間取った気がする。 秋葉原に歩いていけるところに住みたいなあとふと頭をよぎるが、実際そんなところに住んだら半田こて握る 部屋なぞ持てないだろうな。ま、脱線、脱線。  で、追加追加でリレーばかり増えてしまい、このままでは5つ目である。 カウンタを追加した場合のリレー制御 あまり賢いシステムではないので、 ちょっと考える。アナログスイッチ(4016)なる1回路2接点のリレーを4つ組み込んだようなICもあるらしい。 導通時の抵抗が300Ωというのが気になるが…。基本的に電話線とサーバ電源SWラインは半導体を通したくないなあという コンセプトで作ってきたので、最低2つはリレーが必要。ワンギリ対応回路については2つリレーを使っている ところをExcrusiveORゲート(4070)を使って1つにし、そのほか2回路2接点のリレーが必要な個所はそのままとする ことに。結局は…5個が4個になっただけだが…。   主な改造は3点。   ・カウンタICを導入し設定した回数の着信によってサーバ電源を投入する。   ・着信回数をカウントする期間に制限を設けるため、タイマを使う。   ・リレーで形成しているEOR回路を廃し、着信信号と着信遅延信号のEORでワン切り対処回路を形成する。 ■改造パート2 「実験・組立」 ・タイマ回路:2SAタイプの足の順(E.B.C.)をすっかり忘れていたのと、回路図の抵抗値がなかったので適当に 近似値にした点を除けば問題なく動作した。VCC=5V、電解コンデンサー10μFで約1分でタイマ満了。おしっ。 ・カウンタ回路:4017は15pin:(H)reset/(L)count、14pin:(L→H)/(L)、13pin:(H)/(H→L)、4pin:カウント値2でL→H、 7pin:カウント値3でL→H、16pin:VCC、8pin:GNDと紹介されていた。 reset状態にするのに15pinをHIレベル、H→L検出するのに13pinをHiレベルにするのだが、VCCから直接つないだ のでは過電流が流れIC破壊のおそれがある。BELL-22の回路を見るとLow入力待ちの個所でVCCから470KΩの抵抗を つないでHiレベルに釣っているようなので同様に470KΩでVCCから15pinに接続。このいい加減さが命取り。 いざカウンタ14pinにトリガ(L→H)入力してもカウントアップされない。リセットの15pinにテスタをあてると 0.25V(!?)。これではリセットがかからない…13pinもHiレベルとは言えない0.25V。これでは動作しないはずだ。 470KΩで0.25VだからVCC=5VとしてIC入力をMAX0.8mAくらいとして計算すると…過電流防止には数KΩ程度で十分。 470KΩでは全然でかい。だいたい10KΩ程度が妥当なとこのようだ。でこれを直して再度動作確認するが、やはり カウントアップせず。ガックシ…;_;テスタで15pinを触りまくってIC壊したか?! MOS-ICってモロいのかな。 なんて落ち込む。接続を確かめ、4017のデータシートをWebで漁る。すると14pin:(L→H)/(H)、13pin:(L)/(H→L)、 なっているではないか。まあ正規の文献でない記事を確認せず鵜呑みにする私が悪いのだが、インターネットでの 情報には誤りが多いものなので何が正しいかはわからない。試しにその接続に直すと正常にカウントアップする ことが確認できた。 ・ExclusiveORゲート:あっさり動作OK。出力をトランジスタ(2SC1815)接続しリレーをドライブすることも確認。 ■改造パート2 「配線」 リレー回路図 これが面倒というか、ややこしい。人が見てわかるだろうか?!いや、自分自身あとでみて思い出せるかな。  ⇒2回路2接点3つと1回路2接点1つを使った方式。   @着信起動リレー:着信を契機に開閉。 回路@:電話線の接続/切断用でワンギリ対応用。トリガは着信と着信遅延のExclusiveOR。 回路A:タイマスタート用。着信時にタイマースタート線をショートする。(改造1から改造)   Aサーバ電源連動リレー:サーバ電源と連動し開閉。(サーバ電源断中で開放/サーバ起動で閉)。 回路@:電話線用。サーバ起動時にリレー@回路@をバイパスし、サーバ起動中に 着信があった場合の「ワン切り対応機能」を無効化する。 回路A:サーバ電源制御用。リレーBの回路@と直列接続し、サーバ起動中にカウンタ出力起動が あった場合のサーバ電源制御動作をスキップさせる。  (旧B着信遅延起動リレー:リレー@に統合。削除)   Bカウンタ出力起動リレー:タイマ動作中の着信回数をカウントし設定回数で開閉。 回路@のみ:サーバ電源制御用。リレーAの回路Aと直列接続しタイマ動作中の着信回数に             よってサーバ電源制御線をショートする。(改造1の改造)   Cタイマ起動中リレー:タイマ動作中に閉じる。(改造2で新規) 回路@:リレー@回路Aに直列に接続され、タイマースタート中の再スタート防止する。 回路A:カウンタリセット解除。タイマスタート時にカウンタ(4017)のリセットを解除し、       カウントアップ動作を開始させる。タイマ満了時には再びカウンタをリセットする。   えーっと、つまりですね。 (1)着信を検出するとまずタイマを起動(@A)。電話Lineは一旦切りタイミングをとって再接続(@@)。 (2)タイマ動作中はタイマ再スタートを抑止し(C@)、カウンタICのリセットを解除し(CA)着信回数をカウント開始。 (3)タイマ満了前に、指定回数の着信を検出するとサーバ電源投入(B)。 (3a)着信なくタイマ満了した場合は待機状態に戻り(C@)カウンタICをリセット状態に(CA)。 (4)サーバ電源が投入されるとワンギリ対応を抑止し(A@)、サーバ電源の再制御を抑止する(AA)。 (option)タイマ満了前にサーバ電源投入以外の指定着信回数があった場合の処理はオプション追加可能。 ■改造パート2 「動作確認」 携帯電話で自宅に電話をかける…すると着信してLED点灯、呼出し音はならず。数秒してLED消灯。 そのまた数秒後に一瞬LEDか点灯してまた消灯。んんんっ!?ちょっとびっくり。 タイマ動作中かはLEDなどがないので不明。1分以内に再度電話をかける…するとまた着信によって LED点灯、数秒してLED消灯。と同時にタイマ出力LED点灯っ!当たり前なので心の中だけでガッツポーズ。 無事サーバの電源が投入されました。ついでにもう一回電話をかけると、着信LED点灯、数秒してLED消灯。 と同時にタイマ出力LED消灯。これは3回目の着信をカウントしたので2回目であるLED点灯が取り消された わけで正常ですね。カウンタが10回で一回りするので一分以内に12回着信が発生すると再びサーバ電源 ラインがONになりますが、(現実的に起こるとは考えにくいけど…)、サーバ起動中は電源ラインを切っている のでこれは回避されます。 んーっとだいたいOKなんですが、着信起動リレーと着信遅延起動のExclusiveOR出力のLEDのつき方が 若干気になりますねぇ。待機(EOR0/0)=LED:OFF、着信(EOR1/0)=LED:ON、遅延起動(EOR1/1)=LED:OFF、 着信停止(EOR0/0)=LED:OFF…待機状態。となるんですが、着信停止に行く際に着信回路と着信遅延回路の 戻り(H→L)にタイムラグがあるようで、一瞬(EOR0/1)=LED:ONの状態が出来るのです。電話回線が切れるほど の時間差があるわけではないのですが、ちょっと気持ち悪いかなあって程度です。解決策としては 着信信号と着信遅延信号のEORによるリレー制御ではなく、着信によって更にワンギリ対処用のタイマを 起動してやって、タイマ満了で待機状態に戻るという方法がシンプルだと思います。
■バグ対処 shutdownされると電源制御フラグがINITに設定されるが、Webサーバが停止するまでに数十秒のタイムラグ があり、この間にcgiプログラムが起動されると異常値が表示されてしまう。 「0分後にシャットダウン」⇒「19分後にシャットダウン」と表示されるが、実際にはすでに シャットダウンが実行されている。 この対処として以下を盛り込んだ。 ・shutdownスクリプトで「シャットダウン表示」(shutdown_flag)設定をする。 ・「シャットダウン表示」フラグの所在は/home/httpd/html/poff/shutdown_flag。 ・「シャットダウン表示」のリセットは/etc/rc.d/init.d/httpdの関数start()内で実施。  既にWebサーバ起動メール通知、自動IPアドレス通知、と同様の個所。 ・cgiプログラムで「シャットダウン表示」が設定されていれば「シャットダウン中」表示をするよう変更。

$cat /home/httpd/cgi-bin/server_mng.cgi

(省略)
# WebPage作成スクリプト
#
echo "Content-type:text/html"
echo ""
echo "<head><title>すずきさんちのサーバ制御</title></head>"
echo "<body>"
echo "すずきさんちのサーバ情報<br>"

if [ "GO" = `cat $SHUTDOWN_FLAG` ] ; then             ◆バグ対処 start◆
    echo "<br><font color=red>シャットダウン中</font>でござるぅ〜<br>"
    echo "</body>" 
    exit 0 
fi                                                    ◆バグ対処 finish◆

if [ "CONTROL" = "$control_name" ] ; then
    if [ $before = $control_value ] ; then
        echo "状況は変わってござらんよ。"
    else
(省略)



$cat /etc/rc.d/init.d/httpd

(省略)
start() {
        echo -n $"Starting $prog: "
        daemon $httpd `moduleargs` $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch /var/lock/subsys/httpd

# IP-address sending SCRIPT.
        /home/httpd/html/poff/send_ip_adr.sh
# shutdown indicator reset 2002/8/5
        echo "STOP" > /home/httpd/html/poff/shutdown_flag  ◆バグ対処◆
# httpd start message send to Administrator.2002/7/9 tomoki
        echo "WEBサーバが起動したよぉ〜ん。`/bin/date | awk '{print $2,$3,$4}'` http://`/\
sbin/ifconfig eth1 | sed -n '/inet/p' | cut -f2 -d: | cut -f1 -d" "`/cgi-bin/server_mng.c\
gi" | nkf -s | mail s-tomoki@jp-t.ne.jp

        return $RETVAL
}
(省略)

$cat /usr/bin/shutdown

#!/bin/sh
# Try to do the right thing for programs that rely on "/usr/bin/shutdown -r now"
# to shut down the machine.
echo "INIT" > /home/httpd/html/poff/poff_flag
echo "GO" > /home/httpd/html/poff/shutdown_flag   ◆バグ対処◆
prog=/sbin/shutdown
(省略)

■残された課題… ●shutdownすると電源制御フラグは/usr/bin/shutdownにおいて初期値(INIT)に設定されるはずなのだが、 rootでログインしたような場合にshutdownコマンドを実行すると/sbin/shutdownが直接実行されてしまい 電源制御フラグが初期値に戻らなくなるバグあり。 rootのPATHを/usr/bin:/sbinという順に直す方法がちょっとわからないので保留。 とりあえずtelnetやSSHでのログインはrootでは出来ないようにしておくかな。 ●現状ブラウザからCGIプログラムによってを電源制御フラグを設定し実際の処理(reboot,shutdown)は cronに任せる方式だが、直接shutdownもしくはrebootを実行できる方式があれば、10分毎にcron起動する 必要がなくなる。 起動直後に"at"コマンドにより10分後に"shutdown"する実験 at now + 10minutes -f /etc/cron.poff_chk  これにより10分後に/home/httpd/html/poff/poff_flagがOFF(起動時デフォルト)で  あれば電源断できることは動作確認できた。  さらにCGIプログラムからshutdownが起動できればいいんだが…現状できていません。 以上

参考ページ

電話でLinuxを立ち上げる!(⇒話の発端となったページです)  
http://www.ei.fukui-nct.ac.jp/~t-saitoh/hobby/dial-on/ RemoteControl/WatchDogTimer  http://hoop.euqset.org/linux/LJ/vol5.ala/index.html CGIってなあに?  CGI にチャレンジしよう!http://www-jkn.ee.uec.ac.jp/root/ncsa_httpd/cgi.html  CGIの作成        http://www5a.biglobe.ne.jp/~n_rieko/cgi/creation.htm  CGIスクリプトをシェルスクリプトで書いてみる http://www16.xdsl.ne.jp/~mogushi/linux_misc/cgi.html シェルスクリプトってどう書けばいいの?  Bourne-Shell(その1) http://www.mahoroba.ne.jp/~makkie7/CGI/cgi_004.html  Bourne-Shell(その2) http://www.mahoroba.ne.jp/~makkie7/CGI/cgi_005.html サーバ電源起動装置  各種制御・センサキット発売元「ワンダーキット」http://www.kyohritsu.com/WONDERKIT/  三端子レギュレータ http://isweb8.infoseek.co.jp/school/speana_1/buhin/regulator/regulator.htm 装置を改造するにあたっての電子部品情報  部品編3 http://www2c.airnet.ne.jp/phy/ele/03.html  部品編4 http://www2c.airnet.ne.jp/phy/ele/04.html  部品編5 http://www2c.airnet.ne.jp/phy/ele/05.html  CMOS一覧 http://www2c.airnet.ne.jp/phy/ele/91.html  集積回路 http://www.hobby-elec.org/ic.htm