go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/packages/solaris_packages.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package packages
     5  
     6  import (
     7  	"bufio"
     8  	"fmt"
     9  	"io"
    10  	"regexp"
    11  
    12  	"go.mondoo.com/cnquery/providers/os/connection/shared"
    13  )
    14  
    15  const (
    16  	SolarisPkgFormat = "ips"
    17  )
    18  
    19  var (
    20  	SOLARIS_PKG_REGEX  = regexp.MustCompile(`^(.*)\s+([\w\-]+)$`)
    21  	SOLARIS_FMRI_REGEX = regexp.MustCompile(`^pkg:\/\/([\w]+)/(.*)@(.*),(.*):(.*)$`)
    22  )
    23  
    24  type SolarisPackage struct {
    25  	Publisher string
    26  	Name      string
    27  	Version   string
    28  	Branch    string
    29  	Timestamp string
    30  }
    31  
    32  // parses a FMRI (Fault Managed Resource Indicator) like:
    33  // pkg://solaris/diagnostic/wireshark@1.4.2,5.11-0.174:20110128T0635Z
    34  // Publisher: solaris
    35  // Package name: diagnostic/wireshark
    36  // Component version: 1.4.2
    37  // Build version: 5.11
    38  // Branch version: 0.174
    39  // Package timestamp: 20110128T0635Z
    40  func ParseSolarisFmri(frmi string) (*SolarisPackage, error) {
    41  	m := SOLARIS_FMRI_REGEX.FindStringSubmatch(frmi)
    42  	if len(m) != 6 {
    43  		return nil, fmt.Errorf("could not parse solaris package name: %s", frmi)
    44  	}
    45  
    46  	return &SolarisPackage{
    47  		Publisher: m[1],
    48  		Name:      m[2],
    49  		Version:   m[3],
    50  		Branch:    m[4],
    51  		Timestamp: m[5],
    52  	}, nil
    53  }
    54  
    55  // parse solaris package list
    56  // see https://docs.oracle.com/cd/E23824_01/html/E21802/gkoic.html
    57  // see https://www.oracle.com/technetwork/server-storage/solaris11/documentation/ips-one-liners-032011-337775.pdf
    58  func ParseSolarisPackages(input io.Reader) []Package {
    59  	pkgs := []Package{}
    60  	scanner := bufio.NewScanner(input)
    61  	for scanner.Scan() {
    62  		line := scanner.Text()
    63  		m := SOLARIS_PKG_REGEX.FindStringSubmatch(line)
    64  		if m != nil && len(m) >= 1 {
    65  			// TODO: check that it has the i flag
    66  			spkg, err := ParseSolarisFmri(m[0])
    67  			if err == nil {
    68  				pkgs = append(pkgs, Package{
    69  					Name:    spkg.Name,
    70  					Version: spkg.Version,
    71  					Format:  SolarisPkgFormat,
    72  				})
    73  			}
    74  		}
    75  	}
    76  	return pkgs
    77  }
    78  
    79  type SolarisPkgManager struct {
    80  	conn shared.Connection
    81  }
    82  
    83  func (s *SolarisPkgManager) Name() string {
    84  	return "Solaris Package Manager"
    85  }
    86  
    87  func (script *SolarisPkgManager) Format() string {
    88  	return SolarisPkgFormat
    89  }
    90  
    91  func (s *SolarisPkgManager) List() ([]Package, error) {
    92  	cmd, err := s.conn.RunCommand("pkg list -v")
    93  	if err != nil {
    94  		return nil, fmt.Errorf("could not read solaris package list")
    95  	}
    96  
    97  	return ParseSolarisPackages(cmd.Stdout), nil
    98  }
    99  
   100  func (s *SolarisPkgManager) Available() (map[string]PackageUpdate, error) {
   101  	return map[string]PackageUpdate{}, nil
   102  }