misc.sh revision 185029
1229997Sken# $FreeBSD: head/tools/regression/zfs/misc.sh 185029 2008-11-17 20:49:29Z pjd $
2229997Sken
3288348Smavntest=1
4229997Skenos=`uname -s`
5229997Sken
6229997Skenecho ${dir} | egrep '^/' >/dev/null 2>&1
7229997Skenif [ $? -eq 0 ]; then
8229997Sken	maindir="${dir}/../.."
9229997Skenelse
10229997Sken	maindir="`pwd`/${dir}/../.."
11229997Skenfi
12229997Sken
13229997Sken# Set up correct command names and switches
14229997Skenif [ -z "${LUSTRE}" ]; then
15229997Sken	ZPOOL="zpool"
16229997Sken	ZFS="zfs"
17229997Sken	ZDB="zdb"
18229997Sken	zpool_f_flag="-f"
19229997Skenelse
20229997Sken	ZPOOL="lzpool"
21229997Sken	ZFS="lzfs"
22229997Sken	ZDB="lzdb"
23229997Sken	zpool_f_flag="-F"
24229997Sken	no_mountpoint=1
25229997Skenfi
26229997Sken
27229997Sken# Use correct arguments to cmd line programs
28229997Skenstat --version 2>/dev/null | grep GNU >/dev/null
29229997Skenif [ $? -eq 0 ]; then
30229997Sken	GNU_STAT="yes"
31229997Skenfi
32229997Skenif [ "${os}" = "SunOS" ]; then
33229997Sken	import_flags="-d /dev/lofi"
34229997Sken	mount_t_flag="-F"
35229997Skenelse
36229997Sken	mount_t_flag="-t"
37229997Skenfi
38229997Sken
39229997Skendie()
40229997Sken{
41229997Sken	echo "${1}" > /dev/stderr
42229997Sken	exit 1
43229997Sken}
44229997Sken
45229997Skencalcsum()
46229997Sken{
47229997Sken	dd if="${1}" bs=1M 2>/dev/null | openssl md5
48229997Sken}
49229997Sken
50229997Skencreate_file()
51229997Sken{
52229997Sken	name="${1}"
53288348Smav	size="${2}"
54229997Sken
55229997Sken	dd if=/dev/urandom of=${name} bs=${size} count=1 >/dev/null 2>&1
56229997Sken	sync
57288348Smav}
58229997Sken
59229997Skenexpect()
60229997Sken{
61229997Sken	eorig="${1}"
62229997Sken	eexp=`echo "${eorig}" | egrep -v '^[ 	]*$' | sed 's/^[ 	][ 	]*//g;s/[ 	][ 	]*$//g;s/[ 	][ 	]*/ /g;s/$/%EoL%/' | xargs`
63229997Sken	shift
64229997Sken	gorig=`sh -c "$*" 2>&1`
65229997Sken	got=`echo "${gorig}" | egrep -v '^[ 	]*$' | sed 's/^[ 	][ 	]*//g;s/[ 	][ 	]*$//g;s/[ 	][ 	]*/ /g;s/$/%EoL%/' | xargs`
66229997Sken	echo "${got}" | egrep "${eexp}" >/dev/null
67229997Sken	if [ $? -eq 0 ]; then
68229997Sken		echo "ok ${ntest} ${add_msg}"
69229997Sken	else
70229997Sken		echo "not ok ${ntest} ${add_msg}"
71229997Sken		echo "# ----- expected from: $*"
72264274Smav		echo "${eorig}" | sed 's/^/# /'
73288348Smav		echo "# ----- got:"
74288348Smav		echo "${gorig}" | sed 's/^/# /'
75264274Smav		echo "# ----- end"
76272911Smav	fi
77272911Smav	ntest=`expr $ntest + 1`
78229997Sken}
79229997Sken
80229997Skenexpect_ok()
81288348Smav{
82288348Smav	out=`$* 2>&1`
83229997Sken	ec=$?
84229997Sken	if [ $ec -eq 0 ]; then
85229997Sken		echo "ok ${ntest} ${add_msg}"
86264274Smav		echo "# ----- expected success from: $*"
87272911Smav		if [ ! -z "${out}" ]; then
88288348Smav			echo "# ----- output (exit code=${ec}):"
89287499Smav			echo "${out}" | sed 's/^/# /'
90229997Sken			echo "# ----- end"
91229997Sken		fi
92287499Smav	else
93287499Smav		echo "not ok ${ntest} ${add_msg}"
94287499Smav		echo "# ----- expected success from: $*"
95287499Smav		echo "# ----- output (exit code=${ec}):"
96287499Smav		echo "${out}" | sed 's/^/# /'
97287499Smav		echo "# ----- end"
98229997Sken	fi
99229997Sken	ntest=`expr $ntest + 1`
100229997Sken}
101229997Sken
102229997Skenexpect_fl()
103229997Sken{
104229997Sken	out=`$* 2>&1`
105229997Sken	ec=$?
106229997Sken	if [ $ec -ne 0 ]; then
107229997Sken		echo "ok ${ntest} ${add_msg}"
108229997Sken		echo "# ----- expected failure from: $*"
109229997Sken		if [ ! -z "${out}" ]; then
110229997Sken			echo "# ----- output (exit code=${ec}):"
111229997Sken			echo "${out}" | sed 's/^/# /'
112229997Sken			echo "# ----- end"
113229997Sken		fi
114229997Sken	else
115229997Sken		echo "not ok ${ntest} ${add_msg}"
116229997Sken		echo "# ----- expected failure from: $*"
117229997Sken		echo "# ----- output (exit code=${ec}):"
118229997Sken		echo "${out}" | sed 's/^/# /'
119229997Sken		echo "# ----- end"
120229997Sken	fi
121229997Sken	ntest=`expr $ntest + 1`
122229997Sken}
123229997Sken
124229997Skenquick_exit()
125229997Sken{
126229997Sken	echo "1..1"
127229997Sken	echo "ok 1"
128229997Sken	exit 0
129229997Sken}
130229997Sken
131229997Sken# Set up a scratch tmpfs directory (Linux only)
132229997Skensetup_tmpfs()
133229997Sken{
134229997Sken	cmd="mktemp -d /tmp/zfs-regression.XXXXXXXXXX"
135229997Sken	TMPDIR=`${cmd}` || die "failed: ${cmd}"
136229997Sken	cmd="mount -t tmpfs none ${TMPDIR}"
137229997Sken	${cmd} || die "failed: ${cmd}"
138229997Sken}
139229997Sken
140229997Sken# Clean up the tmpfs directory (Linux only)
141229997Skencleanup_tmpfs()
142229997Sken{
143229997Sken	if [ -n "${TMPDIR}" ]; then
144229997Sken		cmd="umount ${TMPDIR} && rmdir ${TMPDIR}"
145229997Sken		eval "${cmd}" || die "failed: ${cmd}"
146229997Sken	fi
147229997Sken}
148229997Sken
149229997Sken# Truncate a file
150229997Skentruncate_cmd()
151229997Sken{
152229997Sken	size="${1}"
153264191Smav	file="${2}"
154264191Smav
155275920Smav	cmd="dd if=/dev/null of=${file} bs=1 count=0 seek=${size}"
156264191Smav	${cmd} > /dev/null 2>&1 || die "failed: ${cmd}"
157275920Smav}
158275920Smav
159275920Smav# Create a memory-backed block device
160275920Smavcreate_memdisk()
161272734Smav{
162272734Smav	size="${1}"
163275920Smav	devname="${2}"
164275920Smav
165229997Sken	if [ "${os}" = "FreeBSD" ]; then
166229997Sken		if [ -n "${devname}" ]; then
167229997Sken			devparam="-u ${devname}"
168229997Sken		fi
169229997Sken		cmd="mdconfig -a -t swap -s ${size} ${devparam} 2>/dev/null"
170229997Sken		DISKNAME=`${cmd}` || die "failed: ${cmd}"
171229997Sken		if [ -n "${devname}" ]; then
172229997Sken			DISKNAME="${devname}"
173229997Sken		fi
174229997Sken		FDISKNAME="/dev/${DISKNAME}"
175229997Sken	elif [ "${os}" = "SunOS" ]; then
176229997Sken		cmd="mktemp /tmp/zfstest.XXXXXXXXXX"
177229997Sken		fname=`${cmd}` || die "failed: ${cmd}"
178229997Sken
179229997Sken		truncate_cmd "${size}" "${fname}"
180229997Sken
181229997Sken		if [ -n "${devname}" ]; then
182229997Sken			cmd="lofiadm -a ${fname} ${devname}"
183229997Sken			${cmd} || die "failed: ${cmd}"
184229997Sken			DISKNAME="${devname}"
185229997Sken		else
186229997Sken			cmd="lofiadm -a ${fname}"
187229997Sken			DISKNAME=`${cmd}` || die "failed: ${cmd}"
188229997Sken		fi
189229997Sken		FDISKNAME="${DISKNAME}"
190229997Sken	elif [ "${os}" = "Linux" ]; then
191229997Sken		if [ -z "${TMPDIR_DISKS}" ]; then
192229997Sken			setup_tmpfs
193229997Sken			TMPDIR_DISKS="${TMPDIR}"
194229997Sken		fi
195229997Sken
196229997Sken		cmd="mktemp ${TMPDIR_DISKS}/disk.XXXXXXXXXX"
197229997Sken		fname=`${cmd}` || die "failed: ${cmd}"
198229997Sken
199229997Sken		truncate_cmd "${size}" "${fname}"
200229997Sken
201229997Sken		if [ -n "${devname}" ]; then
202229997Sken			devname=`echo ${devname} | cut -c 9-`
203229997Sken			cmd="losetup /dev/${devname} ${fname} 2>&1"
204287499Smav			eval ${cmd} || die "failed: ${cmd}"
205229997Sken			DISKNAME="${devname}"
206229997Sken		else
207229997Sken			cmd="losetup -s -f ${fname} 2>&1"
208264191Smav			diskname=`eval ${cmd}`
209264191Smav
210275865Smav			if [ "${diskname}" = "losetup: could not find any free loop device" ]; then
211275865Smav				# If there are no free loopback devices, create one more
212272734Smav				max=`echo /dev/loop* | awk 'BEGIN { RS=" "; FS="loop" } {if ($2 > max) max = $2} END {print max}'`
213275920Smav				max=$((max + 1))
214229997Sken				cmd="mknod /dev/loop${max} b 7 ${max}"
215229997Sken				${cmd} || die "failed: ${cmd}"
216229997Sken
217229997Sken				cmd="losetup -s -f ${fname}"
218229997Sken				diskname=`${cmd}` || die "failed: ${cmd}"
219229997Sken			fi
220229997Sken			DISKNAME=`eval echo ${diskname} | sed 's/^\/dev\///'`
221229997Sken		fi
222268280Smav		ln /dev/${DISKNAME} /dev/zfstest_${DISKNAME}
223229997Sken		DISKNAME="zfstest_${DISKNAME}"
224229997Sken		FDISKNAME="/dev/${DISKNAME}"
225229997Sken	else
226229997Sken		die "Sorry, your OS is not supported"
227229997Sken	fi
228229997Sken}
229229997Sken
230229997Sken# Destroy a memory-backed block device
231229997Skendestroy_memdisk()
232229997Sken{
233229997Sken	disk="${1}"
234229997Sken
235229997Sken	if [ "${os}" = "FreeBSD" ]; then
236229997Sken		cmd="mdconfig -d -u ${disk}"
237229997Sken		${cmd} || die "failed: ${cmd}"
238274154Smav	elif [ "${os}" = "SunOS" ]; then
239229997Sken		cmd="lofiadm ${disk}"
240229997Sken		fname=`${cmd}` || die "failed: ${cmd}"
241229997Sken
242229997Sken		cmd="lofiadm -d ${disk}"
243229997Sken		${cmd} || die "failed: ${cmd}"
244229997Sken
245229997Sken		cmd="rm ${fname}"
246229997Sken		${cmd} || die "failed: ${cmd}"
247229997Sken	elif [ "${os}" = "Linux" ]; then
248229997Sken		cmd="rm /dev/${disk}"
249229997Sken		${cmd} || die "failed: ${cmd}"
250274154Smav		disk=`echo ${disk} | cut -c 9-`
251229997Sken
252229997Sken		cmd="losetup /dev/${disk} | awk '{print substr(\$3, 2, length(\$3)-2)}'"
253229997Sken		fname=`eval ${cmd}` || die "failed: ${cmd}"
254229997Sken
255229997Sken		cmd="losetup -d /dev/${disk}"
256229997Sken		${cmd} || die "failed: ${cmd}"
257229997Sken
258229997Sken		cmd="rm ${fname}"
259229997Sken		${cmd} || die "failed: ${cmd}"
260229997Sken	else
261229997Sken		die "Sorry, your OS is not supported"
262229997Sken	fi
263229997Sken}
264229997Sken
265229997Skendisks_create()
266229997Sken{
267229997Sken	if [ -z "${ndisks}" ]; then
268229997Sken		start=0
269229997Sken	else
270229997Sken		start=${ndisks}
271229997Sken	fi
272229997Sken	ndisks=$((start+$1))
273229997Sken	n=$((ndisks-$start))
274229997Sken	if [ -z "${2}" ]; then
275229997Sken		size="96M"
276229997Sken	else
277229997Sken		size="${2}"
278229997Sken	fi
279229997Sken	for i in `nums $n $start`; do
280229997Sken		create_memdisk ${size}
281229997Sken		eval disk${i}="${DISKNAME}"
282229997Sken		eval fdisk${i}="${FDISKNAME}"
283229997Sken	done
284229997Sken}
285229997Sken
286229997Skendisks_destroy()
287229997Sken{
288229997Sken	for i in `nums $ndisks 0`; do
289229997Sken		eval disk=\$disk${i}
290229997Sken		if [ ! -z "${disk}" ]; then
291229997Sken			destroy_memdisk ${disk}
292288348Smav		fi
293229997Sken	done
294288348Smav	[ -n "${TMPDIR_DISKS}" ] && TMPDIR="${TMPDIR_DISKS}" cleanup_tmpfs
295288348Smav	return 0
296288348Smav}
297229997Sken
298229997Skendisk_create()
299287621Smav{
300287621Smav	diskno=${1}
301287621Smav	eval disk=\$disk${diskno}
302287621Smav	if [ ! -z ${disk} ]; then
303287621Smav		die "disk${diskno} is already set"
304287621Smav	fi
305288348Smav	dname=${2}
306232604Strasz	if [ -z "${3}" ]; then
307232604Strasz		size="96M"
308232604Strasz	else
309229997Sken		size="${3}"
310229997Sken	fi
311229997Sken	create_memdisk ${size} ${dname}
312229997Sken	[ "${DISKNAME}" = "${dname}" ] || die "${DISKNAME} != ${dname}"
313229997Sken	eval disk${diskno}="${DISKNAME}"
314229997Sken	eval fdisk${diskno}="${FDISKNAME}"
315}
316
317disk_destroy()
318{
319	eval disk=\$disk${1}
320	destroy_memdisk ${disk}
321	eval disk${1}=""
322}
323
324files_create()
325{
326	if [ -z "${nfiles}" ]; then
327		start=0
328	else
329		start=${nfiles}
330	fi
331	nfiles=$((start+$1))
332	n=$((nfiles-$start))
333	if [ -z "${2}" ]; then
334		size="96M"
335	else
336		size="${2}"
337	fi
338	for i in `nums $n $start`; do
339		if [ "${os}" = "Linux" ]; then
340			if [ -z "${TMPDIR_FILES}" ]; then
341				setup_tmpfs
342				TMPDIR_FILES="${TMPDIR}"
343			fi
344			file=`mktemp ${TMPDIR_FILES}/zfstest.XXXXXXXX`
345		else
346			file=`mktemp /tmp/zfstest.XXXXXXXX`
347		fi
348		truncate_cmd ${size} ${file}
349		eval file${i}=${file}
350	done
351}
352
353files_destroy()
354{
355	for i in `nums $nfiles 0`; do
356		eval file=\$file${i}
357		rm -f ${file}
358	done
359	nfiles=0
360	[ -n "${TMPDIR_FILES}" ] && TMPDIR="${TMPDIR_FILES}" cleanup_tmpfs
361	return 0
362}
363
364name_create()
365{
366	echo "zfstest_`dd if=/dev/urandom bs=1k count=1 2>/dev/null | openssl md5 | cut -b -8`"
367}
368
369names_create()
370{
371	nnames=$1
372	for i in `nums $nnames 0`; do
373		eval name${i}=`name_create`
374	done
375}
376
377is_mountpoint()
378{
379	dir="${1}"
380	if [ ! -d "${dir}" ]; then
381		return 1
382	fi
383	if [ -n "${GNU_STAT}" ]; then
384		statcmd="stat -c"
385	else
386		statcmd="stat -f"
387	fi
388	if [ "`${statcmd} '%d' ${dir} 2>/dev/null`" -eq "`${statcmd} '%d' ${dir}/.. 2>/dev/null`" ]; then
389		return 1
390	fi
391	return 0
392}
393
394nums()
395{
396	which jot >/dev/null 2>&1
397	if [ $? -eq 0 ]; then
398		jot ${1} ${2}
399		return $?
400	fi
401
402	start="${2}"
403	[ -z "${start}" ] && start="1";
404	end=$((${1}+${start}-1))
405
406	which seq >/dev/null 2>&1
407	if [ $? -eq 0 ]; then
408		seq ${start} ${end}
409		return $?
410	fi
411
412	i=1
413	while :; do
414		echo $i
415		if [ $i -eq ${1} ]; then
416			break
417		fi
418		i=$((i+1))
419	done
420}
421
422wait_for_resilver()
423{
424	for i in `nums 64`; do
425		${ZPOOL} status ${1} | grep replacing >/dev/null
426		if [ $? -ne 0 ]; then
427			break
428		fi
429		sleep 1
430	done
431}
432
433get_guid()
434{ 
435	${ZDB} -l ${1} | grep -B1 ${1} | grep guid | head -n1 | awk 'BEGIN {FS="="} {print $2}'
436} 
437