summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNarayan Desai <desai@mcs.anl.gov>2008-09-24 01:41:41 +0000
committerNarayan Desai <desai@mcs.anl.gov>2008-09-24 01:41:41 +0000
commit3b3a1333d9db9185e62df5b8275836bbbb23a937 (patch)
treebe798b8393217a4de3db26fd720d76e86ae28382 /src
parent78c67fca3ca6c9973d7ada5cd0d9ccf7c6d55f18 (diff)
downloadbcfg2-3b3a1333d9db9185e62df5b8275836bbbb23a937.tar.gz
bcfg2-3b3a1333d9db9185e62df5b8275836bbbb23a937.tar.bz2
bcfg2-3b3a1333d9db9185e62df5b8275836bbbb23a937.zip
Implement client side of server-delegated decision support
git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@4919 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src')
-rw-r--r--src/lib/Client/Frame.py14
-rw-r--r--src/lib/Options.py2
-rwxr-xr-xsrc/sbin/bcfg211
3 files changed, 27 insertions, 0 deletions
diff --git a/src/lib/Client/Frame.py b/src/lib/Client/Frame.py
index a54760b12..009ee61ec 100644
--- a/src/lib/Client/Frame.py
+++ b/src/lib/Client/Frame.py
@@ -148,6 +148,20 @@ class Frame:
candidates = [entry for entry in self.states if not self.states[entry]]
self.whitelist = [entry for entry in self.states if not self.states[entry]]
+ # Need to process decision stuff early, so that dryrun mode works with it
+ if self.setup['decision'] == 'whitelist':
+ dwl = self.setup['decision_list'][0]
+ self.whitelist = [e for e in self.whitelist \
+ if (e.tag, e.get('name')) in dwl or \
+ (e.tag, '*') in dwl or \
+ ('*', e.get('name')) in dwl]
+ elif self.setup['decision'] == 'blacklist':
+ dbl = self.setup['decision_list'][1]
+ self.whitelist = [e for e in self.whitelist \
+ if (e.tag, e.get('name')) not in dbl and \
+ (e.tag, '*') not in dbl and \
+ ('*', e.get('name')) not in dbl]
+
if self.dryrun:
if self.whitelist:
self.logger.info("In dryrun mode: suppressing entry installation for:")
diff --git a/src/lib/Options.py b/src/lib/Options.py
index bea1e4178..54ff8bbcb 100644
--- a/src/lib/Options.py
+++ b/src/lib/Options.py
@@ -227,6 +227,8 @@ CLIENT_BUNDLE = Option('only configure the given bundle', default=[],
cmd='-b', odesc='<bundle>', cook=colon_split)
CLIENT_KEVLAR = Option('run in kevlar (bulletproof) mode', default=False,
cmd='-k', )
+CLIENT_DLIST = Option('run client in server decision list mode', default=False,
+ cmd='-l', odesc='<whitelist|blacklist>')
CLIENT_BUILD = Option('run in build mode', default=False, cmd='-B', )
CLIENT_FILE = Option('configure from a file rather than querying the server',
default=False, cmd='-f', odesc='<specification path>')
diff --git a/src/sbin/bcfg2 b/src/sbin/bcfg2
index 42371009f..a151b9fd8 100755
--- a/src/sbin/bcfg2
+++ b/src/sbin/bcfg2
@@ -121,6 +121,7 @@ class Client:
'encoding': Bcfg2.Options.ENCODING,
'omit-lock-check': Bcfg2.Options.OMIT_LOCK_CHECK,
'filelog': Bcfg2.Options.LOGGING_FILE_PATH,
+ 'decision': Bcfg2.Options.CLIENT_DLIST,
}
self.setup = Bcfg2.Options.OptionParser(optinfo)
@@ -256,6 +257,16 @@ class Client:
times['probe_upload'] = time.time()
+ if self.setup['decision'] in ['whitelist', 'blacklist']:
+ try:
+ self.setup['decision_list'] = proxy.GetDecisionList()
+ except xmlrpclib.Fault, f:
+ if f.faultCode == 1:
+ print "GetDecisionList method not supported by server"
+ else:
+ self.logger.error("Failed to de", exc_info=1)
+ raise SystemExit(1)
+
try:
rawconfig = proxy.GetConfig()
except xmlrpclib.Fault: