Make files observable and refactor event handlers

This commit is contained in:
R. Richard
2019-06-27 14:12:01 +02:00
committed by Kristóf Tóth
parent 778f155580
commit ffe512776a
6 changed files with 123 additions and 81 deletions

View File

@ -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 = {

View File

@ -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()

View File

@ -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()