--- /dev/null
+#!/usr/bin/env python
+
+import os
+import sys
+
+class Error(Exception):
+ pass
+
+class MissingModule(Error):
+ pass
+
+class MissingFiles(Error):
+ pass
+
+class MissingEnvironemntVariable(Error):
+ pass
+
+class FileReadError(Error):
+ pass
+
+class JSONParsingError(Error):
+ pass
+
+try:
+ import simplejson as json
+except ImportError:
+ raise MissingModule('Unable to load JSON module. Missing module?')
+
+class MCollectiveAction(object):
+
+ _environment_variables = [ 'MCOLLECTIVE_REQUEST_FILE',
+ 'MCOLLECTIVE_REPLY_FILE' ]
+
+ def __init__(self):
+ self._info = sys.__stdout__
+ self._error = sys.__stderr__
+
+ for entry in '_reply', '_request':
+ self.__dict__[entry] = {}
+
+ self._arguments = sys.argv[1:]
+
+ if len(self._arguments) < 2:
+ try:
+ for variable in self._environment_variables:
+ self._arguments.append(os.environ[variable])
+ except KeyError:
+ raise MissingEnvironemntVariable("Environment variable `%s' "
+ "is not set." % variable)
+
+ self._request_file, self._reply_file = self._arguments
+
+ if len(self._request_file) == 0 or len(self._reply_file) == 0:
+ raise MissingFiles("Both request and reply files have to be set.")
+
+ def __setattr__(self, name, value):
+ if name.startswith('_'):
+ object.__setattr__(self, name, value)
+ else:
+ self.__dict__['_reply'][name] = value
+
+ def __getattr__(self, name):
+ if name.startswith('_'):
+ return self.__dict__.get(name, None)
+ else:
+ return self.__dict__['_reply'].get(name, None)
+
+ def __del__(self):
+ if self._reply:
+ try:
+ file = open(self._reply_file, 'w')
+ json.dump(self._reply, file)
+ file.close()
+ except IOError, error:
+ raise FileReadError("Unable to open reply file `%s': %s" %
+ (self._reply_file, error))
+
+ def info(self, message):
+ print >> self._info, message
+ self._info.flush()
+
+ def error(self, message):
+ print >> self._error, message
+ self._error.flush()
+
+ def fail(self, message, exit_code=1):
+ self.error(message)
+ sys.exit(exit_code)
+
+ def reply(self):
+ return self._reply
+
+ def request(self):
+ if self._request:
+ return self._request
+ else:
+ try:
+ file = open(self._request_file, 'r')
+ self._request = json.load(file)
+ file.close()
+ except IOError, error:
+ raise FileReadError("Unable to open request file `%s': %s" %
+ (self._request_file, error))
+ except json.JSONDecodeError, error:
+ raise JSONParsingError("An error occurred during parsing of "
+ "the JSON data in the file `%s': %s" %
+ (self._request_file, error))
+ file.close()
+
+ return self._request
+
+# vim: set ts=4 sw=4 et :