diff options
Diffstat (limited to 'scripts/lib/scriptutils.py')
| -rw-r--r-- | scripts/lib/scriptutils.py | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/scripts/lib/scriptutils.py b/scripts/lib/scriptutils.py index e7e7021c24..c573dc7f67 100644 --- a/scripts/lib/scriptutils.py +++ b/scripts/lib/scriptutils.py | |||
| @@ -16,12 +16,51 @@ import string | |||
| 16 | import subprocess | 16 | import subprocess |
| 17 | import sys | 17 | import sys |
| 18 | import tempfile | 18 | import tempfile |
| 19 | import threading | ||
| 19 | import importlib | 20 | import importlib |
| 20 | from importlib import machinery | 21 | from importlib import machinery |
| 21 | 22 | ||
| 22 | def logger_create(name, stream=None): | 23 | class KeepAliveStreamHandler(logging.StreamHandler): |
| 24 | def __init__(self, keepalive=True, **kwargs): | ||
| 25 | super().__init__(**kwargs) | ||
| 26 | if keepalive is True: | ||
| 27 | keepalive = 5000 # default timeout | ||
| 28 | self._timeout = threading.Condition() | ||
| 29 | self._stop = False | ||
| 30 | |||
| 31 | # background thread waits on condition, if the condition does not | ||
| 32 | # happen emit a keep alive message | ||
| 33 | def thread(): | ||
| 34 | while not self._stop: | ||
| 35 | with self._timeout: | ||
| 36 | if not self._timeout.wait(keepalive): | ||
| 37 | self.emit(logging.LogRecord("keepalive", logging.INFO, | ||
| 38 | None, None, "Keepalive message", None, None)) | ||
| 39 | |||
| 40 | self._thread = threading.Thread(target = thread, daemon = True) | ||
| 41 | self._thread.start() | ||
| 42 | |||
| 43 | def close(self): | ||
| 44 | # mark the thread to stop and notify it | ||
| 45 | self._stop = True | ||
| 46 | with self._timeout: | ||
| 47 | self._timeout.notify() | ||
| 48 | # wait for it to join | ||
| 49 | self._thread.join() | ||
| 50 | super().close() | ||
| 51 | |||
| 52 | def emit(self, record): | ||
| 53 | super().emit(record) | ||
| 54 | # trigger timer reset | ||
| 55 | with self._timeout: | ||
| 56 | self._timeout.notify() | ||
| 57 | |||
| 58 | def logger_create(name, stream=None, keepalive=None): | ||
| 23 | logger = logging.getLogger(name) | 59 | logger = logging.getLogger(name) |
| 24 | loggerhandler = logging.StreamHandler(stream=stream) | 60 | if keepalive is not None: |
| 61 | loggerhandler = KeepAliveStreamHandler(stream=stream, keepalive=keepalive) | ||
| 62 | else: | ||
| 63 | loggerhandler = logging.StreamHandler(stream=stream) | ||
| 25 | loggerhandler.setFormatter(logging.Formatter("%(levelname)s: %(message)s")) | 64 | loggerhandler.setFormatter(logging.Formatter("%(levelname)s: %(message)s")) |
| 26 | logger.addHandler(loggerhandler) | 65 | logger.addHandler(loggerhandler) |
| 27 | logger.setLevel(logging.INFO) | 66 | logger.setLevel(logging.INFO) |
