github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/fanal/analyzer/os/mariner/mariner.go (about) 1 package mariner 2 3 import ( 4 "bufio" 5 "context" 6 "io" 7 "os" 8 "path/filepath" 9 "strings" 10 11 "golang.org/x/xerrors" 12 13 "github.com/devseccon/trivy/pkg/fanal/analyzer" 14 fos "github.com/devseccon/trivy/pkg/fanal/analyzer/os" 15 "github.com/devseccon/trivy/pkg/fanal/types" 16 ) 17 18 func init() { 19 analyzer.RegisterAnalyzer(&marinerOSAnalyzer{}) 20 } 21 22 const ( 23 version = 1 24 requiredFile = "etc/mariner-release" 25 ) 26 27 type marinerOSAnalyzer struct{} 28 29 func (a marinerOSAnalyzer) Analyze(_ context.Context, input analyzer.AnalysisInput) (*analyzer.AnalysisResult, error) { 30 foundOS, err := a.parseRelease(input.Content) 31 if err != nil { 32 return nil, xerrors.Errorf("release parse error: %w", err) 33 } 34 return &analyzer.AnalysisResult{ 35 OS: foundOS, 36 }, nil 37 } 38 39 func (a marinerOSAnalyzer) parseRelease(r io.Reader) (types.OS, error) { 40 scanner := bufio.NewScanner(r) 41 for scanner.Scan() { 42 line := scanner.Text() 43 fields := strings.Fields(line) 44 if len(fields) != 2 { 45 continue 46 } 47 if strings.EqualFold(fields[0], "cbl-mariner") { 48 return types.OS{ 49 Family: types.CBLMariner, 50 Name: fields[1], 51 }, nil 52 } 53 } 54 return types.OS{}, xerrors.Errorf("cbl-mariner: %w", fos.AnalyzeOSError) 55 } 56 57 func (a marinerOSAnalyzer) Required(filePath string, _ os.FileInfo) bool { 58 return filepath.ToSlash(filePath) == requiredFile 59 } 60 61 func (a marinerOSAnalyzer) Type() analyzer.Type { 62 return analyzer.TypeCBLMariner 63 } 64 65 func (a marinerOSAnalyzer) Version() int { 66 return version 67 }