diff --git a/async_status b/async_status index 33c09e653c7..15c1fb527f9 100755 --- a/async_status +++ b/async_status @@ -18,96 +18,54 @@ # along with Ansible. If not, see . # -try: - import json -except ImportError: - import simplejson as json -import shlex -import os -import subprocess -import sys import datetime import traceback -import syslog -# =========================================== +def main(): -# FIXME: better error handling + module = AnsibleModule(argument_spec=dict( + jid=dict(required=True), + mode=dict(default='status', choices=['status','cleanup']), + )) -argsfile = sys.argv[1] -args = open(argsfile, 'r').read() -items = shlex.split(args) + mode = module.params['mode'] + jid = module.params['jid'] -syslog.openlog('ansible-%s' % os.path.basename(__file__)) -syslog.syslog(syslog.LOG_NOTICE, 'Invoked with %s' % args) + # setup logging directory + logdir = os.path.expanduser("~/.ansible_async") + log_path = os.path.join(logdir, jid) -params = {} -for x in items: - (k, v) = x.split("=") - params[k] = v + if not os.path.exists(log_path): + module.fail_json(msg="could not find job", ansible_job_id=jid) -mode = params.get('mode', 'status') -jid = params.get('jid', None) + if mode == 'cleanup': + os.unlink(log_path) + module.exit_json(ansible_job_id=jid, erased=log_path) -# =========================================== + # NOT in cleanup mode, assume regular status mode + # no remote kill mode currently exists, but probably should + # consider log_path + ".pid" file and also unlink that above -if jid is None: - print json.dumps({ - "failed" : True, - "msg" : "jid=INTEGER is required" - }) - sys.exit(1) + data = file(log_path).read() + try: + data = json.loads(data) + except Exception, e: + if data == '': + # file not written yet? That means it is running + module.exit_json(results_file=log_path, ansible_job_id=jid, started=1) + else: + module_fail_json(ansible_job_id=jid, results_file=log_path, + msg="Could not parse job output: %s" % data) + + if not data.has_key("started"): + data['finished'] = 1 + data['ansible_job_id'] = jid + module.exit_json(**data) + +# this is magic, see lib/ansible/module_common.py +#<> +main() -# setup logging directory -logdir = os.path.expanduser("~/.ansible_async") -log_path = os.path.join(logdir, jid) - -if not os.path.exists(log_path): - print json.dumps({ - "failed" : 1, - "msg" : "could not find job", - "ansible_job_id" : jid - }) - sys.exit(1) - -if mode == 'cleanup': - os.unlink(log_path) - print json.dumps({ - "ansible_job_id" : jid, - "erased" : log_path - }) - sys.exit(0) - -# NOT in cleanup mode, assume regular status mode -# no remote kill mode currently exists, but probably should -# consider log_path + ".pid" file and also unlink that above - -data = file(log_path).read() -try: - data = json.loads(data) -except Exception, e: - if data == '': - # file not written yet? That means it is running - print json.dumps({ - "results_file" : log_path, - "ansible_job_id" : jid, - "started" : 1, - }) - else: - print json.dumps({ - "failed" : True, - "ansible_job_id" : jid, - "results_file" : log_path, - "msg" : "Could not parse job output: %s" % data, - }) - sys.exit(0) - -if not data.has_key("started"): - data['finished'] = 1 -data['ansible_job_id'] = jid - -print json.dumps(data) -sys.exit(0)