summaryrefslogtreecommitdiff
blob: b4700e300abcd5fa1b7826b6590a23bb4ba9f959 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
diff --git a/Makefile.am b/Makefile.am
index ee2d21ab..b085b988 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -39,6 +39,52 @@ DISTCLEANFILES = opendkim-@VERSION@.tar.gz
 # though.
 DISTCHECK_CONFIGURE_FLAGS=--enable-vbr --with-lua --enable-stats --with-odbx --with-db --with-openssl=/usr/local --enable-atps --enable-replace_rules
 
+
+#
+# Handle some scripts and configuration files that need @VARIABLE@
+# replacements here, so that we can share the rules (which are
+# identical) between all of the targets.
+#
+
+# We want to *build and install* these on the target machine.
+nodist_doc_DATA = contrib/OpenRC/opendkim.openrc \
+                  contrib/systemd/opendkim.service \
+                  contrib/systemd/opendkim.tmpfiles \
+                  opendkim/opendkim.conf.simple \
+                  opendkim/opendkim.conf.simple-verify
+
+# Custom variable to keep the rule below as sane as possible.
+doc_DATA_intermediate = contrib/OpenRC/opendkim.openrc.in
+
+# We want to *ship* these.
+EXTRA_DIST = contrib/OpenRC/opendkim.openrc.in.in \
+             contrib/systemd/opendkim.service.in \
+             contrib/systemd/opendkim.tmpfiles.in \
+             opendkim/opendkim.conf.simple.in \
+             opendkim/opendkim.conf.simple-verify.in
+
+# The next rule allow us to replace bindir, libdir, etc.  within
+# files. The example is taken from the autoconf documentation and can
+# be found in the "Installation Directory Variables" section.
+edit = sed -e 's|@DOMAIN[@]|$(DOMAIN)|g' \
+           -e 's|@RUNSTATEDIR[@]|$(runstatedir)|g' \
+           -e 's|@SBINDIR[@]|$(sbindir)|g' \
+           -e 's|@SYSCONFDIR[@]|$(sysconfdir)|g'
+
+# This rule includes EVERY source/intermediate file as a dependency of
+# EVERY output file, which is clearly wrong, but it may be the best we
+# can do without duplication. At least it's the right kind of wrong,
+# and rebuilds too often rather than not often enough.
+$(nodist_doc_DATA): $(doc_DATA_intermediate) $(EXTRA_DIST) Makefile
+	rm -f $@ $@.tmp
+	srcdir=''; \
+	  test -f ./$@.in || srcdir=$(srcdir)/; \
+	  $(edit) $${srcdir}$@.in > $@.tmp
+	mv $@.tmp $@
+
+
+
+
 $(DIST_ARCHIVES): distcheck
 
 $(DIST_ARCHIVES).md5: $(DIST_ARCHIVES)
diff --git a/configure.ac b/configure.ac
index 76914fd9..a478bb83 100644
--- a/configure.ac
+++ b/configure.ac
@@ -65,6 +65,9 @@ AC_PROG_CC_C99
 AM_PROG_CC_C_O
 AC_PROG_LIBTOOL
 
+# Used by the OpenRC service script, at least.
+AC_PROG_GREP
+
 PKG_PROG_PKG_CONFIG
 
 #
@@ -2628,6 +2631,11 @@ AC_SUBST(SPECCONFIGURE)
 AC_SUBST(SPECREQUIRES)
 AC_SUBST(SPECBUILDREQUIRES)
 
+# Autoconf 2.70 will support this, and many distros patch it in,
+# but Autoconf 2.70 hasn't actually been released yet.
+AS_IF([test -z "${runstatedir}"], [runstatedir='${localstatedir}/run'])
+AC_SUBST([runstatedir])
+
 #
 # Finish up
 #
@@ -2639,6 +2647,7 @@ AC_OUTPUT([	Makefile
 			contrib/docs/Makefile
 			contrib/init/Makefile
 			contrib/init/generic/Makefile
+			contrib/OpenRC/opendkim.openrc.in
 			contrib/init/redhat/Makefile
 			contrib/init/redhat/opendkim
 			contrib/init/redhat/opendkim-default-keygen
@@ -2650,8 +2659,6 @@ AC_OUTPUT([	Makefile
 			contrib/spec/Makefile
 			contrib/spec/opendkim.spec
 			contrib/stats/Makefile
-			contrib/systemd/Makefile
-			contrib/systemd/opendkim.service
 		libopendkim/opendkim.pc libopendkim/Makefile
 		libopendkim/docs/Makefile
 		libopendkim/tests/Makefile
@@ -2664,8 +2671,6 @@ AC_OUTPUT([	Makefile
 			opendkim/opendkim-lua.3 
 			opendkim/opendkim-testkey.8 opendkim/opendkim-stats.8
 			opendkim/opendkim-testmsg.8 opendkim/opendkim.conf.5
-			opendkim/opendkim.conf.simple
-			opendkim/opendkim.conf.simple-verify
 			opendkim/opendkim-atpszone.8 opendkim/opendkim-spam.1
 		opendkim/tests/Makefile
 		stats/Makefile stats/opendkim-importstats.8
diff --git a/contrib/Makefile.am b/contrib/Makefile.am
index 76df01cd..401130bb 100644
--- a/contrib/Makefile.am
+++ b/contrib/Makefile.am
@@ -3,6 +3,6 @@
 
 #AUTOMAKE_OPTIONS = foreign
 
-SUBDIRS = convert docs init ldap lua patches repute spec stats systemd
+SUBDIRS = convert docs init ldap lua patches repute spec stats
 
 dist_doc_DATA = README
diff --git a/contrib/OpenRC/opendkim.openrc.in.in b/contrib/OpenRC/opendkim.openrc.in.in
new file mode 100644
index 00000000..4b783615
--- /dev/null
+++ b/contrib/OpenRC/opendkim.openrc.in.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@/opendkim"
+pidfile="@RUNSTATEDIR@/${RC_SVCNAME}.pid"
+command_args="-P ${pidfile} -x ${CONFFILE}"
+extra_commands="checkconfig"
+
+depend() {
+	use dns logger net
+	before mta
+}
+
+checkconfig() {
+	#
+	# The opendkim.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/contrib/systemd/Makefile.am b/contrib/systemd/Makefile.am
deleted file mode 100644
index 2ffc88cc..00000000
--- a/contrib/systemd/Makefile.am
+++ /dev/null
@@ -1,3 +0,0 @@
-# Copyright (c) 2013, The Trusted Domain Project.  All rights reserved.
-
-dist_doc_DATA = opendkim.service
diff --git a/contrib/systemd/opendkim.service.in b/contrib/systemd/opendkim.service.in
index f7665f43..236f8a06 100644
--- a/contrib/systemd/opendkim.service.in
+++ b/contrib/systemd/opendkim.service.in
@@ -1,20 +1,28 @@
-# If you are using OpenDKIM with SQL datasets it might be necessary to start OpenDKIM after the database servers.
-# For example, if using both MariaDB and PostgreSQL, change "After=" in the "[Unit]" section to:
-# After=network.target nss-lookup.target syslog.target mariadb.service postgresql.service
+# If you are using OpenDKIM with SQL datasets, you should start
+# OpenDKIM after your database server. For example, when using
+# PostgreSQL, you should create a supplementary ".conf" file in the
+# appropriate directory containing,
+#
+# [Unit]
+# After=postgresql.service
+#
 
 [Unit]
 Description=DomainKeys Identified Mail (DKIM) Milter
-Documentation=man:opendkim(8) man:opendkim.conf(5) man:opendkim-genkey(8) man:opendkim-genzone(8) man:opendkim-testadsp(8) man:opendkim-testkey http://www.opendkim.org/docs.html
+Documentation=man:opendkim(8) \
+              man:opendkim.conf(5) \
+              man:opendkim-genkey(8) \
+              man:opendkim-genzone(8) \
+              man:opendkim-testkey(8) \
+              http://www.opendkim.org/docs.html
 After=network.target nss-lookup.target syslog.target
 
 [Service]
 Type=forking
-PIDFile=@localstatedir@/run/opendkim/opendkim.pid
-EnvironmentFile=-@sysconfdir@/sysconfig/opendkim
-ExecStart=@sbindir@/opendkim $OPTIONS
+ExecStart=@SBINDIR@/opendkim -P @RUNSTATEDIR@/opendkim.pid
+ExecStartPre=@SBINDIR@/opendkim -P @RUNSTATEDIR@/opendkim.pid -n -f
 ExecReload=/bin/kill -USR1 $MAINPID
-User=opendkim
-Group=opendkim
+PIDFile=@RUNSTATEDIR@/opendkim.pid
 
 [Install]
 WantedBy=multi-user.target
diff --git a/contrib/systemd/opendkim.tmpfiles.in b/contrib/systemd/opendkim.tmpfiles.in
new file mode 100644
index 00000000..a9118974
--- /dev/null
+++ b/contrib/systemd/opendkim.tmpfiles.in
@@ -0,0 +1,5 @@
+# We allow everyone to read/traverse this directory because if it
+# contains a local socket, then (for example) your MTA will want to
+# look in there. Permissions on the socket itself are controlled
+# by the "UserID" and "UMask" directives in the daemon's configuration.
+d @RUNSTATEDIR@/opendkim 0755 opendkim opendkim
diff --git a/opendkim/Makefile.am b/opendkim/Makefile.am
index 4aa615c1..7d514771 100644
--- a/opendkim/Makefile.am
+++ b/opendkim/Makefile.am
@@ -16,9 +16,11 @@ endif
 sbin_PROGRAMS += opendkim-stats
 endif
 
+
 dist_sbin_SCRIPTS = opendkim-genkey
-dist_doc_DATA = opendkim.conf.sample opendkim.conf.simple \
-	opendkim.conf.simple-verify README.SQL
+
+dist_doc_DATA = opendkim.conf.sample README.SQL
+
 
 if BUILD_FILTER
 sbin_PROGRAMS += opendkim
diff --git a/opendkim/opendkim.conf.simple-verify.in b/opendkim/opendkim.conf.simple-verify.in
index 2224b64f..463048ab 100644
--- a/opendkim/opendkim.conf.simple-verify.in
+++ b/opendkim/opendkim.conf.simple-verify.in
@@ -17,5 +17,5 @@ Mode			v
 
 # ADSPDiscard	no
 
-# PidFile		/var/run/opendkim/opendkim.pid
+# PidFile		@RUNSTATEDIR@/opendkim.pid
 
diff --git a/opendkim/opendkim.conf.simple.in b/opendkim/opendkim.conf.simple.in
index 735b924b..b70bfb46 100644
--- a/opendkim/opendkim.conf.simple.in
+++ b/opendkim/opendkim.conf.simple.in
@@ -12,6 +12,12 @@ KeyFile			/var/db/dkim/@DOMAIN@.private
 
 Socket                  inet:8891@localhost
 
+# To use a local socket instead, specify a path here. The "standard"
+# location is under @RUNSTATEDIR@/opendkim, and it's best to agree
+# on that directory so that various init systems can configure its
+# permissions and ownership automatically.
+#Socket                 local:@RUNSTATEDIR@/opendkim/opendkim.sock
+
 ReportAddress           postmaster@@DOMAIN@
 SendReports             yes
 
@@ -25,4 +31,4 @@ SendReports             yes
 #
 # PeerList		X.X.X.X
 
-# PidFile		/var/run/opendkim/opendkim.pid
+# PidFile		@RUNSTATEDIR@/opendkim.pid