in packages/apt_deb.go [154:208]
func parseDpkgDeb(data []byte) (*PkgInfo, error) {
/*
new Debian package, version 2.0.
size 6731954 bytes: control archive=2138 bytes.
498 bytes, 12 lines control
3465 bytes, 31 lines md5sums
2793 bytes, 65 lines * postinst #!/bin/sh
938 bytes, 28 lines * postrm #!/bin/sh
216 bytes, 7 lines * prerm #!/bin/sh
Package: google-guest-agent
Version: 1:1dummy-g1
Architecture: amd64
Maintainer: Google Cloud Team <gc-team@google.com>
Installed-Size: 23279
Depends: init-system-helpers (>= 1.18~)
Conflicts: python-google-compute-engine, python3-google-compute-engine
Section: misc
Priority: optional
Description: Google Compute Engine Guest Agent
Contains the guest agent and metadata script runner binaries.
Git: https://github.com/GoogleCloudPlatform/guest-agent/tree/c3d526e650c4e45ae3258c07836fd72f85fd9fc8
*/
lines := bytes.Split(bytes.TrimSpace(data), []byte("\n"))
info := &PkgInfo{}
for _, ln := range lines {
if info.Name != "" && info.Version != "" && info.Arch != "" {
break
}
fields := bytes.Fields(ln)
if len(fields) != 2 {
continue
}
if bytes.Contains(fields[0], []byte("Package:")) {
// Some packages do not adhere to the Debian Policy and might have mix-cased names
// And dpkg will register the package with lower case anyway so use lower-case package name
// This is necessary because the compliance check is done between the .deb file descriptor value
// and the internal dpkg db which register a lower-cased package name
info.Name = strings.ToLower(string(fields[1]))
continue
}
if bytes.Contains(fields[0], []byte("Version:")) {
info.Version = string(fields[1])
continue
}
if bytes.Contains(fields[0], []byte("Architecture:")) {
info.Arch = osinfo.NormalizeArchitecture(string(fields[1]))
continue
}
}
if info.Name == "" || info.Version == "" || info.Arch == "" {
return nil, fmt.Errorf("could not parse dpkg-deb output: %q", data)
}
return info, nil
}