@@ -9,8 +9,11 @@ import (
9
9
"strings"
10
10
"time"
11
11
12
+ "github.com/scylladb/go-set/strset"
13
+
12
14
"github.com/anchore/grype-db/internal/log"
13
15
"github.com/anchore/grype-db/internal/tarutil"
16
+ "github.com/anchore/grype-db/pkg/provider"
14
17
grypeDBLegacyDistribution "github.com/anchore/grype/grype/db/legacy/distribution"
15
18
v6 "github.com/anchore/grype/grype/db/v6"
16
19
v6Distribution "github.com/anchore/grype/grype/db/v6/distribution"
@@ -31,69 +34,34 @@ func packageDB(dbDir, overrideArchiveExtension string) error {
31
34
}
32
35
log .WithFields ("from" , dbDir , "extension" , extension ).Info ("packaging database" )
33
36
34
- tarPath , err := calculateTarPath (dbDir , extension )
35
- if err != nil {
36
- return err
37
- }
38
-
39
- if err := populateTar (tarPath ); err != nil {
40
- return err
41
- }
42
-
43
- log .WithFields ("path" , tarPath ).Info ("created database archive" )
44
-
45
- return writeLatestDocument (tarPath )
46
- }
47
-
48
- func resolveExtension (overrideArchiveExtension string ) (string , error ) {
49
- var extension = "tar.zst"
50
-
51
- if overrideArchiveExtension != "" {
52
- extension = strings .TrimLeft (overrideArchiveExtension , "." )
53
- }
54
-
55
- var found bool
56
- for _ , valid := range []string {"tar.zst" , "tar.xz" , "tar.gz" } {
57
- if valid == extension {
58
- found = true
59
- break
60
- }
61
- }
62
-
63
- if ! found {
64
- return "" , fmt .Errorf ("unsupported archive extension %q" , extension )
65
- }
66
- return extension , nil
67
- }
68
-
69
- func calculateTarPath (dbDir string , extension string ) (string , error ) {
70
37
s , err := v6 .NewReader (v6.Config {DBDirPath : dbDir })
71
38
if err != nil {
72
- return "" , fmt .Errorf ("unable to open vulnerability store: %w" , err )
39
+ return fmt .Errorf ("unable to open vulnerability store: %w" , err )
73
40
}
74
41
75
42
metadata , err := s .GetDBMetadata ()
76
- if err != nil {
77
- return "" , fmt .Errorf ("unable to get vulnerability store metadata: %w" , err )
43
+ if err != nil || metadata == nil {
44
+ return fmt .Errorf ("unable to get vulnerability store metadata: %w" , err )
78
45
}
79
46
80
47
if metadata .Model != v6 .ModelVersion {
81
- return "" , fmt .Errorf ("metadata model %d does not match vulnerability store model %d" , v6 .ModelVersion , metadata .Model )
48
+ return fmt .Errorf ("metadata model %d does not match vulnerability store model %d" , v6 .ModelVersion , metadata .Model )
82
49
}
83
50
84
- providers , err := s .AllProviders ()
51
+ providerModels , err := s .AllProviders ()
85
52
if err != nil {
86
- return "" , fmt .Errorf ("unable to get all providers: %w" , err )
53
+ return fmt .Errorf ("unable to get all providers: %w" , err )
87
54
}
88
55
89
- if len (providers ) == 0 {
90
- return "" , fmt .Errorf ("no providers found in the vulnerability store" )
56
+ if len (providerModels ) == 0 {
57
+ return fmt .Errorf ("no providers found in the vulnerability store" )
91
58
}
92
59
93
- eldest := eldestProviderTimestamp ( providers )
94
- if eldest = = nil {
95
- return "" , errors . New ( "could not resolve eldest provider timestamp" )
60
+ eldest , err := toProviders ( providerModels ). EarliestTimestamp ( )
61
+ if err ! = nil {
62
+ return err
96
63
}
64
+
97
65
// output archive vulnerability-db_VERSION_OLDESTDATADATE_BUILTEPOCH.tar.gz, where:
98
66
// - VERSION: schema version in the form of v#.#.#
99
67
// - OLDESTDATADATE: RFC3338 formatted value of the oldest date capture date found for all contained providers
@@ -106,19 +74,51 @@ func calculateTarPath(dbDir string, extension string) (string, error) {
106
74
extension ,
107
75
)
108
76
109
- return filepath .Join (dbDir , tarName ), err
77
+ tarPath := filepath .Join (dbDir , tarName )
78
+
79
+ if err := populateTar (tarPath ); err != nil {
80
+ return err
81
+ }
82
+
83
+ log .WithFields ("path" , tarPath ).Info ("created database archive" )
84
+
85
+ return writeLatestDocument (tarPath , * metadata )
86
+ }
87
+
88
+ func toProviders (states []v6.Provider ) provider.States {
89
+ var result provider.States
90
+ for _ , state := range states {
91
+ result = append (result , provider.State {
92
+ Provider : state .ID ,
93
+ Timestamp : * state .DateCaptured ,
94
+ })
95
+ }
96
+ return result
110
97
}
111
98
112
- func eldestProviderTimestamp (providers []v6.Provider ) * time.Time {
113
- var eldest * time.Time
114
- for _ , p := range providers {
115
- if eldest == nil || p .DateCaptured .Before (* eldest ) {
116
- eldest = p .DateCaptured
99
+ func resolveExtension (overrideArchiveExtension string ) (string , error ) {
100
+ var extension = "tar.zst"
101
+
102
+ if overrideArchiveExtension != "" {
103
+ extension = strings .TrimLeft (overrideArchiveExtension , "." )
104
+ }
105
+
106
+ var found bool
107
+ for _ , valid := range []string {"tar.zst" , "tar.xz" , "tar.gz" } {
108
+ if valid == extension {
109
+ found = true
110
+ break
117
111
}
118
112
}
119
- return eldest
113
+
114
+ if ! found {
115
+ return "" , fmt .Errorf ("unsupported archive extension %q" , extension )
116
+ }
117
+ return extension , nil
120
118
}
121
119
120
+ var listingFiles = strset .New ("listing.json" , "latest.json" , "history.json" )
121
+
122
122
func populateTar (tarPath string ) error {
123
123
originalDir , err := os .Getwd ()
124
124
if err != nil {
@@ -146,7 +146,7 @@ func populateTar(tarPath string) error {
146
146
147
147
var files []string
148
148
for _ , fi := range fileInfos {
149
- if fi .Name () != "listing.json" && ! strings .Contains (fi .Name (), ".tar." ) {
149
+ if ! listingFiles . Has ( fi .Name ()) && ! strings .Contains (fi .Name (), ".tar." ) {
150
150
files = append (files , fi .Name ())
151
151
}
152
152
}
@@ -158,8 +158,8 @@ func populateTar(tarPath string) error {
158
158
return nil
159
159
}
160
160
161
- func writeLatestDocument (tarPath string ) error {
162
- archive , err := v6Distribution .NewArchive (tarPath )
161
+ func writeLatestDocument (tarPath string , metadata v6. DBMetadata ) error {
162
+ archive , err := v6Distribution .NewArchive (tarPath , * metadata . BuildTimestamp , metadata . Model , metadata . Revision , metadata . Addition )
163
163
if err != nil || archive == nil {
164
164
return fmt .Errorf ("unable to create archive: %w" , err )
165
165
}
0 commit comments