#!/bin/bash

# Validate the CD/DVD devices in the system by progressively mounting them,
# copying the CDs to the hard disk, and then diffing the results.
# Note that this test also examines SCSI CD drives, making the "ide" part a
# misnomer that's maintained solely because it's familiar to the users.

# Copyright (C) 2003-2006 IBM
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.

. "$POUNDER_SRCDIR/libidecd.sh"

DEFAULT_MOUNT="$POUNDER_TMPDIR/cdmount"
DESTINATION="$POUNDER_TMPDIR/cddata"

# Ensure that our default mountpoint and destination dirs exist.
mkdir -p "$DEFAULT_MOUNT"

# Scoop up the old error count.
LOGFILE=/proc/$$/fd/1
OLD_ERRORS=`egrep -ic "(err|fail|invalid|cannot|denied)" $LOGFILE`
OLD_DIFFS=`egrep -ic "^---" $LOGFILE`

# Trap a SIGABRT which signifies an aborted test...
trap 'exit 255' SIGABRT

# Now, mount each disc and do the test.
find_discs_with_media | while read DEV USE_FSTAB; do

	# Are there no CDs at all?
	if [ "$DEV" == "NONE" ]; then
		echo "No CD/DVD drives found.  Aborting."
		kill -SIGABRT $$
	fi

	# Mount the disc.
	echo "Mounting $DEV."
	if [ $USE_FSTAB -gt 0 ]; then
		MOUNTPOINT=`grep "^$DEV[ 	]" /etc/fstab | awk -F " " '{print $2}'`
		mount "$DEV"
	else
		MOUNTPOINT="$DEFAULT_MOUNT"
		mount "$DEV" "$MOUNTPOINT" -t auto
	fi

	# Create destination and set up auto-removal
	trap 'echo Cleaning up...; rm -rf $DESTINATION; umount $MOUNTPOINT; echo Clean.; exit 0' 1 2 15
	mkdir -p "$DESTINATION"

	# Copy the CD
	echo "Copying $DEV."
	cp -pRdu "$MOUNTPOINT" "$DESTINATION"

	# Diff the copy
	echo "Comparing $DEV to $DESTINATION."
	diff -rq "$MOUNTPOINT" "$DESTINATION/`basename $MOUNTPOINT`"

	# Unmount
	echo "Done with $DEV."
	umount "$DEV"

	# Remove the copy
	rm -rf "$DESTINATION"
done


# Look for new errors.
NEW_ERRORS=`egrep -ic "(err|fail|invalid|cannot|denied)" $LOGFILE`
NEW_DIFFS=`egrep -ic "^---" $LOGFILE`

ERRORS=$(( NEW_ERRORS - OLD_ERRORS ))
DIFFS=$(( NEW_DIFFS - OLD_DIFFS ))
WRONG=$(( ERRORS + DIFFS ))
if [ $WRONG -eq 255 ]; then
	WRONG=254
fi
exit $WRONG