github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/scanner/ospkg/scan.go (about)

     1  package ospkg
     2  
     3  import (
     4  	"fmt"
     5  	"sort"
     6  	"time"
     7  
     8  	"golang.org/x/xerrors"
     9  
    10  	ospkgDetector "github.com/devseccon/trivy/pkg/detector/ospkg"
    11  	"github.com/devseccon/trivy/pkg/log"
    12  	"github.com/devseccon/trivy/pkg/types"
    13  )
    14  
    15  type Scanner interface {
    16  	Packages(target types.ScanTarget, options types.ScanOptions) types.Result
    17  	Scan(target types.ScanTarget, options types.ScanOptions) (types.Result, bool, error)
    18  }
    19  
    20  type scanner struct{}
    21  
    22  func NewScanner() Scanner {
    23  	return &scanner{}
    24  }
    25  
    26  func (s *scanner) Packages(target types.ScanTarget, _ types.ScanOptions) types.Result {
    27  	if len(target.Packages) == 0 || !target.OS.Detected() {
    28  		return types.Result{}
    29  	}
    30  
    31  	sort.Sort(target.Packages)
    32  	return types.Result{
    33  		Target:   fmt.Sprintf("%s (%s %s)", target.Name, target.OS.Family, target.OS.Name),
    34  		Class:    types.ClassOSPkg,
    35  		Type:     target.OS.Family,
    36  		Packages: target.Packages,
    37  	}
    38  }
    39  
    40  func (s *scanner) Scan(target types.ScanTarget, _ types.ScanOptions) (types.Result, bool, error) {
    41  	if !target.OS.Detected() {
    42  		log.Logger.Debug("Detected OS: unknown")
    43  		return types.Result{}, false, nil
    44  	}
    45  	log.Logger.Infof("Detected OS: %s", target.OS.Family)
    46  
    47  	if target.OS.Extended {
    48  		// TODO: move the logic to each detector
    49  		target.OS.Name += "-ESM"
    50  	}
    51  
    52  	vulns, eosl, err := ospkgDetector.Detect("", target.OS.Family, target.OS.Name, target.Repository, time.Time{},
    53  		target.Packages)
    54  	if err == ospkgDetector.ErrUnsupportedOS {
    55  		return types.Result{}, false, nil
    56  	} else if err != nil {
    57  		return types.Result{}, false, xerrors.Errorf("failed vulnerability detection of OS packages: %w", err)
    58  	}
    59  
    60  	artifactDetail := fmt.Sprintf("%s (%s %s)", target.Name, target.OS.Family, target.OS.Name)
    61  	return types.Result{
    62  		Target:          artifactDetail,
    63  		Vulnerabilities: vulns,
    64  		Class:           types.ClassOSPkg,
    65  		Type:            target.OS.Family,
    66  	}, eosl, nil
    67  }