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