github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/fanal/analyzer/os/redhatbase/centos.go (about)

     1  package redhatbase
     2  
     3  import (
     4  	"bufio"
     5  	"context"
     6  	"os"
     7  	"strings"
     8  
     9  	"golang.org/x/xerrors"
    10  
    11  	"github.com/devseccon/trivy/pkg/fanal/analyzer"
    12  	fos "github.com/devseccon/trivy/pkg/fanal/analyzer/os"
    13  	"github.com/devseccon/trivy/pkg/fanal/types"
    14  	"github.com/devseccon/trivy/pkg/fanal/utils"
    15  )
    16  
    17  const centosAnalyzerVersion = 1
    18  
    19  func init() {
    20  	analyzer.RegisterAnalyzer(&centOSAnalyzer{})
    21  }
    22  
    23  type centOSAnalyzer struct{}
    24  
    25  func (a centOSAnalyzer) Analyze(_ context.Context, input analyzer.AnalysisInput) (*analyzer.AnalysisResult, error) {
    26  	scanner := bufio.NewScanner(input.Content)
    27  	for scanner.Scan() {
    28  		line := scanner.Text()
    29  		result := redhatRe.FindStringSubmatch(strings.TrimSpace(line))
    30  		if len(result) != 3 {
    31  			return nil, xerrors.New("centos: invalid centos-release")
    32  		}
    33  
    34  		switch strings.ToLower(result[1]) {
    35  		case "centos", "centos linux":
    36  			return &analyzer.AnalysisResult{
    37  				OS: types.OS{
    38  					Family: types.CentOS,
    39  					Name:   result[2],
    40  				},
    41  			}, nil
    42  		}
    43  	}
    44  
    45  	return nil, xerrors.Errorf("centos: %w", fos.AnalyzeOSError)
    46  }
    47  
    48  func (a centOSAnalyzer) Required(filePath string, _ os.FileInfo) bool {
    49  	return utils.StringInSlice(filePath, a.requiredFiles())
    50  }
    51  
    52  func (a centOSAnalyzer) requiredFiles() []string {
    53  	return []string{"etc/centos-release"}
    54  }
    55  
    56  func (a centOSAnalyzer) Type() analyzer.Type {
    57  	return analyzer.TypeCentOS
    58  }
    59  
    60  func (a centOSAnalyzer) Version() int {
    61  	return centosAnalyzerVersion
    62  }