overflow_discovery/commons/pcap/pcap.go
crusader d7f3ea3268 ing
2017-11-18 19:49:58 +09:00

59 lines
942 B
Go

package pcap
import (
"sync"
"time"
"git.loafle.net/overflow/overflow_discovery/api/module/discovery/model"
)
var mtx sync.Mutex
var instances map[string]PCapScanner
func init() {
instances = make(map[string]PCapScanner, 0)
}
func RetainScanner(zone *model.Zone) (PCapScanner, error) {
mtx.Lock()
defer mtx.Unlock()
var ps PCapScanner
var ok bool
if ps, ok = instances[zone.Network]; !ok {
ps = newPCapScanner(zone)
if err := ps.start(); nil != err {
return nil, err
}
instances[zone.Network] = ps
}
ps.retain()
return ps, nil
}
func ReleaseScanner(zone *model.Zone) {
mtx.Lock()
defer mtx.Unlock()
if ps, ok := instances[zone.Network]; ok {
go func() {
time.Sleep(2 * time.Second)
if ps.release() {
ps.stop()
delete(instances, zone.Network)
}
}()
}
}
func ReleaseScannerAll() {
mtx.Lock()
defer mtx.Unlock()
for k, ps := range instances {
ps.stop()
delete(instances, k)
}
}