Skip to content

Instantly share code, notes, and snippets.

@salrashid123
Created April 2, 2024 13:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save salrashid123/009534145ef8611d9846787a6e54ba35 to your computer and use it in GitHub Desktop.
Save salrashid123/009534145ef8611d9846787a6e54ba35 to your computer and use it in GitHub Desktop.
Parsing GCP OSInventory packages from metadata server

parsing the os-inventory metadata server struct

if you have os-inventory enabled, you can get the values on the VM itself by running

curl -s -H 'Metadata-Flavor: Google'  http://metadata.google.internal/computeMetadata/v1/instance/guest-attributes/guestInventory/InstalledPackages

parse the values using
(you can ofcourse otherwise get the packages via api gcloud compute os-config inventories describe instance-1 --location=us-central1-a --view=full

package main

import (
	"bytes"
	"compress/gzip"
	"encoding/base64"
	"encoding/json"
	"fmt"
	"io"

	"github.com/GoogleCloudPlatform/osconfig/packages"
)

// curl -s -H 'Metadata-Flavor: Google'  http://metadata.google.internal/computeMetadata/v1/instance/guest-attributes/guestInventory/InstalledPackages
var (
	installedpackages = "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"
)

func decodePackages(str string) *packages.Packages {
	decoded, _ := base64.StdEncoding.DecodeString(str)
	zr, _ := gzip.NewReader(bytes.NewReader(decoded))
	var buf bytes.Buffer
	io.Copy(&buf, zr)
	zr.Close()

	var pkgs packages.Packages
	json.Unmarshal(buf.Bytes(), &pkgs)
	return &pkgs
}

func main() {
	p := decodePackages(installedpackages)
	for _, v := range p.Deb {
		fmt.Printf("%s\n", v)
	}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment