From 2399ee00108d2e7edd46b8a752d80c14949816c1 Mon Sep 17 00:00:00 2001 From: Scott Kitterman Date: Fri, 16 Feb 2018 17:12:41 -0500 Subject: [PATCH] Implement and test PidFile option. Update TODO --- TODO | 3 ++- dkimpy_milter/__init__.py | 2 ++ dkimpy_milter/util.py | 20 ++++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/TODO b/TODO index 2825a97..2e3dcdb 100644 --- a/TODO +++ b/TODO @@ -7,7 +7,7 @@ Domain implemented KeyFile implemented KeyFileEd25519 Mode implemented -PidFile +PidFile implemented verified Selector implemented Socket implemented verified Syslog implemented partly tested @@ -17,6 +17,7 @@ UserID implemented verified 0.9.5 (Beta) dkimpy-milter.8 dkimpy-milter.service +remove PidFile on stop AuthservID Canonicalization Diagnostics diff --git a/dkimpy_milter/__init__.py b/dkimpy_milter/__init__.py index 73659db..69ee682 100644 --- a/dkimpy_milter/__init__.py +++ b/dkimpy_milter/__init__.py @@ -37,6 +37,7 @@ from Milter.utils import iniplist,parse_addr,parseaddr import dkimpy_milter.config as config from dkimpy_milter.util import drop_privileges from dkimpy_milter.util import setExceptHook +from dkimpy_milter.util import write_pid FWS = re.compile(r'\r?\n[ \t]+') @@ -235,6 +236,7 @@ def main(): if milterconfig.get('Syslog'): syslog.openlog(os.path.basename(sys.argv[0]), syslog.LOG_PID, syslog.LOG_MAIL) setExceptHook() + write_pid(milterconfig) drop_privileges(milterconfig) Milter.factory = dkimMilter(milterconfig) Milter.set_flags(Milter.CHGHDRS + Milter.ADDHDRS) diff --git a/dkimpy_milter/util.py b/dkimpy_milter/util.py index 0c80ff6..97434e6 100644 --- a/dkimpy_milter/util.py +++ b/dkimpy_milter/util.py @@ -72,3 +72,23 @@ class ExceptHook: def setExceptHook(): import sys sys.excepthook = ExceptHook(useSyslog = 1, useStderr = 1) + +#################### +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')): + pid = str(os.getpid()) + try: + f = open(milterconfig.get('PidFile'), 'w') + except IOError as e: + if milterconfig.get('Syslog'): + syslog.syslog('Unable to write pidfle {0}. IOError: {1}'.format(milterconfig.get('PidFile'), e)) + raise + f.write(pid) + f.close() + else: + if milterconfig.get('Syslog'): + syslog.syslog('Unable to write pidfle {0}. File exists.'.format(milterconfig.get('PidFile'))) + raise RuntimeError('Unable to write pidfle {0}. File exists.'.format(milterconfig.get('PidFile'))) \ No newline at end of file