CGIでWake on LANさせてみた


 SplashtopやらESファイルエクスプローラーやらで俺PCを弄るにあたって、やっぱスリープやシャットダウンから遠隔で復帰させたい訳ですよ。
 となれば必然的にWOLなのだが、PC側はUEFIとドライバをちょちょいと設定してやればいいとして、パケットをどう届かせるか。
 まあ、今はLANの中だから普通にWOLなアプリでも入れときゃ動くんだけど、いずれWANからやりたくなるだろうしなあ。

 で、うちのLANには24時間稼働してるWeb鯖があって外からも繋がるから、そこにWOLパケットを送信するCGIでも置いときゃいいじゃん、と。
 PHPが書けたら、PHP対応のWeb鯖を立てる機能の付いたNASとかにも使えて便利なんだろうけど、この程度の目的だとPHP覚える気力も出ないんで、ちゃちゃっとPythonでCGIにしてしまおう。

#!/usr/bin/python
import os
import socket
import binascii

def send_wol_packet(mac_addr_str, port=9):
    s = mac_addr_str.replace(':', '').replace('-', '')
    if len(s) != 2 * 6:
        raise TypeError('Invalid MAC address length')
    mac_addr_bin = binascii.a2b_hex(s)
    wol_packet = '\xff' * 6 + mac_addr_bin * 16
    sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sck.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    sck.sendto(wol_packet, ('<broadcast>', port))
    sck.close()

def app(env):
    mac_addr_str = env.get('QUERY_STRING')
    send_wol_packet(mac_addr_str)
    print 'Content-Type: text/plain\n\nDone.'

if __name__ == '__main__':
    app(os.environ)

 あとは、これをhttp://host/cgi-bin/wakeup.cgi?12-34-56-78-90-ABみたいに叩けば、と。行けた行けた。

 いやーもう何か、凄いわ。Nexus 7が遊べすぎてヤバい。アプリが作りたくなったらSL4A辺りでも良さそうだし。
 まあ、HTML5な方向性でも結構遊べそうですが。先にそっちかなあ。XPかつIEな人が気になるけど、XPな人はIE捨ててください、それも無理ならご縁が無かったらしいです、でもいいんじゃね。趣味で作る時なら。

 今んとこタブレットの最大の不満はキーボードだろうか。
 持ち歩ける画面サイズと重量で全面タッチパネルなことは物凄く重要だから、そこらを全く犠牲にせずに、画面も全く邪魔せずに、キーボードのタッチタイピングと自由なカーソル操作が持ち込めたら本当に素晴らしいのに。既存の製品だとレーザー投影くらいしか思い付かないけど、あれ凄く微妙らしいしなあ。
 何か画期的な発明無いだろか。それともレーザー投影をどうにか実用的にするとか。誰かマジで作ってくれ。

(Visited 330 times, 1 visits today)

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください