mirror of
				https://github.com/avatao-content/baseimage-tutorial-framework
				synced 2025-11-04 12:52:54 +00:00 
			
		
		
		
	Make files observable and refactor event handlers
This commit is contained in:
		@@ -10,18 +10,28 @@ from tfw.components.inotify import InotifyObserver
 | 
			
		||||
 | 
			
		||||
LOG = logging.getLogger(__name__)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class IdeInotifyObserver(InotifyObserver):
 | 
			
		||||
    def __init__(self, paths):
 | 
			
		||||
        self.uplink = TFWServerUplinkConnector()
 | 
			
		||||
        super().__init__(paths)
 | 
			
		||||
 | 
			
		||||
    def on_modified(self, event):
 | 
			
		||||
        LOG.debug(event)
 | 
			
		||||
        self.uplink.send_message({
 | 
			
		||||
            'key': 'ide',
 | 
			
		||||
            'data': {'command': 'reload'}
 | 
			
		||||
        }, Scope.WEBSOCKET)
 | 
			
		||||
BUILD_ARTIFACTS = [
 | 
			
		||||
    "*.a",
 | 
			
		||||
    "*.class",
 | 
			
		||||
    "*.dll",
 | 
			
		||||
    "*.dylib",
 | 
			
		||||
    "*.elf",
 | 
			
		||||
    "*.exe",
 | 
			
		||||
    "*.jar",
 | 
			
		||||
    "*.ko",
 | 
			
		||||
    "*.la",
 | 
			
		||||
    "*.lib",
 | 
			
		||||
    "*.lo",
 | 
			
		||||
    "*.o",
 | 
			
		||||
    "*.obj",
 | 
			
		||||
    "*.out",
 | 
			
		||||
    "*.py[cod]",
 | 
			
		||||
    "*.so",
 | 
			
		||||
    "*.so.*",
 | 
			
		||||
    "*.tar.gz",
 | 
			
		||||
    "*.zip",
 | 
			
		||||
    "*__pycache__*"
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class IdeEventHandler(FrontendEventHandlerBase):
 | 
			
		||||
@@ -60,7 +70,14 @@ class IdeEventHandler(FrontendEventHandlerBase):
 | 
			
		||||
                f'No file(s) in IdeEventHandler working_directory "{directory}"!'
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        self.monitor = IdeInotifyObserver(self.filemanager.allowed_directories)
 | 
			
		||||
        self.monitor = InotifyObserver(self.filemanager.allowed_directories, exclude=BUILD_ARTIFACTS)
 | 
			
		||||
        def on_modified(event):
 | 
			
		||||
            LOG.debug(event)
 | 
			
		||||
            self.server_connector.send_message({
 | 
			
		||||
                'key': 'ide',
 | 
			
		||||
                'data': {'command': 'reload'}
 | 
			
		||||
            }, Scope.WEBSOCKET)
 | 
			
		||||
        self.monitor.on_modified = on_modified
 | 
			
		||||
        self.monitor.start()
 | 
			
		||||
 | 
			
		||||
        self.commands = {
 | 
			
		||||
 
 | 
			
		||||
@@ -13,32 +13,26 @@ LOG = logging.getLogger(__name__)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class LogInotifyObserver(InotifyObserver, SupervisorLogMixin):
 | 
			
		||||
    def __init__(self, process_name, log_tail=0):
 | 
			
		||||
    def __init__(self, server_connector, process_name, log_tail=0):
 | 
			
		||||
        self.prevent_log_recursion()
 | 
			
		||||
        self.uplink = TFWServerUplinkConnector()
 | 
			
		||||
        self.process_name = process_name
 | 
			
		||||
        self.server_connector = server_connector
 | 
			
		||||
        self._process_name = process_name
 | 
			
		||||
        self.log_tail = log_tail
 | 
			
		||||
        self.procinfo = self.supervisor.getProcessInfo(self.process_name)
 | 
			
		||||
        super().__init__(
 | 
			
		||||
            [dirname(self.procinfo['stdout_logfile']), dirname(self.procinfo['stderr_logfile'])],
 | 
			
		||||
            [self.procinfo['stdout_logfile'], self.procinfo['stderr_logfile']]
 | 
			
		||||
        )
 | 
			
		||||
        InotifyObserver.__init__(self, [self.procinfo['stdout_logfile'], self.procinfo['stderr_logfile']])
 | 
			
		||||
 | 
			
		||||
    def reset(self, process_name, log_tail):
 | 
			
		||||
        self.process_name = process_name
 | 
			
		||||
        self.log_tail = log_tail
 | 
			
		||||
        self.procinfo = self.supervisor.getProcessInfo(self.process_name)
 | 
			
		||||
        self.paths = [
 | 
			
		||||
            dirname(self.procinfo['stdout_logfile']),
 | 
			
		||||
            dirname(self.procinfo['stderr_logfile'])
 | 
			
		||||
        ]
 | 
			
		||||
        self.patterns = [
 | 
			
		||||
            self.procinfo['stdout_logfile'],
 | 
			
		||||
            self.procinfo['stderr_logfile']
 | 
			
		||||
        ]
 | 
			
		||||
    @property
 | 
			
		||||
    def process_name(self):
 | 
			
		||||
        return self._process_name
 | 
			
		||||
    
 | 
			
		||||
    @process_name.setter
 | 
			
		||||
    def process_name(self, process_name):
 | 
			
		||||
        self._process_name = process_name
 | 
			
		||||
        self.procinfo = self.supervisor.getProcessInfo(process_name)
 | 
			
		||||
        self.paths = [self.procinfo['stdout_logfile'], self.procinfo['stderr_logfile']]
 | 
			
		||||
 | 
			
		||||
    def on_modified(self, event):
 | 
			
		||||
        self.uplink.send_message({
 | 
			
		||||
        self.server_connector.send_message({
 | 
			
		||||
            'key': 'processlog',
 | 
			
		||||
            'data': {
 | 
			
		||||
                'command': 'new_log',
 | 
			
		||||
@@ -67,7 +61,7 @@ class LogMonitoringEventHandler(FrontendEventHandlerBase):
 | 
			
		||||
        super().__init__(key)
 | 
			
		||||
        self.process_name = process_name
 | 
			
		||||
        self.log_tail = log_tail
 | 
			
		||||
        self.monitor = LogInotifyObserver(process_name, log_tail)
 | 
			
		||||
        self.monitor = LogInotifyObserver(self.server_connector, process_name, log_tail)
 | 
			
		||||
        self.monitor.start()
 | 
			
		||||
 | 
			
		||||
        self.command_handlers = {
 | 
			
		||||
@@ -89,7 +83,7 @@ class LogMonitoringEventHandler(FrontendEventHandlerBase):
 | 
			
		||||
        :param data: TFW message data containing 'value'
 | 
			
		||||
                     (name of the process to monitor)
 | 
			
		||||
        """
 | 
			
		||||
        self.monitor.reset(data['value'], self.log_tail)
 | 
			
		||||
        self.monitor.process_name = data['value']
 | 
			
		||||
 | 
			
		||||
    def handle_log_tail(self, data):
 | 
			
		||||
        """
 | 
			
		||||
@@ -100,7 +94,7 @@ class LogMonitoringEventHandler(FrontendEventHandlerBase):
 | 
			
		||||
        :param data: TFW message data containing 'value'
 | 
			
		||||
                     (new tail length)
 | 
			
		||||
        """
 | 
			
		||||
        self.monitor.reset(self.process_name, data['value'])
 | 
			
		||||
        self.monitor.log_tail = data['value']
 | 
			
		||||
 | 
			
		||||
    def cleanup(self):
 | 
			
		||||
        self.monitor.stop()
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@
 | 
			
		||||
import logging
 | 
			
		||||
 | 
			
		||||
from tfw.event_handlers import FrontendEventHandlerBase
 | 
			
		||||
from tfw.components import BashMonitor
 | 
			
		||||
from tfw.components.terminado_mini_server import TerminadoMiniServer
 | 
			
		||||
from tfw.config import TFWENV
 | 
			
		||||
from tao.config import TAOENV
 | 
			
		||||
@@ -21,13 +22,13 @@ class TerminalEventHandler(FrontendEventHandlerBase):
 | 
			
		||||
    a command to be executed.
 | 
			
		||||
    The API of each command is documented in their respective handler.
 | 
			
		||||
    """
 | 
			
		||||
    def __init__(self, key, monitor):
 | 
			
		||||
    def __init__(self, key):
 | 
			
		||||
        """
 | 
			
		||||
        :param key: key this EventHandler listens to
 | 
			
		||||
        :param monitor: tfw.components.HistoryMonitor instance to read command history from
 | 
			
		||||
        """
 | 
			
		||||
        super().__init__(key)
 | 
			
		||||
        self._historymonitor = monitor
 | 
			
		||||
        self._historymonitor = BashMonitor(self.server_connector, TFWENV.HISTFILE)
 | 
			
		||||
        bash_as_user_cmd = ['sudo', '-u', TAOENV.USER, 'bash']
 | 
			
		||||
 | 
			
		||||
        self.terminado_server = TerminadoMiniServer(
 | 
			
		||||
@@ -42,8 +43,7 @@ class TerminalEventHandler(FrontendEventHandlerBase):
 | 
			
		||||
            'read': self.read
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if self._historymonitor:
 | 
			
		||||
            self._historymonitor.start()
 | 
			
		||||
        self._historymonitor.start()
 | 
			
		||||
        self.terminado_server.listen()
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
@@ -84,5 +84,4 @@ class TerminalEventHandler(FrontendEventHandlerBase):
 | 
			
		||||
 | 
			
		||||
    def cleanup(self):
 | 
			
		||||
        self.terminado_server.stop()
 | 
			
		||||
        if self.historymonitor:
 | 
			
		||||
            self.historymonitor.stop()
 | 
			
		||||
        self.historymonitor.stop()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user