« 2007年06月 | メイン | 2007年11月 »

2007年09月01日

Wake On LanをWebブラウザで行う

先のエントリーでWOL(Wake On Lan)に成功したことを記したが、それをより効果的に利用出来るように考えて成功したので備忘録しておく。

要するに常時起動のVine Linuxマシンから、TVサーバのマシンの電源ONの制御をしようって考えだ。それをWebブラウザを使ってやりたいと言う話。

もちろんこの方法なら、ルーター越しのWOLも可能だということだ。職場などの出先のPCからはもちろん、最近の携帯電話ならブラウザが付いているのでそれも可能だと思う。技術的には大した事無いが一つの方法として参考になれば幸いである。

問題は私がPerlを全く理解していない事である。よってCGIもシェルスクリプトで書かざるを得ない。でも本当にそれって可能なのだか?調べてみたら同じことをやっている方のブログで「ルーターの外からwol」を発見したので、シェルスクリプトでCGIを書くのも可能なんだなと裏づけが取れたので実践することにした。

しかし、シェルスクリプトでCGIを書くのって本当は良くない方法らしいから、せめてベーシック認証をかけたディレクトリに設置することにした。ついでにhtmlファイルを置いてちょっとだけ見栄えもよくしてみる。実行ボタンをクリックするだけなんだが。

注意:下記にURLが出てきますが架空のものです。ハックしようとかしないでね。そもそも存在しないURLを例にしていますから、認証を破ってやろうなんて事は無駄です。

 

まず、wolコマンドを実行するシェルスクリプトを書いてしまおう。
難しいのは嫌なので極めてシンプルに書いてしまう。

$ which sh
/bin/sh

$ cd
$ vi wol.sh 

wol.sh という名前で保存するとする
-----------------------------------------------
#!/bin/sh
wol 192.168.1.255 xx:xx:xx:xx:xx:xx
-----------------------------------------------

本当にwolが動くか確認しておこう

$ chmod 705 wol.sh
$ ./wol.sh

リモートで起動することに成功したら次のステップに進もう

既に公開しているWebサーバにスクリプトと、簡単なhtmlのページを作る。
ちなみに私はpublic_htmlディレクトリをベーシック認証して設置することにした。
(ベーシック認証についてはどこかに記した記憶があるので、ここでは書きません)

$ cd public_html/
$ vi wol.cgi

wol.cgi という名前で保存する(Perlではなくshで書いてる)
-------------------------------------------------
#!/bin/sh
echo Content-type: text/html
echo
echo "<title>sending wol</title>"
echo "<p>"
echo "sending wol to fluorite"
echo "..."
sh /home/wol/wol.sh
echo "..."
echo "</p>"
echo "<p>"
echo "done."
echo "</p>"
-------------------------------------------------

$ chmod 705 wol.cgi 

Webブラウザ用にHTMLのページを作っておくとちょと自己満足に浸れそう(w

$ vi wol.html

wol.html という名前で保存する
-------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>WOL-SH</title>
</head>
<BODY BGCOLOR="#ffe0c0">
<H3 align="center">WOL-SH</H3>
<HR>
<p align="center">テレビサーバの電源をWake on LANで入れるっちゃ</p>
<form action="./wol.cgi" method="post" name="wol" id="wol">
<div align="center">
<input type="submit" name="Submit" value="送信">
</div>
</form>
<HR>
</body>
</html>
------------------------------------------------- 

これで出来たのでWebブラウザからアクセスしてみた

http://www.sasapurin.com/~wol/wol.html

ベーシック認証がかかっていて、ユーザー名とパスワードを入力した

極めてシンプルなページとボタンが一個出てきたので、ボタンをクリックする。 

Internal Server Error .......

 なんじゃそりゃ~

 

httpdのエラーログ確認

Resource temporarily unavailable:
couldn't spawn child process: /home/wol/public_html/wol.cgi

チャイルドプロセスが作れないとかぬかしてるな..

 

そもそもシェルで書いたCGIは機能するんか?

$ ./wol.cgi

あらら、ちゃんとWOLでリモート起動がかかってメッセージも出てきた

Content-type: text/html
<title>sending wol</title>
<p>
sending wol to fluorite
...
...
</p>
<p>
done.
</p>

 

って事は、シェルスクリプト(sh)でCGIを書いているから、Apacheが拒否してるって感じだろうな。
そういえば、ExecCGIとかのところに、CGIファイルの拡張子を定義するところ(AddHandler)があったはず。

$ su -
# less /etc/httpd/conf/httpd.conf

/AddHandler

みぃつけた(w

けど待てよ..ここを書き換えちゃうと、Apache全体に適用されちゃうよな。それはまずいな。

 

ってことで、.htaccessを利用することに決定。既にベーシック認証の為に設置してるから追記するだけでいけるはず。

# exit
$ cd ~/public_html
$ vi .htaccess

AddHandler cgi-script .cgi.sh

 

気を取り直して、もう一度テストをやってみた

http://www.sasapurin.com/~wol/wol.html

ボタンをクリック!

カチン、ピコッという音と共に電源ファンの音が鳴って、LEDが点灯した!

やったぜ成功!!やるじゃん俺(w

という訳でWebブラウザでWOLに成功したのでありました。

実は、メールを送ってそれをトリガーにしてシェルを実行させるって方法も考えたんだけどね。それはまたの機会にしようかな。とりあえず上手く出来てよかった。

冗長しますが、上記のURLは架空のもので存在しません。わざわざ秘密の入り口をネットで公開するほど間抜けではないっす(w

投稿者 sasapurin : 18:41 | コメント (0) | トラックバック

Linux鯖からMagic Packet送出

IO-DATAのGV-MVP/RX2WというハードウェアエンコードなTVキャプチャカードを使って地上波テレビを録画する事にした。これが結構便利で「おまかせ録画」をしておけば、キーワードに引っかかる番組をEPGから探し出してくれて、どんどん撮り貯めてくれる。大容量HDDに録画するようにしているので溜め込んでから、観終ったり要らないのは削除すればいいだけだ。もっと早く導入しておけばよかった。

将来的にはLinuxでTV録画サーバにしたいのだが、当分は使い勝手の問題で純正のWindows版ソフトを使って録画することにした。 やっぱり考えられて作られて製品化しているだけあって、オープンソースなソフトウェアだけではちょっと不便だからだ。もっとも自分にスキルがあれば改良も可能だろうが。 まだまだ勉強が足りないと痛感する。

そんな訳で二週間ほど録画をしているのだが、自分の趣向が見えてきて、そういう番組が放送されている時間帯が朝と夜に偏っていることが分かった。ということは日中は録画待機のまま無駄に電源を消費しているってことだ。なんとか改善したいなと思った。

まず考えたのはBIOSに備わっているタイマー起動である。毎日(曜日も指定可能)決まった時間に自動的に起動する様にして、一々自分で電源を入れなくてもすむようにした。これは使っているマシンのBIOSに依存しているから、まぁ運が良かったという感じだ。

そして深夜になると自動でシャットダウンする様にしている。これは下記でVBスクリプトが配布されているので、ありがたく使わせていただき、タスクで時間などを設定して、定期的に実行させればシャットダウンがかかる。これだけなら電源を切る為に手を煩わすことはない。

Windows 2000/XP でログオフ/シャットダウン/再起動アイコンを作るには?

でもこれだと朝起動して夜シャットダウンを一回限りしか出来ない。冗長してしまうが、私の観たい番組は朝と夜に偏っていて日中の電源ONは無駄な待機電力を消費するだけである。なんとか出来ないものか?

考えてみたところ、この機種にはIntelのPro100というEthenet用のチップが使われている。って事は恐らくWOL(Wake On Lan)に対応しているはずだ。デバイスマネージャーからプロパティを表示して詳細を確認したところ、確かにWOLに関する設定がある!来た来た~

「PMEをオンにする」という設定と
「Wake on 設定」という項目を「Wake on Magic Packet」に設定した。
これでマジックパケットがに反応して電源を起動できるようになるはずだ。

幸いというか、我が家にはPC-UNIXで24時間動かしっぱなしのサーバが二台ある。オペレーションシステムには、FreeBSDとVine Linuxを使っている。今回はVine Linuxの方をWOL制御の親とする事に決めた。

$su -
Password:
#apt-cache search wakeonlan
#apt-cache search wol
wol - Wakeup on LAN client
#apt-get install wol
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
以下のパッケージが新たにインストールされます:
  wol
アップグレード: 0 個, 新規インストール: 1 個, 削除: 0 個, 保留: 2 個
4103B のアーカイブを取得する必要があります。
展開後に 4216B のディスク容量が追加消費されます。
取得:1http://updates.vinelinux.org/3.2/i386/plus wol 0.1-0vl2 [4103B]
4103B を 0s 秒で取得しました (8446B/s)
変更を適用しています...
準備中...                   ########################################### [100%]
   1:wol                    ########################################### [100%]
完了
# man wol
wol のマニュアルはありません。
#which wol
/usr/bin/wol
# wol 192.168.1.255 00-10-C6-xx-xx-xx
Illegal MAC address: xx-xx-xx-xx-xx-xx
# wol 192.168.1.255 0010C6xxxxxx
Illegal MAC address: 0010C6xxxxxx
#wol 192.168.1.255 00:10:C6:xx:xx:xx

ようやくVine LinuxからのWOLコマンドにTVサーバが反応して、電源が入った!

ポイントとしては、下記の書式でwolコマンドを投入する事だ。上に転記した様にmanが無いから試してみるしかなかったのだ。我が家の場合はネットワークアドレスが192.168.1.0/24なのでブロードキャストは192.168.1.255である。NICのMacアドレスは面倒だけど何かしらの方法で控えておくしか無いだろう。

wol [ブロードキャストアドレス] [xx:xx:xx:xx:xx:xx]

ちなみにwolコマンドは、一般ユーザーからでも実行できる事を確認した。(上記はrootから行っているが、exitして一般ユーザーからやってみたが成功した)

さて、問題はこれをどうやって使いこなせば美味しいかってところだ。定期的なスケジュールは簡単なシェルにしておいて、cronで行えばよいだろう。そうすれば下記の様に出来るハズだ。

  1. 朝はBIOSのタイマーで起動(念のためWOLでも起動を試みておく)
  2. 午前中の放送を録画
  3. タスクに登録したシャットダウンスクリプトで電源が落ちる
  4. 夕方はVine Linux鯖からWOLでリモート起動(時間はcronで指定)
  5. 夕方~夜の番組を録画
  6. タスクに登録したシャットダウンスクリプトで電源が落ちる

この繰り返しが実現するはず。単発のWOLはatで指定しておけば繰り返さないので安心。

実験する限りこれはイレギュラーなことが無い限り、毎日安定して動くだろうと思う。これだけでもかなり満足ではある。

しかし、やっぱりちょっと欲が出てくる。
TV録画マシンはWindowsを使用しているので、PacketiX Desktop VPNを使用させて頂いて常駐するようにしている。つまりイレギュラーな時間でもこいつの電源を入れることに成功すれば、外部からPacketiX Desktop VPNでリモート操作が出来る。急に予約したい番組が出来たとしても外部から操作出来るってもんだ。

ちなみには、一世を風靡した「SoftEther」の開発を更に進めているソフトイーサ株式会社が、学術研究目的で無償で配布しているものだ。ベータ版だとの事だが安定して使用出来るので、活用させていただいている。私も近い将来ちょっと考えていることがあるので、もし本格的に仕事で必要になったらちゃんとした製品版を購入しようと思っている。今は所詮趣味っていうか自己満足な世界で楽しんでいるだけなので..orz

話をもどして、我が家のVine Linux鯖はWebサーバである。ルーターのSSHポートは開けてないから、外部からWebブラウザを使ってアクセス出来、操作することが出来る唯一のマシンなのだ。って事はWebブラウザで操作できるCGI?を作成すればWOLコマンドによるマジックパケットをLANに送出することが可能となるはず。

しかし、シェルスクリプトすら作れない私にはちょっと高い壁である。自慢にもなりゃしないが、プログラミングは全く出来ないのだ。でもなんとかこの問題というか課題はクリアしたい。ちょっと調べてみよう。

投稿者 sasapurin : 14:32 | コメント (0) | トラックバック