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  }