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  }