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