@@ -37,53 +37,58 @@ import (
3737
3838type ImageIndexResult struct {
3939 Input string
40- Image * v1.Image
4140 Sbom * types.Sbom
4241 Error error
4342}
4443
4544func indexImageAsync (wg * sync.WaitGroup , image string , cli command.Cli , resultChan chan <- ImageIndexResult ) {
4645 defer wg .Done ()
47- sbom , img , err := IndexImage (image , cli )
46+ sbom , err := IndexImage (image , cli )
4847 cves , err := query .QueryCves (sbom , "" , "" , "" )
4948 if err == nil {
5049 sbom .Vulnerabilities = * cves
5150 }
5251 resultChan <- ImageIndexResult {
5352 Input : image ,
54- Image : img ,
5553 Sbom : sbom ,
5654 Error : err ,
5755 }
5856}
5957
60- func IndexPath (path string , name string , cli command.Cli ) (* types.Sbom , * v1. Image , error ) {
58+ func IndexPath (path string , name string , cli command.Cli ) (* types.Sbom , error ) {
6159 cache , err := registry .ReadImage (name , path )
6260 if err != nil {
63- return nil , nil , errors .Wrap (err , "failed to read image" )
61+ return nil , errors .Wrap (err , "failed to read image" )
6462 }
6563 return indexImage (cache , cli )
6664}
6765
68- func IndexImage (image string , cli command.Cli ) (* types.Sbom , * v1.Image , error ) {
66+ func IndexImage (image string , cli command.Cli ) (* types.Sbom , error ) {
67+ if strings .HasPrefix (image , "sha256:" ) {
68+ configFilePath := cli .ConfigFile ().Filename
69+ sbomFilePath := filepath .Join (filepath .Dir (configFilePath ), "sbom" , "sha256" , image [7 :], "sbom.json" )
70+ if sbom := cachedSbom (sbomFilePath ); sbom != nil {
71+ return sbom , nil
72+ }
73+ }
6974 cache , err := registry .SaveImage (image , cli )
7075 if err != nil {
71- return nil , nil , errors .Wrap (err , "failed to copy image" )
76+ return nil , errors .Wrap (err , "failed to copy image" )
7277 }
7378 return indexImage (cache , cli )
7479}
7580
76- func indexImage (cache * registry.ImageCache , cli command.Cli ) (* types.Sbom , * v1. Image , error ) {
81+ func indexImage (cache * registry.ImageCache , cli command.Cli ) (* types.Sbom , error ) {
7782 configFilePath := cli .ConfigFile ().Filename
7883 sbomFilePath := filepath .Join (filepath .Dir (configFilePath ), "sbom" , "sha256" , cache .Digest [7 :], "sbom.json" )
79- if sbom := cachedSbom (cache , sbomFilePath ); sbom != nil {
80- return sbom , cache . Image , nil
84+ if sbom := cachedSbom (sbomFilePath ); sbom != nil {
85+ return sbom , nil
8186 }
8287
8388 err := cache .StoreImage ()
8489 defer cache .Cleanup ()
8590 if err != nil {
86- return nil , nil , errors .Wrapf (err , "failed to copy image" )
91+ return nil , errors .Wrapf (err , "failed to copy image" )
8792 }
8893
8994 lm := createLayerMapping (* cache .Image )
@@ -101,7 +106,7 @@ func indexImage(cache *registry.ImageCache, cli command.Cli) (*types.Sbom, *v1.I
101106 trivyResult .Packages , err = types .NormalizePackages (trivyResult .Packages )
102107 syftResult .Packages , err = types .NormalizePackages (syftResult .Packages )
103108 if err != nil {
104- return nil , nil , errors .Wrapf (err , "failed to normalize packagess: %s" , cache .Name )
109+ return nil , errors .Wrapf (err , "failed to normalize packagess: %s" , cache .Name )
105110 }
106111
107112 packages := types .MergePackages (syftResult , trivyResult )
@@ -119,7 +124,7 @@ func indexImage(cache *registry.ImageCache, cli command.Cli) (*types.Sbom, *v1.I
119124 if cache .Name != "" {
120125 ref , err := name .ParseReference (cache .Name )
121126 if err != nil {
122- return nil , nil , errors .Wrapf (err , "failed to parse reference: %s" , cache .Name )
127+ return nil , errors .Wrapf (err , "failed to parse reference: %s" , cache .Name )
123128 }
124129 cache .Name = ref .Context ().String ()
125130 if ! strings .HasPrefix (ref .Identifier (), "sha256:" ) {
@@ -162,18 +167,18 @@ func indexImage(cache *registry.ImageCache, cli command.Cli) (*types.Sbom, *v1.I
162167 if err == nil {
163168 err = os .MkdirAll (filepath .Dir (sbomFilePath ), os .ModePerm )
164169 if err != nil {
165- return nil , nil , errors .Wrapf (err , "failed create to sbom folder" )
170+ return nil , errors .Wrapf (err , "failed create to sbom folder" )
166171 }
167172 err = os .WriteFile (sbomFilePath , js , 0644 )
168173 if err != nil {
169- return nil , nil , errors .Wrapf (err , "failed to write sbom" )
174+ return nil , errors .Wrapf (err , "failed to write sbom" )
170175 }
171176 }
172177
173- return & sbom , cache . Image , nil
178+ return & sbom , nil
174179}
175180
176- func cachedSbom (cache * registry. ImageCache , sbomFilePath string ) * types.Sbom {
181+ func cachedSbom (sbomFilePath string ) * types.Sbom {
177182 // see if we can re-use an existing sbom
178183 if _ , ok := os .LookupEnv ("ATOMIST_NO_CACHE" ); ! ok {
179184 if _ , err := os .Stat (sbomFilePath ); ! os .IsNotExist (err ) {
0 commit comments