From aab3fe9c0220e8875ac2dbdc3884eb3a3241d5b3 Mon Sep 17 00:00:00 2001 From: fliu <10025-fliu@users.noreply.salsa.debian.org> Date: Mon, 5 Jul 2021 21:27:18 +0000 Subject: [PATCH] email, plinth.log: Write more information to syslog sudo journalctl -b -o short-monotonic --no-pager -f --- actions/email_server | 33 +++++++++++++++++++++++++++++---- plinth/log.py | 23 +++++++++++++++++++++++ 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/actions/email_server b/actions/email_server index dad26f5d0..39b39610c 100755 --- a/actions/email_server +++ b/actions/email_server @@ -6,11 +6,15 @@ import logging import os import sys -logger = logging.getLogger(__name__) +import plinth.log EXIT_SYNTAX = 10 EXIT_PERM = 20 +# Set up logging +plinth.log.pipe_to_syslog(to_stderr='tty') +logger = logging.getLogger(os.path.basename(__file__)) + def reserved_for_root(fun): def wrapped(*args, **kwargs): @@ -22,6 +26,10 @@ def reserved_for_root(fun): def main(): + if not sys.stdin.isatty(): + print('WARNING: Output will not be shown. Check syslog for logs', + file=sys.stderr) + parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group(required=True) group.add_argument('-i', nargs=2, dest='ipc') @@ -32,7 +40,12 @@ def main(): subcommand, arguments = next(generator) function = globals()['subcommand_' + subcommand] - function(*arguments) + try: + function(*arguments) + except Exception as e: + logger.exception(e) + _log_additional_info() + sys.exit(1) @reserved_for_root @@ -56,13 +69,25 @@ def subcommand_ipc(module_name, action_name): def subcommand_touch_file(path): import pathlib - if os.getuid == 0: - logger.critical('Do not run as root') + if os.getuid() == 0: + logger.critical('Do not run the `-t` option as root') sys.exit(EXIT_PERM) # mode is influenced by umask pathlib.Path(path).touch(mode=0o660, exist_ok=True) +def _log_additional_info(): + import grp + import pwd + resu = ','.join(pwd.getpwuid(uid).pw_name for uid in os.getresuid()) + resg = ','.join(grp.getgrgid(gid).gr_name for gid in os.getresgid()) + pyver = sys.version.replace('\n', ' ') + logger.error('--- Additional Information ---') + logger.error('resuid=%s, resgid=%s', resu, resg) + logger.error('argv=%r, cwd=%r', sys.argv, os.getcwd()) + logger.error('pyver=%s (%s)', pyver, os.uname().machine) + + if __name__ == '__main__': main() diff --git a/plinth/log.py b/plinth/log.py index 0d0a316c4..ddf984321 100644 --- a/plinth/log.py +++ b/plinth/log.py @@ -5,6 +5,8 @@ Setup logging for the application. import importlib import logging +import logging.handlers +import sys import warnings import cherrypy @@ -127,3 +129,24 @@ def get_configuration(): configuration['root']['handlers'].append('journal') return configuration + + +def pipe_to_syslog(level=logging.INFO, to_stderr=True): + """Make the root logger write to syslog and stderr. Useful in actions""" + logger = logging.getLogger() + logger.setLevel(level) + + fmt = '/freedombox/%(name)s[%(process)d]: %(levelname)s: %(message)s' + formatter = logging.Formatter(fmt=fmt) + + # Using syslog in Python: https://stackoverflow.com/q/3968669 + syslog_handler = logging.handlers.SysLogHandler(address='/dev/log') + syslog_handler.setFormatter(formatter) + logger.addHandler(syslog_handler) + + if to_stderr == 'tty' and sys.stdin.isatty(): + to_stderr = True + if to_stderr is True: + stderr_handler = logging.StreamHandler() + stderr_handler.setFormatter(formatter) + logger.addHandler(stderr_handler)