xref: /freebsd-13.1/libexec/rc/rc.d/sendmail (revision 0696600c)
1*0696600cSBjoern A. Zeeb#!/bin/sh
2*0696600cSBjoern A. Zeeb#
3*0696600cSBjoern A. Zeeb# $FreeBSD$
4*0696600cSBjoern A. Zeeb#
5*0696600cSBjoern A. Zeeb
6*0696600cSBjoern A. Zeeb# PROVIDE: mail
7*0696600cSBjoern A. Zeeb# REQUIRE: LOGIN FILESYSTEMS
8*0696600cSBjoern A. Zeeb#	we make mail start late, so that things like .forward's are not
9*0696600cSBjoern A. Zeeb#	processed until the system is fully operational
10*0696600cSBjoern A. Zeeb# KEYWORD: shutdown
11*0696600cSBjoern A. Zeeb
12*0696600cSBjoern A. Zeeb# XXX - Get together with sendmail mantainer to figure out how to
13*0696600cSBjoern A. Zeeb#	better handle SENDMAIL_ENABLE and 3rd party MTAs.
14*0696600cSBjoern A. Zeeb#
15*0696600cSBjoern A. Zeeb. /etc/rc.subr
16*0696600cSBjoern A. Zeeb
17*0696600cSBjoern A. Zeebname="sendmail"
18*0696600cSBjoern A. Zeebdesc="Electronic mail transport agent"
19*0696600cSBjoern A. Zeebrcvar="sendmail_enable"
20*0696600cSBjoern A. Zeebrequired_files="/etc/mail/${name}.cf"
21*0696600cSBjoern A. Zeebstart_precmd="sendmail_precmd"
22*0696600cSBjoern A. Zeeb
23*0696600cSBjoern A. Zeebload_rc_config $name
24*0696600cSBjoern A. Zeebcommand=${sendmail_program:-/usr/sbin/${name}}
25*0696600cSBjoern A. Zeebpidfile=${sendmail_pidfile:-/var/run/${name}.pid}
26*0696600cSBjoern A. Zeebprocname=${sendmail_procname:-/usr/sbin/${name}}
27*0696600cSBjoern A. Zeeb
28*0696600cSBjoern A. ZeebCERTDIR=/etc/mail/certs
29*0696600cSBjoern A. Zeeb
30*0696600cSBjoern A. Zeebcase ${sendmail_enable} in
31*0696600cSBjoern A. Zeeb[Nn][Oo][Nn][Ee])
32*0696600cSBjoern A. Zeeb	sendmail_enable="NO"
33*0696600cSBjoern A. Zeeb	sendmail_submit_enable="NO"
34*0696600cSBjoern A. Zeeb	sendmail_outbound_enable="NO"
35*0696600cSBjoern A. Zeeb	sendmail_msp_queue_enable="NO"
36*0696600cSBjoern A. Zeeb	;;
37*0696600cSBjoern A. Zeebesac
38*0696600cSBjoern A. Zeeb
39*0696600cSBjoern A. Zeeb# If sendmail_enable=yes, don't need submit or outbound daemon
40*0696600cSBjoern A. Zeebif checkyesno sendmail_enable; then
41*0696600cSBjoern A. Zeeb	sendmail_submit_enable="NO"
42*0696600cSBjoern A. Zeeb	sendmail_outbound_enable="NO"
43*0696600cSBjoern A. Zeebfi
44*0696600cSBjoern A. Zeeb
45*0696600cSBjoern A. Zeeb# If sendmail_submit_enable=yes, don't need outbound daemon
46*0696600cSBjoern A. Zeebif checkyesno sendmail_submit_enable; then
47*0696600cSBjoern A. Zeeb	sendmail_outbound_enable="NO"
48*0696600cSBjoern A. Zeebfi
49*0696600cSBjoern A. Zeeb
50*0696600cSBjoern A. Zeebsendmail_cert_create()
51*0696600cSBjoern A. Zeeb{
52*0696600cSBjoern A. Zeeb	cnname="${sendmail_cert_cn:-`hostname`}"
53*0696600cSBjoern A. Zeeb	cnname="${cnname:-amnesiac}"
54*0696600cSBjoern A. Zeeb
55*0696600cSBjoern A. Zeeb	# based upon:
56*0696600cSBjoern A. Zeeb	# http://www.sendmail.org/~ca/email/other/cagreg.html
57*0696600cSBjoern A. Zeeb	CAdir=`mktemp -d` &&
58*0696600cSBjoern A. Zeeb	certpass=`(date; ps ax ; hostname) | md5 -q`
59*0696600cSBjoern A. Zeeb
60*0696600cSBjoern A. Zeeb	# make certificate authority
61*0696600cSBjoern A. Zeeb	( cd "$CAdir" &&
62*0696600cSBjoern A. Zeeb	chmod 700 "$CAdir" &&
63*0696600cSBjoern A. Zeeb	mkdir certs crl newcerts &&
64*0696600cSBjoern A. Zeeb	echo "01" > serial &&
65*0696600cSBjoern A. Zeeb	:> index.txt &&
66*0696600cSBjoern A. Zeeb
67*0696600cSBjoern A. Zeeb	cat <<-OPENSSL_CNF > openssl.cnf &&
68*0696600cSBjoern A. Zeeb		RANDFILE	= $CAdir/.rnd
69*0696600cSBjoern A. Zeeb		[ ca ]
70*0696600cSBjoern A. Zeeb		default_ca	= CA_default
71*0696600cSBjoern A. Zeeb		[ CA_default ]
72*0696600cSBjoern A. Zeeb		dir		= .
73*0696600cSBjoern A. Zeeb		certs		= \$dir/certs		# Where the issued certs are kept
74*0696600cSBjoern A. Zeeb		crl_dir		= \$dir/crl		# Where the issued crl are kept
75*0696600cSBjoern A. Zeeb		database	= \$dir/index.txt	# database index file.
76*0696600cSBjoern A. Zeeb		new_certs_dir	= \$dir/newcerts	# default place for new certs.
77*0696600cSBjoern A. Zeeb		certificate	= \$dir/cacert.pem 	# The CA certificate
78*0696600cSBjoern A. Zeeb		serial		= \$dir/serial 		# The current serial number
79*0696600cSBjoern A. Zeeb		crlnumber	= \$dir/crlnumber	# the current crl number
80*0696600cSBjoern A. Zeeb		crl		= \$dir/crl.pem 	# The current CRL
81*0696600cSBjoern A. Zeeb		private_key	= \$dir/cakey.pem
82*0696600cSBjoern A. Zeeb		x509_extensions	= usr_cert		# The extensions to add to the cert
83*0696600cSBjoern A. Zeeb		name_opt 	= ca_default		# Subject Name options
84*0696600cSBjoern A. Zeeb		cert_opt 	= ca_default		# Certificate field options
85*0696600cSBjoern A. Zeeb		default_days	= 365			# how long to certify for
86*0696600cSBjoern A. Zeeb		default_crl_days= 30			# how long before next CRL
87*0696600cSBjoern A. Zeeb		default_md	= default		# use public key default MD
88*0696600cSBjoern A. Zeeb		preserve	= no			# keep passed DN ordering
89*0696600cSBjoern A. Zeeb		policy		= policy_anything
90*0696600cSBjoern A. Zeeb		[ policy_anything ]
91*0696600cSBjoern A. Zeeb		countryName		= optional
92*0696600cSBjoern A. Zeeb		stateOrProvinceName	= optional
93*0696600cSBjoern A. Zeeb		localityName		= optional
94*0696600cSBjoern A. Zeeb		organizationName	= optional
95*0696600cSBjoern A. Zeeb		organizationalUnitName	= optional
96*0696600cSBjoern A. Zeeb		commonName		= supplied
97*0696600cSBjoern A. Zeeb		emailAddress		= optional
98*0696600cSBjoern A. Zeeb		[ req ]
99*0696600cSBjoern A. Zeeb		default_bits		= 2048
100*0696600cSBjoern A. Zeeb		default_keyfile 	= privkey.pem
101*0696600cSBjoern A. Zeeb		distinguished_name	= req_distinguished_name
102*0696600cSBjoern A. Zeeb		attributes		= req_attributes
103*0696600cSBjoern A. Zeeb		x509_extensions	= v3_ca	# The extensions to add to the self signed cert
104*0696600cSBjoern A. Zeeb		string_mask = utf8only
105*0696600cSBjoern A. Zeeb		prompt = no
106*0696600cSBjoern A. Zeeb		[ req_distinguished_name ]
107*0696600cSBjoern A. Zeeb		countryName			= XX
108*0696600cSBjoern A. Zeeb		stateOrProvinceName		= Some-state
109*0696600cSBjoern A. Zeeb		localityName			= Some-city
110*0696600cSBjoern A. Zeeb		0.organizationName		= Some-org
111*0696600cSBjoern A. Zeeb		CN				= $cnname
112*0696600cSBjoern A. Zeeb		[ req_attributes ]
113*0696600cSBjoern A. Zeeb		challengePassword		= foobar
114*0696600cSBjoern A. Zeeb		unstructuredName		= An optional company name
115*0696600cSBjoern A. Zeeb		[ usr_cert ]
116*0696600cSBjoern A. Zeeb		basicConstraints=CA:FALSE
117*0696600cSBjoern A. Zeeb		nsComment			= "OpenSSL Generated Certificate"
118*0696600cSBjoern A. Zeeb		subjectKeyIdentifier=hash
119*0696600cSBjoern A. Zeeb		authorityKeyIdentifier=keyid,issuer
120*0696600cSBjoern A. Zeeb		[ v3_req ]
121*0696600cSBjoern A. Zeeb		basicConstraints = CA:FALSE
122*0696600cSBjoern A. Zeeb		keyUsage = nonRepudiation, digitalSignature, keyEncipherment
123*0696600cSBjoern A. Zeeb		[ v3_ca ]
124*0696600cSBjoern A. Zeeb		subjectKeyIdentifier=hash
125*0696600cSBjoern A. Zeeb		authorityKeyIdentifier=keyid:always,issuer
126*0696600cSBjoern A. Zeeb		basicConstraints = CA:true
127*0696600cSBjoern A. Zeeb	OPENSSL_CNF
128*0696600cSBjoern A. Zeeb
129*0696600cSBjoern A. Zeeb	# though we use a password, the key is discarded and never used
130*0696600cSBjoern A. Zeeb	openssl req -batch -passout pass:"$certpass" -new -x509 \
131*0696600cSBjoern A. Zeeb	    -keyout cakey.pem -out cacert.pem -days 3650 \
132*0696600cSBjoern A. Zeeb	    -config openssl.cnf -newkey rsa:2048 >/dev/null 2>&1 &&
133*0696600cSBjoern A. Zeeb
134*0696600cSBjoern A. Zeeb	# make new certificate
135*0696600cSBjoern A. Zeeb	openssl req -batch -nodes -new -x509 -keyout newkey.pem \
136*0696600cSBjoern A. Zeeb	    -out newreq.pem -days 365 -config openssl.cnf \
137*0696600cSBjoern A. Zeeb	    -newkey rsa:2048 >/dev/null 2>&1 &&
138*0696600cSBjoern A. Zeeb
139*0696600cSBjoern A. Zeeb	# sign certificate
140*0696600cSBjoern A. Zeeb	openssl x509 -x509toreq -in newreq.pem -signkey newkey.pem \
141*0696600cSBjoern A. Zeeb	    -out tmp.pem >/dev/null 2>&1 &&
142*0696600cSBjoern A. Zeeb	openssl ca -notext -config openssl.cnf \
143*0696600cSBjoern A. Zeeb	    -out newcert.pem -keyfile cakey.pem -cert cacert.pem \
144*0696600cSBjoern A. Zeeb	    -key "$certpass" -batch -infiles tmp.pem >/dev/null 2>&1 &&
145*0696600cSBjoern A. Zeeb
146*0696600cSBjoern A. Zeeb	mkdir -p "$CERTDIR" &&
147*0696600cSBjoern A. Zeeb	chmod 0755 "$CERTDIR" &&
148*0696600cSBjoern A. Zeeb	chmod 644 newcert.pem cacert.pem &&
149*0696600cSBjoern A. Zeeb	chmod 600 newkey.pem &&
150*0696600cSBjoern A. Zeeb	cp -p newcert.pem "$CERTDIR"/host.cert &&
151*0696600cSBjoern A. Zeeb	cp -p cacert.pem "$CERTDIR"/cacert.pem &&
152*0696600cSBjoern A. Zeeb	cp -p newkey.pem "$CERTDIR"/host.key &&
153*0696600cSBjoern A. Zeeb	ln -s cacert.pem "$CERTDIR"/`openssl x509 -hash -noout \
154*0696600cSBjoern A. Zeeb	    -in cacert.pem`.0)
155*0696600cSBjoern A. Zeeb
156*0696600cSBjoern A. Zeeb	retVal="$?"
157*0696600cSBjoern A. Zeeb	rm -rf "$CAdir"
158*0696600cSBjoern A. Zeeb
159*0696600cSBjoern A. Zeeb	return "$retVal"
160*0696600cSBjoern A. Zeeb}
161*0696600cSBjoern A. Zeeb
162*0696600cSBjoern A. Zeebsendmail_precmd()
163*0696600cSBjoern A. Zeeb{
164*0696600cSBjoern A. Zeeb	# Die if there's pre-8.10 custom configuration file.  This check is
165*0696600cSBjoern A. Zeeb	# mandatory for smooth upgrade.  See NetBSD PR 10100 for details.
166*0696600cSBjoern A. Zeeb	#
167*0696600cSBjoern A. Zeeb	if checkyesno ${rcvar} && [ -f "/etc/${name}.cf" ]; then
168*0696600cSBjoern A. Zeeb		if ! cmp -s "/etc/mail/${name}.cf" "/etc/${name}.cf"; then
169*0696600cSBjoern A. Zeeb			warn \
170*0696600cSBjoern A. Zeeb    "${name} was not started; you have multiple copies of sendmail.cf."
171*0696600cSBjoern A. Zeeb			return 1
172*0696600cSBjoern A. Zeeb		fi
173*0696600cSBjoern A. Zeeb	fi
174*0696600cSBjoern A. Zeeb
175*0696600cSBjoern A. Zeeb	# check modifications on /etc/mail/aliases
176*0696600cSBjoern A. Zeeb	if checkyesno sendmail_rebuild_aliases; then
177*0696600cSBjoern A. Zeeb		if [ -f "/etc/mail/aliases.db" ]; then
178*0696600cSBjoern A. Zeeb			if [ "/etc/mail/aliases" -nt "/etc/mail/aliases.db" ]; then
179*0696600cSBjoern A. Zeeb				echo \
180*0696600cSBjoern A. Zeeb	    	"${name}: /etc/mail/aliases newer than /etc/mail/aliases.db, regenerating"
181*0696600cSBjoern A. Zeeb				/usr/bin/newaliases
182*0696600cSBjoern A. Zeeb			fi
183*0696600cSBjoern A. Zeeb		else
184*0696600cSBjoern A. Zeeb			echo \
185*0696600cSBjoern A. Zeeb	    	"${name}: /etc/mail/aliases.db not present, generating"
186*0696600cSBjoern A. Zeeb				/usr/bin/newaliases
187*0696600cSBjoern A. Zeeb		fi
188*0696600cSBjoern A. Zeeb	fi
189*0696600cSBjoern A. Zeeb
190*0696600cSBjoern A. Zeeb	if checkyesno sendmail_cert_create && [ ! \( \
191*0696600cSBjoern A. Zeeb	    -f "$CERTDIR/host.cert" -o -f "$CERTDIR/host.key" -o \
192*0696600cSBjoern A. Zeeb	    -f "$CERTDIR/cacert.pem" \) ]; then
193*0696600cSBjoern A. Zeeb		if ! openssl version >/dev/null 2>&1; then
194*0696600cSBjoern A. Zeeb			warn "OpenSSL not available, but sendmail_cert_create is YES."
195*0696600cSBjoern A. Zeeb		else
196*0696600cSBjoern A. Zeeb			info Creating certificate for sendmail.
197*0696600cSBjoern A. Zeeb			sendmail_cert_create
198*0696600cSBjoern A. Zeeb		fi
199*0696600cSBjoern A. Zeeb	fi
200*0696600cSBjoern A. Zeeb
201*0696600cSBjoern A. Zeeb	if [ ! -f /var/log/sendmail.st ]; then
202*0696600cSBjoern A. Zeeb		/usr/bin/install -m 640 -o root -g wheel /dev/null /var/log/sendmail.st
203*0696600cSBjoern A. Zeeb	fi
204*0696600cSBjoern A. Zeeb}
205*0696600cSBjoern A. Zeeb
206*0696600cSBjoern A. Zeebrun_rc_command "$1"
207*0696600cSBjoern A. Zeeb
208*0696600cSBjoern A. Zeebrequired_files=
209*0696600cSBjoern A. Zeeb
210*0696600cSBjoern A. Zeebif checkyesno sendmail_submit_enable; then
211*0696600cSBjoern A. Zeeb	name="sendmail_submit"
212*0696600cSBjoern A. Zeeb	rcvar="sendmail_submit_enable"
213*0696600cSBjoern A. Zeeb	_rc_restart_done=false
214*0696600cSBjoern A. Zeeb	run_rc_command "$1"
215*0696600cSBjoern A. Zeebfi
216*0696600cSBjoern A. Zeeb
217*0696600cSBjoern A. Zeebif checkyesno sendmail_outbound_enable; then
218*0696600cSBjoern A. Zeeb	name="sendmail_outbound"
219*0696600cSBjoern A. Zeeb	rcvar="sendmail_outbound_enable"
220*0696600cSBjoern A. Zeeb	_rc_restart_done=false
221*0696600cSBjoern A. Zeeb	run_rc_command "$1"
222*0696600cSBjoern A. Zeebfi
223*0696600cSBjoern A. Zeeb
224*0696600cSBjoern A. Zeebname="sendmail_msp_queue"
225*0696600cSBjoern A. Zeebrcvar="sendmail_msp_queue_enable"
226*0696600cSBjoern A. Zeebpidfile="${sendmail_msp_queue_pidfile:-/var/spool/clientmqueue/sm-client.pid}"
227*0696600cSBjoern A. Zeebrequired_files="/etc/mail/submit.cf"
228*0696600cSBjoern A. Zeeb_rc_restart_done=false
229*0696600cSBjoern A. Zeebrun_rc_command "$1"
230