home: hub: mkinitfs

Download patch

ref: 9e70c266983bce105b2d998ab990c0b4a4d42798
parent: 046d1f545f17e045f7164085cdfd440ee0148bc7
author: Kaarle Ritvanen <kunkku@alpinelinux.org>
date: Wed Mar 22 09:25:57 CDT 2023

nlplug-findfs: rewrite test script

The new implementation
* systematically tests combinations of options and disk layouts and
* does not require superuser privileges.

--- a/Makefile
+++ b/Makefile
@@ -90,7 +90,8 @@
 all:	$(SBIN_FILES) $(SCRIPTS) $(CONF_FILES) $(MAN_FILES)
 
 clean:
-	rm -f $(SBIN_FILES) $(SCRIPTS) $(MAN_FILES) mkinitfs.conf
+	rm -fr $(SBIN_FILES) $(SCRIPTS) $(MAN_FILES) mkinitfs.conf \
+		nlplug-findfs/actual nlplug-findfs/build
 
 help:
 	@echo mkinitfs $(VERSION)
@@ -116,6 +117,12 @@
 nlplug-findfs/nlplug-findfs: nlplug-findfs/nlplug-findfs.o
 	$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
 
+check: nlplug-findfs/build
+	nlplug-findfs/test.sh run
+
+nlplug-findfs/build: nlplug-findfs/init.sh nlplug-findfs/nlplug-findfs nlplug-findfs/test.sh
+	nlplug-findfs/test.sh build
+
 .SUFFIXES:	.in
 .in:
 	${SED} ${SED_REPLACE} ${SED_EXTRA} $< > $@
@@ -138,4 +145,4 @@
 mkinitfs.conf:
 	echo 'features="$(DEFAULT_FEATURES)"' > $@
 
-.PHONY: all clean help install
+.PHONY: all check clean help install
--- /dev/null
+++ b/nlplug-findfs/expected
@@ -1,0 +1,126 @@
+0-a apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+0-ackm apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+0-ackmH apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+0-an apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+0-anckm apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+0-anckmH apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+0-b bootrepo=/media/vda1/bar status=0
+0-bckm bootrepo=/media/vda1/bar status=0
+0-bckmH bootrepo=/media/vda1/bar status=0
+0-bn bootrepo=/media/vda1/bar status=0
+0-bnckm bootrepo=/media/vda1/bar status=0
+0-bnckmH bootrepo=/media/vda1/bar status=0
+0-ab apkovl=/media/vda1/foo.apkovl.tar.gz bootrepo=/media/vda1/bar status=0
+0-abckm apkovl=/media/vda1/foo.apkovl.tar.gz bootrepo=/media/vda1/bar status=0
+0-abckmH apkovl=/media/vda1/foo.apkovl.tar.gz bootrepo=/media/vda1/bar status=0
+0-abn apkovl=/media/vda1/foo.apkovl.tar.gz bootrepo=/media/vda1/bar status=0
+0-abnckm apkovl=/media/vda1/foo.apkovl.tar.gz bootrepo=/media/vda1/bar status=0
+0-abnckmH apkovl=/media/vda1/foo.apkovl.tar.gz bootrepo=/media/vda1/bar status=0
+05-a apkovl=/media/vda1/foo.apkovl.tar.gz:/media/md0/foo.apkovl.tar.gz status=0
+05-ackm apkovl=/media/vda1/foo.apkovl.tar.gz:/media/md0/foo.apkovl.tar.gz status=0
+05-ackmH apkovl=/media/vda1/foo.apkovl.tar.gz:/media/md0/foo.apkovl.tar.gz status=0
+05-an apkovl=/media/vda1/foo.apkovl.tar.gz:/media/md0/foo.apkovl.tar.gz status=0
+05-anckm apkovl=/media/vda1/foo.apkovl.tar.gz:/media/md0/foo.apkovl.tar.gz status=0
+05-anckmH apkovl=/media/vda1/foo.apkovl.tar.gz:/media/md0/foo.apkovl.tar.gz status=0
+05-b bootrepo=/media/vda1/bar status=0
+05-bckm bootrepo=/media/vda1/bar status=0
+05-bckmH bootrepo=/media/vda1/bar status=0
+05-bn bootrepo=/media/vda1/bar status=0
+05-bnckm bootrepo=/media/vda1/bar status=0
+05-bnckmH bootrepo=/media/vda1/bar status=0
+05-ab apkovl=/media/vda1/foo.apkovl.tar.gz:/media/md0/foo.apkovl.tar.gz bootrepo=/media/vda1/bar status=0
+05-abckm apkovl=/media/vda1/foo.apkovl.tar.gz:/media/md0/foo.apkovl.tar.gz bootrepo=/media/vda1/bar status=0
+05-abckmH apkovl=/media/vda1/foo.apkovl.tar.gz:/media/md0/foo.apkovl.tar.gz bootrepo=/media/vda1/bar status=0
+05-abn apkovl=/media/vda1/foo.apkovl.tar.gz:/media/md0/foo.apkovl.tar.gz bootrepo=/media/vda1/bar status=0
+05-abnckm apkovl=/media/vda1/foo.apkovl.tar.gz:/media/md0/foo.apkovl.tar.gz bootrepo=/media/vda1/bar status=0
+05-abnckmH apkovl=/media/vda1/foo.apkovl.tar.gz:/media/md0/foo.apkovl.tar.gz bootrepo=/media/vda1/bar status=0
+1-a apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+1-ackm apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+1-ackmH apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+1-an apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+1-anckm apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+1-anckmH apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+1-b status=0
+1-bckm status=0
+1-bckmH status=0
+1-bn status=0
+1-bnckm status=0
+1-bnckmH status=0
+1-ab apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+1-abckm apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+1-abckmH apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+1-abn apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+1-abnckm apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+1-abnckmH apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+12-a apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+12-ackm apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+12-ackmH apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+12-an apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+12-anckm apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+12-anckmH apkovl=/media/vda1/foo.apkovl.tar.gz status=0
+12-b bootrepo=/media/vdb2/bar status=0
+12-bckm bootrepo=/media/vdb2/bar status=0
+12-bckmH bootrepo=/media/vdb2/bar status=0
+12-bn bootrepo=/media/vdb2/bar status=0
+12-bnckm bootrepo=/media/vdb2/bar status=0
+12-bnckmH bootrepo=/media/vdb2/bar status=0
+12-ab apkovl=/media/vda1/foo.apkovl.tar.gz bootrepo=/media/vdb2/bar status=0
+12-abckm apkovl=/media/vda1/foo.apkovl.tar.gz bootrepo=/media/vdb2/bar status=0
+12-abckmH apkovl=/media/vda1/foo.apkovl.tar.gz bootrepo=/media/vdb2/bar status=0
+12-abn apkovl=/media/vda1/foo.apkovl.tar.gz bootrepo=/media/vdb2/bar status=0
+12-abnckm apkovl=/media/vda1/foo.apkovl.tar.gz bootrepo=/media/vdb2/bar status=0
+12-abnckmH apkovl=/media/vda1/foo.apkovl.tar.gz bootrepo=/media/vdb2/bar status=0
+2-a status=0
+2-ackm apkovl=/media/dm-1/foo.apkovl.tar.gz status=0
+2-ackmH status=0
+2-an status=0
+2-anckm apkovl=/media/dm-1/foo.apkovl.tar.gz status=0
+2-anckmH status=0
+2-b bootrepo=/media/vda2/bar status=0
+2-bckm bootrepo=/media/vda2/bar status=0
+2-bckmH bootrepo=/media/vda2/bar status=0
+2-bn bootrepo=/media/vda2/bar status=0
+2-bnckm bootrepo=/media/vda2/bar status=0
+2-bnckmH bootrepo=/media/vda2/bar status=0
+2-ab bootrepo=/media/vda2/bar status=0
+2-abckm apkovl=/media/dm-1/foo.apkovl.tar.gz bootrepo=/media/vda2/bar status=0
+2-abckmH bootrepo=/media/vda2/bar status=0
+2-abn bootrepo=/media/vda2/bar status=0
+2-abnckm apkovl=/media/dm-1/foo.apkovl.tar.gz bootrepo=/media/vda2/bar status=0
+2-abnckmH bootrepo=/media/vda2/bar status=0
+3-a status=1
+3-ackm apkovl=/media/dm-0/foo.apkovl.tar.gz status=0
+3-ackmH status=1
+3-an status=0
+3-anckm apkovl=/media/dm-0/foo.apkovl.tar.gz status=0
+3-anckmH status=0
+3-b status=1
+3-bckm bootrepo=/media/dm-0/bar status=0
+3-bckmH status=1
+3-bn status=0
+3-bnckm bootrepo=/media/dm-0/bar status=0
+3-bnckmH status=0
+3-ab status=1
+3-abckm apkovl=/media/dm-0/foo.apkovl.tar.gz bootrepo=/media/dm-0/bar status=0
+3-abckmH status=1
+3-abn status=0
+3-abnckm apkovl=/media/dm-0/foo.apkovl.tar.gz bootrepo=/media/dm-0/bar status=0
+3-abnckmH status=0
+45-a apkovl=/media/md0/foo.apkovl.tar.gz status=0
+45-ackm apkovl=/media/md0/foo.apkovl.tar.gz status=0
+45-ackmH apkovl=/media/md0/foo.apkovl.tar.gz status=0
+45-an apkovl=/media/md0/foo.apkovl.tar.gz status=0
+45-anckm apkovl=/media/md0/foo.apkovl.tar.gz status=0
+45-anckmH apkovl=/media/md0/foo.apkovl.tar.gz status=0
+45-b status=0
+45-bckm status=0
+45-bckmH bootrepo=/media/dm-0/bar status=0
+45-bn status=0
+45-bnckm status=0
+45-bnckmH bootrepo=/media/dm-0/bar status=0
+45-ab apkovl=/media/md0/foo.apkovl.tar.gz status=0
+45-abckm apkovl=/media/md0/foo.apkovl.tar.gz status=0
+45-abckmH apkovl=/media/md0/foo.apkovl.tar.gz bootrepo=/media/dm-0/bar status=0
+45-abn apkovl=/media/md0/foo.apkovl.tar.gz status=0
+45-abnckm apkovl=/media/md0/foo.apkovl.tar.gz status=0
+45-abnckmH apkovl=/media/md0/foo.apkovl.tar.gz bootrepo=/media/dm-0/bar status=0
--- /dev/null
+++ b/nlplug-findfs/init.sh
@@ -1,0 +1,124 @@
+#!/bin/sh
+
+# initramfs for testing nlplug-findfs
+# Copyright (c) 2022-2023 Kaarle Ritvanen
+
+export PATH=/usr/bin:/bin:/usr/sbin:/sbin
+
+busybox mount -t proc none /proc
+busybox mount -t sysfs none /sys
+busybox mkdir /usr/bin /usr/sbin
+/bin/busybox --install
+
+param() {
+	sed -E "s/^.* nlpffs_$1"'=([^ ]*)( .*)?/\1/;ta;d;:a' < /proc/cmdline
+}
+
+MODE=$(param mode)
+TEST_PATH=$(param path)
+
+APKOVL=foo.apkovl.tar.gz
+BOOT_REPO=bar/.boot_repository
+
+_mkfs() {
+	local dev=/dev/$1
+	shift
+
+	mkfs.vfat $dev
+	mkdir -p /mnt
+	mount -t vfat $dev /mnt
+
+	local path
+	for path; do
+		mkdir -p /mnt/$(dirname $path)
+		: > /mnt/$path
+	done
+
+	umount /mnt
+}
+
+luks() {
+	local args="-d $TEST_PATH/build/key ${3:+--header /dev/$3} /dev/$2"
+	cryptsetup luksFormat $args < /dev/null
+	cryptsetup open --type luks $args $1
+}
+
+luksfs() {
+	local dev=$1
+	local files=$2
+	shift 2
+
+	luks fs $dev $*
+	_mkfs mapper/fs $files
+	cryptsetup close fs
+}
+
+nlpffs() {
+	local path=$1
+	shift
+	$path/nlplug-findfs -p /sbin/mdev "$@"
+}
+
+if [ "$MODE" = build ]; then
+	nlpffs /sbin
+
+	for disk in a b c d e f; do
+		(
+			for part in $(seq 3); do
+				cat <<-EOF
+					n
+					p
+					$part
+
+					+32M
+				EOF
+			done
+			echo w
+		) | fdisk /dev/vd$disk
+	done
+
+	mdev -s
+
+	set -ex
+	_mkfs vda1 $APKOVL $BOOT_REPO
+	_mkfs vdb1 $APKOVL
+	
+	luks pv vdc1
+	lvm pvcreate /dev/mapper/pv
+	lvm vgcreate vg /dev/mapper/pv
+	lvm lvcreate -L 1M -n lv vg
+	_mkfs vg/lv $APKOVL
+	lvm vgchange -a n
+	cryptsetup close pv
+	_mkfs vdc2 $BOOT_REPO
+
+	luksfs vdd1 "$APKOVL $BOOT_REPO"
+
+	luksfs vde1 $BOOT_REPO vde2
+	mdadm -C /dev/md0 -l 1 -n 2 --assume-clean --metadata 1.2 \
+		/dev/vde3 /dev/vdf1
+	_mkfs md0 $APKOVL
+	mdadm -S /dev/md0
+else
+	set -x
+	cd "$TEST_PATH"
+	mkdir output
+	cd output
+	nlpffs .. $(param args | base64 -d)
+	echo $? > status
+
+	if [ "$MODE" = debug ]; then
+		cd ..
+		sh
+	elif [ "$MODE" = test ]; then
+		set +x
+		echo -n "TEST RESULT:"
+		for file in *; do
+			echo -n " $file="
+			sed ':a;N;s/\n/:/;ta' $file | tr -d $'\n'
+		done
+		echo
+	fi
+fi
+
+poweroff -f
--- /dev/null
+++ b/nlplug-findfs/test.sh
@@ -1,0 +1,163 @@
+#!/bin/sh -e
+
+# Test utility for nlplug-findfs
+# Copyright (c) 2022-2023 Kaarle Ritvanen
+
+cd "${0%/*}"
+BINARY=$PWD/nlplug-findfs
+BUILD_DIR=$PWD/build
+mkdir -p "$BUILD_DIR"
+KEY_FILE=$BUILD_DIR/key
+INITRAMFS=$BUILD_DIR/initramfs
+
+split_chars() {
+	local s=$1
+	while [ "$s" ]; do
+		echo ${s:0:1}
+		s=${s:1}
+	done
+}
+
+
+disk_img() {
+	echo "$BUILD_DIR/disk$1.img"
+}
+
+run_in_vm() {
+	[ -f "$BINARY" ]
+	[ -f "$KEY_FILE" ] || dd if=/dev/urandom of="$KEY_FILE" bs=32 count=1
+	[ -f "$INITRAMFS" ] || custom_files="$BINARY $KEY_FILE" \
+		mkinitfs -i init.sh -o "$INITRAMFS" \
+		-F "base cryptsetup lvm raid usb virtio"
+
+	local args=
+	local disk
+	for disk in $(split_chars $2); do
+		args="$args -drive file=$(disk_img $disk),format=raw,if=virtio"
+	done
+
+	qemu-system-x86_64 -m 256 -nographic \
+		-kernel /boot/vmlinuz-lts -initrd "$INITRAMFS" \
+		-append "console=ttyS0 nlpffs_path=$PWD nlpffs_mode=$1 ${3:+nlpffs_args=$3}" \
+		$args
+}
+
+build() {
+	local disks=$(seq -s "" 0 5)
+	local disk
+	for disk in $(split_chars $disks); do
+		qemu-img create $(disk_img $disk) 128M
+	done
+	run_in_vm build $disks < /dev/null
+}
+
+run_case_in_vm() {
+	local mode=$1
+	local case=$2
+	shift 2
+
+	local disks=
+	local args=
+	local opt
+	for opt in $(split_chars "$case"); do
+		case "$opt" in
+		[0-9])
+			[ -f $(disk_img $opt) ] || build > /dev/null
+			disks="$disks$opt"
+			;;
+		[a-zA-Z])
+			local arg
+			for arg in \
+				a:apkovl \
+				b:bootrepo \
+				c:vda1 \
+				k:$KEY_FILE \
+				m:cryptdev \
+				H:vda2; do
+
+				if [ ${arg%:*} = $opt ]; then
+					opt="$opt ${arg#*:}"
+					break
+				fi
+			done
+			args="$args -$opt"
+			;;
+		esac
+	done
+	run_in_vm $mode $disks $(printf %s "$args $*" | base64 -w 0)
+}
+
+
+if [ $# -eq 0 ]; then
+	MODE=run
+else
+	MODE=$1
+	shift
+fi
+
+TEST=$1
+ARGS=
+case "$MODE" in
+	build)
+		build
+		exit
+		;;
+	debug)
+		run_case_in_vm debug "$@"
+		exit
+		;;
+	custom)
+		shift
+		ARGS=$*
+		;;
+	update)
+		TEST=
+		;;
+	run)
+		;;
+	*)
+		exit 1
+		;;
+esac
+
+
+expected() {
+	if [ "$1" ]; then
+		grep "^$1 " expected
+	else
+		cat expected
+	fi
+}
+
+: > actual
+run() {
+	[ $MODE != run ] || expected "$1" > /dev/null
+
+	(
+		echo -n "$1 "
+		local result=$(run_case_in_vm test "$@" < /dev/null | \
+			sed "s/^TEST RESULT: //;ta;d;:a" | tr -d '\r\n')
+		[ "$result" ] || result=FAILED
+		echo "$result"
+	) | tee -a actual
+}
+
+if [ "$TEST" ]; then
+	run "$TEST" $ARGS
+else
+	for disks in 0 05 1 12 2 3 45; do
+		for ab in a b ab; do
+			for n in "" n; do
+				for ckmH in "" ckm ckmH; do
+					run $disks-$ab$n$ckmH
+				done
+			done
+		done
+	done
+fi
+
+if [ $MODE = update ]; then
+	mv actual expected
+elif [ $MODE = run ]; then
+	expected $TEST | diff /dev/stdin actual
+fi
--- a/test.sh
+++ /dev/null
@@ -1,154 +1,0 @@
-#!/bin/sh
-
-set -e
-set -u
-
-# Defaults
-operation=full
-noconfirm=0
-clean_all=0
-retcode=0
-flags=""
-clean=1
-
-usage () {
-	cat >&2 <<-EOF
-	$0 [flags] [operation]
-
-	operation:
-	  full (default)
-	  clean
-	  help (this help)
-
-	flags:
-	  -h: help (this help)
-	  -d: turn on nlplug-findfs debug output
-	  -y: skip confirmation at program start
-	  -x: clean all (including produced binaries)
-	  -k: keep devices (dont clean up)
-	EOF
-	exit 1
-}
-
-while [ $# -gt 0 ]
-do
-	case "$1" in
-		"-d") flags="-d $flags"; shift;;
-		"-y") noconfirm=1; shift;;
-		"-x") clean_all=1; shift;;
-		"-h"|"--help") usage; shift;;
-		"-k") clean=""; shift;;
-		"-"*) shift;; # Ignore erroneous flags
-		*) break;;
-	esac
-done
-
-[ $# -eq 1 ] && operation=$1
-
-[ $noconfirm -eq 0 ] && echo \
-"Warning: this script is going to de-setup all your existing /dev/loop* devices
-at exit. Press enter to continue, or ^C to cancel." >&2
-[ $noconfirm -eq 0 ] && read dummy
-
-if [ "$operation" != "clean" ]
-then
-	passphrase=foobar
-	mkdir -p local-mount
-
-	if [ ! -f ./nlplug-findfs ]; then
-		echo "> Creating nlplug-findfs"
-		make
-	fi
-
-	echo "> Creating images"
-	dd if=/dev/zero of=block count=10 bs=1M 2>&1 | sed 's/^/\t/g'
-	[ "$operation" = "header" ] && dd if=/dev/zero of=header count=1024 bs=65536 2>&1 | sed 's/^/\t/g'
-
-	echo "> Setting up the loop devices"
-	block="$(sudo losetup -f)"
-	echo "> Setting up block as $block"
-	sudo losetup $block block 2>&1 | sed 's/^/\t/g'
-	[ "$operation" = "header" ] && header="$(sudo losetup -f)"
-	[ "$operation" = "header" ] && echo "> Setting up header as $header"
-	[ "$operation" = "header" ] && sudo losetup $header header 2>&1 | sed 's/^/\t/g'
-
-	[ "$operation" != "header" ] && echo "> Formatting '$block' with passphrase '$passphrase'."
-	[ "$operation" = "header" ] && echo "> Formatting '$block' with header '$header' and passphrase '$passphrase'."
-	[ "$operation" != "header" ] && printf "%s" "$passphrase" | sudo cryptsetup luksFormat -q $block - 2>&1 | sed 's/^/\t/g'
-	[ "$operation" = "header" ] && printf "%s" "$passphrase" | sudo cryptsetup luksFormat -q --header $header $block - 2>&1 | sed 's/^/\t/g'
-
-	echo "> Creating keyfile"
-	dd if=/dev/urandom of=keyfile count=1 bs=512 2>&1 | sed 's/^/\t/g'
-	echo "> Adding keyfile to device"
-	[ "$operation" != "header" ] && printf "%s" "$passphrase" | sudo cryptsetup luksAddKey -q $block keyfile - 2>&1 | sed 's/^/\t/g'
-	[ "$operation" = "header" ] && printf "%s" "$passphrase" | sudo cryptsetup luksAddKey -q --header $header $block keyfile - 2>&1 | sed 's/^/\t/g'
-
-	echo "> Opening the device '$block' as /dev/mapper/temp-test"
-	[ "$operation" != "header" ] && printf "%s" "$passphrase" | sudo cryptsetup luksOpen -q $block temp-test - 2>&1 | sed 's/^/\t/g'
-	[ "$operation" = "header" ] && printf "%s" "$passphrase" | sudo cryptsetup luksOpen -q --header $header $block temp-test - 2>&1 | sed 's/^/\t/g'
-	echo "> Creating a filesystem on '/dev/mapper/temp-test'"
-	sudo mkfs.ext2 /dev/mapper/temp-test
-	echo "> Mounting the fs"
-	sudo mount -t ext2 /dev/mapper/temp-test local-mount
-	echo "> Creating proof in the mounted fs"
-	sudo sh -c 'date "+proof:%s" > local-mount/proof'
-	proof=$(cat local-mount/proof)
-	echo "> Proof is: '$proof'"
-	echo "> Unmounting the fs"
-	sudo umount local-mount
-	echo "> Closing the device '/dev/mapper/temp-test'"
-	sudo cryptsetup luksClose temp-test
-
-	echo "> Testing nlplug-findfs on $block using keyfile"
-	[ "$operation" != "header" ] && { echo "$passphrase" | sudo ./nlplug-findfs -p /sbin/mdev ${flags} -c $block -k keyfile -m 'test-device' /dev/mapper/test-device || retcode=1; }
-	[ "$operation" = "header" ] && { echo "$passphrase" | sudo ./nlplug-findfs -p /sbin/mdev ${flags} -H $header -c $block -k keyfile -m 'test-device' /dev/mapper/test-device || retcode=1; }
-
-	if [ $retcode -eq 0 ]; then
-		echo "> Mounting the device"
-		sudo mount /dev/mapper/test-device local-mount
-		echo "> Getting proof"
-		check=$(cat local-mount/proof)
-		echo "Retrieved proof is: $check"
-		if [ "$check" != "$proof" ]; then
-			retcode=1
-		fi
-	fi
-	[ $retcode -eq 0 ] && echo "Operation succeeded, proofs match" || echo "Operation failed, proofs don't match"
-
-	echo "> Unmounting the fs"
-	mountpoint local-mount && sudo umount local-mount
-	echo "> Closing the device '/dev/mapper/test-device'"
-	[ -b /dev/mapper/test-device ] && sudo cryptsetup luksClose test-device
-
-	echo "> Testing nlplug-findfs on $block (passphrase was '$passphrase')"
-	[ "$operation" != "header" ] && { echo "$passphrase" | sudo ./nlplug-findfs -p /sbin/mdev ${flags} -c $block -m 'test-device' /dev/mapper/test-device || retcode=1; }
-	[ "$operation" = "header" ] && { echo "$passphrase" | sudo ./nlplug-findfs -p /sbin/mdev ${flags} -H $header -c $block -m 'test-device' /dev/mapper/test-device || retcode=1; }
-
-	if [ $retcode -eq 0 ]; then
-		echo "> Mounting the device"
-		sudo mount /dev/mapper/test-device local-mount
-		echo "> Getting proof"
-		check=$(cat local-mount/proof)
-		echo "Retrieved proof is: $check"
-		if [ "$check" != "$proof" ]; then
-			retcode=1
-		fi
-	fi
-	[ $retcode -eq 0 ] && echo "Operation succeeded, proofs match" || echo "Operation failed, proofs don't match"
-fi
-
-if [ -z  "$clean" ]; then
-	exit
-fi
-echo "> Cleaning up"
-mountpoint local-mount && sudo umount local-mount
-[ -b /dev/mapper/test-device ] && sudo cryptsetup luksClose test-device
-for i in $(seq 0 $(($(sudo losetup -f | sed 's:^[a-z/]*\([0-9]*\)$:\1:; s/$/-1/')))); do
-	sudo losetup -d /dev/loop$i
-done
-[ -d local-mount ] && rmdir local-mount
-[ -f block ] && rm block
-[ -f header ] && rm header
-[ $clean_all -eq 1 ] && ( make clean; rm -f nlplug-findfs nlplug-findfs.o )
-exit $retcode
-# vim: ts=4:sw=4