Fix types when evaluating interpreter (#36541)
* Fix types when evaluating interpreter. Fixes #36536 * Rename variables that contain bytes to b_* * Get rid of to_text() and to_bytes() calls that do nothing (because the data is already the proper type)
This commit is contained in:
parent
ef4f8851dc
commit
a4df4d33ac
1 changed files with 20 additions and 15 deletions
|
@ -35,7 +35,7 @@ from io import BytesIO
|
||||||
from ansible.release import __version__, __author__
|
from ansible.release import __version__, __author__
|
||||||
from ansible import constants as C
|
from ansible import constants as C
|
||||||
from ansible.errors import AnsibleError
|
from ansible.errors import AnsibleError
|
||||||
from ansible.module_utils._text import to_bytes, to_text
|
from ansible.module_utils._text import to_bytes, to_text, to_native
|
||||||
from ansible.plugins.loader import module_utils_loader, ps_module_utils_loader
|
from ansible.plugins.loader import module_utils_loader, ps_module_utils_loader
|
||||||
from ansible.plugins.shell.powershell import async_watchdog, async_wrapper, become_wrapper, leaf_exec, exec_wrapper
|
from ansible.plugins.shell.powershell import async_watchdog, async_wrapper, become_wrapper, leaf_exec, exec_wrapper
|
||||||
# Must import strategy and use write_locks from there
|
# Must import strategy and use write_locks from there
|
||||||
|
@ -60,6 +60,7 @@ REPLACER_SELINUX = b"<<SELINUX_SPECIAL_FILESYSTEMS>>"
|
||||||
# We could end up writing out parameters with unicode characters so we need to
|
# We could end up writing out parameters with unicode characters so we need to
|
||||||
# specify an encoding for the python source file
|
# specify an encoding for the python source file
|
||||||
ENCODING_STRING = u'# -*- coding: utf-8 -*-'
|
ENCODING_STRING = u'# -*- coding: utf-8 -*-'
|
||||||
|
b_ENCODING_STRING = b'# -*- coding: utf-8 -*-'
|
||||||
|
|
||||||
# module_common is relative to module_utils, so fix the path
|
# module_common is relative to module_utils, so fix the path
|
||||||
_MODULE_UTILS_PATH = os.path.join(os.path.dirname(__file__), '..', 'module_utils')
|
_MODULE_UTILS_PATH = os.path.join(os.path.dirname(__file__), '..', 'module_utils')
|
||||||
|
@ -911,25 +912,29 @@ def modify_module(module_name, module_path, module_args, task_vars=None, templar
|
||||||
if module_style == 'binary':
|
if module_style == 'binary':
|
||||||
return (b_module_data, module_style, to_text(shebang, nonstring='passthru'))
|
return (b_module_data, module_style, to_text(shebang, nonstring='passthru'))
|
||||||
elif shebang is None:
|
elif shebang is None:
|
||||||
lines = b_module_data.split(b"\n", 1)
|
b_lines = b_module_data.split(b"\n", 1)
|
||||||
if lines[0].startswith(b"#!"):
|
if b_lines[0].startswith(b"#!"):
|
||||||
shebang = lines[0].strip()
|
b_shebang = b_lines[0].strip()
|
||||||
args = shlex.split(str(shebang[2:]))
|
# shlex.split on python-2.6 needs bytes. On python-3.x it needs text
|
||||||
|
args = shlex.split(to_native(b_shebang[2:], errors='surrogate_or_strict'))
|
||||||
|
|
||||||
|
# _get_shebang() takes text strings
|
||||||
|
args = [to_text(a, errors='surrogate_or_strict') for a in args]
|
||||||
interpreter = args[0]
|
interpreter = args[0]
|
||||||
interpreter = to_bytes(interpreter)
|
b_new_shebang = to_bytes(_get_shebang(interpreter, task_vars, templar, args[1:])[0],
|
||||||
|
errors='surrogate_or_strict', nonstring='passthru')
|
||||||
|
|
||||||
new_shebang = to_bytes(_get_shebang(interpreter, task_vars, templar, args[1:])[0], errors='surrogate_or_strict', nonstring='passthru')
|
if b_new_shebang:
|
||||||
if new_shebang:
|
b_lines[0] = b_shebang = b_new_shebang
|
||||||
lines[0] = shebang = new_shebang
|
|
||||||
|
|
||||||
if os.path.basename(interpreter).startswith(b'python'):
|
if os.path.basename(interpreter).startswith(u'python'):
|
||||||
lines.insert(1, to_bytes(ENCODING_STRING))
|
b_lines.insert(1, b_ENCODING_STRING)
|
||||||
|
|
||||||
|
shebang = to_text(b_shebang, nonstring='passthru', errors='surrogate_or_strict')
|
||||||
else:
|
else:
|
||||||
# No shebang, assume a binary module?
|
# No shebang, assume a binary module?
|
||||||
pass
|
pass
|
||||||
|
|
||||||
b_module_data = b"\n".join(lines)
|
b_module_data = b"\n".join(b_lines)
|
||||||
else:
|
|
||||||
shebang = to_bytes(shebang, errors='surrogate_or_strict')
|
|
||||||
|
|
||||||
return (b_module_data, module_style, to_text(shebang, nonstring='passthru'))
|
return (b_module_data, module_style, shebang)
|
||||||
|
|
Loading…
Reference in a new issue