summaryrefslogtreecommitdiffstats
path: root/src/lib/Client/Tools/Action.py
diff options
context:
space:
mode:
authorNarayan Desai <desai@mcs.anl.gov>2007-01-24 02:19:43 +0000
committerNarayan Desai <desai@mcs.anl.gov>2007-01-24 02:19:43 +0000
commitb238887ad8172c6a613b7d68bb551dac1aac57bb (patch)
tree1a0ce284f2c9b2b95447f4ea768b02e68f04797b /src/lib/Client/Tools/Action.py
parent9182bcf5871ee041e789bb48d057323b6bc6b4b1 (diff)
downloadbcfg2-b238887ad8172c6a613b7d68bb551dac1aac57bb.tar.gz
bcfg2-b238887ad8172c6a613b7d68bb551dac1aac57bb.tar.bz2
bcfg2-b238887ad8172c6a613b7d68bb551dac1aac57bb.zip
Implement Action support
- Schema addition for bundles/rules - Tool driver for actions - Frame support for pre-actions and post-actions - Frame blacklist support (to preclude blocked entries from getting installed on the post-clobber pass) git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@2713 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src/lib/Client/Tools/Action.py')
-rw-r--r--src/lib/Client/Tools/Action.py52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/lib/Client/Tools/Action.py b/src/lib/Client/Tools/Action.py
new file mode 100644
index 000000000..ddd15a264
--- /dev/null
+++ b/src/lib/Client/Tools/Action.py
@@ -0,0 +1,52 @@
+'''Action driver'''
+__revision__ = '$Revision$'
+
+import Bcfg2.Client.Tools
+
+# <Action timing='pre|post|both' name='name' command='cmd text' when='always|modified'
+# status='ignore|check'/>
+# <PostInstall name='foo'/>
+# => <Action timing='post' when='modified' name='n' command='foo' status='ignore'/>
+
+class Action(Bcfg2.Client.Tools.Tool):
+ '''Implement Actions'''
+ __name__ = 'Action'
+ __handles__ = [('PostInstall', None), ('Action', None)]
+ __req__ = {'PostInstall': ['name'],
+ 'Action':['name', 'timing', 'when', 'command', 'status']}
+
+ def RunAction(self, entry):
+ '''This method handles command execution and status return'''
+ self.logger.debug("Running Action %s" % (entry.get('name')))
+ rc = self.cmd.run(entry.get('command'))[0]
+ self.logger.debug("Action: %s got rc %s" % (entry.get('command'), rc))
+ if entry.get('status', 'check') == 'ignore':
+ return True
+ else:
+ return rc == 0
+
+ def VerifyAction(self, dummy, _):
+ '''Actions always verify true'''
+ return True
+
+ def InstallAction(self, entry):
+ '''Run actions as pre-checks for bundle installation'''
+ if entry.get('timing') != 'post':
+ self.states[entry] = self.RunAction(entry)
+ return self.states[entry]
+ return True
+
+ def BundleUpdated(self, bundle):
+ '''Run postinstalls when bundles have been updated'''
+ for postinst in bundle.findall("PostInstall"):
+ self.cmd.run(postinst.get('name'))
+ for action in bundle.findall("Action"):
+ if action.get('timing') in ['post', 'both']:
+ self.states[action] = self.RunAction(action)
+
+ def BundleNotUpdated(self, bundle):
+ '''Run Actions when bundles have not been updated'''
+ for action in bundle.findall("Action"):
+ if action.get('timing') in ['post', 'both'] and \
+ action.get('when') != 'modified':
+ self.states[action] = self.RunAction(action)