From 25fdd3b81c2d867858f01a9d34c8741f698942a5 Mon Sep 17 00:00:00 2001 From: Daniel Kahn Gillmor Date: Thu, 21 Feb 2019 16:22:50 -0500 Subject: [PATCH] Do not create PidFile by default By default, avoid creating a PIDFile. PIDFiles are racy and potentially dangerous. Modern system supervision systems don't need them, because they manage the process groups directly. If the configuration file doesn't specify a PidFile, dkimpy-milter shouldn't try to create one. --- dkimpy_milter/config.py | 2 +- dkimpy_milter/util.py | 19 +++++++++++-------- man/dkimpy-milter.conf.5 | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/dkimpy_milter/config.py b/dkimpy_milter/config.py index c59ce55..3e2c736 100644 --- a/dkimpy_milter/config.py +++ b/dkimpy_milter/config.py @@ -40,7 +40,7 @@ defaultConfigData = { 'UMask': 0o07, 'Mode': 'sv', 'Socket': None, - 'PidFile': '/var/run/dkimpy-milter/dkimpy-milter.pid', + 'PidFile': None, 'UserID': 'dkimpy-milter', 'Canonicalization': 'relaxed/simple', 'InternalHosts': '127.0.0.1', diff --git a/dkimpy_milter/util.py b/dkimpy_milter/util.py index 1d5788d..56a57a4 100644 --- a/dkimpy_milter/util.py +++ b/dkimpy_milter/util.py @@ -115,34 +115,37 @@ def write_pid(milterconfig): """Write PID in pidfile. Will not overwrite an existing file.""" import os import syslog - if not os.path.isfile(milterconfig.get('PidFile')): + pidfile = milterconfig.get('PidFile') + if pidfile is None: + return + if not os.path.isfile(pidfile): pid = str(os.getpid()) try: - f = open(milterconfig.get('PidFile'), 'w') + f = open(pidfile, 'w') except IOError as e: if str(e)[:35] == '[Errno 2] No such file or directory': - piddir = milterconfig.get('PidFile').rsplit('/', 1)[0] + piddir = pidfile.rsplit('/', 1)[0] os.mkdir(piddir) user, group = user_group(milterconfig.get('UserID')) os.chown(piddir, user, group) - f = open(milterconfig.get('PidFile'), 'w') + f = open(pidfile, 'w') if milterconfig.get('Syslog'): syslog.syslog('PID dir created: {0}'.format(piddir)) else: if milterconfig.get('Syslog'): syslog.syslog('Unable to write pidfle {0}. IOError: {1}' - .format(milterconfig.get('PidFile'), e)) + .format(pidfile, e)) raise f.write(pid) f.close() user, group = user_group(milterconfig.get('UserID')) - os.chown(milterconfig.get('PidFile'), user, group) + os.chown(pidfile, user, group) else: if milterconfig.get('Syslog'): syslog.syslog('Unable to write pidfle {0}. File exists.' - .format(milterconfig.get('PidFile'))) + .format(pidfile)) raise RuntimeError('Unable to write pidfle {0}. File exists.' - .format(milterconfig.get('PidFile'))) + .format(pidfile)) return pid diff --git a/man/dkimpy-milter.conf.5 b/man/dkimpy-milter.conf.5 index a7e5d31..bb2a019 100644 --- a/man/dkimpy-milter.conf.5 +++ b/man/dkimpy-milter.conf.5 @@ -338,7 +338,7 @@ will be checked. [PeerList NOT IMPLEMENTED - included for reference only] .TP .I PidFile (string) Specifies the path to a file that should be created at process start -containing the process ID. +containing the process ID. If not specified, no such file will be created. .TP .I Selector (string)