4
4
"context"
5
5
"fmt"
6
6
"io/fs"
7
- "sync"
8
7
9
8
"github.com/aquasecurity/trivy/pkg/iac/adapters/arm"
10
9
"github.com/aquasecurity/trivy/pkg/iac/rego"
@@ -13,7 +12,6 @@ import (
13
12
"github.com/aquasecurity/trivy/pkg/iac/scanners/azure"
14
13
"github.com/aquasecurity/trivy/pkg/iac/scanners/azure/arm/parser"
15
14
"github.com/aquasecurity/trivy/pkg/iac/scanners/options"
16
- "github.com/aquasecurity/trivy/pkg/iac/state"
17
15
"github.com/aquasecurity/trivy/pkg/iac/types"
18
16
"github.com/aquasecurity/trivy/pkg/log"
19
17
)
@@ -22,16 +20,16 @@ var _ scanners.FSScanner = (*Scanner)(nil)
22
20
var _ options.ConfigurableScanner = (* Scanner )(nil )
23
21
24
22
type Scanner struct {
25
- mu sync.Mutex
26
- scannerOptions []options.ScannerOption
27
- logger * log.Logger
28
- regoScanner * rego.Scanner
23
+ * rego.RegoScannerProvider
24
+ opts []options.ScannerOption
25
+ logger * log.Logger
29
26
}
30
27
31
28
func New (opts ... options.ScannerOption ) * Scanner {
32
29
scanner := & Scanner {
33
- scannerOptions : opts ,
34
- logger : log .WithPrefix ("azure-arm" ),
30
+ RegoScannerProvider : rego .NewRegoScannerProvider (opts ... ),
31
+ opts : opts ,
32
+ logger : log .WithPrefix ("azure-arm" ),
35
33
}
36
34
for _ , opt := range opts {
37
35
opt (scanner )
@@ -43,29 +41,12 @@ func (s *Scanner) Name() string {
43
41
return "Azure ARM"
44
42
}
45
43
46
- func (s * Scanner ) initRegoScanner (srcFS fs.FS ) error {
47
- s .mu .Lock ()
48
- defer s .mu .Unlock ()
49
- if s .regoScanner != nil {
50
- return nil
51
- }
52
- regoScanner := rego .NewScanner (s .scannerOptions ... )
53
- if err := regoScanner .LoadPolicies (srcFS ); err != nil {
54
- return err
55
- }
56
- s .regoScanner = regoScanner
57
- return nil
58
- }
59
-
60
44
func (s * Scanner ) ScanFS (ctx context.Context , fsys fs.FS , dir string ) (scan.Results , error ) {
61
45
p := parser .New (fsys )
62
46
deployments , err := p .ParseFS (ctx , dir )
63
47
if err != nil {
64
48
return nil , err
65
49
}
66
- if err := s .initRegoScanner (fsys ); err != nil {
67
- return nil , err
68
- }
69
50
70
51
return s .scanDeployments (ctx , deployments , fsys )
71
52
}
@@ -87,20 +68,21 @@ func (s *Scanner) scanDeployments(ctx context.Context, deployments []azure.Deplo
87
68
}
88
69
89
70
func (s * Scanner ) scanDeployment (ctx context.Context , deployment azure.Deployment , fsys fs.FS ) (scan.Results , error ) {
90
- deploymentState := s . adaptDeployment (ctx , deployment )
71
+ state := arm . Adapt (ctx , deployment )
91
72
92
- results , err := s .regoScanner .ScanInput (ctx , types .SourceCloud , rego.Input {
73
+ rs , err := s .InitRegoScanner (fsys , s .opts )
74
+ if err != nil {
75
+ return nil , fmt .Errorf ("init rego scanner: %w" , err )
76
+ }
77
+
78
+ results , err := rs .ScanInput (ctx , types .SourceCloud , rego.Input {
93
79
Path : deployment .Metadata .Range ().GetFilename (),
94
80
FS : fsys ,
95
- Contents : deploymentState .ToRego (),
81
+ Contents : state .ToRego (),
96
82
})
97
83
if err != nil {
98
84
return nil , fmt .Errorf ("rego scan error: %w" , err )
99
85
}
100
86
101
87
return results , nil
102
88
}
103
-
104
- func (s * Scanner ) adaptDeployment (ctx context.Context , deployment azure.Deployment ) * state.State {
105
- return arm .Adapt (ctx , deployment )
106
- }
0 commit comments