1
0
Fork 0
ynh-apps_tools/appslib/logging_sender.py
2024-04-29 21:28:11 +02:00

72 lines
1.9 KiB
Python

#!/usr/bin/env python3
import subprocess
import logging
import logging.handlers
def notify(message: str, channel: str, markdown: bool = False) -> None:
print(f"{channel} -> {message}")
chan_list = ["dev", "apps", "doc"]
if not any(channel in x for x in chan_list):
logging.error(
f"Provided chan '{channel}' is not part of the available options ('dev', 'apps', 'doc')."
)
for char in ["'", "`", "!", ";", "$"]:
message = message.replace(char, "")
command = [
"/var/www/webhooks/matrix-commander",
"--message",
message,
"--credentials",
"/var/www/webhooks/credentials.json",
"--store",
"/var/www/webhooks/store",
"--room",
f"yunohost-{channel}",
]
if markdown:
command.append("--markdown")
try:
subprocess.call(command, stdout=subprocess.DEVNULL)
except FileNotFoundError:
logging.warning(
"The logging sender tool /var/www/webhooks/matrix-commander does not exist."
)
except subprocess.CalledProcessError as e:
logging.warning(
f"""Could not send a notification on {channel}.
Message: {message}
Error: {e}"""
)
class LogSenderHandler(logging.Handler):
def __init__(self) -> None:
logging.Handler.__init__(self)
self.is_logging = False
def emit(self, record: logging.LogRecord) -> None:
msg = f"[Apps tools error] {record.message}"
notify(msg, "dev")
@classmethod
def add(cls, level: int = logging.ERROR) -> None:
if not logging.getLogger().handlers:
logging.basicConfig()
# create handler
handler = cls()
handler.setLevel(level)
# add the handler
logging.getLogger().handlers.append(handler)
def enable() -> None:
"""Enables the LogSenderHandler"""
LogSenderHandler.add(logging.ERROR)