Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sundowndev
GitHub Repository: sundowndev/phoneinfoga
Path: blob/master/lib/remote/remote.go
988 views
1
package remote
2
3
import (
4
"errors"
5
"github.com/sirupsen/logrus"
6
"github.com/sundowndev/phoneinfoga/v2/lib/filter"
7
"github.com/sundowndev/phoneinfoga/v2/lib/number"
8
"sync"
9
)
10
11
var mu sync.Locker = &sync.RWMutex{}
12
var plugins []Scanner
13
14
type Library struct {
15
m *sync.RWMutex
16
scanners []Scanner
17
results map[string]interface{}
18
errors map[string]error
19
filter filter.Filter
20
}
21
22
func NewLibrary(filterEngine filter.Filter) *Library {
23
return &Library{
24
m: &sync.RWMutex{},
25
scanners: []Scanner{},
26
results: map[string]interface{}{},
27
errors: map[string]error{},
28
filter: filterEngine,
29
}
30
}
31
32
func (r *Library) LoadPlugins() {
33
for _, s := range plugins {
34
r.AddScanner(s)
35
}
36
}
37
38
func (r *Library) AddScanner(s Scanner) {
39
if r.filter.Match(s.Name()) {
40
logrus.WithField("scanner", s.Name()).Debug("Scanner was ignored by filter")
41
return
42
}
43
r.scanners = append(r.scanners, s)
44
}
45
46
func (r *Library) addResult(k string, v interface{}) {
47
r.m.Lock()
48
defer r.m.Unlock()
49
r.results[k] = v
50
}
51
52
func (r *Library) addError(k string, err error) {
53
r.m.Lock()
54
defer r.m.Unlock()
55
r.errors[k] = err
56
}
57
58
func (r *Library) Scan(n *number.Number, opts ScannerOptions) (map[string]interface{}, map[string]error) {
59
var wg sync.WaitGroup
60
61
for _, s := range r.scanners {
62
wg.Add(1)
63
go func(s Scanner) {
64
defer wg.Done()
65
defer func() {
66
if err := recover(); err != nil {
67
logrus.WithField("scanner", s.Name()).WithField("error", err).Debug("Scanner panicked")
68
r.addError(s.Name(), errors.New("panic occurred while running scan, see debug logs"))
69
}
70
}()
71
72
if err := s.DryRun(*n, opts); err != nil {
73
logrus.
74
WithField("scanner", s.Name()).
75
WithField("reason", err.Error()).
76
Debug("Scanner was ignored because it should not run")
77
return
78
}
79
80
data, err := s.Run(*n, opts)
81
if err != nil {
82
r.addError(s.Name(), err)
83
return
84
}
85
if data != nil {
86
r.addResult(s.Name(), data)
87
}
88
}(s)
89
}
90
91
wg.Wait()
92
93
return r.results, r.errors
94
}
95
96
func (r *Library) GetAllScanners() []Scanner {
97
return r.scanners
98
}
99
100
func (r *Library) GetScanner(name string) Scanner {
101
r.m.RLock()
102
defer r.m.RUnlock()
103
for _, s := range r.scanners {
104
if s.Name() == name {
105
return s
106
}
107
}
108
return nil
109
}
110
111
func RegisterPlugin(s Scanner) {
112
mu.Lock()
113
defer mu.Unlock()
114
plugins = append(plugins, s)
115
}
116
117