github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/fanal/analyzer/os/amazonlinux/amazonlinux.go (about) 1 package amazonlinux 2 3 import ( 4 "bufio" 5 "context" 6 "io" 7 "os" 8 "strings" 9 10 "golang.org/x/xerrors" 11 12 "github.com/devseccon/trivy/pkg/fanal/analyzer" 13 fos "github.com/devseccon/trivy/pkg/fanal/analyzer/os" 14 "github.com/devseccon/trivy/pkg/fanal/types" 15 "github.com/devseccon/trivy/pkg/fanal/utils" 16 ) 17 18 func init() { 19 analyzer.RegisterAnalyzer(&amazonlinuxOSAnalyzer{}) 20 } 21 22 const version = 1 23 24 var requiredFiles = []string{ 25 "etc/system-release", // for 1 and 2 versions 26 "usr/lib/system-release", // for 2022, 2023 version 27 } 28 29 type amazonlinuxOSAnalyzer struct{} 30 31 func (a amazonlinuxOSAnalyzer) Analyze(_ context.Context, input analyzer.AnalysisInput) (*analyzer.AnalysisResult, error) { 32 foundOS, err := a.parseRelease(input.Content) 33 if err != nil { 34 return nil, err 35 } 36 return &analyzer.AnalysisResult{ 37 OS: foundOS, 38 }, nil 39 } 40 41 func (a amazonlinuxOSAnalyzer) parseRelease(r io.Reader) (types.OS, error) { 42 scanner := bufio.NewScanner(r) 43 for scanner.Scan() { 44 line := scanner.Text() 45 fields := strings.Fields(line) 46 // Only Amazon Linux Prefix 47 if strings.HasPrefix(line, "Amazon Linux release 2") { 48 if len(fields) < 5 { 49 continue 50 } 51 return types.OS{ 52 Family: types.Amazon, 53 Name: strings.Join(fields[3:], " "), 54 }, nil 55 } else if strings.HasPrefix(line, "Amazon Linux") { 56 return types.OS{ 57 Family: types.Amazon, 58 Name: strings.Join(fields[2:], " "), 59 }, nil 60 } 61 } 62 return types.OS{}, xerrors.Errorf("amazon: %w", fos.AnalyzeOSError) 63 } 64 65 func (a amazonlinuxOSAnalyzer) Required(filePath string, _ os.FileInfo) bool { 66 return utils.StringInSlice(filePath, requiredFiles) 67 } 68 69 func (a amazonlinuxOSAnalyzer) Type() analyzer.Type { 70 return analyzer.TypeAmazon 71 } 72 73 func (a amazonlinuxOSAnalyzer) Version() int { 74 return version 75 }