ing
This commit is contained in:
@@ -142,6 +142,7 @@ LOOP:
|
||||
}
|
||||
req.(*ofDiscoveryRequest).release()
|
||||
|
||||
log.Print("Discovery Session complete")
|
||||
case <-d.stopChan:
|
||||
return
|
||||
}
|
||||
|
||||
@@ -25,15 +25,11 @@ func Scan(discoverySession session.DiscoverySession) error {
|
||||
|
||||
zone := discoverySession.Zone()
|
||||
|
||||
ps, err := pcap.RetainScanner(zone)
|
||||
if nil != err {
|
||||
return fmt.Errorf("Cannot retain pcap instance %v", err)
|
||||
ps := discoverySession.PCapScanner()
|
||||
if nil == ps {
|
||||
return fmt.Errorf("Cannot retain pcap instance")
|
||||
}
|
||||
|
||||
defer func() {
|
||||
pcap.ReleaseScanner(zone)
|
||||
}()
|
||||
|
||||
arpChan := ps.OpenARP()
|
||||
defer func() {
|
||||
ps.CloseARP(arpChan)
|
||||
@@ -57,16 +53,13 @@ func Scan(discoverySession session.DiscoverySession) error {
|
||||
delay.Store(true)
|
||||
if h := handlePacketARP(zone, targetHosts, hosts, packet); nil != h {
|
||||
if h != nil {
|
||||
// log.Print("Host ", h)
|
||||
discoverySession.AddHost(h)
|
||||
}
|
||||
|
||||
// resultChan <- h
|
||||
}
|
||||
case <-ticker.C:
|
||||
if false == delay.Load().(bool) {
|
||||
ticker.Stop()
|
||||
timerStopped <- struct{}{}
|
||||
close(timerStopped)
|
||||
return
|
||||
}
|
||||
delay.Store(false)
|
||||
|
||||
@@ -4,21 +4,10 @@ import (
|
||||
"git.loafle.net/overflow_scanner/probe/discovery/protocol/icmp/privileged"
|
||||
"git.loafle.net/overflow_scanner/probe/discovery/protocol/icmp/unprivileged"
|
||||
"git.loafle.net/overflow_scanner/probe/discovery/session"
|
||||
"git.loafle.net/overflow_scanner/probe/internal/pcap"
|
||||
)
|
||||
|
||||
func Scan(discoverySession session.DiscoverySession) error {
|
||||
zone := discoverySession.Zone()
|
||||
|
||||
var _privileged bool
|
||||
|
||||
_, err := pcap.RetainScanner(zone)
|
||||
if nil == err {
|
||||
pcap.ReleaseScanner(zone)
|
||||
_privileged = true
|
||||
}
|
||||
|
||||
if _privileged {
|
||||
if nil != discoverySession.PCapScanner() {
|
||||
return privileged.Scan(discoverySession)
|
||||
}
|
||||
|
||||
|
||||
@@ -27,15 +27,11 @@ func scanV4(discoverySession session.DiscoverySession) error {
|
||||
|
||||
zone := discoverySession.Zone()
|
||||
|
||||
ps, err := pcap.RetainScanner(zone)
|
||||
if nil != err {
|
||||
return fmt.Errorf("Cannot retain pcap instance %v", err)
|
||||
ps := discoverySession.PCapScanner()
|
||||
if nil == ps {
|
||||
return fmt.Errorf("Cannot retain pcap instance")
|
||||
}
|
||||
|
||||
defer func() {
|
||||
pcap.ReleaseScanner(zone)
|
||||
}()
|
||||
|
||||
icmpChan := ps.OpenICMP4()
|
||||
defer func() {
|
||||
ps.CloseICMP4(icmpChan)
|
||||
|
||||
@@ -27,15 +27,11 @@ func scanV6(discoverySession session.DiscoverySession) error {
|
||||
|
||||
zone := discoverySession.Zone()
|
||||
|
||||
ps, err := pcap.RetainScanner(zone)
|
||||
if nil != err {
|
||||
return fmt.Errorf("Cannot retain pcap instance %v", err)
|
||||
ps := discoverySession.PCapScanner()
|
||||
if nil == ps {
|
||||
return fmt.Errorf("Cannot retain pcap instance")
|
||||
}
|
||||
|
||||
defer func() {
|
||||
pcap.ReleaseScanner(zone)
|
||||
}()
|
||||
|
||||
icmpChan := ps.OpenICMP6()
|
||||
defer func() {
|
||||
ps.CloseICMP6(icmpChan)
|
||||
|
||||
@@ -19,13 +19,10 @@ import (
|
||||
)
|
||||
|
||||
func scanV4(discoverySession session.DiscoverySession, targetHost *omd.Host) error {
|
||||
ps, err := pcap.RetainScanner(targetHost.Zone)
|
||||
if nil != err {
|
||||
return fmt.Errorf("Discovery: Cannot retain pcap instance %v", err)
|
||||
ps := discoverySession.PCapScanner()
|
||||
if nil == ps {
|
||||
return fmt.Errorf("Cannot retain pcap instance")
|
||||
}
|
||||
defer func() {
|
||||
go pcap.ReleaseScanner(targetHost.Zone)
|
||||
}()
|
||||
|
||||
tcpChan := ps.OpenTCP(targetHost.Address)
|
||||
defer func() {
|
||||
@@ -33,6 +30,9 @@ func scanV4(discoverySession session.DiscoverySession, targetHost *omd.Host) err
|
||||
}()
|
||||
|
||||
timerStopped := make(chan struct{})
|
||||
stopChan := make(chan struct{})
|
||||
defer close(stopChan)
|
||||
|
||||
go func() {
|
||||
ports := make(map[int]*omd.Port)
|
||||
|
||||
@@ -47,9 +47,13 @@ func scanV4(discoverySession session.DiscoverySession, targetHost *omd.Host) err
|
||||
return
|
||||
}
|
||||
delay.Store(true)
|
||||
// go func(packet *layers.TCP) {
|
||||
if p := handlePacketTCP4(discoverySession, targetHost, ports, packet); nil != p {
|
||||
discoverySession.AddPort(p)
|
||||
log.Print(p)
|
||||
}
|
||||
|
||||
// }(packet)
|
||||
case <-ticker.C:
|
||||
if false == delay.Load().(bool) {
|
||||
ticker.Stop()
|
||||
@@ -61,7 +65,7 @@ func scanV4(discoverySession session.DiscoverySession, targetHost *omd.Host) err
|
||||
}
|
||||
}()
|
||||
|
||||
if err := sendTCP4(discoverySession, ps, targetHost); nil != err {
|
||||
if err := sendTCP4(discoverySession, ps, targetHost, stopChan); nil != err {
|
||||
log.Printf("sendTCP %v", err)
|
||||
return nil
|
||||
}
|
||||
@@ -74,7 +78,7 @@ func scanV4(discoverySession session.DiscoverySession, targetHost *omd.Host) err
|
||||
}
|
||||
}
|
||||
|
||||
func sendTCP4(discoverySession session.DiscoverySession, ps pcap.PCapScanner, host *omd.Host) error {
|
||||
func sendTCP4(discoverySession session.DiscoverySession, ps pcap.PCapScanner, host *omd.Host, stopChan chan struct{}) error {
|
||||
dp := discoverySession.DiscoverPort()
|
||||
|
||||
tcpPacket, err := makePacketPortTCP4(host)
|
||||
@@ -109,6 +113,8 @@ Loop:
|
||||
|
||||
select {
|
||||
case <-timer.C:
|
||||
case <-stopChan:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,6 @@ import (
|
||||
"git.loafle.net/overflow_scanner/probe/__test"
|
||||
"git.loafle.net/overflow_scanner/probe/discovery/session"
|
||||
"git.loafle.net/overflow_scanner/probe/discovery/types"
|
||||
"git.loafle.net/overflow_scanner/probe/internal/pcap"
|
||||
"github.com/google/gopacket/layers"
|
||||
)
|
||||
|
||||
@@ -65,27 +64,27 @@ func Test_scanV4(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func Test_sendTCP4(t *testing.T) {
|
||||
type args struct {
|
||||
discoverySession session.DiscoverySession
|
||||
ps pcap.PCapScanner
|
||||
host *omd.Host
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
wantErr bool
|
||||
}{
|
||||
// TODO: Add test cases.
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if err := sendTCP4(tt.args.discoverySession, tt.args.ps, tt.args.host); (err != nil) != tt.wantErr {
|
||||
t.Errorf("sendTCP4() error = %v, wantErr %v", err, tt.wantErr)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
// func Test_sendTCP4(t *testing.T) {
|
||||
// type args struct {
|
||||
// discoverySession session.DiscoverySession
|
||||
// ps pcap.PCapScanner
|
||||
// host *omd.Host
|
||||
// }
|
||||
// tests := []struct {
|
||||
// name string
|
||||
// args args
|
||||
// wantErr bool
|
||||
// }{
|
||||
// // TODO: Add test cases.
|
||||
// }
|
||||
// for _, tt := range tests {
|
||||
// t.Run(tt.name, func(t *testing.T) {
|
||||
// if err := sendTCP4(tt.args.discoverySession, tt.args.ps, tt.args.host); (err != nil) != tt.wantErr {
|
||||
// t.Errorf("sendTCP4() error = %v, wantErr %v", err, tt.wantErr)
|
||||
// }
|
||||
// })
|
||||
// }
|
||||
// }
|
||||
|
||||
func Test_handlePacketTCP4(t *testing.T) {
|
||||
type args struct {
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
omd "git.loafle.net/overflow/model/discovery"
|
||||
omm "git.loafle.net/overflow/model/meta"
|
||||
omu "git.loafle.net/overflow/model/util"
|
||||
osm "git.loafle.net/overflow/service_matcher-go"
|
||||
"git.loafle.net/overflow_scanner/probe/discovery/session"
|
||||
"git.loafle.net/overflow_scanner/probe/internal/matcher"
|
||||
"git.loafle.net/overflow_scanner/probe/internal/pcap"
|
||||
@@ -20,13 +21,10 @@ import (
|
||||
)
|
||||
|
||||
func scanV4(discoverySession session.DiscoverySession, targetHost *omd.Host) error {
|
||||
ps, err := pcap.RetainScanner(targetHost.Zone)
|
||||
if nil != err {
|
||||
return fmt.Errorf("Discovery: Cannot retain pcap instance %v", err)
|
||||
ps := discoverySession.PCapScanner()
|
||||
if nil == ps {
|
||||
return fmt.Errorf("Cannot retain pcap instance")
|
||||
}
|
||||
defer func() {
|
||||
go pcap.ReleaseScanner(targetHost.Zone)
|
||||
}()
|
||||
|
||||
udpChan := ps.OpenUDP(targetHost.Address)
|
||||
defer func() {
|
||||
@@ -108,9 +106,11 @@ func sendUDP4(discoverySession session.DiscoverySession, ps pcap.PCapScanner, ho
|
||||
continue INNER_LOOP
|
||||
}
|
||||
|
||||
matchCtx := osm.NewMatchCtx(host.Address, portNumber)
|
||||
|
||||
addr := &net.UDPAddr{IP: ip.To4(), Port: portNumber}
|
||||
for i := 0; i < _matcher.PacketCount(); i++ {
|
||||
p := _matcher.Packet(i)
|
||||
for i := 0; i < _matcher.PacketCount(matchCtx); i++ {
|
||||
p := _matcher.Packet(matchCtx, i)
|
||||
if _, err := conn.WriteToUDP(p.Buffer, addr); err != nil {
|
||||
log.Print("UDP write error", err)
|
||||
}
|
||||
|
||||
@@ -28,8 +28,6 @@ LOOP:
|
||||
continue LOOP
|
||||
}
|
||||
|
||||
// log.Print(rd)
|
||||
|
||||
discoverySession.AddHost(&omd.Host{
|
||||
MetaIPType: discoverySession.Zone().MetaIPType,
|
||||
Name: rd.FriendlyName,
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
omd "git.loafle.net/overflow/model/discovery"
|
||||
ounc "git.loafle.net/overflow/util-go/net/cidr"
|
||||
"git.loafle.net/overflow_scanner/probe/discovery/types"
|
||||
"git.loafle.net/overflow_scanner/probe/internal/pcap"
|
||||
)
|
||||
|
||||
type DiscoverySession interface {
|
||||
@@ -17,6 +18,8 @@ type DiscoverySession interface {
|
||||
|
||||
DiscoveryRequest() types.DiscoveryRequest
|
||||
|
||||
PCapScanner() pcap.PCapScanner
|
||||
|
||||
Zone() *omd.Zone
|
||||
Host() *omd.Host
|
||||
Port() *omd.Port
|
||||
@@ -47,6 +50,7 @@ type DiscoverySession interface {
|
||||
|
||||
type ofDiscoverySession struct {
|
||||
discoveryRequest types.DiscoveryRequest
|
||||
pCapScanner pcap.PCapScanner
|
||||
|
||||
zone *omd.Zone
|
||||
host *omd.Host
|
||||
@@ -79,6 +83,7 @@ func (ds *ofDiscoverySession) init(request types.DiscoveryRequest) {
|
||||
ds.discoverHost = nil
|
||||
ds.discoverPort = nil
|
||||
ds.discoverService = nil
|
||||
ds.pCapScanner = nil
|
||||
|
||||
ds.hosts = make(map[string]*omd.Host)
|
||||
ds.includeMachosts = make(map[string]*omd.Host)
|
||||
@@ -168,9 +173,18 @@ func (ds *ofDiscoverySession) InitWithRequest(request types.DiscoveryRequest) er
|
||||
ds.setDiscoverService(discoverService)
|
||||
}
|
||||
|
||||
_pCapScanner := pcap.NewPCapScanner(ds.zone)
|
||||
if err := _pCapScanner.Start(); nil == err {
|
||||
ds.pCapScanner = _pCapScanner
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ds *ofDiscoverySession) PCapScanner() pcap.PCapScanner {
|
||||
return ds.pCapScanner
|
||||
}
|
||||
|
||||
func (ds *ofDiscoverySession) SetDiscoveryDelegator(discoveryDelegator chan<- interface{}) {
|
||||
ds.discoveryDelegator = discoveryDelegator
|
||||
}
|
||||
@@ -568,20 +582,26 @@ func RetainDiscoverySession() *ofDiscoverySession {
|
||||
func ReleaseDiscoverySession(ds *ofDiscoverySession) {
|
||||
close(ds.stopChan)
|
||||
|
||||
// timer := time.NewTimer(time.Microsecond * 500)
|
||||
|
||||
// select {
|
||||
// case <-timer.C:
|
||||
// }
|
||||
if nil != ds.pCapScanner {
|
||||
ds.pCapScanner.Stop()
|
||||
}
|
||||
|
||||
ds.pCapScanner = nil
|
||||
ds.discoveryRequest = nil
|
||||
ds.zone = nil
|
||||
ds.host = nil
|
||||
ds.port = nil
|
||||
|
||||
ds.discoveryConfig = nil
|
||||
|
||||
ds.discoverHost = nil
|
||||
ds.discoverPort = nil
|
||||
ds.discoverService = nil
|
||||
|
||||
ds.targetHosts = nil
|
||||
|
||||
ds.discoveryDelegator = nil
|
||||
|
||||
ds.includeMachosts = nil
|
||||
ds.hosts = nil
|
||||
ds.ports = nil
|
||||
|
||||
@@ -6,7 +6,6 @@ import (
|
||||
"git.loafle.net/overflow_scanner/probe/discovery/protocol/arp"
|
||||
"git.loafle.net/overflow_scanner/probe/discovery/protocol/icmp"
|
||||
"git.loafle.net/overflow_scanner/probe/discovery/session"
|
||||
"git.loafle.net/overflow_scanner/probe/internal/pcap"
|
||||
)
|
||||
|
||||
func Scan(discoverySession session.DiscoverySession) error {
|
||||
@@ -15,17 +14,7 @@ func Scan(discoverySession session.DiscoverySession) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
zone := discoverySession.Zone()
|
||||
|
||||
var privileged bool
|
||||
|
||||
_, err := pcap.RetainScanner(zone)
|
||||
if nil == err {
|
||||
pcap.ReleaseScanner(zone)
|
||||
privileged = true
|
||||
}
|
||||
|
||||
if privileged {
|
||||
if nil != discoverySession.PCapScanner() {
|
||||
return privilegedScan(discoverySession)
|
||||
}
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@ import (
|
||||
"git.loafle.net/overflow_scanner/probe/discovery/protocol/tcp/connection"
|
||||
"git.loafle.net/overflow_scanner/probe/discovery/protocol/tcp/syn"
|
||||
"git.loafle.net/overflow_scanner/probe/discovery/session"
|
||||
"git.loafle.net/overflow_scanner/probe/internal/pcap"
|
||||
)
|
||||
|
||||
func Scan(discoverySession session.DiscoverySession, targetHost *omd.Host) error {
|
||||
@@ -15,17 +14,7 @@ func Scan(discoverySession session.DiscoverySession, targetHost *omd.Host) error
|
||||
return nil
|
||||
}
|
||||
|
||||
zone := discoverySession.Zone()
|
||||
|
||||
var privileged bool
|
||||
|
||||
_, err := pcap.RetainScanner(zone)
|
||||
if nil == err {
|
||||
pcap.ReleaseScanner(zone)
|
||||
privileged = true
|
||||
}
|
||||
|
||||
if privileged {
|
||||
if nil != discoverySession.PCapScanner() {
|
||||
return privilegedScan(discoverySession, targetHost)
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,10 @@ import (
|
||||
"git.loafle.net/overflow_scanner/probe/internal/matcher"
|
||||
)
|
||||
|
||||
const (
|
||||
deadline = time.Millisecond * 500
|
||||
)
|
||||
|
||||
func scanTCP(discoverySession session.DiscoverySession, targetPort *omd.Port) error {
|
||||
hostAddress := targetPort.Host.Address
|
||||
portNumber, err := ouej.NumberToInt(targetPort.PortNumber)
|
||||
@@ -38,7 +42,7 @@ LOOP:
|
||||
continue LOOP
|
||||
}
|
||||
|
||||
if err := conn.SetReadDeadline(time.Now().Add(1 * time.Second)); nil != err {
|
||||
if err := conn.SetReadDeadline(time.Now().Add(deadline)); nil != err {
|
||||
continue LOOP
|
||||
}
|
||||
n, err := conn.Read(buf)
|
||||
@@ -113,7 +117,7 @@ LOOP:
|
||||
for j := 0; j < packetCount; j++ {
|
||||
_packet := _matcher.Packet(matchCtx, j)
|
||||
|
||||
if err := conn.SetWriteDeadline(time.Now().Add(1 * time.Second)); nil != err {
|
||||
if err := conn.SetWriteDeadline(time.Now().Add(deadline)); nil != err {
|
||||
return nil
|
||||
}
|
||||
_, err := conn.Write(_packet.Buffer)
|
||||
@@ -121,7 +125,7 @@ LOOP:
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := conn.SetReadDeadline(time.Now().Add(1 * time.Second)); nil != err {
|
||||
if err := conn.SetReadDeadline(time.Now().Add(deadline)); nil != err {
|
||||
return nil
|
||||
}
|
||||
n, err := conn.Read(buf)
|
||||
@@ -177,7 +181,7 @@ LOOP:
|
||||
for j := 0; j < packetCount; j++ {
|
||||
_packet := _matcher.Packet(matchCtx, j)
|
||||
|
||||
if err := conn.SetWriteDeadline(time.Now().Add(1 * time.Second)); nil != err {
|
||||
if err := conn.SetWriteDeadline(time.Now().Add(deadline)); nil != err {
|
||||
break INNER_LOOP
|
||||
}
|
||||
_, err := conn.Write(_packet.Buffer)
|
||||
@@ -185,7 +189,7 @@ LOOP:
|
||||
break INNER_LOOP
|
||||
}
|
||||
|
||||
if err := conn.SetReadDeadline(time.Now().Add(1 * time.Second)); nil != err {
|
||||
if err := conn.SetReadDeadline(time.Now().Add(deadline)); nil != err {
|
||||
break INNER_LOOP
|
||||
}
|
||||
n, err := conn.Read(buf)
|
||||
|
||||
Reference in New Issue
Block a user