github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/commands/artifact/scanner.go (about) 1 package artifact 2 3 import ( 4 "context" 5 6 "golang.org/x/xerrors" 7 8 "github.com/devseccon/trivy/pkg/fanal/walker" 9 "github.com/devseccon/trivy/pkg/scanner" 10 ) 11 12 // imageStandaloneScanner initializes a container image scanner in standalone mode 13 // $ trivy image alpine:3.15 14 func imageStandaloneScanner(ctx context.Context, conf ScannerConfig) (scanner.Scanner, func(), error) { 15 s, cleanup, err := initializeImageScanner(ctx, conf.Target, conf.ArtifactCache, conf.LocalArtifactCache, 16 conf.ArtifactOption.ImageOption, conf.ArtifactOption) 17 if err != nil { 18 return scanner.Scanner{}, func() {}, xerrors.Errorf("unable to initialize an image scanner: %w", err) 19 } 20 return s, cleanup, nil 21 } 22 23 // archiveStandaloneScanner initializes an image archive scanner in standalone mode 24 // $ trivy image --input alpine.tar 25 func archiveStandaloneScanner(ctx context.Context, conf ScannerConfig) (scanner.Scanner, func(), error) { 26 s, err := initializeArchiveScanner(ctx, conf.Target, conf.ArtifactCache, conf.LocalArtifactCache, conf.ArtifactOption) 27 if err != nil { 28 return scanner.Scanner{}, func() {}, xerrors.Errorf("unable to initialize the archive scanner: %w", err) 29 } 30 return s, func() {}, nil 31 } 32 33 // imageRemoteScanner initializes a container image scanner in client/server mode 34 // $ trivy image --server localhost:4954 alpine:3.15 35 func imageRemoteScanner(ctx context.Context, conf ScannerConfig) ( 36 scanner.Scanner, func(), error) { 37 s, cleanup, err := initializeRemoteImageScanner(ctx, conf.Target, conf.ArtifactCache, conf.ServerOption, 38 conf.ArtifactOption.ImageOption, conf.ArtifactOption) 39 if err != nil { 40 return scanner.Scanner{}, nil, xerrors.Errorf("unable to initialize a remote image scanner: %w", err) 41 } 42 return s, cleanup, nil 43 } 44 45 // archiveRemoteScanner initializes an image archive scanner in client/server mode 46 // $ trivy image --server localhost:4954 --input alpine.tar 47 func archiveRemoteScanner(ctx context.Context, conf ScannerConfig) (scanner.Scanner, func(), error) { 48 // Scan tar file 49 s, err := initializeRemoteArchiveScanner(ctx, conf.Target, conf.ArtifactCache, conf.ServerOption, conf.ArtifactOption) 50 if err != nil { 51 return scanner.Scanner{}, nil, xerrors.Errorf("unable to initialize the remote archive scanner: %w", err) 52 } 53 return s, func() {}, nil 54 } 55 56 // filesystemStandaloneScanner initializes a filesystem scanner in standalone mode 57 func filesystemStandaloneScanner(ctx context.Context, conf ScannerConfig) (scanner.Scanner, func(), error) { 58 s, cleanup, err := initializeFilesystemScanner(ctx, conf.Target, conf.ArtifactCache, conf.LocalArtifactCache, conf.ArtifactOption) 59 if err != nil { 60 return scanner.Scanner{}, func() {}, xerrors.Errorf("unable to initialize a filesystem scanner: %w", err) 61 } 62 return s, cleanup, nil 63 } 64 65 // filesystemRemoteScanner initializes a filesystem scanner in client/server mode 66 func filesystemRemoteScanner(ctx context.Context, conf ScannerConfig) (scanner.Scanner, func(), error) { 67 s, cleanup, err := initializeRemoteFilesystemScanner(ctx, conf.Target, conf.ArtifactCache, conf.ServerOption, conf.ArtifactOption) 68 if err != nil { 69 return scanner.Scanner{}, func() {}, xerrors.Errorf("unable to initialize a remote filesystem scanner: %w", err) 70 } 71 return s, cleanup, nil 72 } 73 74 // repositoryStandaloneScanner initializes a repository scanner in standalone mode 75 func repositoryStandaloneScanner(ctx context.Context, conf ScannerConfig) (scanner.Scanner, func(), error) { 76 s, cleanup, err := initializeRepositoryScanner(ctx, conf.Target, conf.ArtifactCache, conf.LocalArtifactCache, conf.ArtifactOption) 77 if err != nil { 78 return scanner.Scanner{}, func() {}, xerrors.Errorf("unable to initialize a repository scanner: %w", err) 79 } 80 return s, cleanup, nil 81 } 82 83 // repositoryRemoteScanner initializes a repository scanner in client/server mode 84 func repositoryRemoteScanner(ctx context.Context, conf ScannerConfig) (scanner.Scanner, func(), error) { 85 s, cleanup, err := initializeRemoteRepositoryScanner(ctx, conf.Target, conf.ArtifactCache, conf.ServerOption, 86 conf.ArtifactOption) 87 if err != nil { 88 return scanner.Scanner{}, func() {}, xerrors.Errorf("unable to initialize a remote repository scanner: %w", err) 89 } 90 return s, cleanup, nil 91 } 92 93 // sbomStandaloneScanner initializes a SBOM scanner in standalone mode 94 func sbomStandaloneScanner(ctx context.Context, conf ScannerConfig) (scanner.Scanner, func(), error) { 95 s, cleanup, err := initializeSBOMScanner(ctx, conf.Target, conf.ArtifactCache, conf.LocalArtifactCache, conf.ArtifactOption) 96 if err != nil { 97 return scanner.Scanner{}, func() {}, xerrors.Errorf("unable to initialize a cycloneDX scanner: %w", err) 98 } 99 return s, cleanup, nil 100 } 101 102 // sbomRemoteScanner initializes a SBOM scanner in client/server mode 103 func sbomRemoteScanner(ctx context.Context, conf ScannerConfig) (scanner.Scanner, func(), error) { 104 s, cleanup, err := initializeRemoteSBOMScanner(ctx, conf.Target, conf.ArtifactCache, conf.ServerOption, conf.ArtifactOption) 105 if err != nil { 106 return scanner.Scanner{}, func() {}, xerrors.Errorf("unable to initialize a remote cycloneDX scanner: %w", err) 107 } 108 return s, cleanup, nil 109 } 110 111 // vmStandaloneScanner initializes a VM scanner in standalone mode 112 func vmStandaloneScanner(ctx context.Context, conf ScannerConfig) (scanner.Scanner, func(), error) { 113 // TODO: The walker should be initialized in initializeVMScanner after https://github.com/devseccon/trivy/pull/5180 114 w := walker.NewVM(conf.ArtifactOption.SkipFiles, conf.ArtifactOption.SkipDirs) 115 s, cleanup, err := initializeVMScanner(ctx, conf.Target, conf.ArtifactCache, conf.LocalArtifactCache, 116 w, conf.ArtifactOption) 117 if err != nil { 118 return scanner.Scanner{}, func() {}, xerrors.Errorf("unable to initialize a vm scanner: %w", err) 119 } 120 return s, cleanup, nil 121 } 122 123 // vmRemoteScanner initializes a VM scanner in client/server mode 124 func vmRemoteScanner(ctx context.Context, conf ScannerConfig) (scanner.Scanner, func(), error) { 125 // TODO: The walker should be initialized in initializeVMScanner after https://github.com/devseccon/trivy/pull/5180 126 w := walker.NewVM(conf.ArtifactOption.SkipFiles, conf.ArtifactOption.SkipDirs) 127 s, cleanup, err := initializeRemoteVMScanner(ctx, conf.Target, conf.ArtifactCache, w, conf.ServerOption, conf.ArtifactOption) 128 if err != nil { 129 return scanner.Scanner{}, func() {}, xerrors.Errorf("unable to initialize a remote vm scanner: %w", err) 130 } 131 return s, cleanup, nil 132 }