Skip to content

Instantly share code, notes, and snippets.

@166MMX
Created May 25, 2014 21:00
Show Gist options
  • Save 166MMX/bcc00df7c75304619edf to your computer and use it in GitHub Desktop.
Save 166MMX/bcc00df7c75304619edf to your computer and use it in GitHub Desktop.
#!/bin/sh
containsErrors ()
{
localLogFile="$1"
errorCount=$(cat "$localLogFile" | egrep -v '(^#|^\s*$)' | grep --count --regexp=-)
if [ $errorCount -gt 0 ]
then
return 0
else
return 1
fi
}
ddrescueFdd()
{
if [ -b "$1" ]
then
source="$1"
shift
else
echo "arg[0] != block device" >/dev/stderr
exit 1
fi
if [ -f "$1" ]
then
fileName="${1%.img}"
preDefinedFileName=1
shift
else
fileName=$(date +%Y%m%d%H%M%S)-$(uuidgen)
preDefinedFileName=0
fi
imgFile="$fileName.img"
logFile="$fileName.log"
sha1File="$fileName.sha1"
ddrescue \
--direct --block-size=512 \
"$source" "$imgFile" "$logFile" "$@"
containsErrors "$logFile" && \
ddrescue \
--direct --block-size=512 --retrim \
"$source" "$imgFile" "$logFile" "$@"
containsErrors "$logFile" && \
ddrescue \
--direct --block-size=512 --retrim \
--reverse --max-retries=3 \
"$source" "$imgFile" "$logFile" "$@"
if containsErrors "$logFile"
then
target=broken
else
sha1sum "$imgFile" > "$sha1File"
chmod -w "$imgFile" "$logFile" "$sha1File"
target=healthy
fi
read -p "New FileName [$fileName]: " newFileName
newFileName=${newFileName:-$fileName}
mv "$imgFile" "$target/$newFileName.img"
mv "$logFile" "$target/$newFileName.log"
[ -f "$sha1File" ] && \
mv "$sha1File" "$target/$newFileName.sha1"
if [ "$target" = "healthy" ]
then
if eraseDisk
then
ufiformat --verify --format 1440 "$source"
dd if=/dev/zero "of=$source" bs=64k
fi
fi
}
eraseDisk()
{
read -p "Erase $source Yes/No? [N]: " erase
erase=${erase:-N}
if [ "Y" = "$nextDisk" -o "Yes" = "$nextDisk" -o "y" = "$nextDisk" -o "yes" = "$nextDisk" ]
then
return 0
else
return 1
fi
}
nextDisk()
{
read -p "Next disk Yes/No? [Y]: " nextDisk
nextDisk=${nextDisk:-Y}
if [ "Y" = "$nextDisk" -o "Yes" = "$nextDisk" -o "y" = "$nextDisk" -o "yes" = "$nextDisk" ]
then
return 0
else
return 1
fi
}
ddrescueFdd "$@"
while nextDisk
do
ddrescueFdd "$@"
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment