2010年6月14日月曜日

Ruby で Wake on Lan

たまに普段使用していないスリープ中のMacを起こす必要が出る。
そのMacは、ディスプレイもキーボード・マウスもつないでいない。
そこでWOLの出番だ。


以下のスクリプトは、もはや何処のサイトを参考にしたか覚えていないが
RubyやPythonのWOLスクリプトを載せているサイトを参考にして1年ほど前に作成したもの。


#!/usr/bin/ruby
# Wake on Lan Script

require 'socket'

sock = UDPSocket.open()
sock.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
# broadcastのIPアドレスを指定
broadcast = '192.168.0.255'
# 接続先のmacアドレスを指定
mac = "00:00:00:00:00:00"
# magic packet
magic = (0xff.chr) * 6
+ (mac.split(/:/).pack("H*H*H*H*H*H*")) * 16
print magic + "\n"
sock.send(magic, 0, broadcast, "discard")

以下の様な記述でも可能だとされていたが、Socketへの追記でPermissionErrorが発生したので、断念し上記のソースとなった。


sock = Socket.open(Socket::AF_INET, Socket::SOCK_DGRAM, 0)
address = Socket.sockaddr_in(80, '192.168.0.255')
sock.connect(address)
mac = "00:00:00:00:00:00"
magic = (0xff.chr) * 6 + (mac.split(/:/).pack("H*H*H*H*H*H*")) * 16
sock.write(magic)
print sock.read

改めて勉強しようとしたところ、MagicPacketについては以下のサイトの記述が参考になった。
Wake On LANでコンピュータを起動する - @IT


Socketのオプションは、manで確認しろとRubyのマニュアルにある。
BasicSocket - Rubyリファレンスマニュアル
man 2 socket
ただ英語で出るので解らない。下記の翻訳を参考にする。
Manpage of SOCKET
失敗した方のコードの問題点は、以下の内容を理解する必要がありそうだ。
Manpage of GETSOCKOPT


大して理解もせずとも目的を達成するコードは組めるものだ。

0 件のコメント:

コメントを投稿