~lifeless/bzr/index.range_map

« back to all changes in this revision

Viewing changes to bzrlib/transport/ssh.py

  • Committer: Robert Collins
  • Date: 2008-06-19 01:17:19 UTC
  • mfrom: (3218.1.277 +trunk)
  • Revision ID: robertc@robertcollins.net-20080619011719-1c4g4uxzzhdls2wf
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
132
132
 
133
133
    def _get_vendor_by_inspection(self):
134
134
        """Return the vendor or None by checking for known SSH implementations."""
135
 
        # detection of plink vendor is disabled because of bug #107593
136
 
        # https://bugs.launchpad.net/bzr/+bug/107593
137
 
        # who want plink should explicitly enable it with BZR_SSH environment
138
 
        # variable.
139
 
        #~for args in (['ssh', '-V'], ['plink', '-V']):
140
 
        for args in (['ssh', '-V'],):
 
135
        for args in (['ssh', '-V'], ['plink', '-V']):
141
136
            version = self._get_ssh_version_string(args)
142
137
            vendor = self._get_vendor_by_version_string(version, args)
143
138
            if vendor is not None:
177
172
    signal.signal(signal.SIGINT, signal.SIG_IGN)
178
173
 
179
174
 
180
 
class LoopbackSFTP(object):
 
175
class SocketAsChannelAdapter(object):
181
176
    """Simple wrapper for a socket that pretends to be a paramiko Channel."""
182
177
 
183
178
    def __init__(self, sock):
184
179
        self.__socket = sock
185
180
 
 
181
    def get_name(self):
 
182
        return "bzr SocketAsChannelAdapter"
 
183
    
186
184
    def send(self, data):
187
185
        return self.__socket.send(data)
188
186
 
189
187
    def recv(self, n):
190
 
        return self.__socket.recv(n)
 
188
        try:
 
189
            return self.__socket.recv(n)
 
190
        except socket.error, e:
 
191
            if e.args[0] in (errno.EPIPE, errno.ECONNRESET, errno.ECONNABORTED,
 
192
                             errno.EBADF):
 
193
                # Connection has closed.  Paramiko expects an empty string in
 
194
                # this case, not an exception.
 
195
                return ''
 
196
            raise
191
197
 
192
198
    def recv_ready(self):
 
199
        # TODO: jam 20051215 this function is necessary to support the
 
200
        # pipelined() function. In reality, it probably should use
 
201
        # poll() or select() to actually return if there is data
 
202
        # available, otherwise we probably don't get any benefit
193
203
        return True
194
204
 
195
205
    def close(self):
242
252
            sock.connect((host, port))
243
253
        except socket.error, e:
244
254
            self._raise_connection_error(host, port=port, orig_error=e)
245
 
        return SFTPClient(LoopbackSFTP(sock))
 
255
        return SFTPClient(SocketAsChannelAdapter(sock))
246
256
 
247
257
register_ssh_vendor('loopback', LoopbackVendor())
248
258
 
352
362
            argv = self._get_vendor_specific_argv(username, host, port,
353
363
                                                  subsystem='sftp')
354
364
            sock = self._connect(argv)
355
 
            return SFTPClient(sock)
 
365
            return SFTPClient(SocketAsChannelAdapter(sock))
356
366
        except _sftp_connection_errors, e:
357
367
            self._raise_connection_error(host, port=port, orig_error=e)
358
368
        except (OSError, IOError), e:
392
402
 
393
403
    def _get_vendor_specific_argv(self, username, host, port, subsystem=None,
394
404
                                  command=None):
395
 
        assert subsystem is not None or command is not None, (
396
 
            'Must specify a command or subsystem')
397
 
        if subsystem is not None:
398
 
            assert command is None, (
399
 
                'subsystem and command are mutually exclusive')
400
405
        args = ['ssh',
401
406
                '-oForwardX11=no', '-oForwardAgent=no',
402
407
                '-oClearAllForwardings=yes', '-oProtocol=2',
419
424
 
420
425
    def _get_vendor_specific_argv(self, username, host, port, subsystem=None,
421
426
                                  command=None):
422
 
        assert subsystem is not None or command is not None, (
423
 
            'Must specify a command or subsystem')
424
 
        if subsystem is not None:
425
 
            assert command is None, (
426
 
                'subsystem and command are mutually exclusive')
427
427
        args = ['ssh', '-x']
428
428
        if port is not None:
429
429
            args.extend(['-p', str(port)])
443
443
 
444
444
    def _get_vendor_specific_argv(self, username, host, port, subsystem=None,
445
445
                                  command=None):
446
 
        assert subsystem is not None or command is not None, (
447
 
            'Must specify a command or subsystem')
448
 
        if subsystem is not None:
449
 
            assert command is None, (
450
 
                'subsystem and command are mutually exclusive')
451
 
        args = ['plink', '-x', '-a', '-ssh', '-2']
 
446
        args = ['plink', '-x', '-a', '-ssh', '-2', '-batch']
452
447
        if port is not None:
453
448
            args.extend(['-P', str(port)])
454
449
        if username is not None:
606
601
    def send(self, data):
607
602
        return os.write(self.proc.stdin.fileno(), data)
608
603
 
609
 
    def recv_ready(self):
610
 
        # TODO: jam 20051215 this function is necessary to support the
611
 
        # pipelined() function. In reality, it probably should use
612
 
        # poll() or select() to actually return if there is data
613
 
        # available, otherwise we probably don't get any benefit
614
 
        return True
615
 
 
616
604
    def recv(self, count):
617
605
        return os.read(self.proc.stdout.fileno(), count)
618
606