Module netmiko.mikrotik
Expand source code
from netmiko.mikrotik.mikrotik_ssh import MikrotikRouterOsSSH
from netmiko.mikrotik.mikrotik_ssh import MikrotikSwitchOsSSH
from netmiko.mikrotik.mikrotik_ssh import MikrotikRouterOsFileTransfer
__all__ = ["MikrotikRouterOsSSH", "MikrotikSwitchOsSSH", "MikrotikRouterOsFileTransfer"]
Sub-modules
netmiko.mikrotik.mikrotik_ssh
Classes
class MikrotikRouterOsFileTransfer (ssh_conn: BaseConnection, source_file: str, dest_file: str, file_system: Optional[str] = 'flash', direction: str = 'put', socket_timeout: float = 10.0, progress: Optional[Callable[..., Any]] = None, progress4: Optional[Callable[..., Any]] = None, hash_supported: bool = False)
-
Mikrotik Router Os File Transfer driver.
Expand source code
class MikrotikRouterOsFileTransfer(BaseFileTransfer): """Mikrotik Router Os File Transfer driver.""" def __init__( self, ssh_conn: BaseConnection, source_file: str, dest_file: str, file_system: Optional[str] = "flash", direction: str = "put", socket_timeout: float = 10.0, progress: Optional[Callable[..., Any]] = None, progress4: Optional[Callable[..., Any]] = None, hash_supported: bool = False, ) -> None: super().__init__( ssh_conn=ssh_conn, source_file=source_file, dest_file=dest_file, file_system=file_system, direction=direction, socket_timeout=socket_timeout, progress=progress, progress4=progress4, hash_supported=hash_supported, ) def check_file_exists(self, remote_cmd: str = "") -> bool: """Check if the dest_file already exists on the file system.""" if self.direction == "put": if not remote_cmd: remote_cmd = f'/file print detail where name="{self.file_system}/{self.dest_file}"' remote_out = self.ssh_ctl_chan._send_command_timing_str(remote_cmd) # Output will look like # 0 name="flash/test9.txt" type=".txt file" size=19 creation-time=jun... # fail case will be blank line (all whitespace) if ( "size" in remote_out and f"{self.file_system}/{self.dest_file}" in remote_out ): return True elif not remote_out.strip(): return False raise ValueError("Unexpected output from check_file_exists") elif self.direction == "get": return os.path.exists(self.dest_file) else: raise ValueError("Unexpected value for self.direction") def remote_space_available(self, search_pattern: str = "") -> int: """Return space available on remote device.""" remote_cmd = "system resource print without-paging" sys_res = self.ssh_ctl_chan._send_command_timing_str(remote_cmd).splitlines() for res in sys_res: if "free-memory" in res: spaceMib = res.strip().replace("free-memory: ", "").replace("MiB", "") return int(float(spaceMib) * 1048576) raise ValueError("Unexpected output from remote_space_available") def remote_file_size( self, remote_cmd: str = "", remote_file: Optional[str] = None ) -> int: """Get the file size of the remote file.""" if remote_file is None: if self.direction == "put": remote_file = self.dest_file elif self.direction == "get": remote_file = self.source_file else: raise ValueError("Invalid value for file transfer direction.") if not remote_cmd: remote_cmd = ( f'/file print detail where name="{self.file_system}/{remote_file}"' ) remote_out = self.ssh_ctl_chan._send_command_timing_str(remote_cmd) try: size = remote_out.split("size=")[1].split(" ")[0] return self._format_to_bytes(size) except (KeyError, IndexError): raise ValueError("Unable to find file on remote system") def file_md5(self, file_name: str, add_newline: bool = False) -> str: raise AttributeError( "RouterOS does not natively support an MD5-hash operation." ) @staticmethod def process_md5(md5_output: str, pattern: str = "") -> str: raise AttributeError( "RouterOS does not natively support an MD5-hash operation." ) def compare_md5(self) -> bool: raise AttributeError( "RouterOS does not natively support an MD5-hash operation." ) def remote_md5(self, base_cmd: str = "", remote_file: Optional[str] = None) -> str: raise AttributeError( "RouterOS does not natively support an MD5-hash operation." ) def verify_file(self) -> bool: """ Verify the file has been transferred correctly based on filesize. This method is very approximate as Mikrotik rounds file sizes to KiB, MiB, GiB... Therefore multiple conversions from/to bytes are needed """ if self.direction == "put": local_size = self._format_bytes(os.stat(self.source_file).st_size) remote_size = self._format_bytes( self.remote_file_size(remote_file=self.dest_file) ) return local_size == remote_size elif self.direction == "get": local_size = self._format_bytes(os.stat(self.dest_file).st_size) remote_size = self._format_bytes( self.remote_file_size(remote_file=self.source_file) ) return local_size == remote_size else: raise ValueError("Unexpected value of self.direction") @staticmethod def _format_to_bytes(size: str) -> int: """ Internal function to convert Mikrotik size to bytes """ if size.endswith("KiB"): return round(int(float(size.replace("KiB", "")) * 1024)) if size.endswith("MiB"): return round(int(float(size.replace("MiB", "")) * 1048576)) if size.endswith("GiB"): return round(int(float(size.replace("GiB", "")) * 1073741824)) return round(int(size)) @staticmethod def _format_bytes(size: int) -> str: """ Internal function to convert bytes to KiB, MiB or GiB Extremely approximate """ n = 0 levels = {0: "", 1: "Ki", 2: "Mi", 3: "Gi"} while size > 4096 and n < 3: size = round(size / 1024) n += 1 return f"{size}{levels[n]}B"
Ancestors
Methods
def check_file_exists(self, remote_cmd: str = '') ‑> bool
-
Check if the dest_file already exists on the file system.
Expand source code
def check_file_exists(self, remote_cmd: str = "") -> bool: """Check if the dest_file already exists on the file system.""" if self.direction == "put": if not remote_cmd: remote_cmd = f'/file print detail where name="{self.file_system}/{self.dest_file}"' remote_out = self.ssh_ctl_chan._send_command_timing_str(remote_cmd) # Output will look like # 0 name="flash/test9.txt" type=".txt file" size=19 creation-time=jun... # fail case will be blank line (all whitespace) if ( "size" in remote_out and f"{self.file_system}/{self.dest_file}" in remote_out ): return True elif not remote_out.strip(): return False raise ValueError("Unexpected output from check_file_exists") elif self.direction == "get": return os.path.exists(self.dest_file) else: raise ValueError("Unexpected value for self.direction")
def verify_file(self) ‑> bool
-
Verify the file has been transferred correctly based on filesize. This method is very approximate as Mikrotik rounds file sizes to KiB, MiB, GiB… Therefore multiple conversions from/to bytes are needed
Expand source code
def verify_file(self) -> bool: """ Verify the file has been transferred correctly based on filesize. This method is very approximate as Mikrotik rounds file sizes to KiB, MiB, GiB... Therefore multiple conversions from/to bytes are needed """ if self.direction == "put": local_size = self._format_bytes(os.stat(self.source_file).st_size) remote_size = self._format_bytes( self.remote_file_size(remote_file=self.dest_file) ) return local_size == remote_size elif self.direction == "get": local_size = self._format_bytes(os.stat(self.dest_file).st_size) remote_size = self._format_bytes( self.remote_file_size(remote_file=self.source_file) ) return local_size == remote_size else: raise ValueError("Unexpected value of self.direction")
Inherited members
class MikrotikRouterOsSSH (**kwargs: Any)
-
Mikrotik RouterOS SSH driver.
Expand source code
class MikrotikRouterOsSSH(MikrotikBase): """Mikrotik RouterOS SSH driver.""" pass
Ancestors
Inherited members
MikrotikBase
:check_config_mode
check_enable_mode
cleanup
clear_buffer
commit
config_mode
disable_paging
disconnect
enable
establish_connection
exit_config_mode
exit_enable_mode
find_prompt
is_alive
normalize_cmd
normalize_linefeeds
paramiko_cleanup
read_channel
read_channel_timing
read_until_pattern
read_until_prompt
read_until_prompt_or_pattern
run_ttp
save_config
select_delay_factor
send_command
send_command_expect
send_command_timing
send_config_from_file
send_config_set
send_multiline
session_preparation
set_base_prompt
set_terminal_width
special_login_handler
strip_ansi_escape_codes
strip_backspaces
strip_command
strip_prompt
telnet_login
write_channel
class MikrotikSwitchOsSSH (**kwargs: Any)
-
Mikrotik SwitchOS SSH driver.
Expand source code
class MikrotikSwitchOsSSH(MikrotikBase): """Mikrotik SwitchOS SSH driver.""" pass
Ancestors
Inherited members
MikrotikBase
:check_config_mode
check_enable_mode
cleanup
clear_buffer
commit
config_mode
disable_paging
disconnect
enable
establish_connection
exit_config_mode
exit_enable_mode
find_prompt
is_alive
normalize_cmd
normalize_linefeeds
paramiko_cleanup
read_channel
read_channel_timing
read_until_pattern
read_until_prompt
read_until_prompt_or_pattern
run_ttp
save_config
select_delay_factor
send_command
send_command_expect
send_command_timing
send_config_from_file
send_config_set
send_multiline
session_preparation
set_base_prompt
set_terminal_width
special_login_handler
strip_ansi_escape_codes
strip_backspaces
strip_command
strip_prompt
telnet_login
write_channel