1
0
Files
2022-09-29 17:59:04 +03:00

218 lines
5.2 KiB
Bash

#! /sbin/sh
#Tag 0x00000f00
# Start sendmail demon after checking that things are healthy.
# $Revision: 1.63 $
CONFIG=/etc/config
IS_ON=/sbin/chkconfig
QUEUEDIR=/var/spool/mqueue
MAILDIR=/var/mail
G_RC=/usr/local/etc/mgmt/rc
if $IS_ON verbose ; then # For a verbose startup and shutdown
ECHO=echo
VERBOSE=-v
else # For a quiet startup and shutdown
ECHO=:
VERBOSE=
fi
if $IS_ON cap_su_off && test "`sysconf MAC`" -eq 1; then
CSU=csu_off
csu_off () {
while true; do
case "$1" in
-M) shift 2;;
-M?*) shift;;
-m) shift;;
-C) shift 2;;
-C?*) shift;;
*) break;;
esac
done
shift
eval $*
return
}
else
CSU="/sbin/suattr"
fi
CSU_DBADMIN="$CSU -M dbadmin"
CAP_SENDMAIL="CAP_PRIV_PORT+ip"
parse_args () {
OPTS=""
while true; do
case "$1" in
-q) DOPTS="$DOPTS $1$2"; shift 2;;
-q?*) DOPTS="$DOPTS $1"; shift;;
-bd) shift;;
"") break;;
*) OPTS="$OPTS $1"; shift;;
esac
done
if test "$DOPTS" = ""; then
DOPTS="-bd -q15m"
else
DOPTS="-bd $DOPTS"
fi
return
}
case "$1" in
'start')
$ECHO "Mailer daemons: \c"
# Choose sendmail options. The file might contain something like -om
# to turn on "metoo"
OPTS=`cat $CONFIG/sendmail.options 2>/dev/null`
# Force $G if Gauntlet appears to be installed.
if [ -f /etc/init.d/gauntlet ]; then
if expr "$OPTS" : "oMGgauntlet" >/dev/null; then
OPTS="$OPTS -oMGgauntlet"
fi
$G_RC/S100mail stop
fi
parse_args $OPTS
# Move to post office directory
if $CSU -m -c "test ! -d ${MAILDIR} -a ! -L ${MAILDIR}"; then
mkdir -m 775 ${MAILDIR}
if test "`sysconf MAC`" -eq 1; then
chlabel -m ${MAILDIR}
fi
fi
olddir="`pwd`"
cd ${MAILDIR}
if test $? = 0; then
cd ${olddir}
if test "`sysconf MAC`" -eq 1; then
files=`$CSU -m -C CAP_MAC_READ+ipe -c "echo ${MAILDIR}/[A-Z]-[a-z]*"`
for f in $files; do
label=`$CSU -m -C CAP_MAC_READ+ipe -c "ls -1Md $f" \
| awk '{print $2}' \
| sed -e 's!\[!!' -e 's!\]!!'`
if $CSU -M $label -c "test ! -d ${MAILDIR}/:saved"; then
$CSU -M $label -c "mkdir ${MAILDIR}/:saved"
fi
$CSU -M $label -C CAP_FOWNER+ipe \
-c "chown root ${MAILDIR}/. ${MAILDIR}/:saved ; \
/sbin/find ${MAILDIR}/. -local -exec chgrp mail {} \\; \
-exec chmod g+w {} \\;"
done
else
if test ! -d ${MAILDIR}/:saved ; then
mkdir -m 775 ${MAILDIR}/:saved
fi
$CSU -C CAP_FOWNER+ipe \
-c "chown root.mail ${MAILDIR}/. ${MAILDIR}/:saved ; \
/sbin/find ${MAILDIR}/. -local \
\\( ! -group mail -o ! -perm -020 \\) \
-exec chgrp mail {} \\; \
-exec chmod g+w {} \\;"
fi
fi
# Move to spool directory. Make sure the directory exists, and is of the
# proper permissions
if test ! -d /var/spool; then
mkdir /var/spool
fi
if $CSU_DBADMIN -c "test ! -d ${QUEUEDIR}/."; then
$CSU_DBADMIN -c "mkdir -m 755 ${QUEUEDIR}"
fi
$CSU_DBADMIN -C CAP_FOWNER+ipe -c "chmod 755 ${QUEUEDIR}/.; \
chown root.mail ${QUEUEDIR}/."
# Make sure that /usr/lib/sendmail is executable and setuid root
if test ! -x /usr/lib/sendmail; then
echo "mail: no /usr/lib/sendmail, can't use mail"
exit 255
fi
# check the alias data base
if test ! -r /etc/aliases; then
echo "mail: /etc/aliases is missing, can't use mail"
exit 255
fi
if test ! -r /etc/aliases.dir -o ! -r /etc/aliases.pag; then
touch /etc/aliases.dir /etc/aliases.pag
sleep 1
touch /etc/aliases
fi
# Make sure that /bin/mail is correct
if test ! -x /bin/mail; then
echo "mail: no /bin/mail, can't use mail"
exit 255
fi
if test ! -c /dev/log; then
echo "mail: syslogd is not running, /dev/log does not exist"
exit 255
fi
# kill any old daemons
$CSU_DBADMIN -c "/sbin/killall -15 sendmail"
# Clean up any old lock files
$CSU_DBADMIN -c "rm -rf ${QUEUEDIR}/[tnx]f*" >/dev/null 2>&1
# If both smap and sendmail chkconfig'ed on, smap does and should prevail.
if $IS_ON smap; then
if test ! -d /usr/spool/smap; then
mkdir -m 755 -p /usr/spool/smap
chown smap /usr/spool/smap
fi
# /etc/sendmail.fc necessary since sendmail is still delivery agent
if test -s /etc/sendmail.fc; then
(echo "Freezing sendmail.cf" ;
/usr/lib/sendmail -bz) | logger -t sendmail
fi
# ignore SIGHUP from init, so backgrounded demons will not be killed
trap "" 1
# smap and other Gauntlet support is delt with in the gauntlet mail
# startup script
if [ -f /etc/init.d/gauntlet ]; then
$G_RC/S100mail start
fi
elif $IS_ON sendmail; then
# start the daemon.
if test -s /etc/sendmail.fc; then
FRZ="echo Freezing sendmail.cf; /usr/lib/sendmail -bz; "
fi
# start in background because starting can take a while
$CSU_DBADMIN -C $CAP_SENDMAIL -c \
"$FRZ /usr/lib/sendmail $DOPTS $OPTS" \
| logger -t sendmail &
$ECHO "sendmail."
else
$ECHO "none."
fi
# rebuild aliases just in case, but after freezing sendmail.cf.
$CSU_DBADMIN -c "rm -f /etc/aliases.pag /etc/aliases.dir /etc/aliases.db"
newaliases >/dev/null &
;;
'stop')
$CSU_DBADMIN -c "/sbin/killall -15 sendmail"
if [ -f /etc/init.d/gauntlet ]; then
$G_RC/S100mail stop
fi
;;
*)
echo "usage: $0 {start|stop}"
;;
esac