~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/ssh.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-10-31 22:28:29 UTC
  • mfrom: (2052.4.5 sftp-error-49172)
  • Revision ID: pqm@pqm.ubuntu.com-20061031222829-d691c81a8a20bdb0
(John Arbash Meinel) Fix bug #49172: nicer errors on sftp connection failure

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
from bzrlib.config import config_dir, ensure_config_dir_exists
28
28
from bzrlib.errors import (ConnectionError,
29
29
                           ParamikoNotPresent,
 
30
                           SocketConnectionError,
30
31
                           TransportError,
31
32
                           UnknownSSH,
32
33
                           )
106
107
    return _ssh_vendor
107
108
 
108
109
 
109
 
 
110
110
def _ignore_sigint():
111
111
    # TODO: This should possibly ignore SIGHUP as well, but bzr currently
112
112
    # doesn't handle it itself.
161
161
        """
162
162
        raise NotImplementedError(self.connect_ssh)
163
163
        
 
164
    def _raise_connection_error(self, host, port=None, orig_error=None,
 
165
                                msg='Unable to connect to SSH host'):
 
166
        """Raise a SocketConnectionError with properly formatted host.
 
167
 
 
168
        This just unifies all the locations that try to raise ConnectionError,
 
169
        so that they format things properly.
 
170
        """
 
171
        raise SocketConnectionError(host=host, port=port, msg=msg,
 
172
                                    orig_error=orig_error)
 
173
 
164
174
 
165
175
class LoopbackVendor(SSHVendor):
166
176
    """SSH "vendor" that connects over a plain TCP socket, not SSH."""
170
180
        try:
171
181
            sock.connect((host, port))
172
182
        except socket.error, e:
173
 
            raise ConnectionError('Unable to connect to SSH host %s:%s: %s'
174
 
                                  % (host, port, e))
 
183
            self._raise_connection_error(host, port=port, orig_error=e)
175
184
        return SFTPClient(LoopbackSFTP(sock))
176
185
 
177
186
register_ssh_vendor('loopback', LoopbackVendor())
201
210
            t.set_log_channel('bzr.paramiko')
202
211
            t.start_client()
203
212
        except (paramiko.SSHException, socket.error), e:
204
 
            raise ConnectionError('Unable to reach SSH host %s:%s: %s' 
205
 
                                  % (host, port, e))
 
213
            self._raise_connection_error(host, port=port, orig_error=e)
206
214
            
207
215
        server_key = t.get_remote_server_key()
208
216
        server_key_hex = paramiko.util.hexify(server_key.get_fingerprint())
236
244
        try:
237
245
            return t.open_sftp_client()
238
246
        except paramiko.SSHException, e:
239
 
            raise ConnectionError('Unable to start sftp client %s:%d' %
240
 
                                  (host, port), e)
 
247
            self._raise_connection_error(host, port=port, orig_error=e,
 
248
                                         msg='Unable to start sftp client')
241
249
 
242
250
    def connect_ssh(self, username, password, host, port, command):
243
251
        t = self._connect(username, password, host, port)
247
255
            channel.exec_command(cmdline)
248
256
            return _ParamikoSSHConnection(channel)
249
257
        except paramiko.SSHException, e:
250
 
            raise ConnectionError('Unable to invoke remote bzr %s:%d' %
251
 
                                  (host, port), e)
 
258
            self._raise_connection_error(host, port=port, orig_error=e,
 
259
                                         msg='Unable to invoke remote bzr')
252
260
 
253
261
register_ssh_vendor('paramiko', ParamikoVendor())
254
262
 
270
278
            sock = self._connect(argv)
271
279
            return SFTPClient(sock)
272
280
        except (EOFError, paramiko.SSHException), e:
273
 
            raise ConnectionError('Unable to connect to SSH host %s:%s: %s'
274
 
                                  % (host, port, e))
 
281
            self._raise_connection_error(host, port=port, orig_error=e)
275
282
        except (OSError, IOError), e:
276
283
            # If the machine is fast enough, ssh can actually exit
277
284
            # before we try and send it the sftp request, which
278
285
            # raises a Broken Pipe
279
286
            if e.errno not in (errno.EPIPE,):
280
287
                raise
281
 
            raise ConnectionError('Unable to connect to SSH host %s:%s: %s'
282
 
                                  % (host, port, e))
 
288
            self._raise_connection_error(host, port=port, orig_error=e)
283
289
 
284
290
    def connect_ssh(self, username, password, host, port, command):
285
291
        try:
287
293
                                                  command=command)
288
294
            return self._connect(argv)
289
295
        except (EOFError), e:
290
 
            raise ConnectionError('Unable to connect to SSH host %s:%s: %s'
291
 
                                  % (host, port, e))
 
296
            self._raise_connection_error(host, port=port, orig_error=e)
292
297
        except (OSError, IOError), e:
293
298
            # If the machine is fast enough, ssh can actually exit
294
299
            # before we try and send it the sftp request, which
295
300
            # raises a Broken Pipe
296
301
            if e.errno not in (errno.EPIPE,):
297
302
                raise
298
 
            raise ConnectionError('Unable to connect to SSH host %s:%s: %s'
299
 
                                  % (host, port, e))
 
303
            self._raise_connection_error(host, port=port, orig_error=e)
300
304
 
301
305
    def _get_vendor_specific_argv(self, username, host, port, subsystem=None,
302
306
                                  command=None):