#!/bin/bash

usage="$(basename "$0") [-v] [-q] n src des -- verifies per sha256sum of n(>=2) equidistant distributed blocks of size 4096kB, that src was correctly written to des
$(basename "$0") -h

where:
    -v  verbose: prints the sha256sums
    -q  quite: suppresses the output of the result,
        the return-Code remains as reponse
    -h  prints this help message"

quite=false;
verbose=false;
printHelp=false;
for opt in "$@"
do
	case $opt in
		-v) verbose=true ; shift 1 ;;
		-q) quite=true ; shift 1 ;;
		-h) printHelp=true ; shift 1 ;;
		-?) printHelp=true ; shift 1 ;;
	esac
done

if [ "$printHelp" = true ] || [ $# -ne 3 ] || [ $1 -le 1 ]
then
	echo "$usage";
	exit -1;
fi

n=$1
src=$2;
des=$3;
lengthSrc=$(($(stat -c '%s' $src) / 4096)); # length of the source (in 4096kB)
if [ "$verbose" = true ]
then
	echo "length of the source (in 4096kB): $lengthSrc"
fi
failed=false;
for i in $(seq 0 $(($n-1)))
do
	offset=$(echo "$i*($lengthSrc-1)/($n-1)" | bc );
	if [ "$verbose" = true ]
	then
		echo "comparing blocks at offset $offset"
	fi
	sha256sumSrc=$(dd if=$src skip=$offset bs=4096 count=1 status=none | sha256sum)
	if [ "$verbose" = true ]
	then
		echo "sha256sum of the source:      $sha256sumSrc"
	fi
	sha256sumDes=$(dd if=$des skip=$offset bs=4096 count=1 status=none | sha256sum)
	if [ "$verbose" = true ]
	then
		echo "sha256sum of the destination: $sha256sumDes"
	fi
	if [ "$sha256sumSrc" != "$sha256sumDes" ]
	then
		failed=true;
		break;
	fi
done
if [ "$failed" = false ]
then
	if [ "$quite" = false ]
	then
		echo "OK!";
	fi
	exit 0;
else
	if [ "$quite" = false ]
	then
		echo "FAILED!";
	fi
	exit 1;
fi