mirror of
https://github.com/ansible-collections/community.general.git
synced 2026-05-08 14:22:46 +00:00
Move uses of to_bytes, to_text, to_native to use the module_utils version (#17423)
We couldn't copy to_unicode, to_bytes, to_str into module_utils because of licensing. So once created it we had two sets of functions that did the same things but had different implementations. To remedy that, this change removes the ansible.utils.unicode versions of those functions.
This commit is contained in:
@@ -31,7 +31,8 @@ import warnings
|
||||
from collections import defaultdict
|
||||
|
||||
from ansible import constants as C
|
||||
from ansible.utils.unicode import to_unicode
|
||||
from ansible.module_utils._text import to_text
|
||||
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
@@ -44,9 +45,11 @@ MODULE_CACHE = {}
|
||||
PATH_CACHE = {}
|
||||
PLUGIN_PATH_CACHE = {}
|
||||
|
||||
|
||||
def get_all_plugin_loaders():
|
||||
return [(name, obj) for (name, obj) in inspect.getmembers(sys.modules[__name__]) if isinstance(obj, PluginLoader)]
|
||||
|
||||
|
||||
class PluginLoader:
|
||||
|
||||
'''
|
||||
@@ -72,11 +75,11 @@ class PluginLoader:
|
||||
|
||||
self.config = config
|
||||
|
||||
if not class_name in MODULE_CACHE:
|
||||
if class_name not in MODULE_CACHE:
|
||||
MODULE_CACHE[class_name] = {}
|
||||
if not class_name in PATH_CACHE:
|
||||
if class_name not in PATH_CACHE:
|
||||
PATH_CACHE[class_name] = None
|
||||
if not class_name in PLUGIN_PATH_CACHE:
|
||||
if class_name not in PLUGIN_PATH_CACHE:
|
||||
PLUGIN_PATH_CACHE[class_name] = defaultdict(dict)
|
||||
|
||||
self._module_cache = MODULE_CACHE[class_name]
|
||||
@@ -140,9 +143,9 @@ class PluginLoader:
|
||||
results = []
|
||||
results.append(dir)
|
||||
for root, subdirs, files in os.walk(dir, followlinks=True):
|
||||
if '__init__.py' in files:
|
||||
for x in subdirs:
|
||||
results.append(os.path.join(root,x))
|
||||
if '__init__.py' in files:
|
||||
for x in subdirs:
|
||||
results.append(os.path.join(root,x))
|
||||
return results
|
||||
|
||||
def _get_package_paths(self):
|
||||
@@ -250,7 +253,7 @@ class PluginLoader:
|
||||
try:
|
||||
full_paths = (os.path.join(path, f) for f in os.listdir(path))
|
||||
except OSError as e:
|
||||
display.warning("Error accessing plugin paths: %s" % to_unicode(e))
|
||||
display.warning("Error accessing plugin paths: %s" % to_text(e))
|
||||
|
||||
for full_path in (f for f in full_paths if os.path.isfile(f) and not f.endswith('__init__.py')):
|
||||
full_name = os.path.basename(full_path)
|
||||
@@ -358,7 +361,7 @@ class PluginLoader:
|
||||
|
||||
def _display_plugin_load(self, class_name, name, searched_paths, path, found_in_cache=None, class_only=None):
|
||||
msg = 'Loading %s \'%s\' from %s' % (class_name, os.path.basename(name), path)
|
||||
|
||||
|
||||
if len(searched_paths) > 1:
|
||||
msg = '%s (searched paths: %s)' % (msg, self.format_paths(searched_paths))
|
||||
|
||||
@@ -389,7 +392,7 @@ class PluginLoader:
|
||||
try:
|
||||
obj = getattr(self._module_cache[path], self.class_name)
|
||||
except AttributeError as e:
|
||||
display.warning("Skipping plugin (%s) as it seems to be invalid: %s" % (path, to_unicode(e)))
|
||||
display.warning("Skipping plugin (%s) as it seems to be invalid: %s" % (path, to_text(e)))
|
||||
continue
|
||||
|
||||
if self.base_class:
|
||||
@@ -398,11 +401,11 @@ class PluginLoader:
|
||||
module = __import__(self.package, fromlist=[self.base_class])
|
||||
# Check whether this obj has the required base class.
|
||||
try:
|
||||
plugin_class = getattr(module, self.base_class)
|
||||
plugin_class = getattr(module, self.base_class)
|
||||
except AttributeError:
|
||||
continue
|
||||
continue
|
||||
if not issubclass(obj, plugin_class):
|
||||
continue
|
||||
continue
|
||||
|
||||
self._display_plugin_load(self.class_name, name, self._searched_paths, path,
|
||||
found_in_cache=found_in_cache, class_only=class_only)
|
||||
|
||||
@@ -35,9 +35,10 @@ from ansible.compat.six import binary_type, text_type, iteritems, with_metaclass
|
||||
from ansible import constants as C
|
||||
from ansible.errors import AnsibleError, AnsibleConnectionFailure
|
||||
from ansible.executor.module_common import modify_module
|
||||
from ansible.release import __version__
|
||||
from ansible.module_utils._text import to_bytes, to_native, to_text
|
||||
from ansible.parsing.utils.jsonify import jsonify
|
||||
from ansible.utils.unicode import to_bytes, to_str, to_unicode
|
||||
from ansible.release import __version__
|
||||
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
@@ -86,7 +87,7 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||
* Module parameters. These are stored in self._task.args
|
||||
"""
|
||||
# store the module invocation details into the results
|
||||
results = {}
|
||||
results = {}
|
||||
if self._task.async == 0:
|
||||
results['invocation'] = dict(
|
||||
module_name = self._task.action,
|
||||
@@ -146,7 +147,8 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||
"run 'git submodule update --init --recursive' to correct this problem." % (module_name))
|
||||
|
||||
# insert shared code and arguments into the module
|
||||
(module_data, module_style, module_shebang) = modify_module(module_name, module_path, module_args, task_vars=task_vars, module_compression=self._play_context.module_compression)
|
||||
(module_data, module_style, module_shebang) = modify_module(module_name, module_path, module_args,
|
||||
task_vars=task_vars, module_compression=self._play_context.module_compression)
|
||||
|
||||
return (module_style, module_shebang, module_data, module_path)
|
||||
|
||||
@@ -283,10 +285,10 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||
afd, afile = tempfile.mkstemp()
|
||||
afo = os.fdopen(afd, 'wb')
|
||||
try:
|
||||
data = to_bytes(data, errors='strict')
|
||||
data = to_bytes(data, errors='surrogate_or_strict')
|
||||
afo.write(data)
|
||||
except Exception as e:
|
||||
raise AnsibleError("failure writing module data to temporary file for transfer: %s" % str(e))
|
||||
raise AnsibleError("failure writing module data to temporary file for transfer: %s" % to_native(e))
|
||||
|
||||
afo.flush()
|
||||
afo.close()
|
||||
@@ -372,17 +374,22 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||
res = self._remote_chown(remote_paths, self._play_context.become_user)
|
||||
if res['rc'] != 0 and remote_user == 'root':
|
||||
# chown failed even if remove_user is root
|
||||
raise AnsibleError('Failed to change ownership of the temporary files Ansible needs to create despite connecting as root. Unprivileged become user would be unable to read the file.')
|
||||
raise AnsibleError('Failed to change ownership of the temporary files Ansible needs to create despite connecting as root.'
|
||||
' Unprivileged become user would be unable to read the file.')
|
||||
elif res['rc'] != 0:
|
||||
if C.ALLOW_WORLD_READABLE_TMPFILES:
|
||||
# chown and fs acls failed -- do things this insecure
|
||||
# way only if the user opted in in the config file
|
||||
display.warning('Using world-readable permissions for temporary files Ansible needs to create when becoming an unprivileged user which may be insecure. For information on securing this, see https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user')
|
||||
display.warning('Using world-readable permissions for temporary files Ansible needs to create when becoming an unprivileged user.'
|
||||
' This may be insecure. For information on securing this, see'
|
||||
' https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user')
|
||||
res = self._remote_chmod(remote_paths, 'a+%s' % mode)
|
||||
if res['rc'] != 0:
|
||||
raise AnsibleError('Failed to set file mode on remote files (rc: {0}, err: {1})'.format(res['rc'], res['stderr']))
|
||||
else:
|
||||
raise AnsibleError('Failed to set permissions on the temporary files Ansible needs to create when becoming an unprivileged user (rc: {0}, err: {1}). For information on working around this, see https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user'.format(res['rc'], res['stderr']))
|
||||
raise AnsibleError('Failed to set permissions on the temporary files Ansible needs to create when becoming an unprivileged user'
|
||||
' (rc: {0}, err: {1}). For information on working around this,'
|
||||
' see https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user'.format(res['rc'], res['stderr']))
|
||||
elif execute:
|
||||
# Can't depend on the file being transferred with execute
|
||||
# permissions. Only need user perms because no become was
|
||||
@@ -438,7 +445,7 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||
mystat['stat']['checksum'] = '1'
|
||||
|
||||
# happens sometimes when it is a dir and not on bsd
|
||||
if not 'checksum' in mystat['stat']:
|
||||
if 'checksum' not in mystat['stat']:
|
||||
mystat['stat']['checksum'] = ''
|
||||
|
||||
return mystat['stat']
|
||||
@@ -453,26 +460,25 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||
3 = its a directory, not a file
|
||||
4 = stat module failed, likely due to not finding python
|
||||
'''
|
||||
x = "0" # unknown error has occured
|
||||
x = "0" # unknown error has occured
|
||||
try:
|
||||
remote_stat = self._execute_remote_stat(path, all_vars, follow=follow)
|
||||
if remote_stat['exists'] and remote_stat['isdir']:
|
||||
x = "3" # its a directory not a file
|
||||
x = "3" # its a directory not a file
|
||||
else:
|
||||
x = remote_stat['checksum'] # if 1, file is missing
|
||||
x = remote_stat['checksum'] # if 1, file is missing
|
||||
except AnsibleError as e:
|
||||
errormsg = to_unicode(e)
|
||||
if errormsg.endswith('Permission denied'):
|
||||
x = "2" # cannot read file
|
||||
elif errormsg.endswith('MODULE FAILURE'):
|
||||
x = "4" # python not found or module uncaught exception
|
||||
errormsg = to_text(e)
|
||||
if errormsg.endswith(u'Permission denied'):
|
||||
x = "2" # cannot read file
|
||||
elif errormsg.endswith(u'MODULE FAILURE'):
|
||||
x = "4" # python not found or module uncaught exception
|
||||
finally:
|
||||
return x
|
||||
|
||||
|
||||
def _remote_expand_user(self, path):
|
||||
''' takes a remote path and performs tilde expansion on the remote host '''
|
||||
if not path.startswith('~'): # FIXME: Windows paths may start with "~ instead of just ~
|
||||
if not path.startswith('~'): # FIXME: Windows paths may start with "~ instead of just ~
|
||||
return path
|
||||
|
||||
# FIXME: Can't use os.path.sep for Windows paths.
|
||||
@@ -681,7 +687,8 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||
tmp_rm_res = self._low_level_execute_command(tmp_rm_cmd, sudoable=False)
|
||||
tmp_rm_data = self._parse_returned_data(tmp_rm_res)
|
||||
if tmp_rm_data.get('rc', 0) != 0:
|
||||
display.warning('Error deleting remote temporary files (rc: {0}, stderr: {1})'.format(tmp_rm_res.get('rc'), tmp_rm_res.get('stderr', 'No error string available.')))
|
||||
display.warning('Error deleting remote temporary files (rc: {0}, stderr: {1})'.format(tmp_rm_res.get('rc'),
|
||||
tmp_rm_res.get('stderr', 'No error string available.')))
|
||||
|
||||
# parse the main result
|
||||
data = self._parse_returned_data(res)
|
||||
@@ -709,7 +716,7 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||
data['exception'] = res['stderr']
|
||||
return data
|
||||
|
||||
def _low_level_execute_command(self, cmd, sudoable=True, in_data=None, executable=None, encoding_errors='replace'):
|
||||
def _low_level_execute_command(self, cmd, sudoable=True, in_data=None, executable=None, encoding_errors='surrogate_or_replace'):
|
||||
'''
|
||||
This is the function which executes the low level shell command, which
|
||||
may be commands to create/remove directories for temporary files, or to
|
||||
@@ -758,16 +765,16 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||
# stdout and stderr may be either a file-like or a bytes object.
|
||||
# Convert either one to a text type
|
||||
if isinstance(stdout, binary_type):
|
||||
out = to_unicode(stdout, errors=encoding_errors)
|
||||
out = to_text(stdout, errors=encoding_errors)
|
||||
elif not isinstance(stdout, text_type):
|
||||
out = to_unicode(b''.join(stdout.readlines()), errors=encoding_errors)
|
||||
out = to_text(b''.join(stdout.readlines()), errors=encoding_errors)
|
||||
else:
|
||||
out = stdout
|
||||
|
||||
if isinstance(stderr, binary_type):
|
||||
err = to_unicode(stderr, errors=encoding_errors)
|
||||
err = to_text(stderr, errors=encoding_errors)
|
||||
elif not isinstance(stderr, text_type):
|
||||
err = to_unicode(b''.join(stderr.readlines()), errors=encoding_errors)
|
||||
err = to_text(b''.join(stderr.readlines()), errors=encoding_errors)
|
||||
else:
|
||||
err = stderr
|
||||
|
||||
@@ -871,7 +878,6 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||
result = self._loader.path_dwim_relative_stack(path_stack, dirname, needle)
|
||||
|
||||
if result is None:
|
||||
raise AnsibleError("Unable to find '%s' in expected paths." % to_str(needle))
|
||||
raise AnsibleError("Unable to find '%s' in expected paths." % to_native(needle))
|
||||
|
||||
return result
|
||||
|
||||
|
||||
@@ -24,10 +24,10 @@ import tempfile
|
||||
import re
|
||||
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.module_utils._text import to_native, to_text
|
||||
from ansible.plugins.action import ActionBase
|
||||
from ansible.utils.boolean import boolean
|
||||
from ansible.utils.hashing import checksum_s
|
||||
from ansible.utils.unicode import to_str, to_unicode
|
||||
|
||||
|
||||
class ActionModule(ActionBase):
|
||||
@@ -42,7 +42,7 @@ class ActionModule(ActionBase):
|
||||
delimit_me = False
|
||||
add_newline = False
|
||||
|
||||
for f in (to_unicode(p, errors='strict') for p in sorted(os.listdir(src_path))):
|
||||
for f in (to_text(p, errors='surrogate_or_strict') for p in sorted(os.listdir(src_path))):
|
||||
if compiled_regexp and not compiled_regexp.search(f):
|
||||
continue
|
||||
fragment = u"%s/%s" % (src_path, f)
|
||||
@@ -114,7 +114,7 @@ class ActionModule(ActionBase):
|
||||
src = self._find_needle('files', src)
|
||||
except AnsibleError as e:
|
||||
result['failed'] = True
|
||||
result['msg'] = to_str(e)
|
||||
result['msg'] = to_native(e)
|
||||
return result
|
||||
|
||||
if not os.path.isdir(src):
|
||||
|
||||
@@ -22,9 +22,10 @@ import pipes
|
||||
import random
|
||||
|
||||
from ansible import constants as C
|
||||
from ansible.plugins.action import ActionBase
|
||||
from ansible.compat.six import iteritems
|
||||
from ansible.utils.unicode import to_unicode
|
||||
from ansible.module_utils._text import to_text
|
||||
from ansible.plugins.action import ActionBase
|
||||
|
||||
|
||||
class ActionModule(ActionBase):
|
||||
|
||||
@@ -76,7 +77,7 @@ class ActionModule(ActionBase):
|
||||
elif module_style == 'old':
|
||||
args_data = ""
|
||||
for k, v in iteritems(module_args):
|
||||
args_data += '%s="%s" ' % (k, pipes.quote(to_unicode(v)))
|
||||
args_data += '%s="%s" ' % (k, pipes.quote(to_text(v)))
|
||||
argsfile = self._transfer_data(self._connection._shell.join_path(tmp, 'arguments'), args_data)
|
||||
|
||||
remote_paths = tmp, remote_module_path, remote_async_module_path
|
||||
@@ -100,7 +101,7 @@ class ActionModule(ActionBase):
|
||||
if not self._should_remove_tmp_path(tmp):
|
||||
async_cmd.append("-preserve_tmp")
|
||||
|
||||
async_cmd = " ".join([to_unicode(x) for x in async_cmd])
|
||||
async_cmd = " ".join(to_text(x) for x in async_cmd)
|
||||
result.update(self._low_level_execute_command(cmd=async_cmd))
|
||||
|
||||
result['changed'] = True
|
||||
|
||||
@@ -24,10 +24,10 @@ import os
|
||||
import tempfile
|
||||
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.module_utils._text import to_bytes, to_native, to_text
|
||||
from ansible.plugins.action import ActionBase
|
||||
from ansible.utils.boolean import boolean
|
||||
from ansible.utils.hashing import checksum
|
||||
from ansible.utils.unicode import to_bytes, to_str, to_unicode
|
||||
|
||||
|
||||
class ActionModule(ActionBase):
|
||||
@@ -81,7 +81,7 @@ class ActionModule(ActionBase):
|
||||
source = content_tempfile
|
||||
except Exception as err:
|
||||
result['failed'] = True
|
||||
result['msg'] = "could not write content temp file: %s" % to_str(err)
|
||||
result['msg'] = "could not write content temp file: %s" % to_native(err)
|
||||
return result
|
||||
|
||||
# if we have first_available_file in our vars
|
||||
@@ -91,19 +91,19 @@ class ActionModule(ActionBase):
|
||||
elif remote_src:
|
||||
result.update(self._execute_module(module_name='copy', module_args=self._task.args, task_vars=task_vars, delete_remote_tmp=False))
|
||||
return result
|
||||
else: # find in expected paths
|
||||
else: # find in expected paths
|
||||
try:
|
||||
source = self._find_needle('files', source)
|
||||
except AnsibleError as e:
|
||||
result['failed'] = True
|
||||
result['msg'] = to_unicode(e)
|
||||
result['msg'] = to_text(e)
|
||||
return result
|
||||
|
||||
# A list of source file tuples (full_path, relative_path) which will try to copy to the destination
|
||||
source_files = []
|
||||
|
||||
# If source is a directory populate our list else source is a file and translate it to a tuple.
|
||||
if os.path.isdir(to_bytes(source, errors='strict')):
|
||||
if os.path.isdir(to_bytes(source, errors='surrogate_or_strict')):
|
||||
# Get the amount of spaces to remove to get the relative path.
|
||||
if source_trailing_slash:
|
||||
sz = len(source)
|
||||
@@ -113,7 +113,7 @@ class ActionModule(ActionBase):
|
||||
# Walk the directory and append the file tuples to source_files.
|
||||
for base_path, sub_folders, files in os.walk(to_bytes(source)):
|
||||
for file in files:
|
||||
full_path = to_unicode(os.path.join(base_path, file), errors='strict')
|
||||
full_path = to_text(os.path.join(base_path, file), errors='surrogate_or_strict')
|
||||
rel_path = full_path[sz:]
|
||||
if rel_path.startswith('/'):
|
||||
rel_path = rel_path[1:]
|
||||
@@ -247,7 +247,9 @@ class ActionModule(ActionBase):
|
||||
if 'content' in new_module_args:
|
||||
del new_module_args['content']
|
||||
|
||||
module_return = self._execute_module(module_name='copy', module_args=new_module_args, task_vars=task_vars, tmp=tmp, delete_remote_tmp=delete_remote_tmp)
|
||||
module_return = self._execute_module(module_name='copy',
|
||||
module_args=new_module_args, task_vars=task_vars,
|
||||
tmp=tmp, delete_remote_tmp=delete_remote_tmp)
|
||||
module_executed = True
|
||||
|
||||
else:
|
||||
@@ -272,7 +274,9 @@ class ActionModule(ActionBase):
|
||||
)
|
||||
|
||||
# Execute the file module.
|
||||
module_return = self._execute_module(module_name='file', module_args=new_module_args, task_vars=task_vars, tmp=tmp, delete_remote_tmp=delete_remote_tmp)
|
||||
module_return = self._execute_module(module_name='file',
|
||||
module_args=new_module_args, task_vars=task_vars,
|
||||
tmp=tmp, delete_remote_tmp=delete_remote_tmp)
|
||||
module_executed = True
|
||||
|
||||
if not module_return.get('checksum'):
|
||||
|
||||
@@ -20,8 +20,8 @@ __metaclass__ = type
|
||||
|
||||
from ansible.compat.six import string_types
|
||||
from ansible.errors import AnsibleUndefinedVariable
|
||||
from ansible.module_utils._text import to_text
|
||||
from ansible.plugins.action import ActionBase
|
||||
from ansible.utils.unicode import to_unicode
|
||||
|
||||
|
||||
class ActionModule(ActionBase):
|
||||
@@ -66,7 +66,7 @@ class ActionModule(ActionBase):
|
||||
|
||||
if isinstance(self._task.args['var'], (list, dict)):
|
||||
# If var is a list or dict, use the type as key to display
|
||||
result[to_unicode(type(self._task.args['var']))] = results
|
||||
result[to_text(type(self._task.args['var']))] = results
|
||||
else:
|
||||
result[self._task.args['var']] = results
|
||||
else:
|
||||
|
||||
@@ -21,11 +21,11 @@ import os
|
||||
import base64
|
||||
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.module_utils._text import to_bytes
|
||||
from ansible.plugins.action import ActionBase
|
||||
from ansible.utils.boolean import boolean
|
||||
from ansible.utils.hashing import checksum, checksum_s, md5, secure_hash
|
||||
from ansible.utils.path import makedirs_safe
|
||||
from ansible.utils.unicode import to_bytes
|
||||
|
||||
|
||||
class ActionModule(ActionBase):
|
||||
@@ -160,7 +160,7 @@ class ActionModule(ActionBase):
|
||||
self._connection.fetch_file(source, dest)
|
||||
else:
|
||||
try:
|
||||
f = open(to_bytes(dest, errors='strict'), 'w')
|
||||
f = open(to_bytes(dest, errors='surrogate_or_strict'), 'wb')
|
||||
f.write(remote_data)
|
||||
f.close()
|
||||
except (IOError, OSError) as e:
|
||||
|
||||
@@ -22,8 +22,8 @@ from os import path, walk
|
||||
import re
|
||||
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.module_utils._text import to_native
|
||||
from ansible.plugins.action import ActionBase
|
||||
from ansible.utils.unicode import to_str
|
||||
|
||||
|
||||
class ActionModule(ActionBase):
|
||||
@@ -137,7 +137,7 @@ class ActionModule(ActionBase):
|
||||
results.update(updated_results)
|
||||
|
||||
except AnsibleError as e:
|
||||
err_msg = to_str(e)
|
||||
err_msg = to_native(e)
|
||||
raise AnsibleError(err_msg)
|
||||
|
||||
if self.return_results_as_name:
|
||||
|
||||
@@ -26,10 +26,12 @@ import glob
|
||||
import urlparse
|
||||
|
||||
from ansible.plugins.action import ActionBase
|
||||
from ansible.utils.unicode import to_unicode
|
||||
from ansible.module_utils._text import to_text
|
||||
|
||||
|
||||
PRIVATE_KEYS_RE = re.compile('__.+__')
|
||||
|
||||
|
||||
class ActionModule(ActionBase):
|
||||
|
||||
TRANSFERS_FILES = False
|
||||
@@ -56,7 +58,6 @@ class ActionModule(ActionBase):
|
||||
result['__backup__'])
|
||||
result['backup_path'] = filepath
|
||||
|
||||
|
||||
# strip out any keys that have two leading and two trailing
|
||||
# underscore characters
|
||||
for key in result.keys():
|
||||
@@ -98,7 +99,7 @@ class ActionModule(ActionBase):
|
||||
|
||||
try:
|
||||
with open(source, 'r') as f:
|
||||
template_data = to_unicode(f.read())
|
||||
template_data = to_text(f.read())
|
||||
except IOError:
|
||||
return dict(failed=True, msg='unable to load src file')
|
||||
|
||||
@@ -114,5 +115,3 @@ class ActionModule(ActionBase):
|
||||
searchpath.append(os.path.dirname(source))
|
||||
self._templar.environment.loader.searchpath = searchpath
|
||||
self._task.args['src'] = self._templar.template(template_data)
|
||||
|
||||
|
||||
|
||||
@@ -19,18 +19,18 @@
|
||||
from __future__ import (absolute_import, division, print_function)
|
||||
__metaclass__ = type
|
||||
|
||||
import sys
|
||||
import os
|
||||
import time
|
||||
import glob
|
||||
import urlparse
|
||||
|
||||
from ansible.module_utils._text import to_text
|
||||
from ansible.plugins.action import ActionBase
|
||||
from ansible.utils.boolean import boolean
|
||||
from ansible.utils.unicode import to_unicode
|
||||
|
||||
|
||||
BOOLEANS = ('true', 'false', 'yes', 'no')
|
||||
|
||||
|
||||
class ActionModule(ActionBase):
|
||||
|
||||
TRANSFERS_FILES = False
|
||||
@@ -92,7 +92,7 @@ class ActionModule(ActionBase):
|
||||
|
||||
try:
|
||||
with open(source, 'r') as f:
|
||||
template_data = to_unicode(f.read())
|
||||
template_data = to_text(f.read())
|
||||
except IOError:
|
||||
return dict(failed=True, msg='unable to load src file')
|
||||
|
||||
@@ -108,5 +108,3 @@ class ActionModule(ActionBase):
|
||||
searchpath.append(os.path.dirname(source))
|
||||
self._templar.environment.loader.searchpath = searchpath
|
||||
self._task.args['src'] = self._templar.template(template_data)
|
||||
|
||||
|
||||
|
||||
@@ -20,10 +20,10 @@ __metaclass__ = type
|
||||
|
||||
import os
|
||||
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.module_utils._text import to_native
|
||||
from ansible.plugins.action import ActionBase
|
||||
from ansible.utils.boolean import boolean
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.utils.unicode import to_str
|
||||
|
||||
|
||||
class ActionModule(ActionBase):
|
||||
@@ -52,7 +52,7 @@ class ActionModule(ActionBase):
|
||||
src = self._find_needle('files', src)
|
||||
except AnsibleError as e:
|
||||
result['failed'] = True
|
||||
result['msg'] = to_str(e)
|
||||
result['msg'] = to_native(e)
|
||||
return result
|
||||
|
||||
# create the remote tmp dir if needed, and put the source file there
|
||||
|
||||
@@ -19,15 +19,14 @@ __metaclass__ = type
|
||||
|
||||
import os
|
||||
|
||||
from ansible.plugins.action import ActionBase
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.utils.unicode import to_str
|
||||
from ansible.module_utils._text import to_native
|
||||
from ansible.plugins.action import ActionBase
|
||||
|
||||
|
||||
class ActionModule(ActionBase):
|
||||
TRANSFERS_FILES = True
|
||||
|
||||
|
||||
def run(self, tmp=None, task_vars=None):
|
||||
''' handler for file transfer operations '''
|
||||
if task_vars is None:
|
||||
@@ -74,7 +73,7 @@ class ActionModule(ActionBase):
|
||||
try:
|
||||
source = self._loader.get_real_file(self._find_needle('files', source))
|
||||
except AnsibleError as e:
|
||||
return dict(failed=True, msg=to_str(e))
|
||||
return dict(failed=True, msg=to_native(e))
|
||||
|
||||
# transfer the file to a remote tmp location
|
||||
tmp_src = self._connection._shell.join_path(tmp, os.path.basename(source))
|
||||
|
||||
@@ -23,12 +23,11 @@ import pwd
|
||||
import time
|
||||
|
||||
from ansible import constants as C
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.module_utils._text import to_bytes, to_native, to_text
|
||||
from ansible.plugins.action import ActionBase
|
||||
from ansible.utils.hashing import checksum_s
|
||||
from ansible.utils.boolean import boolean
|
||||
from ansible.utils.unicode import to_bytes, to_unicode, to_str
|
||||
from ansible.errors import AnsibleError
|
||||
|
||||
|
||||
|
||||
class ActionModule(ActionBase):
|
||||
@@ -78,7 +77,7 @@ class ActionModule(ActionBase):
|
||||
source = self._find_needle('templates', source)
|
||||
except AnsibleError as e:
|
||||
result['failed'] = True
|
||||
result['msg'] = to_str(e)
|
||||
result['msg'] = to_native(e)
|
||||
|
||||
if 'failed' in result:
|
||||
return result
|
||||
@@ -96,7 +95,7 @@ class ActionModule(ActionBase):
|
||||
b_source = to_bytes(source)
|
||||
try:
|
||||
with open(b_source, 'r') as f:
|
||||
template_data = to_unicode(f.read())
|
||||
template_data = to_text(f.read())
|
||||
|
||||
try:
|
||||
template_uid = pwd.getpwuid(os.stat(b_source).st_uid).pw_name
|
||||
@@ -163,7 +162,7 @@ class ActionModule(ActionBase):
|
||||
if self._play_context.diff:
|
||||
diff = self._get_diff_data(dest, resultant, task_vars, source_file=False)
|
||||
|
||||
if not self._play_context.check_mode: # do actual work thorugh copy
|
||||
if not self._play_context.check_mode: # do actual work through copy
|
||||
xfered = self._transfer_data(self._connection._shell.join_path(tmp, 'source'), resultant)
|
||||
|
||||
# fix file permissions when the copy is done as a different user
|
||||
@@ -176,7 +175,7 @@ class ActionModule(ActionBase):
|
||||
dest=dest,
|
||||
original_basename=os.path.basename(source),
|
||||
follow=True,
|
||||
),
|
||||
),
|
||||
)
|
||||
result.update(self._execute_module(module_name='copy', module_args=new_module_args, task_vars=task_vars, tmp=tmp, delete_remote_tmp=False))
|
||||
|
||||
|
||||
@@ -20,10 +20,11 @@ __metaclass__ = type
|
||||
|
||||
import os
|
||||
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.module_utils._text import to_native
|
||||
from ansible.plugins.action import ActionBase
|
||||
from ansible.utils.boolean import boolean
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.utils.unicode import to_str
|
||||
|
||||
|
||||
class ActionModule(ActionBase):
|
||||
|
||||
@@ -82,7 +83,7 @@ class ActionModule(ActionBase):
|
||||
source = self._loader.get_real_file(self._find_needle('files', source))
|
||||
except AnsibleError as e:
|
||||
result['failed'] = True
|
||||
result['msg'] = to_str(e)
|
||||
result['msg'] = to_native(e)
|
||||
self._remove_tmp_path(tmp)
|
||||
return result
|
||||
|
||||
|
||||
@@ -19,26 +19,24 @@
|
||||
from __future__ import (absolute_import, division, print_function)
|
||||
__metaclass__ = type
|
||||
|
||||
from ansible.plugins.action import ActionBase
|
||||
from ansible.utils.boolean import boolean
|
||||
from ansible.utils.unicode import to_unicode
|
||||
from ansible.errors import AnsibleUndefinedVariable
|
||||
|
||||
import socket
|
||||
import time
|
||||
import traceback
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from ansible.plugins.action import ActionBase
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
except ImportError:
|
||||
from ansible.utils.display import Display
|
||||
display = Display()
|
||||
|
||||
|
||||
class TimedOutException(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class ActionModule(ActionBase):
|
||||
TRANSFERS_FILES = False
|
||||
|
||||
@@ -50,7 +48,7 @@ class ActionModule(ActionBase):
|
||||
|
||||
def do_until_success_or_timeout(self, what, timeout_sec, what_desc, fail_sleep_sec=1):
|
||||
max_end_time = datetime.utcnow() + timedelta(seconds=timeout_sec)
|
||||
|
||||
|
||||
while datetime.utcnow() < max_end_time:
|
||||
try:
|
||||
what()
|
||||
@@ -82,7 +80,7 @@ class ActionModule(ActionBase):
|
||||
winrm_port = self._connection._winrm_port
|
||||
|
||||
result = super(ActionModule, self).run(tmp, task_vars)
|
||||
|
||||
|
||||
# initiate reboot
|
||||
(rc, stdout, stderr) = self._connection.exec_command("shutdown /r /t %d" % pre_reboot_delay_sec)
|
||||
|
||||
@@ -92,7 +90,7 @@ class ActionModule(ActionBase):
|
||||
result['msg'] = "Shutdown command failed, error text was %s" % stderr
|
||||
return result
|
||||
|
||||
def raise_if_port_open():
|
||||
def raise_if_port_open():
|
||||
try:
|
||||
sock = socket.create_connection((winrm_host, winrm_port), connect_timeout_sec)
|
||||
sock.close()
|
||||
@@ -137,4 +135,3 @@ class ActionModule(ActionBase):
|
||||
result['msg'] = toex.message
|
||||
|
||||
return result
|
||||
|
||||
|
||||
2
lib/ansible/plugins/cache/jsonfile.py
vendored
2
lib/ansible/plugins/cache/jsonfile.py
vendored
@@ -31,9 +31,9 @@ except ImportError:
|
||||
|
||||
from ansible import constants as C
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.module_utils._text import to_bytes
|
||||
from ansible.parsing.utils.jsonify import jsonify
|
||||
from ansible.plugins.cache.base import BaseCacheModule
|
||||
from ansible.utils.unicode import to_bytes
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
|
||||
@@ -24,12 +24,10 @@ import difflib
|
||||
import warnings
|
||||
from copy import deepcopy
|
||||
|
||||
from ansible.compat.six import string_types
|
||||
|
||||
from ansible import constants as C
|
||||
from ansible.vars import strip_internal_keys
|
||||
from ansible.module_utils._text import to_text
|
||||
from ansible.utils.color import stringc
|
||||
from ansible.utils.unicode import to_unicode
|
||||
from ansible.vars import strip_internal_keys
|
||||
|
||||
try:
|
||||
from __main__ import display as global_display
|
||||
@@ -37,14 +35,15 @@ except ImportError:
|
||||
from ansible.utils.display import Display
|
||||
global_display = Display()
|
||||
|
||||
__all__ = ["CallbackBase"]
|
||||
|
||||
try:
|
||||
from __main__ import cli
|
||||
except ImportError:
|
||||
# using API w/o cli
|
||||
# using API w/o cli
|
||||
cli = False
|
||||
|
||||
__all__ = ["CallbackBase"]
|
||||
|
||||
|
||||
class CallbackBase:
|
||||
|
||||
'''
|
||||
@@ -146,8 +145,8 @@ class CallbackBase:
|
||||
after_header = "after: %s" % diff['after_header']
|
||||
else:
|
||||
after_header = 'after'
|
||||
differ = difflib.unified_diff(to_unicode(diff['before']).splitlines(True),
|
||||
to_unicode(diff['after']).splitlines(True),
|
||||
differ = difflib.unified_diff(to_text(diff['before']).splitlines(True),
|
||||
to_text(diff['after']).splitlines(True),
|
||||
fromfile=before_header,
|
||||
tofile=after_header,
|
||||
fromfiledate='',
|
||||
@@ -166,7 +165,7 @@ class CallbackBase:
|
||||
if has_diff:
|
||||
ret.append('\n')
|
||||
if 'prepared' in diff:
|
||||
ret.append(to_unicode(diff['prepared']))
|
||||
ret.append(to_text(diff['prepared']))
|
||||
except UnicodeDecodeError:
|
||||
ret.append(">> the files are different, but the diff library cannot compare unicode strings\n\n")
|
||||
return u''.join(ret)
|
||||
@@ -362,4 +361,3 @@ class CallbackBase:
|
||||
|
||||
def v2_runner_retry(self, result):
|
||||
pass
|
||||
|
||||
|
||||
@@ -21,8 +21,8 @@ __metaclass__ = type
|
||||
import os
|
||||
import time
|
||||
|
||||
from ansible.module_utils._text import to_bytes
|
||||
from ansible.plugins.callback import CallbackBase
|
||||
from ansible.utils.unicode import to_bytes
|
||||
|
||||
try:
|
||||
from junit_xml import TestSuite, TestCase
|
||||
@@ -40,6 +40,7 @@ except ImportError:
|
||||
except ImportError:
|
||||
HAS_ORDERED_DICT = False
|
||||
|
||||
|
||||
class CallbackModule(CallbackBase):
|
||||
"""
|
||||
This callback writes playbook output to a JUnit formatted XML file.
|
||||
@@ -181,7 +182,7 @@ class CallbackModule(CallbackBase):
|
||||
output_file = os.path.join(self._output_dir, '%s-%s.xml' % (self._playbook_name, time.time()))
|
||||
|
||||
with open(output_file, 'wb') as xml:
|
||||
xml.write(to_bytes(report, errors='strict'))
|
||||
xml.write(to_bytes(report, errors='surrogate_or_strict'))
|
||||
|
||||
def v2_playbook_on_start(self, playbook):
|
||||
self._playbook_path = playbook._file_name
|
||||
|
||||
@@ -23,9 +23,10 @@ import os
|
||||
import time
|
||||
import json
|
||||
|
||||
from ansible.utils.unicode import to_bytes
|
||||
from ansible.module_utils._text import to_bytes
|
||||
from ansible.plugins.callback import CallbackBase
|
||||
|
||||
|
||||
# NOTE: in Ansible 1.2 or later general logging is available without
|
||||
# this plugin, just set ANSIBLE_LOG_PATH as an environment variable
|
||||
# or log_path in the DEFAULTS section of your ansible configuration
|
||||
|
||||
@@ -25,9 +25,10 @@ import smtplib
|
||||
import json
|
||||
|
||||
from ansible.compat.six import string_types
|
||||
from ansible.utils.unicode import to_bytes
|
||||
from ansible.module_utils._text import to_bytes
|
||||
from ansible.plugins.callback import CallbackBase
|
||||
|
||||
|
||||
def mail(subject='Ansible error mail', sender=None, to=None, cc=None, bcc=None, body=None, smtphost=None):
|
||||
|
||||
if sender is None:
|
||||
@@ -84,7 +85,7 @@ class CallbackModule(CallbackBase):
|
||||
if ignore_errors:
|
||||
return
|
||||
sender = '"Ansible: %s" <root>' % host
|
||||
attach = res._task.action
|
||||
attach = res._task.action
|
||||
if 'invocation' in res._result:
|
||||
attach = "%s: %s" % (res._result['invocation']['module_name'], json.dumps(res._result['invocation']['module_args']))
|
||||
|
||||
|
||||
@@ -20,10 +20,10 @@ __metaclass__ = type
|
||||
|
||||
import os
|
||||
|
||||
from ansible.constants import TREE_DIR
|
||||
from ansible.module_utils._text import to_bytes
|
||||
from ansible.plugins.callback import CallbackBase
|
||||
from ansible.utils.path import makedirs_safe
|
||||
from ansible.utils.unicode import to_bytes
|
||||
from ansible.constants import TREE_DIR
|
||||
|
||||
|
||||
class CallbackModule(CallbackBase):
|
||||
@@ -68,4 +68,3 @@ class CallbackModule(CallbackBase):
|
||||
|
||||
def v2_runner_on_unreachable(self, result):
|
||||
self.result_to_tree(result)
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
# (c) 2015 Toshio Kuratomi <tkuratomi@ansible.com>
|
||||
#
|
||||
# This file is part of Ansible
|
||||
@@ -32,8 +31,9 @@ from ansible.compat.six import with_metaclass
|
||||
from ansible import constants as C
|
||||
from ansible.compat.six import string_types
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.module_utils._text import to_bytes, to_text
|
||||
from ansible.plugins import shell_loader
|
||||
from ansible.utils.unicode import to_bytes, to_unicode
|
||||
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
@@ -138,9 +138,9 @@ class ConnectionBase(with_metaclass(ABCMeta, object)):
|
||||
# exception, it merely mangles the output:
|
||||
# >>> shlex.split(u't e')
|
||||
# ['t\x00\x00\x00', '\x00\x00\x00e\x00\x00\x00']
|
||||
return [to_unicode(x.strip()) for x in shlex.split(to_bytes(argstring)) if x.strip()]
|
||||
return [to_text(x.strip()) for x in shlex.split(to_bytes(argstring)) if x.strip()]
|
||||
except AttributeError:
|
||||
return [to_unicode(x.strip()) for x in shlex.split(argstring) if x.strip()]
|
||||
return [to_text(x.strip()) for x in shlex.split(argstring) if x.strip()]
|
||||
|
||||
@abstractproperty
|
||||
def transport(self):
|
||||
|
||||
@@ -27,10 +27,11 @@ import time
|
||||
|
||||
from ansible import constants as C
|
||||
from ansible.errors import AnsibleError, AnsibleFileNotFound, AnsibleConnectionFailure
|
||||
from ansible.module_utils._text import to_bytes
|
||||
from ansible.parsing.utils.jsonify import jsonify
|
||||
from ansible.plugins.connection import ConnectionBase
|
||||
from ansible.utils.encrypt import key_for_hostname, keyczar_encrypt, keyczar_decrypt
|
||||
from ansible.utils.unicode import to_bytes
|
||||
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
@@ -211,7 +212,7 @@ class Connection(ConnectionBase):
|
||||
''' transfer a file from local to remote '''
|
||||
display.vvv("PUT %s TO %s" % (in_path, out_path), host=self._play_context.remote_addr)
|
||||
|
||||
in_path = to_bytes(in_path, errors='strict')
|
||||
in_path = to_bytes(in_path, errors='surrogate_or_strict')
|
||||
|
||||
if not os.path.exists(in_path):
|
||||
raise AnsibleFileNotFound("file or module does not exist: %s" % in_path)
|
||||
@@ -265,7 +266,7 @@ class Connection(ConnectionBase):
|
||||
if self.send_data(data):
|
||||
raise AnsibleError("failed to initiate the file fetch with %s" % self._play_context.remote_addr)
|
||||
|
||||
fh = open(to_bytes(out_path, errors='strict'), "w")
|
||||
fh = open(to_bytes(out_path, errors='surrogate_or_strict'), "w")
|
||||
try:
|
||||
bytes = 0
|
||||
while True:
|
||||
|
||||
@@ -28,9 +28,10 @@ import traceback
|
||||
|
||||
from ansible import constants as C
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.plugins.connection import ConnectionBase, BUFSIZE
|
||||
from ansible.module_utils.basic import is_executable
|
||||
from ansible.utils.unicode import to_bytes
|
||||
from ansible.module_utils._text import to_bytes
|
||||
from ansible.plugins.connection import ConnectionBase, BUFSIZE
|
||||
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
@@ -93,7 +94,7 @@ class Connection(ConnectionBase):
|
||||
local_cmd = [self.chroot_cmd, self.chroot, executable, '-c', cmd]
|
||||
|
||||
display.vvv("EXEC %s" % (local_cmd), host=self.chroot)
|
||||
local_cmd = [to_bytes(i, errors='strict') for i in local_cmd]
|
||||
local_cmd = [to_bytes(i, errors='surrogate_or_strict') for i in local_cmd]
|
||||
p = subprocess.Popen(local_cmd, shell=False, stdin=stdin,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
|
||||
@@ -129,7 +130,7 @@ class Connection(ConnectionBase):
|
||||
|
||||
out_path = pipes.quote(self._prefix_login_path(out_path))
|
||||
try:
|
||||
with open(to_bytes(in_path, errors='strict'), 'rb') as in_file:
|
||||
with open(to_bytes(in_path, errors='surrogate_or_strict'), 'rb') as in_file:
|
||||
try:
|
||||
p = self._buffered_exec_command('dd of=%s bs=%s' % (out_path, BUFSIZE), stdin=in_file)
|
||||
except OSError:
|
||||
@@ -155,7 +156,7 @@ class Connection(ConnectionBase):
|
||||
except OSError:
|
||||
raise AnsibleError("chroot connection requires dd command in the chroot")
|
||||
|
||||
with open(to_bytes(out_path, errors='strict'), 'wb+') as out_file:
|
||||
with open(to_bytes(out_path, errors='surrogate_or_strict'), 'wb+') as out_file:
|
||||
try:
|
||||
chunk = p.stdout.read(BUFSIZE)
|
||||
while chunk:
|
||||
|
||||
@@ -35,8 +35,9 @@ from distutils.version import LooseVersion
|
||||
|
||||
import ansible.constants as C
|
||||
from ansible.errors import AnsibleError, AnsibleFileNotFound
|
||||
from ansible.module_utils._text import to_bytes
|
||||
from ansible.plugins.connection import ConnectionBase, BUFSIZE
|
||||
from ansible.utils.unicode import to_bytes
|
||||
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
@@ -196,7 +197,7 @@ class Connection(ConnectionBase):
|
||||
local_cmd = self._build_exec_cmd([self._play_context.executable, '-c', cmd])
|
||||
|
||||
display.vvv("EXEC %s" % (local_cmd,), host=self._play_context.remote_addr)
|
||||
local_cmd = [to_bytes(i, errors='strict') for i in local_cmd]
|
||||
local_cmd = [to_bytes(i, errors='surrogate_or_strict') for i in local_cmd]
|
||||
p = subprocess.Popen(local_cmd, shell=False, stdin=subprocess.PIPE,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
|
||||
@@ -223,7 +224,7 @@ class Connection(ConnectionBase):
|
||||
display.vvv("PUT %s TO %s" % (in_path, out_path), host=self._play_context.remote_addr)
|
||||
|
||||
out_path = self._prefix_login_path(out_path)
|
||||
if not os.path.exists(to_bytes(in_path, errors='strict')):
|
||||
if not os.path.exists(to_bytes(in_path, errors='surrogate_or_strict')):
|
||||
raise AnsibleFileNotFound(
|
||||
"file or module does not exist: %s" % in_path)
|
||||
|
||||
@@ -233,8 +234,8 @@ class Connection(ConnectionBase):
|
||||
# Although docker version 1.8 and later provide support, the
|
||||
# owner and group of the files are always set to root
|
||||
args = self._build_exec_cmd([self._play_context.executable, "-c", "dd of=%s bs=%s" % (out_path, BUFSIZE)])
|
||||
args = [to_bytes(i, errors='strict') for i in args]
|
||||
with open(to_bytes(in_path, errors='strict'), 'rb') as in_file:
|
||||
args = [to_bytes(i, errors='surrogate_or_strict') for i in args]
|
||||
with open(to_bytes(in_path, errors='surrogate_or_strict'), 'rb') as in_file:
|
||||
try:
|
||||
p = subprocess.Popen(args, stdin=in_file,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
@@ -256,7 +257,7 @@ class Connection(ConnectionBase):
|
||||
out_dir = os.path.dirname(out_path)
|
||||
|
||||
args = [self.docker_cmd, "cp", "%s:%s" % (self._play_context.remote_addr, in_path), out_dir]
|
||||
args = [to_bytes(i, errors='strict') for i in args]
|
||||
args = [to_bytes(i, errors='surrogate_or_strict') for i in args]
|
||||
|
||||
p = subprocess.Popen(args, stdin=subprocess.PIPE,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
|
||||
@@ -27,10 +27,9 @@ import pipes
|
||||
import subprocess
|
||||
import traceback
|
||||
|
||||
from ansible import constants as C
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.module_utils._text import to_bytes
|
||||
from ansible.plugins.connection import ConnectionBase, BUFSIZE
|
||||
from ansible.utils.unicode import to_bytes
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
@@ -117,7 +116,7 @@ class Connection(ConnectionBase):
|
||||
local_cmd += [self.jail, self._play_context.executable, '-c', set_env + cmd]
|
||||
|
||||
display.vvv("EXEC %s" % (local_cmd,), host=self.jail)
|
||||
local_cmd = [to_bytes(i, errors='strict') for i in local_cmd]
|
||||
local_cmd = [to_bytes(i, errors='surrogate_or_strict') for i in local_cmd]
|
||||
p = subprocess.Popen(local_cmd, shell=False, stdin=stdin,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
|
||||
@@ -153,7 +152,7 @@ class Connection(ConnectionBase):
|
||||
|
||||
out_path = pipes.quote(self._prefix_login_path(out_path))
|
||||
try:
|
||||
with open(to_bytes(in_path, errors='strict'), 'rb') as in_file:
|
||||
with open(to_bytes(in_path, errors='surrogate_or_strict'), 'rb') as in_file:
|
||||
try:
|
||||
p = self._buffered_exec_command('dd of=%s bs=%s' % (out_path, BUFSIZE), stdin=in_file)
|
||||
except OSError:
|
||||
@@ -179,7 +178,7 @@ class Connection(ConnectionBase):
|
||||
except OSError:
|
||||
raise AnsibleError("jail connection requires dd command in the jail")
|
||||
|
||||
with open(to_bytes(out_path, errors='strict'), 'wb+') as out_file:
|
||||
with open(to_bytes(out_path, errors='surrogate_or_strict'), 'wb+') as out_file:
|
||||
try:
|
||||
chunk = p.stdout.read(BUFSIZE)
|
||||
while chunk:
|
||||
|
||||
@@ -29,8 +29,9 @@ import traceback
|
||||
|
||||
from ansible import constants as C
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.module_utils._text import to_bytes
|
||||
from ansible.plugins.connection import ConnectionBase, BUFSIZE
|
||||
from ansible.utils.unicode import to_bytes
|
||||
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
@@ -94,7 +95,7 @@ class Connection(ConnectionBase):
|
||||
local_cmd += [self.lxc, '--', executable, '-c', cmd]
|
||||
|
||||
display.vvv("EXEC %s" % (local_cmd,), host=self.lxc)
|
||||
local_cmd = [to_bytes(i, errors='strict') for i in local_cmd]
|
||||
local_cmd = [to_bytes(i, errors='surrogate_or_strict') for i in local_cmd]
|
||||
p = subprocess.Popen(local_cmd, shell=False, stdin=stdin,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
|
||||
@@ -130,7 +131,7 @@ class Connection(ConnectionBase):
|
||||
|
||||
out_path = pipes.quote(self._prefix_login_path(out_path))
|
||||
try:
|
||||
with open(to_bytes(in_path, errors='strict'), 'rb') as in_file:
|
||||
with open(to_bytes(in_path, errors='surrogate_or_strict'), 'rb') as in_file:
|
||||
try:
|
||||
p = self._buffered_exec_command('dd of=%s bs=%s' % (out_path, BUFSIZE), stdin=in_file)
|
||||
except OSError:
|
||||
@@ -156,7 +157,7 @@ class Connection(ConnectionBase):
|
||||
except OSError:
|
||||
raise AnsibleError("chroot connection requires dd command in the chroot")
|
||||
|
||||
with open(to_bytes(out_path, errors='strict'), 'wb+') as out_file:
|
||||
with open(to_bytes(out_path, errors='surrogate_or_strict'), 'wb+') as out_file:
|
||||
try:
|
||||
chunk = p.stdout.read(BUFSIZE)
|
||||
while chunk:
|
||||
|
||||
@@ -30,8 +30,9 @@ from ansible.compat.six import text_type, binary_type
|
||||
import ansible.constants as C
|
||||
|
||||
from ansible.errors import AnsibleError, AnsibleFileNotFound
|
||||
from ansible.module_utils._text import to_bytes, to_native
|
||||
from ansible.plugins.connection import ConnectionBase
|
||||
from ansible.utils.unicode import to_bytes, to_str
|
||||
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
@@ -122,14 +123,14 @@ class Connection(ConnectionBase):
|
||||
super(Connection, self).put_file(in_path, out_path)
|
||||
|
||||
display.vvv(u"PUT {0} TO {1}".format(in_path, out_path), host=self._play_context.remote_addr)
|
||||
if not os.path.exists(to_bytes(in_path, errors='strict')):
|
||||
raise AnsibleFileNotFound("file or module does not exist: {0}".format(to_str(in_path)))
|
||||
if not os.path.exists(to_bytes(in_path, errors='surrogate_or_strict')):
|
||||
raise AnsibleFileNotFound("file or module does not exist: {0}".format(to_native(in_path)))
|
||||
try:
|
||||
shutil.copyfile(to_bytes(in_path, errors='strict'), to_bytes(out_path, errors='strict'))
|
||||
shutil.copyfile(to_bytes(in_path, errors='surrogate_or_strict'), to_bytes(out_path, errors='surrogate_or_strict'))
|
||||
except shutil.Error:
|
||||
raise AnsibleError("failed to copy: {0} and {1} are the same".format(to_str(in_path), to_str(out_path)))
|
||||
raise AnsibleError("failed to copy: {0} and {1} are the same".format(to_native(in_path), to_native(out_path)))
|
||||
except IOError as e:
|
||||
raise AnsibleError("failed to transfer file to {0}: {1}".format(to_str(out_path), to_str(e)))
|
||||
raise AnsibleError("failed to transfer file to {0}: {1}".format(to_native(out_path), to_native(e)))
|
||||
|
||||
def fetch_file(self, in_path, out_path):
|
||||
''' fetch a file from local to local -- for copatibility '''
|
||||
|
||||
@@ -24,10 +24,6 @@ import traceback
|
||||
import select
|
||||
import fcntl
|
||||
import errno
|
||||
from ansible import errors
|
||||
from ansible import constants as C
|
||||
from ansible.plugins.connection import ConnectionBase
|
||||
from ansible.utils.unicode import to_bytes
|
||||
|
||||
HAS_LIBLXC = False
|
||||
try:
|
||||
@@ -36,6 +32,12 @@ try:
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
from ansible import constants as C
|
||||
from ansible import errors
|
||||
from ansible.module_utils._text import to_bytes
|
||||
from ansible.plugins.connection import ConnectionBase
|
||||
|
||||
|
||||
class Connection(ConnectionBase):
|
||||
''' Local lxc based connections '''
|
||||
|
||||
@@ -102,8 +104,8 @@ class Connection(ConnectionBase):
|
||||
''' run a command on the chroot '''
|
||||
super(Connection, self).exec_command(cmd, in_data=in_data, sudoable=sudoable)
|
||||
|
||||
executable = to_bytes(self._play_context.executable, errors='strict')
|
||||
local_cmd = [executable, '-c', to_bytes(cmd, errors='strict')]
|
||||
executable = to_bytes(self._play_context.executable, errors='surrogate_or_strict')
|
||||
local_cmd = [executable, '-c', to_bytes(cmd, errors='surrogate_or_strict')]
|
||||
|
||||
read_stdout, write_stdout = None, None
|
||||
read_stderr, write_stderr = None, None
|
||||
@@ -154,8 +156,8 @@ class Connection(ConnectionBase):
|
||||
''' transfer a file from local to lxc '''
|
||||
super(Connection, self).put_file(in_path, out_path)
|
||||
self._display.vvv("PUT %s TO %s" % (in_path, out_path), host=self.container_name)
|
||||
in_path = to_bytes(in_path, errors='strict')
|
||||
out_path = to_bytes(out_path, errors='strict')
|
||||
in_path = to_bytes(in_path, errors='surrogate_or_strict')
|
||||
out_path = to_bytes(out_path, errors='surrogate_or_strict')
|
||||
|
||||
if not os.path.exists(in_path):
|
||||
msg = "file or module does not exist: %s" % in_path
|
||||
@@ -182,8 +184,8 @@ class Connection(ConnectionBase):
|
||||
''' fetch a file from lxc to local '''
|
||||
super(Connection, self).fetch_file(in_path, out_path)
|
||||
self._display.vvv("FETCH %s TO %s" % (in_path, out_path), host=self.container_name)
|
||||
in_path = to_bytes(in_path, errors='strict')
|
||||
out_path = to_bytes(out_path, errors='strict')
|
||||
in_path = to_bytes(in_path, errors='surrogate_or_strict')
|
||||
out_path = to_bytes(out_path, errors='surrogate_or_strict')
|
||||
|
||||
try:
|
||||
dst_file = open(out_path, "wb")
|
||||
|
||||
@@ -23,8 +23,8 @@ from distutils.spawn import find_executable
|
||||
from subprocess import call, Popen, PIPE
|
||||
|
||||
from ansible.errors import AnsibleError, AnsibleConnectionFailure, AnsibleFileNotFound
|
||||
from ansible.module_utils._text import to_bytes, to_text
|
||||
from ansible.plugins.connection import ConnectionBase
|
||||
from ansible.utils.unicode import to_bytes, to_unicode
|
||||
|
||||
|
||||
class Connection(ConnectionBase):
|
||||
@@ -61,14 +61,14 @@ class Connection(ConnectionBase):
|
||||
|
||||
local_cmd = [self._lxc_cmd, "exec", self._host, "--", self._play_context.executable, "-c", cmd]
|
||||
|
||||
local_cmd = [to_bytes(i, errors='strict') for i in local_cmd]
|
||||
in_data = to_bytes(in_data, errors='strict', nonstring='passthru')
|
||||
local_cmd = [to_bytes(i, errors='surrogate_or_strict') for i in local_cmd]
|
||||
in_data = to_bytes(in_data, errors='surrogate_or_strict', nonstring='passthru')
|
||||
|
||||
process = Popen(local_cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)
|
||||
stdout, stderr = process.communicate(in_data)
|
||||
|
||||
stdout = to_unicode(stdout)
|
||||
stderr = to_unicode(stderr)
|
||||
stdout = to_text(stdout)
|
||||
stderr = to_text(stderr)
|
||||
|
||||
if stderr == "error: Container is not running.\n":
|
||||
raise AnsibleConnectionFailure("container not running: %s" % self._host)
|
||||
@@ -84,12 +84,12 @@ class Connection(ConnectionBase):
|
||||
|
||||
self._display.vvv(u"PUT {0} TO {1}".format(in_path, out_path), host=self._host)
|
||||
|
||||
if not os.path.isfile(to_bytes(in_path, errors='strict')):
|
||||
if not os.path.isfile(to_bytes(in_path, errors='surrogate_or_strict')):
|
||||
raise AnsibleFileNotFound("input path is not a file: %s" % in_path)
|
||||
|
||||
local_cmd = [self._lxc_cmd, "file", "push", in_path, self._host + "/" + out_path]
|
||||
|
||||
local_cmd = [to_bytes(i, errors='strict') for i in local_cmd]
|
||||
local_cmd = [to_bytes(i, errors='surrogate_or_strict') for i in local_cmd]
|
||||
|
||||
call(local_cmd)
|
||||
|
||||
@@ -101,7 +101,7 @@ class Connection(ConnectionBase):
|
||||
|
||||
local_cmd = [self._lxc_cmd, "file", "pull", self._host + "/" + in_path, out_path]
|
||||
|
||||
local_cmd = [to_bytes(i, errors='strict') for i in local_cmd]
|
||||
local_cmd = [to_bytes(i, errors='surrogate_or_strict') for i in local_cmd]
|
||||
|
||||
call(local_cmd)
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ from ansible.compat.six.moves import input
|
||||
from ansible.errors import AnsibleError, AnsibleConnectionFailure, AnsibleFileNotFound
|
||||
from ansible.plugins.connection import ConnectionBase
|
||||
from ansible.utils.path import makedirs_safe
|
||||
from ansible.utils.unicode import to_bytes
|
||||
from ansible.module_utils._text import to_bytes
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
@@ -52,6 +52,7 @@ except ImportError:
|
||||
from ansible.utils.display import Display
|
||||
display = Display()
|
||||
|
||||
|
||||
AUTHENTICITY_MSG="""
|
||||
paramiko: The authenticity of host '%s' can't be established.
|
||||
The %s key fingerprint is %s.
|
||||
@@ -273,7 +274,7 @@ class Connection(ConnectionBase):
|
||||
|
||||
display.vvv("EXEC %s" % cmd, host=self._play_context.remote_addr)
|
||||
|
||||
cmd = to_bytes(cmd, errors='strict')
|
||||
cmd = to_bytes(cmd, errors='surrogate_or_strict')
|
||||
|
||||
no_prompt_out = b''
|
||||
no_prompt_err = b''
|
||||
@@ -330,7 +331,7 @@ class Connection(ConnectionBase):
|
||||
|
||||
display.vvv("PUT %s TO %s" % (in_path, out_path), host=self._play_context.remote_addr)
|
||||
|
||||
if not os.path.exists(to_bytes(in_path, errors='strict')):
|
||||
if not os.path.exists(to_bytes(in_path, errors='surrogate_or_strict')):
|
||||
raise AnsibleFileNotFound("file or module does not exist: %s" % in_path)
|
||||
|
||||
try:
|
||||
@@ -339,7 +340,7 @@ class Connection(ConnectionBase):
|
||||
raise AnsibleError("failed to open a SFTP connection (%s)" % e)
|
||||
|
||||
try:
|
||||
self.sftp.put(to_bytes(in_path, errors='strict'), to_bytes(out_path, errors='strict'))
|
||||
self.sftp.put(to_bytes(in_path, errors='surrogate_or_strict'), to_bytes(out_path, errors='surrogate_or_strict'))
|
||||
except IOError:
|
||||
raise AnsibleError("failed to transfer file to %s" % out_path)
|
||||
|
||||
@@ -365,7 +366,7 @@ class Connection(ConnectionBase):
|
||||
raise AnsibleError("failed to open a SFTP connection (%s)", e)
|
||||
|
||||
try:
|
||||
self.sftp.get(to_bytes(in_path, errors='strict'), to_bytes(out_path, errors='strict'))
|
||||
self.sftp.get(to_bytes(in_path, errors='surrogate_or_strict'), to_bytes(out_path, errors='surrogate_or_strict'))
|
||||
except IOError:
|
||||
raise AnsibleError("failed to transfer file from %s" % in_path)
|
||||
|
||||
|
||||
@@ -29,11 +29,11 @@ import subprocess
|
||||
import time
|
||||
|
||||
from ansible import constants as C
|
||||
from ansible.compat.six import text_type, binary_type
|
||||
from ansible.errors import AnsibleError, AnsibleConnectionFailure, AnsibleFileNotFound
|
||||
from ansible.module_utils._text import to_bytes, to_native, to_text
|
||||
from ansible.plugins.connection import ConnectionBase
|
||||
from ansible.utils.path import unfrackpath, makedirs_safe
|
||||
from ansible.utils.unicode import to_bytes, to_unicode, to_str
|
||||
from ansible.compat.six import text_type, binary_type
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
@@ -107,7 +107,7 @@ class Connection(ConnectionBase):
|
||||
explanation of why they were added.
|
||||
"""
|
||||
self._command += args
|
||||
display.vvvvv('SSH: ' + explanation + ': (%s)' % ')('.join(map(to_unicode, args)), host=self._play_context.remote_addr)
|
||||
display.vvvvv('SSH: ' + explanation + ': (%s)' % ')('.join(map(to_text, args)), host=self._play_context.remote_addr)
|
||||
|
||||
def _build_command(self, binary, *other_args):
|
||||
'''
|
||||
@@ -222,7 +222,7 @@ class Connection(ConnectionBase):
|
||||
# The directory must exist and be writable.
|
||||
makedirs_safe(b_cpdir, 0o700)
|
||||
if not os.access(b_cpdir, os.W_OK):
|
||||
raise AnsibleError("Cannot write to ControlPath %s" % to_str(cpdir))
|
||||
raise AnsibleError("Cannot write to ControlPath %s" % to_native(cpdir))
|
||||
|
||||
args = ("-o", "ControlPath=" + C.ANSIBLE_SSH_CONTROL_PATH % dict(directory=cpdir))
|
||||
self._add_args("found only ControlPersist; added ControlPath", args)
|
||||
@@ -275,7 +275,7 @@ class Connection(ConnectionBase):
|
||||
|
||||
output = []
|
||||
for b_line in b_chunk.splitlines(True):
|
||||
display_line = to_unicode(b_line, errors='replace').rstrip('\r\n')
|
||||
display_line = to_text(b_line).rstrip('\r\n')
|
||||
suppress_output = False
|
||||
|
||||
#display.debug("Examining line (source=%s, state=%s): '%s'" % (source, state, display_line))
|
||||
@@ -314,7 +314,7 @@ class Connection(ConnectionBase):
|
||||
Starts the command and communicates with it until it ends.
|
||||
'''
|
||||
|
||||
display_cmd = list(map(pipes.quote, map(to_unicode, cmd)))
|
||||
display_cmd = list(map(pipes.quote, map(to_text, cmd)))
|
||||
display.vvv(u'SSH: EXEC {0}'.format(u' '.join(display_cmd)), host=self.host)
|
||||
|
||||
# Start the given command. If we don't need to pipeline data, we can try
|
||||
@@ -424,7 +424,7 @@ class Connection(ConnectionBase):
|
||||
if p.poll() is not None:
|
||||
break
|
||||
self._terminate_process(p)
|
||||
raise AnsibleError('Timeout (%ds) waiting for privilege escalation prompt: %s' % (timeout, to_str(b_stdout)))
|
||||
raise AnsibleError('Timeout (%ds) waiting for privilege escalation prompt: %s' % (timeout, to_native(b_stdout)))
|
||||
|
||||
# Read whatever output is available on stdout and stderr, and stop
|
||||
# listening to the pipe if it's been closed.
|
||||
@@ -434,14 +434,14 @@ class Connection(ConnectionBase):
|
||||
if b_chunk == b'':
|
||||
rpipes.remove(p.stdout)
|
||||
b_tmp_stdout += b_chunk
|
||||
display.debug("stdout chunk (state=%s):\n>>>%s<<<\n" % (state, to_unicode(b_chunk, errors='replace')))
|
||||
display.debug("stdout chunk (state=%s):\n>>>%s<<<\n" % (state, to_text(b_chunk)))
|
||||
|
||||
if p.stderr in rfd:
|
||||
b_chunk = p.stderr.read()
|
||||
if b_chunk == b'':
|
||||
rpipes.remove(p.stderr)
|
||||
b_tmp_stderr += b_chunk
|
||||
display.debug("stderr chunk (state=%s):\n>>>%s<<<\n" % (state, to_unicode(b_chunk, errors='replace')))
|
||||
display.debug("stderr chunk (state=%s):\n>>>%s<<<\n" % (state, to_text(b_chunk)))
|
||||
|
||||
# We examine the output line-by-line until we have negotiated any
|
||||
# privilege escalation prompt and subsequent success/error message.
|
||||
@@ -631,8 +631,8 @@ class Connection(ConnectionBase):
|
||||
super(Connection, self).put_file(in_path, out_path)
|
||||
|
||||
display.vvv(u"PUT {0} TO {1}".format(in_path, out_path), host=self.host)
|
||||
if not os.path.exists(to_bytes(in_path, errors='strict')):
|
||||
raise AnsibleFileNotFound("file or module does not exist: {0}".format(to_str(in_path)))
|
||||
if not os.path.exists(to_bytes(in_path, errors='surrogate_or_strict')):
|
||||
raise AnsibleFileNotFound("file or module does not exist: {0}".format(to_native(in_path)))
|
||||
|
||||
# scp and sftp require square brackets for IPv6 addresses, but
|
||||
# accept them for hostnames and IPv4 addresses too.
|
||||
@@ -649,7 +649,7 @@ class Connection(ConnectionBase):
|
||||
(returncode, stdout, stderr) = self._run(cmd, in_data)
|
||||
|
||||
if returncode != 0:
|
||||
raise AnsibleError("failed to transfer file to {0}:\n{1}\n{2}".format(to_str(out_path), to_str(stdout), to_str(stderr)))
|
||||
raise AnsibleError("failed to transfer file to {0}:\n{1}\n{2}".format(to_native(out_path), to_native(stdout), to_native(stderr)))
|
||||
|
||||
def fetch_file(self, in_path, out_path):
|
||||
''' fetch a file from remote to local '''
|
||||
|
||||
@@ -26,9 +26,21 @@ import shlex
|
||||
import traceback
|
||||
import json
|
||||
|
||||
HAVE_KERBEROS = False
|
||||
try:
|
||||
import kerberos
|
||||
HAVE_KERBEROS = True
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
from ansible.compat.six import string_types
|
||||
from ansible.compat.six.moves.urllib.parse import urlunsplit
|
||||
from ansible.errors import AnsibleError, AnsibleConnectionFailure
|
||||
from ansible.errors import AnsibleFileNotFound
|
||||
from ansible.module_utils._text import to_bytes, to_native, to_text
|
||||
from ansible.plugins.connection import ConnectionBase
|
||||
from ansible.utils.hashing import secure_hash
|
||||
from ansible.utils.path import makedirs_safe
|
||||
|
||||
try:
|
||||
import winrm
|
||||
@@ -42,25 +54,13 @@ try:
|
||||
except ImportError:
|
||||
raise AnsibleError("xmltodict is not installed")
|
||||
|
||||
HAVE_KERBEROS = False
|
||||
try:
|
||||
import kerberos
|
||||
HAVE_KERBEROS = True
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
from ansible.errors import AnsibleFileNotFound
|
||||
from ansible.plugins.connection import ConnectionBase
|
||||
from ansible.utils.hashing import secure_hash
|
||||
from ansible.utils.path import makedirs_safe
|
||||
from ansible.utils.unicode import to_bytes, to_unicode, to_str
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
except ImportError:
|
||||
from ansible.utils.display import Display
|
||||
display = Display()
|
||||
|
||||
|
||||
class Connection(ConnectionBase):
|
||||
'''WinRM connections over HTTP/HTTPS.'''
|
||||
|
||||
@@ -156,10 +156,10 @@ class Connection(ConnectionBase):
|
||||
|
||||
return protocol
|
||||
except Exception as e:
|
||||
err_msg = to_unicode(e).strip()
|
||||
if re.search(to_unicode(r'Operation\s+?timed\s+?out'), err_msg, re.I):
|
||||
err_msg = to_text(e).strip()
|
||||
if re.search(to_text(r'Operation\s+?timed\s+?out'), err_msg, re.I):
|
||||
raise AnsibleError('the connection attempt timed out')
|
||||
m = re.search(to_unicode(r'Code\s+?(\d{3})'), err_msg)
|
||||
m = re.search(to_text(r'Code\s+?(\d{3})'), err_msg)
|
||||
if m:
|
||||
code = int(m.groups()[0])
|
||||
if code == 401:
|
||||
@@ -167,9 +167,9 @@ class Connection(ConnectionBase):
|
||||
elif code == 411:
|
||||
return protocol
|
||||
errors.append(u'%s: %s' % (transport, err_msg))
|
||||
display.vvvvv(u'WINRM CONNECTION ERROR: %s\n%s' % (err_msg, to_unicode(traceback.format_exc())), host=self._winrm_host)
|
||||
display.vvvvv(u'WINRM CONNECTION ERROR: %s\n%s' % (err_msg, to_text(traceback.format_exc())), host=self._winrm_host)
|
||||
if errors:
|
||||
raise AnsibleConnectionFailure(', '.join(map(to_str, errors)))
|
||||
raise AnsibleConnectionFailure(', '.join(map(to_native, errors)))
|
||||
else:
|
||||
raise AnsibleError('No transport found for WinRM connection')
|
||||
|
||||
@@ -220,12 +220,12 @@ class Connection(ConnectionBase):
|
||||
|
||||
# TODO: check result from response and set stdin_push_failed if we have nonzero
|
||||
if from_exec:
|
||||
display.vvvvv('WINRM RESULT %r' % to_unicode(response), host=self._winrm_host)
|
||||
display.vvvvv('WINRM RESULT %r' % to_text(response), host=self._winrm_host)
|
||||
else:
|
||||
display.vvvvvv('WINRM RESULT %r' % to_unicode(response), host=self._winrm_host)
|
||||
display.vvvvvv('WINRM RESULT %r' % to_text(response), host=self._winrm_host)
|
||||
|
||||
display.vvvvvv('WINRM STDOUT %s' % to_unicode(response.std_out), host=self._winrm_host)
|
||||
display.vvvvvv('WINRM STDERR %s' % to_unicode(response.std_err), host=self._winrm_host)
|
||||
display.vvvvvv('WINRM STDOUT %s' % to_text(response.std_out), host=self._winrm_host)
|
||||
display.vvvvvv('WINRM STDERR %s' % to_text(response.std_err), host=self._winrm_host)
|
||||
|
||||
if stdin_push_failed:
|
||||
raise AnsibleError('winrm send_input failed; \nstdout: %s\nstderr %s' % (response.std_out, response.std_err))
|
||||
@@ -250,7 +250,7 @@ class Connection(ConnectionBase):
|
||||
def exec_command(self, cmd, in_data=None, sudoable=True):
|
||||
super(Connection, self).exec_command(cmd, in_data=in_data, sudoable=sudoable)
|
||||
cmd_parts = shlex.split(to_bytes(cmd), posix=False)
|
||||
cmd_parts = map(to_unicode, cmd_parts)
|
||||
cmd_parts = map(to_text, cmd_parts)
|
||||
script = None
|
||||
cmd_ext = cmd_parts and self._shell._unquote(cmd_parts[0]).lower()[-4:] or ''
|
||||
# Support running .ps1 files (via script/raw).
|
||||
@@ -266,7 +266,7 @@ class Connection(ConnectionBase):
|
||||
cmd_parts = self._shell._encode_script(script, as_list=True, strict_mode=False)
|
||||
if '-EncodedCommand' in cmd_parts:
|
||||
encoded_cmd = cmd_parts[cmd_parts.index('-EncodedCommand') + 1]
|
||||
decoded_cmd = to_unicode(base64.b64decode(encoded_cmd).decode('utf-16-le'))
|
||||
decoded_cmd = to_text(base64.b64decode(encoded_cmd).decode('utf-16-le'))
|
||||
display.vvv("EXEC %s" % decoded_cmd, host=self._winrm_host)
|
||||
else:
|
||||
display.vvv("EXEC %s" % cmd, host=self._winrm_host)
|
||||
@@ -300,9 +300,9 @@ class Connection(ConnectionBase):
|
||||
|
||||
# FUTURE: determine buffer size at runtime via remote winrm config?
|
||||
def _put_file_stdin_iterator(self, in_path, out_path, buffer_size=250000):
|
||||
in_size = os.path.getsize(to_bytes(in_path, errors='strict'))
|
||||
in_size = os.path.getsize(to_bytes(in_path, errors='surrogate_or_strict'))
|
||||
offset = 0
|
||||
with open(to_bytes(in_path, errors='strict'), 'rb') as in_file:
|
||||
with open(to_bytes(in_path, errors='surrogate_or_strict'), 'rb') as in_file:
|
||||
for out_data in iter((lambda:in_file.read(buffer_size)), ''):
|
||||
offset += len(out_data)
|
||||
self._display.vvvvv('WINRM PUT "%s" to "%s" (offset=%d size=%d)' % (in_path, out_path, offset, len(out_data)), host=self._winrm_host)
|
||||
@@ -318,7 +318,7 @@ class Connection(ConnectionBase):
|
||||
super(Connection, self).put_file(in_path, out_path)
|
||||
out_path = self._shell._unquote(out_path)
|
||||
display.vvv('PUT "%s" TO "%s"' % (in_path, out_path), host=self._winrm_host)
|
||||
if not os.path.exists(to_bytes(in_path, errors='strict')):
|
||||
if not os.path.exists(to_bytes(in_path, errors='surrogate_or_strict')):
|
||||
raise AnsibleFileNotFound('file or module does not exist: "%s"' % in_path)
|
||||
|
||||
script_template = u'''
|
||||
@@ -357,7 +357,7 @@ class Connection(ConnectionBase):
|
||||
result = self._winrm_exec(cmd_parts[0], cmd_parts[1:], stdin_iterator=self._put_file_stdin_iterator(in_path, out_path))
|
||||
# TODO: improve error handling
|
||||
if result.status_code != 0:
|
||||
raise AnsibleError(to_str(result.std_err))
|
||||
raise AnsibleError(to_native(result.std_err))
|
||||
|
||||
put_output = json.loads(result.std_out)
|
||||
remote_sha1 = put_output.get("sha1")
|
||||
@@ -368,7 +368,7 @@ class Connection(ConnectionBase):
|
||||
local_sha1 = secure_hash(in_path)
|
||||
|
||||
if not remote_sha1 == local_sha1:
|
||||
raise AnsibleError("Remote sha1 hash {0} does not match local hash {1}".format(to_str(remote_sha1), to_str(local_sha1)))
|
||||
raise AnsibleError("Remote sha1 hash {0} does not match local hash {1}".format(to_native(remote_sha1), to_native(local_sha1)))
|
||||
|
||||
def fetch_file(self, in_path, out_path):
|
||||
super(Connection, self).fetch_file(in_path, out_path)
|
||||
@@ -407,7 +407,7 @@ class Connection(ConnectionBase):
|
||||
cmd_parts = self._shell._encode_script(script, as_list=True)
|
||||
result = self._winrm_exec(cmd_parts[0], cmd_parts[1:])
|
||||
if result.status_code != 0:
|
||||
raise IOError(to_str(result.std_err))
|
||||
raise IOError(to_native(result.std_err))
|
||||
if result.std_out.strip() == '[DIR]':
|
||||
data = None
|
||||
else:
|
||||
@@ -418,9 +418,9 @@ class Connection(ConnectionBase):
|
||||
else:
|
||||
if not out_file:
|
||||
# If out_path is a directory and we're expecting a file, bail out now.
|
||||
if os.path.isdir(to_bytes(out_path, errors='strict')):
|
||||
if os.path.isdir(to_bytes(out_path, errors='surrogate_or_strict')):
|
||||
break
|
||||
out_file = open(to_bytes(out_path, errors='strict'), 'wb')
|
||||
out_file = open(to_bytes(out_path, errors='surrogate_or_strict'), 'wb')
|
||||
out_file.write(data)
|
||||
if len(data) < buffer_size:
|
||||
break
|
||||
|
||||
@@ -31,7 +31,8 @@ import traceback
|
||||
from ansible import constants as C
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.plugins.connection import ConnectionBase, BUFSIZE
|
||||
from ansible.utils.unicode import to_bytes
|
||||
from ansible.module_utils._text import to_bytes
|
||||
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
from __future__ import (absolute_import, division, print_function)
|
||||
__metaclass__ = type
|
||||
|
||||
|
||||
import sys
|
||||
import base64
|
||||
import itertools
|
||||
@@ -39,15 +38,6 @@ import uuid
|
||||
|
||||
import yaml
|
||||
from jinja2.filters import environmentfilter
|
||||
from ansible.compat.six import iteritems, string_types
|
||||
|
||||
from ansible import errors
|
||||
from ansible.parsing.yaml.dumper import AnsibleDumper
|
||||
from ansible.utils.hashing import md5s, checksum_s
|
||||
from ansible.utils.unicode import unicode_wrap, to_unicode
|
||||
from ansible.utils.vars import merge_hash
|
||||
from ansible.vars.hostvars import HostVars
|
||||
from ansible.compat.six.moves import reduce
|
||||
|
||||
try:
|
||||
import passlib.hash
|
||||
@@ -55,6 +45,16 @@ try:
|
||||
except:
|
||||
HAS_PASSLIB = False
|
||||
|
||||
from ansible import errors
|
||||
from ansible.compat.six import iteritems, string_types
|
||||
from ansible.compat.six.moves import reduce
|
||||
from ansible.module_utils._text import to_text
|
||||
from ansible.parsing.yaml.dumper import AnsibleDumper
|
||||
from ansible.utils.hashing import md5s, checksum_s
|
||||
from ansible.utils.unicode import unicode_wrap
|
||||
from ansible.utils.vars import merge_hash
|
||||
from ansible.vars.hostvars import HostVars
|
||||
|
||||
|
||||
UUID_NAMESPACE_ANSIBLE = uuid.UUID('361E6D51-FAEC-444A-9079-341386DA8E2E')
|
||||
|
||||
@@ -72,12 +72,12 @@ class AnsibleJSONEncoder(json.JSONEncoder):
|
||||
def to_yaml(a, *args, **kw):
|
||||
'''Make verbose, human readable yaml'''
|
||||
transformed = yaml.dump(a, Dumper=AnsibleDumper, allow_unicode=True, **kw)
|
||||
return to_unicode(transformed)
|
||||
return to_text(transformed)
|
||||
|
||||
def to_nice_yaml(a, indent=4, *args, **kw):
|
||||
'''Make verbose, human readable yaml'''
|
||||
transformed = yaml.dump(a, Dumper=AnsibleDumper, indent=indent, allow_unicode=True, default_flow_style=False, **kw)
|
||||
return to_unicode(transformed)
|
||||
return to_text(transformed)
|
||||
|
||||
def to_json(a, *args, **kw):
|
||||
''' Convert the value to JSON '''
|
||||
@@ -132,7 +132,7 @@ def fileglob(pathname):
|
||||
def regex_replace(value='', pattern='', replacement='', ignorecase=False):
|
||||
''' Perform a `re.sub` returning a string '''
|
||||
|
||||
value = to_unicode(value, errors='strict', nonstring='simplerepr')
|
||||
value = to_text(value, errors='surrogate_or_strict', nonstring='simplerepr')
|
||||
|
||||
if ignorecase:
|
||||
flags = re.I
|
||||
|
||||
@@ -98,8 +98,8 @@ class LookupBase(with_metaclass(ABCMeta, object)):
|
||||
must be converted into python's unicode type as the strings will be run
|
||||
through jinja2 which has this requirement. You can use::
|
||||
|
||||
from ansible.utils.unicode import to_unicode
|
||||
result_string = to_unicode(result_string)
|
||||
from ansible.module_utils._text import to_text
|
||||
result_string = to_text(result_string)
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
@@ -22,7 +22,8 @@ import csv
|
||||
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.plugins.lookup import LookupBase
|
||||
from ansible.utils.unicode import to_bytes, to_str, to_unicode
|
||||
from ansible.module_utils._text import to_bytes, to_native, to_text
|
||||
|
||||
|
||||
class CSVRecoder:
|
||||
"""
|
||||
@@ -49,7 +50,7 @@ class CSVReader:
|
||||
|
||||
def next(self):
|
||||
row = self.reader.next()
|
||||
return [to_unicode(s) for s in row]
|
||||
return [to_text(s) for s in row]
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
@@ -66,7 +67,7 @@ class LookupModule(LookupBase):
|
||||
if row[0] == key:
|
||||
return row[int(col)]
|
||||
except Exception as e:
|
||||
raise AnsibleError("csvfile: %s" % to_str(e))
|
||||
raise AnsibleError("csvfile: %s" % to_native(e))
|
||||
|
||||
return dflt
|
||||
|
||||
|
||||
@@ -22,7 +22,8 @@ import glob
|
||||
|
||||
from ansible.plugins.lookup import LookupBase
|
||||
from ansible.errors import AnsibleFileNotFound
|
||||
from ansible.utils.unicode import to_bytes, to_unicode
|
||||
from ansible.module_utils._text import to_bytes, to_text
|
||||
|
||||
|
||||
class LookupModule(LookupBase):
|
||||
|
||||
@@ -36,6 +37,6 @@ class LookupModule(LookupBase):
|
||||
except AnsibleFileNotFound:
|
||||
dwimmed_path = None
|
||||
if dwimmed_path:
|
||||
globbed = glob.glob(to_bytes(os.path.join(dwimmed_path, term_file), errors='strict'))
|
||||
ret.extend(to_unicode(g, errors='strict') for g in globbed if os.path.isfile(g))
|
||||
globbed = glob.glob(to_bytes(os.path.join(dwimmed_path, term_file), errors='surrogate_or_strict'))
|
||||
ret.extend(to_text(g, errors='surrogate_or_strict') for g in globbed if os.path.isfile(g))
|
||||
return ret
|
||||
|
||||
@@ -22,12 +22,6 @@ import pwd
|
||||
import grp
|
||||
import stat
|
||||
|
||||
from ansible.plugins.lookup import LookupBase
|
||||
from ansible.utils.unicode import to_str
|
||||
|
||||
from __main__ import display
|
||||
warning = display.warning
|
||||
|
||||
HAVE_SELINUX=False
|
||||
try:
|
||||
import selinux
|
||||
@@ -35,6 +29,11 @@ try:
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
from ansible.plugins.lookup import LookupBase
|
||||
from ansible.module_utils._text import to_native
|
||||
|
||||
from __main__ import display
|
||||
|
||||
|
||||
# If selinux fails to find a default, return an array of None
|
||||
def selinux_context(path):
|
||||
@@ -43,7 +42,7 @@ def selinux_context(path):
|
||||
try:
|
||||
# note: the selinux module uses byte strings on python2 and text
|
||||
# strings on python3
|
||||
ret = selinux.lgetfilecon_raw(to_str(path))
|
||||
ret = selinux.lgetfilecon_raw(to_native(path))
|
||||
except OSError:
|
||||
return context
|
||||
if ret[0] != -1:
|
||||
@@ -60,7 +59,7 @@ def file_props(root, path):
|
||||
try:
|
||||
st = os.lstat(abspath)
|
||||
except OSError as e:
|
||||
warning('filetree: Error using stat() on path %s (%s)' % (abspath, e))
|
||||
display.warning('filetree: Error using stat() on path %s (%s)' % (abspath, e))
|
||||
return None
|
||||
|
||||
ret = dict(root=root, path=path)
|
||||
@@ -74,7 +73,7 @@ def file_props(root, path):
|
||||
ret['state'] = 'file'
|
||||
ret['src'] = abspath
|
||||
else:
|
||||
warning('filetree: Error file type of %s is not supported' % abspath)
|
||||
display.warning('filetree: Error file type of %s is not supported' % abspath)
|
||||
return None
|
||||
|
||||
ret['uid'] = st.st_uid
|
||||
|
||||
@@ -30,7 +30,7 @@ except ImportError:
|
||||
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.plugins.lookup import LookupBase
|
||||
from ansible.utils.unicode import to_bytes
|
||||
from ansible.module_utils._text import to_bytes, to_text
|
||||
|
||||
|
||||
def _parse_params(term):
|
||||
@@ -59,13 +59,15 @@ class LookupModule(LookupBase):
|
||||
|
||||
def read_properties(self, filename, key, dflt, is_regexp):
|
||||
config = StringIO()
|
||||
config.write(u'[java_properties]\n' + open(to_bytes(filename, errors='strict')).read())
|
||||
current_cfg_file = open(to_bytes(filename, errors='surrogate_or_strict'), 'rb')
|
||||
|
||||
config.write(u'[java_properties]\n' + to_text(current_cfg_file.read(), errors='surrogate_or_strict'))
|
||||
config.seek(0, os.SEEK_SET)
|
||||
self.cp.readfp(config)
|
||||
return self.get_value(key, 'java_properties', dflt, is_regexp)
|
||||
|
||||
def read_ini(self, filename, key, section, dflt, is_regexp):
|
||||
self.cp.readfp(open(to_bytes(filename, errors='strict')))
|
||||
self.cp.readfp(open(to_bytes(filename, errors='surrogate_or_strict')))
|
||||
return self.get_value(key, section, dflt, is_regexp)
|
||||
|
||||
def get_value(self, key, section, dflt, is_regexp):
|
||||
|
||||
@@ -21,11 +21,11 @@ import shelve
|
||||
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.plugins.lookup import LookupBase
|
||||
from ansible.utils.unicode import to_bytes, to_unicode
|
||||
from ansible.module_utils._text import to_bytes, to_text
|
||||
|
||||
|
||||
class LookupModule(LookupBase):
|
||||
|
||||
|
||||
def read_shelve(self, shelve_filename, key):
|
||||
"""
|
||||
Read the value of "key" from a shelve file
|
||||
@@ -66,7 +66,7 @@ class LookupModule(LookupBase):
|
||||
if res is None:
|
||||
raise AnsibleError("Key %s not found in shelve file %s" % (key, file))
|
||||
# Convert the value read to string
|
||||
ret.append(to_unicode(res))
|
||||
ret.append(to_text(res))
|
||||
break
|
||||
else:
|
||||
raise AnsibleError("Could not locate shelve file in lookup: %s" % file)
|
||||
|
||||
@@ -21,7 +21,7 @@ import os
|
||||
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.plugins.lookup import LookupBase
|
||||
from ansible.utils.unicode import to_unicode, to_bytes
|
||||
from ansible.module_utils._text import to_bytes, to_text
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
@@ -43,8 +43,8 @@ class LookupModule(LookupBase):
|
||||
lookupfile = self.find_file_in_search_path(variables, 'templates', term)
|
||||
display.vvvv("File lookup using %s as file" % lookupfile)
|
||||
if lookupfile:
|
||||
with open(to_bytes(lookupfile, errors='strict'), 'r') as f:
|
||||
template_data = to_unicode(f.read())
|
||||
with open(to_bytes(lookupfile, errors='surrogate_or_strict'), 'rb') as f:
|
||||
template_data = to_text(f.read(), errors='surrogate_or_strict')
|
||||
|
||||
# set jinja2 internal search path for includes
|
||||
if 'ansible_search_path' in variables:
|
||||
|
||||
@@ -18,11 +18,11 @@ from __future__ import (absolute_import, division, print_function)
|
||||
__metaclass__ = type
|
||||
|
||||
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.plugins.lookup import LookupBase
|
||||
from ansible.module_utils.urls import open_url, ConnectionError, SSLValidationError
|
||||
from ansible.utils.unicode import to_unicode
|
||||
from ansible.compat.six.moves.urllib.error import HTTPError, URLError
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.module_utils._text import to_text
|
||||
from ansible.module_utils.urls import open_url, ConnectionError, SSLValidationError
|
||||
from ansible.plugins.lookup import LookupBase
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
@@ -52,5 +52,5 @@ class LookupModule(LookupBase):
|
||||
raise AnsibleError("Error connecting to %s: %s" % (term, str(e)))
|
||||
|
||||
for line in response.read().splitlines():
|
||||
ret.append(to_unicode(line))
|
||||
ret.append(to_text(line))
|
||||
return ret
|
||||
|
||||
@@ -22,9 +22,9 @@ import os
|
||||
import re
|
||||
import shlex
|
||||
|
||||
from ansible.compat.six import text_type
|
||||
from ansible.errors import AnsibleError
|
||||
from ansible.utils.unicode import to_bytes, to_unicode
|
||||
from ansible.module_utils._text import to_bytes, to_text
|
||||
|
||||
|
||||
_common_args = ['PowerShell', '-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Unrestricted']
|
||||
|
||||
@@ -34,6 +34,7 @@ _powershell_version = os.environ.get('POWERSHELL_VERSION', None)
|
||||
if _powershell_version:
|
||||
_common_args = ['PowerShell', '-Version', _powershell_version] + _common_args[1:]
|
||||
|
||||
|
||||
class ShellModule(object):
|
||||
|
||||
# Common shell filenames that this plugin handles
|
||||
@@ -60,7 +61,7 @@ class ShellModule(object):
|
||||
raise AnsibleError("PowerShell environment value for key '%s' exceeds 32767 characters in length" % key)
|
||||
# powershell single quoted literals need single-quote doubling as their only escaping
|
||||
value = value.replace("'", "''")
|
||||
return text_type(value)
|
||||
return to_text(value, errors='surrogate_or_strict')
|
||||
|
||||
def env_prefix(self, **kwargs):
|
||||
env = self.env.copy()
|
||||
@@ -164,7 +165,7 @@ class ShellModule(object):
|
||||
|
||||
def build_module_command(self, env_string, shebang, cmd, arg_path=None, rm_tmp=None):
|
||||
cmd_parts = shlex.split(to_bytes(cmd), posix=False)
|
||||
cmd_parts = map(to_unicode, cmd_parts)
|
||||
cmd_parts = map(to_text, cmd_parts)
|
||||
if shebang and shebang.lower() == '#!powershell':
|
||||
if not self._unquote(cmd_parts[0]).lower().endswith('.ps1'):
|
||||
cmd_parts[0] = '"%s.ps1"' % self._unquote(cmd_parts[0])
|
||||
@@ -219,7 +220,7 @@ class ShellModule(object):
|
||||
|
||||
def _unquote(self, value):
|
||||
'''Remove any matching quotes that wrap the given value.'''
|
||||
value = to_unicode(value or '')
|
||||
value = to_text(value or '')
|
||||
m = re.match(r'^\s*?\'(.*?)\'\s*?$', value)
|
||||
if m:
|
||||
return m.group(1)
|
||||
@@ -244,7 +245,7 @@ class ShellModule(object):
|
||||
|
||||
def _encode_script(self, script, as_list=False, strict_mode=True):
|
||||
'''Convert a PowerShell script to a single base64-encoded command.'''
|
||||
script = to_unicode(script)
|
||||
script = to_text(script)
|
||||
if strict_mode:
|
||||
script = u'Set-StrictMode -Version Latest\r\n%s' % script
|
||||
script = '\n'.join([x.strip() for x in script.splitlines() if x.strip()])
|
||||
|
||||
@@ -19,18 +19,11 @@
|
||||
from __future__ import (absolute_import, division, print_function)
|
||||
__metaclass__ = type
|
||||
|
||||
import json
|
||||
import time
|
||||
import zlib
|
||||
from collections import defaultdict
|
||||
|
||||
from jinja2.exceptions import UndefinedError
|
||||
|
||||
from ansible.compat.six.moves import queue as Queue
|
||||
from ansible.compat.six import iteritems, text_type, string_types
|
||||
from ansible import constants as C
|
||||
from ansible.compat.six import iteritems, string_types
|
||||
from ansible.errors import AnsibleError, AnsibleParserError, AnsibleUndefinedVariable
|
||||
from ansible.executor.play_iterator import PlayIterator
|
||||
from ansible.executor.task_result import TaskResult
|
||||
from ansible.inventory.host import Host
|
||||
from ansible.inventory.group import Group
|
||||
@@ -38,11 +31,10 @@ from ansible.playbook.helpers import load_list_of_blocks
|
||||
from ansible.playbook.included_file import IncludedFile
|
||||
from ansible.playbook.task_include import TaskInclude
|
||||
from ansible.playbook.role_include import IncludeRole
|
||||
from ansible.plugins import action_loader, connection_loader, filter_loader, lookup_loader, module_loader, test_loader
|
||||
from ansible.plugins import action_loader
|
||||
from ansible.template import Templar
|
||||
from ansible.utils.unicode import to_unicode
|
||||
from ansible.vars.unsafe_proxy import wrap_var
|
||||
from ansible.vars import combine_vars, strip_internal_keys
|
||||
from ansible.module_utils._text import to_text
|
||||
|
||||
|
||||
try:
|
||||
@@ -138,7 +130,7 @@ class StrategyBase:
|
||||
ret_results = []
|
||||
|
||||
def get_original_host(host_name):
|
||||
host_name = to_unicode(host_name)
|
||||
host_name = to_text(host_name)
|
||||
if host_name in self._inventory._hosts_cache:
|
||||
return self._inventory._hosts_cache[host_name]
|
||||
else:
|
||||
@@ -161,7 +153,7 @@ class StrategyBase:
|
||||
target_handler_name = templar.template(handler_task.get_name())
|
||||
if target_handler_name == handler_name:
|
||||
return handler_task
|
||||
except (UndefinedError, AnsibleUndefinedVariable) as e:
|
||||
except (UndefinedError, AnsibleUndefinedVariable):
|
||||
# We skip this handler due to the fact that it may be using
|
||||
# a variable in the name that was conditionally included via
|
||||
# set_fact or some other method, and we don't want to error
|
||||
@@ -182,7 +174,7 @@ class StrategyBase:
|
||||
target_handler_name = templar.template(target_handler.get_name())
|
||||
if target_handler_name == handler_name:
|
||||
return True
|
||||
except (UndefinedError, AnsibleUndefinedVariable) as e:
|
||||
except (UndefinedError, AnsibleUndefinedVariable):
|
||||
pass
|
||||
return parent_handler_match(target_handler._parent, handler_name)
|
||||
else:
|
||||
@@ -567,14 +559,13 @@ class StrategyBase:
|
||||
# mark all of the hosts including this file as failed, send callbacks,
|
||||
# and increment the stats for this host
|
||||
for host in included_file._hosts:
|
||||
tr = TaskResult(host=host, task=included_file._task, return_data=dict(failed=True, reason=to_unicode(e)))
|
||||
tr = TaskResult(host=host, task=included_file._task, return_data=dict(failed=True, reason=to_text(e)))
|
||||
iterator.mark_host_failed(host)
|
||||
self._tqm._failed_hosts[host.name] = True
|
||||
self._tqm._stats.increment('failures', host.name)
|
||||
self._tqm.send_callback('v2_runner_on_failed', tr)
|
||||
return []
|
||||
|
||||
|
||||
# finally, send the callback and return the list of blocks loaded
|
||||
self._tqm.send_callback('v2_playbook_on_include', included_file)
|
||||
display.debug("done processing included file")
|
||||
|
||||
@@ -26,7 +26,8 @@ from ansible.playbook.included_file import IncludedFile
|
||||
from ansible.plugins import action_loader
|
||||
from ansible.plugins.strategy import StrategyBase
|
||||
from ansible.template import Templar
|
||||
from ansible.utils.unicode import to_unicode
|
||||
from ansible.module_utils._text import to_text
|
||||
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
@@ -66,8 +67,7 @@ class StrategyModule(StrategyBase):
|
||||
break
|
||||
|
||||
work_to_do = False # assume we have no more work to do
|
||||
starting_host = last_host # save current position so we know when we've
|
||||
# looped back around and need to break
|
||||
starting_host = last_host # save current position so we know when we've looped back around and need to break
|
||||
|
||||
# try and find an unblocked host with a task to run
|
||||
host_results = []
|
||||
@@ -109,7 +109,7 @@ class StrategyModule(StrategyBase):
|
||||
display.debug("done getting variables")
|
||||
|
||||
try:
|
||||
task.name = to_unicode(templar.template(task.name, fail_on_undefined=False), nonstring='empty')
|
||||
task.name = to_text(templar.template(task.name, fail_on_undefined=False), nonstring='empty')
|
||||
display.debug("done templating")
|
||||
except:
|
||||
# just ignore any errors during task name templating,
|
||||
@@ -120,10 +120,10 @@ class StrategyModule(StrategyBase):
|
||||
run_once = templar.template(task.run_once) or action and getattr(action, 'BYPASS_HOST_LOOP', False)
|
||||
if run_once:
|
||||
if action and getattr(action, 'BYPASS_HOST_LOOP', False):
|
||||
raise AnsibleError("The '%s' module bypasses the host loop, which is currently not supported in the free strategy " \
|
||||
raise AnsibleError("The '%s' module bypasses the host loop, which is currently not supported in the free strategy "
|
||||
"and would instead execute for every host in the inventory list." % task.action, obj=task._ds)
|
||||
else:
|
||||
display.warning("Using run_once with the free strategy is not currently supported. This task will still be " \
|
||||
display.warning("Using run_once with the free strategy is not currently supported. This task will still be "
|
||||
"executed for every host in the inventory list.")
|
||||
|
||||
# check to see if this task should be skipped, due to it being a member of a
|
||||
@@ -143,7 +143,8 @@ class StrategyModule(StrategyBase):
|
||||
# handle step if needed, skip meta actions as they are used internally
|
||||
if not self._step or self._take_step(task, host_name):
|
||||
if task.any_errors_fatal:
|
||||
display.warning("Using any_errors_fatal with the free strategy is not supported, as tasks are executed independently on each host")
|
||||
display.warning("Using any_errors_fatal with the free strategy is not supported,"
|
||||
" as tasks are executed independently on each host")
|
||||
self._tqm.send_callback('v2_playbook_on_task_start', task, is_conditional=False)
|
||||
self._queue_task(host, task, task_vars, play_context)
|
||||
del task_vars
|
||||
|
||||
@@ -29,7 +29,8 @@ from ansible.playbook.task import Task
|
||||
from ansible.plugins import action_loader
|
||||
from ansible.plugins.strategy import StrategyBase
|
||||
from ansible.template import Templar
|
||||
from ansible.utils.unicode import to_unicode
|
||||
from ansible.module_utils._text import to_text
|
||||
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
@@ -243,7 +244,7 @@ class StrategyModule(StrategyBase):
|
||||
saved_name = task.name
|
||||
display.debug("done copying, going to template now")
|
||||
try:
|
||||
task.name = to_unicode(templar.template(task.name, fail_on_undefined=False), nonstring='empty')
|
||||
task.name = to_text(templar.template(task.name, fail_on_undefined=False), nonstring='empty')
|
||||
display.debug("done templating")
|
||||
except:
|
||||
# just ignore any errors during task name templating,
|
||||
@@ -368,7 +369,7 @@ class StrategyModule(StrategyBase):
|
||||
for host in included_file._hosts:
|
||||
self._tqm._failed_hosts[host.name] = True
|
||||
iterator.mark_host_failed(host)
|
||||
display.error(to_unicode(e), wrap_text=False)
|
||||
display.error(to_text(e), wrap_text=False)
|
||||
include_failure = True
|
||||
continue
|
||||
|
||||
|
||||
Reference in New Issue
Block a user