blob: c1491e015eeeeb0736cf663cdd42be47d4f893d9 [file] [log] [blame]
# Copyright 2024 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from __future__ import annotations
import abc
from typing import TYPE_CHECKING, Final, Mapping, Optional
from crossbench.plt.port_manager import PortManager
from crossbench.plt.remote import RemotePlatformMixin
if TYPE_CHECKING:
import subprocess
from crossbench.plt.base import Platform
from crossbench.plt.types import CmdArg, ListCmdArgs, ProcessIo
class SshPortManager(PortManager):
pass
class SshPlatformMixin(RemotePlatformMixin, metaclass=abc.ABCMeta):
def __init__(self, host_platform: Platform, host: str, port: int,
ssh_port: int, ssh_user: str) -> None:
self._host: Final[str] = host
self._port: Final[int] = port
self._ssh_port: Final[int] = ssh_port
self._ssh_user: Final[str] = ssh_user
super().__init__(host_platform)
@abc.abstractmethod
def _create_port_manager(self) -> PortManager:
pass
@property
def host(self) -> str:
return self._host
@property
def port(self) -> int:
return self._port
@property
def ssh_user(self) -> str:
return self._ssh_user
@property
def ssh_port(self) -> int:
return self._ssh_port
@property
def is_remote_ssh(self) -> bool:
return True
@abc.abstractmethod
def build_ssh_cmd(self, *args: CmdArg, shell: bool = False) -> ListCmdArgs:
pass
def sh_stdout_bytes(self,
*args: CmdArg,
shell: bool = False,
quiet: bool = False,
stdin: ProcessIo = None,
env: Optional[Mapping[str, str]] = None,
check: bool = True) -> bytes:
ssh_cmd: ListCmdArgs = self.build_ssh_cmd(*args, shell=shell)
return self._host_platform.sh_stdout_bytes(
*ssh_cmd, shell=False, quiet=quiet, stdin=stdin, env=env, check=check)
def sh(self,
*args: CmdArg,
shell: bool = False,
capture_output: bool = False,
stdout: ProcessIo = None,
stderr: ProcessIo = None,
stdin: ProcessIo = None,
env: Optional[Mapping[str, str]] = None,
quiet: bool = False,
check: bool = True) -> subprocess.CompletedProcess:
ssh_cmd: ListCmdArgs = self.build_ssh_cmd(*args, shell=shell)
return self._host_platform.sh(
*ssh_cmd,
shell=shell,
capture_output=capture_output,
stdout=stdout,
stderr=stderr,
stdin=stdin,
env=env,
quiet=quiet,
check=check)
def popen(self,
*args: CmdArg,
bufsize: int = -1,
shell: bool = False,
stdout: ProcessIo = None,
stderr: ProcessIo = None,
stdin: ProcessIo = None,
env: Optional[Mapping[str, str]] = None,
quiet: bool = False) -> subprocess.Popen:
ssh_cmd: ListCmdArgs = self.build_ssh_cmd(*args, shell=shell)
return self._host_platform.popen(
*ssh_cmd,
shell=False,
bufsize=bufsize,
stdout=stdout,
stderr=stderr,
stdin=stdin,
env=env,
quiet=quiet)