mirror of
https://github.com/ansible-collections/community.general.git
synced 2026-05-08 06:12:51 +00:00
Revert templating enhancements from 73dbab70 e6c28658 d409352c 9858b1f2 4587528b 9b1fe455 214b0b05 8d3db803 7f9504d1 5031104c 35cb9dc2 2bd8cb57 1e85c754
This commit is contained in:
@@ -40,7 +40,6 @@ from ansible.utils import template
|
||||
from ansible.utils import check_conditional
|
||||
from ansible import errors
|
||||
from ansible import module_common
|
||||
from ansible.module_common import ModuleReplacer
|
||||
import poller
|
||||
import connection
|
||||
from return_data import ReturnData
|
||||
@@ -52,7 +51,6 @@ try:
|
||||
except ImportError:
|
||||
HAS_ATFORK=False
|
||||
|
||||
module_replacer = ModuleReplacer(strip_comments=False)
|
||||
multiprocessing_runner = None
|
||||
|
||||
OUTPUT_LOCKFILE = tempfile.TemporaryFile()
|
||||
@@ -73,6 +71,11 @@ def _executor_hook(job_queue, result_queue, new_stdin):
|
||||
host = job_queue.get(block=False)
|
||||
return_data = multiprocessing_runner._executor(host, new_stdin)
|
||||
result_queue.put(return_data)
|
||||
|
||||
if 'LEGACY_TEMPLATE_WARNING' in return_data.flags:
|
||||
# pass data back up across the multiprocessing fork boundary
|
||||
template.Flags.LEGACY_TEMPLATE_WARNING = True
|
||||
|
||||
except Queue.Empty:
|
||||
pass
|
||||
except:
|
||||
@@ -368,6 +371,15 @@ class Runner(object):
|
||||
def _executor(self, host, new_stdin):
|
||||
''' handler for multiprocessing library '''
|
||||
|
||||
def get_flags():
|
||||
# flags are a way of passing arbitrary event information
|
||||
# back up the chain, since multiprocessing forks and doesn't
|
||||
# allow state exchange
|
||||
flags = []
|
||||
if template.Flags.LEGACY_TEMPLATE_WARNING:
|
||||
flags.append('LEGACY_TEMPLATE_WARNING')
|
||||
return flags
|
||||
|
||||
try:
|
||||
if not new_stdin:
|
||||
self._new_stdin = os.fdopen(os.dup(sys.stdin.fileno()))
|
||||
@@ -377,6 +389,7 @@ class Runner(object):
|
||||
exec_rc = self._executor_internal(host, new_stdin)
|
||||
if type(exec_rc) != ReturnData:
|
||||
raise Exception("unexpected return type: %s" % type(exec_rc))
|
||||
exec_rc.flags = get_flags()
|
||||
# redundant, right?
|
||||
if not exec_rc.comm_ok:
|
||||
self.callbacks.on_unreachable(host, exec_rc.result)
|
||||
@@ -384,11 +397,11 @@ class Runner(object):
|
||||
except errors.AnsibleError, ae:
|
||||
msg = str(ae)
|
||||
self.callbacks.on_unreachable(host, msg)
|
||||
return ReturnData(host=host, comm_ok=False, result=dict(failed=True, msg=msg))
|
||||
return ReturnData(host=host, comm_ok=False, result=dict(failed=True, msg=msg), flags=get_flags())
|
||||
except Exception:
|
||||
msg = traceback.format_exc()
|
||||
self.callbacks.on_unreachable(host, msg)
|
||||
return ReturnData(host=host, comm_ok=False, result=dict(failed=True, msg=msg))
|
||||
return ReturnData(host=host, comm_ok=False, result=dict(failed=True, msg=msg), flags=get_flags())
|
||||
|
||||
# *****************************************************
|
||||
|
||||
@@ -825,19 +838,60 @@ class Runner(object):
|
||||
def _copy_module(self, conn, tmp, module_name, module_args, inject, complex_args=None):
|
||||
''' transfer a module over SFTP, does not run it '''
|
||||
|
||||
# FIXME if complex args is none, set to {}
|
||||
|
||||
if module_name.startswith("/"):
|
||||
raise errors.AnsibleFileNotFound("%s is not a module" % module_name)
|
||||
|
||||
# Search module path(s) for named module.
|
||||
in_path = utils.plugins.module_finder.find_plugin(module_name)
|
||||
if in_path is None:
|
||||
raise errors.AnsibleFileNotFound("module %s not found in %s" % (module_name, utils.plugins.module_finder.print_paths()))
|
||||
|
||||
out_path = os.path.join(tmp, module_name)
|
||||
|
||||
# insert shared code and arguments into the module
|
||||
(module_data, module_style, shebang) = module_replacer.modify_module(
|
||||
in_path, complex_args, module_args, inject
|
||||
)
|
||||
module_data = ""
|
||||
module_style = 'old'
|
||||
|
||||
with open(in_path) as f:
|
||||
module_data = f.read()
|
||||
if module_common.REPLACER in module_data:
|
||||
module_style = 'new'
|
||||
if 'WANT_JSON' in module_data:
|
||||
module_style = 'non_native_want_json'
|
||||
|
||||
complex_args_json = utils.jsonify(complex_args)
|
||||
# We force conversion of module_args to str because module_common calls shlex.split,
|
||||
# a standard library function that incorrectly handles Unicode input before Python 2.7.3.
|
||||
encoded_args = repr(module_args.encode('utf-8'))
|
||||
encoded_lang = repr(C.DEFAULT_MODULE_LANG)
|
||||
encoded_complex = repr(complex_args_json)
|
||||
|
||||
module_data = module_data.replace(module_common.REPLACER, module_common.MODULE_COMMON)
|
||||
module_data = module_data.replace(module_common.REPLACER_ARGS, encoded_args)
|
||||
module_data = module_data.replace(module_common.REPLACER_LANG, encoded_lang)
|
||||
module_data = module_data.replace(module_common.REPLACER_COMPLEX, encoded_complex)
|
||||
|
||||
if module_style == 'new':
|
||||
facility = C.DEFAULT_SYSLOG_FACILITY
|
||||
if 'ansible_syslog_facility' in inject:
|
||||
facility = inject['ansible_syslog_facility']
|
||||
module_data = module_data.replace('syslog.LOG_USER', "syslog.%s" % facility)
|
||||
|
||||
lines = module_data.split("\n")
|
||||
shebang = None
|
||||
if lines[0].startswith("#!"):
|
||||
shebang = lines[0].strip()
|
||||
args = shlex.split(str(shebang[2:]))
|
||||
interpreter = args[0]
|
||||
interpreter_config = 'ansible_%s_interpreter' % os.path.basename(interpreter)
|
||||
|
||||
if interpreter_config in inject:
|
||||
lines[0] = shebang = "#!%s %s" % (inject[interpreter_config], " ".join(args[1:]))
|
||||
module_data = "\n".join(lines)
|
||||
|
||||
# ship the module
|
||||
self._transfer_str(conn, tmp, module_name, module_data)
|
||||
|
||||
return (out_path, module_style, shebang)
|
||||
|
||||
# *****************************************************
|
||||
|
||||
Reference in New Issue
Block a user