Index: third_party/twisted_8_1/twisted/conch/client/unix.py |
diff --git a/third_party/twisted_8_1/twisted/conch/client/unix.py b/third_party/twisted_8_1/twisted/conch/client/unix.py |
deleted file mode 100644 |
index 721aeb02af82c0cc554c28a2d97edf6bffd41955..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/conch/client/unix.py |
+++ /dev/null |
@@ -1,396 +0,0 @@ |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
-# |
- |
-from twisted.conch.error import ConchError |
-from twisted.conch.ssh import channel, connection |
-from twisted.internet import defer, protocol, reactor |
-from twisted.python import log |
-from twisted.spread import banana |
- |
-import os, stat, pickle |
-import types # this is for evil |
- |
-class SSHUnixClientFactory(protocol.ClientFactory): |
-# noisy = 1 |
- |
- def __init__(self, d, options, userAuthObject): |
- self.d = d |
- self.options = options |
- self.userAuthObject = userAuthObject |
- |
- def clientConnectionLost(self, connector, reason): |
- if self.options['reconnect']: |
- connector.connect() |
- #log.err(reason) |
- if not self.d: return |
- d = self.d |
- self.d = None |
- d.errback(reason) |
- |
- |
- def clientConnectionFailed(self, connector, reason): |
- #try: |
- # os.unlink(connector.transport.addr) |
- #except: |
- # pass |
- #log.err(reason) |
- if not self.d: return |
- d = self.d |
- self.d = None |
- d.errback(reason) |
- #reactor.connectTCP(options['host'], options['port'], SSHClientFactory()) |
- |
- def startedConnecting(self, connector): |
- fd = connector.transport.fileno() |
- stats = os.fstat(fd) |
- try: |
- filestats = os.stat(connector.transport.addr) |
- except: |
- connector.stopConnecting() |
- return |
- if stat.S_IMODE(filestats[0]) != 0600: |
- log.msg("socket mode is not 0600: %s" % oct(stat.S_IMODE(stats[0]))) |
- elif filestats[4] != os.getuid(): |
- log.msg("socket not owned by us: %s" % stats[4]) |
- elif filestats[5] != os.getgid(): |
- log.msg("socket not owned by our group: %s" % stats[5]) |
- # XXX reenable this when i can fix it for cygwin |
- #elif filestats[-3:] != stats[-3:]: |
- # log.msg("socket doesn't have same create times") |
- else: |
- log.msg('conecting OK') |
- return |
- connector.stopConnecting() |
- |
- def buildProtocol(self, addr): |
- # here comes the EVIL |
- obj = self.userAuthObject.instance |
- bases = [] |
- for base in obj.__class__.__bases__: |
- if base == connection.SSHConnection: |
- bases.append(SSHUnixClientProtocol) |
- else: |
- bases.append(base) |
- newClass = types.ClassType(obj.__class__.__name__, tuple(bases), obj.__class__.__dict__) |
- obj.__class__ = newClass |
- SSHUnixClientProtocol.__init__(obj) |
- log.msg('returning %s' % obj) |
- if self.d: |
- d = self.d |
- self.d = None |
- d.callback(None) |
- return obj |
- |
-class SSHUnixServerFactory(protocol.Factory): |
- def __init__(self, conn): |
- self.conn = conn |
- |
- def buildProtocol(self, addr): |
- return SSHUnixServerProtocol(self.conn) |
- |
-class SSHUnixProtocol(banana.Banana): |
- |
- knownDialects = ['none'] |
- |
- def __init__(self): |
- banana.Banana.__init__(self) |
- self.deferredQueue = [] |
- self.deferreds = {} |
- self.deferredID = 0 |
- |
- def connectionMade(self): |
- log.msg('connection made %s' % self) |
- banana.Banana.connectionMade(self) |
- |
- def expressionReceived(self, lst): |
- vocabName = lst[0] |
- fn = "msg_%s" % vocabName |
- func = getattr(self, fn) |
- func(lst[1:]) |
- |
- def sendMessage(self, vocabName, *tup): |
- self.sendEncoded([vocabName] + list(tup)) |
- |
- def returnDeferredLocal(self): |
- d = defer.Deferred() |
- self.deferredQueue.append(d) |
- return d |
- |
- def returnDeferredWire(self, d): |
- di = self.deferredID |
- self.deferredID += 1 |
- self.sendMessage('returnDeferred', di) |
- d.addCallback(self._cbDeferred, di) |
- d.addErrback(self._ebDeferred, di) |
- |
- def _cbDeferred(self, result, di): |
- self.sendMessage('callbackDeferred', di, pickle.dumps(result)) |
- |
- def _ebDeferred(self, reason, di): |
- self.sendMessage('errbackDeferred', di, pickle.dumps(reason)) |
- |
- def msg_returnDeferred(self, lst): |
- deferredID = lst[0] |
- self.deferreds[deferredID] = self.deferredQueue.pop(0) |
- |
- def msg_callbackDeferred(self, lst): |
- deferredID, result = lst |
- d = self.deferreds[deferredID] |
- del self.deferreds[deferredID] |
- d.callback(pickle.loads(result)) |
- |
- def msg_errbackDeferred(self, lst): |
- deferredID, result = lst |
- d = self.deferreds[deferredID] |
- del self.deferreds[deferredID] |
- d.errback(pickle.loads(result)) |
- |
-class SSHUnixClientProtocol(SSHUnixProtocol): |
- |
- def __init__(self): |
- SSHUnixProtocol.__init__(self) |
- self.isClient = 1 |
- self.channelQueue = [] |
- self.channels = {} |
- |
- def logPrefix(self): |
- return "SSHUnixClientProtocol (%i) on %s" % (id(self), self.transport.logPrefix()) |
- |
- def connectionReady(self): |
- log.msg('connection ready') |
- self.serviceStarted() |
- |
- def connectionLost(self, reason): |
- self.serviceStopped() |
- |
- def requestRemoteForwarding(self, remotePort, hostport): |
- self.sendMessage('requestRemoteForwarding', remotePort, hostport) |
- |
- def cancelRemoteForwarding(self, remotePort): |
- self.sendMessage('cancelRemoteForwarding', remotePort) |
- |
- def sendGlobalRequest(self, request, data, wantReply = 0): |
- self.sendMessage('sendGlobalRequest', request, data, wantReply) |
- if wantReply: |
- return self.returnDeferredLocal() |
- |
- def openChannel(self, channel, extra = ''): |
- self.channelQueue.append(channel) |
- channel.conn = self |
- self.sendMessage('openChannel', channel.name, |
- channel.localWindowSize, |
- channel.localMaxPacket, extra) |
- |
- def sendRequest(self, channel, requestType, data, wantReply = 0): |
- self.sendMessage('sendRequest', channel.id, requestType, data, wantReply) |
- if wantReply: |
- return self.returnDeferredLocal() |
- |
- def adjustWindow(self, channel, bytesToAdd): |
- self.sendMessage('adjustWindow', channel.id, bytesToAdd) |
- |
- def sendData(self, channel, data): |
- self.sendMessage('sendData', channel.id, data) |
- |
- def sendExtendedData(self, channel, dataType, data): |
- self.sendMessage('sendExtendedData', channel.id, data) |
- |
- def sendEOF(self, channel): |
- self.sendMessage('sendEOF', channel.id) |
- |
- def sendClose(self, channel): |
- self.sendMessage('sendClose', channel.id) |
- |
- def msg_channelID(self, lst): |
- channelID = lst[0] |
- self.channels[channelID] = self.channelQueue.pop(0) |
- self.channels[channelID].id = channelID |
- |
- def msg_channelOpen(self, lst): |
- channelID, remoteWindow, remoteMax, specificData = lst |
- channel = self.channels[channelID] |
- channel.remoteWindowLeft = remoteWindow |
- channel.remoteMaxPacket = remoteMax |
- channel.channelOpen(specificData) |
- |
- def msg_openFailed(self, lst): |
- channelID, reason = lst |
- self.channels[channelID].openFailed(pickle.loads(reason)) |
- del self.channels[channelID] |
- |
- def msg_addWindowBytes(self, lst): |
- channelID, bytes = lst |
- self.channels[channelID].addWindowBytes(bytes) |
- |
- def msg_requestReceived(self, lst): |
- channelID, requestType, data = lst |
- d = defer.maybeDeferred(self.channels[channelID].requestReceived, requestType, data) |
- self.returnDeferredWire(d) |
- |
- def msg_dataReceived(self, lst): |
- channelID, data = lst |
- self.channels[channelID].dataReceived(data) |
- |
- def msg_extReceived(self, lst): |
- channelID, dataType, data = lst |
- self.channels[channelID].extReceived(dataType, data) |
- |
- def msg_eofReceived(self, lst): |
- channelID = lst[0] |
- self.channels[channelID].eofReceived() |
- |
- def msg_closeReceived(self, lst): |
- channelID = lst[0] |
- channel = self.channels[channelID] |
- channel.remoteClosed = 1 |
- channel.closeReceived() |
- |
- def msg_closed(self, lst): |
- channelID = lst[0] |
- channel = self.channels[channelID] |
- self.channelClosed(channel) |
- |
- def channelClosed(self, channel): |
- channel.localClosed = channel.remoteClosed = 1 |
- del self.channels[channel.id] |
- log.callWithLogger(channel, channel.closed) |
- |
- # just in case the user doesn't override |
- |
- def serviceStarted(self): |
- pass |
- |
- def serviceStopped(self): |
- pass |
- |
-class SSHUnixServerProtocol(SSHUnixProtocol): |
- |
- def __init__(self, conn): |
- SSHUnixProtocol.__init__(self) |
- self.isClient = 0 |
- self.conn = conn |
- |
- def connectionLost(self, reason): |
- for channel in self.conn.channels.values(): |
- if isinstance(channel, SSHUnixChannel) and channel.unix == self: |
- log.msg('forcibly closing %s' % channel) |
- try: |
- self.conn.sendClose(channel) |
- except: |
- pass |
- |
- def haveChannel(self, channelID): |
- return self.conn.channels.has_key(channelID) |
- |
- def getChannel(self, channelID): |
- channel = self.conn.channels[channelID] |
- if not isinstance(channel, SSHUnixChannel): |
- raise ConchError('nice try bub') |
- return channel |
- |
- def msg_requestRemoteForwarding(self, lst): |
- remotePort, hostport = lst |
- hostport = tuple(hostport) |
- self.conn.requestRemoteForwarding(remotePort, hostport) |
- |
- def msg_cancelRemoteForwarding(self, lst): |
- [remotePort] = lst |
- self.conn.cancelRemoteForwarding(remotePort) |
- |
- def msg_sendGlobalRequest(self, lst): |
- requestName, data, wantReply = lst |
- d = self.conn.sendGlobalRequest(requestName, data, wantReply) |
- if wantReply: |
- self.returnDeferredWire(d) |
- |
- def msg_openChannel(self, lst): |
- name, windowSize, maxPacket, extra = lst |
- channel = SSHUnixChannel(self, name, windowSize, maxPacket) |
- self.conn.openChannel(channel, extra) |
- self.sendMessage('channelID', channel.id) |
- |
- def msg_sendRequest(self, lst): |
- cn, requestType, data, wantReply = lst |
- if not self.haveChannel(cn): |
- if wantReply: |
- self.returnDeferredWire(defer.fail(ConchError("no channel"))) |
- channel = self.getChannel(cn) |
- d = self.conn.sendRequest(channel, requestType, data, wantReply) |
- if wantReply: |
- self.returnDeferredWire(d) |
- |
- def msg_adjustWindow(self, lst): |
- cn, bytesToAdd = lst |
- if not self.haveChannel(cn): return |
- channel = self.getChannel(cn) |
- self.conn.adjustWindow(channel, bytesToAdd) |
- |
- def msg_sendData(self, lst): |
- cn, data = lst |
- if not self.haveChannel(cn): return |
- channel = self.getChannel(cn) |
- self.conn.sendData(channel, data) |
- |
- def msg_sendExtended(self, lst): |
- cn, dataType, data = lst |
- if not self.haveChannel(cn): return |
- channel = self.getChannel(cn) |
- self.conn.sendExtendedData(channel, dataType, data) |
- |
- def msg_sendEOF(self, lst): |
- (cn, ) = lst |
- if not self.haveChannel(cn): return |
- channel = self.getChannel(cn) |
- self.conn.sendEOF(channel) |
- |
- def msg_sendClose(self, lst): |
- (cn, ) = lst |
- if not self.haveChannel(cn): return |
- channel = self.getChannel(cn) |
- self.conn.sendClose(channel) |
- |
-class SSHUnixChannel(channel.SSHChannel): |
- def __init__(self, unix, name, windowSize, maxPacket): |
- channel.SSHChannel.__init__(self, windowSize, maxPacket, conn = unix.conn) |
- self.unix = unix |
- self.name = name |
- |
- def channelOpen(self, specificData): |
- self.unix.sendMessage('channelOpen', self.id, self.remoteWindowLeft, |
- self.remoteMaxPacket, specificData) |
- |
- def openFailed(self, reason): |
- self.unix.sendMessage('openFailed', self.id, pickle.dumps(reason)) |
- |
- def addWindowBytes(self, bytes): |
- self.unix.sendMessage('addWindowBytes', self.id, bytes) |
- |
- def dataReceived(self, data): |
- self.unix.sendMessage('dataReceived', self.id, data) |
- |
- def requestReceived(self, reqType, data): |
- self.unix.sendMessage('requestReceived', self.id, reqType, data) |
- return self.unix.returnDeferredLocal() |
- |
- def extReceived(self, dataType, data): |
- self.unix.sendMessage('extReceived', self.id, dataType, data) |
- |
- def eofReceived(self): |
- self.unix.sendMessage('eofReceived', self.id) |
- |
- def closeReceived(self): |
- self.unix.sendMessage('closeReceived', self.id) |
- |
- def closed(self): |
- self.unix.sendMessage('closed', self.id) |
- |
-def connect(host, port, options, verifyHostKey, userAuthObject): |
- if options['nocache']: |
- return defer.fail(ConchError('not using connection caching')) |
- d = defer.Deferred() |
- filename = os.path.expanduser("~/.conch-%s-%s-%i" % (userAuthObject.user, host, port)) |
- factory = SSHUnixClientFactory(d, options, userAuthObject) |
- reactor.connectUNIX(filename, factory, timeout=2, checkPID=1) |
- return d |