mirror of
https://github.com/saltstack/salt.git
synced 2025-04-15 09:10:20 +00:00
119 lines
3 KiB
Python
Executable file
119 lines
3 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
# see issue: https://gitlab.com/saltstack/open/salt-pkg/-/issues/19
|
|
import contextlib
|
|
import multiprocessing
|
|
import os
|
|
import pathlib
|
|
import sys
|
|
|
|
import _pyio
|
|
import tiamatpip.cli
|
|
import tiamatpip.configure
|
|
import tiamatpip.utils
|
|
|
|
import salt.scripts
|
|
import salt.utils.platform
|
|
|
|
AVAIL = (
|
|
"minion",
|
|
"master",
|
|
"call",
|
|
"api",
|
|
"cloud",
|
|
"cp",
|
|
"extend",
|
|
"key",
|
|
"proxy",
|
|
"pip",
|
|
"run",
|
|
"shell",
|
|
"spm",
|
|
"ssh",
|
|
"support",
|
|
"syndic",
|
|
"python",
|
|
)
|
|
|
|
|
|
if "TIAMAT_PIP_PYPATH" in os.environ:
|
|
PIP_PATH = pathlib.Path(os.environ["TIAMAT_PIP_PYPATH"]).resolve()
|
|
elif not sys.platform.startswith("win"):
|
|
PIP_PATH = pathlib.Path(f"{os.sep}opt", "saltstack", "salt", "pypath")
|
|
else:
|
|
PIP_PATH = pathlib.Path(os.getenv("LocalAppData"), "salt", "pypath")
|
|
with contextlib.suppress(PermissionError):
|
|
PIP_PATH.mkdir(mode=0o755, parents=True, exist_ok=True)
|
|
tiamatpip.configure.set_user_base_path(PIP_PATH)
|
|
|
|
|
|
def py_shell():
|
|
if not sys.platform.startswith("win"):
|
|
# optional, will allow Up/Down/History in the console
|
|
import readline
|
|
import code
|
|
|
|
variables = globals().copy()
|
|
variables.update(locals())
|
|
shell = code.InteractiveConsole(variables)
|
|
shell.interact()
|
|
|
|
|
|
def python_runtime():
|
|
import traceback
|
|
|
|
# extract the absolute script path to alter sys.path and specific dunder variables
|
|
script = pathlib.Path(sys.argv[2]).expanduser().resolve()
|
|
sys.path.insert(0, str(script.parent))
|
|
|
|
# update passed args so they don't start with "<binary> python"
|
|
sys.argv[:] = sys.argv[2:]
|
|
exec_locals = {"__name__": "__main__", "__file__": str(script), "__doc__": None}
|
|
with open(script, encoding="utf-8") as rfh:
|
|
try:
|
|
exec(rfh.read(), exec_locals)
|
|
except Exception:
|
|
traceback.print_exc()
|
|
sys.exit(1)
|
|
|
|
|
|
def redirect(argv):
|
|
"""
|
|
Change the args and redirect to another salt script
|
|
"""
|
|
if len(argv) < 2:
|
|
msg = "Must pass in a salt command, available commands are:"
|
|
for cmd in AVAIL:
|
|
msg += f"\n{cmd}"
|
|
print(msg, file=sys.stderr, flush=True)
|
|
sys.exit(1)
|
|
cmd = sys.argv[1]
|
|
if cmd == "shell":
|
|
py_shell()
|
|
return
|
|
if cmd == "python":
|
|
if len(argv) < 3:
|
|
msg = "Must pass script location to this command"
|
|
print(msg, file=sys.stderr, flush=True)
|
|
sys.exit(1)
|
|
|
|
python_runtime()
|
|
return
|
|
if tiamatpip.cli.should_redirect_argv(argv):
|
|
tiamatpip.cli.process_pip_argv(argv)
|
|
return
|
|
if cmd not in AVAIL:
|
|
# Fall back to the salt command
|
|
args = ["salt"]
|
|
s_fun = salt.scripts.salt_main
|
|
else:
|
|
args = [f"salt-{cmd}"]
|
|
sys.argv.pop(1)
|
|
s_fun = getattr(salt.scripts, f"salt_{cmd}")
|
|
args.extend(argv[1:])
|
|
with tiamatpip.utils.patched_sys_argv(args):
|
|
s_fun()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
multiprocessing.freeze_support()
|
|
redirect(sys.argv)
|