mirror of
https://github.com/saltstack/salt.git
synced 2025-04-17 10:10:20 +00:00
move force_close
This commit is contained in:
parent
114909cc3a
commit
5c94ad9dea
2 changed files with 168 additions and 168 deletions
|
@ -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):
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Add table
Reference in a new issue