blob: a45af2afc464b0b7a83b8112cebd104183872dbc [file] [log] [blame]
package packagediff
import (
"encoding/json"
"fmt"
"io/ioutil"
"path/filepath"
"cos.googlesource.com/cos/tools.git/src/cmd/cos_image_analyzer/internal/input"
)
const pathToPackageList = "/etc/package_list"
// Package is used to store individual package data parsed from the package list json file
type Package struct {
Category string
Name string
Version string
Revision string
}
// InstalledPackages is used to store an image’s full package list parsed from the package list json file
type InstalledPackages struct {
InstalledPackages []Package
}
// ****** NOTE ******
// This function is a temporary implementation. Switch this out with the awaited cos-tools library function.
// getInstalledPackages returns the package list for an image by parsing its /etc/package_list json file
func getInstalledPackages(rootfs string) ([]Package, error) {
fullPath := filepath.Join(rootfs, pathToPackageList)
packageListBytes, err := ioutil.ReadFile(fullPath)
if err != nil {
return []Package{}, fmt.Errorf("failed to read package list file %v: %v", fullPath, err)
}
var IP InstalledPackages
if err := json.Unmarshal(packageListBytes, &IP); err != nil {
return []Package{}, fmt.Errorf("failed to parse json for package list file %v: %v", fullPath, err)
}
return IP.InstalledPackages, nil
}
// ******************
// GetPackageInfo finds relevant package list information for the COS image
func GetPackageInfo(image *input.ImageInfo, flagInfo *input.FlagInfo) ([]Package, error) {
if image.TempDir == "" {
return []Package{}, nil
}
if flagInfo.PackageSelected { // Get package list from /etc/package_list
packageList, err := getInstalledPackages(image.RootfsPartition3)
if err != nil {
return []Package{}, fmt.Errorf("failed to get package list from image %v: %v", image.TempDir, err)
}
return packageList, nil
}
return []Package{}, nil
}