summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Olla <ollan@deshawresearch.com>2014-07-14 10:49:44 -0400
committerNathan Olla <ollan@deshawresearch.com>2014-07-14 10:49:44 -0400
commitc1e30f4bc8a03a9be535bf126e993ff45e8ab382 (patch)
tree4e28c22274fd441c69877df54b8277647d80b20b
parent58e9167a8614e2c549e000b697ca88d5b59b5d7b (diff)
downloadbcfg2-c1e30f4bc8a03a9be535bf126e993ff45e8ab382.tar.gz
bcfg2-c1e30f4bc8a03a9be535bf126e993ff45e8ab382.tar.bz2
bcfg2-c1e30f4bc8a03a9be535bf126e993ff45e8ab382.zip
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.
-rw-r--r--src/lib/Bcfg2/Client/Tools/SYSV.py48
1 files changed, 46 insertions, 2 deletions
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: