Updated mcollective.init according to OSCI-658
[packages/precise/mcollective.git] / ext / action_helpers / python / romke / mcollectiveah.py
diff --git a/ext/action_helpers/python/romke/mcollectiveah.py b/ext/action_helpers/python/romke/mcollectiveah.py
new file mode 100644 (file)
index 0000000..bca8ab6
--- /dev/null
@@ -0,0 +1,69 @@
+#!/bin/env python
+# -*- coding: utf-8 -*- vim: set ts=4 et sw=4 fdm=indent :
+import os, sys
+
+try:
+    import simplejson
+except ImportError:
+    sys.stderr.write('Unable to load simplejson python module.')
+    sys.exit(1)
+
+class MCollectiveActionNoEnv(Exception):
+    pass
+class MCollectiveActionFileError(Exception):
+    pass
+
+class MCollectiveAction(object):
+    def __init__(self, *args, **kwargs):
+        try:
+            self.infile = os.environ['MCOLLECTIVE_REQUEST_FILE']
+        except KeyError:
+            raise MCollectiveActionNoEnv("No MCOLLECTIVE_REQUEST_FILE environment variable")
+        try:
+            self.outfile = os.environ['MCOLLECTIVE_REPLY_FILE']
+        except KeyError:
+            raise MCollectiveActionNoEnv("No MCOLLECTIVE_REPLY_FILE environment variable")
+
+        self.request = {}
+        self.reply = {}
+
+        self.load()
+
+    def load(self):
+        if not self.infile:
+            return False
+        try:
+            infile = open(self.infile, 'r')
+            self.request = simplejson.load(infile)
+            infile.close()
+        except IOError, e:
+            raise MCollectiveActionFileError("Could not read request file `%s`: %s" % (self.infile, e))
+        except simplejson.JSONDecodeError, e:
+            infile.close()
+            raise MCollectiveActionFileError("Could not parse JSON data in file `%s`: %s", (self.infile, e))
+
+    def send(self):
+        if not getattr(self, 'outfile', None): # if exception was raised during or before setting self.outfile
+            return False
+        try:
+            outfile = open(self.outfile, 'w')
+            simplejson.dump(self.reply, outfile)
+            outfile.close()
+        except IOError, e:
+            raise MCollectiveActionFileError("Could not write reply file `%s`: %s" % (self.outfile, e))
+
+    def error(self, msg):
+        """Prints line to STDERR that will be logged at error level in the mcollectived log file"""
+        sys.stderr.write("%s\n" % msg)
+
+    def fail(self, msg):
+        """Logs error message and exitst with RPCAborted"""
+        self.error(msg)
+        sys.exit(1)
+
+    def info(self, msg):
+        """Prints line to STDOUT that will be logged at info level in the mcollectived log file"""
+        sys.stdout.write("%s\n" % msg)
+
+    def __del__(self):
+        self.send()