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 }