From 4bde4926c330094a0cd8b23928dfdc0e7959aa84 Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Wed, 14 Mar 2012 21:16:15 -0400 Subject: [PATCH] Modules don't have to return JSON, key=value pairs is ok. --- lib/ansible/runner.py | 9 ++------- lib/ansible/utils.py | 25 +++++++++++++++++++++++++ library/copy | 15 ++------------- test/TestRunner.py | 1 - 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/lib/ansible/runner.py b/lib/ansible/runner.py index bbfc49fcfd6..99571f7735d 100755 --- a/lib/ansible/runner.py +++ b/lib/ansible/runner.py @@ -18,11 +18,6 @@ ################################################ -try: - import json -except ImportError: - import simplejson as json - import fnmatch import multiprocessing import signal @@ -209,7 +204,7 @@ class Runner(object): try: # try to parse the JSON response - return [ host, True, json.loads(result) ] + return [ host, True, parse_json(result) ] except Exception, e: # it failed, say so, but return the string anyway return [ host, False, "%s/%s" % (str(e), result) ] @@ -324,7 +319,7 @@ class Runner(object): if self.module_name == 'setup': host = conn.host try: - var_result = json.loads(result) + var_result = parse_json(result) except: var_result = {} diff --git a/lib/ansible/utils.py b/lib/ansible/utils.py index 1d46f5f0067..a0aec630af3 100755 --- a/lib/ansible/utils.py +++ b/lib/ansible/utils.py @@ -19,6 +19,9 @@ import sys import os +import shlex +from ansible.errors import * + try: import json except ImportError: @@ -183,4 +186,26 @@ def async_poll_status(jid, host, clock, result): else: return " polling on %s, %s remaining" % (jid, host, clock) +def parse_json(data): + try: + return json.loads(data) + except: + # not JSON, but try "Baby JSON" which allows many of our modules to not + # require JSON and makes writing modules in bash much simpler + results = {} + tokens = shlex.split(data) + for t in tokens: + if t.find("=") == -1: + raise AnsibleException("failed to parse: %s" % data) + (key,value) = t.split("=", 1) + if key == 'changed' or 'failed': + if value.lower() in [ 'true', '1' ] : + value = True + elif value.lower() in [ 'false', '0' ]: + value = False + if key == 'rc': + value = int(value) + results[key] = value + return results + diff --git a/library/copy b/library/copy index 632df966486..dcb339d2746 100755 --- a/library/copy +++ b/library/copy @@ -22,11 +22,6 @@ import sys import os import shlex -try: - import json -except ImportError: - import simplejson as json - # =========================================== # convert arguments of form a=b c=d # to a dictionary @@ -51,10 +46,7 @@ dest = params['dest'] # raise an error if there is no src file if not os.path.exists(src): - print json.dumps({ - "failed" : 1, - "msg" : "Source %s failed to transfer" % src - }) + print "failed=1 msg='Source %s failed to transfer'" % src sys.exit(1) md5sum = None @@ -70,9 +62,6 @@ if md5sum != md5sum2: changed = True # mission accomplished -print json.dumps({ - "md5sum" : md5sum2, - "changed" : changed -}) +print "md5sum=%s changed=%s" % (md5sum2, changed) diff --git a/test/TestRunner.py b/test/TestRunner.py index 074e230b178..299943e0872 100644 --- a/test/TestRunner.py +++ b/test/TestRunner.py @@ -148,7 +148,6 @@ class TestRunner(unittest.TestCase): result = self._run('shell', [ "/bin/echo", "$HOME" ]) assert 'failed' not in result assert result['rc'] == 0 - raise Exception(result['stdout']) def test_setup(self):