func getPackages()

in deb_packages/tools/update_deb_packages/src/update_deb_packages.go [151:233]


func getPackages(arch string, distroType string, distro string, mirrors []string, components []string, pgpKeyFile string) (packages []godebiancontrol.Paragraph) {
	releasefile, err := ioutil.TempFile("", "Release")
	logFatalErr(err)

	releasegpgfile, err := ioutil.TempFile("", "Releasegpg")
	logFatalErr(err)

	// download Release + Release.gpg
	getFileFromMirror(releasefile.Name(), "Release", distro, mirrors)
	getFileFromMirror(releasegpgfile.Name(), "Release.gpg", distro, mirrors)

	// check signature
	checkPgpSignature(pgpKeyFile, releasefile.Name(), releasegpgfile.Name())

	os.Remove(releasegpgfile.Name())

	// read/parse Release file
	release, err := godebiancontrol.Parse(releasefile)
	logFatalErr(err)
	os.Remove(releasefile.Name())

	// this will be the merged Packages file
	packagesfile, err := ioutil.TempFile("", "Packages")
	logFatalErr(err)

	// download all binary-<arch> Packages.gz files
	for _, line := range strings.Split(release[0]["SHA256"], "\n") {
		fields := strings.Fields(line)
		if len(fields) == 0 {
			//last line is an empty line
			continue
		}
		hash := fields[0]
		path := fields[2]
		isAcceptedComponent := true
		if len(components) > 0 {
			isAcceptedComponent = false
			for _, component := range components {
				if strings.HasPrefix(path, component+"/") {
					isAcceptedComponent = true
					break
				}
			}
		}
		if isAcceptedComponent && strings.HasSuffix(path, "/binary-"+arch+"/Packages.gz") {
			tmpPackagesfile, err := ioutil.TempFile("", "Packages")
			logFatalErr(err)
			getFileFromMirror(tmpPackagesfile.Name(), path, distro, mirrors)
			// check hash of Packages.gz files
			if compareFileWithHash(tmpPackagesfile.Name(), hash) != true {
				log.Fatalf("Downloaded file %s corrupt", path)
			}

			// unzip Packages.gz files
			handle, err := os.Open(tmpPackagesfile.Name())
			logFatalErr(err)
			defer handle.Close()

			zipReader, err := gzip.NewReader(handle)
			logFatalErr(err)
			defer zipReader.Close()

			content, err := ioutil.ReadAll(zipReader)
			logFatalErr(err)
			os.Remove(tmpPackagesfile.Name())

			// append content to merged Packages file
			f, err := os.OpenFile(packagesfile.Name(), os.O_APPEND|os.O_WRONLY, 0600)
			logFatalErr(err)
			defer f.Close()

			_, err = f.Write(content)
			logFatalErr(err)
		}
	}

	// read/parse merged Packages file
	parsed, err := godebiancontrol.Parse(packagesfile)
	logFatalErr(err)
	os.Remove(packagesfile.Name())

	return parsed
}