summaryrefslogtreecommitdiffstats
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-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: