From 8756cc93d0c6901fe534c46594c55ca3a0317c74 Mon Sep 17 00:00:00 2001 From: Tsukasa Yoneda Date: Thu, 31 Oct 2024 21:22:21 +0900 Subject: [PATCH 01/17] fix to support cisco APIC paging function --- netmiko/cisco/cisco_apic.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/netmiko/cisco/cisco_apic.py b/netmiko/cisco/cisco_apic.py index 5d41a0be5..bae637453 100644 --- a/netmiko/cisco/cisco_apic.py +++ b/netmiko/cisco/cisco_apic.py @@ -1,6 +1,7 @@ """Subclass specific to Cisco APIC.""" from netmiko.linux.linux_ssh import LinuxSSH +from netmiko.cisco_base_connection import CiscoSSHConnection class CiscoApicSSH(LinuxSSH): @@ -10,4 +11,17 @@ class CiscoApicSSH(LinuxSSH): This class inherit from LinuxSSH because Cisco APIC is based on Linux """ - pass + def session_preparation(self) -> None: + """ + Prepare the session after the connection has been established. + + In LinuxSSH, the disable_paging method does nothing; however, paging is enabled + by default on Cisco APIC. To handle this, we utilize the disable_paging method + from CiscoSSHConnection, the parent class of LinuxSSH. This approach leverages + the shared implementation for Cisco SSH connections and ensures that any updates to + disable_paging in the parent class are inherited. + """ + self.ansi_escape_codes = True + self._test_channel_read(pattern=self.prompt_pattern) + self.set_base_prompt() + CiscoSSHConnection.disable_paging(self, command="terminal length 0") From fe009983904195412b2e4bab52f9e274bdb4bf82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Ribot?= <98583408+k-ribot@users.noreply.github.com> Date: Tue, 5 Nov 2024 03:22:02 +0100 Subject: [PATCH 02/17] Zyxel: Correction of ANSI characters of next line (#3524) --- netmiko/zyxel/zyxel_ssh.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/netmiko/zyxel/zyxel_ssh.py b/netmiko/zyxel/zyxel_ssh.py index 7ac0005dc..ddebc18e9 100644 --- a/netmiko/zyxel/zyxel_ssh.py +++ b/netmiko/zyxel/zyxel_ssh.py @@ -1,3 +1,5 @@ +import re + from typing import Any, Sequence, Iterator, TextIO, Union from netmiko.cisco_base_connection import CiscoSSHConnection from netmiko.no_enable import NoEnable @@ -28,3 +30,8 @@ def session_preparation(self) -> None: super().session_preparation() # Zyxel switches output ansi codes self.ansi_escape_codes = True + + def strip_ansi_escape_codes(self, string_buffer: str) -> str: + """Replace '^J' code by next line""" + output = re.sub(r"^\^J", self.RETURN, string_buffer) + return super().strip_ansi_escape_codes(output) From 3330854b186dd17ddc29d151513ccdce3a72c6a0 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Fri, 8 Nov 2024 10:53:58 -0800 Subject: [PATCH 03/17] fortinet _preferred_kex settings interfering with other devices (#3530) Co-authored-by: Karel --- .github/workflows/main_testing.yaml | 4 +- netmiko/base_connection.py | 19 +++++---- netmiko/fortinet/fortinet_ssh.py | 30 +++++++++----- tests/unit/test_base_connection.py | 62 ++++++++++++++++++++++++++++- 4 files changed, 93 insertions(+), 22 deletions(-) diff --git a/.github/workflows/main_testing.yaml b/.github/workflows/main_testing.yaml index d4bf82817..b32dddda1 100644 --- a/.github/workflows/main_testing.yaml +++ b/.github/workflows/main_testing.yaml @@ -52,7 +52,7 @@ jobs: shell: bash strategy: matrix: - python-version: [ '3.8', '3.9', '3.10', '3.11', "3.12", "3.13.0-beta.2" ] + python-version: [ '3.9', '3.10', '3.11', "3.12", "3.13" ] platform: [ubuntu-24.04, windows-2022] runs-on: ${{ matrix.platform }} @@ -96,7 +96,7 @@ jobs: shell: bash strategy: matrix: - python-version: [ '3.8', '3.9', '3.10', '3.11' ] + python-version: [ '3.9', '3.10', '3.11' ] platform: [macos-13] runs-on: ${{ matrix.platform }} diff --git a/netmiko/base_connection.py b/netmiko/base_connection.py index f6fbff937..4ecf0fc25 100644 --- a/netmiko/base_connection.py +++ b/netmiko/base_connection.py @@ -472,15 +472,18 @@ def __init__( self.system_host_keys = system_host_keys self.alt_host_keys = alt_host_keys self.alt_key_file = alt_key_file + self.disabled_algorithms = disabled_algorithms - if disabled_algorithms: - self.disabled_algorithms = disabled_algorithms - else: - self.disabled_algorithms = ( - {"pubkeys": ["rsa-sha2-256", "rsa-sha2-512"]} - if disable_sha2_fix - else {} - ) + if disable_sha2_fix: + sha2_pubkeys = ["rsa-sha2-256", "rsa-sha2-512"] + if self.disabled_algorithms is None: + self.disabled_algorithms = {"pubkeys": sha2_pubkeys} + else: + # Merge sha2_pubkeys into pubkeys and prevent duplicates + current_pubkeys = self.disabled_algorithms.get("pubkeys", []) + self.disabled_algorithms["pubkeys"] = list( + set(current_pubkeys + sha2_pubkeys) + ) # For SSH proxy support self.ssh_config_file = ssh_config_file diff --git a/netmiko/fortinet/fortinet_ssh.py b/netmiko/fortinet/fortinet_ssh.py index f01779178..a0883cb99 100644 --- a/netmiko/fortinet/fortinet_ssh.py +++ b/netmiko/fortinet/fortinet_ssh.py @@ -1,6 +1,6 @@ import paramiko import re -from typing import Optional +from typing import Optional, Any from netmiko.no_config import NoConfig from netmiko.no_enable import NoEnable @@ -9,16 +9,24 @@ class FortinetSSH(NoConfig, NoEnable, CiscoSSHConnection): prompt_pattern = r"[#$]" - - def _modify_connection_params(self) -> None: - """Modify connection parameters prior to SSH connection.""" - paramiko_transport = getattr(paramiko, "Transport") - paramiko_transport._preferred_kex = ( - "diffie-hellman-group14-sha1", - "diffie-hellman-group-exchange-sha1", - "diffie-hellman-group-exchange-sha256", - "diffie-hellman-group1-sha1", - ) + preferred_kex = { + "diffie-hellman-group14-sha1", + "diffie-hellman-group-exchange-sha1", + "diffie-hellman-group-exchange-sha256", + "diffie-hellman-group1-sha1", + } + + def __init__(self, *args: Any, **kwargs: Any) -> None: + disabled_algorithms = kwargs.get("disabled_algorithms") + # Set this as long as no "kex" settings being passed via disabled_algorithms + if disabled_algorithms is None or not disabled_algorithms.get("kex"): + paramiko_transport = getattr(paramiko, "Transport") + paramiko_cur_kex = set(paramiko_transport._preferred_kex) + # Disable any kex not in allowed fortinet set + disabled_kex = list(paramiko_cur_kex - self.preferred_kex) + kwargs["disabled_algorithms"] = {"kex": disabled_kex} + + super().__init__(*args, **kwargs) def _try_session_preparation(self, force_data: bool = False) -> None: super()._try_session_preparation(force_data=force_data) diff --git a/tests/unit/test_base_connection.py b/tests/unit/test_base_connection.py index cd02f48d3..01ea8fa0f 100755 --- a/tests/unit/test_base_connection.py +++ b/tests/unit/test_base_connection.py @@ -4,7 +4,8 @@ from os.path import dirname, join from threading import Lock -from netmiko import NetmikoTimeoutException, log +import paramiko +from netmiko import NetmikoTimeoutException, log, ConnectHandler from netmiko.base_connection import BaseConnection RESOURCE_FOLDER = join(dirname(dirname(__file__)), "etc") @@ -493,3 +494,62 @@ def test_remove_SecretsFilter_after_disconnection(): connection.disconnect() assert not log.filters + + +def test_fortinet_kex_values(): + """Verify KEX override in Fortinet driver works properly""" + connection = ConnectHandler( + host="testhost", + device_type="fortinet", + auto_connect=False, # No need to connect for the test purposes + ) + paramiko_transport = getattr(paramiko, "Transport") + paramiko_default_kex = set(paramiko_transport._preferred_kex) + + allowed_fortinet_kex = set(connection.preferred_kex) + disabled_kex = list(paramiko_default_kex - allowed_fortinet_kex) + allowed_kex = paramiko_default_kex & allowed_fortinet_kex + + # Ensure disabled_kex matches expectations + assert disabled_kex == connection.disabled_algorithms.get("kex", []) + # Ensure allowed_kex is not an empty set + assert allowed_kex + + connection.disconnect() + + +def test_disable_sha2_fix(): + """ + Verify SHA2 fix works properly; test with fortinet device_type as it is more of an edge + case. + """ + connection = ConnectHandler( + host="testhost", + device_type="fortinet", + disable_sha2_fix=True, + auto_connect=False, # No need to connect for the test purposes + ) + paramiko_transport = getattr(paramiko, "Transport") + + # Verify fortinet kex fix and disable_sha2_fix work properly together + paramiko_default_kex = set(paramiko_transport._preferred_kex) + allowed_fortinet_kex = set(connection.preferred_kex) + disabled_kex = list(paramiko_default_kex - allowed_fortinet_kex) + allowed_kex = paramiko_default_kex & allowed_fortinet_kex + + # Ensure disabled_kex matches expectations + assert disabled_kex == connection.disabled_algorithms.get("kex", []) + # Ensure allowed_kex is not an empty set + assert allowed_kex + + # Verify 'sha2' algorithms have been disabled + paramiko_default_pubkeys = set(paramiko_transport._preferred_keys) + disabled_pubkey_algos = set(connection.disabled_algorithms.get("pubkeys", [])) + + allowed_pubkeys = paramiko_default_pubkeys - disabled_pubkey_algos + # Check allowed_pubkeys is not an empty set + assert allowed_pubkeys + # Check both 'sha2' pubkeys are not in allowed_pubkeys + assert {"rsa-sha2-512", "rsa-sha2-256"} & allowed_pubkeys == set() + + connection.disconnect() From 5e77f2300ead4e882e626423fffcf45fd93422a4 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Fri, 8 Nov 2024 12:13:47 -0800 Subject: [PATCH 04/17] Nokia srl prompt stripping (#3531) Co-authored-by: Jeff Kala --- netmiko/nokia/nokia_srl.py | 26 +++++++++++ tests/unit/test_base_connection.py | 70 +++++++++++++++++++++++++++++- 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/netmiko/nokia/nokia_srl.py b/netmiko/nokia/nokia_srl.py index 781467aeb..2c7410d8a 100644 --- a/netmiko/nokia/nokia_srl.py +++ b/netmiko/nokia/nokia_srl.py @@ -53,6 +53,32 @@ def session_preparation(self) -> None: self.disable_paging(command=command, cmd_verify=True, pattern=r"#") self.set_base_prompt() + def strip_prompt(self, *args: Any, **kwargs: Any) -> str: + """Strip the prompt and the additional context line""" + a_string = super().strip_prompt(*args, **kwargs) + return self._strip_context_items(a_string) + + def _strip_context_items(self, a_string: str) -> str: + """Strip NokiaSRL-specific output. + + Nokia will put extra context in the 1st line of the prompt, such as: + --{ running }--[ ]-- + --{ candidate private private-admin }--[ ]-- + --{ candidate private private-admin }--[ ]-- + + This method removes those lines. + """ + strings_to_strip = [ + r"--{.*\B", + ] + + response_list = a_string.split(self.RESPONSE_RETURN) + last_line = response_list[-1] + for pattern in strings_to_strip: + if re.search(pattern, last_line, flags=re.I): + return self.RESPONSE_RETURN.join(response_list[:-1]) + return a_string + def set_base_prompt( self, pri_prompt_terminator: str = "#", diff --git a/tests/unit/test_base_connection.py b/tests/unit/test_base_connection.py index 01ea8fa0f..9f5a6ddcb 100755 --- a/tests/unit/test_base_connection.py +++ b/tests/unit/test_base_connection.py @@ -1,5 +1,5 @@ #!/usr/bin/env python - +import pytest import time from os.path import dirname, join from threading import Lock @@ -553,3 +553,71 @@ def test_disable_sha2_fix(): assert {"rsa-sha2-512", "rsa-sha2-256"} & allowed_pubkeys == set() connection.disconnect() + + +TEST_CASES = [ + ("some important data\n--{ running }--[ ]--\nA:srl1#", "some important data"), + ( + "more data\nsome important data\n--{ running }--[ ]--\nA:srl1#", + "more data\nsome important data", + ), + ( + "more data\nsome important data\n--{ candidate private private-admin }--[ ]--\nA:srl1#", + "more data\nsome important data", + ), + ( + "more data\nsome important data\n--{ candidate private private-admin }--[ ]--\nA:srl1#", + "more data\nsome important data", + ), + ( + """ +{ + "basic system info": { + "Hostname": "srl1", + "Chassis Type": "7220 IXR-D2L", + "Part Number": "Sim Part No.", + "Serial Number": "Sim Serial No.", + "System HW MAC Address": "1A:03:00:FF:00:00", + "OS": "SR Linux", + "Software Version": "v24.7.2", + "Build Number": "319-g64b71941f7", + "Architecture": "", + "Last Booted": "2024-11-01T17:21:00.164Z", + "Total Memory": "", + "Free Memory": "" + } +} + +--{ running }--[ ]-- +A:srl1#""", + """ +{ + "basic system info": { + "Hostname": "srl1", + "Chassis Type": "7220 IXR-D2L", + "Part Number": "Sim Part No.", + "Serial Number": "Sim Serial No.", + "System HW MAC Address": "1A:03:00:FF:00:00", + "OS": "SR Linux", + "Software Version": "v24.7.2", + "Build Number": "319-g64b71941f7", + "Architecture": "", + "Last Booted": "2024-11-01T17:21:00.164Z", + "Total Memory": "", + "Free Memory": "" + } +} +""", + ), +] + + +@pytest.mark.parametrize("test_string,expected", TEST_CASES) +def test_nokiasrl_prompt_stripping(test_string, expected): + conn = ConnectHandler( + host="testhost", + device_type="nokia_srl", + auto_connect=False, # No need to connect for the test purposes + ) + result = conn.strip_prompt(a_string=test_string) + assert result == expected From 0697340bfa6feda312ff3e3c931a3ae1949be5e0 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Mon, 11 Nov 2024 11:00:38 -0800 Subject: [PATCH 05/17] Adding working doc explaining the encryption handling process (#3533) --- ENCRYPTION_HANDLING.md | 148 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 ENCRYPTION_HANDLING.md diff --git a/ENCRYPTION_HANDLING.md b/ENCRYPTION_HANDLING.md new file mode 100644 index 000000000..1e5113a2c --- /dev/null +++ b/ENCRYPTION_HANDLING.md @@ -0,0 +1,148 @@ +# Netmiko Encryption Handling + +This document describes the encryption mechanisms available in Netmiko for handling sensitive data in configuration files. These mechanisms are generally intended for use with `~/.netmiko.yml` and Netmiko Tools. + +## Overview + +Netmiko provides built-in encryption capabilities to secure sensitive data (like passwords) in your Netmiko Tools YAML configuration files. The encryption system is flexible and supports multiple encryption types. + +## Configuration + +### Basic Setup + +Encryption is configured in the `~/.netmiko.yml` file using the `__meta__` field: + +```yaml +__meta__: + encryption: true + encryption_type: fernet # or aes128 +``` + +The two supported encryption types are: +- `fernet` (recommended) +- `aes128` + +### Encryption Key + +The encryption key is read from the environment variable `NETMIKO_TOOLS_KEY`. This should be a secure, randomly-generated key appropriate for the chosen encryption type. + +```bash +# Example of setting the encryption key +export NETMIKO_TOOLS_KEY="your-secure-key-here" +``` + +## Using Encryption + +### Encrypted Values in YAML + +When encryption is enabled, Netmiko looks for fields that start with `__encrypt__`. For example: + +```yaml +arista1: + device_type: arista_eos + host: arista1.domain.com + username: pyclass + password: > + __encrypt__ifcs7SWOUER4m1K3ZEZYlw==:Z0FBQUFBQm5CQ9lrdV9BVS0xOWxYelF1Yml + zV3hBcnF4am1SWjRYNnVSRGdBb1FPVmJ2Q2EzX1RjTWxYMVVMdlBZSXVqYWVqUVNASXNRO + FBpR1MxRTkxN2J0NWxVeZNKT0E9PQ== +``` + +### Encryption Functions + +#### Encrypting Values + +To encrypt a value, use the `encrypt_value` function: + +```python +def encrypt_value(value: str, key: bytes, encryption_type: str) -> str: + """ + Encrypt a value using the specified encryption type. + + Args: + value: The string to encrypt + key: Encryption key as bytes + encryption_type: Either 'fernet' or 'aes128' + + Returns: + Encrypted string with '__encrypt__' prefix + """ +``` + +#### Decrypting Values + +To decrypt a value, use the `decrypt_value` function: + +```python +def decrypt_value(encrypted_value: str, key: bytes, encryption_type: str) -> str: + """ + Decrypt a value using the specified encryption type. + + Args: + encrypted_value: The encrypted string (including '__encrypt__' prefix) + key: Encryption key as bytes + encryption_type: Either 'fernet' or 'aes128' + + Returns: + Decrypted string + """ +``` + +#### Getting the Encryption Key + +To retrieve the encryption key from the environment: + +```python +def get_encryption_key() -> bytes: + """ + Retrieve the encryption key from NETMIKO_TOOLS_KEY environment variable. + + Returns: + Encryption key as bytes + """ +``` + +## Example Usage + +Here's a complete example of how to use encryption in your code: + +```python +from netmiko.encryption_handling import encrypt_value, get_encryption_key +from netmiko.encryption_handling import decrypt_value + +# Get the encryption key from environment +key = get_encryption_key() + +# Encrypt a password +password = "my_secure_password" +encrypted_password = encrypt_value(password, key, "fernet") + +# The encrypted password can now be stored in your YAML file +# It will automatically be decrypted when Netmiko Tools reads the +# file (assuming you have properly set the '__meta__' fields +``` + +Alternatively, you can decrypt the value by calling + +```python +clear_value = decrypt_value(encrypted_value, key, encryption_type="fernet) +``` + +Or you can create a simple function to decrypt all of the fields in the YAML +file dynamically (by looking for any fields that start with `__encrypt__`). + +Netmiko's 'encryption_handling.py' implements this using the 'decrypt_config' +function, but this function is a specific to Netmiko Tools' .netmiko.yml format +(i.e. it will need modified if you want to use it in a more generic context). + +## Implementation Notes + +1. Encryption is processed transparently when Netmiko Tools reads the YAML file +2. Only fields prefixed with `__encrypt__` are processed for decryption +3. The encryption type is determined by the `__meta__` section + +## Security Considerations + +1. Store the `NETMIKO_TOOLS_KEY` securely and never commit it to version control +2. Fernet encryption is recommended over AES128 as it includes additional security features +3. Encrypted values in YAML files should still be treated as sensitive data From 9f53c1858d7b2a17b41327622763ef050a559c5b Mon Sep 17 00:00:00 2001 From: Oscar Pachano Date: Tue, 12 Nov 2024 18:32:10 -0800 Subject: [PATCH 06/17] 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 a5309fe32320512823ab70ed4f52e7ff1ab3f3c2 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Fri, 22 Nov 2024 12:49:24 -0700 Subject: [PATCH 07/17] Lower cisco ios priority to eliminate conflicts with Cisco-XE (#3538) --- netmiko/ssh_autodetect.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netmiko/ssh_autodetect.py b/netmiko/ssh_autodetect.py index 15d48c8d9..36def47d6 100644 --- a/netmiko/ssh_autodetect.py +++ b/netmiko/ssh_autodetect.py @@ -107,7 +107,7 @@ "Cisco IOS Software", "Cisco Internetwork Operating System Software", ], - "priority": 99, + "priority": 95, "dispatch": "_autodetect_std", }, "cisco_xe": { From ea5fa52a123d01730b1f3ffbfed0ee61bdc9d47b Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Sun, 24 Nov 2024 20:43:51 -0800 Subject: [PATCH 08/17] Minor cleanup (#3539) --- netmiko/cli_tools/netmiko_show.py | 2 -- tests/unit/test_clitools_helpers.py | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/netmiko/cli_tools/netmiko_show.py b/netmiko/cli_tools/netmiko_show.py index 09d743bf7..646529bdf 100755 --- a/netmiko/cli_tools/netmiko_show.py +++ b/netmiko/cli_tools/netmiko_show.py @@ -15,8 +15,6 @@ COMMAND = "netmiko-show" -# FIX: --list-devices currently fails due to missing 'device/group' - def main_ep(): sys.exit(main(sys.argv[1:])) diff --git a/tests/unit/test_clitools_helpers.py b/tests/unit/test_clitools_helpers.py index 601197077..7803410c5 100644 --- a/tests/unit/test_clitools_helpers.py +++ b/tests/unit/test_clitools_helpers.py @@ -52,6 +52,7 @@ def test_ssh_conn_failure(mock_connecthandler): def test_obtain_devices_all(netmiko_yml, monkeypatch, set_encryption_key): yml_path = BASE_YAML_PATH / netmiko_yml monkeypatch.setenv("NETMIKO_TOOLS_CFG", str(yml_path)) + set_encryption_key() result = obtain_devices("all") From 8c3177b0bf526a6ff862bece632eacac938fd97d Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Mon, 9 Dec 2024 13:32:16 -0800 Subject: [PATCH 09/17] Expand space available setting (#3542) --- tests/test_netmiko_scp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_netmiko_scp.py b/tests/test_netmiko_scp.py index 8651a68c3..e9cd6ba4f 100755 --- a/tests/test_netmiko_scp.py +++ b/tests/test_netmiko_scp.py @@ -29,7 +29,7 @@ def test_verify_space_available_put(scp_fixture): ssh_conn, scp_transfer = scp_fixture assert scp_transfer.verify_space_available() is True # intentional make there not be enough space available - scp_transfer.file_size = 100_000_000_000 + scp_transfer.file_size = 200_000_000_000 assert scp_transfer.verify_space_available() is False From 7ce4f41c8e44a78e1f84986bc5368418501cdcf6 Mon Sep 17 00:00:00 2001 From: Kirk Byers Date: Mon, 9 Dec 2024 13:43:30 -0800 Subject: [PATCH 10/17] Netmiko v4.5.0 Release (#3544) * Update docs * Roll version --- docs/netmiko/a10/a10_ssh.html | 80 +- docs/netmiko/a10/index.html | 60 +- docs/netmiko/accedian/accedian_ssh.html | 95 +- docs/netmiko/accedian/index.html | 66 +- docs/netmiko/adtran/adtran.html | 179 +- docs/netmiko/adtran/index.html | 36 +- docs/netmiko/adva/adva_aos_fsp_150_f2.html | 123 +- docs/netmiko/adva/adva_aos_fsp_150_f3.html | 228 +- docs/netmiko/adva/index.html | 111 +- docs/netmiko/alaxala/alaxala_ax36s.html | 541 ++ docs/netmiko/alaxala/index.html | 267 + docs/netmiko/alcatel/alcatel_aos_ssh.html | 73 +- docs/netmiko/alcatel/index.html | 51 +- .../allied_telesis/allied_telesis_awplus.html | 115 +- docs/netmiko/allied_telesis/index.html | 36 +- docs/netmiko/apresia/apresia_aeos.html | 87 +- docs/netmiko/apresia/index.html | 36 +- docs/netmiko/arista/arista.html | 284 +- docs/netmiko/arista/index.html | 36 +- docs/netmiko/arris/arris_cer.html | 104 +- docs/netmiko/arris/index.html | 68 +- docs/netmiko/aruba/aruba_aoscx.html | 91 +- docs/netmiko/aruba/aruba_os.html | 132 +- docs/netmiko/aruba/index.html | 97 +- docs/netmiko/audiocode/audiocode_ssh.html | 607 +- docs/netmiko/audiocode/index.html | 50 +- docs/netmiko/base_connection.html | 5135 +---------------- docs/netmiko/broadcom/broadcom_icos_ssh.html | 125 +- docs/netmiko/broadcom/index.html | 80 +- docs/netmiko/brocade/brocade_fos_ssh.html | 50 +- docs/netmiko/brocade/index.html | 36 +- docs/netmiko/calix/calix_b6.html | 208 +- docs/netmiko/calix/index.html | 36 +- docs/netmiko/casa/casa_cmts.html | 162 +- docs/netmiko/casa/index.html | 98 +- docs/netmiko/cdot/cdot_cros_ssh.html | 255 +- docs/netmiko/cdot/index.html | 140 +- docs/netmiko/centec/centec_os.html | 84 +- docs/netmiko/centec/index.html | 36 +- docs/netmiko/channel.html | 227 +- .../checkpoint/checkpoint_gaia_ssh.html | 71 +- docs/netmiko/checkpoint/index.html | 50 +- docs/netmiko/ciena/ciena_saos.html | 332 +- docs/netmiko/ciena/index.html | 84 +- docs/netmiko/cisco/cisco_apic.html | 261 + docs/netmiko/cisco/cisco_asa_ssh.html | 380 +- docs/netmiko/cisco/cisco_ftd_ssh.html | 85 +- docs/netmiko/cisco/cisco_ios.html | 414 +- docs/netmiko/cisco/cisco_nxos_ssh.html | 246 +- docs/netmiko/cisco/cisco_s200.html | 194 +- docs/netmiko/cisco/cisco_s300.html | 88 +- docs/netmiko/cisco/cisco_tp_tcce.html | 221 +- docs/netmiko/cisco/cisco_viptela.html | 169 +- docs/netmiko/cisco/cisco_wlc_ssh.html | 516 +- docs/netmiko/cisco/cisco_xr.html | 566 +- docs/netmiko/cisco/index.html | 1010 +--- docs/netmiko/cisco_base_connection.html | 560 +- docs/netmiko/citrix/index.html | 87 +- docs/netmiko/citrix/netscaler_ssh.html | 130 +- docs/netmiko/cli_tools/argument_handling.html | 104 + docs/netmiko/cli_tools/helpers.html | 85 + docs/netmiko/cli_tools/index.html | 53 +- .../cli_tools/netmiko_bulk_encrypt.html | 83 + docs/netmiko/cli_tools/netmiko_cfg.html | 486 +- docs/netmiko/cli_tools/netmiko_encrypt.html | 76 + docs/netmiko/cli_tools/netmiko_grep.html | 478 +- docs/netmiko/cli_tools/netmiko_show.html | 476 +- docs/netmiko/cli_tools/outputters.html | 119 + docs/netmiko/cloudgenix/cloudgenix_ion.html | 106 +- docs/netmiko/cloudgenix/index.html | 63 +- docs/netmiko/coriant/coriant_ssh.html | 91 +- docs/netmiko/coriant/index.html | 64 +- docs/netmiko/dell/dell_dnos6.html | 81 +- docs/netmiko/dell/dell_force10_ssh.html | 97 +- docs/netmiko/dell/dell_isilon_ssh.html | 222 +- docs/netmiko/dell/dell_os10_ssh.html | 223 +- docs/netmiko/dell/dell_powerconnect.html | 231 +- docs/netmiko/dell/dell_sonic_ssh.html | 85 +- docs/netmiko/dell/index.html | 247 +- docs/netmiko/digi/digi_transport.html | 61 +- docs/netmiko/digi/index.html | 36 +- docs/netmiko/dlink/dlink_ds.html | 104 +- docs/netmiko/dlink/index.html | 36 +- docs/netmiko/eltex/eltex_esr_ssh.html | 252 +- docs/netmiko/eltex/eltex_ssh.html | 67 +- docs/netmiko/eltex/index.html | 141 +- docs/netmiko/encryption_handling.html | 90 + docs/netmiko/endace/endace_ssh.html | 99 +- docs/netmiko/endace/index.html | 36 +- docs/netmiko/enterasys/enterasys_ssh.html | 69 +- docs/netmiko/enterasys/index.html | 54 +- docs/netmiko/ericsson/ericsson_ipos.html | 306 +- docs/netmiko/ericsson/ericsson_mltn.html | 262 +- docs/netmiko/ericsson/index.html | 156 +- docs/netmiko/exceptions.html | 116 +- docs/netmiko/extreme/extreme_ers_ssh.html | 199 +- docs/netmiko/extreme/extreme_exos.html | 329 +- docs/netmiko/extreme/extreme_netiron.html | 92 +- docs/netmiko/extreme/extreme_nos_ssh.html | 90 +- docs/netmiko/extreme/extreme_slx_ssh.html | 90 +- .../netmiko/extreme/extreme_tierraos_ssh.html | 90 +- docs/netmiko/extreme/extreme_vsp_ssh.html | 82 +- docs/netmiko/extreme/extreme_wing_ssh.html | 56 +- docs/netmiko/extreme/index.html | 262 +- docs/netmiko/f5/f5_linux_ssh.html | 38 +- docs/netmiko/f5/f5_tmsh_ssh.html | 121 +- docs/netmiko/f5/index.html | 87 +- docs/netmiko/fiberstore/fiberstore_fsos.html | 188 +- docs/netmiko/fiberstore/index.html | 82 +- docs/netmiko/flexvnf/flexvnf_ssh.html | 430 +- docs/netmiko/flexvnf/index.html | 228 +- docs/netmiko/fortinet/fortinet_ssh.html | 501 +- docs/netmiko/fortinet/index.html | 284 +- docs/netmiko/garderos/garderos_grs.html | 519 ++ docs/netmiko/garderos/index.html | 531 ++ docs/netmiko/hillstone/hillstone.html | 113 +- docs/netmiko/hillstone/index.html | 36 +- docs/netmiko/hp/hp_comware.html | 297 +- docs/netmiko/hp/hp_procurve.html | 419 +- docs/netmiko/hp/index.html | 60 +- docs/netmiko/huawei/huawei.html | 561 +- docs/netmiko/huawei/huawei_smartax.html | 216 +- docs/netmiko/huawei/index.html | 200 +- docs/netmiko/index.html | 2606 +-------- docs/netmiko/ipinfusion/index.html | 39 +- docs/netmiko/ipinfusion/ipinfusion_ocnos.html | 133 +- docs/netmiko/juniper/index.html | 68 +- docs/netmiko/juniper/juniper.html | 597 +- docs/netmiko/juniper/juniper_screenos.html | 96 +- docs/netmiko/keymile/index.html | 82 +- docs/netmiko/keymile/keymile_nos_ssh.html | 76 +- docs/netmiko/keymile/keymile_ssh.html | 112 +- docs/netmiko/linux/index.html | 207 +- docs/netmiko/linux/linux_ssh.html | 431 +- docs/netmiko/maipu/index.html | 37 +- docs/netmiko/maipu/maipu.html | 94 +- docs/netmiko/mellanox/index.html | 105 +- .../netmiko/mellanox/mellanox_mlnxos_ssh.html | 202 +- docs/netmiko/mikrotik/index.html | 97 +- docs/netmiko/mikrotik/mikrotik_ssh.html | 532 +- docs/netmiko/mrv/index.html | 133 +- docs/netmiko/mrv/mrv_lx.html | 123 +- docs/netmiko/mrv/mrv_ssh.html | 150 +- docs/netmiko/netapp/index.html | 58 +- docs/netmiko/netapp/netapp_cdot_ssh.html | 97 +- docs/netmiko/netgear/index.html | 51 +- docs/netmiko/netgear/netgear_prosafe_ssh.html | 110 +- docs/netmiko/netmiko_globals.html | 35 +- docs/netmiko/no_config.html | 83 +- docs/netmiko/no_enable.html | 96 +- docs/netmiko/nokia/index.html | 193 +- docs/netmiko/nokia/nokia_srl.html | 291 +- docs/netmiko/nokia/nokia_sros.html | 701 +-- docs/netmiko/oneaccess/index.html | 36 +- docs/netmiko/oneaccess/oneaccess_oneos.html | 114 +- docs/netmiko/ovs/index.html | 36 +- docs/netmiko/ovs/ovs_linux_ssh.html | 38 +- docs/netmiko/paloalto/index.html | 36 +- docs/netmiko/paloalto/paloalto_panos.html | 518 +- docs/netmiko/pluribus/index.html | 50 +- docs/netmiko/pluribus/pluribus_ssh.html | 68 +- docs/netmiko/quanta/index.html | 51 +- docs/netmiko/quanta/quanta_mesh_ssh.html | 75 +- docs/netmiko/rad/index.html | 67 +- docs/netmiko/rad/rad_etx.html | 227 +- docs/netmiko/raisecom/index.html | 66 +- docs/netmiko/raisecom/raisecom_roap.html | 247 +- docs/netmiko/ruckus/index.html | 37 +- docs/netmiko/ruckus/ruckus_fastiron.html | 226 +- docs/netmiko/ruijie/index.html | 36 +- docs/netmiko/ruijie/ruijie_os.html | 101 +- docs/netmiko/scp_functions.html | 344 +- docs/netmiko/scp_handler.html | 795 +-- docs/netmiko/session_log.html | 202 +- docs/netmiko/sixwind/index.html | 36 +- docs/netmiko/sixwind/sixwind_os.html | 265 +- docs/netmiko/snmp_autodetect.html | 663 +-- docs/netmiko/sophos/index.html | 80 +- docs/netmiko/sophos/sophos_sfos_ssh.html | 121 +- docs/netmiko/ssh_auth.html | 45 +- docs/netmiko/ssh_autodetect.html | 634 +- docs/netmiko/supermicro/index.html | 36 +- docs/netmiko/supermicro/smci_smis.html | 104 +- docs/netmiko/teldat/index.html | 36 +- docs/netmiko/teldat/teldat_cit.html | 299 +- docs/netmiko/telnet_proxy.html | 137 +- docs/netmiko/terminal_server/index.html | 44 +- .../terminal_server/terminal_server.html | 82 +- docs/netmiko/tplink/index.html | 59 +- docs/netmiko/tplink/tplink_jetstream.html | 385 +- docs/netmiko/ubiquiti/edge_ssh.html | 189 +- docs/netmiko/ubiquiti/edgerouter_ssh.html | 156 +- docs/netmiko/ubiquiti/index.html | 174 +- docs/netmiko/ubiquiti/unifiswitch_ssh.html | 99 +- docs/netmiko/utilities.html | 1384 +---- docs/netmiko/vertiv/index.html | 268 + docs/netmiko/vertiv/vertiv_mph_ssh.html | 490 ++ docs/netmiko/vyos/index.html | 172 +- docs/netmiko/vyos/vyos_ssh.html | 315 +- docs/netmiko/watchguard/fireware_ssh.html | 113 +- docs/netmiko/watchguard/index.html | 72 +- docs/netmiko/yamaha/index.html | 37 +- docs/netmiko/yamaha/yamaha.html | 200 +- docs/netmiko/zte/index.html | 37 +- docs/netmiko/zte/zte_zxros.html | 136 +- docs/netmiko/zyxel/index.html | 79 +- docs/netmiko/zyxel/zyxel_ssh.html | 105 +- netmiko/__init__.py | 2 +- release_process.txt | 2 +- 209 files changed, 7321 insertions(+), 38085 deletions(-) create mode 100644 docs/netmiko/alaxala/alaxala_ax36s.html create mode 100644 docs/netmiko/alaxala/index.html create mode 100644 docs/netmiko/cisco/cisco_apic.html create mode 100644 docs/netmiko/cli_tools/argument_handling.html create mode 100644 docs/netmiko/cli_tools/helpers.html create mode 100644 docs/netmiko/cli_tools/netmiko_bulk_encrypt.html create mode 100644 docs/netmiko/cli_tools/netmiko_encrypt.html create mode 100644 docs/netmiko/cli_tools/outputters.html create mode 100644 docs/netmiko/encryption_handling.html create mode 100644 docs/netmiko/garderos/garderos_grs.html create mode 100644 docs/netmiko/garderos/index.html create mode 100644 docs/netmiko/vertiv/index.html create mode 100644 docs/netmiko/vertiv/vertiv_mph_ssh.html diff --git a/docs/netmiko/a10/a10_ssh.html b/docs/netmiko/a10/a10_ssh.html index e90c924a7..50699d38e 100644 --- a/docs/netmiko/a10/a10_ssh.html +++ b/docs/netmiko/a10/a10_ssh.html @@ -2,18 +2,21 @@ - - + + netmiko.a10.a10_ssh API documentation - - - - - - + + + + + + - - + +
@@ -23,34 +26,6 @@

Module netmiko.a10.a10_ssh

A10 support.

-
- -Expand source code - -
"""A10 support."""
-
-from netmiko.cisco_base_connection import CiscoSSHConnection
-
-
-class A10SSH(CiscoSSHConnection):
-    """A10 support."""
-
-    def session_preparation(self) -> None:
-        """A10 requires to be enable mode to disable paging."""
-        self._test_channel_read(pattern=r"[>#]")
-        self.set_base_prompt()
-        self.enable()
-
-        # terminal width ill not do anything without A10 specific command
-        # self.set_terminal_width()
-        self.disable_paging(command="terminal length 0")
-
-    def save_config(
-        self, cmd: str = "", confirm: bool = False, confirm_response: str = ""
-    ) -> str:
-        """Not Implemented"""
-        raise NotImplementedError
-
@@ -222,36 +197,12 @@

Methods

Not Implemented

-
- -Expand source code - -
def save_config(
-    self, cmd: str = "", confirm: bool = False, confirm_response: str = ""
-) -> str:
-    """Not Implemented"""
-    raise NotImplementedError
-
def session_preparation(self) ‑> None

A10 requires to be enable mode to disable paging.

-
- -Expand source code - -
def session_preparation(self) -> None:
-    """A10 requires to be enable mode to disable paging."""
-    self._test_channel_read(pattern=r"[>#]")
-    self.set_base_prompt()
-    self.enable()
-
-    # terminal width ill not do anything without A10 specific command
-    # self.set_terminal_width()
-    self.disable_paging(command="terminal length 0")
-

Inherited members

@@ -305,7 +256,6 @@

Inherited members