Skip to content

Instantly share code, notes, and snippets.

@atotto
Created July 17, 2017 08:51
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save atotto/be981d1be3032448cde40e14bce7ece5 to your computer and use it in GitHub Desktop.
Save atotto/be981d1be3032448cde40e14bce7ece5 to your computer and use it in GitHub Desktop.
Amazon Dash Button Server
package main
import (
"log"
"net"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
)
func handleDashButton(macAddr string) error {
switch macAddr {
case "b4:7c:9c:xx:xx:xx":
log.Printf("dash!")
default:
}
return nil
}
// sudo -E go run dash_button_server.go
func main() {
addr, err := net.ResolveUDPAddr("udp", ":67")
if err != nil {
log.Fatal(err)
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
buf := make([]byte, 1024)
for {
n, addr, err := conn.ReadFromUDP(buf)
if err != nil {
log.Println("ERROR: ", err)
continue
}
dhcp := decodeDHCPPacket(buf[0:n])
if dhcp == nil {
log.Println("ERROR: decode failed")
continue
}
log.Printf("received %s %s %s", addr, dhcp.Operation, dhcp.ClientHWAddr)
for _, option := range dhcp.Options {
if option.Type == layers.DHCPOptHostname {
log.Printf("%s", option.String())
}
}
err = handleDashButton(dhcp.ClientHWAddr.String())
if err != nil {
log.Println("ERROR: ", err)
continue
}
}
}
func decodeDHCPPacket(buf []byte) *layers.DHCPv4 {
p := gopacket.NewPacket(buf, layers.LayerTypeDHCPv4, gopacket.DecodeOptions{
SkipDecodeRecovery: true,
})
dhcp, ok := p.Layer(layers.LayerTypeDHCPv4).(*layers.DHCPv4)
if !ok {
return nil
}
return dhcp
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment