You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

256 lines
5.8 KiB

#!/bin/bash
# Copyright 2011 George Danchev <danchev@spnet.net>
# Copyright 2011 Thomas Schmitt <scdbackup@gmx.net>
#
# Licensed under GNU GPL version 2 or later
set -e
# set -x
print_specific_help() {
cat << HLP
Specific options:
--dev path use path as drive address. Default: /dev/cdrw
--what path use path as address of the directory which shall
be copied into an ISO 9660 filesystem on media.
--any_media allow non re-usable MMC media, like CD-R or DVD+R.
Allow paths to non-existing files, but disallow paths
to existing regular files.
--priv_cmd 'command [arg [arg ...]]'
With drive operations execute xorriso as argument
of the given command (e.g. pfexec, sudo) with the
optionally given arguments: command arg arg xorriso ...
Command and arguments must be single words.
Overview:
Test burning to re-usable media CD-RW, DVD-RW, DVD-RAM, DVD+RW, BD-RE.
By default, one-time usable media will be rejected deliberately.
HLP
}
wait_for_dev () {
# $1 = device address
timeout=30
counter=0
while test "$counter" -lt "$timeout"
do
if test -e "$1"
then
echo
return 0
fi
if test "$counter" = 0
then
echo
echo "Not existing: $dev"
echo "Will wait up to $timeout seconds for it to appear."
fi
counter=$(expr $counter + 1)
echo -n "$counter "
sleep 1
done
echo
return 1
}
getopts_inc=inc/releng_getopts.inc
if test -e "$getopts_inc"
then
. "$getopts_inc"
if test "$SPECIFIC_HELP" = 1
then
print_specific_help
exit 0
fi
else
echo >&2
echo "File not found: $getopts_inc" >&2
echo "Are we in the ./releng directory of a libisoburn SVN checkout ?" >&2
echo "(Please execute the tests from that ./releng directory.)" >&2
echo >&2
exit 29
fi
# Set default values for specific option variables.
dev=/dev/cdrw
what=../xorriso
any_media=0
priv_cmd=
# Interpret specific options, they begin after the first --.
next_is=ignore
for i in "$@"
do
if test "$next_is" = "ignore"
then
if test "$i" = "--"
then
next_is=""
fi
elif test "$next_is" = "dev"
then
dev="$i"
next_is=""
elif test "$next_is" = "what"
then
what="$i"
next_is=""
elif test "$next_is" = "priv_cmd"
then
priv_cmd="$i"
next_is=""
elif test "$i" = "--dev"
then
next_is="dev"
elif test "$i" = "--what"
then
next_is="what"
elif test "$i" = "--any_media"
then
any_media=1
elif test "$i" = "--priv_cmd"
then
next_is="priv_cmd"
else
echo >&2
echo "Unknown test specific option: $i" >&2
print_help
print_specific_help
exit 31
fi
done
check_for_xorriso -x
# check data dir, if any and after checking -x xorriso
if [ -d "${GEN_DATA_DIR}" ]; then
printf "\n${SELF}: directory %s exists!" ${GEN_DATA_DIR}
printf "\n${SELF}: use '${SELF} -c' to remove.\n"
exit 30
else
mkdir "${GEN_DATA_DIR}"
fi
#####################################################################
# Inspect drive address
if test -e "$dev"
then
if test "$any_media" = 1 -a -f "$dev"
then
echo "FAIL : ${SELF} : --dev $dev leads to an existing regular file"
echo
cleanup
exit 31
fi
else
if test "$any_media" = "0"
then
echo "FAIL : ${SELF} : --dev $dev does not lead to an existing file"
echo
cleanup
exit 31
fi
fi
# Inspect media
set +e
wait_for_dev "$dev"
res=$(${priv_cmd} "$RELENG_XORRISO" -outdev "$dev" 2>&1)
ret=$?
set -e
if test "$ret" -ne 0
then
echo "$res" >&2
echo "FAIL : ${SELF} : Non-zero exit value $ret with: ${priv_cmd} $RELENG_XORRISO -outdev $dev"
echo
cleanup
exit 1
elif echo "$res" | grep '^Media current:' >/dev/null 2>&1
then
media=$(echo "$res" | grep '^Media current:' | \
sed -e 's/^Media current: //')
echo "Detected media: '$media'"
if test "$media" = "CD-RW" -o "$media" = "DVD-RW sequential recording" -o \
"$media" = "DVD-RW restricted overwrite" -o "$media" = "DVD-RAM" -o \
"$media" = "DVD+RW" -o "$media" = "BD-RE"
then
echo "Recognized as re-usable."
elif test "$media" = "is not recognizable"
then
echo "FAIL : ${SELF} : No recognizable media detected in: '$dev'"
echo
cleanup
exit 2
elif test "$any_media" = 1
then
echo "Accepted media only because of option --any_media : '$media'"
else
echo "FAIL : ${SELF} : No re-usable media detected, but: '$media'"
echo
cleanup
exit 2
fi
fi
# Perform burn run
echo ${priv_cmd} "$RELENG_XORRISO" -for_backup -outdev "$dev" -blank as_needed -map "$what" /test
set +e
wait_for_dev "$dev"
${priv_cmd} "$RELENG_XORRISO" \
-for_backup \
-outdev "$dev" \
-blank as_needed \
-map "$what" /test
ret=$?
set -e
if test "$ret" -ne 0
then
echo "FAIL : ${SELF} : Non-zero exit value with burn run: $ret"
echo
cleanup
exit 1
fi
if test "$SIMULATE_FAILURE" = 1
then
echo "FAIL : ${SELF} : Simulated failure caused by option -f"
if test -f "$dev"
then
# Alter image
dd if=/dev/urandom bs=2K count=1 \
of="$dev" conv=notrunc seek=400
else
cleanup
exit 1
fi
fi
# Check read
echo ${priv_cmd} "$RELENG_XORRISO" -for_backup -indev "$dev" \
-check_media event=FATAL -- \ -check_md5_r FATAL / --
set +e
wait_for_dev "$dev"
${priv_cmd} "$RELENG_XORRISO" \
-for_backup \
-indev "$dev" \
-print '---check_media:' -check_media event=FATAL -- \
-print '---check_md5_r:' -check_md5_r FATAL / -- \
-print '---compare_r:' -md5 off -compare_r "$what" /test
ret=$?
set -e
if test "$ret" -ne 0
then
echo "FAIL : ${SELF} : Non-zero exit value with checkread run: $ret"
echo
cleanup
exit 1
fi
echo "Ok. Burn test passed."
echo
cleanup
exit 0