~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/ssh.py

  • Committer: Dmitry Vasiliev
  • Date: 2007-03-07 13:20:25 UTC
  • mto: (2327.1.1 jam-integration)
  • mto: This revision was merged to the branch mainline in revision 2328.
  • Revision ID: dima@hlabs.spb.ru-20070307132025-kgv55i7xvp7rp7pv
Reverted trailing whitespace removal

Show diffs side-by-side

added added

removed removed

Lines of Context:
178
178
 
179
179
    def __init__(self, sock):
180
180
        self.__socket = sock
181
 
 
 
181
 
182
182
    def send(self, data):
183
183
        return self.__socket.send(data)
184
184
 
194
194
 
195
195
class SSHVendor(object):
196
196
    """Abstract base class for SSH vendor implementations."""
197
 
 
 
197
    
198
198
    def connect_sftp(self, username, password, host, port):
199
199
        """Make an SSH connection, and return an SFTPClient.
200
 
 
 
200
        
201
201
        :param username: an ascii string
202
202
        :param password: an ascii string
203
203
        :param host: a host name as an ascii string
212
212
 
213
213
    def connect_ssh(self, username, password, host, port, command):
214
214
        """Make an SSH connection.
215
 
 
 
215
        
216
216
        :returns: something with a `close` method, and a `get_filelike_channels`
217
217
            method that returns a pair of (read, write) filelike objects.
218
218
        """
219
219
        raise NotImplementedError(self.connect_ssh)
220
 
 
 
220
        
221
221
    def _raise_connection_error(self, host, port=None, orig_error=None,
222
222
                                msg='Unable to connect to SSH host'):
223
223
        """Raise a SocketConnectionError with properly formatted host.
231
231
 
232
232
class LoopbackVendor(SSHVendor):
233
233
    """SSH "vendor" that connects over a plain TCP socket, not SSH."""
234
 
 
 
234
    
235
235
    def connect_sftp(self, username, password, host, port):
236
236
        sock = socket.socket()
237
237
        try:
259
259
 
260
260
    def _connect(self, username, password, host, port):
261
261
        global SYSTEM_HOSTKEYS, BZR_HOSTKEYS
262
 
 
 
262
        
263
263
        load_host_keys()
264
264
 
265
265
        try:
268
268
            t.start_client()
269
269
        except (paramiko.SSHException, socket.error), e:
270
270
            self._raise_connection_error(host, port=port, orig_error=e)
271
 
 
 
271
            
272
272
        server_key = t.get_remote_server_key()
273
273
        server_key_hex = paramiko.util.hexify(server_key.get_fingerprint())
274
274
        keytype = server_key.get_name()
297
297
 
298
298
        _paramiko_auth(username, password, host, t)
299
299
        return t
300
 
 
 
300
        
301
301
    def connect_sftp(self, username, password, host, port):
302
302
        t = self._connect(username, password, host, port)
303
303
        try:
327
327
 
328
328
class SubprocessVendor(SSHVendor):
329
329
    """Abstract base class for vendors that use pipes to a subprocess."""
330
 
 
 
330
    
331
331
    def _connect(self, argv):
332
332
        proc = subprocess.Popen(argv,
333
333
                                stdin=subprocess.PIPE,
369
369
    def _get_vendor_specific_argv(self, username, host, port, subsystem=None,
370
370
                                  command=None):
371
371
        """Returns the argument list to run the subprocess with.
372
 
 
 
372
        
373
373
        Exactly one of 'subsystem' and 'command' must be specified.
374
374
        """
375
375
        raise NotImplementedError(self._get_vendor_specific_argv)
377
377
 
378
378
class OpenSSHSubprocessVendor(SubprocessVendor):
379
379
    """SSH vendor that uses the 'ssh' executable from OpenSSH."""
380
 
 
 
380
    
381
381
    def _get_vendor_specific_argv(self, username, host, port, subsystem=None,
382
382
                                  command=None):
383
383
        assert subsystem is not None or command is not None, (
422
422
        else:
423
423
            args.extend([host] + command)
424
424
        return args
425
 
 
 
425
    
426
426
register_ssh_vendor('ssh', SSHCorpSubprocessVendor())
427
427
 
428
428
 
468
468
                return
469
469
            except paramiko.SSHException, e:
470
470
                pass
471
 
 
 
471
    
472
472
    # okay, try finding id_rsa or id_dss?  (posix only)
473
473
    if _try_pkey_auth(paramiko_transport, paramiko.RSAKey, username, 'id_rsa'):
474
474
        return
605
605
 
606
606
    def get_filelike_channels(self):
607
607
        return (self.proc.stdout, self.proc.stdin)
 
608