baseimage-tutorial-framework/lib/tfw/components/terminado_event_handler.py

76 lines
2.7 KiB
Python
Raw Normal View History

# Copyright (C) 2018 Avatao.com Innovative Learning Kft.
# All Rights Reserved. See LICENSE file for details.
from tfw import EventHandlerBase
from tfw.config import TFWENV
2018-01-31 14:50:52 +00:00
from tfw.config.logs import logging
from tao.config import TAOENV
from .terminado_mini_server import TerminadoMiniServer
LOG = logging.getLogger(__name__)
class TerminadoEventHandler(EventHandlerBase):
2018-04-18 17:44:26 +00:00
"""
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.
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 handlers.
"""
def __init__(self, key, monitor):
2018-04-18 17:44:26 +00:00
"""
:param key: key this EventHandler listens to
:param monitor: tfw.components.HistoryMonitor instance to read command history from
"""
super().__init__(key)
self.working_directory = TFWENV.TERMINADO_DIR
self._historymonitor = monitor
bash_as_user_cmd = ['sudo', '-u', TAOENV.USER, 'bash']
self.terminado_server = TerminadoMiniServer('/terminal', TFWENV.TERMINADO_PORT, TFWENV.TERMINADO_WD, bash_as_user_cmd)
2018-03-03 21:46:14 +00:00
self.commands = {'write': self.write,
'read': self.read}
if self._historymonitor:
self._historymonitor.watch()
self.terminado_server.listen()
@property
def historymonitor(self):
return self._historymonitor
def handle_event(self, message):
LOG.debug('TerminadoEventHandler received event: %s', message)
try:
data = message['data']
message['data'] = self.commands[data['command']](data)
return message
except KeyError:
LOG.error('IGNORING MESSAGE: Invalid message received: %s', message)
2018-03-03 13:14:44 +00:00
def write(self, data):
2018-04-18 17:44:26 +00:00
"""
Writes a string to the terminal session (on the pty level).
Useful for pre-typing and executing commands for the user.
:param data['shellcmd']: command to be written to the pty
"""
2018-03-03 13:14:44 +00:00
self.terminado_server.pty.write(data['shellcmd'])
2018-03-03 21:46:14 +00:00
def read(self, data):
2018-04-18 17:44:26 +00:00
"""
Reads the history of commands executed.
:param data['count']: the number of history elements to return
:return: 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']:]
2018-03-03 21:46:14 +00:00
return data
def cleanup(self):
if self.historymonitor:
self.historymonitor.stop()