Skip to content

Commit

Permalink
Final fix for ansible#35666 Previous PR (ansible#36143) was merged pr…
Browse files Browse the repository at this point in the history
…ematurely.
  • Loading branch information
abadger committed Feb 15, 2018
1 parent 391896c commit a612137
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 19 deletions.
31 changes: 20 additions & 11 deletions lib/ansible/plugins/shell/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,25 +47,34 @@ def __init__(self):

self.tempdir = None

def set_options(self, task_keys=None, var_options=None, direct=None):

super(ShellBase, self).set_options(task_keys=task_keys, var_options=var_options, direct=direct)

# set env
self.env.update(self.get_option('environment'))

def _normalize_system_temps(self):
# Normalize the temp directory strings. We don't use expanduser/expandvars because those
# can vary between remote user and become user. Therefore the safest practice will be for
# this to always be specified as full paths)
normalized_system_temps = [d.rstrip('/') for d in self.get_option('system_temps')]
normalized_paths = [d.rstrip('/') for d in self.get_option('system_temps')]

# Make sure all system_temps are absolute otherwise they'd be relative to the login dir
# which is almost certainly going to fail in a cornercase.
if not all(os.path.isabs(d) for d in normalized_system_temps):
if not all(os.path.isabs(d) for d in normalized_paths):
raise AnsibleError('The configured system_temps contains a relative path: {0}. All'
' system_temps must be absolute'.format(to_native(normalized_system_temps)))
' system_temps must be absolute'.format(to_native(normalized_paths)))

self.set_option('system_temps', normalized_paths)

def set_options(self, task_keys=None, var_options=None, direct=None):

super(ShellBase, self).set_options(task_keys=task_keys, var_options=var_options, direct=direct)

# set env
self.env.update(self.get_option('environment'))

self.set_option('system_temps', normalized_system_temps)
# We can remove the try: except in the future when we make ShellBase a proper subset of
# *all* shells. Right now powershell and third party shells which do not use the
# shell_common documentation fragment (and so do not have system_temps) will fail
try:
self._normalize_system_temps()
except AnsibleError:
pass

def env_prefix(self, **kwargs):
return ' '.join(['%s=%s' % (k, shlex_quote(text_type(v))) for k, v in kwargs.items()])
Expand Down
7 changes: 0 additions & 7 deletions lib/ansible/plugins/shell/powershell.py
Original file line number Diff line number Diff line change
Expand Up @@ -1823,13 +1823,6 @@ class ShellModule(ShellBase):

# TODO: add binary module support

def set_options(self, task_keys=None, var_options=None, direct=None):

super(ShellModule, self).set_options(task_keys=task_keys, var_options=var_options, direct=direct)

# set env
self.env.update(self.get_option('environment'))

def assert_safe_env_key(self, key):
if not self.safe_envkey.match(key):
raise AnsibleError("Invalid PowerShell environment key: %s" % key)
Expand Down
2 changes: 1 addition & 1 deletion lib/ansible/utils/module_docs_fragments/shell_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class ModuleDocFragment(object):
- name: ansible_remote_tmp
system_temps:
description:
- List of valid system temporary directories for Ansible to choose when it cannot use ``remote_temp``, normally due to permission issues.
- List of valid system temporary directories for Ansible to choose when it cannot use ``remote_temp``, normally due to permission issues. These must be world readable, writable, and executable.
default: [ /var/tmp, /tmp ]
type: list
env: [{name: ANSIBLE_SYSTEM_TMPS}]
Expand Down

0 comments on commit a612137

Please sign in to comment.