mirror of
				https://github.com/avatao-content/baseimage-tutorial-framework
				synced 2025-11-04 09:42:54 +00:00 
			
		
		
		
	Simplify terminal handler
This commit is contained in:
		@@ -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()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user