99 lines
3.3 KiB
Python
99 lines
3.3 KiB
Python
|
|
import time
|
||
|
|
import re
|
||
|
|
from typing import Any, Optional
|
||
|
|
|
||
|
|
from netmiko.base_connection import BaseConnection
|
||
|
|
|
||
|
|
|
||
|
|
class YamahaBase(BaseConnection):
|
||
|
|
def session_preparation(self) -> None:
|
||
|
|
"""Prepare the session after the connection has been established."""
|
||
|
|
self._test_channel_read(pattern=r"[>#]")
|
||
|
|
self.set_base_prompt()
|
||
|
|
self.disable_paging(command="console lines infinity")
|
||
|
|
time.sleep(0.3 * self.global_delay_factor)
|
||
|
|
self.clear_buffer()
|
||
|
|
|
||
|
|
def check_enable_mode(self, check_string: str = "#") -> bool:
|
||
|
|
return super().check_enable_mode(check_string=check_string)
|
||
|
|
|
||
|
|
def enable(
|
||
|
|
self,
|
||
|
|
cmd: str = "administrator",
|
||
|
|
pattern: str = r"Password",
|
||
|
|
enable_pattern: Optional[str] = None,
|
||
|
|
check_state: bool = True,
|
||
|
|
re_flags: int = re.IGNORECASE,
|
||
|
|
) -> str:
|
||
|
|
return super().enable(
|
||
|
|
cmd=cmd,
|
||
|
|
pattern=pattern,
|
||
|
|
enable_pattern=enable_pattern,
|
||
|
|
check_state=check_state,
|
||
|
|
re_flags=re_flags,
|
||
|
|
)
|
||
|
|
|
||
|
|
def exit_enable_mode(self, exit_command: str = "exit") -> str:
|
||
|
|
"""
|
||
|
|
When any changes have been made, the prompt 'Save new configuration ? (Y/N)'
|
||
|
|
appears before exiting. Ignore this by entering 'N'.
|
||
|
|
"""
|
||
|
|
output = ""
|
||
|
|
if self.check_enable_mode():
|
||
|
|
self.write_channel(self.normalize_cmd(exit_command))
|
||
|
|
time.sleep(1)
|
||
|
|
output = self.read_channel()
|
||
|
|
if "(Y/N)" in output:
|
||
|
|
self.write_channel("N")
|
||
|
|
if self.base_prompt not in output:
|
||
|
|
output += self.read_until_prompt(read_entire_line=True)
|
||
|
|
if self.check_enable_mode():
|
||
|
|
raise ValueError("Failed to exit enable mode.")
|
||
|
|
return output
|
||
|
|
|
||
|
|
def check_config_mode(
|
||
|
|
self, check_string: str = "#", pattern: str = "", force_regex: bool = False
|
||
|
|
) -> bool:
|
||
|
|
"""Checks if the device is in administrator mode or not."""
|
||
|
|
return super().check_config_mode(check_string=check_string, pattern=pattern)
|
||
|
|
|
||
|
|
def config_mode(
|
||
|
|
self,
|
||
|
|
config_command: str = "administrator",
|
||
|
|
pattern: str = "Password",
|
||
|
|
re_flags: int = re.IGNORECASE,
|
||
|
|
) -> str:
|
||
|
|
return self.enable(cmd=config_command, pattern=pattern, re_flags=re_flags)
|
||
|
|
|
||
|
|
def exit_config_mode(self, exit_config: str = "exit", pattern: str = ">") -> str:
|
||
|
|
"""
|
||
|
|
No action taken. Call 'exit_enable_mode()' to explicitly exit Administration
|
||
|
|
Level.
|
||
|
|
"""
|
||
|
|
return ""
|
||
|
|
|
||
|
|
def save_config(
|
||
|
|
self, cmd: str = "save", confirm: bool = False, confirm_response: str = ""
|
||
|
|
) -> str:
|
||
|
|
"""Saves Config."""
|
||
|
|
if confirm is True:
|
||
|
|
raise ValueError("Yamaha does not support save_config confirmation.")
|
||
|
|
self.enable()
|
||
|
|
# Some devices are slow so match on trailing-prompt if you can
|
||
|
|
return self._send_command_str(command_string=cmd)
|
||
|
|
|
||
|
|
|
||
|
|
class YamahaSSH(YamahaBase):
|
||
|
|
"""Yamaha SSH driver."""
|
||
|
|
|
||
|
|
pass
|
||
|
|
|
||
|
|
|
||
|
|
class YamahaTelnet(YamahaBase):
|
||
|
|
"""Yamaha Telnet driver."""
|
||
|
|
|
||
|
|
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
||
|
|
default_enter = kwargs.get("default_enter")
|
||
|
|
kwargs["default_enter"] = "\n" if default_enter is None else default_enter
|
||
|
|
super().__init__(*args, **kwargs)
|