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  }