diff --git a/netmiko/hioso/__init__.py b/netmiko/hioso/__init__.py new file mode 100644 index 000000000..4f5556084 --- /dev/null +++ b/netmiko/hioso/__init__.py @@ -0,0 +1,3 @@ +from netmiko.hioso.hioso import HiosoTelnet + +__all__ = ["HiosoTelnet"] diff --git a/netmiko/hioso/hioso.py b/netmiko/hioso/hioso.py new file mode 100644 index 000000000..779280dd8 --- /dev/null +++ b/netmiko/hioso/hioso.py @@ -0,0 +1,95 @@ +import re + +from netmiko.cisco_base_connection import CiscoBaseConnection +from netmiko.exceptions import NetmikoAuthenticationException + + +class HiosoBase(CiscoBaseConnection): + """ + Base class for Hioso devices. + It is fairly similar to Cisco devices. + """ + + prompt_pattern = r"[\]>]" + prompt_or_password_change = rf"(?:Change now|Please choose|{prompt_pattern})" + + def session_preparation(self) -> None: + """Prepare the session after the connection is established.""" + self.ansi_escape_codes = True + self.set_base_prompt() + self.enable() + self.disable_paging() + self.clear_buffer() + self.exit_enable_mode() + + def check_config_mode( + self, + check_string: str = ")#", + pattern: str = r"[>#]", + force_regex: bool = False, + ) -> bool: + return super().check_config_mode(check_string, pattern, force_regex) + + def exit_config_mode(self, exit_config: str = "exit", pattern: str = r"#") -> str: + """Exit configuration mode.""" + return super().exit_config_mode(exit_config=exit_config, pattern=pattern) + + def save_config( + self, + cmd: str = "write file", + confirm: bool = False, + confirm_response: str = "y", + ) -> str: + """Save Config for Hioso Telnet.""" + return super().save_config( + cmd=cmd, confirm=confirm, confirm_response=confirm_response + ) + + def cleanup(self, command: str = "quit") -> None: + """Cleanup the connection.""" + super().cleanup(command=command) + + +class HiosoTelnet(HiosoBase): + """Hioso Telnet driver.""" + + def telnet_login( + self, + pri_prompt_terminator: str = r"", + alt_prompt_terminator: str = r"", + username_pattern: str = r"(?:user:|username|login|user name)", + pwd_pattern: str = r"assword", + delay_factor: float = 1.0, + max_loops: int = 20, + ) -> str: + """Telnet login for Hioso Devices""" + output = "" + return_msg = "" + try: + # Search for username pattern / send username + output = self.read_until_pattern(pattern=username_pattern, re_flags=re.I) + return_msg += output + self.write_channel(self.username + self.TELNET_RETURN) + + # Search for password pattern / send password + output = self.read_until_pattern(pattern=pwd_pattern, re_flags=re.I) + return_msg += output + assert self.password is not None + self.write_channel(self.password + self.TELNET_RETURN) + + # Waiting for the prompt or password change message + output = self.read_until_pattern(pattern=self.prompt_or_password_change) + return_msg += output + + # Wait for the prompt + if re.search(self.prompt_pattern, output): + return return_msg + + # Should never be here + raise EOFError + + except EOFError: + assert self.remote_conn is not None + self.remote_conn.close() + msg = f"Login failed: {self.host}" + raise NetmikoAuthenticationException(msg) diff --git a/netmiko/ssh_dispatcher.py b/netmiko/ssh_dispatcher.py index d05859aee..ce782b7f4 100755 --- a/netmiko/ssh_dispatcher.py +++ b/netmiko/ssh_dispatcher.py @@ -90,6 +90,7 @@ from netmiko.garderos import GarderosGrsSSH from netmiko.genexis import GenexisSOLT33Telnet from netmiko.hillstone import HillstoneStoneosSSH +from netmiko.hioso import HiosoTelnet from netmiko.hp import HPProcurveSSH, HPProcurveTelnet, HPComwareSSH, HPComwareTelnet from netmiko.huawei import HuaweiSSH, HuaweiVrpv8SSH, HuaweiTelnet from netmiko.huawei import HuaweiSmartAXSSH @@ -357,6 +358,7 @@ CLASS_MAPPER["generic_telnet"] = GenericTelnet CLASS_MAPPER["generic_termserver_telnet"] = TerminalServerTelnet CLASS_MAPPER["genexis_solt33_telnet"] = GenexisSOLT33Telnet +CLASS_MAPPER["hioso_telnet"] = HiosoTelnet CLASS_MAPPER["hp_procurve_telnet"] = HPProcurveTelnet CLASS_MAPPER["hp_comware_telnet"] = HPComwareTelnet CLASS_MAPPER["huawei_telnet"] = HuaweiTelnet