Skip to content
This repository has been archived by the owner on Oct 30, 2018. It is now read-only.

Commit

Permalink
Fixing up shell quoting issues
Browse files Browse the repository at this point in the history
  • Loading branch information
jimi-c committed Jul 22, 2014
1 parent 5930575 commit 75e5b64
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 9 deletions.
29 changes: 21 additions & 8 deletions library/commands/command
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,24 @@ EXAMPLES = '''
creates: /path/to/database
'''

# This is a pretty complex regex, which functions as follows:
#
# 1. (^|\s)
# ^ look for a space or the beginning of the line
# 2. (creates|removes|chdir|executable|NO_LOG)=
# ^ look for a valid param, followed by an '='
# 3. (?P<quote>[\'"])?
# ^ look for an optional quote character, which can either be
# a single or double quote character, and store it for later
# 4. (.*?)
# ^ match everything in a non-greedy manner until...
# 5. (?(quote)(?<!\\)(?P=quote))((?<!\\)(?=\s)|$)
# ^ a non-escaped space or a non-escaped quote of the same kind
# that was matched in the first 'quote' is found, or the end of
# the line is reached

PARAM_REGEX = re.compile(r'(^|\s)(creates|removes|chdir|executable|NO_LOG)=(?P<quote>[\'"])?(.*?)(?(quote)(?<!\\)(?P=quote))((?<!\\)(?=\s)|$)')

def main():

# the command module is the one ansible module that does not take key=value args
Expand Down Expand Up @@ -201,7 +219,6 @@ class CommandModule(AnsibleModule):
lexer.ignore_quotes = "'"
items = list(lexer)

command_args = ''
for x in items:
if '=' in x:
# check to see if this is a special parameter for the command
Expand All @@ -216,13 +233,9 @@ class CommandModule(AnsibleModule):
if not (os.path.exists(v)):
self.fail_json(rc=258, msg="cannot use executable '%s': file does not exist" % v)
params[k] = v
else:
# this isn't a valid parameter, so just append it back to the list of arguments
command_args = "%s %s" % (command_args, x)
else:
# not a param, so just append it to the list of arguments
command_args = "%s %s" % (command_args, x)
params['args'] = command_args.strip()
# Remove any of the above k=v params from the args string
args = PARAM_REGEX.sub('', args)
params['args'] = args
return (params, params['args'])

main()
2 changes: 1 addition & 1 deletion test/integration/roles/setup_ec2/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.

- name: generate random string
command: python -c \"import string,random; print ''.join(random.choice(string.ascii_lowercase) for _ in xrange(8));\"
command: python -c "import string,random; print ''.join(random.choice(string.ascii_lowercase) for _ in xrange(8));"
register: random_string
tags:
- prepare
Expand Down

0 comments on commit 75e5b64

Please sign in to comment.