diff options
author | erkin <e.altunbas@vyos.io> | 2021-06-17 16:53:10 +0300 |
---|---|---|
committer | erkin <e.altunbas@vyos.io> | 2021-06-17 16:53:10 +0300 |
commit | b3fbc7bd6bf6de9ab09e8e344e77f53e9213d392 (patch) | |
tree | 6c28c842f1dba259bf1d90e517d31acb489b3520 | |
parent | 328d070df96b44e9921b59066b366646e669941f (diff) | |
download | vyos-1x-b3fbc7bd6bf6de9ab09e8e344e77f53e9213d392.tar.gz vyos-1x-b3fbc7bd6bf6de9ab09e8e344e77f53e9213d392.zip |
T3356: remote: Use the local filename if the destination is a directory in SFTP transfers.
-rw-r--r-- | python/vyos/remote.py | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/python/vyos/remote.py b/python/vyos/remote.py index c36b77630..05f739dc8 100644 --- a/python/vyos/remote.py +++ b/python/vyos/remote.py @@ -17,6 +17,7 @@ from ftplib import FTP import os import shutil import socket +import stat import sys import tempfile import urllib.parse @@ -152,7 +153,18 @@ def transfer_sftp(mode, local_path, hostname, remote_path,\ ssh.connect(hostname, port, username, password, sock=sock) with ssh.open_sftp() as sftp: if mode == 'upload': - sftp.put(local_path, remote_path, callback=callback) + try: + # If the remote path is a directory, use the original filename. + if stat.S_ISDIR(sftp.stat(remote_path).st_mode): + path = os.path.join(remote_path, os.path.basename(local_path)) + # A file exists at this destination. We're simply going to clobber it. + else: + path = remote_path + # This path doesn't point at any existing file. We can freely use this filename. + except IOError: + path = remote_path + finally: + sftp.put(local_path, path, callback=callback) elif mode == 'download': sftp.get(remote_path, local_path, callback=callback) elif mode == 'size': |