For bug #175891, add sftp protocol support via the paramiko library.
authorZac Medico <zmedico@gentoo.org>
Mon, 25 Jun 2007 03:23:17 +0000 (03:23 -0000)
committerZac Medico <zmedico@gentoo.org>
Mon, 25 Jun 2007 03:23:17 +0000 (03:23 -0000)
svn path=/main/trunk/; revision=7023

pym/portage/getbinpkg.py

index f1131c2d609a86e0c309aec789ae09525af55ec1..a1fec9d20f7a90bc746276a225955a7c31c2d24c 100644 (file)
@@ -141,6 +141,15 @@ def create_conn(baseurl,conn=None):
                                conn.login(username)
                        conn.set_pasv(passive)
                        conn.set_debuglevel(0)
+               elif protocol == "sftp":
+                       try:
+                               import paramiko
+                       except ImportError:
+                               raise NotImplementedError(
+                                       "paramiko must be installed for sftp support")
+                       t = paramiko.Transport(host)
+                       t.connect(username=username, password=password)
+                       conn = paramiko.SFTPClient.from_transport(t)
                else:
                        raise NotImplementedError, "%s is not a supported protocol." % protocol
 
@@ -307,6 +316,8 @@ def dir_get_list(baseurl,conn=None):
                        del olddir
                else:
                        listing = conn.nlst(address)
+       elif protocol == "sftp":
+               listing = conn.listdir(address)
        else:
                raise TypeError, "Unknown protocol. '%s'" % protocol
 
@@ -332,6 +343,13 @@ def file_get_metadata(baseurl,conn=None, chunk_size=3000):
                data,rc,msg = make_http_request(conn, address, params, headers)
        elif protocol in ["ftp"]:
                data,rc,msg = make_ftp_request(conn, address, -chunk_size)
+       elif protocol == "sftp":
+               f = conn.open(address)
+               try:
+                       f.seek(-chunk_size, 2)
+                       data = f.read()
+               finally:
+                       f.close()
        else:
                raise TypeError, "Unknown protocol. '%s'" % protocol
        
@@ -400,6 +418,8 @@ def file_get_lib(baseurl,dest,conn=None):
                data,rc,msg = make_http_request(conn, address, params, headers, dest=dest)
        elif protocol in ["ftp"]:
                data,rc,msg = make_ftp_request(conn, address, dest=dest)
+       elif protocol == "sftp":
+               conn.get(address, dest)
        else:
                raise TypeError, "Unknown protocol. '%s'" % protocol