mirror of
				https://github.com/avatao-content/baseimage-tutorial-framework
				synced 2025-10-31 02:32:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			85 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # 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
 | |
| from tfw.config.logs import logging
 | |
| from tao.config import TAOENV
 | |
| from .terminado_mini_server import TerminadoMiniServer
 | |
| 
 | |
| LOG = logging.getLogger(__name__)
 | |
| 
 | |
| 
 | |
| class TerminalEventHandler(EventHandlerBase):
 | |
|     """
 | |
|     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 handler.
 | |
|     """
 | |
|     def __init__(self, key, monitor):
 | |
|         """
 | |
|         :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
 | |
|         )
 | |
| 
 | |
|         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)
 | |
| 
 | |
|     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'])
 | |
| 
 | |
|     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 cleanup(self):
 | |
|         if self.historymonitor:
 | |
|             self.historymonitor.stop()
 |