From 9f53c1858d7b2a17b41327622763ef050a559c5b Mon Sep 17 00:00:00 2001 From: Oscar Pachano Date: Tue, 12 Nov 2024 18:32:10 -0800 Subject: [PATCH 1/3] Updates self.write_channel and _test_channel_read got Palo Alto Log Collector compatibility. --- netmiko/paloalto/paloalto_panos.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netmiko/paloalto/paloalto_panos.py b/netmiko/paloalto/paloalto_panos.py index acbb08746..3bc544be1 100644 --- a/netmiko/paloalto/paloalto_panos.py +++ b/netmiko/paloalto/paloalto_panos.py @@ -78,8 +78,8 @@ def session_preparation(self) -> None: self.set_base_prompt() # PA devices can be really slow--try to make sure we are caught up - self.write_channel("show admins\n") - self._test_channel_read(pattern=r"Client") + self.write_channel("show system info\n") + self._test_channel_read(pattern=r"operational-mode") self._test_channel_read(pattern=r"[>#]") def find_prompt( From d5fbf988d1fb184ad6151f340f674a0aeb272551 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Sun, 5 Jan 2025 20:04:33 -0800 Subject: [PATCH 2/3] genexis_solt33_telnet support (#3556) Co-authored-by: Iliya Iliev Co-authored-by: Ilia Iliev --- PLATFORMS.md | 2 ++ netmiko/genexis/__init__.py | 3 +++ netmiko/genexis/genexis_solt33.py | 31 +++++++++++++++++++++++++++++++ netmiko/ssh_dispatcher.py | 5 +++-- 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 netmiko/genexis/__init__.py create mode 100644 netmiko/genexis/genexis_solt33.py diff --git a/PLATFORMS.md b/PLATFORMS.md index 59dbce226..075961e01 100644 --- a/PLATFORMS.md +++ b/PLATFORMS.md @@ -99,6 +99,7 @@ - F5 Linux - Fortinet - Garderos GRS +- Genexis Saturn SOLT33 - MRV Communications OptiSwitch - MRV LX - Nokia/Alcatel SR-OS @@ -280,6 +281,7 @@ - extreme_telnet - generic_telnet - generic_termserver_telnet +- genexis_solt33_telnet - hp_comware_telnet - hp_procurve_telnet - huawei_olt_telnet diff --git a/netmiko/genexis/__init__.py b/netmiko/genexis/__init__.py new file mode 100644 index 000000000..3f0bccd39 --- /dev/null +++ b/netmiko/genexis/__init__.py @@ -0,0 +1,3 @@ +from netmiko.genexis.genexis_solt33 import GenexisSOLT33Telnet + +__all__ = ["GenexisSOLT33Telnet"] diff --git a/netmiko/genexis/genexis_solt33.py b/netmiko/genexis/genexis_solt33.py new file mode 100644 index 000000000..fc6496b31 --- /dev/null +++ b/netmiko/genexis/genexis_solt33.py @@ -0,0 +1,31 @@ +from netmiko.cisco_base_connection import CiscoBaseConnection + + +class GenexisSOLT33Base(CiscoBaseConnection): + def session_preparation(self) -> None: + self._test_channel_read(pattern=r"[>#]") + self.set_base_prompt() + self.enable() + self.config_mode() + cmd = "line width 256" + self.set_terminal_width(command=cmd, pattern=cmd) + self.disable_paging(command="screen-rows per-page 0") + self.clear_buffer() + self.exit_config_mode() + self.exit_enable_mode() + + def exit_enable_mode(self, exit_command: str = "exit") -> str: + output = "" + if self.check_enable_mode(): + self.write_channel(self.normalize_cmd(exit_command)) + self.read_until_pattern(pattern=exit_command) + output += self.read_until_pattern(pattern=r">") + if self.check_enable_mode(): + raise ValueError("Failed to exit enable mode.") + return output + + +class GenexisSOLT33Telnet(GenexisSOLT33Base): + """Genexis SOLT33 telnet driver""" + + pass diff --git a/netmiko/ssh_dispatcher.py b/netmiko/ssh_dispatcher.py index 70be1f5b2..7ff484e25 100755 --- a/netmiko/ssh_dispatcher.py +++ b/netmiko/ssh_dispatcher.py @@ -86,6 +86,7 @@ from netmiko.flexvnf import FlexvnfSSH from netmiko.fortinet import FortinetSSH from netmiko.garderos import GarderosGrsSSH +from netmiko.genexis import GenexisSOLT33Telnet from netmiko.hillstone import HillstoneStoneosSSH from netmiko.hp import HPProcurveSSH, HPProcurveTelnet, HPComwareSSH, HPComwareTelnet from netmiko.huawei import HuaweiSSH, HuaweiVrpv8SSH, HuaweiTelnet @@ -143,7 +144,6 @@ from netmiko.supermicro import SmciSwitchSmisTelnet from netmiko.zyxel import ZyxelSSH - if TYPE_CHECKING: from netmiko.base_connection import BaseConnection from netmiko.scp_handler import BaseFileTransfer @@ -350,12 +350,14 @@ CLASS_MAPPER["extreme_netiron_telnet"] = ExtremeNetironTelnet CLASS_MAPPER["generic_telnet"] = GenericTelnet CLASS_MAPPER["generic_termserver_telnet"] = TerminalServerTelnet +CLASS_MAPPER["genexis_solt33_telnet"] = GenexisSOLT33Telnet CLASS_MAPPER["hp_procurve_telnet"] = HPProcurveTelnet CLASS_MAPPER["hp_comware_telnet"] = HPComwareTelnet CLASS_MAPPER["huawei_telnet"] = HuaweiTelnet CLASS_MAPPER["huawei_olt_telnet"] = HuaweiSmartAXSSH CLASS_MAPPER["ipinfusion_ocnos_telnet"] = IpInfusionOcNOSTelnet CLASS_MAPPER["juniper_junos_telnet"] = JuniperTelnet +CLASS_MAPPER["maipu_telnet"] = MaipuTelnet CLASS_MAPPER["nokia_sros_telnet"] = NokiaSrosTelnet CLASS_MAPPER["oneaccess_oneos_telnet"] = OneaccessOneOSTelnet CLASS_MAPPER["paloalto_panos_telnet"] = PaloAltoPanosTelnet @@ -368,7 +370,6 @@ CLASS_MAPPER["tplink_jetstream_telnet"] = TPLinkJetStreamTelnet CLASS_MAPPER["yamaha_telnet"] = YamahaTelnet CLASS_MAPPER["zte_zxros_telnet"] = ZteZxrosTelnet -CLASS_MAPPER["maipu_telnet"] = MaipuTelnet # Add serial drivers CLASS_MAPPER["cisco_ios_serial"] = CiscoIosSerial From bb699c10cae84570969bcc4b1346faaf59e8b761 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Sun, 5 Jan 2025 20:44:34 -0800 Subject: [PATCH 3/3] Optilink eolt devices (#3557) Co-authored-by: Iliya Iliev Co-authored-by: Ilia Iliev --- PLATFORMS.md | 4 ++- netmiko/optilink/__init__.py | 7 +++++ netmiko/optilink/op_eolt11444.py | 36 ++++++++++++++++++++++ netmiko/optilink/op_eolt9702.py | 52 ++++++++++++++++++++++++++++++++ netmiko/ssh_dispatcher.py | 4 +++ 5 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 netmiko/optilink/__init__.py create mode 100644 netmiko/optilink/op_eolt11444.py create mode 100644 netmiko/optilink/op_eolt9702.py diff --git a/PLATFORMS.md b/PLATFORMS.md index 075961e01..3624c5940 100644 --- a/PLATFORMS.md +++ b/PLATFORMS.md @@ -99,11 +99,12 @@ - F5 Linux - Fortinet - Garderos GRS -- Genexis Saturn SOLT33 +- Genexis Saturn SOLT33 (telnet only) - MRV Communications OptiSwitch - MRV LX - Nokia/Alcatel SR-OS - Nokia SR Linux +- Optilink EOLT 9702 (telnet only) - QuantaMesh - Rad ETX - Raisecom ROAP @@ -291,6 +292,7 @@ - maipu_telnet - nokia_sros_telnet - oneaccess_oneos_telnet +- optilink_eolt9702_telnet - paloalto_panos_telnet - rad_etx_telnet - raisecom_telnet diff --git a/netmiko/optilink/__init__.py b/netmiko/optilink/__init__.py new file mode 100644 index 000000000..ff27b1800 --- /dev/null +++ b/netmiko/optilink/__init__.py @@ -0,0 +1,7 @@ +from netmiko.optilink.op_eolt9702 import OptilinkEOLT9702Telnet +from netmiko.optilink.op_eolt11444 import OptilinkEOLT11444Telnet + +__all__ = [ + "OptilinkEOLT11444Telnet", + "OptilinkEOLT9702Telnet", +] diff --git a/netmiko/optilink/op_eolt11444.py b/netmiko/optilink/op_eolt11444.py new file mode 100644 index 000000000..319e6a5d4 --- /dev/null +++ b/netmiko/optilink/op_eolt11444.py @@ -0,0 +1,36 @@ +from netmiko.cisco_base_connection import CiscoBaseConnection + + +class OptilinkEOLT11444Base(CiscoBaseConnection): + """ + Optilink EOLT 11444 + Optilink EOLT 11448 + """ + + def session_preparation(self) -> None: + self._test_channel_read(pattern=r"[>#]") + self.set_base_prompt() + self.enable() + self.disable_paging() + self.clear_buffer() + self.exit_enable_mode() + + def config_mode( + self, + config_command: str = "configure", + pattern: str = "", + re_flags: int = 0, + ) -> str: + """Enter into configuration mode.""" + return super().config_mode( + config_command=config_command, pattern=pattern, re_flags=re_flags + ) + + +class OptilinkEOLT11444Telnet(OptilinkEOLT11444Base): + """ + Optilink EOLT 11444 telnet driver + Optilink EOLT 11448 telnet driver + """ + + pass diff --git a/netmiko/optilink/op_eolt9702.py b/netmiko/optilink/op_eolt9702.py new file mode 100644 index 000000000..465b55b54 --- /dev/null +++ b/netmiko/optilink/op_eolt9702.py @@ -0,0 +1,52 @@ +from netmiko.cisco_base_connection import CiscoBaseConnection + + +class OptilinkEOLT9702Base(CiscoBaseConnection): + """ + Optilink EOLT 9702-8P2AB + Optilink EOLT 9702-4P + """ + + def session_preparation(self) -> None: + self._test_channel_read(pattern=r"[>#]") + self.set_base_prompt() + self.enable() + self.config_mode() + self.send_command("vty output show-all") + self.exit_config_mode() + self.exit_enable_mode() + + def config_mode( + self, + config_command: str = "config", + pattern: str = "", + re_flags: int = 0, + ) -> str: + """Enter into configuration mode.""" + return super().config_mode( + config_command=config_command, pattern=pattern, re_flags=re_flags + ) + + def exit_enable_mode(self, exit_command: str = "exit") -> str: + """Exit from enable mode.""" + output = "" + if self.check_enable_mode(): + self.write_channel(self.normalize_cmd(exit_command)) + self.read_until_pattern(pattern=exit_command) + output += self.read_until_pattern(pattern=r"OP_OLT>") + if self.check_enable_mode(): + raise ValueError("Failed to exit enable mode.") + return output + + def exit_config_mode(self, exit_config: str = "exit", pattern: str = r"#.*") -> str: + """Exit from configuration mode.""" + return super().exit_config_mode(exit_config=exit_config, pattern=pattern) + + +class OptilinkEOLT9702Telnet(OptilinkEOLT9702Base): + """ + Optilink EOLT 9702-8P2AB telnet driver + Optilink EOLT 9702-4P telnet driver + """ + + pass diff --git a/netmiko/ssh_dispatcher.py b/netmiko/ssh_dispatcher.py index 7ff484e25..fd8cb2401 100755 --- a/netmiko/ssh_dispatcher.py +++ b/netmiko/ssh_dispatcher.py @@ -112,6 +112,8 @@ ) from netmiko.netgear import NetgearProSafeSSH from netmiko.oneaccess import OneaccessOneOSTelnet, OneaccessOneOSSSH +from netmiko.optilink import OptilinkEOLT9702Telnet +from netmiko.optilink import OptilinkEOLT11444Telnet from netmiko.ovs import OvsLinuxSSH from netmiko.paloalto import PaloAltoPanosSSH from netmiko.paloalto import PaloAltoPanosTelnet @@ -360,6 +362,8 @@ CLASS_MAPPER["maipu_telnet"] = MaipuTelnet CLASS_MAPPER["nokia_sros_telnet"] = NokiaSrosTelnet CLASS_MAPPER["oneaccess_oneos_telnet"] = OneaccessOneOSTelnet +CLASS_MAPPER["optilink_eolt9702_telnet"] = OptilinkEOLT9702Telnet +CLASS_MAPPER["optilink_eolt11444_telnet"] = OptilinkEOLT11444Telnet CLASS_MAPPER["paloalto_panos_telnet"] = PaloAltoPanosTelnet CLASS_MAPPER["rad_etx_telnet"] = RadETXTelnet CLASS_MAPPER["raisecom_telnet"] = RaisecomRoapTelnet