clan-cli: split out ssh subcommand, add more tests

This commit is contained in:
lassulus
2023-07-24 21:11:49 +02:00
parent c8e59471a0
commit a3bcb93f2f
3 changed files with 140 additions and 75 deletions

View File

@@ -1,10 +1,8 @@
# !/usr/bin/env python3
import argparse
import json
import subprocess
import sys
from . import admin
from . import admin, ssh
has_argcomplete = True
try:
@@ -13,64 +11,6 @@ except ImportError: # pragma: no cover
has_argcomplete = False
def ssh(args: argparse.Namespace) -> None:
if args.json:
ssh_data = json.load(args.json)
subprocess.run(
[
"nix",
"shell",
"nixpkgs#sshpass",
"-c",
"torify",
"sshpass",
"-p",
ssh_data.get("password"),
"ssh",
"-o",
"UserKnownHostsFile=/dev/null",
"-o",
"StrictHostKeyChecking=no",
f'root@{ssh_data["address"]}',
]
+ args.ssh_args
)
elif args.png:
png_text = subprocess.Popen(
[
"nix",
"shell",
"nixpkgs#zbar",
"-c",
"zbarimg",
"--quiet",
"--raw",
args.png,
],
stdout=subprocess.PIPE,
).stdout.read()
ssh_data = json.loads(png_text)
subprocess.run(
[
"nix",
"shell",
"nixpkgs#sshpass",
"-c",
"torify",
"sshpass",
"-p",
ssh_data.get("password"),
"ssh",
"-o",
"UserKnownHostsFile=/dev/null",
"-o",
"StrictHostKeyChecking=no",
f'root@{ssh_data["address"]}',
]
+ args.ssh_args
)
# this will be the entrypoint under /bin/clan (see pyproject.toml config)
def main() -> None:
parser = argparse.ArgumentParser(description="cLAN tool")
@@ -80,19 +20,7 @@ def main() -> None:
admin.register_parser(parser_admin)
parser_ssh = subparsers.add_parser("ssh", help="ssh to a remote machine")
parser_ssh.add_argument(
"-j",
"--json",
help="specify the json file for ssh data (generated by starting the clan installer",
)
parser_ssh.add_argument(
"-P",
"--png",
help="specify the json file for ssh data as the qrcode image (generated by starting the clan installer",
)
# TODO pass all args we don't parse into ssh_args, currently it fails if arg starts with -
parser_ssh.add_argument("ssh_args", nargs="*", default=[])
parser_ssh.set_defaults(func=ssh)
ssh.register_parser(parser_ssh)
if has_argcomplete:
argcomplete.autocomplete(parser)
@@ -102,7 +30,7 @@ def main() -> None:
args = parser.parse_args()
if hasattr(args, "func"):
args.func(args)
args.func(args) # pragma: no cover
if __name__ == "__main__": # pragma: no cover