| Index: third_party/twisted_8_1/twisted/conch/ssh/channel.py
|
| diff --git a/third_party/twisted_8_1/twisted/conch/ssh/channel.py b/third_party/twisted_8_1/twisted/conch/ssh/channel.py
|
| deleted file mode 100644
|
| index 496ab44a7e60f9de05ad8f7681c12d04f0183145..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/conch/ssh/channel.py
|
| +++ /dev/null
|
| @@ -1,281 +0,0 @@
|
| -# -*- test-case-name: twisted.conch.test.test_channel -*-
|
| -# Copyright (c) 2001-2008 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -#
|
| -"""
|
| -The parent class for all the SSH Channels. Currently implemented channels
|
| -are session. direct-tcp, and forwarded-tcp.
|
| -
|
| -Maintainer: U{Paul Swartz<mailto:z3p@twistedmatrix.com>}
|
| -"""
|
| -
|
| -from twisted.python import log
|
| -from twisted.internet import interfaces
|
| -from zope.interface import implements
|
| -
|
| -
|
| -class SSHChannel(log.Logger):
|
| - """
|
| - A class that represents a multiplexed channel over an SSH connection.
|
| - The channel has a local window which is the maximum amount of data it will
|
| - receive, and a remote which is the maximum amount of data the remote side
|
| - will accept. There is also a maximum packet size for any individual data
|
| - packet going each way.
|
| -
|
| - @ivar name: the name of the channel.
|
| - @type name: C{str}
|
| - @ivar localWindowSize: the maximum size of the local window in bytes.
|
| - @type localWindowSize: C{int}
|
| - @ivar localWindowLeft: how many bytes are left in the local window.
|
| - @type localWindowLeft: C{int}
|
| - @ivar localMaxPacket: the maximum size of packet we will accept in bytes.
|
| - @type localMaxPacket: C{int}
|
| - @ivar remoteWindowLeft: how many bytes are left in the remote window.
|
| - @type remoteWindowLeft: C{int}
|
| - @ivar remoteMaxPacket: the maximum size of a packet the remote side will
|
| - accept in bytes.
|
| - @type remoteMaxPacket: C{int}
|
| - @ivar conn: the connection this channel is multiplexed through.
|
| - @type conn: L{SSHConnection}
|
| - @ivar data: any data to send to the other size when the channel is
|
| - requested.
|
| - @type data: C{str}
|
| - @ivar avatar: an avatar for the logged-in user (if a server channel)
|
| - @ivar localClosed: True if we aren't accepting more data.
|
| - @type localClosed: C{bool}
|
| - @ivar remoteClosed: True if the other size isn't accepting more data.
|
| - @type remoteClosed: C{bool}
|
| - """
|
| -
|
| - implements(interfaces.ITransport)
|
| -
|
| - name = None # only needed for client channels
|
| -
|
| - def __init__(self, localWindow = 0, localMaxPacket = 0,
|
| - remoteWindow = 0, remoteMaxPacket = 0,
|
| - conn = None, data=None, avatar = None):
|
| - self.localWindowSize = localWindow or 131072
|
| - self.localWindowLeft = self.localWindowSize
|
| - self.localMaxPacket = localMaxPacket or 32768
|
| - self.remoteWindowLeft = remoteWindow
|
| - self.remoteMaxPacket = remoteMaxPacket
|
| - self.areWriting = 1
|
| - self.conn = conn
|
| - self.data = data
|
| - self.avatar = avatar
|
| - self.specificData = ''
|
| - self.buf = ''
|
| - self.extBuf = []
|
| - self.closing = 0
|
| - self.localClosed = 0
|
| - self.remoteClosed = 0
|
| - self.id = None # gets set later by SSHConnection
|
| -
|
| - def __str__(self):
|
| - return '<SSHChannel %s (lw %i rw %i)>' % (self.name,
|
| - self.localWindowLeft, self.remoteWindowLeft)
|
| -
|
| - def logPrefix(self):
|
| - id = (self.id is not None and str(self.id)) or "unknown"
|
| - return "SSHChannel %s (%s) on %s" % (self.name, id,
|
| - self.conn.logPrefix())
|
| -
|
| - def channelOpen(self, specificData):
|
| - """
|
| - Called when the channel is opened. specificData is any data that the
|
| - other side sent us when opening the channel.
|
| -
|
| - @type specificData: C{str}
|
| - """
|
| - log.msg('channel open')
|
| -
|
| - def openFailed(self, reason):
|
| - """
|
| - Called when the the open failed for some reason.
|
| - reason.desc is a string descrption, reason.code the the SSH error code.
|
| -
|
| - @type reason: L{error.ConchError}
|
| - """
|
| - log.msg('other side refused open\nreason: %s'% reason)
|
| -
|
| - def addWindowBytes(self, bytes):
|
| - """
|
| - Called when bytes are added to the remote window. By default it clears
|
| - the data buffers.
|
| -
|
| - @type bytes: C{int}
|
| - """
|
| - self.remoteWindowLeft = self.remoteWindowLeft+bytes
|
| - if not self.areWriting and not self.closing:
|
| - self.areWriting = True
|
| - self.startWriting()
|
| - if self.buf:
|
| - b = self.buf
|
| - self.buf = ''
|
| - self.write(b)
|
| - if self.extBuf:
|
| - b = self.extBuf
|
| - self.extBuf = []
|
| - for (type, data) in b:
|
| - self.writeExtended(type, data)
|
| -
|
| - def requestReceived(self, requestType, data):
|
| - """
|
| - Called when a request is sent to this channel. By default it delegates
|
| - to self.request_<requestType>.
|
| - If this function returns true, the request succeeded, otherwise it
|
| - failed.
|
| -
|
| - @type requestType: C{str}
|
| - @type data: C{str}
|
| - @rtype: C{bool}
|
| - """
|
| - foo = requestType.replace('-', '_')
|
| - f = getattr(self, 'request_%s'%foo, None)
|
| - if f:
|
| - return f(data)
|
| - log.msg('unhandled request for %s'%requestType)
|
| - return 0
|
| -
|
| - def dataReceived(self, data):
|
| - """
|
| - Called when we receive data.
|
| -
|
| - @type data: C{str}
|
| - """
|
| - log.msg('got data %s'%repr(data))
|
| -
|
| - def extReceived(self, dataType, data):
|
| - """
|
| - Called when we receive extended data (usually standard error).
|
| -
|
| - @type dataType: C{int}
|
| - @type data: C{str}
|
| - """
|
| - log.msg('got extended data %s %s'%(dataType, repr(data)))
|
| -
|
| - def eofReceived(self):
|
| - """
|
| - Called when the other side will send no more data.
|
| - """
|
| - log.msg('remote eof')
|
| -
|
| - def closeReceived(self):
|
| - """
|
| - Called when the other side has closed the channel.
|
| - """
|
| - log.msg('remote close')
|
| - self.loseConnection()
|
| -
|
| - def closed(self):
|
| - """
|
| - Called when the channel is closed. This means that both our side and
|
| - the remote side have closed the channel.
|
| - """
|
| - log.msg('closed')
|
| -
|
| - # transport stuff
|
| - def write(self, data):
|
| - """
|
| - Write some data to the channel. If there is not enough remote window
|
| - available, buffer until it is. Otherwise, split the data into
|
| - packets of length remoteMaxPacket and send them.
|
| -
|
| - @type data: C{str}
|
| - """
|
| - if self.buf:
|
| - self.buf += data
|
| - return
|
| - top = len(data)
|
| - if top > self.remoteWindowLeft:
|
| - data, self.buf = (data[:self.remoteWindowLeft],
|
| - data[self.remoteWindowLeft:])
|
| - self.areWriting = 0
|
| - self.stopWriting()
|
| - top = self.remoteWindowLeft
|
| - rmp = self.remoteMaxPacket
|
| - write = self.conn.sendData
|
| - r = range(0, top, rmp)
|
| - for offset in r:
|
| - write(self, data[offset: offset+rmp])
|
| - self.remoteWindowLeft -= top
|
| - if self.closing and not self.buf:
|
| - self.loseConnection() # try again
|
| -
|
| - def writeExtended(self, dataType, data):
|
| - """
|
| - Send extended data to this channel. If there is not enough remote
|
| - window available, buffer until there is. Otherwise, split the data
|
| - into packets of length remoteMaxPacket and send them.
|
| -
|
| - @type dataType: C{int}
|
| - @type data: C{str}
|
| - """
|
| - if self.extBuf:
|
| - if self.extBuf[-1][0] == dataType:
|
| - self.extBuf[-1][1] += data
|
| - else:
|
| - self.extBuf.append([dataType, data])
|
| - return
|
| - if len(data) > self.remoteWindowLeft:
|
| - data, self.extBuf = (data[:self.remoteWindowLeft],
|
| - [[dataType, data[self.remoteWindowLeft:]]])
|
| - self.areWriting = 0
|
| - self.stopWriting()
|
| - while len(data) > self.remoteMaxPacket:
|
| - self.conn.sendExtendedData(self, dataType,
|
| - data[:self.remoteMaxPacket])
|
| - data = data[self.remoteMaxPacket:]
|
| - self.remoteWindowLeft -= self.remoteMaxPacket
|
| - if data:
|
| - self.conn.sendExtendedData(self, dataType, data)
|
| - self.remoteWindowLeft -= len(data)
|
| - if self.closing:
|
| - self.loseConnection() # try again
|
| -
|
| - def writeSequence(self, data):
|
| - """
|
| - Part of the Transport interface. Write a list of strings to the
|
| - channel.
|
| -
|
| - @type data: C{list} of C{str}
|
| - """
|
| - self.write(''.join(data))
|
| -
|
| - def loseConnection(self):
|
| - """
|
| - Close the channel if there is no buferred data. Otherwise, note the
|
| - request and return.
|
| - """
|
| - self.closing = 1
|
| - if not self.buf and not self.extBuf:
|
| - self.conn.sendClose(self)
|
| -
|
| - def getPeer(self):
|
| - """
|
| - Return a tuple describing the other side of the connection.
|
| -
|
| - @rtype: C{tuple}
|
| - """
|
| - return('SSH', )+self.conn.transport.getPeer()
|
| -
|
| - def getHost(self):
|
| - """
|
| - Return a tuple describing our side of the connection.
|
| -
|
| - @rtype: C{tuple}
|
| - """
|
| - return('SSH', )+self.conn.transport.getHost()
|
| -
|
| - def stopWriting(self):
|
| - """
|
| - Called when the remote buffer is full, as a hint to stop writing.
|
| - This can be ignored, but it can be helpful.
|
| - """
|
| -
|
| - def startWriting(self):
|
| - """
|
| - Called when the remote buffer has more room, as a hint to continue
|
| - writing.
|
| - """
|
|
|