もなかアイスの試食品

「とりあえずやってみたい」そんな気持ちが先走りすぎて挫折が多い私のメモ書きみたいなものです.

Go言語でWake On Lan出来るようにする(マジックパケットを送信する)

はじめに

社内の不要になったマシンにCentOSを入れて、GitLabを運用することにした。

会社にいる間しか使用しないので、20時にサスペンドするcronを設定した。

朝イチにサーバの電源ボタンを押すのが面倒くさいので、自分のマシンからWake On LanでGitLabサーバを起動するようにした。

最初はWindowsバッチ処理を他のサイトから拾ってきて起動していたけど、今会社でメインに使用しているのがmac

なので、mac/Windows両方からWake On Lan出来るように、Go言語でマジックパケットを送信するプログラムを作ってみた。

参考サイト

e-words.jp

qiita.com

poga.jp

ソースコード

宛先のポート番号は適当に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言語はもっと簡単に書けないっすかね?