Merge pull request 'Implement clan ssh <hostname>' (#2722) from pinpox/clan-core:clan-ssh-hostname into main
This commit is contained in:
@@ -214,10 +214,15 @@ For more detailed information, visit: {help_hyperlink("getting-started", "https:
|
|||||||
description="Ssh to a remote machine",
|
description="Ssh to a remote machine",
|
||||||
epilog=(
|
epilog=(
|
||||||
f"""
|
f"""
|
||||||
This subcommand allows seamless ssh access to the nixos-image builders.
|
This subcommand allows seamless ssh access to the nixos-image builders or a machine of your clan.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
|
$ clan ssh [ssh_args ...] berlin`
|
||||||
|
|
||||||
|
Will ssh in to the machine called `berlin`, using the
|
||||||
|
`clan.core.networking.targetHost` specified in its configuration
|
||||||
|
|
||||||
$ clan ssh [ssh_args ...] --json [JSON]
|
$ clan ssh [ssh_args ...] --json [JSON]
|
||||||
Will ssh in to the machine based on the deployment information contained in
|
Will ssh in to the machine based on the deployment information contained in
|
||||||
the json string. [JSON] can either be a json formatted string itself, or point
|
the json string. [JSON] can either be a json formatted string itself, or point
|
||||||
|
|||||||
@@ -8,7 +8,12 @@ from typing import Any
|
|||||||
|
|
||||||
from clan_cli.async_run import AsyncRuntime
|
from clan_cli.async_run import AsyncRuntime
|
||||||
from clan_cli.cmd import run
|
from clan_cli.cmd import run
|
||||||
|
from clan_cli.completions import (
|
||||||
|
add_dynamic_completer,
|
||||||
|
complete_machines,
|
||||||
|
)
|
||||||
from clan_cli.errors import ClanError
|
from clan_cli.errors import ClanError
|
||||||
|
from clan_cli.machines.machines import Machine
|
||||||
from clan_cli.nix import nix_shell
|
from clan_cli.nix import nix_shell
|
||||||
from clan_cli.ssh.host import Host, is_ssh_reachable
|
from clan_cli.ssh.host import Host, is_ssh_reachable
|
||||||
from clan_cli.ssh.host_key import HostKeyCheck
|
from clan_cli.ssh.host_key import HostKeyCheck
|
||||||
@@ -24,6 +29,11 @@ class DeployInfo:
|
|||||||
tor: str | None = None
|
tor: str | None = None
|
||||||
pwd: str | None = None
|
pwd: str | None = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def from_hostname(hostname: str, args: argparse.Namespace) -> "DeployInfo":
|
||||||
|
m = Machine(hostname, flake=args.flake)
|
||||||
|
return DeployInfo(addrs=[m.target_host_address])
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def from_json(data: dict[str, Any]) -> "DeployInfo":
|
def from_json(data: dict[str, Any]) -> "DeployInfo":
|
||||||
return DeployInfo(
|
return DeployInfo(
|
||||||
@@ -101,6 +111,8 @@ def ssh_command_parse(args: argparse.Namespace) -> DeployInfo | None:
|
|||||||
return DeployInfo.from_json(data)
|
return DeployInfo.from_json(data)
|
||||||
if args.png:
|
if args.png:
|
||||||
return parse_qr_code(Path(args.png))
|
return parse_qr_code(Path(args.png))
|
||||||
|
if hasattr(args, "machines"):
|
||||||
|
return DeployInfo.from_hostname(args.machines[0], args)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
@@ -108,7 +120,7 @@ def ssh_command(args: argparse.Namespace) -> None:
|
|||||||
host_key_check = HostKeyCheck.from_str(args.host_key_check)
|
host_key_check = HostKeyCheck.from_str(args.host_key_check)
|
||||||
deploy_info = ssh_command_parse(args)
|
deploy_info = ssh_command_parse(args)
|
||||||
if not deploy_info:
|
if not deploy_info:
|
||||||
msg = "No --json or --png data provided"
|
msg = "No MACHINE, --json or --png data provided"
|
||||||
raise ClanError(msg)
|
raise ClanError(msg)
|
||||||
|
|
||||||
with AsyncRuntime() as runtime:
|
with AsyncRuntime() as runtime:
|
||||||
@@ -117,6 +129,16 @@ def ssh_command(args: argparse.Namespace) -> None:
|
|||||||
|
|
||||||
def register_parser(parser: argparse.ArgumentParser) -> None:
|
def register_parser(parser: argparse.ArgumentParser) -> None:
|
||||||
group = parser.add_mutually_exclusive_group(required=True)
|
group = parser.add_mutually_exclusive_group(required=True)
|
||||||
|
machines_parser = group.add_argument(
|
||||||
|
"machines",
|
||||||
|
type=str,
|
||||||
|
nargs="*",
|
||||||
|
default=[],
|
||||||
|
metavar="MACHINE",
|
||||||
|
help="Machine to ssh into.",
|
||||||
|
)
|
||||||
|
add_dynamic_completer(machines_parser, complete_machines)
|
||||||
|
|
||||||
group.add_argument(
|
group.add_argument(
|
||||||
"-j",
|
"-j",
|
||||||
"--json",
|
"--json",
|
||||||
|
|||||||
Reference in New Issue
Block a user