diff --git a/go.mod b/go.mod index 804a611..255d6a5 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,6 @@ go 1.22.6 require ( github.com/gin-gonic/gin v1.10.0 - github.com/google/gopacket v1.1.19 github.com/jmoiron/sqlx v1.4.0 github.com/spf13/viper v1.19.0 modernc.org/sqlite v1.32.0 diff --git a/go.sum b/go.sum index ed5edf7..2ddb7a3 100644 --- a/go.sum +++ b/go.sum @@ -39,8 +39,6 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= -github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -128,34 +126,22 @@ go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTV golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 h1:mchzmB1XO2pMaKFRqk/+MV3mgGG96aqaPXaMifQU47w= golang.org/x/exp v0.0.0-20231108232855-2478ac86f678/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/arp/goscan.go b/internal/arp/goscan.go deleted file mode 100644 index d16a358..0000000 --- a/internal/arp/goscan.go +++ /dev/null @@ -1,159 +0,0 @@ -package arp - -import ( - "bytes" - "encoding/binary" - "errors" - "log" - "net" - "time" - - "github.com/google/gopacket" - "github.com/google/gopacket/layers" - "github.com/google/gopacket/pcap" - - "github.com/aceberg/WatchYourLAN/internal/check" -) - -// GoScan - scan iface -func GoScan() { - - iface, _ := net.InterfaceByName("enp4s0") - err := scan(iface) - log.Println(err) -} - -func scan(iface *net.Interface) error { - // We just look for IPv4 addresses, so try to find if the interface has one. - var addr *net.IPNet - if addrs, err := iface.Addrs(); err != nil { - return err - } else { - for _, a := range addrs { - if ipnet, ok := a.(*net.IPNet); ok { - if ip4 := ipnet.IP.To4(); ip4 != nil { - addr = &net.IPNet{ - IP: ip4, - Mask: ipnet.Mask[len(ipnet.Mask)-4:], - } - break - } - } - } - } - // Sanity-check that the interface has a good address. - if addr == nil { - return errors.New("no good IP network found") - } else if addr.IP[0] == 127 { - return errors.New("skipping localhost") - } else if addr.Mask[0] != 0xff || addr.Mask[1] != 0xff { - return errors.New("mask means network is too large") - } - log.Printf("Using network range %v for interface %v", addr, iface.Name) - - // Open up a pcap handle for packet reads/writes. - handle, err := pcap.OpenLive(iface.Name, 65536, true, pcap.BlockForever) - if err != nil { - return err - } - defer handle.Close() - - // Start up a goroutine to read in packet data. - stop := make(chan struct{}) - go readARP(handle, iface, stop) - defer close(stop) - // for { - // Write our scan packets out to the handle. - if err := writeARP(handle, iface, addr); err != nil { - log.Printf("error writing packets on %v: %v", iface.Name, err) - return err - } - // We don't know exactly how long it'll take for packets to be - // sent back to us, but 10 seconds should be more than enough - // time ;) - time.Sleep(10 * time.Second) - // } - return err -} - -// readARP watches a handle for incoming ARP responses we might care about, and prints them. -// -// readARP loops until 'stop' is closed. -func readARP(handle *pcap.Handle, iface *net.Interface, stop chan struct{}) { - src := gopacket.NewPacketSource(handle, layers.LayerTypeEthernet) - in := src.Packets() - for { - var packet gopacket.Packet - select { - case <-stop: - return - case packet = <-in: - arpLayer := packet.Layer(layers.LayerTypeARP) - if arpLayer == nil { - continue - } - arp := arpLayer.(*layers.ARP) - if arp.Operation != layers.ARPReply || bytes.Equal([]byte(iface.HardwareAddr), arp.SourceHwAddress) { - // This is a packet I sent. - continue - } - // Note: we might get some packets here that aren't responses to ones we've sent, - // if for example someone else sends US an ARP request. Doesn't much matter, though... - // all information is good information :) - log.Printf("IP %v is at %v", net.IP(arp.SourceProtAddress), net.HardwareAddr(arp.SourceHwAddress)) - } - } -} - -// writeARP writes an ARP request for each address on our local network to the -// pcap handle. -func writeARP(handle *pcap.Handle, iface *net.Interface, addr *net.IPNet) error { - // Set up all the layers' fields we can. - eth := layers.Ethernet{ - SrcMAC: iface.HardwareAddr, - DstMAC: net.HardwareAddr{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, - EthernetType: layers.EthernetTypeARP, - } - arp := layers.ARP{ - AddrType: layers.LinkTypeEthernet, - Protocol: layers.EthernetTypeIPv4, - HwAddressSize: 6, - ProtAddressSize: 4, - Operation: layers.ARPRequest, - SourceHwAddress: []byte(iface.HardwareAddr), - SourceProtAddress: []byte(addr.IP), - DstHwAddress: []byte{0, 0, 0, 0, 0, 0}, - } - // Set up buffer and options for serialization. - buf := gopacket.NewSerializeBuffer() - opts := gopacket.SerializeOptions{ - FixLengths: true, - ComputeChecksums: true, - } - // Send one packet for every address. - for _, ip := range ips(addr) { - arp.DstProtAddress = []byte(ip) - err := gopacket.SerializeLayers(buf, opts, ð, &arp) - check.IfError(err) - if err = handle.WritePacketData(buf.Bytes()); err != nil { - return err - } - } - return nil -} - -// ips is a simple and not very good method for getting all IPv4 addresses from a -// net.IPNet. It returns all IPs it can over the channel it sends back, closing -// the channel when done. -func ips(n *net.IPNet) (out []net.IP) { - num := binary.BigEndian.Uint32([]byte(n.IP)) - mask := binary.BigEndian.Uint32([]byte(n.Mask)) - network := num & mask - broadcast := network | ^mask - for network++; network < broadcast; network++ { - var buf [4]byte - binary.BigEndian.PutUint32(buf[:], network) - out = append(out, net.IP(buf[:])) - } - return -}