go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/packages/cos_packages.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package packages 5 6 import ( 7 "encoding/json" 8 "errors" 9 "fmt" 10 "io" 11 12 "go.mondoo.com/cnquery/providers/os/connection/shared" 13 ) 14 15 const ( 16 CosPkgFormat = "cos" 17 ) 18 19 type cosPackages struct { 20 InstalledPackages []cosPackage `json:"installedPackages"` 21 } 22 23 type cosPackage struct { 24 Name string `json:"name"` 25 Version string `json:"version"` 26 Category string `json:"category"` 27 EbuildVersion string `json:"ebuild_version"` 28 } 29 30 type CosPkgManager struct { 31 conn shared.Connection 32 } 33 34 func (cpm *CosPkgManager) Name() string { 35 return "COS Package Manager" 36 } 37 38 func (cpm *CosPkgManager) Format() string { 39 return CosPkgFormat 40 } 41 42 func (cpm *CosPkgManager) List() ([]Package, error) { 43 // added as a feature in cos 85 44 // https://cloud.google.com/container-optimized-os/docs/release-notes/m85#cos-85-13310-1260-1 45 fr, err := cpm.conn.FileSystem().Open("/etc/cos-package-info.json") 46 if err != nil { 47 return nil, fmt.Errorf("could not read package list") 48 } 49 defer fr.Close() 50 51 return ParseCosPackages(fr) 52 } 53 54 func (mpm *CosPkgManager) Available() (map[string]PackageUpdate, error) { 55 return nil, errors.New("cannot determine available packages for cos") 56 } 57 58 func ParseCosPackages(input io.Reader) ([]Package, error) { 59 data, err := io.ReadAll(input) 60 if err != nil { 61 return nil, err 62 } 63 64 // handle case where no packages are installed 65 if len(data) == 0 { 66 return []Package{}, nil 67 } 68 69 cPkgs := cosPackages{} 70 err = json.Unmarshal(data, &cPkgs) 71 if err != nil { 72 return nil, err 73 } 74 75 pkgs := make([]Package, len(cPkgs.InstalledPackages)) 76 for i := range cPkgs.InstalledPackages { 77 pkgs[i].Name = cPkgs.InstalledPackages[i].Name 78 pkgs[i].Version = cPkgs.InstalledPackages[i].EbuildVersion 79 pkgs[i].Format = CosPkgFormat 80 } 81 82 return pkgs, nil 83 }