Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

netmiko_file_transfer failing on Cisco 4331 router #70

Open
aj-cruz opened this issue Dec 16, 2023 · 3 comments
Open

netmiko_file_transfer failing on Cisco 4331 router #70

aj-cruz opened this issue Dec 16, 2023 · 3 comments

Comments

@aj-cruz
Copy link

aj-cruz commented Dec 16, 2023

Not sure if I'm doing something wrong or if this is a bug:
I'm getting an error trying to do a netmiko_file_transfer to a Cisco 4331 running IOS-XE 3.16.05.s.
Tested on python 3.9.18 & 3.11.7.
Using cisco_ios device type.

Here are the python package versions:
netmiko==4.3.0
netutils==1.6.0
nornir==3.4.1
nornir-jinja2==0.2.0
nornir-napalm==0.4.0
nornir-nautobot==3.0.0
nornir-netmiko==1.0.1
nornir-utils==0.2.0
paramiko==3.3.1
scp==0.14.5

I'm using the Nornir Nautobot plugin in a Nautobot job. The job looks like this in part:

    def run(self, site, device_type):
        self.devices_queryset = build_active_device_list(site, device_type)
        self.file_name = "/opt/nautobot/jobs/testfile.txt"

        nornir_client = InitNornir(
            runner={"options": {"num_workers": 20}},
            inventory={
                "plugin": "nautobot-inventory",
                "options": {
                    "credentials_class": "nautobot_plugin_nornir.plugins.credentials.nautobot_secrets.CredentialsNautobotSecrets",
                    "queryset": self.devices_queryset,
                    "ssl_verify": False,
                },
            },
            logging={"enabled": False},
        )

        result = nornir_client.run(
            task = netmiko_file_transfer,
            source_file = self.file_name,
            dest_file = self.file_name,
            direction = "put",
        )

When I run the job (python logging enabled for "paramiko" & "nornir_netmiko") my docker compose logs show:

celery-worker  | [2023-12-16 19:27:07,461: DEBUG/ForkPoolWorker-7] starting thread (client mode): 0xbeecb410
celery-worker  | [2023-12-16 19:27:07,462: DEBUG/ForkPoolWorker-7] Local version/idstring: SSH-2.0-paramiko_3.3.1
celery-worker  | [2023-12-16 19:27:07,468: DEBUG/ForkPoolWorker-7] Remote version/idstring: SSH-2.0-Cisco-1.25
celery-worker  | [2023-12-16 19:27:07,468: INFO/ForkPoolWorker-7] Connected (version 2.0, client Cisco-1.25)
celery-worker  | [2023-12-16 19:27:07,482: DEBUG/ForkPoolWorker-7] === Key exchange possibilities ===
celery-worker  | [2023-12-16 19:27:07,483: DEBUG/ForkPoolWorker-7] kex algos: diffie-hellman-group-exchange-sha1, diffie-hellman-group14-sha1, diffie-hellman-group1-sha1
celery-worker  | [2023-12-16 19:27:07,483: DEBUG/ForkPoolWorker-7] server key: ssh-rsa
celery-worker  | [2023-12-16 19:27:07,483: DEBUG/ForkPoolWorker-7] client encrypt: aes128-ctr, aes192-ctr, aes256-ctr, aes128-cbc, 3des-cbc, aes192-cbc, aes256-cbc
celery-worker  | [2023-12-16 19:27:07,483: DEBUG/ForkPoolWorker-7] server encrypt: aes128-ctr, aes192-ctr, aes256-ctr, aes128-cbc, 3des-cbc, aes192-cbc, aes256-cbc
celery-worker  | [2023-12-16 19:27:07,483: DEBUG/ForkPoolWorker-7] client mac: hmac-sha1, hmac-sha1-96
celery-worker  | [2023-12-16 19:27:07,483: DEBUG/ForkPoolWorker-7] server mac: hmac-sha1, hmac-sha1-96
celery-worker  | [2023-12-16 19:27:07,484: DEBUG/ForkPoolWorker-7] client compress: none
celery-worker  | [2023-12-16 19:27:07,484: DEBUG/ForkPoolWorker-7] server compress: none
celery-worker  | [2023-12-16 19:27:07,484: DEBUG/ForkPoolWorker-7] client lang: <none>
celery-worker  | [2023-12-16 19:27:07,484: DEBUG/ForkPoolWorker-7] server lang: <none>
celery-worker  | [2023-12-16 19:27:07,484: DEBUG/ForkPoolWorker-7] kex follows: False
celery-worker  | [2023-12-16 19:27:07,484: DEBUG/ForkPoolWorker-7] === Key exchange agreements ===
celery-worker  | [2023-12-16 19:27:07,484: DEBUG/ForkPoolWorker-7] Kex: diffie-hellman-group-exchange-sha1
celery-worker  | [2023-12-16 19:27:07,484: DEBUG/ForkPoolWorker-7] HostKey: ssh-rsa
celery-worker  | [2023-12-16 19:27:07,484: DEBUG/ForkPoolWorker-7] Cipher: aes128-ctr
celery-worker  | [2023-12-16 19:27:07,484: DEBUG/ForkPoolWorker-7] MAC: hmac-sha1
celery-worker  | [2023-12-16 19:27:07,485: DEBUG/ForkPoolWorker-7] Compression: none
celery-worker  | [2023-12-16 19:27:07,485: DEBUG/ForkPoolWorker-7] === End of kex handshake ===
celery-worker  | [2023-12-16 19:27:07,490: DEBUG/ForkPoolWorker-7] Got server p (2048 bits)
celery-worker  | [2023-12-16 19:27:07,649: DEBUG/ForkPoolWorker-7] kex engine KexGex specified hash_algo <built-in function openssl_sha1>
celery-worker  | [2023-12-16 19:27:07,650: DEBUG/ForkPoolWorker-7] Switch to new keys ...
celery-worker  | [2023-12-16 19:27:07,651: DEBUG/ForkPoolWorker-7] Adding ssh-rsa host key for 192.168.254.40: b'51038c0a0275d10c565483889418189a'
celery-worker  | [2023-12-16 19:27:07,858: DEBUG/ForkPoolWorker-7] userauth is OK
celery-worker  | [2023-12-16 19:27:07,864: INFO/ForkPoolWorker-7] Authentication (password) successful!
celery-worker  | [2023-12-16 19:27:07,865: DEBUG/ForkPoolWorker-7] [chan 0] Max packet in: 32768 bytes
celery-worker  | [2023-12-16 19:27:07,868: DEBUG/ForkPoolWorker-7] [chan 0] Max packet out: 4096 bytes
celery-worker  | [2023-12-16 19:27:07,868: DEBUG/ForkPoolWorker-7] Secsh channel 0 opened.
celery-worker  | [2023-12-16 19:27:07,872: DEBUG/ForkPoolWorker-7] [chan 0] Sesch channel 0 request ok
celery-worker  | [2023-12-16 19:27:07,878: DEBUG/ForkPoolWorker-7] [chan 0] Sesch channel 0 request ok
celery-worker  | [2023-12-16 19:27:08,692: DEBUG/ForkPoolWorker-7] starting thread (client mode): 0xbeeadd90
celery-worker  | [2023-12-16 19:27:08,692: DEBUG/ForkPoolWorker-7] Local version/idstring: SSH-2.0-paramiko_3.3.1
celery-worker  | [2023-12-16 19:27:08,697: DEBUG/ForkPoolWorker-7] Remote version/idstring: SSH-2.0-Cisco-1.25
celery-worker  | [2023-12-16 19:27:08,697: INFO/ForkPoolWorker-7] Connected (version 2.0, client Cisco-1.25)
celery-worker  | [2023-12-16 19:27:08,702: DEBUG/ForkPoolWorker-7] === Key exchange possibilities ===
celery-worker  | [2023-12-16 19:27:08,702: DEBUG/ForkPoolWorker-7] kex algos: diffie-hellman-group-exchange-sha1, diffie-hellman-group14-sha1, diffie-hellman-group1-sha1
celery-worker  | [2023-12-16 19:27:08,702: DEBUG/ForkPoolWorker-7] server key: ssh-rsa
celery-worker  | [2023-12-16 19:27:08,702: DEBUG/ForkPoolWorker-7] client encrypt: aes128-ctr, aes192-ctr, aes256-ctr, aes128-cbc, 3des-cbc, aes192-cbc, aes256-cbc
celery-worker  | [2023-12-16 19:27:08,703: DEBUG/ForkPoolWorker-7] server encrypt: aes128-ctr, aes192-ctr, aes256-ctr, aes128-cbc, 3des-cbc, aes192-cbc, aes256-cbc
celery-worker  | [2023-12-16 19:27:08,703: DEBUG/ForkPoolWorker-7] client mac: hmac-sha1, hmac-sha1-96
celery-worker  | [2023-12-16 19:27:08,703: DEBUG/ForkPoolWorker-7] server mac: hmac-sha1, hmac-sha1-96
celery-worker  | [2023-12-16 19:27:08,703: DEBUG/ForkPoolWorker-7] client compress: none
celery-worker  | [2023-12-16 19:27:08,703: DEBUG/ForkPoolWorker-7] server compress: none
celery-worker  | [2023-12-16 19:27:08,704: DEBUG/ForkPoolWorker-7] client lang: <none>
celery-worker  | [2023-12-16 19:27:08,704: DEBUG/ForkPoolWorker-7] server lang: <none>
celery-worker  | [2023-12-16 19:27:08,704: DEBUG/ForkPoolWorker-7] kex follows: False
celery-worker  | [2023-12-16 19:27:08,704: DEBUG/ForkPoolWorker-7] === Key exchange agreements ===
celery-worker  | [2023-12-16 19:27:08,705: DEBUG/ForkPoolWorker-7] Kex: diffie-hellman-group-exchange-sha1
celery-worker  | [2023-12-16 19:27:08,705: DEBUG/ForkPoolWorker-7] HostKey: ssh-rsa
celery-worker  | [2023-12-16 19:27:08,705: DEBUG/ForkPoolWorker-7] Cipher: aes128-ctr
celery-worker  | [2023-12-16 19:27:08,705: DEBUG/ForkPoolWorker-7] MAC: hmac-sha1
celery-worker  | [2023-12-16 19:27:08,706: DEBUG/ForkPoolWorker-7] Compression: none
celery-worker  | [2023-12-16 19:27:08,706: DEBUG/ForkPoolWorker-7] === End of kex handshake ===
celery-worker  | [2023-12-16 19:27:08,710: DEBUG/ForkPoolWorker-7] Got server p (2048 bits)
celery-worker  | [2023-12-16 19:27:08,918: DEBUG/ForkPoolWorker-7] kex engine KexGex specified hash_algo <built-in function openssl_sha1>
celery-worker  | [2023-12-16 19:27:08,919: DEBUG/ForkPoolWorker-7] Switch to new keys ...
celery-worker  | [2023-12-16 19:27:08,920: DEBUG/ForkPoolWorker-7] Adding ssh-rsa host key for 192.168.254.40: b'51038c0a0275d10c565483889418189a'
celery-worker  | [2023-12-16 19:27:09,130: DEBUG/ForkPoolWorker-7] userauth is OK
celery-worker  | [2023-12-16 19:27:09,138: INFO/ForkPoolWorker-7] Authentication (password) successful!
celery-worker  | [2023-12-16 19:27:09,526: DEBUG/ForkPoolWorker-7] [chan 0] Max packet in: 32768 bytes
celery-worker  | [2023-12-16 19:27:09,531: DEBUG/ForkPoolWorker-7] [chan 0] Max packet out: 4096 bytes
celery-worker  | [2023-12-16 19:27:09,531: DEBUG/ForkPoolWorker-7] Secsh channel 0 opened.
celery-worker  | [2023-12-16 19:27:09,544: DEBUG/ForkPoolWorker-7] [chan 0] Sesch channel 0 request ok
celery-worker  | [2023-12-16 19:27:09,576: ERROR/ForkPoolWorker-7] Host 'ajlab-4331': task 'netmiko_file_transfer' failed with traceback:
celery-worker  | Traceback (most recent call last):
celery-worker  |   File "/opt/nautobot/.local/lib/python3.11/site-packages/nornir/core/task.py", line 99, in start
celery-worker  |     r = self.task(self, **self.params)
celery-worker  |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
celery-worker  |   File "/opt/nautobot/.local/lib/python3.11/site-packages/nornir_netmiko/tasks/netmiko_file_transfer.py", line 26, in netmiko_file_transfer
celery-worker  |     scp_result = file_transfer(
celery-worker  |                  ^^^^^^^^^^^^^^
celery-worker  |   File "/usr/local/lib/python3.11/site-packages/netmiko/scp_functions.py", line 149, in file_transfer
celery-worker  |     verifyspace_and_transferfile(scp_transfer)
celery-worker  |   File "/usr/local/lib/python3.11/site-packages/netmiko/scp_functions.py", line 50, in verifyspace_and_transferfile
celery-worker  |     scp_transfer.transfer_file()
celery-worker  |   File "/usr/local/lib/python3.11/site-packages/netmiko/scp_handler.py", line 393, in transfer_file
celery-worker  |     self.put_file()
celery-worker  |   File "/usr/local/lib/python3.11/site-packages/netmiko/scp_handler.py", line 408, in put_file
celery-worker  |     self.scp_conn.scp_transfer_file(self.source_file, destination)
celery-worker  |   File "/usr/local/lib/python3.11/site-packages/netmiko/scp_handler.py", line 56, in scp_transfer_file
celery-worker  |     self.scp_client.put(source_file, dest_file)
celery-worker  |   File "/usr/local/lib/python3.11/site-packages/scp.py", line 205, in put
celery-worker  |     self._send_files(files)
celery-worker  |   File "/usr/local/lib/python3.11/site-packages/scp.py", line 315, in _send_files
celery-worker  |     self._send_file(fl, name, mode, size)
celery-worker  |   File "/usr/local/lib/python3.11/site-packages/scp.py", line 342, in _send_file
celery-worker  |     self._recv_confirm()
celery-worker  |   File "/usr/local/lib/python3.11/site-packages/scp.py", line 410, in _recv_confirm
celery-worker  |     raise SCPException(asunicode(msg[1:]))
celery-worker  | scp.SCPException: Write failed
celery-worker  | 
celery-worker  | 
celery-worker  | [2023-12-16 19:27:09,669: DEBUG/ForkPoolWorker-7] EOF in transport thread
@aj-cruz
Copy link
Author

aj-cruz commented Dec 16, 2023

If I do a file_transfer with netmiko directly it works:

from netmiko import ConnectHandler, file_transfer

device = {
    "device_type": "cisco_ios",
    "host": "192.168.254.40",
    "username": "admin",
    "password": "admin",
    "fast_cli": True, # disable fast cli
    "conn_timeout": 20,
    "auth_timeout": 20,
    "session_log": "scp-session.log",
}

src_file = "testfile.txt"  # file on local machine
dest_file = "testfile.txt"  # file to put on remote device (usually identical to src_file)

with ConnectHandler(**device) as ssh_conn:
    print(f"Connected to {ssh_conn.host}:{ssh_conn.port}")

    print(
        f"Transferring {src_file} to flash:{dest_file} for {ssh_conn.host}, please wait..."
    )
    scp_transfer = file_transfer(
        ssh_conn,
        source_file=src_file,
        dest_file=dest_file,
        file_system="flash:",
        overwrite_file=True,
        verify_file=True,
    )

print(scp_transfer)

@aj-cruz
Copy link
Author

aj-cruz commented Dec 17, 2023

I tried to manually replicate some of the logic from netmiko_file_transfer so I could compare the task object to make sure the inputs were the same. I modified the net_connect object to make all the attributes match the known good file transfer that used netmiko directly.
I also made sure all the file_transfer arguments matched between the broken and known working.
It still doesn't work.

Here's the modifications I made to ensure the task object and file_transfer arguments matched:

def my_file_transfer(task, source_file, dest_file, direction, file_system, overwrite_file, verify_file, socket_timeout, disable_md5, progress):
            net_connect = task.host.get_connection(CONNECTION_NAME, task.nornir.config)
            net_connect.ssh_config_file = None
            net_connect.secret = ""
            net_connect.fast_cli = True
            net_connect.global_delay_factor = 0.1
            net_connect.conn_timeout = 10
            print("******************* DEBUG *********************")
            print(net_connect.__dict__)
            print("***********************************************")
            return file_transfer(
                net_connect,
                source_file=source_file,
                dest_file=dest_file,
                file_system="bootflash:",
                overwrite_file=True,
                verify_file=True,
                socket_timeout=30
            )

        result = nornir_client.run(
            task = my_file_transfer,
            source_file = self.file_name,
            dest_file = self.file_name,
            direction = "put",
            file_system="bootflash:",
            overwrite_file=True,
            verify_file=False,
            socket_timeout=30,
            disable_md5=True,
            progress=progress_bar,
        )

For comparison, here's what the debugs look like from the working job that uses netmiko directly:

celery-worker  | [2023-12-17 18:00:05,836: DEBUG/ForkPoolWorker-7] starting thread (client mode): 0xf7e40190
celery-worker  | [2023-12-17 18:00:05,837: DEBUG/ForkPoolWorker-7] Local version/idstring: SSH-2.0-paramiko_3.3.1
celery-worker  | [2023-12-17 18:00:05,838: DEBUG/ForkPoolWorker-7] Remote version/idstring: SSH-2.0-Cisco-1.25
celery-worker  | [2023-12-17 18:00:05,839: INFO/ForkPoolWorker-7] Connected (version 2.0, client Cisco-1.25)
celery-worker  | [2023-12-17 18:00:05,841: DEBUG/ForkPoolWorker-7] === Key exchange possibilities ===
celery-worker  | [2023-12-17 18:00:05,841: DEBUG/ForkPoolWorker-7] kex algos: diffie-hellman-group-exchange-sha1, diffie-hellman-group14-sha1, diffie-hellman-group1-sha1
celery-worker  | [2023-12-17 18:00:05,841: DEBUG/ForkPoolWorker-7] server key: ssh-rsa
celery-worker  | [2023-12-17 18:00:05,842: DEBUG/ForkPoolWorker-7] client encrypt: aes128-ctr, aes192-ctr, aes256-ctr, aes128-cbc, 3des-cbc, aes192-cbc, aes256-cbc
celery-worker  | [2023-12-17 18:00:05,842: DEBUG/ForkPoolWorker-7] server encrypt: aes128-ctr, aes192-ctr, aes256-ctr, aes128-cbc, 3des-cbc, aes192-cbc, aes256-cbc
celery-worker  | [2023-12-17 18:00:05,842: DEBUG/ForkPoolWorker-7] client mac: hmac-sha1, hmac-sha1-96
celery-worker  | [2023-12-17 18:00:05,842: DEBUG/ForkPoolWorker-7] server mac: hmac-sha1, hmac-sha1-96
celery-worker  | [2023-12-17 18:00:05,842: DEBUG/ForkPoolWorker-7] client compress: none
celery-worker  | [2023-12-17 18:00:05,843: DEBUG/ForkPoolWorker-7] server compress: none
celery-worker  | [2023-12-17 18:00:05,843: DEBUG/ForkPoolWorker-7] client lang: <none>
celery-worker  | [2023-12-17 18:00:05,843: DEBUG/ForkPoolWorker-7] server lang: <none>
celery-worker  | [2023-12-17 18:00:05,843: DEBUG/ForkPoolWorker-7] kex follows: False
celery-worker  | [2023-12-17 18:00:05,843: DEBUG/ForkPoolWorker-7] === Key exchange agreements ===
celery-worker  | [2023-12-17 18:00:05,844: DEBUG/ForkPoolWorker-7] Kex: diffie-hellman-group-exchange-sha1
celery-worker  | [2023-12-17 18:00:05,844: DEBUG/ForkPoolWorker-7] HostKey: ssh-rsa
celery-worker  | [2023-12-17 18:00:05,844: DEBUG/ForkPoolWorker-7] Cipher: aes128-ctr
celery-worker  | [2023-12-17 18:00:05,844: DEBUG/ForkPoolWorker-7] MAC: hmac-sha1
celery-worker  | [2023-12-17 18:00:05,845: DEBUG/ForkPoolWorker-7] Compression: none
celery-worker  | [2023-12-17 18:00:05,845: DEBUG/ForkPoolWorker-7] === End of kex handshake ===
celery-worker  | [2023-12-17 18:00:06,050: DEBUG/ForkPoolWorker-7] Got server p (2048 bits)
celery-worker  | [2023-12-17 18:00:06,264: DEBUG/ForkPoolWorker-7] kex engine KexGex specified hash_algo <built-in function openssl_sha1>
celery-worker  | [2023-12-17 18:00:06,266: DEBUG/ForkPoolWorker-7] Switch to new keys ...
celery-worker  | [2023-12-17 18:00:06,267: DEBUG/ForkPoolWorker-7] Adding ssh-rsa host key for 192.168.254.40: b'51038c0a0275d10c565483889418189a'
celery-worker  | [2023-12-17 18:00:06,475: DEBUG/ForkPoolWorker-7] userauth is OK
celery-worker  | [2023-12-17 18:00:06,481: INFO/ForkPoolWorker-7] Authentication (password) successful!
celery-worker  | [2023-12-17 18:00:06,482: DEBUG/ForkPoolWorker-7] [chan 0] Max packet in: 32768 bytes
celery-worker  | [2023-12-17 18:00:06,488: DEBUG/ForkPoolWorker-7] [chan 0] Max packet out: 4096 bytes
celery-worker  | [2023-12-17 18:00:06,488: DEBUG/ForkPoolWorker-7] Secsh channel 0 opened.
celery-worker  | [2023-12-17 18:00:06,492: DEBUG/ForkPoolWorker-7] [chan 0] Sesch channel 0 request ok
celery-worker  | [2023-12-17 18:00:06,499: DEBUG/ForkPoolWorker-7] [chan 0] Sesch channel 0 request ok
celery-worker  | [2023-12-17 18:00:06,499: DEBUG/ForkPoolWorker-7] write_channel: b'\n'
celery-worker  | [2023-12-17 18:00:06,600: DEBUG/ForkPoolWorker-7] write_channel: b'terminal width 511\n'
celery-worker  | [2023-12-17 18:00:06,601: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | ajlab-4331#
celery-worker  | ajlab-4331#
celery-worker  | [2023-12-17 18:00:06,612: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | [2023-12-17 18:00:06,622: DEBUG/ForkPoolWorker-7] read_channel: ter
celery-worker  | [2023-12-17 18:00:06,632: DEBUG/ForkPoolWorker-7] read_channel: min
celery-worker  | [2023-12-17 18:00:06,643: DEBUG/ForkPoolWorker-7] read_channel: a
celery-worker  | [2023-12-17 18:00:06,653: DEBUG/ForkPoolWorker-7] read_channel: l widt
celery-worker  | [2023-12-17 18:00:06,664: DEBUG/ForkPoolWorker-7] read_channel: h 511
celery-worker  | 
celery-worker  | [2023-12-17 18:00:06,664: DEBUG/ForkPoolWorker-7] Pattern found: (terminal width 511) 
celery-worker  | ajlab-4331#
celery-worker  | ajlab-4331#terminal width 511
celery-worker  | [2023-12-17 18:00:06,665: DEBUG/ForkPoolWorker-7] In disable_paging
celery-worker  | [2023-12-17 18:00:06,665: DEBUG/ForkPoolWorker-7] Command: terminal length 0
celery-worker  | 
celery-worker  | [2023-12-17 18:00:06,666: DEBUG/ForkPoolWorker-7] write_channel: b'terminal length 0\n'
celery-worker  | [2023-12-17 18:00:06,666: DEBUG/ForkPoolWorker-7] read_channel: ajlab-4331#
celery-worker  | [2023-12-17 18:00:06,677: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | [2023-12-17 18:00:06,687: DEBUG/ForkPoolWorker-7] read_channel: termi
celery-worker  | [2023-12-17 18:00:06,697: DEBUG/ForkPoolWorker-7] read_channel: nal le
celery-worker  | [2023-12-17 18:00:06,708: DEBUG/ForkPoolWorker-7] read_channel: ngth
celery-worker  | [2023-12-17 18:00:06,718: DEBUG/ForkPoolWorker-7] read_channel:  0
celery-worker  | ajlab-4331#
celery-worker  | [2023-12-17 18:00:06,719: DEBUG/ForkPoolWorker-7] Pattern found: (terminal\ length\ 0) 
celery-worker  | ajlab-4331#terminal length 0
celery-worker  | [2023-12-17 18:00:06,719: DEBUG/ForkPoolWorker-7] 
celery-worker  | ajlab-4331#terminal length 0
celery-worker  | [2023-12-17 18:00:06,719: DEBUG/ForkPoolWorker-7] Exiting disable_paging
celery-worker  | [2023-12-17 18:00:06,730: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | [2023-12-17 18:00:06,733: DEBUG/ForkPoolWorker-7] Clear buffer detects data in the channel
celery-worker  | [2023-12-17 18:00:06,754: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | [2023-12-17 18:00:06,755: DEBUG/ForkPoolWorker-7] write_channel: b'\n'
celery-worker  | [2023-12-17 18:00:06,755: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | [2023-12-17 18:00:06,765: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | ajlab-4331#
celery-worker  | [2023-12-17 18:00:06,766: DEBUG/ForkPoolWorker-7] 
celery-worker  | Parenthesis found in pattern.
celery-worker  | 
celery-worker  | pattern: (\#|>)
celery-worker  | 
celery-worker  | 
celery-worker  | This can be problemtic when used in read_until_pattern().
celery-worker  | 
celery-worker  | You should ensure that you use either non-capture groups i.e. '(?:' or that the
celery-worker  | parenthesis completely wrap the pattern '(pattern)'
celery-worker  | [2023-12-17 18:00:06,766: DEBUG/ForkPoolWorker-7] Pattern found: (\#|>) 
celery-worker  | ajlab-4331#
celery-worker  | [2023-12-17 18:00:06,776: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | [2023-12-17 18:00:06,777: DEBUG/ForkPoolWorker-7] [find_prompt()]: prompt is ajlab-4331#
celery-worker  | [2023-12-17 18:00:06,777: WARNING/ForkPoolWorker-7] Connected to 192.168.254.40:22
celery-worker  | [2023-12-17 18:00:06,791: WARNING/ForkPoolWorker-7] Transferring /opt/nautobot/jobs/testfile.txt to flash:testfile.txt for 192.168.254.40, please wait...
celery-worker  | [2023-12-17 18:00:06,801: WARNING/ForkPoolWorker-7] {'remote_conn': <paramiko.Channel 0 (open) window=8153 -> <paramiko.Transport at 0xf7e40190 (cipher aes128-ctr, 128 bits) (active; 1 open channel(s))>>, '_config_mode': True, '_read_buffer': '', 'delay_factor_compat': False, 'TELNET_RETURN': '\r\n', 'RETURN': '\n', 'RESPONSE_RETURN': '\n', 'disable_lf_normalization': False, 'host': '192.168.254.40', 'port': 22, 'username': 'admin', 'password': 'admin', 'secret': '', 'device_type': 'cisco_ios', 'ansi_escape_codes': False, 'verbose': False, 'auth_timeout': None, 'banner_timeout': 15, 'blocking_timeout': 20, 'conn_timeout': 10, 'session_timeout': 60, 'timeout': 100, 'read_timeout_override': None, 'keepalive': 0, 'allow_auto_change': False, 'encoding': 'utf-8', 'sock': None, 'sock_telnet': None, 'fast_cli': True, '_legacy_mode': False, 'global_delay_factor': 0.1, 'global_cmd_verify': None, 'session_log': <netmiko.session_log.SessionLog object at 0x7fb7f7e93a50>, '_session_log_close': False, 'serial_settings': {'port': 'COM1', 'baudrate': 9600, 'bytesize': 8, 'parity': 'N', 'stopbits': 1}, 'base_prompt': 'ajlab-4331', '_session_locker': <unlocked _thread.lock object at 0x7fb7f7e91e80>, 'protocol': 'ssh', 'key_policy': <paramiko.client.AutoAddPolicy object at 0x7fb7f7e41410>, 'use_keys': False, 'key_file': None, 'pkey': None, 'passphrase': None, 'allow_agent': False, 'system_host_keys': False, 'alt_host_keys': False, 'alt_key_file': '', 'disabled_algorithms': {}, 'ssh_config_file': None, 'remote_conn_pre': <paramiko.client.SSHClient object at 0x7fb7f7e93c90>, 'channel': <netmiko.channel.SSHChannel object at 0x7fb7f7e5bc50>}
celery-worker  | [2023-12-17 18:00:06,817: DEBUG/ForkPoolWorker-7] starting thread (client mode): 0xf7639890
celery-worker  | [2023-12-17 18:00:06,817: DEBUG/ForkPoolWorker-7] Local version/idstring: SSH-2.0-paramiko_3.3.1
celery-worker  | [2023-12-17 18:00:06,822: DEBUG/ForkPoolWorker-7] Remote version/idstring: SSH-2.0-Cisco-1.25
celery-worker  | [2023-12-17 18:00:06,822: INFO/ForkPoolWorker-7] Connected (version 2.0, client Cisco-1.25)
celery-worker  | [2023-12-17 18:00:06,825: DEBUG/ForkPoolWorker-7] === Key exchange possibilities ===
celery-worker  | [2023-12-17 18:00:06,825: DEBUG/ForkPoolWorker-7] kex algos: diffie-hellman-group-exchange-sha1, diffie-hellman-group14-sha1, diffie-hellman-group1-sha1
celery-worker  | [2023-12-17 18:00:06,825: DEBUG/ForkPoolWorker-7] server key: ssh-rsa
celery-worker  | [2023-12-17 18:00:06,825: DEBUG/ForkPoolWorker-7] client encrypt: aes128-ctr, aes192-ctr, aes256-ctr, aes128-cbc, 3des-cbc, aes192-cbc, aes256-cbc
celery-worker  | [2023-12-17 18:00:06,825: DEBUG/ForkPoolWorker-7] server encrypt: aes128-ctr, aes192-ctr, aes256-ctr, aes128-cbc, 3des-cbc, aes192-cbc, aes256-cbc
celery-worker  | [2023-12-17 18:00:06,825: DEBUG/ForkPoolWorker-7] client mac: hmac-sha1, hmac-sha1-96
celery-worker  | [2023-12-17 18:00:06,825: DEBUG/ForkPoolWorker-7] server mac: hmac-sha1, hmac-sha1-96
celery-worker  | [2023-12-17 18:00:06,826: DEBUG/ForkPoolWorker-7] client compress: none
celery-worker  | [2023-12-17 18:00:06,826: DEBUG/ForkPoolWorker-7] server compress: none
celery-worker  | [2023-12-17 18:00:06,826: DEBUG/ForkPoolWorker-7] client lang: <none>
celery-worker  | [2023-12-17 18:00:06,826: DEBUG/ForkPoolWorker-7] server lang: <none>
celery-worker  | [2023-12-17 18:00:06,826: DEBUG/ForkPoolWorker-7] kex follows: False
celery-worker  | [2023-12-17 18:00:06,827: DEBUG/ForkPoolWorker-7] === Key exchange agreements ===
celery-worker  | [2023-12-17 18:00:06,827: DEBUG/ForkPoolWorker-7] Kex: diffie-hellman-group-exchange-sha1
celery-worker  | [2023-12-17 18:00:06,827: DEBUG/ForkPoolWorker-7] HostKey: ssh-rsa
celery-worker  | [2023-12-17 18:00:06,828: DEBUG/ForkPoolWorker-7] Cipher: aes128-ctr
celery-worker  | [2023-12-17 18:00:06,828: DEBUG/ForkPoolWorker-7] MAC: hmac-sha1
celery-worker  | [2023-12-17 18:00:06,828: DEBUG/ForkPoolWorker-7] Compression: none
celery-worker  | [2023-12-17 18:00:06,828: DEBUG/ForkPoolWorker-7] === End of kex handshake ===
celery-worker  | [2023-12-17 18:00:06,835: DEBUG/ForkPoolWorker-7] Got server p (2048 bits)
celery-worker  | [2023-12-17 18:00:07,040: DEBUG/ForkPoolWorker-7] kex engine KexGex specified hash_algo <built-in function openssl_sha1>
celery-worker  | [2023-12-17 18:00:07,041: DEBUG/ForkPoolWorker-7] Switch to new keys ...
celery-worker  | [2023-12-17 18:00:07,042: DEBUG/ForkPoolWorker-7] Adding ssh-rsa host key for 192.168.254.40: b'51038c0a0275d10c565483889418189a'
celery-worker  | [2023-12-17 18:00:07,248: DEBUG/ForkPoolWorker-7] userauth is OK
celery-worker  | [2023-12-17 18:00:07,254: INFO/ForkPoolWorker-7] Authentication (password) successful!
celery-worker  | [2023-12-17 18:00:07,264: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | [2023-12-17 18:00:07,265: DEBUG/ForkPoolWorker-7] write_channel: b'\n'
celery-worker  | [2023-12-17 18:00:07,290: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | ajlab-4331#
celery-worker  | [2023-12-17 18:00:07,301: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | [2023-12-17 18:00:07,301: DEBUG/ForkPoolWorker-7] [find_prompt()]: prompt is ajlab-4331#
celery-worker  | [2023-12-17 18:00:07,301: DEBUG/ForkPoolWorker-7] write_channel: b'dir bootflash:/testfile.txt\n'
celery-worker  | [2023-12-17 18:00:07,302: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | [2023-12-17 18:00:07,312: DEBUG/ForkPoolWorker-7] read_channel: dir 
celery-worker  | [2023-12-17 18:00:07,322: DEBUG/ForkPoolWorker-7] read_channel: bootfl
celery-worker  | [2023-12-17 18:00:07,333: DEBUG/ForkPoolWorker-7] read_channel: ash:
celery-worker  | [2023-12-17 18:00:07,343: DEBUG/ForkPoolWorker-7] read_channel: /t
celery-worker  | [2023-12-17 18:00:07,354: DEBUG/ForkPoolWorker-7] read_channel: estf
celery-worker  | [2023-12-17 18:00:07,364: DEBUG/ForkPoolWorker-7] read_channel: ile.t
celery-worker  | [2023-12-17 18:00:07,375: DEBUG/ForkPoolWorker-7] read_channel: xt
celery-worker  | 
celery-worker  | [2023-12-17 18:00:07,375: DEBUG/ForkPoolWorker-7] Pattern found: (dir\ bootflash:/testfile\.txt) dir bootflash:/testfile.txt
celery-worker  | [2023-12-17 18:00:07,401: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | [2023-12-17 18:00:07,426: DEBUG/ForkPoolWorker-7] read_channel: Directory of bootflash:/testfile.txt
celery-worker  | 
celery-worker  | 48292  -rw-               11  Dec 17 2023 12:36:53 -06:00  testfile.txt
celery-worker  | 
celery-worker  | 7138107392 bytes total (5867216896 bytes free)
celery-worker  | ajlab-4331#
celery-worker  | [2023-12-17 18:00:07,437: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | [2023-12-17 18:00:07,438: DEBUG/ForkPoolWorker-7] write_channel: b'\n'
celery-worker  | [2023-12-17 18:00:07,463: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | ajlab-4331#
celery-worker  | [2023-12-17 18:00:07,473: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | [2023-12-17 18:00:07,474: DEBUG/ForkPoolWorker-7] [find_prompt()]: prompt is ajlab-4331#
celery-worker  | [2023-12-17 18:00:07,474: DEBUG/ForkPoolWorker-7] write_channel: b'verify /md5 bootflash:/testfile.txt\n'
celery-worker  | [2023-12-17 18:00:07,474: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | [2023-12-17 18:00:07,485: DEBUG/ForkPoolWorker-7] read_channel: ver
celery-worker  | [2023-12-17 18:00:07,495: DEBUG/ForkPoolWorker-7] read_channel: ify /
celery-worker  | [2023-12-17 18:00:07,506: DEBUG/ForkPoolWorker-7] read_channel: md5
celery-worker  | [2023-12-17 18:00:07,516: DEBUG/ForkPoolWorker-7] read_channel:  bootflash:/
celery-worker  | [2023-12-17 18:00:07,527: DEBUG/ForkPoolWorker-7] read_channel: te
celery-worker  | [2023-12-17 18:00:07,537: DEBUG/ForkPoolWorker-7] read_channel: stfil
celery-worker  | [2023-12-17 18:00:07,548: DEBUG/ForkPoolWorker-7] read_channel: e.txt
celery-worker  | [2023-12-17 18:00:07,549: DEBUG/ForkPoolWorker-7] Pattern found: (verify\ /md5\ bootflash:/testfile\.txt) verify /md5 bootflash:/testfile.txt
celery-worker  | [2023-12-17 18:00:07,574: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | .Done!
celery-worker  | verify /md5 (bootflash:/testfile.txt) = fe072365d05929224ca1a4a7e8ccf4bb
celery-worker  | 
celery-worker  | 
celery-worker  | ajlab-4331#
celery-worker  | [2023-12-17 18:00:07,575: DEBUG/ForkPoolWorker-7] write_channel: b'\n'
celery-worker  | [2023-12-17 18:00:07,575: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | [2023-12-17 18:00:07,586: DEBUG/ForkPoolWorker-7] read_channel: 
celery-worker  | ajlab-4331#
celery-worker  | [2023-12-17 18:00:07,587: DEBUG/ForkPoolWorker-7] Pattern found: ([>#]) 
celery-worker  | ajlab-4331#
celery-worker  | [2023-12-17 18:00:07,587: DEBUG/ForkPoolWorker-7] write_channel: b'exit\n'
celery-worker  | [2023-12-17 18:00:07,588: WARNING/ForkPoolWorker-7] {'file_exists': True, 'file_transferred': False, 'file_verified': True}
celery-worker  | [2023-12-17 18:00:07,596: DEBUG/ForkPoolWorker-7] EOF in transport thread
celery-worker  | [2023-12-17 18:00:07,655: DEBUG/ForkPoolWorker-7] EOF in transport thread

@aj-cruz
Copy link
Author

aj-cruz commented Dec 20, 2023

Well, I'm not sure what happened, I re-factored my code and in so doing re-wrote the file transfer from scratch slightly modified, and it's working now:

image_transfer = self.nornir_client.run(
        task = netmiko_file_transfer,
        source_file = str(self.target_image),
        dest_file = str(self.target_image),
    )

The only difference really is the source and destination file variables are just the file name, not a complete path like I was using before, and I removed the direction argument.

I'll leave it open in case you want to investigate the previous state but if not go ahead and close. Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant