From cc1fe522a5088336b3c29878ffbdda6a45a2eacd Mon Sep 17 00:00:00 2001 From: Guido Guenther Date: Wed, 19 Sep 2007 22:20:35 +0200 Subject: genereate the release files in subdirs so we can sign them and secure-apt works --- mini-dinstall | 218 +++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 146 insertions(+), 72 deletions(-) diff --git a/mini-dinstall b/mini-dinstall index 675e422..b64ba2c 100755 --- a/mini-dinstall +++ b/mini-dinstall @@ -1073,79 +1073,11 @@ class ArchiveDirIndexer(threading.Thread): def _make_sourcesfile(self, dir): self._make_indexfile(dir, 'sources', 'Sources') - def _make_releasefile(self): - targetname = self._abspath('Release') - if not self._generate_release: - if os.access(targetname, os.R_OK): - self._logger.info("Release generation disabled, removing existing Release file") - try: - os.unlink(targetname) - except OSError, e: - pass - return - tmpname = targetname + tmp_new_suffix - release_needed = 0 - uncompr_indexfiles = self._get_all_indexfiles() - indexfiles = [] - comprexts = ['.gz'] - for index in uncompr_indexfiles: - indexfiles = indexfiles + [index] - for ext in comprexts: - indexfiles = indexfiles + [index + ext] - if os.access(targetname, os.R_OK): - release_mtime = os.stat(targetname)[stat.ST_MTIME] - for file in indexfiles: - if release_needed: - break - if os.stat(self._abspath(file))[stat.ST_MTIME] > release_mtime: - release_needed = 1 - else: - release_needed = 1 - - if not release_needed: - self._logger.info("Skipping Release generation") - return - self._logger.info("Generating Release...") - if no_act: - self._logger.info("Release generation complete") - return - f = open(tmpname, 'w') - f.write('Origin: ' + self._release_origin + '\n') - f.write('Label: ' + self._release_label + '\n') - suite = self._release_suite - if not suite: - suite = self._name - f.write('Suite: ' + suite + '\n') - codename = self._release_codename - if not codename: - codename = suite - f.write('Codename: ' + codename + '\n') - f.write('Date: ' + time.strftime("%a, %d %b %Y %H:%M:%S UTC", time.gmtime()) + '\n') - f.write('Architectures: ' + string.join(self._arches, ' ') + '\n') - if self._release_description: - f.write('Description: ' + self._release_description + '\n') - f.write('MD5Sum:\n') - for file in indexfiles: - absfile = self._abspath(file) - md5sum = self._get_file_sum('md5', absfile) - size = os.stat(absfile)[stat.ST_SIZE] - f.write(' %s% 16d %s\n' % (md5sum, size, file)) - f.write('SHA1:\n') - for file in indexfiles: - absfile = self._abspath(file) - shasum = self._get_file_sum('sha1', absfile) - size = os.stat(absfile)[stat.ST_SIZE] - f.write(' %s% 16d %s\n' % (shasum, size, file)) - f.close() - if self._sign_releasefile(tmpname): - os.rename(tmpname, targetname) - self._logger.info("Release generation complete") - - def _sign_releasefile(self, name): + def _sign_releasefile(self, name, dir): if self._release_signscript: try: self._logger.debug("Running Release signing script: " + self._release_signscript) - if self._run_script(name, self._release_signscript, dir=self._abspath()): + if self._run_script(name, self._release_signscript, dir=dir): return None except: self._logger.exception("failure while running Release signature script") @@ -1222,12 +1154,15 @@ class ArchiveDirIndexer(threading.Thread): def _index_all(self, force=None): self._index(self._arches + ['source'], force) + def _gen_release_all(self, force=False): + self._gen_release(self._arches, force) + def run(self): self._logger.info('Created new thread (%s) for archive indexer %s' % (self.getName(), self._name,)) self._logger.info('Entering batch mode...') try: self._index_all(1) - self._make_releasefile() + self._gen_release_all(True) if not self._batch_mode: # never returns self._daemonize() @@ -1286,10 +1221,11 @@ class ArchiveDirIndexer(threading.Thread): if dir is None: self._logger.debug('Got general change') self._index_all(1) + self._gen_release_all(True) else: self._logger.debug('Got change in %s' % (dir,)) self._index([os.path.basename(os.path.abspath(dir))]) - self._make_releasefile() + self._gen_release([os.path.basename(os.path.abspath(dir))]) if setevent: self._logger.debug('setting wait_reprocess event') setevent.set() @@ -1309,6 +1245,9 @@ class ArchiveDirIndexer(threading.Thread): def _index(self, arches, force=None): self._index_impl(arches, force=force) + def _gen_release(self, arches, force=False): + self._gen_release_impl(self._arches, force) + def wait_reprocess(self): e = threading.Event() self._eventqueue.put(e) @@ -1351,6 +1290,73 @@ class SimpleSubdirArchiveDirIndexer(ArchiveDirIndexer): else: self._logger.info('Skipping generation of Sources file for %s' % (arch,)) + def _gen_release_impl(self, arches, force): + for arch in arches: + targetname = self._relpath(arch, 'Release') + if not self._generate_release: + if os.access(targetname, os.R_OK): + self._logger.info("Release generation disabled, removing existing Release file") + try: + os.unlink(targetname) + except OSError, e: + pass + return + tmpname = targetname + tmp_new_suffix + release_needed = 0 + uncompr_indexfile = os.path.join(arch, 'Packages') + indexfiles = [uncompr_indexfile] + comprexts = ['.gz'] + for ext in comprexts: + indexfiles = indexfiles + [uncompr_indexfile + ext] + if os.access(targetname, os.R_OK): + release_mtime = os.stat(targetname)[stat.ST_MTIME] + for file in indexfiles: + if release_needed: + break + if os.stat(self._abspath(file))[stat.ST_MTIME] > release_mtime: + release_needed = 1 + else: + release_needed = 1 + + if not release_needed: + self._logger.info("Skipping Release generation") + return + self._logger.info("Generating Release...") + if no_act: + self._logger.info("Release generation complete") + return + f = open(tmpname, 'w') + f.write('Origin: ' + self._release_origin + '\n') + f.write('Label: ' + self._release_label + '\n') + suite = self._release_suite + if not suite: + suite = self._name + f.write('Suite: ' + suite + '\n') + codename = self._release_codename + if not codename: + codename = suite + f.write('Codename: ' + '%s/%s\n' % (codename, arch)) + f.write('Date: ' + time.strftime("%a, %d %b %Y %H:%M:%S UTC", time.gmtime()) + '\n') + f.write('Architectures: ' + arch + '\n') + if self._release_description: + f.write('Description: ' + self._release_description + '\n') + f.write('MD5Sum:\n') + for file in indexfiles: + absfile = self._abspath(file) + md5sum = self._get_file_sum('md5', absfile) + size = os.stat(absfile)[stat.ST_SIZE] + f.write(' %s% 16d %s\n' % (md5sum, size, os.path.basename(absfile))) + f.write('SHA1:\n') + for file in indexfiles: + absfile = self._abspath(file) + shasum = self._get_file_sum('sha1', absfile) + size = os.stat(absfile)[stat.ST_SIZE] + f.write(' %s% 16d %s\n' % (shasum, size, os.path.basename(absfile))) + f.close() + if self._sign_releasefile(os.path.basename(tmpname), self._abspath(arch)): + os.rename(tmpname, targetname) + self._logger.info("Release generation complete") + def _in_archdir(self, *args): return apply(lambda x,self=self: self._abspath(x), args) @@ -1381,6 +1387,74 @@ class FlatArchiveDirIndexer(ArchiveDirIndexer): else: self._logger.info('Skipping generation of Sources file') + def _gen_release_impl(self, arches, force): + targetname = self._abspath('Release') + if not self._generate_release: + if os.access(targetname, os.R_OK): + self._logger.info("Release generation disabled, removing existing Release file") + try: + os.unlink(targetname) + except OSError, e: + pass + return + tmpname = targetname + tmp_new_suffix + release_needed = 0 + uncompr_indexfiles = self._get_all_indexfiles() + indexfiles = [] + comprexts = ['.gz'] + for index in uncompr_indexfiles: + indexfiles = indexfiles + [index] + for ext in comprexts: + indexfiles = indexfiles + [index + ext] + if os.access(targetname, os.R_OK): + release_mtime = os.stat(targetname)[stat.ST_MTIME] + for file in indexfiles: + if release_needed: + break + if os.stat(self._abspath(file))[stat.ST_MTIME] > release_mtime: + release_needed = 1 + else: + release_needed = 1 + + if not release_needed: + self._logger.info("Skipping Release generation") + return + self._logger.info("Generating Release...") + if no_act: + self._logger.info("Release generation complete") + return + f = open(tmpname, 'w') + f.write('Origin: ' + self._release_origin + '\n') + f.write('Label: ' + self._release_label + '\n') + suite = self._release_suite + if not suite: + suite = self._name + f.write('Suite: ' + suite + '\n') + codename = self._release_codename + if not codename: + codename = suite + f.write('Codename: ' + codename + '\n') + f.write('Date: ' + time.strftime("%a, %d %b %Y %H:%M:%S UTC", time.gmtime()) + '\n') + f.write('Architectures: ' + string.join(self._arches, ' ') + '\n') + if self._release_description: + f.write('Description: ' + self._release_description + '\n') + f.write('MD5Sum:\n') + for file in indexfiles: + absfile = self._abspath(file) + md5sum = self._get_file_sum('md5', absfile) + size = os.stat(absfile)[stat.ST_SIZE] + f.write(' %s% 16d %s\n' % (md5sum, size, file)) + f.write('SHA1:\n') + for file in indexfiles: + absfile = self._abspath(file) + shasum = self._get_file_sum('sha1', absfile) + size = os.stat(absfile)[stat.ST_SIZE] + f.write(' %s% 16d %s\n' % (shasum, size, file)) + f.close() + if self._sign_releasefile(tmpname, self._abspath()): + os.rename(tmpname, targetname) + self._logger.info("Release generation complete") + def _in_archdir(self, *args): return apply(lambda x,self=self: self._abspath(x), args[1:]) -- cgit v1.2.3