diff --git a/etc/dkimpy-milter.openrc.in b/etc/dkimpy-milter.openrc.in new file mode 100644 index 0000000..cd12b11 --- /dev/null +++ b/etc/dkimpy-milter.openrc.in @@ -0,0 +1,54 @@ +#!/sbin/openrc-run +# Copyright 1999-2019 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +CONFFILE="@SYSCONFDIR@/${RC_SVCNAME}.conf" +required_files="${CONFFILE}" + +command="@SBINDIR@/dkimpy-milter" +pidfile="@RUNSTATEDIR@/${RC_SVCNAME}.pid" +command_args="-P ${pidfile} -x ${CONFFILE}" +extra_commands="checkconfig" + +depend() { + use dns logger net + before mta +} + +checkconfig() { + # + # The dkimpy-milter.conf man page says, + # + # For parameters that are Boolean in nature, only the first byte + # of the value is processed... For negative values, the following + # are accepted: "F", "f", "N", "n", "0".' + # + if @GREP@ '^[[:space:]]*Background[[:space:]]\+[FfNn0]' "${CONFFILE}" \ + >/dev/null 2>&1; then + eend 1 "${RC_SVCNAME} cannot run in the foreground!" + fi + if ! "${command}" -n "${command_args}"; then + eend 1 "${RC_SVCNAME} configuration check failed" + fi +} + +start_pre() { + # If this isn't a restart, make sure that the user's config isn't + # busted before we try to start the daemon (this will produce + # better error messages than if we just try to start it blindly). + # + # If, on the other hand, this *is* a restart, then the stop_pre + # action will have ensured that the config is usable and we don't + # need to do that again. + if [ "${RC_CMD}" != "restart" ]; then + checkconfig || return $? + fi +} + +stop_pre() { + # If this is a restart, check to make sure the user's config + # isn't busted before we stop the running daemon. + if [ "${RC_CMD}" = "restart" ]; then + checkconfig || return $? + fi +} diff --git a/setup.py b/setup.py index bc10b0f..fe7b17a 100644 --- a/setup.py +++ b/setup.py @@ -17,10 +17,60 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.""" from setuptools import setup +import distutils.cmd +import distutils.log +import sys import os +import subprocess description = "Domain Keys Identified Mail (DKIM) signing/verifying milter for Postfix/Sendmail." +class FileMacroExpand(distutils.cmd.Command): + description = "Expand @@ variables in input files, simlar to make macros." + user_options = [ + ('sysconfigdir=', 'e', 'Specify configuration directory. [/usr/local/etc]'), + ('sbindir=', 's', 'Specify system binary directory. [/usr/local/sbin]'), + ('bindir=', 'b', 'Specify binary directory. [/usr/loca/bin]'), + ('rundir=', 'r', 'Specify run state directory. [/run]'), + ] + + def initialize_options(self): + self.sysconfigdir = '/usr/local/etc' + self.sbindir = '/usr/local/sbin' + self.bindir = '/usr/local/bin' + self.rundir = '/run' + # For this option, we find the system grep, wherever it is and use it, + # no override provided. + self.grep = subprocess.check_output(["which", "grep"]).decode()[:-1] + + def finalize_options(self): + pass + + def run(self): + files = ['etc/dkimpy-milter.openrc',] + for infile in files: + outfile = '' + filein = open(infile + '.in') + for line in filein: + for function in ["@SYSCONFDIR@", "@SBINDIR@", "@BINDIR@", "@RUNSTATEDIR@", "@GREP@"]: + splitline = line.split(function) + if len(splitline) > 1: + if function == "@SYSCONFDIR@": + line = splitline[0] + self.sysconfigdir + splitline[1] + elif function == "@SBINDIR@": + line = splitline[0] + self.sbindir + splitline[1] + elif function == "@BINDIR@": + line = splitline[0] + self.bindir + splitline[1] + elif function == "@RUNSTATEDIR@": + line = splitline[0] + self.rundir + splitline[1] + elif function == "@GREP@": + line = splitline[0] + self.grep + splitline[1] + outfile += line + out = open(infile, 'w') + for line in outfile: + out.write(line) + out.close() + kw = {} # Work-around for lack of 'or' requires in setuptools. try: import dns @@ -62,5 +112,8 @@ setup( ['system/dkimpy-milter.service']),(os.path.join('etc', 'init.d'), ['system/dkimpy-milter'])], zip_safe = False, + cmdclass={ + 'expand': FileMacroExpand, + }, **kw )