Host: convert to proctocol to avoid forced inheritance
This commit is contained in:
@@ -1,24 +1,24 @@
|
|||||||
"""Base Host interface for both local and remote command execution."""
|
"""Base Host interface for both local and remote command execution."""
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from abc import ABC, abstractmethod
|
from abc import abstractmethod
|
||||||
from collections.abc import Iterator
|
from collections.abc import Iterator
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
from dataclasses import dataclass
|
from typing import Protocol
|
||||||
|
|
||||||
from clan_lib.cmd import CmdOut, RunOpts
|
from clan_lib.cmd import CmdOut, RunOpts
|
||||||
|
|
||||||
cmdlog = logging.getLogger(__name__)
|
cmdlog = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
class Host(Protocol):
|
||||||
class Host(ABC):
|
|
||||||
"""
|
"""
|
||||||
Abstract base class for host command execution.
|
Abstract base class for host command execution.
|
||||||
This provides a common interface for both local and remote hosts.
|
This provides a common interface for both local and remote hosts.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
command_prefix: str | None
|
@property
|
||||||
|
def command_prefix(self) -> str | None: ...
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
|
|||||||
@@ -6,13 +6,12 @@ from dataclasses import dataclass, field
|
|||||||
|
|
||||||
from clan_lib.cmd import CmdOut, RunOpts, run
|
from clan_lib.cmd import CmdOut, RunOpts, run
|
||||||
from clan_lib.colors import AnsiColor
|
from clan_lib.colors import AnsiColor
|
||||||
from clan_lib.ssh.host import Host
|
|
||||||
|
|
||||||
cmdlog = logging.getLogger(__name__)
|
cmdlog = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class LocalHost(Host):
|
class LocalHost:
|
||||||
"""
|
"""
|
||||||
A Host implementation that executes commands locally without SSH.
|
A Host implementation that executes commands locally without SSH.
|
||||||
"""
|
"""
|
||||||
@@ -42,7 +41,7 @@ class LocalHost(Host):
|
|||||||
control_master: bool = True,
|
control_master: bool = True,
|
||||||
) -> CmdOut:
|
) -> CmdOut:
|
||||||
"""
|
"""
|
||||||
Run a command locally instead of via SSH.
|
Run a command locally.
|
||||||
"""
|
"""
|
||||||
if opts is None:
|
if opts is None:
|
||||||
opts = RunOpts()
|
opts = RunOpts()
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ from clan_lib.cmd import CmdOut, RunOpts, run
|
|||||||
from clan_lib.colors import AnsiColor
|
from clan_lib.colors import AnsiColor
|
||||||
from clan_lib.errors import ClanError, indent_command # Assuming these are available
|
from clan_lib.errors import ClanError, indent_command # Assuming these are available
|
||||||
from clan_lib.nix import nix_shell
|
from clan_lib.nix import nix_shell
|
||||||
from clan_lib.ssh.host import Host
|
|
||||||
from clan_lib.ssh.host_key import HostKeyCheck, hostkey_to_ssh_opts
|
from clan_lib.ssh.host_key import HostKeyCheck, hostkey_to_ssh_opts
|
||||||
from clan_lib.ssh.parse import parse_ssh_uri
|
from clan_lib.ssh.parse import parse_ssh_uri
|
||||||
from clan_lib.ssh.sudo_askpass_proxy import SudoAskpassProxy
|
from clan_lib.ssh.sudo_askpass_proxy import SudoAskpassProxy
|
||||||
@@ -31,7 +30,7 @@ NO_OUTPUT_TIMEOUT = 20
|
|||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class Remote(Host):
|
class Remote:
|
||||||
address: str
|
address: str
|
||||||
command_prefix: str | None
|
command_prefix: str | None
|
||||||
user: str = "root"
|
user: str = "root"
|
||||||
|
|||||||
Reference in New Issue
Block a user