1#!/bin/bash 2 3# Validate the CD/DVD devices in the system by progressively mounting them, 4# copying the CDs to the hard disk, and then diffing the results. 5# Note that this test also examines SCSI CD drives, making the "ide" part a 6# misnomer that's maintained solely because it's familiar to the users. 7 8# Copyright (C) 2003-2006 IBM 9# 10# This program is free software; you can redistribute it and/or 11# modify it under the terms of the GNU General Public License as 12# published by the Free Software Foundation; either version 2 of the 13# License, or (at your option) any later version. 14# 15# This program is distributed in the hope that it will be useful, but 16# WITHOUT ANY WARRANTY; without even the implied warranty of 17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18# General Public License for more details. 19# 20# You should have received a copy of the GNU General Public License 21# along with this program; if not, write to the Free Software 22# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 23# 02111-1307, USA. 24 25. "$POUNDER_SRCDIR/libidecd.sh" 26 27DEFAULT_MOUNT="$POUNDER_TMPDIR/cdmount" 28DESTINATION="$POUNDER_TMPDIR/cddata" 29 30# Ensure that our default mountpoint and destination dirs exist. 31mkdir -p "$DEFAULT_MOUNT" 32 33# Scoop up the old error count. 34LOGFILE=/proc/$$/fd/1 35OLD_ERRORS=`egrep -ic "(err|fail|invalid|cannot|denied)" $LOGFILE` 36OLD_DIFFS=`egrep -ic "^---" $LOGFILE` 37 38# Trap a SIGABRT which signifies an aborted test... 39trap 'exit 255' SIGABRT 40 41# Now, mount each disc and do the test. 42find_discs_with_media | while read DEV USE_FSTAB; do 43 44 # Are there no CDs at all? 45 if [ "$DEV" == "NONE" ]; then 46 echo "No CD/DVD drives found. Aborting." 47 kill -SIGABRT $$ 48 fi 49 50 # Mount the disc. 51 echo "Mounting $DEV." 52 if [ $USE_FSTAB -gt 0 ]; then 53 MOUNTPOINT=`grep "^$DEV[ ]" /etc/fstab | awk -F " " '{print $2}'` 54 mount "$DEV" 55 else 56 MOUNTPOINT="$DEFAULT_MOUNT" 57 mount "$DEV" "$MOUNTPOINT" -t auto 58 fi 59 60 # Create destination and set up auto-removal 61 trap 'echo Cleaning up...; rm -rf $DESTINATION; umount $MOUNTPOINT; echo Clean.; exit 0' 1 2 15 62 mkdir -p "$DESTINATION" 63 64 # Copy the CD 65 echo "Copying $DEV." 66 cp -pRdu "$MOUNTPOINT" "$DESTINATION" 67 68 # Diff the copy 69 echo "Comparing $DEV to $DESTINATION." 70 diff -rq "$MOUNTPOINT" "$DESTINATION/`basename $MOUNTPOINT`" 71 72 # Unmount 73 echo "Done with $DEV." 74 umount "$DEV" 75 76 # Remove the copy 77 rm -rf "$DESTINATION" 78done 79 80 81# Look for new errors. 82NEW_ERRORS=`egrep -ic "(err|fail|invalid|cannot|denied)" $LOGFILE` 83NEW_DIFFS=`egrep -ic "^---" $LOGFILE` 84 85ERRORS=$(( NEW_ERRORS - OLD_ERRORS )) 86DIFFS=$(( NEW_DIFFS - OLD_DIFFS )) 87WRONG=$(( ERRORS + DIFFS )) 88if [ $WRONG -eq 255 ]; then 89 WRONG=254 90fi 91exit $WRONG 92