raw should not use default executable (#16085)

also removed unused cruft in script
(cherry picked from commit a529a60478)
pull/16362/head
Brian Coca 10 years ago committed by Brian Coca
parent 9bb754c0a7
commit efed4e577c

@ -29,11 +29,9 @@ import string
from ansible.compat.six import iteritems, string_types from ansible.compat.six import iteritems, string_types
from ansible import constants as C from ansible import constants as C
from ansible.errors import AnsibleError from ansible.errors import AnsibleError
from ansible.playbook.attribute import Attribute, FieldAttribute from ansible.playbook.attribute import FieldAttribute
from ansible.playbook.base import Base from ansible.playbook.base import Base
from ansible.template import Templar
from ansible.utils.boolean import boolean from ansible.utils.boolean import boolean
from ansible.utils.unicode import to_unicode
__all__ = ['PlayContext'] __all__ = ['PlayContext']
@ -447,16 +445,21 @@ class PlayContext(Base):
success_key = None success_key = None
self.prompt = None self.prompt = None
if executable is None:
executable = self.executable
if self.become: if self.become:
if executable is None:
executable = self.executable
becomecmd = None becomecmd = None
randbits = ''.join(random.choice(string.ascii_lowercase) for x in range(32)) randbits = ''.join(random.choice(string.ascii_lowercase) for x in range(32))
success_key = 'BECOME-SUCCESS-%s' % randbits success_key = 'BECOME-SUCCESS-%s' % randbits
success_cmd = pipes.quote('echo %s; %s' % (success_key, cmd)) success_cmd = pipes.quote('echo %s; %s' % (success_key, cmd))
if executable:
command = '%s -c %s' % (executable, success_cmd)
else:
command = success_cmd
# set executable to use for the privilege escalation method, with various overrides # set executable to use for the privilege escalation method, with various overrides
exe = self.become_exe or \ exe = self.become_exe or \
getattr(self, '%s_exe' % self.become_method, None) or \ getattr(self, '%s_exe' % self.become_method, None) or \
@ -485,9 +488,9 @@ class PlayContext(Base):
# force quick error if password is required but not supplied, should prevent sudo hangs. # force quick error if password is required but not supplied, should prevent sudo hangs.
if self.become_pass: if self.become_pass:
prompt = '[sudo via ansible, key=%s] password: ' % randbits prompt = '[sudo via ansible, key=%s] password: ' % randbits
becomecmd = '%s %s -p "%s" -u %s %s -c %s' % (exe, flags.replace('-n',''), prompt, self.become_user, executable, success_cmd) becomecmd = '%s %s -p "%s" -u %s %s' % (exe, flags.replace('-n',''), prompt, self.become_user, command)
else: else:
becomecmd = '%s %s -u %s %s -c %s' % (exe, flags, self.become_user, executable, success_cmd) becomecmd = '%s %s -u %s %s' % (exe, flags, self.become_user, command)
elif self.become_method == 'su': elif self.become_method == 'su':
@ -498,7 +501,7 @@ class PlayContext(Base):
return bool(SU_PROMPT_LOCALIZATIONS_RE.match(data)) return bool(SU_PROMPT_LOCALIZATIONS_RE.match(data))
prompt = detect_su_prompt prompt = detect_su_prompt
becomecmd = '%s %s %s -c %s' % (exe, flags, self.become_user, pipes.quote('%s -c %s' % (executable, success_cmd))) becomecmd = '%s %s %s -c %s' % (exe, flags, self.become_user, pipes.quote(command))
elif self.become_method == 'pbrun': elif self.become_method == 'pbrun':
@ -534,7 +537,7 @@ class PlayContext(Base):
exe = self.become_exe or 'dzdo' exe = self.become_exe or 'dzdo'
becomecmd = '%s -u %s %s -c %s' % (exe, self.become_user, executable, success_cmd) becomecmd = '%s -u %s %s' % (exe, self.become_user, command)
else: else:
raise AnsibleError("Privilege escalation method not found: %s" % self.become_method) raise AnsibleError("Privilege escalation method not found: %s" % self.become_method)

@ -37,7 +37,7 @@ class ActionModule(ActionBase):
result['skipped'] = True result['skipped'] = True
return result return result
executable = self._task.args.get('executable') executable = self._task.args.get('executable', False)
result.update(self._low_level_execute_command(self._task.args.get('_raw_params'), executable=executable)) result.update(self._low_level_execute_command(self._task.args.get('_raw_params'), executable=executable))
return result return result

@ -19,7 +19,6 @@ __metaclass__ = type
import os import os
from ansible import constants as C
from ansible.plugins.action import ActionBase from ansible.plugins.action import ActionBase
@ -79,7 +78,6 @@ class ActionModule(ActionBase):
tmp_src = self._connection._shell.join_path(tmp, os.path.basename(source)) tmp_src = self._connection._shell.join_path(tmp, os.path.basename(source))
self._transfer_file(source, tmp_src) self._transfer_file(source, tmp_src)
sudoable = True
# set file permissions, more permissive when the copy is done as a different user # set file permissions, more permissive when the copy is done as a different user
self._fixup_perms(tmp, remote_user, execute=True, recursive=True) self._fixup_perms(tmp, remote_user, execute=True, recursive=True)

@ -2,7 +2,7 @@ import collections
import os import os
import unittest import unittest
from ansible.modules.core.cloud.docker.docker import get_split_image_tag from ansible.modules.core.cloud.docker._docker import get_split_image_tag
class DockerSplitImageTagTestCase(unittest.TestCase): class DockerSplitImageTagTestCase(unittest.TestCase):

@ -0,0 +1,112 @@
# (c) 2016, Saran Ahluwalia <ahlusar.ahluwalia@gmail.com>
#
# 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/>.
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
from ansible.compat.tests import unittest
from ansible.compat.tests.mock import patch, MagicMock, Mock
from ansible.plugins.action.raw import ActionModule
from ansible.playbook.task import Task
class TestCopyResultExclude(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
# The current behavior of the raw aciton in regards to executable is currently in question;
# the test_raw_executable_is_not_empty_string verifies the current behavior (whether it is desireed or not.
# Please refer to the following for context:
# Issue: https://github.com/ansible/ansible/issues/16054
# PR: https://github.com/ansible/ansible/pull/16085
def test_raw_executable_is_not_empty_string(self):
play_context = Mock()
task = MagicMock(Task)
task.async = MagicMock()
connection = Mock()
task.args = {'_raw_params': 'Args1'}
play_context.check_mode = False
self.mock_am = ActionModule(task, connection, play_context, loader=None, templar=None, shared_loader_obj=None)
self.mock_am._low_level_execute_command = Mock(return_value = {})
self.mock_am.display = Mock()
self.mock_am.run()
self.mock_am._low_level_execute_command.assert_called_with('Args1', executable=False)
def test_raw_check_mode_is_True(self):
play_context = Mock()
task = MagicMock(Task)
task.async = MagicMock()
connection = Mock()
task.args = {'_raw_params': 'Args1'}
play_context.check_mode = True
self.mock_am = ActionModule(task, connection, play_context, loader=None, templar=None, shared_loader_obj=None)
self.mock_am._low_level_execute_command = Mock(return_value = {})
self.mock_am.display = Mock()
skipped_result = self.mock_am.run()
self.assertEqual(skipped_result.get('skipped'), True)
def test_raw_test_environment_is_None(self):
play_context = Mock()
task = MagicMock(Task)
task.async = MagicMock()
connection = Mock()
task.args = {'_raw_params': 'Args1'}
task.environment = None
play_context.check_mode = False
self.mock_am = ActionModule(task, connection, play_context, loader=None, templar=None, shared_loader_obj=None)
self.mock_am._low_level_execute_command = Mock(return_value = {})
self.mock_am.display = Mock()
self.assertEqual(task.environment, None)
def test_raw_task_vars_is_not_None(self):
play_context = Mock()
task = MagicMock(Task)
task.async = MagicMock()
connection = Mock()
task.args = {'_raw_params': 'Args1'}
task.environment = None
play_context.check_mode = False
self.mock_am = ActionModule(task, connection, play_context, loader=None, templar=None, shared_loader_obj=None)
self.mock_am._low_level_execute_command = Mock(return_value = {})
self.mock_am.display = Mock()
self.mock_am.run(task_vars={'a': 'b'})
self.assertEqual(task.environment, None)
Loading…
Cancel
Save