Skip to content

Commit a2b995a

Browse files
authored
feat: skip files and dirs (fanal#284)
1 parent 12463ce commit a2b995a

File tree

23 files changed

+545
-306
lines changed

23 files changed

+545
-306
lines changed

analyzer/config/config.go

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,10 @@ type ScannerOption struct {
2828
}
2929

3030
func (o *ScannerOption) Sort() {
31-
sort.Slice(o.Namespaces, func(i, j int) bool {
32-
return o.Namespaces[i] < o.Namespaces[j]
33-
})
34-
sort.Slice(o.FilePatterns, func(i, j int) bool {
35-
return o.FilePatterns[i] < o.FilePatterns[j]
36-
})
37-
sort.Slice(o.PolicyPaths, func(i, j int) bool {
38-
return o.PolicyPaths[i] < o.PolicyPaths[j]
39-
})
40-
sort.Slice(o.DataPaths, func(i, j int) bool {
41-
return o.DataPaths[i] < o.DataPaths[j]
42-
})
31+
sort.Strings(o.Namespaces)
32+
sort.Strings(o.FilePatterns)
33+
sort.Strings(o.PolicyPaths)
34+
sort.Strings(o.DataPaths)
4335
}
4436

4537
func RegisterConfigAnalyzers(filePatterns []string) error {

artifact/artifact.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,28 @@ package artifact
22

33
import (
44
"context"
5+
"sort"
56

7+
"github.com/aquasecurity/fanal/analyzer"
8+
"github.com/aquasecurity/fanal/hook"
69
"github.com/aquasecurity/fanal/types"
710
)
811

12+
type Option struct {
13+
DisabledAnalyzers []analyzer.Type
14+
DisabledHooks []hook.Type
15+
SkipFiles []string
16+
SkipDirs []string
17+
}
18+
19+
func (o *Option) Sort() {
20+
sort.Slice(o.DisabledAnalyzers, func(i, j int) bool {
21+
return o.DisabledAnalyzers[i] < o.DisabledAnalyzers[j]
22+
})
23+
sort.Strings(o.SkipFiles)
24+
sort.Strings(o.SkipDirs)
25+
}
26+
927
type Artifact interface {
1028
Inspect(ctx context.Context) (reference types.ArtifactReference, err error)
1129
}

artifact/image/image.go

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -49,36 +49,41 @@ var (
4949
)
5050

5151
type Artifact struct {
52-
image types.Image
53-
cache cache.ArtifactCache
54-
analyzer analyzer.Analyzer
55-
hookManager hook.Manager
56-
scanner scanner.Scanner
52+
image types.Image
53+
cache cache.ArtifactCache
54+
walker walker.LayerTar
55+
analyzer analyzer.Analyzer
56+
hookManager hook.Manager
57+
scanner scanner.Scanner
58+
59+
artifactOption artifact.Option
5760
configScannerOption config.ScannerOption
5861
}
5962

60-
func NewArtifact(img types.Image, c cache.ArtifactCache, disabledAnalyzers []analyzer.Type, disabledHooks []hook.Type,
61-
opt config.ScannerOption) (artifact.Artifact, error) {
63+
func NewArtifact(img types.Image, c cache.ArtifactCache, artifactOpt artifact.Option, scannerOpt config.ScannerOption) (artifact.Artifact, error) {
6264
// Register config analyzers
63-
if err := config.RegisterConfigAnalyzers(opt.FilePatterns); err != nil {
65+
if err := config.RegisterConfigAnalyzers(scannerOpt.FilePatterns); err != nil {
6466
return nil, xerrors.Errorf("config scanner error: %w", err)
6567
}
6668

67-
s, err := scanner.New("", opt.Namespaces, opt.PolicyPaths, opt.DataPaths, opt.Trace)
69+
s, err := scanner.New("", scannerOpt.Namespaces, scannerOpt.PolicyPaths, scannerOpt.DataPaths, scannerOpt.Trace)
6870
if err != nil {
6971
return nil, xerrors.Errorf("scanner error: %w", err)
7072
}
7173

72-
disabledAnalyzers = append(disabledAnalyzers, defaultDisabledAnalyzers...)
73-
disabledHooks = append(disabledHooks, defaultDisabledHooks...)
74+
disabledAnalyzers := append(artifactOpt.DisabledAnalyzers, defaultDisabledAnalyzers...)
75+
disabledHooks := append(artifactOpt.DisabledHooks, defaultDisabledHooks...)
7476

7577
return Artifact{
76-
image: img,
77-
cache: c,
78-
analyzer: analyzer.NewAnalyzer(disabledAnalyzers),
79-
hookManager: hook.NewManager(disabledHooks),
80-
scanner: s,
81-
configScannerOption: opt,
78+
image: img,
79+
cache: c,
80+
walker: walker.NewLayerTar(artifactOpt.SkipFiles, artifactOpt.SkipDirs),
81+
analyzer: analyzer.NewAnalyzer(disabledAnalyzers),
82+
hookManager: hook.NewManager(disabledHooks),
83+
scanner: s,
84+
85+
artifactOption: artifactOpt,
86+
configScannerOption: scannerOpt,
8287
}, nil
8388
}
8489

@@ -142,7 +147,7 @@ func (a Artifact) Inspect(ctx context.Context) (types.ArtifactReference, error)
142147
func (a Artifact) calcCacheKeys(imageID string, diffIDs []string) (string, []string, map[string]string, error) {
143148

144149
// Pass an empty config scanner option so that the cache key can be the same, even when policies are updated.
145-
imageKey, err := cache.CalcKey(imageID, a.analyzer.ImageConfigAnalyzerVersions(), nil, &config.ScannerOption{})
150+
imageKey, err := cache.CalcKey(imageID, a.analyzer.ImageConfigAnalyzerVersions(), nil, artifact.Option{}, config.ScannerOption{})
146151
if err != nil {
147152
return "", nil, nil, err
148153
}
@@ -151,7 +156,7 @@ func (a Artifact) calcCacheKeys(imageID string, diffIDs []string) (string, []str
151156
hookVersions := a.hookManager.Versions()
152157
var layerKeys []string
153158
for _, diffID := range diffIDs {
154-
blobKey, err := cache.CalcKey(diffID, a.analyzer.AnalyzerVersions(), hookVersions, &a.configScannerOption)
159+
blobKey, err := cache.CalcKey(diffID, a.analyzer.AnalyzerVersions(), hookVersions, a.artifactOption, a.configScannerOption)
155160
if err != nil {
156161
return "", nil, nil, err
157162
}
@@ -218,7 +223,7 @@ func (a Artifact) inspectLayer(ctx context.Context, diffID string) (types.BlobIn
218223
result := new(analyzer.AnalysisResult)
219224
limit := semaphore.NewWeighted(parallel)
220225

221-
opqDirs, whFiles, err := walker.WalkLayerTar(r, func(filePath string, info os.FileInfo, opener analyzer.Opener) error {
226+
opqDirs, whFiles, err := a.walker.Walk(r, func(filePath string, info os.FileInfo, opener analyzer.Opener) error {
222227
if err = a.analyzer.AnalyzeFile(ctx, &wg, limit, result, "", filePath, info, opener); err != nil {
223228
return xerrors.Errorf("failed to analyze %s: %w", filePath, err)
224229
}

0 commit comments

Comments
 (0)