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

     1  package mariner
     2  
     3  import (
     4  	"bufio"
     5  	"context"
     6  	"io"
     7  	"os"
     8  	"path/filepath"
     9  	"strings"
    10  
    11  	"golang.org/x/xerrors"
    12  
    13  	"github.com/devseccon/trivy/pkg/fanal/analyzer"
    14  	fos "github.com/devseccon/trivy/pkg/fanal/analyzer/os"
    15  	"github.com/devseccon/trivy/pkg/fanal/types"
    16  )
    17  
    18  func init() {
    19  	analyzer.RegisterAnalyzer(&marinerOSAnalyzer{})
    20  }
    21  
    22  const (
    23  	version      = 1
    24  	requiredFile = "etc/mariner-release"
    25  )
    26  
    27  type marinerOSAnalyzer struct{}
    28  
    29  func (a marinerOSAnalyzer) Analyze(_ context.Context, input analyzer.AnalysisInput) (*analyzer.AnalysisResult, error) {
    30  	foundOS, err := a.parseRelease(input.Content)
    31  	if err != nil {
    32  		return nil, xerrors.Errorf("release parse error: %w", err)
    33  	}
    34  	return &analyzer.AnalysisResult{
    35  		OS: foundOS,
    36  	}, nil
    37  }
    38  
    39  func (a marinerOSAnalyzer) parseRelease(r io.Reader) (types.OS, error) {
    40  	scanner := bufio.NewScanner(r)
    41  	for scanner.Scan() {
    42  		line := scanner.Text()
    43  		fields := strings.Fields(line)
    44  		if len(fields) != 2 {
    45  			continue
    46  		}
    47  		if strings.EqualFold(fields[0], "cbl-mariner") {
    48  			return types.OS{
    49  				Family: types.CBLMariner,
    50  				Name:   fields[1],
    51  			}, nil
    52  		}
    53  	}
    54  	return types.OS{}, xerrors.Errorf("cbl-mariner: %w", fos.AnalyzeOSError)
    55  }
    56  
    57  func (a marinerOSAnalyzer) Required(filePath string, _ os.FileInfo) bool {
    58  	return filepath.ToSlash(filePath) == requiredFile
    59  }
    60  
    61  func (a marinerOSAnalyzer) Type() analyzer.Type {
    62  	return analyzer.TypeCBLMariner
    63  }
    64  
    65  func (a marinerOSAnalyzer) Version() int {
    66  	return version
    67  }