• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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