diff options
Diffstat (limited to 'lib/thandy/packagesys')
-rw-r--r-- | lib/thandy/packagesys/ExePackages.py | 37 | ||||
-rw-r--r-- | lib/thandy/packagesys/PackageDB.py | 45 | ||||
-rw-r--r-- | lib/thandy/packagesys/PackageSystem.py | 35 | ||||
-rw-r--r-- | lib/thandy/packagesys/RPMPackages.py | 39 |
4 files changed, 129 insertions, 27 deletions
diff --git a/lib/thandy/packagesys/ExePackages.py b/lib/thandy/packagesys/ExePackages.py index 1688da3..4989f3a 100644 --- a/lib/thandy/packagesys/ExePackages.py +++ b/lib/thandy/packagesys/ExePackages.py @@ -1,15 +1,38 @@ # Copyright 2008 The Tor Project, Inc. See LICENSE for licensing information. +import subprocess + +import thandy.util import thandy.packagesys.PackageSystem as ps import thandy.packagesys.PackageDB as pdb class ExePackageSystem(pdb.DBBackedPackageSystem): + def __init__(self, repo): + self._repo = repo def getName(self): - return "executable" - - def packageHandleFromJSON(self, json): - raise NotImplemented() #XXXX???? + return "exe" + + def packageHandlesFromJSON(self, pkg): + if pkg['format'] != 'exe': + raise thandy.FormatException() + + handles = [] + for entry in pkg['files']: + if len(entry) < 3: + continue + rp, h, extra = entry[:3] + version = package['version'] + + handles.append( + ExePackageHandle(self.getDB(), + package['name'], + version, + [], # filelist not implemented in this. + rp, + self._repo.getFilename(rp), + extra['exe_args'])) + return handles def canBeAutomatic(self): return True @@ -18,12 +41,16 @@ class ExePackageSystem(pdb.DBBackedPackageSystem): return True class ExePackageHandle(pdb.DBBackedPackageHandle): - def __init__(self, packageDB, name, version, filelist, filename, + def __init__(self, packageDB, name, version, filelist, relpath, filename, arguments): pdb.DBBackedPackageHandle.__init__(packageDB, name, version, filelist) + self._relPath = relpath self._filename = filename self._arguments = arguments + def getRelativePath(self): + return self._relPath + def _doInstall(self): commandline = [ self._filename ] + self._arguments logging.info("Installing %s. Command line: %s", self._filename, diff --git a/lib/thandy/packagesys/PackageDB.py b/lib/thandy/packagesys/PackageDB.py index bb218be..c829ac3 100644 --- a/lib/thandy/packagesys/PackageDB.py +++ b/lib/thandy/packagesys/PackageDB.py @@ -1,34 +1,48 @@ # Copyright 2008 The Tor Project, Inc. See LICENSE for licensing information. import anydbm +import atexit import shelve import thandy.util import thandy.formats -class SimplePackageDB: +import thandy.packagesys.PackageSystem +class SimplePackageDB: def __init__(self, filename): + thandy.util.ensureParent(filename) self._db = anydbm.open(filename, 'c') + atexit.register(self.close) + + def close(self): + self._db.close() def setVersion(self, package, version, filelist): - pass + self._db['pv_%s'%package] = (version, filelist) def setInstallParameters(self, package, params): - pass + self._db['ip_%s'%package] = params def getCurVersion(self, package): - pass + v = self._db.get('pv_%s'%package) + if v != None: + return v[0] def getInstallParameters(self, package): - pass + return self._db.get('pi_%s'%package) +class DBBackedPackageSystem(thandy.packagesys.PackageSystem.PackageSystem): + def __init__(self): + self._packageDB = None -class DBBackedPackageSystem(thandy.packagesys.PackageSystem): - def __init__(self, packageDB): - self._packageDB = packageDB + def getDB(self): + if self._packageDB is None: + fname = thandy.util.userFilename("db/packages") + self._packageDB = pdb.PackageDB(fname) + return self._packageDB -class DBBackedPackageHandle(thandy.packagesys.PackageHandle): +class DBBackedPackageHandle(thandy.packagesys.PackageSystem.PackageHandle): def __init__(self, packageDB, name, version, filelist): thandy.packagesys.PackageSystem.PackageHandle.__init__(self) self._packageDB = packageDB @@ -68,14 +82,13 @@ class DBBackedPackageHandle(thandy.packagesys.PackageHandle): if not os.path.exists(fn): all_ok = False else: - f = open(fn, 'rb') try: - try: - d = thandy.formats.getFileDigest(f) - except OSError: + d = thandy.formats.getFileDigest(fn) + if d != hash: all_ok = False - break - finally: - f.close() + except OSError: + all_ok = False + break + return all_ok diff --git a/lib/thandy/packagesys/PackageSystem.py b/lib/thandy/packagesys/PackageSystem.py index ad1e221..784de2d 100644 --- a/lib/thandy/packagesys/PackageSystem.py +++ b/lib/thandy/packagesys/PackageSystem.py @@ -1,10 +1,40 @@ # Copyright 2008 The Tor Project, Inc. See LICENSE for licensing information. +class PackageMetasystem: + def __init__(self, repository): + self._repostitory = repository + self._systems = {} + + def addPackageSystem(self, system): + self._systems[system.getName()] = system + + def getSysForPackage(self, pkg): + return self._systems.get(pkg['format'], None) + + @staticmethod + def create(repository): + r = PackageMetasystem(repository) + + try: + import rpm + except ImportError: + pass + else: + import thandy.packagesys.RPMPackages + r.addPackageSystem(thandy.packagesys.RPMPackages.RPMPackageSystem( + repository)) + + import thandy.packagesys.ExePackages + r.addPackageSystem(thandy.packagesys.ExePackages.ExePackageSystem( + repository)) + + return r + class PackageSystem: def getName(self): raise NotImplemented() - def packageHandleFromJSON(self, json): + def packageHandlesFromJSON(self, json): raise NotImplemented() def canBeAutomatic(self): @@ -39,6 +69,9 @@ class PackageTransaction: self._transactions.append(packageHandle.remove) class PackageHandle: + def getRelativePath(self): + raise NotImplemented() + def isInstalled(self, transaction=None): raise NotImplemented() diff --git a/lib/thandy/packagesys/RPMPackages.py b/lib/thandy/packagesys/RPMPackages.py index 5e4c960..4d0f326 100644 --- a/lib/thandy/packagesys/RPMPackages.py +++ b/lib/thandy/packagesys/RPMPackages.py @@ -6,14 +6,39 @@ import os import rpm import md5 +import thandy.formats + __all__ = [ 'RPMPackageSystem' ] class RPMPackageSystem(thandy.packagesys.PackageSystem.PackageSystem): + def __init__(self, repo): + self._repo = repo + def getName(self): - return "RPM" + return "rpm" + + def packageHandlesFromJSON(self, package): + if package['format'] != 'rpm': + raise thandy.FormatException() + + handles = [] + for entry in package['files']: + if len(entry) < 3: + continue + fn, h, extra = entry[:3] + name = os.path.split(fn)[1] - def packageHandleFromJSON(self, json): - raise NotImplemented() # XXXX + try: + version = extra['rpm_version'] + except KeyError: + raise thandy.FormatException() + + handles.append(RPMPackageHandle(name, + version, + fn, + self._repo.getFilename(fn))) + + return handles def getTransaction(self): return RPMPackageTransaction() @@ -115,7 +140,7 @@ def checkRPMInstall(name, version, ts=None): logging.info("%s is missing or unreadable from %s %s; " "that's ok.", fname, name, h['version']) else: - logging.warn("%s is missing or unreadable from %s %s." + logging.warn("%s is missing or unreadable from %s %s.", fname, name, h['version']) all_ok = False elif haveMD5 == md5sum: @@ -131,11 +156,15 @@ def checkRPMInstall(name, version, ts=None): return found and all_ok class RPMPackageHandle(thandy.packagesys.PackageSystem.PackageHandle): - def __init__(self, name, version, filename): + def __init__(self, name, version, relativePath, filename): self._name = name self._version = version + self._relPath = relativePath self._filename = filename + def getRelativePath(self): + return self._relPath + def anyVersionInstalled(self, transaction=None): return len(getInstalledRPMVersions(self.name, transaction)) > 1 |