move force_close

This commit is contained in:
cmcmarrow 2020-09-23 15:38:05 -06:00 committed by Daniel Wozniak
parent 114909cc3a
commit 5c94ad9dea
2 changed files with 168 additions and 168 deletions

View file

@ -146,179 +146,172 @@ class BaseCaller:
"""
Call the module
"""
ret = {}
fun = self.opts["fun"]
ret["jid"] = salt.utils.jid.gen_jid(self.opts)
proc_fn = os.path.join(
salt.minion.get_proc_dir(self.opts["cachedir"]), ret["jid"]
)
if fun not in self.minion.functions:
docs = self.minion.functions["sys.doc"]("{}*".format(fun))
if docs:
docs[fun] = self.minion.functions.missing_fun_string(fun)
ret["out"] = "nested"
ret["return"] = docs
return ret
sys.stderr.write(self.minion.functions.missing_fun_string(fun))
mod_name = fun.split(".")[0]
if mod_name in self.minion.function_errors:
sys.stderr.write(
" Possible reasons: {}\n".format(
self.minion.function_errors[mod_name]
)
)
else:
sys.stderr.write("\n")
sys.exit(-1)
metadata = self.opts.get("metadata")
if metadata is not None:
metadata = salt.utils.args.yamlify_arg(metadata)
try:
ret = {}
fun = self.opts["fun"]
ret["jid"] = salt.utils.jid.gen_jid(self.opts)
proc_fn = os.path.join(
salt.minion.get_proc_dir(self.opts["cachedir"]), ret["jid"]
)
if fun not in self.minion.functions:
docs = self.minion.functions["sys.doc"]("{}*".format(fun))
if docs:
docs[fun] = self.minion.functions.missing_fun_string(fun)
ret["out"] = "nested"
ret["return"] = docs
return ret
sys.stderr.write(self.minion.functions.missing_fun_string(fun))
mod_name = fun.split(".")[0]
if mod_name in self.minion.function_errors:
sys.stderr.write(
" Possible reasons: {}\n".format(
self.minion.function_errors[mod_name]
)
)
else:
sys.stderr.write("\n")
sys.exit(-1)
metadata = self.opts.get("metadata")
sdata = {
"fun": fun,
"pid": os.getpid(),
"jid": ret["jid"],
"tgt": "salt-call",
}
if metadata is not None:
metadata = salt.utils.args.yamlify_arg(metadata)
sdata["metadata"] = metadata
args, kwargs = salt.minion.load_args_and_kwargs(
self.minion.functions[fun],
salt.utils.args.parse_input(
self.opts["arg"], no_parse=self.opts.get("no_parse", [])
),
data=sdata,
)
try:
sdata = {
"fun": fun,
"pid": os.getpid(),
"jid": ret["jid"],
"tgt": "salt-call",
}
if metadata is not None:
sdata["metadata"] = metadata
args, kwargs = salt.minion.load_args_and_kwargs(
self.minion.functions[fun],
salt.utils.args.parse_input(
self.opts["arg"], no_parse=self.opts.get("no_parse", [])
),
data=sdata,
with salt.utils.files.fopen(proc_fn, "w+b") as fp_:
fp_.write(self.serial.dumps(sdata))
except NameError:
# Don't require msgpack with local
pass
except OSError:
sys.stderr.write(
"Cannot write to process directory. "
"Do you have permissions to "
"write to {} ?\n".format(proc_fn)
)
try:
with salt.utils.files.fopen(proc_fn, "w+b") as fp_:
fp_.write(self.serial.dumps(sdata))
except NameError:
# Don't require msgpack with local
pass
except OSError:
sys.stderr.write(
"Cannot write to process directory. "
"Do you have permissions to "
"write to {} ?\n".format(proc_fn)
)
func = self.minion.functions[fun]
data = {"arg": args, "fun": fun}
data.update(kwargs)
executors = getattr(
self.minion, "module_executors", []
) or salt.utils.args.yamlify_arg(
self.opts.get("module_executors", "[direct_call]")
func = self.minion.functions[fun]
data = {"arg": args, "fun": fun}
data.update(kwargs)
executors = getattr(
self.minion, "module_executors", []
) or salt.utils.args.yamlify_arg(
self.opts.get("module_executors", "[direct_call]")
)
if self.opts.get("executor_opts", None):
data["executor_opts"] = salt.utils.args.yamlify_arg(
self.opts["executor_opts"]
)
if self.opts.get("executor_opts", None):
data["executor_opts"] = salt.utils.args.yamlify_arg(
self.opts["executor_opts"]
)
if isinstance(executors, str):
executors = [executors]
try:
for name in executors:
fname = "{}.execute".format(name)
if fname not in self.minion.executors:
raise SaltInvocationError(
"Executor '{}' is not available".format(name)
)
ret["return"] = self.minion.executors[fname](
self.opts, data, func, args, kwargs
if isinstance(executors, str):
executors = [executors]
try:
for name in executors:
fname = "{}.execute".format(name)
if fname not in self.minion.executors:
raise SaltInvocationError(
"Executor '{}' is not available".format(name)
)
if ret["return"] is not None:
break
except TypeError as exc:
sys.stderr.write(
"\nPassed invalid arguments: {}.\n\nUsage:\n".format(exc)
ret["return"] = self.minion.executors[fname](
self.opts, data, func, args, kwargs
)
salt.utils.stringutils.print_cli(func.__doc__)
active_level = LOG_LEVELS.get(
self.opts["log_level"].lower(), logging.ERROR
)
if active_level <= logging.DEBUG:
trace = traceback.format_exc()
sys.stderr.write(trace)
sys.exit(salt.defaults.exitcodes.EX_GENERIC)
try:
retcode = sys.modules[func.__module__].__context__.get("retcode", 0)
except AttributeError:
retcode = salt.defaults.exitcodes.EX_GENERIC
if retcode == 0:
# No nonzero retcode in __context__ dunder. Check if return
# is a dictionary with a "result" or "success" key.
try:
func_result = all(
ret["return"].get(x, True) for x in ("result", "success")
)
except Exception: # pylint: disable=broad-except
# return data is not a dict
func_result = True
if not func_result:
retcode = salt.defaults.exitcodes.EX_GENERIC
ret["retcode"] = retcode
except (CommandExecutionError) as exc:
msg = "Error running '{0}': {1}\n"
if ret["return"] is not None:
break
except TypeError as exc:
sys.stderr.write(
"\nPassed invalid arguments: {}.\n\nUsage:\n".format(exc)
)
salt.utils.stringutils.print_cli(func.__doc__)
active_level = LOG_LEVELS.get(
self.opts["log_level"].lower(), logging.ERROR
)
if active_level <= logging.DEBUG:
sys.stderr.write(traceback.format_exc())
sys.stderr.write(msg.format(fun, exc))
sys.exit(salt.defaults.exitcodes.EX_GENERIC)
except CommandNotFoundError as exc:
msg = "Command required for '{0}' not found: {1}\n"
sys.stderr.write(msg.format(fun, exc))
trace = traceback.format_exc()
sys.stderr.write(trace)
sys.exit(salt.defaults.exitcodes.EX_GENERIC)
try:
os.remove(proc_fn)
except OSError:
retcode = sys.modules[func.__module__].__context__.get("retcode", 0)
except AttributeError:
retcode = salt.defaults.exitcodes.EX_GENERIC
if retcode == 0:
# No nonzero retcode in __context__ dunder. Check if return
# is a dictionary with a "result" or "success" key.
try:
func_result = all(
ret["return"].get(x, True) for x in ("result", "success")
)
except Exception: # pylint: disable=broad-except
# return data is not a dict
func_result = True
if not func_result:
retcode = salt.defaults.exitcodes.EX_GENERIC
ret["retcode"] = retcode
except (CommandExecutionError) as exc:
msg = "Error running '{0}': {1}\n"
active_level = LOG_LEVELS.get(self.opts["log_level"].lower(), logging.ERROR)
if active_level <= logging.DEBUG:
sys.stderr.write(traceback.format_exc())
sys.stderr.write(msg.format(fun, exc))
sys.exit(salt.defaults.exitcodes.EX_GENERIC)
except CommandNotFoundError as exc:
msg = "Command required for '{0}' not found: {1}\n"
sys.stderr.write(msg.format(fun, exc))
sys.exit(salt.defaults.exitcodes.EX_GENERIC)
try:
os.remove(proc_fn)
except OSError:
pass
if hasattr(self.minion.functions[fun], "__outputter__"):
oput = self.minion.functions[fun].__outputter__
if isinstance(oput, str):
ret["out"] = oput
is_local = (
self.opts["local"]
or self.opts.get("file_client", False) == "local"
or self.opts.get("master_type") == "disable"
)
returners = self.opts.get("return", "").split(",")
if (not is_local) or returners:
ret["id"] = self.opts["id"]
ret["fun"] = fun
ret["fun_args"] = self.opts["arg"]
if metadata is not None:
ret["metadata"] = metadata
for returner in returners:
if not returner: # if we got an empty returner somehow, skip
continue
try:
ret["success"] = True
self.minion.returners["{}.returner".format(returner)](ret)
except Exception: # pylint: disable=broad-except
pass
if hasattr(self.minion.functions[fun], "__outputter__"):
oput = self.minion.functions[fun].__outputter__
if isinstance(oput, str):
ret["out"] = oput
is_local = (
self.opts["local"]
or self.opts.get("file_client", False) == "local"
or self.opts.get("master_type") == "disable"
)
returners = self.opts.get("return", "").split(",")
if (not is_local) or returners:
ret["id"] = self.opts["id"]
ret["fun"] = fun
ret["fun_args"] = self.opts["arg"]
if metadata is not None:
ret["metadata"] = metadata
for returner in returners:
if not returner: # if we got an empty returner somehow, skip
continue
try:
ret["success"] = True
self.minion.returners["{}.returner".format(returner)](ret)
except Exception: # pylint: disable=broad-except
pass
# return the job infos back up to the respective minion's master
if not is_local:
try:
mret = ret.copy()
mret["jid"] = "req"
self.return_pub(mret)
except Exception: # pylint: disable=broad-except
pass
elif self.opts["cache_jobs"]:
# Local job cache has been enabled
salt.utils.minion.cache_jobs(self.opts, ret["jid"], ret)
# return the job infos back up to the respective minion's master
if not is_local:
try:
mret = ret.copy()
mret["jid"] = "req"
self.return_pub(mret)
except Exception: # pylint: disable=broad-except
pass
elif self.opts["cache_jobs"]:
# Local job cache has been enabled
salt.utils.minion.cache_jobs(self.opts, ret["jid"], ret)
return ret
finally:
import salt.transport.zeromq
salt.transport.zeromq.AsyncZeroMQReqChannel.force_close_all_instances()
return ret
class ZeroMQCaller(BaseCaller):

View file

@ -1,9 +1,7 @@
# -*- coding: utf-8 -*-
"""
This module contains the function calls to execute command line scripts
"""
from __future__ import absolute_import, print_function, unicode_literals
import functools
import logging
@ -416,7 +414,7 @@ def salt_key():
_install_signal_handlers(client)
client.run()
except Exception as err: # pylint: disable=broad-except
sys.stderr.write("Error: {0}\n".format(err))
sys.stderr.write("Error: {}\n".format(err))
def salt_cp():
@ -438,11 +436,20 @@ def salt_call():
"""
import salt.cli.call
if "" in sys.path:
sys.path.remove("")
client = salt.cli.call.SaltCall()
_install_signal_handlers(client)
client.run()
try:
from salt.transport import zeromq
except ImportError:
zeromq = None
try:
if "" in sys.path:
sys.path.remove("")
client = salt.cli.call.SaltCall()
_install_signal_handlers(client)
client.run()
finally:
if zeromq is not None:
zeromq.AsyncZeroMQReqChannel.force_close_all_instances()
def salt_run():
@ -572,7 +579,7 @@ def salt_unity():
if len(sys.argv) < 2:
msg = "Must pass in a salt command, available commands are:"
for cmd in avail:
msg += "\n{0}".format(cmd)
msg += "\n{}".format(cmd)
print(msg)
sys.exit(1)
cmd = sys.argv[1]
@ -581,7 +588,7 @@ def salt_unity():
sys.argv[0] = "salt"
s_fun = salt_main
else:
sys.argv[0] = "salt-{0}".format(cmd)
sys.argv[0] = "salt-{}".format(cmd)
sys.argv.pop(1)
s_fun = getattr(sys.modules[__name__], "salt_{0}".format(cmd))
s_fun = getattr(sys.modules[__name__], "salt_{}".format(cmd))
s_fun()