Go言語でWake On Lan出来るようにする(マジックパケットを送信する)
はじめに
社内の不要になったマシンにCentOSを入れて、GitLabを運用することにした。
会社にいる間しか使用しないので、20時にサスペンドするcronを設定した。
朝イチにサーバの電源ボタンを押すのが面倒くさいので、自分のマシンからWake On LanでGitLabサーバを起動するようにした。
最初はWindowsのバッチ処理を他のサイトから拾ってきて起動していたけど、今会社でメインに使用しているのがmac
なので、mac/Windows両方からWake On Lan出来るように、Go言語でマジックパケットを送信するプログラムを作ってみた。
参考サイト
ソースコード
宛先のポート番号は適当に9999にした。
package main import ( "fmt" "net" ) func main() { // マジックパケットについて // See: http://e-words.jp/w/%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%91%E3%82%B1%E3%83%83%E3%83%88.html // マジックパケット送信先のMACアドレスを記述する targetMacAddrs := [...] string{ "xx:xx:xx:xx:xx:xx", } remoteUdpAddr, _ := net.ResolveUDPAddr("udp", "255.255.255.255:9999") localUdpAddr, _ := net.ResolveUDPAddr("udp", ":0") conn, err := net.DialUDP("udp", localUdpAddr, remoteUdpAddr) if err != nil { fmt.Println(err.Error()) return } defer func() { _ = conn.Close() }() packetPrefix := make([]byte, 6) for i := range packetPrefix { packetPrefix[i] = 0xFF } for _, macAddress := range targetMacAddrs { hw, err := net.ParseMAC(macAddress) if err != nil { fmt.Println(err.Error()) return } sendPacket := make([]byte, 0) sendPacket = append(sendPacket, packetPrefix...) for i := 0; i < 16; i++ { sendPacket = append(sendPacket, hw...) } _, err = conn.Write(sendPacket) if err != nil { fmt.Println(err.Error()) return } } }
おわりに
とりあえず今回のコードで、自分の環境はmac/Windows共にCentOSマシンをWake On Lanで起動できるようになった。
0xFFを6回書くのは微妙かなって思ってループ使ってるけど、配列(スライス)を0xFFを6個分で初期化するみたいなことをGo言語はもっと簡単に書けないっすかね?