X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=daklib%2Fdbconn.py;h=1bf82931577f0fb5c1918371821cec945dca9c33;hb=47cd096281f1cc36dfe9818ef1fbae8d02f6ada6;hp=a900a0e6a41564b6d7d402bada53a17c9662a628;hpb=84a18dba74a0fcaa92a007a897f8b0e3de242df6;p=dak.git diff --git a/daklib/dbconn.py b/daklib/dbconn.py index a900a0e6..1bf82931 100644 --- a/daklib/dbconn.py +++ b/daklib/dbconn.py @@ -34,13 +34,13 @@ ################################################################################ import apt_pkg +import daklib.daksubprocess import os from os.path import normpath import re import psycopg2 +import subprocess import traceback -import commands -import signal try: # python >= 2.6 @@ -52,7 +52,6 @@ except: from datetime import datetime, timedelta from errno import ENOENT from tempfile import mkstemp, mkdtemp -from subprocess import Popen, PIPE from tarfile import TarFile from inspect import getargspec @@ -110,11 +109,11 @@ class DebVersion(UserDefinedType): return None sa_major_version = sqlalchemy.__version__[0:3] -if sa_major_version in ["0.5", "0.6", "0.7", "0.8"]: +if sa_major_version in ["0.5", "0.6", "0.7", "0.8", "0.9"]: from sqlalchemy.databases import postgres postgres.ischema_names['debversion'] = DebVersion else: - raise Exception("dak only ported to SQLA versions 0.5 to 0.8. See daklib/dbconn.py") + raise Exception("dak only ported to SQLA versions 0.5 to 0.9. See daklib/dbconn.py") ################################################################################ @@ -498,11 +497,6 @@ __all__.append('BinContents') ################################################################################ -def subprocess_setup(): - # Python installs a SIGPIPE handler by default. This is usually not what - # non-Python subprocesses expect. - signal.signal(signal.SIGPIPE, signal.SIG_DFL) - class DBBinary(ORMObject): def __init__(self, package = None, source = None, version = None, \ maintainer = None, architecture = None, poolfile = None, \ @@ -539,8 +533,8 @@ class DBBinary(ORMObject): package does not contain any regular file. ''' fullpath = self.poolfile.fullpath - dpkg = Popen(['dpkg-deb', '--fsys-tarfile', fullpath], stdout = PIPE, - preexec_fn = subprocess_setup) + dpkg_cmd = ('dpkg-deb', '--fsys-tarfile', fullpath) + dpkg = daklib.daksubprocess.Popen(dpkg_cmd, stdout=subprocess.PIPE) tar = TarFile.open(fileobj = dpkg.stdout, mode = 'r|') for member in tar.getmembers(): if not member.isdir(): @@ -564,11 +558,8 @@ class DBBinary(ORMObject): ''' import utils fullpath = self.poolfile.fullpath - deb_file = open(fullpath, 'r') - stanza = utils.deb_extract_control(deb_file) - deb_file.close() - - return stanza + with open(fullpath, 'r') as deb_file: + return utils.deb_extract_control(deb_file) def read_control_fields(self): ''' @@ -578,7 +569,6 @@ class DBBinary(ORMObject): @rtype: dict @return: fields of the control section as a dictionary. ''' - import apt_pkg stanza = self.read_control() return apt_pkg.TagSection(stanza) @@ -1165,9 +1155,6 @@ def get_ldap_name(entry): ################################################################################ class Keyring(object): - gpg_invocation = "gpg --no-default-keyring --keyring %s" +\ - " --with-colons --fingerprint --fingerprint" - keys = {} fpr_lookup = {} @@ -1197,11 +1184,14 @@ class Keyring(object): if not self.keyring_id: raise Exception('Must be initialized with database information') - k = os.popen(self.gpg_invocation % keyring, "r") + cmd = ["gpg", "--no-default-keyring", "--keyring", keyring, + "--with-colons", "--fingerprint", "--fingerprint"] + p = daklib.daksubprocess.Popen(cmd, stdout=subprocess.PIPE) + key = None need_fingerprint = False - for line in k: + for line in p.stdout: field = line.split(":") if field[0] == "pub": key = field[4] @@ -1221,6 +1211,10 @@ class Keyring(object): self.fpr_lookup[field[9]] = key need_fingerprint = False + r = p.wait() + if r != 0: + raise subprocess.CalledProcessError(r, cmd) + def import_users_from_ldap(self, session): import ldap cnf = Config() @@ -2096,27 +2090,28 @@ __all__.append('get_sources_from_name') # FIXME: This function fails badly if it finds more than 1 source package and # its implementation is trivial enough to be inlined. @session_wrapper -def get_source_in_suite(source, suite, session=None): +def get_source_in_suite(source, suite_name, session=None): """ - Returns a DBSource object for a combination of C{source} and C{suite}. + Returns a DBSource object for a combination of C{source} and C{suite_name}. - B{source} - source package name, eg. I{mailfilter}, I{bbdb}, I{glibc} - - B{suite} - a suite name, eg. I{unstable} + - B{suite_name} - a suite name, eg. I{unstable} @type source: string @param source: source package name - @type suite: string + @type suite_name: string @param suite: the suite name @rtype: string @return: the version for I{source} in I{suite} """ - - q = get_suite(suite, session).get_sources(source) + suite = get_suite(suite_name, session) + if suite is None: + return None try: - return q.one() + return suite.get_sources(source).one() except NoResultFound: return None @@ -2939,5 +2934,3 @@ class DBConn(object): return session __all__.append('DBConn') - -