Source code for opennode.oms.endpoint.ssh.session
from twisted.conch import interfaces as iconch
from twisted.conch.manhole_ssh import TerminalSession, TerminalSessionTransport, TerminalRealm, TerminalUser
from twisted.conch.ssh.session import SSHSession
from twisted.conch.insults import insults
from twisted.internet import defer
from zope.authentication.interfaces import IAuthentication
from zope.component import getUtility
from opennode.oms.endpoint.ssh.protocol import OmsShellProtocol
[docs]class BatchOmsShellProtocol(OmsShellProtocol):
batch = True
[docs] def lineReceived(self, line):
"""Ignore input, we are not a shell"""
pass
[docs]class OmsTerminalSession(TerminalSession):
[docs] def execCommand(self, proto, cmd):
try:
chained_protocol = insults.ServerProtocol(BatchOmsShellProtocol)
self.transportFactory(
proto, chained_protocol,
iconch.IConchUser(self.original),
80, 25)
except Exception as e:
print e
oms_protocol = chained_protocol.terminalProtocol
@defer.inlineCallbacks
def spawn_command():
yield oms_protocol.spawn_commands(cmd)
if oms_protocol.last_error:
yield oms_protocol.spawn_command('last_error')
proto.processEnded()
spawn_command()
[docs]class OmsTerminalSessionTransport(TerminalSessionTransport):
def __init__(self, proto, chainedProtocol, avatar, width, height):
TerminalSessionTransport.__init__(self, proto, chainedProtocol, avatar, width, height)
chainedProtocol.terminalProtocol.logged_in(avatar.principal)
[docs]class OmsSSHSession(SSHSession):
def __init__(self, *args, **kw):
SSHSession.__init__(self, *args, **kw)
self.__dict__['request_auth_agent_req@openssh.com'] = self.request_agent
[docs] def request_x11_req(self, data):
return 0
[docs] def request_env(self, data):
return 0
[docs] def request_agent(self, data):
return 0
[docs]class OmsTerminalUser(TerminalUser):
def __init__(self, original, avatarId):
TerminalUser.__init__(self, original, avatarId)
self.channelLookup['session'] = OmsSSHSession
[docs]class OmsTerminalRealm(TerminalRealm):
def __init__(self):
TerminalRealm.__init__(self)
def userFactory(original, avatarId):
user = OmsTerminalUser(original, avatarId)
auth = getUtility(IAuthentication, context=None)
user.principal = auth.getPrincipal(avatarId)
return user
self.chainedProtocolFactory = lambda: insults.ServerProtocol(OmsShellProtocol)
self.sessionFactory = OmsTerminalSession
self.userFactory = userFactory
self.transportFactory = OmsTerminalSessionTransport