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 }