X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=daklib%2Fdbconn.py;h=c2621e36d150a38b042fd25182e15ff7374cbb87;hb=206fb80997ed8e3aa8ee317d454a3fb9470b7ffc;hp=624ff8b5c83e6b2dbf30186f147bbf4f8d941cef;hpb=bdd3bf92a9dbccf8313b7f0bad97381f5f51a189;p=dak.git diff --git a/daklib/dbconn.py b/daklib/dbconn.py index 624ff8b5..c2621e36 100644 --- a/daklib/dbconn.py +++ b/daklib/dbconn.py @@ -558,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): ''' @@ -575,6 +572,12 @@ class DBBinary(ORMObject): stanza = self.read_control() return apt_pkg.TagSection(stanza) + @property + def proxy(self): + session = object_session(self) + query = session.query(BinaryMetadata).filter_by(binary=self) + return MetadataProxy(session, query) + __all__.append('DBBinary') @session_wrapper @@ -1158,9 +1161,6 @@ def get_ldap_name(entry): ################################################################################ class Keyring(object): - gpg_invocation = "gpg --no-default-keyring --keyring %s" +\ - " --with-colons --fingerprint --fingerprint" - keys = {} fpr_lookup = {} @@ -1190,11 +1190,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] @@ -1214,6 +1217,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() @@ -1852,6 +1859,9 @@ class SignatureHistory(ORMObject): self.contents_sha1 = signed_file.contents_sha1() return self + def query(self, session): + return session.query(SignatureHistory).filter_by(fingerprint=self.fingerprint, signature_timestamp=self.signature_timestamp, contents_sha1=self.contents_sha1).first() + __all__.append('SignatureHistory') ################################################################################ @@ -1978,6 +1988,12 @@ class DBSource(ORMObject): fileset.add(name) return fileset + @property + def proxy(self): + session = object_session(self) + query = session.query(SourceMetadata).filter_by(source=self) + return MetadataProxy(session, query) + __all__.append('DBSource') @session_wrapper @@ -2472,6 +2488,37 @@ __all__.append('SourceMetadata') ################################################################################ +class MetadataProxy(object): + def __init__(self, session, query): + self.session = session + self.query = query + + def _get(self, key): + metadata_key = self.session.query(MetadataKey).filter_by(key=key).first() + if metadata_key is None: + return None + metadata = self.query.filter_by(key=metadata_key).first() + return metadata + + def __contains__(self, key): + if self._get(key) is not None: + return True + return False + + def __getitem__(self, key): + metadata = self._get(key) + if metadata is None: + raise KeyError + return metadata.value + + def get(self, key, default=None): + try: + return self[key] + except KeyError: + return default + +################################################################################ + class VersionCheck(ORMObject): def __init__(self, *args, **kwargs): pass