X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fqueue.py;h=77f402502ca0b6952ea400ec7d1a9903bc4c1992;hb=d758865e3e272e6bdb0d647622d36c4eb4692c5d;hp=f6362206c10c9b03fc7214a5139431f26ed97d5b;hpb=a43c7b22d8bbbcba586137b2345459d1e693f593;p=dak.git diff --git a/daklib/queue.py b/daklib/queue.py index f6362206..77f40250 100755 --- a/daklib/queue.py +++ b/daklib/queue.py @@ -443,7 +443,7 @@ class Upload(object): # of the queue directories. base_filename = os.path.basename(filename) for d in [ "Accepted", "Byhand", "Done", "New", "ProposedUpdates", "OldProposedUpdates" ]: - if os.path.exists(os.path.join(Cnf["Dir::Queue::%s" % (d) ], base_filename): + if os.path.exists(os.path.join(Cnf["Dir::Queue::%s" % (d) ], base_filename)): self.rejects.append("%s: a file with this name already exists in the %s directory." % (base_filename, d)) # Check the .changes is non-empty @@ -872,7 +872,7 @@ class Upload(object): self.binary_file_checks(f, session) # Checks for a source package... - elif re_issource.match(f) + elif re_issource.match(f): has_source = True # This routine appends to self.rejects/warnings as appropriate @@ -1161,7 +1161,7 @@ class Upload(object): self.rejects.append(j) if "source" in self.pkg.changes["architecture"]: # TODO: Move _ensure_dsc_hash into this class - for j in utils._ensure_dsc_hash(self.pkg.dsc, self.pkg.dsc_files, hashname, hashfunc)) + for j in utils._ensure_dsc_hash(self.pkg.dsc, self.pkg.dsc_files, hashname, hashfunc): self.rejects.append(j) def check_hashes(): @@ -1950,7 +1950,7 @@ distribution.""" file, version, sourceful=True) ################################################################################ - def check_dsc_against_db(self, file): + def check_dsc_against_db(self, file, session=None): """ @warning: NB: this function can remove entries from the 'files' index [if @@ -1960,6 +1960,10 @@ distribution.""" ensure you haven't just tried to dereference the deleted entry. """ + + if session is None: + session = DBConn().session() + self.pkg.orig_tar_gz = None # Try and find all files mentioned in the .dsc. This has @@ -2012,7 +2016,7 @@ distribution.""" elif dsc_name.endswith(".orig.tar.gz"): # Check in the pool - ql = get_poolfile_like_name(dsc_name) + ql = get_poolfile_like_name(dsc_name, session) # Strip out anything that isn't '%s' or '/%s$' # TODO: Shouldn't we just search for things which end with our string explicitly in the SQL? @@ -2076,6 +2080,99 @@ distribution.""" if actual_size != int(dsc_entry["size"]): self.rejects.append("size for %s doesn't match %s." % (found, file)) + ################################################################################ + def accepted_checks(self, overwrite_checks=True, session=None): + # Recheck anything that relies on the database; since that's not + # frozen between accept and our run time when called from p-a. + + # overwrite_checks is set to False when installing to stable/oldstable + + if session is None: + session = DBConn().session() + + propogate={} + nopropogate={} + + for checkfile in self.pkg.files.keys(): + # The .orig.tar.gz can disappear out from under us is it's a + # duplicate of one in the archive. + if not self.pkg.files.has_key(checkfile): + continue + + entry = self.pkg.files[checkfile] + + # Check that the source still exists + if entry["type"] == "deb": + source_version = entry["source version"] + source_package = entry["source package"] + if not self.pkg.changes["architecture"].has_key("source") \ + and not source_exists(source_package, source_version, self.pkg.changes["distribution"].keys()): + self.rejects.append("no source found for %s %s (%s)." % (source_package, source_version, checkfile)) + + # Version and file overwrite checks + if overwrite_checks: + if entry["type"] == "deb": + self.check_binary_against_db(checkfile, session) + elif entry["type"] == "dsc": + self.check_source_against_db(checkfile, session) + self.check_dsc_against_db(dsc_filename, session) + + # propogate in the case it is in the override tables: + for suite in self.pkg.changes.get("propdistribution", {}).keys(): + if self.in_override_p(entry["package"], entry["component"], suite, entry.get("dbtype",""), checkfile): + propogate[suite] = 1 + else: + nopropogate[suite] = 1 + + for suite in propogate.keys(): + if suite in nopropogate: + continue + self.pkg.changes["distribution"][suite] = 1 + + for checkfile in self.pkg.files.keys(): + # Check the package is still in the override tables + for suite in self.pkg.changes["distribution"].keys(): + if not self.in_override_p(entry["package"], entry["component"], suite, entry.get("dbtype",""), checkfile): + self.rejects.append("%s is NEW for %s." % (checkfile, suite)) + + ################################################################################ + # This is not really a reject, but an unaccept, but since a) the code for + # that is non-trivial (reopen bugs, unannounce etc.), b) this should be + # extremely rare, for now we'll go with whining at our admin folks... + + def do_unaccept(self): + cnf = Config() + + self.Subst["__REJECTOR_ADDRESS__"] = cnf["Dinstall::MyEmailAddress"] + self.Subst["__REJECT_MESSAGE__"] = self.package_info() + self.Subst["__CC__"] = "Cc: " + cnf["Dinstall::MyEmailAddress"] + self.Subst["__BCC__"] = "X-DAK: dak process-accepted\nX-Katie: $Revision: 1.18 $" + if cnf.has_key("Dinstall::Bcc"): + self.Subst["__BCC__"] += "\nBcc: %s" % (cnf["Dinstall::Bcc"]) + + template = os.path.join(cnf["Dir::Templates"], "process-accepted.unaccept") + + reject_mail_message = utils.TemplateSubst(self.Subst, template) + + # Write the rejection email out as the .reason file + reason_filename = os.path.basename(self.pkg.changes_file[:-8]) + ".reason" + reject_filename = os.path.join(cnf["Dir::Queue::Reject"], reason_filename) + + # If we fail here someone is probably trying to exploit the race + # so let's just raise an exception ... + if os.path.exists(reject_filename): + os.unlink(reject_filename) + + fd = os.open(reject_filename, os.O_RDWR|os.O_CREAT|os.O_EXCL, 0644) + os.write(fd, reject_mail_message) + os.close(fd) + + utils.send_mail(reject_mail_message) + + del self.Subst["__REJECTOR_ADDRESS__"] + del self.Subst["__REJECT_MESSAGE__"] + del self.Subst["__CC__"] + ################################################################################ # If any file of an upload has a recent mtime then chances are good # the file is still being uploaded.