def _setup_auth( auth_private_key: str, auth_strict_key: bool, auth_bypass: bool, ) -> Tuple[str, bool, bool]: """ Parse and setup auth attributes Args: auth_private_key: ssh key to parse/set auth_strict_key: strict key to parse/set auth_bypass: bypass to parse/set Returns: Tuple[str, bool, bool]: string of private key path, bool for auth_strict_key, and bool for auth_bypass values Raises: ScrapliTypeError: if auth_strict_key is not a bool ScrapliTypeError: if auth_bypass is not a bool """ if not isinstance(auth_strict_key, bool): raise ScrapliTypeError(f"`auth_strict_key` should be bool, got {type(auth_strict_key)}") if not isinstance(auth_bypass, bool): raise ScrapliTypeError(f"`auth_bypass` should be bool, got {type(auth_bypass)}") if auth_private_key: auth_private_key_path = resolve_file(file=auth_private_key) else: auth_private_key_path = "" return auth_private_key_path, auth_strict_key, auth_bypass
def test_resolve_file(fs, real_ssh_config_file_path): # pyfakefs so this is not host dependent _ = fs fs.add_real_file(source_path=real_ssh_config_file_path, target_path="/some/neat/path/myfile") assert resolve_file( file="/some/neat/path/myfile") == "/some/neat/path/myfile"
def test_resolve_file_expanduser(fs): fs.add_real_file( source_path=f"{TEST_DATA_DIR}/files/_ssh_config", target_path=f"{os.path.expanduser('~')}/myneatfile", ) resolved_file = resolve_file(file=f"~/myneatfile") assert resolved_file == f"{os.path.expanduser('~')}/myneatfile"
def test_resolve_file_expanduser(fs, real_ssh_config_file_path): # pyfakefs so this is not host dependent _ = fs fs.add_real_file( source_path=real_ssh_config_file_path, target_path=Path("~/myfile").expanduser() ) assert resolve_file(file="~/myfile") == str(Path("~/myfile").expanduser())
def send_configs_from_file( self, file: str, strip_prompt: bool = True, failed_when_contains: Optional[Union[str, List[str]]] = None, stop_on_failed: bool = False, privilege_level: str = "", ) -> List[Response]: """ Send configuration(s) from a file Args: file: string path to file strip_prompt: True/False strip prompt from returned output failed_when_contains: string or list of strings indicating failure if found in response stop_on_failed: True/False stop executing commands if a command fails, returns results as of current execution; aborts configuration session if applicable (iosxr/junos or eos/nxos if using a configuration session) privilege_level: name of configuration privilege level/type to acquire; this is platform dependant, so check the device driver for specifics. Examples of privilege_name would be "exclusive" for IOSXRDriver, "private" for JunosDriver. You can also pass in a name of a configuration session such as "session_mysession" if you have registered a session using the "register_config_session" method of the EOSDriver or NXOSDriver. Returns: responses: List of Scrape Response objects Raises: TypeError: if anything but a string is provided for `file` """ if not isinstance(file, str): raise TypeError( f"`send_configs_from_file` expects a string path to file, got {type(file)}" ) resolved_file = resolve_file(file) with open(resolved_file, "r") as f: configs = f.read().splitlines() return self.send_configs( configs=configs, strip_prompt=strip_prompt, failed_when_contains=failed_when_contains, stop_on_failed=stop_on_failed, privilege_level=privilege_level, )
def send_commands_from_file( self, file: str, strip_prompt: bool = True, failed_when_contains: Optional[Union[str, List[str]]] = None, stop_on_failed: bool = False, ) -> ScrapliMultiResponse: """ Send command(s) from file Args: file: string path to file strip_prompt: True/False strip prompt from returned output failed_when_contains: string or list of strings indicating failure if found in response stop_on_failed: True/False stop executing commands if a command fails, returns results as of current execution Returns: responses: list of Scrapli Response objects Raises: TypeError: if anything but a string is provided for `file` """ if not isinstance(file, str): raise TypeError( f"`send_commands_from_file` expects a string path to file, got {type(file)}" ) resolved_file = resolve_file(file) with open(resolved_file, "r") as f: commands = f.read().splitlines() return self.send_commands( commands=commands, strip_prompt=strip_prompt, failed_when_contains=failed_when_contains, stop_on_failed=stop_on_failed, )
def _pre_send_from_file(file: str, caller: str) -> List[str]: """ Handle pre "send_*_from_file" tasks for consistency between sync/async versions Args: file: string path to file caller: name of the calling method for more helpful error message Returns: list: list of commands/configs read from file Raises: ScrapliTypeError: if anything but a string is provided for `file` """ if not isinstance(file, str): raise ScrapliTypeError(f"`{caller}` expects a string path to a file, got {type(file)}") resolved_file = resolve_file(file) with open(resolved_file, "r", encoding="utf-8") as f: commands = f.read().splitlines() return commands
def _pre_send_commands_from_file(file: str) -> List[str]: """ Handle pre "send_commands_from_file" tasks for consistency between sync/async versions Args: file: string path to file Returns: commands: list of commands read from file Raises: TypeError: if anything but a string is provided for `file` """ if not isinstance(file, str): raise TypeError( f"`send_commands_from_file` expects a string path to a file, got {type(file)}" ) resolved_file = resolve_file(file) with open(resolved_file, "r") as f: commands = f.read().splitlines() return commands
def test_resolve_file_failure(): with pytest.raises(ScrapliValueError) as exc: resolve_file(file=f"~/myneatfile")
def test_resolve_file_failure(): with pytest.raises(ValueError) as exc: resolve_file(file=f"~/myneatfile") assert str(exc.value) == "File path `~/myneatfile` could not be resolved"
def test_resolve_file(): resolved_file = resolve_file(file=f"{TEST_DATA_DIR}/files/_ssh_config") assert resolved_file == f"{TEST_DATA_DIR}/files/_ssh_config"