summaryrefslogtreecommitdiff
path: root/lib/thandy/packagesys
diff options
context:
space:
mode:
Diffstat (limited to 'lib/thandy/packagesys')
-rw-r--r--lib/thandy/packagesys/ExePackages.py37
-rw-r--r--lib/thandy/packagesys/PackageDB.py45
-rw-r--r--lib/thandy/packagesys/PackageSystem.py35
-rw-r--r--lib/thandy/packagesys/RPMPackages.py39
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