package main
import (
"fmt"
"strings"
"time"
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"github.com/google/gopacket/pcap"
)
func FindDevicesByName(name string, show bool) (string, error) {
devices, err := pcap.FindAllDevs()
if err != nil {
return "", err
}
for _, device := range devices {
if show {
fmt.Println("\nName: ", device.Name)
fmt.Println("Description: ", device.Description)
for _, address := range device.Addresses {
fmt.Println("- IP address: ", address.IP)
fmt.Println("- Subnet mask: ", address.Netmask)
}
}
if device.Description == name {
return device.Name, nil
}
}
return "", fmt.Errorf("Not found Devices!")
}
type OpenLiveCg struct {
Devices string
Max_len int32
Promisc bool
Timeout time.Duration
}
type CaptureConfig struct {
LiveTo OpenLiveCg
InControl chan string
OffCap chan bool
OffFunc chan bool
OutData chan interface{}
OutError chan error
InFilter chan string
OpenCap bool
}
func HandleDump(handle *pcap.Handle, cc *CaptureConfig, method string) {
if cc.OpenCap {
cc.OffCap <- true
} else {
cc.OpenCap = true
}
packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
for packet := range packetSource.Packets() {
switch method {
case "http":
tcpLayer := packet.Layer(layers.LayerTypeTCP)
if tcpLayer != nil {
tcp, _ := tcpLayer.(*layers.TCP)
if strings.Contains(tcp.DstPort.String(), "http") {
cc.OutData <- tcp
}
}
default:
cc.OutData <- packet
}
select {
case <-cc.OffCap:
return
default:
}
}
}
func PcapDumpCore(cc *CaptureConfig) {
handle, err := pcap.OpenLive(cc.LiveTo.Devices, cc.LiveTo.Max_len, cc.LiveTo.Promisc, cc.LiveTo.Timeout)
if err != nil {
panic(err)
}
defer func() {
handle.Close()
close(cc.InControl)
close(cc.OffCap)
close(cc.OutData)
close(cc.OutError)
close(cc.InFilter)
close(cc.OffFunc)
}()
for {
select {
case filter := <-cc.InFilter:
err := handle.SetBPFFilter(filter)
if err != nil {
cc.OutError <- err
}
case Com := <-cc.InControl:
HandleDump(handle, cc, Com)
case <-cc.OffFunc:
return
default:
}
}
}