#!/bin/sh
#-----------------------------------------------------------------------------
#
# $Sendmail: update_sys,v @sm_version@ @sm_date@ @sm_time@ cowboy Exp $
#
# Update system files used by Sendmail for Debian
#
# Copyright (c) 2001-@SM_CPYRT@ Richard Nelson.  All Rights Reserved.
#
# Notes (to all):
#	* Several directories/files have their permissions forced...
#	  This is done to allow the MSP/MTA split
#	* This exec runs 'set +e' to ignore errors!!! this is done to
#	  support those running NFS (or similiar) systems, where the
#	  chmod/chown may fail - If this happens, you'll need to update
#	  those items by hand !
#
# Notes (to self):
#	*
#
#-----------------------------------------------------------------------------
set +e;

# Path to other sendmail helpers
if [ -x ./update_sendmail ]; then
	sm_path='.';
elif [ -x $(dirname $0)/update_sendmail ]; then
	sm_path=$(dirname $0);
else		
	sm_path=@datadir@/sendmail;
	fi;
# Bring in sendmail.conf for the network definitions
if [ ! -f @sysconfdir@/mail/sendmail.conf ]; then
	if [ -x $sm_path/update_conf ]; then
		$sm_path/update_conf;
		fi;
	fi;
if [ -f @sysconfdir@/mail/sendmail.conf ]; then
	. @sysconfdir@/mail/sendmail.conf;
	fi;
if [ "$HANDS_OFF" != 'No' ]; then
	exit 0;
	fi;

# flag used to indicate a dataset has been moved, may need another update
changed=0;

#-----------------------------------------------------------------------------
# Warn the user that this may take a bit...
#-----------------------------------------------------------------------------
echo '';
echo 'Checking filesystem, this may take some time - it will not hang!';
echo -n '  ...  ';

#------------------------------------------------------------------------------
# Create any needed directories, and move any prior data to its new home
#------------------------------------------------------------------------------
# /etc/aliases should exist, though not owned by sendmail, we'll create one
if [ ! -e @sysconfdir@/aliases ]; then
	changed=1;
	if [ -f @datadir@/doc/sendmail/examples/db/aliases ]; then
		echo "Creating @sysconfdir@/aliases (not found)";
		cp @datadir@/sendmail/examples/db/aliases \
			@sysconfdir@/aliases;
	else
		touch @sysconfdir@/aliases;
		fi;
	chown root:root @sysconfdir@/aliases;
	chmod 0644 @sysconfdir@/aliases;
	fi;

#------------------------------------------------------------------------------
# /var/mail is the FHS user mail location, /var/spool/mail is older
#	Note: we set the sticky bit to prevent a sgid exploit from erasing files
if [ ! -e @localstatedir@/mail ]; then
	changed=1;
	if [ -L @localstatedir@/spool/mail ]; then
		ln -sf spool/mail @localstatedir@/mail;
	elif [ -d @localstatedir@/spool/mail ]; then
		mv @localstatedir@/spool/mail @localstatedir@/mail;
		chown root:root @localstatedir@/mail;
		chmod 03777 @localstatedir@/mail;
	else
		mkdir @localstatedir@/mail;
		chown root:root @localstatedir@/mail;
		chmod 03777 @localstatedir@/mail;
		fi;
	fi;
#
# Make sure the sticky bit is set in pre-existing directories
if [ -d @localstatedir@/mail ] && [ ! -k @localstatedir@/mail ]; then
	chmod 03777 @localstatedir@/mail;
	fi;
if [ -d @localstatedir@/spool/mail ] \
&& [ ! -k @localstatedir@/spool/mail ]; then
	chmod a+t @localstatedir@/spool/mail;
	fi;
if [ ! -d @localstatedir@/spool/mail ] \
&& [ ! -L @localstatedir@/spool/mail ]; then
	ln -sf ../mail @localstatedir@/spool/mail;
	#mkdir @localstatedir@/spool/mail;
	#chown root:root @localstatedir@/spool/mail;
	#chmod 03777 @localstatedir@/spool/mail;
	fi;

#------------------------------------------------------------------------------
# /etc/mail is where the Sendmail config files live
if [ ! -d @sysconfdir@/mail ]; then
	changed=1;
	mkdir @sysconfdir@/mail;
	fi;
chown smmta:smmsp @sysconfdir@/mail;
chmod 02755 @sysconfdir@/mail;
mkdir -p @sysconfdir@/mail/m4;
chown smmta:smmsp @sysconfdir@/mail/m4;
chmod 02755 @sysconfdir@/mail/m4;
#
# With the MSP/MTA split, we don't want any g=w files or directories
# to save us from potential sgid attacks
find @sysconfdir@/mail -perm /g=w \( -type f -o -type d \) -print \
	| xargs -r chmod g-w,o-w;

#------------------------------------------------------------------------------
# /var/run/sendmail is where we store pid files, control sockets, stamps, etc
if [ ! -d @localstatedir@/run/sendmail ]; then
	changed=1;
	mkdir @localstatedir@/run/sendmail;
	fi;
chown root:smmta @localstatedir@/run/sendmail;
chmod 02755 @localstatedir@/run/sendmail;
if [ ! -d @localstatedir@/run/sendmail/mta ]; then
	mkdir @localstatedir@/run/sendmail/mta;
	fi;
chown smmta:smmsp @localstatedir@/run/sendmail/mta;
chmod 02755 @localstatedir@/run/sendmail/mta;
if [ ! -d @localstatedir@/run/sendmail/msp ]; then
	mkdir @localstatedir@/run/sendmail/msp;
	fi;
chown smmsp:smmsp @localstatedir@/run/sendmail/msp;
chmod 02775 @localstatedir@/run/sendmail/msp;
if [ ! -d @localstatedir@/run/sendmail/stampdir ]; then
	mkdir @localstatedir@/run/sendmail/stampdir;
	fi;
chown root:smmsp @localstatedir@/run/sendmail/stampdir;
chmod 02775 @localstatedir@/run/sendmail/stampdir;
#
# Remove older files
rm -f /var/run/sendmail.pid;
rm -f /var/run/sendmail/sendmail.pid;
rm -f /var/run/sendmail/smcontrol;

#------------------------------------------------------------------------------
# /var/lib/sendmail is where we stuff host status and sendmail.st
# instead of the mail queue and  /etc/ (respectively)
if [ ! -d @localstatedir@/lib/sendmail ]; then
	changed=1;
	mkdir @localstatedir@/lib/sendmail;
	fi;
chown smmta:smmsp @localstatedir@/lib/sendmail;
chmod 02751 @localstatedir@/lib/sendmail;
touch @localstatedir@/lib/sendmail/dead.letter;
chown smmta:smmsp @localstatedir@/lib/sendmail/dead.letter;
chmod 0660 @localstatedir@/lib/sendmail/dead.letter;
if [ -d /var/state/sendmail/host_status ]; then
	changed=1;
	echo "Moving /var/state/sendmail/host_status to /var/lib/sendmail/";
	mv -f /var/state/sendmail/host_status \
		@localstatedir@/lib/sendmail/host_status;
	fi;
if [ -d /var/sendmail/host_status ]; then
	changed=1;
	echo "Moving /var/sendmail/host_status to /var/lib/sendmail/";
	mv -f /var/sendmail/host_status \
		@localstatedir@/lib/sendmail/host_status;
	fi;
if [ ! -d @localstatedir@/lib/sendmail/host_status ]; then
	mkdir @localstatedir@/lib/sendmail/host_status;
	fi;
chown root:smmsp @localstatedir@/lib/sendmail/host_status;
chmod 02775 @localstatedir@/lib/sendmail/host_status;
find @localstatedir@/lib/sendmail/host_status -type d -print \
	| xargs -r chown root:smmsp;
find @localstatedir@/lib/sendmail/host_status -type d -print \
	| xargs -r chmod 02755;
#
# if sendmail.st doesn't exist, don't create it !
if [ -f /var/log/sendmail.st ]; then
	changed=1;
	echo "Moving /var/log/sendmail.st to /var/lib/sendmail/";
	mv /var/log/sendmail.st \
		@localstatedir@/lib/sendmail/sendmail.st;
	fi;
if [ -f /var/sendmail/sendmail.st ]; then
	changed=1;
	echo "Moving /var/sendmail/sendmail.st to /var/lib/sendmail/";
	mv /var/sendmail/sendmail.st \
		@localstatedir@/lib/sendmail/sendmail.st;
	fi;
if [ -f @localstatedir@/lib/sendmail/sendmail.st ]; then
	chown root:smmsp @localstatedir@/lib/sendmail/sendmail.st;
	chmod 0640 @localstatedir@/lib/sendmail/sendmail.st;
	if [ ! -f @localstatedir@/lib/sendmail/sm-client.st ]; then
		touch @localstatedir@/lib/sendmail/sm-client.st;
		fi;
	fi;
if [ -f @localstatedir@/lib/sendmail/sm-client.st ]; then
	chown smmsp:smmsp @localstatedir@/lib/sendmail/sm-client.st;
	chmod 0660 @localstatedir@/lib/sendmail/sm-client.st;
	fi;
if [ ! -f @localstatedir@/lib/sendmail/dead.letter ]; then
	touch @localstatedir@/lib/sendmail/dead.letter;
	fi;
chown root:smmsp @localstatedir@/lib/sendmail/dead.letter;
chmod 0660 @localstatedir@/lib/sendmail/dead.letter;
#
# Remove older files
rm -rf /var/sendmail;
rm -rf /var/state/sendmail;

#------------------------------------------------------------------------------
# /var/spool/mqueue is the MTA mail queue directory
if [ ! -d @localstatedir@/spool/mqueue ]; then
	changed=1;
	mkdir @localstatedir@/spool/mqueue;
	fi;
chown smmta:smmsp @localstatedir@/spool/mqueue;
chmod 02750 @localstatedir@/spool/mqueue;
#
# With the MSP/MTA split, we *DO* need g=r, gid=smmsp queue directories and
# files for mailq to work...
find @localstatedir@/spool/mqueue -print \
	| xargs -r chown smmta:smmsp;
find @localstatedir@/spool/mqueue -type d -print \
	| xargs -r chmod g+rxs-w,o-rwx;
find @localstatedir@/spool/mqueue -type f -print \
	| xargs -r chmod g+r-wx,o-rwx;

#------------------------------------------------------------------------------
# /var/spool/mqueue-client is the MSP mail queue directory
if [ ! -d @localstatedir@/spool/mqueue-client ]; then
	mkdir @localstatedir@/spool/mqueue-client;
	fi;
chown smmsp:smmsp @localstatedir@/spool/mqueue-client;
chmod 02770 @localstatedir@/spool/mqueue-client;
find @localstatedir@/spool/mqueue-client -perm /o=r -print \
	| xargs -r chmod o-rwx;

#-----------------------------------------------------------------------------
echo ' Done.';

#------------------------------------------------------------------------------
exit $changed;
