~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/sftp.py

  • Committer: Andrew Bennetts
  • Date: 2006-08-23 10:56:58 UTC
  • mto: (2018.5.1 split-smart)
  • mto: This revision was merged to the branch mainline in revision 2435.
  • Revision ID: andrew.bennetts@canonical.com-20060823105658-10d57b3d1b7329fc
Define (and register as bzr+ssh://) SmartSSHTransport, factor out an SSHSubprocess from SFTPSubprocess, and make SmartTransport connect lazily rather than in the constructor.

Show diffs side-by-side

added added

removed removed

Lines of Context:
163
163
    return _ssh_vendor
164
164
 
165
165
 
166
 
class SFTPSubprocess:
 
166
class SSHSubprocess:
167
167
    """A socket-like object that talks to an ssh subprocess via pipes."""
168
 
    def __init__(self, hostname, vendor, port=None, user=None):
 
168
    # TODO: this class probably belongs in bzrlib/transport/ssh.py
 
169
 
 
170
    def __init__(self, hostname, vendor, port=None, user=None, subsystem=None,
 
171
                 command=None):
169
172
        assert vendor in ['openssh', 'ssh']
 
173
        assert subsystem is not None or command is not None, (
 
174
            'Must specify a command or subsystem')
 
175
        if subsystem is not None:
 
176
            assert command is None, (
 
177
                'subsystem and command are mutually exclusive')
170
178
        if vendor == 'openssh':
171
179
            args = ['ssh',
172
180
                    '-oForwardX11=no', '-oForwardAgent=no',
176
184
                args.extend(['-p', str(port)])
177
185
            if user is not None:
178
186
                args.extend(['-l', user])
179
 
            args.extend(['-s', hostname, 'sftp'])
 
187
            if subsystem is not None:
 
188
                args.extend(['-s', hostname, subsystem])
 
189
            else:
 
190
                args.extend([hostname] + command)
180
191
        elif vendor == 'ssh':
181
192
            args = ['ssh', '-x']
182
193
            if port is not None:
183
194
                args.extend(['-p', str(port)])
184
195
            if user is not None:
185
196
                args.extend(['-l', user])
186
 
            args.extend(['-s', 'sftp', hostname])
 
197
            if subsystem is not None:
 
198
                args.extend(['-s', subsystem, hostname])
 
199
            else:
 
200
                args.extend([hostname] + command)
187
201
 
188
202
        self.proc = subprocess.Popen(args,
189
203
                                     stdin=subprocess.PIPE,
208
222
        self.proc.stdout.close()
209
223
        self.proc.wait()
210
224
 
 
225
    def get_filelike_channels(self):
 
226
        """Returns a tuple of (read, write) file-like objects.
 
227
 
 
228
        If you close these objects the underlying pipes will close.
 
229
        """
 
230
        return self.proc.stdout, self.proc.stdin
 
231
        
 
232
 
 
233
class SFTPSubprocess(SSHSubprocess):
 
234
    def __init__(self, hostname, vendor, port=None, user=None):
 
235
        SSHSubprocess.__init__(self, hostname, vendor, port=port, user=user,
 
236
                               subsystem='sftp')
 
237
 
211
238
 
212
239
class LoopbackSFTP(object):
213
240
    """Simple wrapper for a socket that pretends to be a paramiko Channel."""