-
Notifications
You must be signed in to change notification settings - Fork 80
/
libvuln.go
74 lines (59 loc) · 1.82 KB
/
libvuln.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package libvuln
import (
"context"
"github.com/jmoiron/sqlx"
"github.com/quay/claircore"
"github.com/quay/claircore/internal/vulnscanner"
"github.com/quay/claircore/internal/vulnstore"
"github.com/quay/claircore/libvuln/driver"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
// Libvuln is an interface exporting the public methods of our library.
type Libvuln interface {
Scan(ctx context.Context, sr *claircore.IndexReport) (*claircore.VulnerabilityReport, error)
}
// libvuln implements the libvuln.Lubvuln interface
type libvuln struct {
store vulnstore.Store
db *sqlx.DB
matchers []driver.Matcher
killUpdaters context.CancelFunc
logger zerolog.Logger
}
// New creates a new instance of the Libvuln library
func New(ctx context.Context, opts *Opts) (Libvuln, error) {
logger := log.With().Str("component", "libvuln").Logger()
err := opts.Parse()
if err != nil {
return nil, err
}
logger.Info().Msgf("initializing store with pool size: %v ", opts.MaxConnPool)
db, vulnstore, err := initStore(ctx, opts)
if err != nil {
return nil, err
}
eC := make(chan error, 1024)
dC := make(chan context.CancelFunc, 1)
// block on updater initialization.
logger.Info().Msg("beginning updater initialization")
go initUpdaters(opts, db, vulnstore, dC, eC)
killUpdaters := <-dC
logger.Info().Msg("updaters initialized")
for err := range eC {
logger.Error().Msgf("error from updater: %v", err)
}
l := &libvuln{
store: vulnstore,
db: db,
matchers: opts.Matchers,
killUpdaters: killUpdaters,
logger: logger,
}
logger.Info().Msg("libvuln initialized")
return l, nil
}
func (l *libvuln) Scan(ctx context.Context, sr *claircore.IndexReport) (*claircore.VulnerabilityReport, error) {
vs := vulnscanner.New(l.store, l.matchers)
return vs.Scan(ctx, sr)
}