Mini Shell
import re
import time
from telnetlib import DO, DONT, ECHO, IAC, WILL, WONT
from netmiko.cisco_base_connection import CiscoSSHConnection
class RuckusFastironBase(CiscoSSHConnection):
"""Ruckus FastIron aka ICX support."""
def session_preparation(self):
"""FastIron requires to be enable mode to disable paging."""
self._test_channel_read()
self.set_base_prompt()
self.enable()
self.disable_paging(command="skip-page-display")
# Clear the read buffer
time.sleep(0.3 * self.global_delay_factor)
self.clear_buffer()
def enable(
self, cmd="enable", pattern=r"(ssword|User Name)", re_flags=re.IGNORECASE
):
"""Enter enable mode.
With RADIUS can prompt for User Name
SSH@Lab-ICX7250>en
User Name:service_netmiko
Password:
SSH@Lab-ICX7250#
"""
output = ""
if not self.check_enable_mode():
count = 4
i = 1
while i < count:
self.write_channel(self.normalize_cmd(cmd))
new_data = self.read_until_prompt_or_pattern(
pattern=pattern, re_flags=re_flags
)
output += new_data
if "User Name" in new_data:
self.write_channel(self.normalize_cmd(self.username))
new_data = self.read_until_prompt_or_pattern(
pattern=pattern, re_flags=re_flags
)
output += new_data
if "ssword" in new_data:
self.write_channel(self.normalize_cmd(self.secret))
new_data = self.read_until_prompt()
output += new_data
if not re.search(
r"error.*incorrect.*password", new_data, flags=re.I
):
return output
time.sleep(1)
i += 1
if not self.check_enable_mode():
msg = (
"Failed to enter enable mode. Please ensure you pass "
"the 'secret' argument to ConnectHandler."
)
raise ValueError(msg)
def save_config(self, cmd="write mem", confirm=False, confirm_response=""):
"""Saves configuration."""
return super().save_config(
cmd=cmd, confirm=confirm, confirm_response=confirm_response
)
class RuckusFastironTelnet(RuckusFastironBase):
def __init__(self, *args, **kwargs):
default_enter = kwargs.get("default_enter")
kwargs["default_enter"] = "\r\n" if default_enter is None else default_enter
super().__init__(*args, **kwargs)
def _process_option(self, tsocket, command, option):
"""
Ruckus FastIron/ICX does not always echo commands to output by default.
If server expresses interest in 'ECHO' option, then reply back with 'DO
ECHO'
"""
if option == ECHO:
tsocket.sendall(IAC + DO + ECHO)
elif command in (DO, DONT):
tsocket.sendall(IAC + WONT + option)
elif command in (WILL, WONT):
tsocket.sendall(IAC + DONT + option)
def telnet_login(self, *args, **kwargs):
# set callback function to handle telnet options.
self.remote_conn.set_option_negotiation_callback(self._process_option)
return super().telnet_login(*args, **kwargs)
class RuckusFastironSSH(RuckusFastironBase):
pass
Zerion Mini Shell 1.0