Skip to content

Commit 7ef1e5f

Browse files
committed
Cache: Save only required files (fanal#51)
1 parent 94f9cf4 commit 7ef1e5f

File tree

17 files changed

+553
-168
lines changed

17 files changed

+553
-168
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ vendor
1717
cmd/fanal/fanal
1818
*.tar
1919
*.gz
20+
*.db

analyzer/analyzer.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,11 @@ import (
77
"io"
88
"os"
99

10-
"github.com/aquasecurity/fanal/utils"
11-
12-
"github.com/aquasecurity/fanal/types"
13-
14-
"golang.org/x/xerrors"
15-
1610
"github.com/aquasecurity/fanal/extractor"
11+
"github.com/aquasecurity/fanal/types"
12+
"github.com/aquasecurity/fanal/utils"
1713
godeptypes "github.com/aquasecurity/go-dep-parser/pkg/types"
14+
"golang.org/x/xerrors"
1815
)
1916

2017
var (

analyzer/analyzer_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"testing"
99

1010
"github.com/aquasecurity/fanal/extractor"
11-
1211
"github.com/stretchr/testify/assert"
1312
)
1413

@@ -93,6 +92,12 @@ func TestConfig_Analyze(t *testing.T) {
9392
},
9493
}
9594

95+
// cleanup global state from other tests
96+
commandAnalyzers = []CommandAnalyzer{}
97+
pkgAnalyzers = []PkgAnalyzer{}
98+
osAnalyzers = []OSAnalyzer{}
99+
libAnalyzers = []LibraryAnalyzer{}
100+
96101
for _, tc := range testCases {
97102
RegisterOSAnalyzer(mockOSAnalyzer{})
98103

cache/cache.go

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,25 @@
11
package cache
22

33
import (
4-
"io"
54
"os"
6-
"path/filepath"
7-
"strings"
85

96
"golang.org/x/xerrors"
107
)
118

12-
var (
13-
replacer = strings.NewReplacer("/", "_")
14-
)
15-
169
type Cache interface {
17-
Get(key string) io.Reader
18-
Set(key string, file io.Reader) (io.Reader, error)
1910
Clear() error
2011
}
2112

22-
type FSCache struct {
13+
type RealCache struct {
2314
Directory string
2415
}
2516

2617
func Initialize(cacheDir string) Cache {
27-
return &FSCache{Directory: cacheDir}
28-
}
29-
30-
func (fs FSCache) Get(key string) io.Reader {
31-
filePath := filepath.Join(fs.Directory, replacer.Replace(key))
32-
f, err := os.Open(filePath)
33-
if err != nil {
34-
return nil
35-
}
36-
return f
37-
}
38-
39-
func (fs FSCache) Set(key string, file io.Reader) (io.Reader, error) {
40-
filePath := filepath.Join(fs.Directory, replacer.Replace(key))
41-
if err := os.MkdirAll(fs.Directory, os.ModePerm); err != nil {
42-
return nil, xerrors.Errorf("failed to mkdir all: %w", err)
43-
}
44-
cacheFile, err := os.Create(filePath)
45-
if err != nil {
46-
return file, xerrors.Errorf("failed to create cache file: %w", err)
47-
}
48-
49-
tee := io.TeeReader(file, cacheFile)
50-
return tee, nil
18+
return &RealCache{Directory: cacheDir}
5119
}
5220

53-
func (fs FSCache) Clear() error {
54-
if err := os.RemoveAll(fs.Directory); err != nil {
21+
func (rc RealCache) Clear() error {
22+
if err := os.RemoveAll(rc.Directory); err != nil {
5523
return xerrors.New("failed to remove cache")
5624
}
5725
return nil

cache/cache_test.go

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,22 @@
11
package cache
22

33
import (
4-
"bytes"
54
"io/ioutil"
65
"os"
76
"testing"
87

98
"github.com/stretchr/testify/assert"
109
)
1110

12-
func TestSetAndGetAndClear(t *testing.T) {
13-
tempCacheDir, _ := ioutil.TempDir("", "TestCacheDir-*")
14-
f, _ := ioutil.TempFile(tempCacheDir, "foo.bar.baz-*")
15-
16-
c := Initialize(tempCacheDir)
17-
18-
// set
19-
expectedCacheContents := "foo bar baz"
20-
var buf bytes.Buffer
21-
buf.Write([]byte(expectedCacheContents))
22-
23-
r, err := c.Set(f.Name(), &buf)
24-
assert.NoError(t, err)
25-
26-
b, _ := ioutil.ReadAll(r)
27-
assert.Equal(t, expectedCacheContents, string(b))
28-
29-
// get
30-
actualFile := c.Get(f.Name())
31-
actualBytes, _ := ioutil.ReadAll(actualFile)
32-
assert.Equal(t, expectedCacheContents, string(actualBytes))
33-
34-
// clear
11+
func TestRealCache_Clear(t *testing.T) {
12+
d, _ := ioutil.TempDir("", "TestRealCache_Clear")
13+
c := Initialize(d)
3514
assert.NoError(t, c.Clear())
36-
37-
// confirm that no cachedir remains
38-
_, err = os.Stat(tempCacheDir)
15+
_, err := os.Stat(d)
3916
assert.True(t, os.IsNotExist(err))
17+
18+
t.Run("sad path, cache dir doesn't exist", func(t *testing.T) {
19+
c := Initialize(".")
20+
assert.Equal(t, "failed to remove cache", c.Clear().Error())
21+
})
4022
}

cmd/fanal/main.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import (
88
"os"
99
"time"
1010

11+
"github.com/aquasecurity/fanal/cache"
12+
"github.com/aquasecurity/fanal/utils"
13+
"golang.org/x/xerrors"
14+
1115
"github.com/aquasecurity/fanal/analyzer"
1216
_ "github.com/aquasecurity/fanal/analyzer/command/apk"
1317
_ "github.com/aquasecurity/fanal/analyzer/library/bundler"
@@ -25,13 +29,10 @@ import (
2529
_ "github.com/aquasecurity/fanal/analyzer/pkg/apk"
2630
_ "github.com/aquasecurity/fanal/analyzer/pkg/dpkg"
2731
_ "github.com/aquasecurity/fanal/analyzer/pkg/rpm"
28-
"github.com/aquasecurity/fanal/cache"
2932
"github.com/aquasecurity/fanal/extractor"
3033
"github.com/aquasecurity/fanal/extractor/docker"
3134
"github.com/aquasecurity/fanal/types"
32-
"github.com/aquasecurity/fanal/utils"
3335
"golang.org/x/crypto/ssh/terminal"
34-
"golang.org/x/xerrors"
3536
)
3637

3738
func main() {
@@ -46,11 +47,11 @@ func run() (err error) {
4647
clearCache := flag.Bool("clear", false, "clear cache")
4748
flag.Parse()
4849

49-
c := cache.Initialize(utils.CacheDir())
50+
c := cache.Initialize(utils.CacheDir() + "/cache.db")
5051

5152
if *clearCache {
5253
if err = c.Clear(); err != nil {
53-
return xerrors.Errorf("error in cache clear: %w", err)
54+
return xerrors.Errorf("%w", err)
5455
}
5556
}
5657

0 commit comments

Comments
 (0)