97 lines
2.2 KiB
Go
97 lines
2.2 KiB
Go
package wol
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"log"
|
|
"net"
|
|
"strings"
|
|
)
|
|
|
|
// Service ist der Wake-on-LAN Service
|
|
type Service struct{}
|
|
|
|
// NewService erstellt einen neuen Wake-on-LAN Service
|
|
func NewService() *Service {
|
|
return &Service{}
|
|
}
|
|
|
|
// WakePC sendet ein Wake-on-LAN Paket an die angegebene MAC-Adresse
|
|
func (s *Service) WakePC(mac string) error {
|
|
// MAC-Adresse normalisieren
|
|
normalizedMAC := strings.ReplaceAll(mac, ":", "")
|
|
normalizedMAC = strings.ReplaceAll(normalizedMAC, "-", "")
|
|
|
|
log.Printf("Versende Wake-on-LAN Paket an MAC: %s", mac)
|
|
|
|
// Magic Packet erstellen
|
|
magicPacket, err := s.createMagicPacket(normalizedMAC)
|
|
if err != nil {
|
|
log.Printf("Fehler beim Erstellen des Magic Packets: %v", err)
|
|
return err
|
|
}
|
|
|
|
// UDP-Paket senden
|
|
err = s.sendMagicPacket(magicPacket)
|
|
if err != nil {
|
|
log.Printf("Fehler beim Senden des Wake-on-LAN Pakets: %v", err)
|
|
return err
|
|
}
|
|
|
|
log.Printf("Wake-on-LAN Paket erfolgreich an %s gesendet", mac)
|
|
return nil
|
|
}
|
|
|
|
// createMagicPacket erstellt ein Wake-on-LAN Magic Packet
|
|
func (s *Service) createMagicPacket(mac string) ([]byte, error) {
|
|
// MAC-Adresse in Bytes konvertieren
|
|
macBytes, err := hex.DecodeString(mac)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Magic Packet: 6 Bytes 0xFF gefolgt von 16 Wiederholungen der MAC-Adresse
|
|
magicPacket := make([]byte, 102)
|
|
|
|
// Erste 6 Bytes mit 0xFF füllen
|
|
for i := 0; i < 6; i++ {
|
|
magicPacket[i] = 0xFF
|
|
}
|
|
|
|
// MAC-Adresse 16 mal wiederholen
|
|
for i := 6; i < 102; i += 6 {
|
|
copy(magicPacket[i:i+6], macBytes)
|
|
}
|
|
|
|
return magicPacket, nil
|
|
}
|
|
|
|
// sendMagicPacket sendet das Magic Packet über UDP
|
|
func (s *Service) sendMagicPacket(magicPacket []byte) error {
|
|
// UDP-Verbindung erstellen
|
|
conn, err := net.Dial("udp", "255.255.255.255:9")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer conn.Close()
|
|
|
|
// Paket senden
|
|
_, err = conn.Write(magicPacket)
|
|
return err
|
|
}
|
|
|
|
// ValidateMAC prüft, ob die MAC-Adresse gültig ist
|
|
func ValidateMAC(mac string) bool {
|
|
// MAC-Adresse bereinigen
|
|
cleanMAC := strings.ReplaceAll(mac, ":", "")
|
|
cleanMAC = strings.ReplaceAll(cleanMAC, "-", "")
|
|
|
|
// Länge prüfen (12 Hex-Zeichen)
|
|
if len(cleanMAC) != 12 {
|
|
return false
|
|
}
|
|
|
|
// Prüfen, ob alle Zeichen gültige Hexadezimalziffern sind
|
|
_, err := hex.DecodeString(cleanMAC)
|
|
return err == nil
|
|
}
|