Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion build_deb.sh
Original file line number Diff line number Diff line change
@@ -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 "
Expand Down
6 changes: 6 additions & 0 deletions debian/changelog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
pysieved (0.2.6) jammy; urgency=medium

* Replaced syslog with File Logging

-- Team noris SKG-PRJ <prj-d@noris.de> Fri, 05 DEC 2025 17:00:00 +0200

pysieved (0.2.5) jammy; urgency=medium

* Added tests
Expand Down
7 changes: 7 additions & 0 deletions debian/postinst
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions pysieved.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
67 changes: 51 additions & 16 deletions pysieved/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,18 @@
## 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
import os
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
Expand All @@ -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():
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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")
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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": [
Expand Down