Source code for inet_nm.cli_exec
import argparse
import signal
import sys
import inet_nm.check as chk
import inet_nm.config as cfg
import inet_nm.runner_apps as apps
import inet_nm.runner_helper as rh
[docs]
def main():
"""CLI entrypoint for executing a command on each node."""
parser = argparse.ArgumentParser(
description="Execute command for each note environment."
)
parser.add_argument(
"cmd",
type=str,
help="bash command to execute, ' must be escaped and generally pay"
" attention to escape characters.",
)
parser.add_argument(
"-F", "--force", action="store_true", help="Force execution of command."
)
parser.add_argument(
"-t",
"--timeout",
type=float,
default=None,
help="Wait until node available in seconds.",
)
parser.add_argument(
"--seq",
action="store_true",
help="Run commands sequentially instead of concurrently",
)
parser.add_argument(
"-r",
"--output-filter",
type=str,
default=None,
help="Filter all lines with regex.",
)
parser.add_argument(
"-j",
"--json-filter",
action="store_true",
help="Capture only json output.",
)
cfg.config_arg(parser)
chk.check_args(parser)
args = parser.parse_args()
kwargs = vars(args)
timeout = kwargs.pop("timeout")
cmd = kwargs.pop("cmd")
seq = kwargs.pop("seq")
force = kwargs.pop("force")
output_filter = kwargs.pop("output_filter")
json_filter = kwargs.pop("json_filter")
if not json_filter:
cfg.check_commit_hash(args.config)
nodes = rh.sanity_check("/bin/bash", **kwargs)
extra_env = rh.node_env_vars(args.config)
# Somehow allows cleanup to happen...
signal.signal(signal.SIGHUP, rh.do_nothing)
try:
with apps.NmShellRunner(
nodes, default_timeout=timeout, seq=seq, extra_env=extra_env, force=force
) as runner:
runner.cmd = cmd
runner.output_filter = output_filter
runner.json_filter = json_filter
runner.run()
except KeyboardInterrupt:
print()
print("User aborted!")
sys.exit(1)
sys.exit(0)
if __name__ == "__main__":
main()