#!/bin/sh

set -- `getopt hd:r:m:knN $*`
if [ $? != 0 ]; then
	exit 2
fi

DRIVES=`mount | grep -v "^proc" | cut -d\  -f3`
REPORTFILE=/dev/stdout
MAILTO=""
CLEANUP=yes
FILES=yes
REPORT=yes

for i; do
	case "$i" in
		-h)	echo "Usage: [-h] [-d DRIVES] [-r REPORTFILE] [-m ADDRESS] [-k | -n | -N]"
			exit 0;;

		-d)	DRIVES=$2; shift;;
		-r)	REPORTFILE=$2; shift;;
		-m)	MAILTO=$2; shift;;
		-k)	CLEANUP=yes; FILES=no; REPORT=no;;
		-n)	CLEANUP=no; FILES=yes; REPORT=no;;
		-N)	CLEANUP=no; FILES=no; REPORT=yes;;
		--)	break;;
	esac
	shift
done

cd /var/spool/cruft || exit 1

# clean up from previous runs
if [ x$CLEANUP = xyes ]; then
	rm -f /var/spool/cruft/*
fi

if [ x$FILES = xyes ]; then
	# official explanations
	cd /usr/lib/cruft/explain
	rm -f /var/spool/cruft/expl_*

	for a in *; do 
		[ -x $a ] && 
			( ./$a | sed "s:/\.$:/:;s:/$::;s:^$:/:" |
			  /usr/lib/cruft/extrafiles |
			  /usr/lib/cruft/canonical |
			  sort | uniq > /var/spool/cruft/expl_$a
			) 3>&1 | sed "s:/\.$:/:;s:/$::;s:^$:/:" |
			  /usr/lib/cruft/extrafiles |
			  /usr/lib/cruft/canonical | 
			  sort | uniq > /var/spool/cruft/need_$a
	done

	# local explanations
	cd /etc/cruft/explain
	for a in *; do
		[ -x $a ] && 
			( ./$a | sed "s:/\.$:/:;s:/$::;s:^$:/:" |
			  /usr/lib/cruft/extrafiles |
			  /usr/lib/cruft/canonical | 
			  sort | uniq > /var/spool/cruft/expl_$a
			) 3>&1 | sed "s:/\.$:/:;s:/$::;s:^$:/:" |
			  /usr/lib/cruft/extrafiles |
			  /usr/lib/cruft/canonical | 
			  sort | uniq > /var/spool/cruft/need_$a
	done

	# files

	cd /var/spool/cruft
	rm -f /var/spool/cruft/file_*

	rm -f need_link_dests; touch need_link_dests

	for DRIVE in $DRIVES; do 
		if [ "$DRIVE" = "/" ]; then
			FILENAME=file_root
		else
			FILENAME=file_in_`echo $DRIVE | sed 's:^/::;s:/:-:g'`
		fi

		find $DRIVE -xdev -print -type l -fprint need_link_dests.tmp |
			/usr/lib/cruft/extrafiles | sort | uniq > $FILENAME

		cat need_link_dests.tmp | 
			/usr/lib/cruft/readlinks |
			  sed "s:/\.$:/:;s:/$::;s:^$:/:" |
			  /usr/lib/cruft/extrafiles |
			  /usr/lib/cruft/canonical | 
			  sort | sort -m - need_link_dests | 
			  uniq > need_link_dests.new

		mv need_link_dests.new need_link_dests
		rm need_link_dests.tmp
	done
fi

if [ $REPORT"" = yes ]; then
	# generate differences
	rm -f /var/spool/cruft/miss_*
	rm -f /var/spool/cruft/unex_*
		
	/usr/lib/cruft/merge_diff

	# remove empty files
	cd /var/spool/cruft
	for a in *; do
		if [ -e $a ] && ! [ -s $a ]; then rm $a; fi
	done

	# generate report
	( echo -n 'cruft report: '; date
	  echo
	  for a in miss_*; do
		if [ -e $a ]; then
			echo ---- $a ---- | sed 's/miss_/missing: /'
	 		cat $a | sed 's/^/        /'
	  	fi
	  done
	  for a in want_*; do
		if [ -e $a ]; then
			echo ---- $a ---- | sed 's/want_/missing: /'
	 		cat $a | sed 's/^/        /'
	  	fi
	  done
	  for a in unex_root unex_in_*; do
		if [ -e $a ]; then
	 	    echo ---- $a ---- | 
		     sed 's=unex_root=unexplained: /=;s=unex_in_=unexplained: ='
		    cat $a | sed 's/^/        /'
		fi
  	  done
	  echo
	  echo end.
	) > report

	cat report > $REPORTFILE
	[ x$MAILTO = x ] || cat report | mail -s "Cruft Report" $MAILTO
fi
