diff --git a/CHANGES.md b/CHANGES.md index 662ed34..3bcae4e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,11 @@ All notable changes to this project will be documented in this file. ### Changed +#### 2025-12-05 + +* `./pysieved/main.py`: Added file-based logging with `WatchedFileHandler` and removed syslog usage. +* `./pysieved.ini`: Added option for file logging path. + #### 2025-12-04 * `./.github/workflows/tests.yml`: Added Github action for running tests. diff --git a/build_deb.sh b/build_deb.sh index 876ceec..de4d9f2 100755 --- a/build_deb.sh +++ b/build_deb.sh @@ -1,6 +1,6 @@ #!/bin/bash -export BUILD_VERSION=${BUILD_VERSION:-0.2.5} +export BUILD_VERSION=${BUILD_VERSION:-0.2.6} docker build -t pysieved-deb-builder . docker run --name pysieved-builder pysieved-deb-builder bash -c " diff --git a/debian/changelog b/debian/changelog index fc4e33b..76cc10b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +pysieved (0.2.6) jammy; urgency=medium + + * Replaced syslog with File Logging + + -- Team noris SKG-PRJ Fri, 05 DEC 2025 17:00:00 +0200 + pysieved (0.2.5) jammy; urgency=medium * Added tests diff --git a/debian/postinst b/debian/postinst index d4e52e0..f002397 100755 --- a/debian/postinst +++ b/debian/postinst @@ -2,7 +2,14 @@ set -e +LOGDIR="/var/log/pysieved" + if [ "$1" = "configure" ]; then + if [ ! -d "$LOGDIR" ]; then + mkdir -p "$LOGDIR" + chmod 755 "$LOGDIR" + fi + if command -v systemctl >/dev/null 2>&1; then systemctl daemon-reload || true systemctl enable pysieved.service || true diff --git a/pysieved.ini b/pysieved.ini index 71edffb..3bb445c 100644 --- a/pysieved.ini +++ b/pysieved.ini @@ -20,6 +20,8 @@ pidfile = /var/run/pysieved.pid # Prepend this path to result of userdb lookup if not absolute #base = /var/mail +# Log file +logfile = /var/log/pysieved/pysieved.log [TLS] # Require STARTTLS before authentication diff --git a/pysieved/main.py b/pysieved/main.py index 3fb4eb9..adb85a9 100755 --- a/pysieved/main.py +++ b/pysieved/main.py @@ -18,7 +18,7 @@ ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 ## USA # -# 04 December 2025 - Modified by F. Ioannidis. +# 05 December 2025 - Modified by A. Manalikadis. import optparse @@ -26,7 +26,10 @@ import socket import socketserver as SocketServer import sys -import syslog +import logging +from logging.handlers import WatchedFileHandler +import getpass + from pysieved.config import Config from pysieved.managesieve import RequestHandler @@ -47,20 +50,52 @@ class Server(SocketServer.ForkingTCPServer): # Define defaults before they get overwritten VERBOSITY = 10 DEBUG = False +LOGGER = logging.getLogger("pysieved") - -def log(l, s): +def log(l: int, s: str) -> None: if l <= VERBOSITY: - if DEBUG: - sys.stderr.write("%s %s\n" % ("=" * l, s)) + if l > 0: + lvl = logging.INFO + elif l == 0: + lvl = logging.WARNING else: - if l > 0: - lvl = syslog.LOG_NOTICE - elif l == 0: - lvl = syslog.LOG_WARNING - else: - lvl = syslog.LOG_ERR - syslog.syslog(lvl, s) + lvl = logging.ERROR + + LOGGER.log(lvl, s) + + +def setup_logging(options: optparse.Values, config: Config) -> None: + global VERBOSITY, DEBUG, LOGGER + + VERBOSITY = options.verbosity + DEBUG = options.debug + + # Default logfile, overrideable by config + logfile = config.get("main", "logfile", "/var/log/pysieved/pysieved.log") + + # Base logger config + LOGGER.setLevel(logging.DEBUG) + + # Remove any existing handlers (if intiliazed more than once in tests) + LOGGER.handlers.clear() + + username = getpass.getuser() + + formatter = logging.Formatter( + fmt=f"%(asctime)s {username} [%(process)d] %(levelname)s: %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", + ) + + if DEBUG: + # In debug mode, log to stderr + handler = logging.StreamHandler(sys.stderr) + else: + # In normal mode, log to a logfile that notices rotation by logrotate + handler = WatchedFileHandler(logfile) + + handler.setFormatter(formatter) + LOGGER.addHandler(handler) + def cli(): @@ -173,9 +208,6 @@ def get_handler(options, config): tls_cert = options.tls_cert or config.get("TLS", "cert", "") tls_passphrase = config.get("TLS", "passphrase", "") - # Define the log function - syslog.openlog("pysieved[%d]" % (os.getpid()), 0, syslog.LOG_MAIL) - # Load TLS key and cert tls_privateKey = None tls_certChain = None @@ -323,6 +355,9 @@ def main(options: optparse.Values, _: list): # Read config file config = Config(options.config) + # Initialise logging + setup_logging(options, config) + addr = options.bindaddr or config.get("main", "bindaddr", "") port = options.port or config.getint("main", "port", 4190) pidfile = options.pidfile or config.get("main", "pidfile", "/var/run/pysieved.pid") diff --git a/setup.py b/setup.py index 907735f..480c780 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setup( name="pysieved", description="Core daemon for the pysieved project", - version=os.getenv("BUILD_VERSION", "0.2.5"), + version=os.getenv("BUILD_VERSION", "0.2.6"), packages=find_packages(where="."), entry_points={ "console_scripts": [