summaryrefslogtreecommitdiff
path: root/lib/thandy/packagesys
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2008-11-16 22:27:17 +0000
committerNick Mathewson <nickm@torproject.org>2008-11-16 22:27:17 +0000
commit48adf40595f127c2bd167aa6774f4ba67e191c0f (patch)
tree8f200231a5f2a6f4f45a3f964f847457c5da5f00 /lib/thandy/packagesys
parent115bc0308c9384967ed25975aa21a312a2591524 (diff)
attach per-file type-specific metainfo to packages. use metainfo to tell what is already installed. use database to track things we have installed with not attacked version. notice when we have installable files and optionally install them.
git-svn-id: file:///home/or/svnrepo/updater/trunk@17294 55e972cd-5a19-0410-ae62-a4d7a52db4cd
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