From b3fbc7bd6bf6de9ab09e8e344e77f53e9213d392 Mon Sep 17 00:00:00 2001
From: erkin <e.altunbas@vyos.io>
Date: Thu, 17 Jun 2021 16:53:10 +0300
Subject: T3356: remote: Use the local filename if the destination is a
 directory in SFTP transfers.

---
 python/vyos/remote.py | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

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':
-- 
cgit v1.2.3