Remove gopacket
This commit is contained in:
parent
b0a326c1e2
commit
f7f301b6ca
3 changed files with 0 additions and 174 deletions
1
go.mod
1
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
|
||||
|
|
|
|||
14
go.sum
14
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=
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
Loading…
Reference in a new issue