Simplify terminal handler

This commit is contained in:
R. Richard 2019-08-07 09:47:28 +02:00
parent dded7fd65c
commit e414ea2631

View File

@ -7,40 +7,25 @@ LOG = logging.getLogger(__name__)
class TerminalHandler:
keys = ['shell']
"""
Event handler responsible for managing terminal sessions for frontend xterm
sessions to connect to. You need to instanciate this in order for frontend
terminals to work.
keys = ['terminal.write']
This EventHandler accepts messages that have a data['command'] key specifying
a command to be executed.
The API of each command is documented in their respective handler.
"""
def __init__(self, *, port, user, workind_directory, histfile):
"""
:param key: key this EventHandler listens to
:param monitor: tfw.components.HistoryMonitor instance to read command history from
"""
self.connector = None
def __init__(self, *, port, user, working_directory, histfile):
self.connector, self._historymonitor = None, None
self._histfile = histfile
self._historymonitor = None
bash_as_user_cmd = ['sudo', '-u', user, 'bash']
self.terminado_server = TerminadoMiniServer(
'/terminal',
port,
workind_directory,
working_directory,
bash_as_user_cmd
)
self.terminado_server.listen()
self.commands = {
'write': self.write,
'read': self.read
'terminal.write': self.handle_write
}
self.terminado_server.listen()
def start(self):
self._historymonitor = BashMonitor(self.connector, self._histfile)
self._historymonitor.start()
@ -51,34 +36,12 @@ class TerminalHandler:
def handle_event(self, message, _):
try:
data = message['data']
message['data'] = self.commands[data['command']](data)
self.commands[message['key']](message)
except KeyError:
LOG.error('IGNORING MESSAGE: Invalid message received: %s', message)
def write(self, data):
"""
Writes a string to the terminal session (on the pty level).
Useful for pre-typing and executing commands for the user.
:param data: TFW message data containing 'value'
(command to be written to the pty)
"""
self.terminado_server.pty.write(data['value'])
return data
def read(self, data):
"""
Reads the history of commands executed.
:param data: TFW message data containing 'count'
(the number of history elements to return)
:return dict: message with list of commands in data['history']
"""
data['count'] = int(data.get('count', 1))
if self.historymonitor:
data['history'] = self.historymonitor.history[-data['count']:]
return data
def handle_write(self, message):
self.terminado_server.pty.write(message['command'])
def cleanup(self):
self.terminado_server.stop()