From c1e30f4bc8a03a9be535bf126e993ff45e8ab382 Mon Sep 17 00:00:00 2001 From: Nathan Olla Date: Mon, 14 Jul 2014 10:49:44 -0400 Subject: SYSV: Implement downloading and installing SYSV packages from HTTP pkgadd has different syntax for different sources (datastream and file system format) which makes using a single pkgtool variable difficult. Also, SYSV packages in datastream format don't necessarily have uniform names. Therefore, use the existing 'simplename' attribute to specify the datastream file name. --- src/lib/Bcfg2/Client/Tools/SYSV.py | 48 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) (limited to 'src/lib/Bcfg2/Client/Tools/SYSV.py') diff --git a/src/lib/Bcfg2/Client/Tools/SYSV.py b/src/lib/Bcfg2/Client/Tools/SYSV.py index aca7d593c..c17c3b712 100644 --- a/src/lib/Bcfg2/Client/Tools/SYSV.py +++ b/src/lib/Bcfg2/Client/Tools/SYSV.py @@ -4,6 +4,9 @@ import tempfile from Bcfg2.Compat import any # pylint: disable=W0622 import Bcfg2.Client.Tools import Bcfg2.Client.XML +import urllib +import copy + # pylint: disable=C0103 noask = ''' @@ -37,6 +40,8 @@ class SYSV(Bcfg2.Client.Tools.PkgTool): # noaskfile needs to live beyond __init__ otherwise file is removed self.noaskfile = tempfile.NamedTemporaryFile() self.noaskname = self.noaskfile.name + # for any pkg files downloaded + self.tmpfiles = [] try: self.noaskfile.write(noask) # flush admin file contents to disk @@ -46,6 +51,45 @@ class SYSV(Bcfg2.Client.Tools.PkgTool): except: # pylint: disable=W0702 self.pkgtool = (self.pkgtool[0] % "", self.pkgtool[1]) + def pkgmogrify(self, pkg): + """ Take a pkg object, check for a 'simplename' attribute. If found, + return a modified pkg object that points to to a temporary file + """ + if pkg.get('simplename'): + self.logger.debug("Pkgmogrifying %s because simplename %s found" % + (pkg.get('name'), pkg.get('simplename'))) + tmpfile = tempfile.NamedTemporaryFile() + self.tmpfiles.append(tmpfile) + self.logger.debug("URL: %s/%s" % + (pkg.get('url'), pkg.get('simplename'))) + urllib.urlretrieve("%s/%s" % + (pkg.get('url'), pkg.get('simplename')), + tmpfile.name) + newpkg = copy.copy(pkg) + newpkg.set('url', tmpfile.name) + return newpkg + return pkg + + def Install(self, packages, states): + for pkg in packages: + pkg = self.pkgmogrify(pkg) + if self.VerifyPackage(pkg, []): + self.logger.info("Forcing state to true for pkg %s" % + (pkg.get('name'))) + states[pkg] = True + else: + self.logger.info("Installing pkg %s version %s" % + (pkg.get('name'), pkg.get('version'))) + + if self.cmd.run(self._get_package_command([pkg])): + states[pkg] = True + else: + self.logger.error("Failed to install package %s" % + pkg.get('name')) + + self.RefreshPackages() + self.modified.extend(entry for entry in packages if states[entry]) + def RefreshPackages(self): """Refresh memory hashes of packages.""" self.installed = {} @@ -80,8 +124,8 @@ class SYSV(Bcfg2.Client.Tools.PkgTool): self.logger.debug("Package %s not installed" % entry.get("name")) else: - if (self.setup['quick'] or - entry.attrib.get('verify', 'true') == 'false'): + if self.setup['quick'] or \ + entry.attrib.get('verify', 'true') == 'false': return True rv = self.cmd.run("/usr/sbin/pkgchk -n %s" % entry.get('name')) if rv.success: -- cgit v1.2.3-1-g7c22