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  }