ing
This commit is contained in:
parent
f1fac395d5
commit
e07d0717a2
125
discovery/discovery.go
Normal file
125
discovery/discovery.go
Normal file
|
@ -0,0 +1,125 @@
|
||||||
|
package discovery
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"git.loafle.net/commons_go/logging"
|
||||||
|
"git.loafle.net/overflow/overflow_discovery/api/module/discovery/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
var discoverer *discovery
|
||||||
|
|
||||||
|
func DiscoveryInit() {
|
||||||
|
discoverer = &discovery{}
|
||||||
|
discoverer.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
func DiscoveryDestroy() {
|
||||||
|
discoverer.stop()
|
||||||
|
discoverer = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func DiscoverZone(dz *model.DiscoveryZone) {
|
||||||
|
discoverer.discoverZone(dz)
|
||||||
|
}
|
||||||
|
|
||||||
|
func DiscoverHost(dh *model.DiscoveryHost) {
|
||||||
|
discoverer.discoverHost(dh)
|
||||||
|
}
|
||||||
|
|
||||||
|
func DiscoverPort(dp *model.DiscoveryPort) {
|
||||||
|
discoverer.discoverPort(dp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func DiscoverService(ds *model.DiscoveryService) {
|
||||||
|
discoverer.discoverService(ds)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Stop() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
type discovery struct {
|
||||||
|
sendChan chan interface{}
|
||||||
|
errChan chan error
|
||||||
|
|
||||||
|
stopChan chan struct{}
|
||||||
|
stopWg sync.WaitGroup
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *discovery) start() {
|
||||||
|
if d.stopChan != nil {
|
||||||
|
panic("Discovery: discovery is already running. Stop it before starting it again")
|
||||||
|
}
|
||||||
|
|
||||||
|
d.stopChan = make(chan struct{})
|
||||||
|
d.sendChan = make(chan interface{})
|
||||||
|
d.errChan = make(chan error)
|
||||||
|
logging.Logger().Info(fmt.Sprintf("Discovery: discovery is started"))
|
||||||
|
|
||||||
|
d.stopWg.Add(1)
|
||||||
|
go handle(d)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *discovery) stop() {
|
||||||
|
if d.stopChan == nil {
|
||||||
|
panic("Discovery: discovery must be started before stopping it")
|
||||||
|
}
|
||||||
|
close(d.stopChan)
|
||||||
|
d.stopWg.Wait()
|
||||||
|
d.stopChan = nil
|
||||||
|
|
||||||
|
logging.Logger().Info(fmt.Sprintf("Discovery: discovery is stopped"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func handle(d *discovery) {
|
||||||
|
defer d.stopWg.Done()
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-d.stopChan:
|
||||||
|
return
|
||||||
|
case data := <-d.sendChan:
|
||||||
|
logging.Logger().Info(fmt.Sprintf("chan: %v", data))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *discovery) discoverZone(dz *model.DiscoveryZone) {
|
||||||
|
logging.Logger().Debug(fmt.Sprintf("Discovery: DiscoverZone is start"))
|
||||||
|
|
||||||
|
doneChan := make(chan struct{})
|
||||||
|
|
||||||
|
d.stopWg.Add(1)
|
||||||
|
defer d.stopWg.Done()
|
||||||
|
|
||||||
|
go scanZone(d, dz, doneChan)
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-d.stopChan:
|
||||||
|
<-doneChan
|
||||||
|
case <-doneChan:
|
||||||
|
logging.Logger().Debug(fmt.Sprintf("Discovery: DiscoverZone is complete"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *discovery) discoverHost(dh *model.DiscoveryHost) {
|
||||||
|
logging.Logger().Debug(fmt.Sprintf("DiscoverHost"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *discovery) discoverPort(dp *model.DiscoveryPort) {
|
||||||
|
logging.Logger().Debug(fmt.Sprintf("DiscoverPort"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *discovery) discoverService(ds *model.DiscoveryService) {
|
||||||
|
logging.Logger().Debug(fmt.Sprintf("DiscoverService"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *discovery) sendResult() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *discovery) sendError() {
|
||||||
|
|
||||||
|
}
|
6
discovery/host.go
Normal file
6
discovery/host.go
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
package discovery
|
||||||
|
|
||||||
|
import "git.loafle.net/overflow/overflow_discovery/api/module/discovery/model"
|
||||||
|
|
||||||
|
func scanHost(d *discovery, dh *model.DiscoveryHost, doneChan chan<- struct{}) {
|
||||||
|
}
|
|
@ -1,41 +1,14 @@
|
||||||
package net
|
package discovery
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"git.loafle.net/overflow/overflow_discovery/net/model"
|
"git.loafle.net/overflow/overflow_discovery/api/module/discovery/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ZoneScanner interface {
|
func scanZone(d *discovery, dz *model.DiscoveryZone, doneChan chan<- struct{}) {
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
type zoneScan struct {
|
|
||||||
config *DiscoveryZoneConfig
|
|
||||||
endChan chan bool
|
|
||||||
zoneChan chan *model.DiscoveryZone
|
|
||||||
logChan chan error
|
|
||||||
}
|
|
||||||
|
|
||||||
func newZoneScan(dzc *DiscoveryZoneConfig) *zoneScan {
|
|
||||||
zs := &zoneScan{
|
|
||||||
config: dzc,
|
|
||||||
endChan: make(chan bool),
|
|
||||||
zoneChan: make(chan *model.DiscoveryZone, 4),
|
|
||||||
logChan: make(chan error, 4),
|
|
||||||
}
|
|
||||||
return zs
|
|
||||||
}
|
|
||||||
|
|
||||||
func (zs *zoneScan) Close() {
|
|
||||||
close(zs.endChan)
|
|
||||||
close(zs.zoneChan)
|
|
||||||
close(zs.logChan)
|
|
||||||
}
|
|
||||||
|
|
||||||
func scanZone(zs *zoneScan) {
|
|
||||||
var err error
|
var err error
|
||||||
var ifaces []net.Interface
|
var ifaces []net.Interface
|
||||||
var addrs []net.Addr
|
var addrs []net.Addr
|
||||||
|
@ -50,7 +23,7 @@ func scanZone(zs *zoneScan) {
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if ifaces, err = net.Interfaces(); nil != err {
|
if ifaces, err = net.Interfaces(); nil != err {
|
||||||
zs.logChan <- err
|
d.errChan <- err
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,34 +32,34 @@ func scanZone(zs *zoneScan) {
|
||||||
for _, i := range ifaces {
|
for _, i := range ifaces {
|
||||||
|
|
||||||
if addrs, err = i.Addrs(); nil != err {
|
if addrs, err = i.Addrs(); nil != err {
|
||||||
zs.logChan <- err
|
d.errChan <- err
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, addr := range addrs {
|
for _, addr := range addrs {
|
||||||
|
|
||||||
if _, ipnet, err = net.ParseCIDR(addr.String()); nil != err {
|
if _, ipnet, err = net.ParseCIDR(addr.String()); nil != err {
|
||||||
zs.logChan <- err
|
d.errChan <- err
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if ipnet.IP.IsLoopback() || checkSameZone(zones, ipnet) || checkExclude(zs.config.ExcludePatterns, i.Name) {
|
if ipnet.IP.IsLoopback() || checkSameZone(zones, ipnet) || checkExclude(dz.ExcludePatterns, i.Name) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
zones = append(zones, ipnet)
|
zones = append(zones, ipnet)
|
||||||
|
|
||||||
dz := &model.DiscoveryZone{
|
z := &model.Zone{
|
||||||
Network: ipnet.String(),
|
Network: ipnet.String(),
|
||||||
Iface: i.Name,
|
Iface: i.Name,
|
||||||
Mac: i.HardwareAddr.String(),
|
Mac: i.HardwareAddr.String(),
|
||||||
IP: strings.Split(addr.String(), "/")[0],
|
IP: strings.Split(addr.String(), "/")[0],
|
||||||
}
|
}
|
||||||
|
|
||||||
zs.zoneChan <- dz
|
d.sendChan <- z
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
zs.endChan <- true
|
doneChan <- struct{}{}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
package net
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.loafle.net/overflow/overflow_discovery/net/model"
|
|
||||||
)
|
|
||||||
|
|
||||||
type DiscoveryConfig struct {
|
|
||||||
ZoneConfig *DiscoveryZoneConfig
|
|
||||||
HostConfig *DiscoveryHostConfig
|
|
||||||
PortConfig *DiscoveryPortConfig
|
|
||||||
ServiceConfig *DiscoveryServiceConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
type DiscoveryZoneConfig struct {
|
|
||||||
ExcludePatterns []string `json:"excludePatterns"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type DiscoveryHostConfig struct {
|
|
||||||
DiscoveryZone model.DiscoveryZone
|
|
||||||
FirstScanRange int `json:"firstScanRange"`
|
|
||||||
LastScanRange int `json:"lastScanRange"`
|
|
||||||
ExcludeHosts []int `json:"excludeHosts"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type DiscoveryPortConfig struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
type DiscoveryServiceConfig struct {
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
package net
|
|
|
@ -1,16 +0,0 @@
|
||||||
package model
|
|
||||||
|
|
||||||
import "git.loafle.net/overflow/overflow_probe/model/timestamp"
|
|
||||||
|
|
||||||
type DiscoveryHost struct {
|
|
||||||
Zone *DiscoveryZone `json:"-"`
|
|
||||||
ID int `json:"id,omitempty"`
|
|
||||||
IP string `json:"ip"`
|
|
||||||
Mac string `json:"mac"`
|
|
||||||
|
|
||||||
Os string `json:"os,omitempty"`
|
|
||||||
Target bool `json:"target,omitempty"`
|
|
||||||
|
|
||||||
CreateDate timestamp.Timestamp `json:"createDate,omitempty"`
|
|
||||||
UpdateDate timestamp.Timestamp `json:"updateDate,omitempty"`
|
|
||||||
}
|
|
|
@ -1,4 +0,0 @@
|
||||||
package model
|
|
||||||
|
|
||||||
type DiscoveryNetwork struct {
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
package model
|
|
||||||
|
|
||||||
type DiscoveryZone struct {
|
|
||||||
ID int `json:"id,omitempty"`
|
|
||||||
Network string `json:"network"`
|
|
||||||
IP string `json:"ip"`
|
|
||||||
Iface string `json:"iface"`
|
|
||||||
Mac string `json:"mac"`
|
|
||||||
FirstScanRange int64 `json:"firstScanRange"`
|
|
||||||
LastScanRange int64 `json:"lastScanRange"`
|
|
||||||
}
|
|
53
net/net.go
53
net/net.go
|
@ -1,53 +0,0 @@
|
||||||
package net
|
|
||||||
|
|
||||||
type Discoverer interface {
|
|
||||||
}
|
|
||||||
|
|
||||||
type discovery struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewDiscoverer() Discoverer {
|
|
||||||
d := &discovery{}
|
|
||||||
|
|
||||||
return d
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *discovery) Discover() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *discovery) DiscoverZone(dzc *DiscoveryZoneConfig) {
|
|
||||||
zs := newZoneScan(dzc)
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
zs.Close()
|
|
||||||
}()
|
|
||||||
|
|
||||||
go scanZone(zs)
|
|
||||||
|
|
||||||
Loop:
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case zone := <-zs.zoneChan:
|
|
||||||
|
|
||||||
case err := <-zs.logChan:
|
|
||||||
|
|
||||||
case <-zs.endChan:
|
|
||||||
break Loop
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *discovery) DiscoverHost() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *discovery) DiscoverPort() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *discovery) DiscoverService() {
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
package net
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestScanZone(t *testing.T) {
|
|
||||||
dzc := &DiscoveryZoneConfig{
|
|
||||||
ExcludePatterns: []string{`^br-`, `^docker`},
|
|
||||||
}
|
|
||||||
zs := newZoneScan(dzc)
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
zs.Close()
|
|
||||||
}()
|
|
||||||
|
|
||||||
go scanZone(zs)
|
|
||||||
|
|
||||||
Loop:
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case zone := <-zs.zoneChan:
|
|
||||||
|
|
||||||
t.Logf("zone: %v", zone)
|
|
||||||
case err := <-zs.logChan:
|
|
||||||
t.Logf("log: %v", err)
|
|
||||||
case <-zs.endChan:
|
|
||||||
break Loop
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -2,6 +2,7 @@ package rpc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.loafle.net/overflow/overflow_discovery/api/module/discovery/model"
|
"git.loafle.net/overflow/overflow_discovery/api/module/discovery/model"
|
||||||
|
"git.loafle.net/overflow/overflow_discovery/discovery"
|
||||||
)
|
)
|
||||||
|
|
||||||
type DiscoveryService struct {
|
type DiscoveryService struct {
|
||||||
|
@ -9,6 +10,8 @@ type DiscoveryService struct {
|
||||||
|
|
||||||
func (ds *DiscoveryService) DiscoverZone(dz *model.DiscoveryZone) error {
|
func (ds *DiscoveryService) DiscoverZone(dz *model.DiscoveryZone) error {
|
||||||
|
|
||||||
|
discovery.DiscoverZone(dz)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"net"
|
"net"
|
||||||
|
|
||||||
"git.loafle.net/commons_go/logging"
|
"git.loafle.net/commons_go/logging"
|
||||||
|
"git.loafle.net/overflow/overflow_discovery/discovery"
|
||||||
|
|
||||||
crs "git.loafle.net/commons_go/rpc/server"
|
crs "git.loafle.net/commons_go/rpc/server"
|
||||||
"git.loafle.net/commons_go/server"
|
"git.loafle.net/commons_go/server"
|
||||||
|
@ -34,7 +35,7 @@ func (sh *ServerHandlers) Init() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sh *ServerHandlers) OnStart() {
|
func (sh *ServerHandlers) OnStart() {
|
||||||
// no op
|
discovery.DiscoveryInit()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sh *ServerHandlers) OnConnect(conn net.Conn) (net.Conn, error) {
|
func (sh *ServerHandlers) OnConnect(conn net.Conn) (net.Conn, error) {
|
||||||
|
@ -73,7 +74,7 @@ func (sh *ServerHandlers) Handle(conn net.Conn, stopChan <-chan struct{}, doneCh
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sh *ServerHandlers) OnStop() {
|
func (sh *ServerHandlers) OnStop() {
|
||||||
// no op
|
discovery.DiscoveryDestroy()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sh *ServerHandlers) Validate() {
|
func (sh *ServerHandlers) Validate() {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user