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
}