ing
This commit is contained in:
parent
4868d241cc
commit
337f493251
|
@ -73,6 +73,8 @@ type ofDiscoverySession struct {
|
||||||
discoverService *omd.DiscoverService
|
discoverService *omd.DiscoverService
|
||||||
|
|
||||||
targetHosts []net.IP
|
targetHosts []net.IP
|
||||||
|
targetHostAddresses map[string]bool
|
||||||
|
targetPortNumbers map[int]bool
|
||||||
|
|
||||||
discoveryDelegator chan<- interface{}
|
discoveryDelegator chan<- interface{}
|
||||||
|
|
||||||
|
@ -95,6 +97,9 @@ func (ds *ofDiscoverySession) init(request types.DiscoveryRequest) {
|
||||||
ds.discoverService = nil
|
ds.discoverService = nil
|
||||||
ds.pCapScanner = nil
|
ds.pCapScanner = nil
|
||||||
|
|
||||||
|
ds.targetHosts = nil
|
||||||
|
ds.targetHostAddresses = nil
|
||||||
|
ds.targetPortNumbers = nil
|
||||||
ds.hosts = make(map[string]*omd.Host)
|
ds.hosts = make(map[string]*omd.Host)
|
||||||
ds.includeMachosts = make(map[string]*omd.Host)
|
ds.includeMachosts = make(map[string]*omd.Host)
|
||||||
ds.ports = make(map[*omd.Host]map[json.Number]map[string]*omd.Port)
|
ds.ports = make(map[*omd.Host]map[json.Number]map[string]*omd.Port)
|
||||||
|
@ -118,25 +123,21 @@ func (ds *ofDiscoverySession) InitWithRequest(request types.DiscoveryRequest) er
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("Zone of parameter is not valid")
|
return fmt.Errorf("Zone of parameter is not valid")
|
||||||
}
|
}
|
||||||
|
ds.setZone(zone)
|
||||||
|
|
||||||
discoverHost, ok := params[1].(*omd.DiscoverHost)
|
discoverHost, ok := params[1].(*omd.DiscoverHost)
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("DiscoverHost of parameter is not valid")
|
return fmt.Errorf("DiscoverHost of parameter is not valid")
|
||||||
}
|
}
|
||||||
|
if err := ds.setDiscoverHost(discoverHost); nil != err {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
if nil == discoverHost.DiscoveryConfig {
|
if nil == discoverHost.DiscoveryConfig {
|
||||||
return fmt.Errorf("DiscoveryConfig of parameter is not valid")
|
return fmt.Errorf("DiscoveryConfig of parameter is not valid")
|
||||||
}
|
}
|
||||||
|
|
||||||
if ts, err := ds.getTargetHosts(zone, discoverHost); nil != err {
|
|
||||||
return err
|
|
||||||
} else {
|
|
||||||
ds.targetHosts = ts
|
|
||||||
}
|
|
||||||
|
|
||||||
ds.discoveryConfig = discoverHost.DiscoveryConfig
|
ds.discoveryConfig = discoverHost.DiscoveryConfig
|
||||||
ds.setZone(zone)
|
|
||||||
ds.setDiscoverHost(discoverHost)
|
|
||||||
case types.DiscoveryRequestTypePort:
|
case types.DiscoveryRequestTypePort:
|
||||||
if nil == params || 2 != len(params) {
|
if nil == params || 2 != len(params) {
|
||||||
return fmt.Errorf("Parameter is not valid")
|
return fmt.Errorf("Parameter is not valid")
|
||||||
|
@ -146,19 +147,21 @@ func (ds *ofDiscoverySession) InitWithRequest(request types.DiscoveryRequest) er
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("Host of parameter is not valid")
|
return fmt.Errorf("Host of parameter is not valid")
|
||||||
}
|
}
|
||||||
|
ds.setHost(host)
|
||||||
|
|
||||||
discoverPort, ok := params[1].(*omd.DiscoverPort)
|
discoverPort, ok := params[1].(*omd.DiscoverPort)
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("DiscoverPort of parameter is not valid")
|
return fmt.Errorf("DiscoverPort of parameter is not valid")
|
||||||
}
|
}
|
||||||
|
if err := ds.setDiscoverPort(discoverPort); nil != err {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
if nil == discoverPort.DiscoveryConfig {
|
if nil == discoverPort.DiscoveryConfig {
|
||||||
return fmt.Errorf("DiscoveryConfig of parameter is not valid")
|
return fmt.Errorf("DiscoveryConfig of parameter is not valid")
|
||||||
}
|
}
|
||||||
|
|
||||||
ds.discoveryConfig = discoverPort.DiscoveryConfig
|
ds.discoveryConfig = discoverPort.DiscoveryConfig
|
||||||
ds.setHost(host)
|
|
||||||
ds.setDiscoverPort(discoverPort)
|
|
||||||
case types.DiscoveryRequestTypeService:
|
case types.DiscoveryRequestTypeService:
|
||||||
if nil == params || 2 != len(params) {
|
if nil == params || 2 != len(params) {
|
||||||
return fmt.Errorf("Parameter is not valid")
|
return fmt.Errorf("Parameter is not valid")
|
||||||
|
@ -168,19 +171,20 @@ func (ds *ofDiscoverySession) InitWithRequest(request types.DiscoveryRequest) er
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("Port of parameter is not valid")
|
return fmt.Errorf("Port of parameter is not valid")
|
||||||
}
|
}
|
||||||
|
ds.setPort(port)
|
||||||
|
|
||||||
discoverService, ok := params[1].(*omd.DiscoverService)
|
discoverService, ok := params[1].(*omd.DiscoverService)
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("DiscoverService of parameter is not valid")
|
return fmt.Errorf("DiscoverService of parameter is not valid")
|
||||||
}
|
}
|
||||||
|
if err := ds.setDiscoverService(discoverService); nil != err {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
if nil == discoverService.DiscoveryConfig {
|
if nil == discoverService.DiscoveryConfig {
|
||||||
return fmt.Errorf("DiscoveryConfig of parameter is not valid")
|
return fmt.Errorf("DiscoveryConfig of parameter is not valid")
|
||||||
}
|
}
|
||||||
|
|
||||||
ds.discoveryConfig = discoverService.DiscoveryConfig
|
ds.discoveryConfig = discoverService.DiscoveryConfig
|
||||||
ds.setPort(port)
|
|
||||||
ds.setDiscoverService(discoverService)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_pCapScanner := pcap.NewPCapScanner(ds.zone)
|
_pCapScanner := pcap.NewPCapScanner(ds.zone)
|
||||||
|
@ -236,16 +240,19 @@ func (ds *ofDiscoverySession) TargetHosts() []net.IP {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ds *ofDiscoverySession) IsTargetHost(host *omd.Host) bool {
|
func (ds *ofDiscoverySession) IsTargetHost(host *omd.Host) bool {
|
||||||
for _, targetHost := range ds.targetHosts {
|
if nil == ds.targetHostAddresses {
|
||||||
if targetHost.String() == host.Address {
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := ds.targetHostAddresses[host.Address]; ok {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ds *ofDiscoverySession) IsTargetPort(port *omd.Port) bool {
|
func (ds *ofDiscoverySession) IsTargetPort(port *omd.Port) bool {
|
||||||
if nil == ds.discoverPort {
|
if nil == ds.targetPortNumbers || 0 == len(ds.targetPortNumbers) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,19 +265,11 @@ func (ds *ofDiscoverySession) IsTargetPort(port *omd.Port) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if nil != ds.discoverPort.ExcludePorts {
|
if _, ok := ds.targetPortNumbers[portNumber]; ok {
|
||||||
for _, exPortNumber := range ds.discoverPort.ExcludePorts {
|
|
||||||
if portNumber == exPortNumber {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if portNumber < ds.discoverPort.FirstScanRange || portNumber > ds.discoverPort.LastScanRange {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ds *ofDiscoverySession) IsTargetService(service *omd.Service) bool {
|
func (ds *ofDiscoverySession) IsTargetService(service *omd.Service) bool {
|
||||||
|
@ -278,6 +277,10 @@ func (ds *ofDiscoverySession) IsTargetService(service *omd.Service) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !ds.IsTargetPort(service.Port) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -820,50 +823,61 @@ func (ds *ofDiscoverySession) setPort(port *omd.Port) {
|
||||||
ds.port = port
|
ds.port = port
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ds *ofDiscoverySession) setDiscoverHost(discoverHost *omd.DiscoverHost) {
|
func (ds *ofDiscoverySession) setDiscoverHost(discoverHost *omd.DiscoverHost) error {
|
||||||
if nil == discoverHost {
|
if nil == discoverHost {
|
||||||
return
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := ds.setTargetHosts(ds.zone, discoverHost); nil != err {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
ds.discoverHost = discoverHost
|
ds.discoverHost = discoverHost
|
||||||
ds.setDiscoverPort(discoverHost.DiscoverPort)
|
|
||||||
|
return ds.setDiscoverPort(discoverHost.DiscoverPort)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ds *ofDiscoverySession) setDiscoverPort(discoverPort *omd.DiscoverPort) {
|
func (ds *ofDiscoverySession) setDiscoverPort(discoverPort *omd.DiscoverPort) error {
|
||||||
if nil == discoverPort {
|
if nil == discoverPort {
|
||||||
return
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := ds.setTargetPortNumbers(discoverPort); nil != err {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
ds.discoverPort = discoverPort
|
ds.discoverPort = discoverPort
|
||||||
ds.setDiscoverService(discoverPort.DiscoverService)
|
return ds.setDiscoverService(discoverPort.DiscoverService)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ds *ofDiscoverySession) setDiscoverService(discoverService *omd.DiscoverService) {
|
func (ds *ofDiscoverySession) setDiscoverService(discoverService *omd.DiscoverService) error {
|
||||||
if nil == discoverService {
|
if nil == discoverService {
|
||||||
return
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
ds.discoverService = discoverService
|
ds.discoverService = discoverService
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ds *ofDiscoverySession) getTargetHosts(zone *omd.Zone, discoverHost *omd.DiscoverHost) ([]net.IP, error) {
|
func (ds *ofDiscoverySession) setTargetHosts(zone *omd.Zone, discoverHost *omd.DiscoverHost) error {
|
||||||
cr, err := ounc.NewCIDRRanger(zone.Network)
|
cr, err := ounc.NewCIDRRanger(zone.Network)
|
||||||
if nil != err {
|
if nil != err {
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var firstIP net.IP
|
var firstIP net.IP
|
||||||
if "" != discoverHost.FirstScanRange {
|
if "" != discoverHost.FirstScanRange {
|
||||||
firstIP = net.ParseIP(discoverHost.FirstScanRange)
|
firstIP = net.ParseIP(discoverHost.FirstScanRange)
|
||||||
if nil == firstIP {
|
if nil == firstIP {
|
||||||
return nil, fmt.Errorf("IP(%v) of FirstScanRange host is not valid", firstIP)
|
return fmt.Errorf("IP(%v) of FirstScanRange host is not valid", firstIP)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var lastIP net.IP
|
var lastIP net.IP
|
||||||
if "" != discoverHost.LastScanRange {
|
if "" != discoverHost.LastScanRange {
|
||||||
lastIP = net.ParseIP(discoverHost.LastScanRange)
|
lastIP = net.ParseIP(discoverHost.LastScanRange)
|
||||||
if nil == lastIP {
|
if nil == lastIP {
|
||||||
return nil, fmt.Errorf("IP(%v) of LastScanRange host is not valid", lastIP)
|
return fmt.Errorf("IP(%v) of LastScanRange host is not valid", lastIP)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -871,7 +885,7 @@ func (ds *ofDiscoverySession) getTargetHosts(zone *omd.Zone, discoverHost *omd.D
|
||||||
for _, iHost := range discoverHost.IncludeHosts {
|
for _, iHost := range discoverHost.IncludeHosts {
|
||||||
iIP := net.ParseIP(iHost)
|
iIP := net.ParseIP(iHost)
|
||||||
if nil == iIP {
|
if nil == iIP {
|
||||||
return nil, fmt.Errorf("IP(%v) of include host is not valid", iHost)
|
return fmt.Errorf("IP(%v) of include host is not valid", iHost)
|
||||||
}
|
}
|
||||||
includeIPs = append(includeIPs, iIP)
|
includeIPs = append(includeIPs, iIP)
|
||||||
}
|
}
|
||||||
|
@ -880,17 +894,46 @@ func (ds *ofDiscoverySession) getTargetHosts(zone *omd.Zone, discoverHost *omd.D
|
||||||
for _, eHost := range discoverHost.ExcludeHosts {
|
for _, eHost := range discoverHost.ExcludeHosts {
|
||||||
eIP := net.ParseIP(eHost)
|
eIP := net.ParseIP(eHost)
|
||||||
if nil == eIP {
|
if nil == eIP {
|
||||||
return nil, fmt.Errorf("IP(%v) of exclude host is not valid", eHost)
|
return fmt.Errorf("IP(%v) of exclude host is not valid", eHost)
|
||||||
}
|
}
|
||||||
excludeIPs = append(excludeIPs, eIP)
|
excludeIPs = append(excludeIPs, eIP)
|
||||||
}
|
}
|
||||||
|
|
||||||
ranges, err := cr.Ranges(firstIP, lastIP, includeIPs, excludeIPs)
|
ranges, err := cr.Ranges(firstIP, lastIP, includeIPs, excludeIPs)
|
||||||
if nil != err {
|
if nil != err {
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return ranges, nil
|
ds.targetHosts = ranges
|
||||||
|
ds.targetHostAddresses = make(map[string]bool, len(ranges))
|
||||||
|
|
||||||
|
for _, ip := range ranges {
|
||||||
|
ds.targetHostAddresses[ip.String()] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ds *ofDiscoverySession) setTargetPortNumbers(discoverPort *omd.DiscoverPort) error {
|
||||||
|
if nil == discoverPort {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ds.targetPortNumbers = make(map[int]bool, 0)
|
||||||
|
|
||||||
|
LOOP:
|
||||||
|
for portNumber := discoverPort.FirstScanRange; portNumber < discoverPort.LastScanRange; portNumber++ {
|
||||||
|
if nil != discoverPort.ExcludePorts {
|
||||||
|
for _, exPortNumber := range discoverPort.ExcludePorts {
|
||||||
|
if portNumber == exPortNumber {
|
||||||
|
continue LOOP
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ds.targetPortNumbers[portNumber] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var discoverySessionPool sync.Pool
|
var discoverySessionPool sync.Pool
|
||||||
|
@ -927,6 +970,8 @@ func ReleaseDiscoverySession(ds *ofDiscoverySession) {
|
||||||
ds.discoverService = nil
|
ds.discoverService = nil
|
||||||
|
|
||||||
ds.targetHosts = nil
|
ds.targetHosts = nil
|
||||||
|
ds.targetHostAddresses = nil
|
||||||
|
ds.targetPortNumbers = nil
|
||||||
|
|
||||||
ds.discoveryDelegator = nil
|
ds.discoveryDelegator = nil
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user