#! /bin/sh

# what do I want?
# raid0
# raid0 plain, no headers
# raid1
# raid5

test -f filler || ./create-fillers
test -f filler2 || ./create-fillers

fun_stream ()
{
	cstream -i- | perl -p -e "s/./$1/g"
}

partsize=$((128 * 1024))

loop0=/dev/loop4
loop1=/dev/loop6
loop2=/dev/loop7
md=/dev/md5

cleanup ()
{
	mount | grep -q /mn/tmp && umount /mnt/tmp
	mdadm --stop $md
	for i in 1 2 3 4 5 6 7 ; do
		losetup -d /dev/loop$i 2> /dev/null || true
	done
}

trap cleanup EXIT

foo ()
{
fun_stream 1 | cstream -n $partsize -o raid0c-0
fun_stream 2 | cstream -n $partsize -o raid0c-1
losetup $loop0 raid0c-0
losetup $loop1 raid0c-1
mdadm --create --chunk=32 --level=0 --raid-devices=2 $md $loop0 $loop1
cp filler $md 2>&1 | grep -v No.space
sync
#sleep 1
cleanup

fun_stream 1 | cstream -n $(($partsize * 2)) -o raid0c2-0
fun_stream 2 | cstream -n $(($partsize * 2)) -o raid0c2-1
losetup $loop0 raid0c2-0
losetup $loop1 raid0c2-1
mdadm --create --chunk=32 --level=0 --raid-devices=2 $md $loop0 $loop1
cp filler $md 2>&1 | grep -v No.space
sync
#sleep 1
cleanup

fun_stream 1 | cstream -n $partsize -o raid0c3-0
fun_stream 2 | cstream -n $partsize -o raid0c3-1
losetup $loop0 raid0c3-0
losetup $loop1 raid0c3-1
mdadm --create --chunk=16 --level=0 --raid-devices=2 $md $loop0 $loop1
cp filler $md 2>&1 | grep -v No.space
sync
cp $md raw
chown cracauer raw
#sleep 1
cleanup

fun_stream 1 | cstream -n $partsize -o raid0cf-0
fun_stream 2 | cstream -n $partsize -o raid0cf-1
losetup $loop0 raid0cf-0
losetup $loop1 raid0cf-1
mdadm --create --chunk=32 --level=0 --raid-devices=2 $md $loop0 $loop1
cp filler $md 2>&1 | grep -v No.space
mke2fs $md
mount $md /mnt/tmp
echo Hello, World > /mnt/tmp/foo
umount /mnt/tmp
sync
cp $md filesystem
chown cracauer filesystem
#sleep 1
cleanup

fun_stream 1 | cstream -n $partsize -o raid1cf-0
fun_stream 2 | cstream -n $partsize -o raid1cf-1
losetup $loop0 raid1cf-0
losetup $loop1 raid1cf-1
mdadm --create --chunk=32 --level=1 --raid-devices=2 $md $loop0 $loop1
cp filler $md 2>&1 | grep -v No.space
mke2fs $md
mount $md /mnt/tmp
echo Hello, World > /mnt/tmp/foo
umount /mnt/tmp
sync
cp $md filesystem1
chown cracauer filesystem
#sleep 1
cleanup

fun_stream 1 | cstream -n $partsize -o raid0r-0
fun_stream 2 | cstream -n $partsize -o raid0r-1
losetup $loop0 raid0r-0
losetup $loop1 raid0r-1
mdadm --build --chunk=32 --level=0 --raid-devices=2 $md $loop0 $loop1
cp filler $md 2>&1 | grep -v No.space
sync
#sleep 1
cleanup
}

do_fi ()
{
	cp filler $md 2>&1 | grep -v No.space || true
}

do_fs ()
{
	do_fi $md
	mke2fs $md
	mount $md /mnt/tmp
	echo Hello, World > /mnt/tmp/foo
	echo | md5 > /mnt/tmp/filler2.md5
	cp filler2 /mnt/tmp 2>&1 | grep -v No.space || true
	md5 < /mnt/tmp/filler2 > /mnt/tmp/filler2.md5
	sync
	umount /mnt/tmp
}

bar ()
{
levels="0 1"
sizes="128 256 384 1024"
chunks="32 64 128"
n_partss="2 3 4"

#levels="1"
#sizes="128"
#chunks="128"
#n_partss="4"

for level in $levels ; do
	for size in $sizes ; do
		partsize=$(($size * 1024))
		# for fill in fi fs ; do
		for fill in fs ; do # as long as fs works no need for fi
			for chunk in $chunks ; do
				for n_parts in $n_partss ; do
					if [ $level = 1 ] && [ $n_parts != 2 ] ; then
						continue
					fi
					los=""
					for i in `shellsupport -c 1 $n_parts` ; do
						name=raidtest_$level$fill-c$chunk-s$size-n$n_parts.$i
						fun_stream $i | cstream -n $partsize -o $name
						lo=/dev/loop$(($i + 0))
						losetup $lo $name
						los="$los $lo"
					done
					mdadm --build --chunk=$chunk --level=$level --raid-devices=$n_parts $md $los
					do_$fill $md
					mdadm --stop $md
					for lo in $los ; do
						losetup -d $lo
					done
				done
			done
		done
	done
done
}

for cmd in "$@" ; do
	$cmd
done
