OpenSolaris_b135/cmd/bnu/uudemon.cleanup

#!/usr/bin/sh
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License, Version 1.0 only
# (the "License").  You may not use this file except in compliance
# with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright 1997 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
#ident	"%Z%%M%	%I%	%E% SMI"
#
#	This demon cleans up uucp directories.
#	It is started by /var/spool/cron/crontabs/uucp;
#	it can be run daily, weekly, whatever depending on the system
#	  uucp load.
#

# return a list of systems defined in /etc/uucp/Systems
getsystems() {
if [ ! -f /etc/uucp/Systems ]; then
  return
else
  awk '$1 !~ /^#/ {print $1}' /etc/uucp/Systems
fi
}

# return a list of systems defined in /etc/asppp.cf
getpppsystems() {
if [ ! -f /etc/asppp.cf ]; then
  return
else
  X=`sed -e 's/#.*$//' /etc/asppp.cf`
  set -- $X
  while [ $# -ne 0 ];
  do
      if [ "$1" = "peer_system_name" ]; then
          PPPSYSTEMS="$PPPSYSTEMS $2"
      fi
      shift
  done
  echo "$PPPSYSTEMS"
fi
}

nouucp() {
# run through the systems list, deleting ppp systems
outstr=""
for i in `getsystems`
do
    del=0
    for j in `getpppsystems`
    do
        if [ "$j" = "$i" ]; then
            del=1
        fi
    done
    if [ $del -ne 1 ]; then
        outstr="$outstr $i"
    fi
done

# if any names are in $outstr, assume uucp is configured

if [ -n "$outstr" ]; then
	return 1
else
	return 0
fi
}

# Start of actual processing. For energystar compatibility,
# we attempt to do as little I/O as possible, so first check
# to see if uucp is configured before doing all this work.

if nouucp; then
	exit 0
fi

MAILTO=uucp
MAILDIR=/var/mail
export PATH
PATH=/usr/bin:/usr/lib/uucp
TMP=/tmp/uu$$

#	Running as uucp, take care to protect things

umask 0022

#
#	These are taken from the Makefile.  If changed in Makefile
#	they must be changed here also.
#
PUBDIR=/var/spool/uucppublic
SPOOL=/var/spool/uucp
VAR=/var/uucp
LOCKS=/var/spool/locks	# needs a comment in parms.h on USRSPOOLOCKS
XQTDIR=$VAR/.Xqtdir
CORRUPT=$SPOOL/.Corrupt
LOGDIR=$VAR/.Log
SEQDIR=$VAR/.Sequence
STATDIR=$VAR/.Status
WORKDIR=$SPOOL/.Workspace
ADMIN=$VAR/.Admin

#	OLD is the directory for archiving old admin/log files
OLD=$VAR/.Old
O_LOGS=$OLD/Old-Log
ACCT_LOGS=$OLD/Old-acct
SEC_LOGS=$OLD/Old-sec

[ -f $ADMIN/xferstats ] && mv $ADMIN/xferstats $OLD/xferstats
[ -f $ADMIN/audit ] && mv $ADMIN/audit $OLD/audit
[ -f $ADMIN/command ] &&mv $ADMIN/command $OLD/command
[ -f $ADMIN/errors ] && mv $ADMIN/errors $OLD/errors
[ -f $ADMIN/Foreign ] && mv $ADMIN/Foreign $OLD/Foreign

> $ADMIN/xferstats
> $ADMIN/audit
> $ADMIN/command
> $ADMIN/errors
> $ADMIN/Foreign

#
#	If performance log exists, save it and create a new one
#
if [ -f $ADMIN/perflog ]
then
	mv $ADMIN/perflog $OLD/perflog
	> $ADMIN/perflog
fi

#
#	The list in the for controls how many old Log and security logs
#	are retained: 2 -> 3, 1 -> 2, current -> 1.
#
for i in  2 1
do
	j=`expr $i + 1`
	[ -f ${O_LOGS}-$i ] && mv ${O_LOGS}-$i ${O_LOGS}-$j
	[ -f ${SEC_LOGS}-$i ] && mv ${SEC_LOGS}-$i ${SEC_LOGS}-$j
done

[ -f $ADMIN/security ] && mv $ADMIN/security ${SEC_LOGS}-1
> $ADMIN/security

#
#	Combine all log files into O_LOGS-1.
#	Add a name separator between each system.
#
> ${O_LOGS}-1
for i in uucico uucp uux uuxqt
do
	if [ ! -d $LOGDIR/$i ]
	then
	      (echo "uudemon.cleanup: $LOGDIR/$i directory does not exist, remove if file"
	       echo "uudemon.cleanup: making a directory $LOGDIR/$i"
	      ) | mail $MAILTO
		rm -f $LOGDIR/$i
		mkdir $LOGDIR/$i
		continue
	fi
	cd $LOGDIR/$i

#	can't compare exactly because of symlinks
	case `pwd` in
	*`basename $LOGDIR`/$i)
		;;
	*)
	 	 (echo "uudemon.cleanup: unable to chdir to $LOGDIR/$i") | mail $MAILTO
		continue
		;;
	esac
	for j in *
	do
		if [ "$j" = "*" ]
		then
			break
		fi
		echo "********** $j ********** ($i)" >> ${O_LOGS}-1
		cat $j >> ${O_LOGS}-1
		rm -f $j
	done
done

#
#	If the accounting log exists, save it and create a new one.
#	The list in the for controls how many old accounting logs
#	are retained: 2 -> 3, 1 -> 2, current -> 1.
#
if [ -f $ADMIN/account ]
then
	for i in  2 1
	do
		j=`expr $i + 1`
		[ -f ${ACCT_LOGS}-$i ] && mv ${ACCT_LOGS}-$i ${ACCT_LOGS}-$j
	done
	[ -f $ADMIN/account ] && mv $ADMIN/account ${ACCT_LOGS}-1
	> $ADMIN/account
fi

#	Execute the system directory cleanup program
#	See uucleanup.1m for details.
uucleanup -D7 -C7 -X2 -o2 -W1

#	Use the grep instead of the mv to ignore warnings to uucp
# grep -v 'warning message sent to uucp' $ADMIN/uucleanup > $OLD/uucleanup
[ -f $ADMIN/uucleanup ] && mv $ADMIN/uucleanup $OLD/uucleanup
if [ -s $OLD/uucleanup ]
then
	(echo "Subject: cleanup"; echo; cat $OLD/uucleanup) | mail $MAILTO
fi
>$ADMIN/uucleanup

#  cleanup funny directories that may have been created in the spool areas
for d in $SPOOL/[0-9A-Za-z]*
do
	if [ -f $d ]
	then
		# skip any regular files, like lockfiles
		# and mail.log and so forth
		continue
	fi
	if [ -z "`ls $d`" ]
	then
		# empty directory
		continue
	fi
	cd $d
	# we'd check that we were in the correct directory
	if [ "`basename \`pwd\``" != "`basename $d`" ]
	then
		(echo "uudemon.cleanup: unable to chdir to $d") | mail $MAILTO
		continue
	fi
	for s in */*
	do
		if [ "$s" = "*/*" ]
		then
			break
		fi
		if [ -d $s ]
		then
			# Remove subdirs of subdirs
			rm -fr $s
		fi
	done

	# if it is now empty, remove it.
	cd ..
	rmdir $d/* $d
done >/dev/null 2>&1

#
#	Find old cores
#
find $SPOOL -name core -print > $TMP
if [ -s $TMP ]
then
	(echo "Subject: cores"; echo; cat $TMP) | mail $MAILTO
fi

#
#	Remove old files and directories
#
#find $PUBDIR -type f -mtime +30 -exec rm -f {} \;
find $PUBDIR/* -depth -type d -exec rmdir {} \; >/dev/null 2>&1
find $SPOOL/* -depth -type d -exec rmdir {} \; >/dev/null 2>&1
find $SEQDIR -type f -mtime +30 -exec rm -f {} \;
find $WORKDIR -type f -mtime +1 -exec rm -f {} \;
find $STATDIR -type f -mtime +2 -exec rm -f {} \;
find $CORRUPT -type f -mtime +10 -exec rm -f {} \;

rm -f $LOCKS/LTMP*
rmdir $SPOOL/[0-9A-Za-z]* >/dev/null 2>&1

#
#	Mail a daily summary of status
#
grep passwd ${O_LOGS}-1 > $TMP
grep "REQUEST.*/" ${O_LOGS}-1 >> $TMP
if [ -s $TMP ]
then
	(echo "Subject: uucp requests"; echo; cat $TMP) | mail $MAILTO
fi


awk '/(DENIED)/	{print prev}
		{prev = $0}' ${O_LOGS}-1 > $TMP
if [ -s $TMP ]
then
	(echo "Subject: uucp DENIED"; echo; cat $TMP) | mail $MAILTO
fi

uustat -q > $TMP
if [ -s $TMP ]
then
	(echo "Subject: uu-status"; echo; cat $TMP) | mail $MAILTO
fi

ls $CORRUPT > $TMP
if [ -s $TMP ]
then
	(echo "Subject: $CORRUPT"; echo; cat $TMP) | mail $MAILTO
fi

if [ -s $OLD/errors -o -s $OLD/Foreign ]
then
	(echo "Subject: uucp Admin"; \
	echo; echo tail errors; tail $OLD/errors; \
	echo; echo tail Foreign; tail $OLD/Foreign; \
	) | mail $MAILTO
fi
# don't run if no system directories exist
if [ "`echo $SPOOL/*`" != "$SPOOL/*" ]
then
	(echo "Subject: uucleanup ran; $SPOOL du"; echo; du $SPOOL) | \
		mail $MAILTO
fi

#
#	Dispose of mail to nuucp
#
rm -f $MAILDIR/nuucp $TMP