Index: third_party/twisted_8_1/twisted/conch/ssh/session.py |
diff --git a/third_party/twisted_8_1/twisted/conch/ssh/session.py b/third_party/twisted_8_1/twisted/conch/ssh/session.py |
deleted file mode 100644 |
index bf92bc687b0efe6f62452b28868e5f8518e518b9..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/conch/ssh/session.py |
+++ /dev/null |
@@ -1,255 +0,0 @@ |
-# -*- test-case-name: twisted.conch.test.test_conch -*- |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
-# |
- |
-""" |
-This module contains the implementation of SSHSession, which (by default) |
-allows access to a shell and a python interpreter over SSH. |
- |
-Maintainer: U{Paul Swartz<mailto:z3p@twistedmatrix.com>} |
-""" |
- |
-import struct |
- |
-from twisted.internet import protocol |
-from twisted.python import log |
-from twisted.conch.interfaces import ISession |
-from twisted.conch.ssh import common, channel |
- |
-class SSHSession(channel.SSHChannel): |
- |
- name = 'session' |
- def __init__(self, *args, **kw): |
- channel.SSHChannel.__init__(self, *args, **kw) |
- self.buf = '' |
- self.client = None |
- self.session = None |
- |
- def request_subsystem(self, data): |
- subsystem, ignored= common.getNS(data) |
- log.msg('asking for subsystem "%s"' % subsystem) |
- client = self.avatar.lookupSubsystem(subsystem, data) |
- if client: |
- pp = SSHSessionProcessProtocol(self) |
- proto = wrapProcessProtocol(pp) |
- client.makeConnection(proto) |
- pp.makeConnection(wrapProtocol(client)) |
- self.client = pp |
- return 1 |
- else: |
- log.msg('failed to get subsystem') |
- return 0 |
- |
- def request_shell(self, data): |
- log.msg('getting shell') |
- if not self.session: |
- self.session = ISession(self.avatar) |
- try: |
- pp = SSHSessionProcessProtocol(self) |
- self.session.openShell(pp) |
- except: |
- log.deferr() |
- return 0 |
- else: |
- self.client = pp |
- return 1 |
- |
- def request_exec(self, data): |
- if not self.session: |
- self.session = ISession(self.avatar) |
- f,data = common.getNS(data) |
- log.msg('executing command "%s"' % f) |
- try: |
- pp = SSHSessionProcessProtocol(self) |
- self.session.execCommand(pp, f) |
- except: |
- log.deferr() |
- return 0 |
- else: |
- self.client = pp |
- return 1 |
- |
- def request_pty_req(self, data): |
- if not self.session: |
- self.session = ISession(self.avatar) |
- term, windowSize, modes = parseRequest_pty_req(data) |
- log.msg('pty request: %s %s' % (term, windowSize)) |
- try: |
- self.session.getPty(term, windowSize, modes) |
- except: |
- log.err() |
- return 0 |
- else: |
- return 1 |
- |
- def request_window_change(self, data): |
- if not self.session: |
- self.session = ISession(self.avatar) |
- winSize = parseRequest_window_change(data) |
- try: |
- self.session.windowChanged(winSize) |
- except: |
- log.msg('error changing window size') |
- log.err() |
- return 0 |
- else: |
- return 1 |
- |
- def dataReceived(self, data): |
- if not self.client: |
- #self.conn.sendClose(self) |
- self.buf += data |
- return |
- self.client.transport.write(data) |
- |
- def extReceived(self, dataType, data): |
- if dataType == connection.EXTENDED_DATA_STDERR: |
- if self.client and hasattr(self.client.transport, 'writeErr'): |
- self.client.transport.writeErr(data) |
- else: |
- log.msg('weird extended data: %s'%dataType) |
- |
- def eofReceived(self): |
- if self.session: |
- self.session.eofReceived() |
- elif self.client: |
- self.conn.sendClose(self) |
- |
- def closed(self): |
- if self.session: |
- self.session.closed() |
- elif self.client: |
- self.client.transport.loseConnection() |
- |
- #def closeReceived(self): |
- # self.loseConnection() # don't know what to do with this |
- |
- def loseConnection(self): |
- if self.client: |
- self.client.transport.loseConnection() |
- channel.SSHChannel.loseConnection(self) |
- |
-class _ProtocolWrapper(protocol.ProcessProtocol): |
- """ |
- This class wraps a L{Protocol} instance in a L{ProcessProtocol} instance. |
- """ |
- def __init__(self, proto): |
- self.proto = proto |
- |
- def connectionMade(self): self.proto.connectionMade() |
- |
- def outReceived(self, data): self.proto.dataReceived(data) |
- |
- def processEnded(self, reason): self.proto.connectionLost(reason) |
- |
-class _DummyTransport: |
- |
- def __init__(self, proto): |
- self.proto = proto |
- |
- def dataReceived(self, data): |
- self.proto.transport.write(data) |
- |
- def write(self, data): |
- self.proto.dataReceived(data) |
- |
- def writeSequence(self, seq): |
- self.write(''.join(seq)) |
- |
- def loseConnection(self): |
- self.proto.connectionLost(protocol.connectionDone) |
- |
-def wrapProcessProtocol(inst): |
- if isinstance(inst, protocol.Protocol): |
- return _ProtocolWrapper(inst) |
- else: |
- return inst |
- |
-def wrapProtocol(proto): |
- return _DummyTransport(proto) |
- |
-class SSHSessionProcessProtocol(protocol.ProcessProtocol): |
- |
-# __implements__ = I |
- def __init__(self, session): |
- self.session = session |
- |
- def connectionMade(self): |
- if self.session.buf: |
- self.transport.write(self.session.buf) |
- self.session.buf = None |
- |
- def outReceived(self, data): |
- self.session.write(data) |
- |
- def errReceived(self, err): |
- self.session.writeExtended(connection.EXTENDED_DATA_STDERR, err) |
- |
- def inConnectionLost(self): |
- self.session.conn.sendEOF(self.session) |
- |
- def connectionLost(self, reason = None): |
- self.session.loseConnection() |
- |
- def processEnded(self, reason = None): |
- if reason and hasattr(reason.value, 'exitCode'): |
- log.msg('exitCode: %s' % repr(reason.value.exitCode)) |
- self.session.conn.sendRequest(self.session, 'exit-status', struct.pack('!L', reason.value.exitCode)) |
- self.session.loseConnection() |
- |
- # transport stuff (we are also a transport!) |
- |
- def write(self, data): |
- self.session.write(data) |
- |
- def writeSequence(self, seq): |
- self.session.write(''.join(seq)) |
- |
- def loseConnection(self): |
- self.session.loseConnection() |
- |
-class SSHSessionClient(protocol.Protocol): |
- |
- def dataReceived(self, data): |
- if self.transport: |
- self.transport.write(data) |
- |
-# methods factored out to make live easier on server writers |
-def parseRequest_pty_req(data): |
- """Parse the data from a pty-req request into usable data. |
- |
- @returns: a tuple of (terminal type, (rows, cols, xpixel, ypixel), modes) |
- """ |
- term, rest = common.getNS(data) |
- cols, rows, xpixel, ypixel = struct.unpack('>4L', rest[: 16]) |
- modes, ignored= common.getNS(rest[16:]) |
- winSize = (rows, cols, xpixel, ypixel) |
- modes = [(ord(modes[i]), struct.unpack('>L', modes[i+1: i+5])[0]) for i in range(0, len(modes)-1, 5)] |
- return term, winSize, modes |
- |
-def packRequest_pty_req(term, (rows, cols, xpixel, ypixel), modes): |
- """Pack a pty-req request so that it is suitable for sending. |
- |
- NOTE: modes must be packed before being sent here. |
- """ |
- termPacked = common.NS(term) |
- winSizePacked = struct.pack('>4L', cols, rows, xpixel, ypixel) |
- modesPacked = common.NS(modes) # depend on the client packing modes |
- return termPacked + winSizePacked + modesPacked |
- |
-def parseRequest_window_change(data): |
- """Parse the data from a window-change request into usuable data. |
- |
- @returns: a tuple of (rows, cols, xpixel, ypixel) |
- """ |
- cols, rows, xpixel, ypixel = struct.unpack('>4L', data) |
- return rows, cols, xpixel, ypixel |
- |
-def packRequest_window_change((rows, cols, xpixel, ypixel)): |
- """Pack a window-change request so that it is suitable for sending. |
- """ |
- return struct.pack('>4L', cols, rows, xpixel, ypixel) |
- |
-import connection |