X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Fgenerate_releases.py;h=3d42c51cc40df89d976068b2dd46390d3931f331;hb=e3d8cb7bce30c76d6133ab04ce9b01804944d5cb;hp=11e37807121181c892bca57ab40471fec5674969;hpb=9fa241c825a40bd09bd1c2e6b7f065f4a1dc0481;p=dak.git diff --git a/dak/generate_releases.py b/dak/generate_releases.py index 11e37807..3d42c51c 100755 --- a/dak/generate_releases.py +++ b/dak/generate_releases.py @@ -1,9 +1,12 @@ #!/usr/bin/env python -""" Create all the Release files """ - -# Copyright (C) 2001, 2002, 2006 Anthony Towns +""" Create all the Release files +@contact: Debian FTPMaster +@Copyright: 2001, 2002, 2006 Anthony Towns +@copyright: 2009, 2011 Joerg Jaspert +@license: GNU General Public License version 2 or later +""" # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or @@ -22,13 +25,18 @@ ################################################################################ -import sys, os, stat, time -import gzip, bz2 +import sys +import os +import stat +import time +import gzip +import bz2 import apt_pkg from daklib import utils from daklib.dak_exceptions import * from daklib.dbconn import * +from daklib.config import Config ################################################################################ @@ -100,7 +108,11 @@ def compressnames (tree,type,file): decompressors = { 'zcat' : gzip.GzipFile, 'bzip2' : bz2.BZ2File } -def print_md5sha_files (tree, files, hashop): +hashfuncs = { 'MD5' : apt_pkg.md5sum, + 'SHA1' : apt_pkg.sha1sum, + 'SHA256' : apt_pkg.sha256sum } + +def print_hash_files (tree, files, hashop): path = Cnf["Dir::Root"] + tree + "/" for name in files: hashvalue = "" @@ -112,12 +124,12 @@ def print_md5sha_files (tree, files, hashop): (cat, ext, name) = (name[1:j], name[j+1:k], name[k+1:]) file_handle = decompressors[ cat ]( "%s%s%s" % (path, name, ext) ) contents = file_handle.read() - hashvalue = hashop(contents) + hashvalue = hashfuncs[ hashop ](contents) hashlen = len(contents) else: try: file_handle = utils.open_file(path + name) - hashvalue = hashop(file_handle) + hashvalue = hashfuncs[ hashop ](file_handle) hashlen = os.stat(path + name).st_size except: raise @@ -127,19 +139,13 @@ def print_md5sha_files (tree, files, hashop): except CantOpenError: print "ALERT: Couldn't open " + path + name + except IOError: + print "ALERT: IOError when reading %s" % (path + name) + raise else: out.write(" %s %8d %s\n" % (hashvalue, hashlen, name)) -def print_md5_files (tree, files): - print_md5sha_files (tree, files, apt_pkg.md5sum) - -def print_sha1_files (tree, files): - print_md5sha_files (tree, files, apt_pkg.sha1sum) - -def print_sha256_files (tree, files): - print_md5sha_files (tree, files, apt_pkg.sha256sum) - -def write_release_file (relpath, suite, component, origin, label, arch, version="", suite_suffix="", notautomatic=""): +def write_release_file (relpath, suite, component, origin, label, arch, version="", suite_suffix="", notautomatic="", butautomaticupgrades=""): try: if os.access(relpath, os.F_OK): if os.stat(relpath).st_nlink > 1: @@ -161,6 +167,8 @@ def write_release_file (relpath, suite, component, origin, label, arch, version= release.write("Label: %s\n" % (label)) if notautomatic != "": release.write("NotAutomatic: %s\n" % (notautomatic)) + if butautomaticupgrades != "": + release.write("ButAutomaticUpgrades: %s\n" % (butautomaticupgrades)) release.write("Architecture: %s\n" % (arch)) release.close() @@ -171,6 +179,7 @@ def main (): out = sys.stdout Cnf = utils.get_conf() + cnf = Config() Arguments = [('h',"help","Generate-Releases::Options::Help"), ('a',"apt-conf","Generate-Releases::Options::Apt-Conf", "HasArg"), @@ -197,30 +206,39 @@ def main (): for suitename in suites: print "Processing: " + suitename - SuiteBlock = Cnf.SubTree("Suite::" + suite) - suiteobj = get_suite(suitename) + SuiteBlock = Cnf.SubTree("Suite::" + suitename) + suiteobj = get_suite(suitename.lower()) + if not suiteobj: + print "ALERT: Cannot find suite %s!" % (suitename.lower()) + continue - suite = suite.suite_name.lower() + # Use the canonical name + suite = suiteobj.suite_name.lower() - if suite.untouchable and not Options["Force-Touch"]: + if suiteobj.untouchable and not Options["Force-Touch"]: print "Skipping: " + suite + " (untouchable)" continue - origin = suite.origin - label = suite.label or suite.origin - codename = suite.codename or "" + origin = suiteobj.origin + label = suiteobj.label or suiteobj.origin + codename = suiteobj.codename or "" version = "" - if suite.version and suite.version != '-': - version = suite.version - description = suite.description or "" + if suiteobj.version and suiteobj.version != '-': + version = suiteobj.version + description = suiteobj.description or "" architectures = get_suite_architectures(suite, skipall=True, skipsrc=True) - if SuiteBlock.has_key("NotAutomatic"): + if suiteobj.notautomatic: notautomatic = "yes" else: notautomatic = "" + if suiteobj.butautomaticupgrades: + butautomaticupgrades = "yes" + else: + butautomaticupgrades = "" + if SuiteBlock.has_key("Components"): components = SuiteBlock.ValueList("Components") else: @@ -255,12 +273,14 @@ def main (): out.write("Codename: %s\n" % (codename)) out.write("Date: %s\n" % (time.strftime("%a, %d %b %Y %H:%M:%S UTC", time.gmtime(time.time())))) - if SuiteBlock.has_key("ValidTime"): - validtime=float(SuiteBlock["ValidTime"]) + if suiteobj.validtime: + validtime=float(suiteobj.validtime) out.write("Valid-Until: %s\n" % (time.strftime("%a, %d %b %Y %H:%M:%S UTC", time.gmtime(time.time()+validtime)))) if notautomatic != "": out.write("NotAutomatic: %s\n" % (notautomatic)) + if butautomaticupgrades != "": + out.write("ButAutomaticUpgrades: %s\n" % (butautomaticupgrades)) out.write("Architectures: %s\n" % (" ".join([a.arch_string for a in architectures]))) if components: out.write("Components: %s\n" % (" ".join(components))) @@ -289,12 +309,12 @@ def main (): files.append(cfile) add_tiffani(files, Cnf["Dir::Root"] + tree, filepath) else: - disks = "%s/disks-%s" % (sec, arch) - diskspath = Cnf["Dir::Root"]+tree+"/"+disks - if os.path.exists(diskspath): - for dir in os.listdir(diskspath): - if os.path.exists("%s/%s/md5sum.txt" % (diskspath, dir)): - files.append("%s/%s/md5sum.txt" % (disks, dir)) + installer = "%s/installer-%s" % (sec, arch) + installerpath = Cnf["Dir::Root"]+tree+"/"+installer + if os.path.exists(installerpath): + for directory in os.listdir(installerpath): + if os.path.exists("%s/%s/images/MD5SUMS" % (installerpath, directory)): + files.append("%s/%s/images/MD5SUMS" % (installer, directory)) filepath = "%s/binary-%s/Packages" % (sec, arch) for cfile in compressnames("tree::%s" % (tree), "Packages", filepath): @@ -306,7 +326,7 @@ def main (): else: rel = "%s/binary-%s/Release" % (sec, arch) relpath = Cnf["Dir::Root"]+tree+"/"+rel - write_release_file(relpath, suite, sec, origin, label, arch, version, suite_suffix, notautomatic) + write_release_file(relpath, suite, sec, origin, label, arch, version, suite_suffix, notautomatic, butautomaticupgrades) files.append(rel) gen_i18n_index(files, tree, sec) @@ -321,7 +341,7 @@ def main (): if arch != "source": # always true rel = "%s/%s/binary-%s/Release" % (dis, sec, arch) relpath = Cnf["Dir::Root"]+tree+"/"+rel - write_release_file(relpath, suite, dis, origin, label, arch, version, suite_suffix, notautomatic) + write_release_file(relpath, suite, dis, origin, label, arch, version, suite_suffix, notautomatic, butautomaticupgrades) files.append(rel) for cfile in compressnames("tree::%s/%s" % (tree,dis), "Packages", @@ -346,12 +366,10 @@ def main (): else: print "ALERT: no tree/bindirectory for %s" % (tree) - out.write("MD5Sum:\n") - print_md5_files(tree, files) - out.write("SHA1:\n") - print_sha1_files(tree, files) - out.write("SHA256:\n") - print_sha256_files(tree, files) + for hashvalue in cnf.SubTree("Generate-Releases").List(): + if suite in [ i.lower() for i in cnf.ValueList("Generate-Releases::%s" % (hashvalue)) ]: + out.write("%s:\n" % (hashvalue)) + print_hash_files(tree, files, hashvalue) out.close() if Cnf.has_key("Dinstall::SigningKeyring"): @@ -360,21 +378,26 @@ def main (): keyring += " --keyring \"%s\"" % Cnf["Dinstall::SigningPubKeyring"] arguments = "--no-options --batch --no-tty --armour" - if Cnf.has_key("Dinstall::SigningKeyIds"): - signkeyids = Cnf["Dinstall::SigningKeyIds"].split() - else: - signkeyids = [""] + signkeyids=cnf.signingkeyids.split() dest = Cnf["Dir::Root"] + tree + "/Release.gpg" if os.path.exists(dest): os.unlink(dest) + inlinedest = Cnf["Dir::Root"] + tree + "/InRelease" + if os.path.exists(inlinedest): + os.unlink(inlinedest) for keyid in signkeyids: - if keyid != "": defkeyid = "--default-key %s" % keyid - else: defkeyid = "" + if keyid != "": + defkeyid = "--default-key %s" % keyid + else: + defkeyid = "" os.system("gpg %s %s %s --detach-sign <%s >>%s" % (keyring, defkeyid, arguments, Cnf["Dir::Root"] + tree + "/Release", dest)) + os.system("gpg %s %s %s --clearsign <%s >>%s" % + (keyring, defkeyid, arguments, + Cnf["Dir::Root"] + tree + "/Release", inlinedest)) #######################################################################################