command 2.62 KB
Newer Older
Michael DeHaan committed
1 2
#!/usr/bin/python

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>, and others
#
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible.  If not, see <http://www.gnu.org/licenses/>.
#

21
try:
22
    import json
23
except ImportError:
24
    import simplejson as json
25

Michael DeHaan committed
26 27 28
import subprocess
import sys
import datetime
29
import traceback
30 31
import shlex
import os
32
import syslog
Michael DeHaan committed
33

34 35
argfile = sys.argv[1]
args = open(argfile, 'r').read()
36 37
syslog.openlog('ansible-%s' % os.path.basename(__file__))
syslog.syslog(syslog.LOG_NOTICE, 'Invoked with %s' % args)
38 39 40 41 42 43 44

shell = False

if args.find("#USE_SHELL") != -1:
   args = args.replace("#USE_SHELL", "")
   shell = True

45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
check_args = shlex.split(args)
for x in check_args:
   if x.startswith("creates="):
       # do not run the command if the line contains creates=filename
       # and the filename already exists.  This allows idempotence 
       # of command executions.
       (k,v) = x.split("=",1)
       if os.path.exists(v):
           print json.dumps({
               "cmd"     : args,
               "stdout"  : "skipped, since %s exists" % v,
               "skipped" : True,
               "changed" : False,
               "stderr"  : "",
               "rc"      : 0,
           })
           sys.exit(0)
       args = args.replace(x,'')
       

65 66
if not shell:
    args = shlex.split(args)
67

Michael DeHaan committed
68 69
startd = datetime.datetime.now()

70
try:
71
    cmd = subprocess.Popen(args, shell=shell, 
72 73
        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = cmd.communicate()
74 75
except (OSError, IOError), e:
    print json.dumps({
76 77 78
        "cmd"    : args,
        "failed" : 1,
        "msg"    : str(e),
79 80
        })
    sys.exit(1)
81 82 83
except:
    print json.dumps({
        "failed" : 1,
84
        "msg" : traceback.format_exc()
85 86
    })   
    sys.exit(1)
Michael DeHaan committed
87 88 89 90

endd = datetime.datetime.now()
delta = endd - startd

91 92 93 94 95
if out is None:
   out = ''
if err is None:
   err = ''

Michael DeHaan committed
96
result = {
97 98 99 100 101 102 103 104
   "cmd"     : args,
   "stdout"  : out.strip(),
   "stderr"  : err.strip(),
   "rc"      : cmd.returncode,
   "start"   : str(startd),
   "end"     : str(endd),
   "delta"   : str(delta),
   "changed" : True
Michael DeHaan committed
105 106 107
}

print json.dumps(result)