baseimage-tutorial-framework/tfw/components/terminal/terminal_handler.py

53 lines
1.4 KiB
Python
Raw Permalink Normal View History

2019-06-10 13:32:45 +00:00
import logging
from .history_monitor import BashMonitor
from .terminado_mini_server import TerminadoMiniServer
LOG = logging.getLogger(__name__)
class TerminalHandler:
2019-08-08 13:05:37 +00:00
keys = ['terminal']
type_id = 'ControlEventHandler'
2018-04-18 17:44:26 +00:00
2019-08-07 07:47:28 +00:00
def __init__(self, *, port, user, working_directory, histfile):
self.connector, self._historymonitor = None, None
2019-07-23 13:32:50 +00:00
self._histfile = histfile
bash_as_user_cmd = ['sudo', '-u', user, 'bash']
2018-06-01 15:19:58 +00:00
self.terminado_server = TerminadoMiniServer(
'/terminal',
2019-07-23 13:32:50 +00:00
port,
2019-08-07 07:47:28 +00:00
working_directory,
bash_as_user_cmd
2018-06-01 15:19:58 +00:00
)
2019-08-07 07:47:28 +00:00
self.terminado_server.listen()
2018-06-01 15:19:58 +00:00
self.commands = {
2019-08-07 07:47:28 +00:00
'terminal.write': self.handle_write
2018-06-01 15:19:58 +00:00
}
def start(self):
self._historymonitor = BashMonitor(self.connector, self._histfile)
self._historymonitor.start()
@property
def historymonitor(self):
return self._historymonitor
def handle_event(self, message, _):
try:
2019-08-07 07:47:28 +00:00
self.commands[message['key']](message)
except KeyError:
LOG.error('IGNORING MESSAGE: Invalid message received: %s', message)
2018-03-03 13:14:44 +00:00
2019-08-07 07:47:28 +00:00
def handle_write(self, message):
concat = message.get('concat', False)
if not concat:
self.terminado_server.pty.write('\x15')
2019-08-07 07:47:28 +00:00
self.terminado_server.pty.write(message['command'])
def cleanup(self):
2019-05-31 11:10:33 +00:00
self.terminado_server.stop()
self.historymonitor.stop()