github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/fanal/analyzer/os/ubuntu/ubuntu.go (about) 1 package ubuntu 2 3 import ( 4 "bufio" 5 "context" 6 "os" 7 "strings" 8 9 "golang.org/x/exp/slices" 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 ) 16 17 func init() { 18 analyzer.RegisterAnalyzer(&ubuntuOSAnalyzer{}) 19 } 20 21 const ( 22 version = 1 23 ubuntuConfFilePath = "etc/lsb-release" 24 ) 25 26 var requiredFiles = []string{ 27 ubuntuConfFilePath, 28 } 29 30 type ubuntuOSAnalyzer struct{} 31 32 func (a ubuntuOSAnalyzer) Analyze(_ context.Context, input analyzer.AnalysisInput) (*analyzer.AnalysisResult, error) { 33 isUbuntu := false 34 scanner := bufio.NewScanner(input.Content) 35 for scanner.Scan() { 36 line := scanner.Text() 37 if line == "DISTRIB_ID=Ubuntu" { 38 isUbuntu = true 39 continue 40 } 41 42 if isUbuntu && strings.HasPrefix(line, "DISTRIB_RELEASE=") { 43 return &analyzer.AnalysisResult{ 44 OS: types.OS{ 45 Family: types.Ubuntu, 46 Name: strings.TrimSpace(line[16:]), 47 }, 48 }, nil 49 } 50 } 51 return nil, xerrors.Errorf("ubuntu: %w", fos.AnalyzeOSError) 52 } 53 54 func (a ubuntuOSAnalyzer) Required(filePath string, _ os.FileInfo) bool { 55 return slices.Contains(requiredFiles, filePath) 56 } 57 58 func (a ubuntuOSAnalyzer) Type() analyzer.Type { 59 return analyzer.TypeUbuntu 60 } 61 62 func (a ubuntuOSAnalyzer) Version() int { 63 return version 64 }