summaryrefslogtreecommitdiffstats
path: root/src/lib/Bcfg2/Client
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/Bcfg2/Client')
-rw-r--r--src/lib/Bcfg2/Client/Proxy.py39
-rw-r--r--src/lib/Bcfg2/Client/Tools/Action.py2
-rw-r--r--src/lib/Bcfg2/Client/Tools/POSIX/File.py8
-rw-r--r--src/lib/Bcfg2/Client/Tools/RPM.py5
-rw-r--r--src/lib/Bcfg2/Client/Tools/YUM.py27
-rw-r--r--src/lib/Bcfg2/Client/__init__.py16
6 files changed, 70 insertions, 27 deletions
diff --git a/src/lib/Bcfg2/Client/Proxy.py b/src/lib/Bcfg2/Client/Proxy.py
index cf6efac89..679b4c52b 100644
--- a/src/lib/Bcfg2/Client/Proxy.py
+++ b/src/lib/Bcfg2/Client/Proxy.py
@@ -119,7 +119,7 @@ class SSLHTTPConnection(httplib.HTTPConnection):
"""
def __init__(self, host, port=None, strict=None, timeout=90, key=None,
- cert=None, ca=None, scns=None, protocol='xmlrpc/ssl'):
+ cert=None, ca=None, scns=None, protocol='xmlrpc/tlsv1'):
"""Initializes the `httplib.HTTPConnection` object and stores security
parameters
@@ -144,15 +144,15 @@ class SSLHTTPConnection(httplib.HTTPConnection):
specify the same file as `cert` if using a file that
contains both. See
http://docs.python.org/library/ssl.html#ssl-certificates
- for details. Required if using xmlrpc/ssl with client
- certificate authentication.
+ for details. Required if using client certificate
+ authentication.
cert : string, optional
The file system path to the local endpoint's SSL
certificate. May specify the same file as `cert` if using
a file that contains both. See
http://docs.python.org/library/ssl.html#ssl-certificates
- for details. Required if using xmlrpc/ssl with client
- certificate authentication.
+ for details. Required if using client certificate
+ authentication.
ca : string, optional
The file system path to a set of concatenated certificate
authority certs, which are used to validate certificates
@@ -232,7 +232,8 @@ class SSLHTTPConnection(httplib.HTTPConnection):
class XMLRPCTransport(xmlrpclib.Transport):
def __init__(self, key=None, cert=None, ca=None,
- scns=None, use_datetime=0, timeout=90):
+ scns=None, use_datetime=0, timeout=90,
+ protocol='xmlrpc/tlsv1'):
if hasattr(xmlrpclib.Transport, '__init__'):
xmlrpclib.Transport.__init__(self, use_datetime)
self.key = key
@@ -240,6 +241,7 @@ class XMLRPCTransport(xmlrpclib.Transport):
self.ca = ca
self.scns = scns
self.timeout = timeout
+ self.protocol = protocol
def make_connection(self, host):
host, self._extra_headers = self.get_host_info(host)[0:2]
@@ -248,7 +250,8 @@ class XMLRPCTransport(xmlrpclib.Transport):
cert=self.cert,
ca=self.ca,
scns=self.scns,
- timeout=self.timeout)
+ timeout=self.timeout,
+ protocol=self.protocol)
def request(self, host, handler, request_body, verbose=0):
"""Send request to server and return response."""
@@ -291,9 +294,15 @@ class ComponentProxy(xmlrpclib.ServerProxy):
"""Constructs proxies to components. """
options = [
- Bcfg2.Options.Common.location, Bcfg2.Options.Common.ssl_key,
- Bcfg2.Options.Common.ssl_cert, Bcfg2.Options.Common.ssl_ca,
+ Bcfg2.Options.Common.location, Bcfg2.Options.Common.ssl_ca,
Bcfg2.Options.Common.password, Bcfg2.Options.Common.client_timeout,
+ Bcfg2.Options.Common.protocol,
+ Bcfg2.Options.PathOption(
+ '--ssl-key', cf=('communication', 'key'), dest="key",
+ help='Path to SSL key'),
+ Bcfg2.Options.PathOption(
+ cf=('communication', 'certificate'), dest="cert",
+ help='Path to SSL certificate'),
Bcfg2.Options.Option(
"-u", "--user", default="root", cf=('communication', 'user'),
help='The user to provide for authentication'),
@@ -323,10 +332,12 @@ class ComponentProxy(xmlrpclib.ServerProxy):
path)
else:
url = Bcfg2.Options.setup.server
- ssl_trans = XMLRPCTransport(Bcfg2.Options.setup.key,
- Bcfg2.Options.setup.cert,
- Bcfg2.Options.setup.ca,
- Bcfg2.Options.setup.ssl_cns,
- Bcfg2.Options.setup.client_timeout)
+ ssl_trans = XMLRPCTransport(
+ key=Bcfg2.Options.setup.key,
+ cert=Bcfg2.Options.setup.cert,
+ ca=Bcfg2.Options.setup.ca,
+ scns=Bcfg2.Options.setup.ssl_cns,
+ timeout=Bcfg2.Options.setup.client_timeout,
+ protocol=Bcfg2.Options.setup.protocol)
xmlrpclib.ServerProxy.__init__(self, url,
allow_none=True, transport=ssl_trans)
diff --git a/src/lib/Bcfg2/Client/Tools/Action.py b/src/lib/Bcfg2/Client/Tools/Action.py
index 5549b1717..dedc50d89 100644
--- a/src/lib/Bcfg2/Client/Tools/Action.py
+++ b/src/lib/Bcfg2/Client/Tools/Action.py
@@ -36,7 +36,7 @@ class Action(Bcfg2.Client.Tools.Tool):
shell = True
shell_string = '(in shell) '
- if not Bcfg2.Options.setup.dryrun:
+ if not Bcfg2.Options.setup.dry_run:
if Bcfg2.Options.setup.interactive:
prompt = ('Run Action %s%s, %s: (y/N): ' %
(shell_string, entry.get('name'),
diff --git a/src/lib/Bcfg2/Client/Tools/POSIX/File.py b/src/lib/Bcfg2/Client/Tools/POSIX/File.py
index 0452ea258..fc445e07c 100644
--- a/src/lib/Bcfg2/Client/Tools/POSIX/File.py
+++ b/src/lib/Bcfg2/Client/Tools/POSIX/File.py
@@ -220,8 +220,12 @@ class POSIXFile(POSIXTool):
def _diff(self, content1, content2, filename=None):
""" Return a unified diff of the two strings """
- fromfile = "%s (on disk)" % filename if filename else ""
- tofile = "%s (from bcfg2)" % filename if filename else ""
+ if filename:
+ fromfile = "%s (on disk)" % filename
+ tofile = "%s (from bcfg2)" % filename
+ else:
+ fromfile = ""
+ tofile = ""
return difflib.unified_diff(content1.split('\n'),
content2.split('\n'),
fromfile=fromfile,
diff --git a/src/lib/Bcfg2/Client/Tools/RPM.py b/src/lib/Bcfg2/Client/Tools/RPM.py
index 173623f61..464b7e389 100644
--- a/src/lib/Bcfg2/Client/Tools/RPM.py
+++ b/src/lib/Bcfg2/Client/Tools/RPM.py
@@ -1120,7 +1120,7 @@ class RPM(Bcfg2.Client.Tools.PkgTool):
help="Install missing packages"),
Bcfg2.Options.Option(
cf=('RPM', 'erase_flags'), default=["allmatches"],
- dest="rpm_erase_flags",
+ dest="rpm_erase_flags", type=Bcfg2.Options.Types.comma_list,
help="RPM erase flags"),
Bcfg2.Options.BooleanOption(
cf=('RPM', 'fix_version'), default=True,
@@ -1131,7 +1131,8 @@ class RPM(Bcfg2.Client.Tools.PkgTool):
dest="rpm_reinstall_broken",
help="Reinstall packages that fail to verify"),
Bcfg2.Options.Option(
- cf=('RPM', 'verify_flags'), default=[], dest="rpm_verify_flags",
+ cf=('RPM', 'verify_flags'), default=[],
+ dest="rpm_verify_flags", type=Bcfg2.Options.Types.comma_list,
help="RPM verify flags")]
__execs__ = ['/bin/rpm', '/var/lib/rpm']
diff --git a/src/lib/Bcfg2/Client/Tools/YUM.py b/src/lib/Bcfg2/Client/Tools/YUM.py
index ee1cd6fad..21fc05b0d 100644
--- a/src/lib/Bcfg2/Client/Tools/YUM.py
+++ b/src/lib/Bcfg2/Client/Tools/YUM.py
@@ -133,7 +133,7 @@ class YUM(Bcfg2.Client.Tools.PkgTool):
help="Install missing packages"),
Bcfg2.Options.Option(
cf=('YUM', 'erase_flags'), default=["allmatches"],
- dest="yum_erase_flags",
+ dest="yum_erase_flags", type=Bcfg2.Options.Types.comma_list,
help="YUM erase flags"),
Bcfg2.Options.BooleanOption(
cf=('YUM', 'fix_version'), default=True,
@@ -144,8 +144,17 @@ class YUM(Bcfg2.Client.Tools.PkgTool):
dest="yum_reinstall_broken",
help="Reinstall packages that fail to verify"),
Bcfg2.Options.Option(
- cf=('YUM', 'verify_flags'), default=[], dest="yum_verify_flags",
- help="YUM verify flags")]
+ cf=('YUM', 'verify_flags'), default=[],
+ dest="yum_verify_flags", type=Bcfg2.Options.Types.comma_list,
+ help="YUM verify flags"),
+ Bcfg2.Options.Option(
+ cf=('YUM', 'disabled_plugins'), default=[],
+ type=Bcfg2.Options.Types.comma_list, dest="yum_disabled_plugins",
+ help="YUM disabled plugins"),
+ Bcfg2.Options.Option(
+ cf=('YUM', 'enabled_plugins'), default=[],
+ type=Bcfg2.Options.Types.comma_list, dest="yum_enabled_plugins",
+ help="YUM enabled plugins")]
pkgtype = 'yum'
__execs__ = []
@@ -218,6 +227,10 @@ class YUM(Bcfg2.Client.Tools.PkgTool):
self.logger.debug("Yum: installonlypkgs: %s" % self.installonlypkgs)
self.logger.debug("Yum: verify_flags: %s" %
Bcfg2.Options.setup.yum_verify_flags)
+ self.logger.debug("Yum: disabled_plugins: %s" %
+ Bcfg2.Options.setup.yum_disabled_plugins)
+ self.logger.debug("Yum: enabled_plugins: %s" %
+ Bcfg2.Options.setup.yum_enabled_plugins)
def _loadYumBase(self):
''' this may be called before PkgTool.__init__() is called on
@@ -240,6 +253,14 @@ class YUM(Bcfg2.Client.Tools.PkgTool):
else:
debuglevel = 0
+ if len(Bcfg2.Options.setup.yum_disabled_plugins) > 0:
+ rv.preconf.disabled_plugins = \
+ Bcfg2.Options.setup.yum_disabled_plugins
+
+ if len(Bcfg2.Options.setup.yum_enabled_plugins) > 0:
+ rv.preconf.enabled_plugins = \
+ Bcfg2.Options.setup.yum_enabled_plugins
+
# pylint: disable=E1121,W0212
try:
rv.preconf.debuglevel = debuglevel
diff --git a/src/lib/Bcfg2/Client/__init__.py b/src/lib/Bcfg2/Client/__init__.py
index 073aa7694..5f4f15dcc 100644
--- a/src/lib/Bcfg2/Client/__init__.py
+++ b/src/lib/Bcfg2/Client/__init__.py
@@ -873,15 +873,21 @@ class Client(object):
def GenerateStats(self):
"""Generate XML summary of execution statistics."""
+ states = {}
+ for (item, val) in list(self.states.items()):
+ if not Bcfg2.Options.setup.only_important or \
+ item.get('important', 'false').lower() == 'true':
+ states[item] = val
+
feedback = XML.Element("upload-statistics")
stats = XML.SubElement(feedback,
- 'Statistics', total=str(len(self.states)),
+ 'Statistics', total=str(len(states)),
version='2.0',
revision=self.config.get('revision', '-1'))
- good_entries = [key for key, val in list(self.states.items()) if val]
+ good_entries = [key for key, val in list(states.items()) if val]
good = len(good_entries)
stats.set('good', str(good))
- if any(not val for val in list(self.states.values())):
+ if any(not val for val in list(states.values())):
stats.set('state', 'dirty')
else:
stats.set('state', 'clean')
@@ -890,8 +896,8 @@ class Client(object):
for (data, ename) in [(self.modified, 'Modified'),
(self.extra, "Extra"),
(good_entries, "Good"),
- ([entry for entry in self.states
- if not self.states[entry]], "Bad")]:
+ ([entry for entry in states
+ if not states[entry]], "Bad")]:
container = XML.SubElement(stats, ename)
for item in data:
item.set('qtext', '')