github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/pkg/scanners/universal/scanner.go (about) 1 package universal 2 3 import ( 4 "context" 5 "io/fs" 6 7 "github.com/khulnasoft-lab/defsec/pkg/scanners/azure/arm" 8 "github.com/khulnasoft-lab/defsec/pkg/scanners/cloud/aws" 9 "github.com/khulnasoft-lab/defsec/pkg/scanners/helm" 10 "github.com/khulnasoft-lab/defsec/pkg/scanners/options" 11 "github.com/khulnasoft-lab/defsec/pkg/state" 12 13 "github.com/khulnasoft-lab/defsec/pkg/scanners/json" 14 "github.com/khulnasoft-lab/defsec/pkg/scanners/toml" 15 "github.com/khulnasoft-lab/defsec/pkg/scanners/yaml" 16 17 "github.com/khulnasoft-lab/defsec/pkg/scan" 18 19 "github.com/khulnasoft-lab/defsec/pkg/scanners" 20 "github.com/khulnasoft-lab/defsec/pkg/scanners/cloudformation" 21 "github.com/khulnasoft-lab/defsec/pkg/scanners/dockerfile" 22 "github.com/khulnasoft-lab/defsec/pkg/scanners/kubernetes" 23 "github.com/khulnasoft-lab/defsec/pkg/scanners/terraform" 24 ) 25 26 type nestableFSScanners interface { 27 scanners.FSScanner 28 options.ConfigurableScanner 29 } 30 31 type nestableAPIScanners interface { 32 scanners.APIScanner 33 options.ConfigurableScanner 34 } 35 36 var _ scanners.FSScanner = (*Scanner)(nil) 37 38 type Scanner struct { 39 fsScanners []nestableFSScanners 40 apiScanners []nestableAPIScanners 41 } 42 43 func New(opts ...options.ScannerOption) *Scanner { 44 s := &Scanner{ 45 fsScanners: []nestableFSScanners{ 46 terraform.New(opts...), 47 cloudformation.New(opts...), 48 dockerfile.NewScanner(opts...), 49 kubernetes.NewScanner(opts...), 50 json.NewScanner(opts...), 51 yaml.NewScanner(opts...), 52 toml.NewScanner(opts...), 53 helm.New(opts...), 54 arm.New(opts...), 55 }, 56 apiScanners: []nestableAPIScanners{ 57 aws.New(opts...), 58 }, 59 } 60 return s 61 } 62 63 func (s *Scanner) Name() string { 64 return "Universal" 65 } 66 67 func (s *Scanner) ScanFS(ctx context.Context, fs fs.FS, dir string) (scan.Results, error) { 68 var results scan.Results 69 for _, inner := range s.fsScanners { 70 innerResults, err := inner.ScanFS(ctx, fs, dir) 71 if err != nil { 72 return nil, err 73 } 74 results = append(results, innerResults...) 75 } 76 return results, nil 77 } 78 79 func (s *Scanner) Scan(ctx context.Context, cloud *state.State) (scan.Results, error) { 80 var results scan.Results 81 82 for _, inner := range s.apiScanners { 83 innerResults, err := inner.Scan(ctx, cloud) 84 if err != nil { 85 return nil, err 86 } 87 results = append(results, innerResults...) 88 } 89 return results, nil 90 }