xref: /illumos-gate/usr/src/test/zfs-tests/tests/functional/acl/acl_common.kshlib (revision d583b39bfb4e2571d3e41097c5c357ffe353ad45)
1*d583b39bSJohn Wren Kennedy#
2*d583b39bSJohn Wren Kennedy# CDDL HEADER START
3*d583b39bSJohn Wren Kennedy#
4*d583b39bSJohn Wren Kennedy# The contents of this file are subject to the terms of the
5*d583b39bSJohn Wren Kennedy# Common Development and Distribution License (the "License").
6*d583b39bSJohn Wren Kennedy# You may not use this file except in compliance with the License.
7*d583b39bSJohn Wren Kennedy#
8*d583b39bSJohn Wren Kennedy# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*d583b39bSJohn Wren Kennedy# or http://www.opensolaris.org/os/licensing.
10*d583b39bSJohn Wren Kennedy# See the License for the specific language governing permissions
11*d583b39bSJohn Wren Kennedy# and limitations under the License.
12*d583b39bSJohn Wren Kennedy#
13*d583b39bSJohn Wren Kennedy# When distributing Covered Code, include this CDDL HEADER in each
14*d583b39bSJohn Wren Kennedy# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*d583b39bSJohn Wren Kennedy# If applicable, add the following below this CDDL HEADER, with the
16*d583b39bSJohn Wren Kennedy# fields enclosed by brackets "[]" replaced with your own identifying
17*d583b39bSJohn Wren Kennedy# information: Portions Copyright [yyyy] [name of copyright owner]
18*d583b39bSJohn Wren Kennedy#
19*d583b39bSJohn Wren Kennedy# CDDL HEADER END
20*d583b39bSJohn Wren Kennedy#
21*d583b39bSJohn Wren Kennedy
22*d583b39bSJohn Wren Kennedy#
23*d583b39bSJohn Wren Kennedy# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24*d583b39bSJohn Wren Kennedy# Use is subject to license terms.
25*d583b39bSJohn Wren Kennedy#
26*d583b39bSJohn Wren Kennedy
27*d583b39bSJohn Wren Kennedy. $STF_SUITE/tests/functional/acl/acl.cfg
28*d583b39bSJohn Wren Kennedy. $STF_SUITE/include/libtest.shlib
29*d583b39bSJohn Wren Kennedy
30*d583b39bSJohn Wren Kennedy#
31*d583b39bSJohn Wren Kennedy# Get the given file/directory access mode
32*d583b39bSJohn Wren Kennedy#
33*d583b39bSJohn Wren Kennedy# $1 object -- file or directroy
34*d583b39bSJohn Wren Kennedy#
35*d583b39bSJohn Wren Kennedyfunction get_mode #<obj>
36*d583b39bSJohn Wren Kennedy{
37*d583b39bSJohn Wren Kennedy	typeset obj=$1
38*d583b39bSJohn Wren Kennedy	if (( ${#obj} == 0 )); then
39*d583b39bSJohn Wren Kennedy		return 1
40*d583b39bSJohn Wren Kennedy	fi
41*d583b39bSJohn Wren Kennedy
42*d583b39bSJohn Wren Kennedy	$LS -ld $obj | $AWK '{print $1}'
43*d583b39bSJohn Wren Kennedy}
44*d583b39bSJohn Wren Kennedy
45*d583b39bSJohn Wren Kennedy#
46*d583b39bSJohn Wren Kennedy# Get the given file/directory ACL
47*d583b39bSJohn Wren Kennedy#
48*d583b39bSJohn Wren Kennedy# $1 object -- file or directroy
49*d583b39bSJohn Wren Kennedy#
50*d583b39bSJohn Wren Kennedyfunction get_acl #<obj>
51*d583b39bSJohn Wren Kennedy{
52*d583b39bSJohn Wren Kennedy        typeset obj=$1
53*d583b39bSJohn Wren Kennedy	if (( ${#obj} == 0 )); then
54*d583b39bSJohn Wren Kennedy		return 1
55*d583b39bSJohn Wren Kennedy	fi
56*d583b39bSJohn Wren Kennedy
57*d583b39bSJohn Wren Kennedy	$LS -vd $obj | $NAWK '(NR != 1) {print $0}'
58*d583b39bSJohn Wren Kennedy}
59*d583b39bSJohn Wren Kennedy
60*d583b39bSJohn Wren Kennedy#
61*d583b39bSJohn Wren Kennedy# Get the given file/directory ACL
62*d583b39bSJohn Wren Kennedy#
63*d583b39bSJohn Wren Kennedy# $1 object -- file or directroy
64*d583b39bSJohn Wren Kennedy#
65*d583b39bSJohn Wren Kennedyfunction get_compact_acl #<obj>
66*d583b39bSJohn Wren Kennedy{
67*d583b39bSJohn Wren Kennedy        typeset obj=$1
68*d583b39bSJohn Wren Kennedy	if (( ${#obj} == 0 )); then
69*d583b39bSJohn Wren Kennedy		return 1
70*d583b39bSJohn Wren Kennedy	fi
71*d583b39bSJohn Wren Kennedy
72*d583b39bSJohn Wren Kennedy	$LS -Vd $obj | $NAWK '(NR != 1) {print $0}'
73*d583b39bSJohn Wren Kennedy}
74*d583b39bSJohn Wren Kennedy
75*d583b39bSJohn Wren Kennedy#
76*d583b39bSJohn Wren Kennedy# Check the given two files/directories have the same ACLs
77*d583b39bSJohn Wren Kennedy#
78*d583b39bSJohn Wren Kennedy# Return 0, if source object acl is equal to target object acl.
79*d583b39bSJohn Wren Kennedy#
80*d583b39bSJohn Wren Kennedy# $1 source object
81*d583b39bSJohn Wren Kennedy# $2 target object
82*d583b39bSJohn Wren Kennedy#
83*d583b39bSJohn Wren Kennedyfunction compare_acls #<src> <tgt>
84*d583b39bSJohn Wren Kennedy{
85*d583b39bSJohn Wren Kennedy        typeset src=$1
86*d583b39bSJohn Wren Kennedy        typeset tgt=$2
87*d583b39bSJohn Wren Kennedy
88*d583b39bSJohn Wren Kennedy	(( ${#src} == 0 || ${#tgt} == 0 )) && return 1
89*d583b39bSJohn Wren Kennedy	[[ $src == $tgt ]] && return 0
90*d583b39bSJohn Wren Kennedy
91*d583b39bSJohn Wren Kennedy	typeset tmpsrc=/tmp/compare_acls.src.$$
92*d583b39bSJohn Wren Kennedy	typeset tmptgt=/tmp/compare_acls.tgt.$$
93*d583b39bSJohn Wren Kennedy
94*d583b39bSJohn Wren Kennedy	get_acl $src > $tmpsrc
95*d583b39bSJohn Wren Kennedy	get_acl $tgt > $tmptgt
96*d583b39bSJohn Wren Kennedy	typeset -i ret=0
97*d583b39bSJohn Wren Kennedy	$DIFF $tmpsrc $tmptgt > /dev/null 2>&1
98*d583b39bSJohn Wren Kennedy	ret=$?
99*d583b39bSJohn Wren Kennedy	$RM -f $tmpsrc $tmptgt
100*d583b39bSJohn Wren Kennedy
101*d583b39bSJohn Wren Kennedy	if (( ret != 0 )); then
102*d583b39bSJohn Wren Kennedy		return $ret
103*d583b39bSJohn Wren Kennedy	fi
104*d583b39bSJohn Wren Kennedy
105*d583b39bSJohn Wren Kennedy	get_compact_acl $src > $tmpsrc
106*d583b39bSJohn Wren Kennedy	get_compact_acl $tgt > $tmptgt
107*d583b39bSJohn Wren Kennedy	$DIFF $tmpsrc $tmptgt > /dev/null 2>&1
108*d583b39bSJohn Wren Kennedy	ret=$?
109*d583b39bSJohn Wren Kennedy	$RM -f $tmpsrc $tmptgt
110*d583b39bSJohn Wren Kennedy
111*d583b39bSJohn Wren Kennedy	return $ret
112*d583b39bSJohn Wren Kennedy}
113*d583b39bSJohn Wren Kennedy
114*d583b39bSJohn Wren Kennedy#
115*d583b39bSJohn Wren Kennedy# Check that the given two objects have the same modes.
116*d583b39bSJohn Wren Kennedy# Return 0, if their modes are equal with each other. Otherwise, return 1.
117*d583b39bSJohn Wren Kennedy#
118*d583b39bSJohn Wren Kennedy# $1 source object
119*d583b39bSJohn Wren Kennedy# $2 target object
120*d583b39bSJohn Wren Kennedy#
121*d583b39bSJohn Wren Kennedyfunction compare_modes #<src> <tgt>
122*d583b39bSJohn Wren Kennedy{
123*d583b39bSJohn Wren Kennedy        typeset src=$1
124*d583b39bSJohn Wren Kennedy        typeset tgt=$2
125*d583b39bSJohn Wren Kennedy        typeset -i i=0
126*d583b39bSJohn Wren Kennedy        set -A mode
127*d583b39bSJohn Wren Kennedy
128*d583b39bSJohn Wren Kennedy	(( ${#src} == 0 || ${#tgt} == 0 )) && return 1
129*d583b39bSJohn Wren Kennedy	[[ $src == $tgt ]] && return 0
130*d583b39bSJohn Wren Kennedy
131*d583b39bSJohn Wren Kennedy	typeset obj
132*d583b39bSJohn Wren Kennedy        for obj in $src $tgt
133*d583b39bSJohn Wren Kennedy        do
134*d583b39bSJohn Wren Kennedy                mode[i]=$(get_mode $obj)
135*d583b39bSJohn Wren Kennedy
136*d583b39bSJohn Wren Kennedy                (( i = i + 1 ))
137*d583b39bSJohn Wren Kennedy        done
138*d583b39bSJohn Wren Kennedy
139*d583b39bSJohn Wren Kennedy        [[ ${mode[0]} != ${mode[1]} ]] && return 1
140*d583b39bSJohn Wren Kennedy
141*d583b39bSJohn Wren Kennedy        return 0
142*d583b39bSJohn Wren Kennedy}
143*d583b39bSJohn Wren Kennedy
144*d583b39bSJohn Wren Kennedy#
145*d583b39bSJohn Wren Kennedy# Check that the given two objects have the same xattrs.
146*d583b39bSJohn Wren Kennedy# Return 0, if their xattrs are equal with each other. Otherwise, return 1.
147*d583b39bSJohn Wren Kennedy#
148*d583b39bSJohn Wren Kennedy# $1 source object
149*d583b39bSJohn Wren Kennedy# $2 target object
150*d583b39bSJohn Wren Kennedy#
151*d583b39bSJohn Wren Kennedyfunction compare_xattrs #<src> <tgt>
152*d583b39bSJohn Wren Kennedy{
153*d583b39bSJohn Wren Kennedy        typeset src=$1
154*d583b39bSJohn Wren Kennedy        typeset tgt=$2
155*d583b39bSJohn Wren Kennedy
156*d583b39bSJohn Wren Kennedy	(( ${#src} == 0 || ${#tgt} == 0 )) && return 1
157*d583b39bSJohn Wren Kennedy	[[ $src == $tgt ]] && return 0
158*d583b39bSJohn Wren Kennedy
159*d583b39bSJohn Wren Kennedy	typeset tmpsrc=/tmp/compare_xattrs.src.$$
160*d583b39bSJohn Wren Kennedy	typeset tmptgt=/tmp/compare_xattrs.tgt.$$
161*d583b39bSJohn Wren Kennedy
162*d583b39bSJohn Wren Kennedy	get_xattr $src > $tmpsrc
163*d583b39bSJohn Wren Kennedy	get_xattr $tgt > $tmptgt
164*d583b39bSJohn Wren Kennedy	typeset -i ret=0
165*d583b39bSJohn Wren Kennedy	$DIFF $tmpsrc $tmptgt > /dev/null 2>&1
166*d583b39bSJohn Wren Kennedy	ret=$?
167*d583b39bSJohn Wren Kennedy	$RM -f $tmpsrc $tmptgt
168*d583b39bSJohn Wren Kennedy
169*d583b39bSJohn Wren Kennedy        return $ret
170*d583b39bSJohn Wren Kennedy}
171*d583b39bSJohn Wren Kennedy
172*d583b39bSJohn Wren Kennedy#
173*d583b39bSJohn Wren Kennedy# Check '+' is set for a given file/directory with 'ls [-l]' command
174*d583b39bSJohn Wren Kennedy#
175*d583b39bSJohn Wren Kennedy# $1 object -- file or directory.
176*d583b39bSJohn Wren Kennedy#
177*d583b39bSJohn Wren Kennedyfunction plus_sign_check_l #<obj>
178*d583b39bSJohn Wren Kennedy{
179*d583b39bSJohn Wren Kennedy	typeset obj=$1
180*d583b39bSJohn Wren Kennedy	if (( ${#obj} == 0 )); then
181*d583b39bSJohn Wren Kennedy		return 1
182*d583b39bSJohn Wren Kennedy	fi
183*d583b39bSJohn Wren Kennedy
184*d583b39bSJohn Wren Kennedy	$LS -ld $obj | $AWK '{print $1}' | $GREP "+\>" > /dev/null
185*d583b39bSJohn Wren Kennedy
186*d583b39bSJohn Wren Kennedy        return $?
187*d583b39bSJohn Wren Kennedy}
188*d583b39bSJohn Wren Kennedy
189*d583b39bSJohn Wren Kennedy#
190*d583b39bSJohn Wren Kennedy# Check '+' is set for a given file/directory with 'ls [-v]' command
191*d583b39bSJohn Wren Kennedy#
192*d583b39bSJohn Wren Kennedy# $1 object -- file or directory.
193*d583b39bSJohn Wren Kennedy#
194*d583b39bSJohn Wren Kennedyfunction plus_sign_check_v #<obj>
195*d583b39bSJohn Wren Kennedy{
196*d583b39bSJohn Wren Kennedy	typeset obj=$1
197*d583b39bSJohn Wren Kennedy	if (( ${#obj} == 0 )); then
198*d583b39bSJohn Wren Kennedy		return 1
199*d583b39bSJohn Wren Kennedy	fi
200*d583b39bSJohn Wren Kennedy
201*d583b39bSJohn Wren Kennedy	$LS -vd $obj | $NAWK '(NR == 1) {print $1}' | $GREP "+\>" > /dev/null
202*d583b39bSJohn Wren Kennedy
203*d583b39bSJohn Wren Kennedy        return $?
204*d583b39bSJohn Wren Kennedy}
205*d583b39bSJohn Wren Kennedy
206*d583b39bSJohn Wren Kennedy#
207*d583b39bSJohn Wren Kennedy# A wrapper function of c program
208*d583b39bSJohn Wren Kennedy#
209*d583b39bSJohn Wren Kennedy# $1 legal login name
210*d583b39bSJohn Wren Kennedy# $2-n commands and options
211*d583b39bSJohn Wren Kennedy#
212*d583b39bSJohn Wren Kennedyfunction chgusr_exec #<login_name> <commands> [...]
213*d583b39bSJohn Wren Kennedy{
214*d583b39bSJohn Wren Kennedy	$CHG_USR_EXEC $@
215*d583b39bSJohn Wren Kennedy	return $?
216*d583b39bSJohn Wren Kennedy}
217*d583b39bSJohn Wren Kennedy
218*d583b39bSJohn Wren Kennedy#
219*d583b39bSJohn Wren Kennedy# Export the current user for the following usr_exec operating.
220*d583b39bSJohn Wren Kennedy#
221*d583b39bSJohn Wren Kennedy# $1 legal login name
222*d583b39bSJohn Wren Kennedy#
223*d583b39bSJohn Wren Kennedyfunction set_cur_usr #<login_name>
224*d583b39bSJohn Wren Kennedy{
225*d583b39bSJohn Wren Kennedy	export ZFS_ACL_CUR_USER=$1
226*d583b39bSJohn Wren Kennedy}
227*d583b39bSJohn Wren Kennedy
228*d583b39bSJohn Wren Kennedy#
229*d583b39bSJohn Wren Kennedy# Run commands by $ZFS_ACL_CUR_USER
230*d583b39bSJohn Wren Kennedy#
231*d583b39bSJohn Wren Kennedy# $1-n commands and options
232*d583b39bSJohn Wren Kennedy#
233*d583b39bSJohn Wren Kennedyfunction usr_exec #<commands> [...]
234*d583b39bSJohn Wren Kennedy{
235*d583b39bSJohn Wren Kennedy	$CHG_USR_EXEC "$ZFS_ACL_CUR_USER" $@
236*d583b39bSJohn Wren Kennedy	return $?
237*d583b39bSJohn Wren Kennedy}
238*d583b39bSJohn Wren Kennedy
239*d583b39bSJohn Wren Kennedy#
240*d583b39bSJohn Wren Kennedy# Count how many ACEs for the speficied file or directory.
241*d583b39bSJohn Wren Kennedy#
242*d583b39bSJohn Wren Kennedy# $1 file or directroy name
243*d583b39bSJohn Wren Kennedy#
244*d583b39bSJohn Wren Kennedyfunction count_ACE #<file or dir name>
245*d583b39bSJohn Wren Kennedy{
246*d583b39bSJohn Wren Kennedy	if [[ ! -e $1 ]]; then
247*d583b39bSJohn Wren Kennedy		log_note "Need input file or directroy name."
248*d583b39bSJohn Wren Kennedy		return 1
249*d583b39bSJohn Wren Kennedy	fi
250*d583b39bSJohn Wren Kennedy
251*d583b39bSJohn Wren Kennedy	$LS -vd $1 | $NAWK 'BEGIN {count=0}
252*d583b39bSJohn Wren Kennedy			(NR != 1)&&(/[0-9]:/) {count++}
253*d583b39bSJohn Wren Kennedy			END {print count}'
254*d583b39bSJohn Wren Kennedy
255*d583b39bSJohn Wren Kennedy	return 0
256*d583b39bSJohn Wren Kennedy}
257*d583b39bSJohn Wren Kennedy
258*d583b39bSJohn Wren Kennedy#
259*d583b39bSJohn Wren Kennedy# Get specified number ACE content of specified file or directory.
260*d583b39bSJohn Wren Kennedy#
261*d583b39bSJohn Wren Kennedy# $1 file or directory name
262*d583b39bSJohn Wren Kennedy# $2 specified number
263*d583b39bSJohn Wren Kennedy#
264*d583b39bSJohn Wren Kennedyfunction get_ACE #<file or dir name> <specified number> <verbose|compact>
265*d583b39bSJohn Wren Kennedy{
266*d583b39bSJohn Wren Kennedy	if [[ ! -e $1 || $2 -ge $(count_ACE $1) ]]; then
267*d583b39bSJohn Wren Kennedy		return 1
268*d583b39bSJohn Wren Kennedy	fi
269*d583b39bSJohn Wren Kennedy
270*d583b39bSJohn Wren Kennedy	typeset file=$1
271*d583b39bSJohn Wren Kennedy	typeset -i num=$2
272*d583b39bSJohn Wren Kennedy	typeset format=${3:-verbose}
273*d583b39bSJohn Wren Kennedy	typeset -i next_num=-1
274*d583b39bSJohn Wren Kennedy
275*d583b39bSJohn Wren Kennedy        typeset tmpfile=/tmp/tmp_get_ACE.$$
276*d583b39bSJohn Wren Kennedy        typeset line=""
277*d583b39bSJohn Wren Kennedy	typeset args
278*d583b39bSJohn Wren Kennedy
279*d583b39bSJohn Wren Kennedy	case $format in
280*d583b39bSJohn Wren Kennedy		verbose) args="-vd"
281*d583b39bSJohn Wren Kennedy			;;
282*d583b39bSJohn Wren Kennedy		compact) args="-Vd"
283*d583b39bSJohn Wren Kennedy			;;
284*d583b39bSJohn Wren Kennedy		*) log_fail "Invalid parameter as ($format), " \
285*d583b39bSJohn Wren Kennedy			"only verbose|compact is supported."
286*d583b39bSJohn Wren Kennedy			;;
287*d583b39bSJohn Wren Kennedy	esac
288*d583b39bSJohn Wren Kennedy
289*d583b39bSJohn Wren Kennedy	$LS $args $file > $tmpfile
290*d583b39bSJohn Wren Kennedy	(( $? != 0 )) && log_fail "FAIL: $LS $args $file > $tmpfile"
291*d583b39bSJohn Wren Kennedy	while read line; do
292*d583b39bSJohn Wren Kennedy		[[ -z $line ]] && continue
293*d583b39bSJohn Wren Kennedy		if [[ $args == -vd ]]; then
294*d583b39bSJohn Wren Kennedy			if [[ $line == "$num":* ]]; then
295*d583b39bSJohn Wren Kennedy				(( next_num = num + 1 ))
296*d583b39bSJohn Wren Kennedy			fi
297*d583b39bSJohn Wren Kennedy			if [[ $line == "$next_num":* ]]; then
298*d583b39bSJohn Wren Kennedy				break
299*d583b39bSJohn Wren Kennedy			fi
300*d583b39bSJohn Wren Kennedy			if (( next_num != -1 )); then
301*d583b39bSJohn Wren Kennedy				print -n $line
302*d583b39bSJohn Wren Kennedy			fi
303*d583b39bSJohn Wren Kennedy		else
304*d583b39bSJohn Wren Kennedy			if (( next_num == num )); then
305*d583b39bSJohn Wren Kennedy				print -n $line
306*d583b39bSJohn Wren Kennedy			fi
307*d583b39bSJohn Wren Kennedy			(( next_num += 1 ))
308*d583b39bSJohn Wren Kennedy		fi
309*d583b39bSJohn Wren Kennedy	done < $tmpfile
310*d583b39bSJohn Wren Kennedy
311*d583b39bSJohn Wren Kennedy	$RM -f $tmpfile
312*d583b39bSJohn Wren Kennedy	(( $? != 0 )) && log_fail "FAIL: $RM -f $tmpfile"
313*d583b39bSJohn Wren Kennedy}
314*d583b39bSJohn Wren Kennedy
315*d583b39bSJohn Wren Kennedy#
316*d583b39bSJohn Wren Kennedy# Cleanup exist user/group.
317*d583b39bSJohn Wren Kennedy#
318*d583b39bSJohn Wren Kennedyfunction cleanup_user_group
319*d583b39bSJohn Wren Kennedy{
320*d583b39bSJohn Wren Kennedy	del_user $ZFS_ACL_ADMIN
321*d583b39bSJohn Wren Kennedy
322*d583b39bSJohn Wren Kennedy	del_user $ZFS_ACL_STAFF1
323*d583b39bSJohn Wren Kennedy	del_user $ZFS_ACL_STAFF2
324*d583b39bSJohn Wren Kennedy	del_group $ZFS_ACL_STAFF_GROUP
325*d583b39bSJohn Wren Kennedy
326*d583b39bSJohn Wren Kennedy	del_user $ZFS_ACL_OTHER1
327*d583b39bSJohn Wren Kennedy	del_user $ZFS_ACL_OTHER2
328*d583b39bSJohn Wren Kennedy	del_group $ZFS_ACL_OTHER_GROUP
329*d583b39bSJohn Wren Kennedy
330*d583b39bSJohn Wren Kennedy	return 0
331*d583b39bSJohn Wren Kennedy}
332*d583b39bSJohn Wren Kennedy
333*d583b39bSJohn Wren Kennedy#
334*d583b39bSJohn Wren Kennedy# Clean up testfile and test directory
335*d583b39bSJohn Wren Kennedy#
336*d583b39bSJohn Wren Kennedyfunction cleanup
337*d583b39bSJohn Wren Kennedy{
338*d583b39bSJohn Wren Kennedy	if [[ -d $TESTDIR ]]; then
339*d583b39bSJohn Wren Kennedy		cd $TESTDIR
340*d583b39bSJohn Wren Kennedy		$RM -rf $TESTDIR/*
341*d583b39bSJohn Wren Kennedy	fi
342*d583b39bSJohn Wren Kennedy}
343*d583b39bSJohn Wren Kennedy
344*d583b39bSJohn Wren Kennedy#
345*d583b39bSJohn Wren Kennedy# According to specified access or acl_spec, do relevant operating by using the
346*d583b39bSJohn Wren Kennedy# specified user.
347*d583b39bSJohn Wren Kennedy#
348*d583b39bSJohn Wren Kennedy# $1 specified user
349*d583b39bSJohn Wren Kennedy# $2 node
350*d583b39bSJohn Wren Kennedy# $3 acl_spec or access
351*d583b39bSJohn Wren Kennedy#
352*d583b39bSJohn Wren Kennedyfunction rwx_node #user node acl_spec|access
353*d583b39bSJohn Wren Kennedy{
354*d583b39bSJohn Wren Kennedy	typeset user=$1
355*d583b39bSJohn Wren Kennedy	typeset node=$2
356*d583b39bSJohn Wren Kennedy	typeset acl_spec=$3
357*d583b39bSJohn Wren Kennedy
358*d583b39bSJohn Wren Kennedy	if [[ $user == "" || $node == "" || $acl_spec == "" ]]; then
359*d583b39bSJohn Wren Kennedy		log_note "node or acl_spec are not defined."
360*d583b39bSJohn Wren Kennedy		return 1
361*d583b39bSJohn Wren Kennedy	fi
362*d583b39bSJohn Wren Kennedy
363*d583b39bSJohn Wren Kennedy	if [[ -d $node ]]; then
364*d583b39bSJohn Wren Kennedy		case $acl_spec in
365*d583b39bSJohn Wren Kennedy		*:read_data:*|read_data)
366*d583b39bSJohn Wren Kennedy			chgusr_exec $user $LS -l $node > /dev/null 2>&1
367*d583b39bSJohn Wren Kennedy			return $? ;;
368*d583b39bSJohn Wren Kennedy		*:write_data:*|write_data)
369*d583b39bSJohn Wren Kennedy			if [[ -f ${node}/tmpfile ]]; then
370*d583b39bSJohn Wren Kennedy				log_must $RM -f ${node}/tmpfile
371*d583b39bSJohn Wren Kennedy			fi
372*d583b39bSJohn Wren Kennedy			chgusr_exec $user $TOUCH ${node}/tmpfile > \
373*d583b39bSJohn Wren Kennedy				/dev/null 2>&1
374*d583b39bSJohn Wren Kennedy			return $? ;;
375*d583b39bSJohn Wren Kennedy		*"execute:"*|execute)
376*d583b39bSJohn Wren Kennedy			chgusr_exec $user $FIND $node > /dev/null 2>&1
377*d583b39bSJohn Wren Kennedy			return $? ;;
378*d583b39bSJohn Wren Kennedy		esac
379*d583b39bSJohn Wren Kennedy	else
380*d583b39bSJohn Wren Kennedy		case $acl_spec in
381*d583b39bSJohn Wren Kennedy		*:read_data:*|read_data)
382*d583b39bSJohn Wren Kennedy			chgusr_exec $user $CAT $node > /dev/null 2>&1
383*d583b39bSJohn Wren Kennedy			return $? ;;
384*d583b39bSJohn Wren Kennedy		*:write_data:*|write_data)
385*d583b39bSJohn Wren Kennedy			chgusr_exec $user $DD if=/usr/bin/ls of=$node > \
386*d583b39bSJohn Wren Kennedy				/dev/null 2>&1
387*d583b39bSJohn Wren Kennedy			return $? ;;
388*d583b39bSJohn Wren Kennedy		*"execute:"*|execute)
389*d583b39bSJohn Wren Kennedy			ZFS_ACL_ERR_STR=$(chgusr_exec $user $node 2>&1)
390*d583b39bSJohn Wren Kennedy			return $? ;;
391*d583b39bSJohn Wren Kennedy		esac
392*d583b39bSJohn Wren Kennedy	fi
393*d583b39bSJohn Wren Kennedy}
394*d583b39bSJohn Wren Kennedy
395*d583b39bSJohn Wren Kennedy#
396*d583b39bSJohn Wren Kennedy# Get the given file/directory xattr
397*d583b39bSJohn Wren Kennedy#
398*d583b39bSJohn Wren Kennedy# $1 object -- file or directroy
399*d583b39bSJohn Wren Kennedy#
400*d583b39bSJohn Wren Kennedyfunction get_xattr #<obj>
401*d583b39bSJohn Wren Kennedy{
402*d583b39bSJohn Wren Kennedy        typeset obj=$1
403*d583b39bSJohn Wren Kennedy	typeset xattr
404*d583b39bSJohn Wren Kennedy	if (( ${#obj} == 0 )); then
405*d583b39bSJohn Wren Kennedy		return 1
406*d583b39bSJohn Wren Kennedy	fi
407*d583b39bSJohn Wren Kennedy
408*d583b39bSJohn Wren Kennedy	for xattr in `$RUNAT $obj $LS | \
409*d583b39bSJohn Wren Kennedy		/usr/xpg4/bin/egrep -v -e SUNWattr_ro -e SUNWattr_rw` ; do
410*d583b39bSJohn Wren Kennedy		$RUNAT $obj $SUM $xattr
411*d583b39bSJohn Wren Kennedy	done
412*d583b39bSJohn Wren Kennedy}
413*d583b39bSJohn Wren Kennedy
414*d583b39bSJohn Wren Kennedy#
415*d583b39bSJohn Wren Kennedy# Get the owner of a file/directory
416*d583b39bSJohn Wren Kennedy#
417*d583b39bSJohn Wren Kennedyfunction get_owner #node
418*d583b39bSJohn Wren Kennedy{
419*d583b39bSJohn Wren Kennedy	typeset node=$1
420*d583b39bSJohn Wren Kennedy	typeset value
421*d583b39bSJohn Wren Kennedy
422*d583b39bSJohn Wren Kennedy	if [[ -z $node ]]; then
423*d583b39bSJohn Wren Kennedy		log_fail "node are not defined."
424*d583b39bSJohn Wren Kennedy	fi
425*d583b39bSJohn Wren Kennedy
426*d583b39bSJohn Wren Kennedy	if [[ -d $node ]]; then
427*d583b39bSJohn Wren Kennedy		value=$($LS -dl $node | $AWK '{print $3}')
428*d583b39bSJohn Wren Kennedy	elif [[ -e $node ]]; then
429*d583b39bSJohn Wren Kennedy		value=$($LS -l $node | $AWK '{print $3}')
430*d583b39bSJohn Wren Kennedy	fi
431*d583b39bSJohn Wren Kennedy
432*d583b39bSJohn Wren Kennedy	$ECHO $value
433*d583b39bSJohn Wren Kennedy}
434*d583b39bSJohn Wren Kennedy
435*d583b39bSJohn Wren Kennedy#
436*d583b39bSJohn Wren Kennedy# Get the group of a file/directory
437*d583b39bSJohn Wren Kennedy#
438*d583b39bSJohn Wren Kennedyfunction get_group #node
439*d583b39bSJohn Wren Kennedy{
440*d583b39bSJohn Wren Kennedy	typeset node=$1
441*d583b39bSJohn Wren Kennedy	typeset value
442*d583b39bSJohn Wren Kennedy
443*d583b39bSJohn Wren Kennedy	if [[ -z $node ]]; then
444*d583b39bSJohn Wren Kennedy		log_fail "node are not defined."
445*d583b39bSJohn Wren Kennedy	fi
446*d583b39bSJohn Wren Kennedy
447*d583b39bSJohn Wren Kennedy	if [[ -d $node ]]; then
448*d583b39bSJohn Wren Kennedy		value=$($LS -dl $node | $AWK '{print $4}')
449*d583b39bSJohn Wren Kennedy	elif [[ -e $node ]]; then
450*d583b39bSJohn Wren Kennedy		value=$($LS -l $node | $AWK '{print $4}')
451*d583b39bSJohn Wren Kennedy	fi
452*d583b39bSJohn Wren Kennedy
453*d583b39bSJohn Wren Kennedy	$ECHO $value
454*d583b39bSJohn Wren Kennedy}
455*d583b39bSJohn Wren Kennedy
456*d583b39bSJohn Wren Kennedy
457*d583b39bSJohn Wren Kennedy#
458*d583b39bSJohn Wren Kennedy# Get the group name that a UID belongs to
459*d583b39bSJohn Wren Kennedy#
460*d583b39bSJohn Wren Kennedyfunction get_user_group #uid
461*d583b39bSJohn Wren Kennedy{
462*d583b39bSJohn Wren Kennedy	typeset uid=$1
463*d583b39bSJohn Wren Kennedy	typeset value
464*d583b39bSJohn Wren Kennedy
465*d583b39bSJohn Wren Kennedy	if [[ -z $uid ]]; then
466*d583b39bSJohn Wren Kennedy		log_fail "UID not defined."
467*d583b39bSJohn Wren Kennedy	fi
468*d583b39bSJohn Wren Kennedy
469*d583b39bSJohn Wren Kennedy	value=$(id $uid)
470*d583b39bSJohn Wren Kennedy
471*d583b39bSJohn Wren Kennedy	if [[ $? -eq 0 ]]; then
472*d583b39bSJohn Wren Kennedy		value=${value##*\(}
473*d583b39bSJohn Wren Kennedy		value=${value%%\)*}
474*d583b39bSJohn Wren Kennedy		$ECHO $value
475*d583b39bSJohn Wren Kennedy	else
476*d583b39bSJohn Wren Kennedy		log_fail "Invalid UID (uid)."
477*d583b39bSJohn Wren Kennedy	fi
478*d583b39bSJohn Wren Kennedy}
479*d583b39bSJohn Wren Kennedy
480*d583b39bSJohn Wren Kennedy#
481*d583b39bSJohn Wren Kennedy# Get the specified item of the specified string
482*d583b39bSJohn Wren Kennedy#
483*d583b39bSJohn Wren Kennedy# $1:	Item number, count from 0.
484*d583b39bSJohn Wren Kennedy# $2-n: strings
485*d583b39bSJohn Wren Kennedy#
486*d583b39bSJohn Wren Kennedyfunction getitem
487*d583b39bSJohn Wren Kennedy{
488*d583b39bSJohn Wren Kennedy	typeset -i n=$1
489*d583b39bSJohn Wren Kennedy	shift
490*d583b39bSJohn Wren Kennedy
491*d583b39bSJohn Wren Kennedy	(( n += 1 ))
492*d583b39bSJohn Wren Kennedy	eval echo \${$n}
493*d583b39bSJohn Wren Kennedy}
494*d583b39bSJohn Wren Kennedy
495*d583b39bSJohn Wren Kennedy#
496*d583b39bSJohn Wren Kennedy# This function calculate the specified directory files checksum and write
497*d583b39bSJohn Wren Kennedy# to the specified array.
498*d583b39bSJohn Wren Kennedy#
499*d583b39bSJohn Wren Kennedy# $1 directory in which the files will be cksum.
500*d583b39bSJohn Wren Kennedy# $2 file array name which was used to store file cksum information.
501*d583b39bSJohn Wren Kennedy# $3 attribute array name which was used to store attribute information.
502*d583b39bSJohn Wren Kennedy#
503*d583b39bSJohn Wren Kennedyfunction cksum_files #<dir> <file_array_name> <attribute_array_name>
504*d583b39bSJohn Wren Kennedy{
505*d583b39bSJohn Wren Kennedy	typeset dir=$1
506*d583b39bSJohn Wren Kennedy	typeset farr_name=$2
507*d583b39bSJohn Wren Kennedy	typeset aarr_name=$3
508*d583b39bSJohn Wren Kennedy
509*d583b39bSJohn Wren Kennedy	[[ ! -d $dir ]] && return
510*d583b39bSJohn Wren Kennedy	typeset oldpwd=$PWD
511*d583b39bSJohn Wren Kennedy	cd $dir
512*d583b39bSJohn Wren Kennedy	typeset files=$($LS file*)
513*d583b39bSJohn Wren Kennedy
514*d583b39bSJohn Wren Kennedy	typeset -i i=0
515*d583b39bSJohn Wren Kennedy	typeset -i n=0
516*d583b39bSJohn Wren Kennedy	while (( i < NUM_FILE )); do
517*d583b39bSJohn Wren Kennedy		typeset f=$(getitem $i $files)
518*d583b39bSJohn Wren Kennedy		eval $farr_name[$i]=\$\(\$CKSUM $f\)
519*d583b39bSJohn Wren Kennedy
520*d583b39bSJohn Wren Kennedy		typeset -i j=0
521*d583b39bSJohn Wren Kennedy		while (( j < NUM_ATTR )); do
522*d583b39bSJohn Wren Kennedy			eval $aarr_name[$n]=\$\(\$RUNAT \$f \$CKSUM \
523*d583b39bSJohn Wren Kennedy				attribute.$j\)
524*d583b39bSJohn Wren Kennedy
525*d583b39bSJohn Wren Kennedy			(( j += 1 ))
526*d583b39bSJohn Wren Kennedy			(( n += 1 ))
527*d583b39bSJohn Wren Kennedy		done
528*d583b39bSJohn Wren Kennedy
529*d583b39bSJohn Wren Kennedy		(( i += 1 ))
530*d583b39bSJohn Wren Kennedy	done
531*d583b39bSJohn Wren Kennedy
532*d583b39bSJohn Wren Kennedy	cd $oldpwd
533*d583b39bSJohn Wren Kennedy}
534*d583b39bSJohn Wren Kennedy
535*d583b39bSJohn Wren Kennedy#
536*d583b39bSJohn Wren Kennedy# This function compare two cksum results array.
537*d583b39bSJohn Wren Kennedy#
538*d583b39bSJohn Wren Kennedy# $1 The array name which stored the cksum before operation.
539*d583b39bSJohn Wren Kennedy# $2 The array name which stored the cksum after operation.
540*d583b39bSJohn Wren Kennedy#
541*d583b39bSJohn Wren Kennedyfunction compare_cksum #<array1> <array2>
542*d583b39bSJohn Wren Kennedy{
543*d583b39bSJohn Wren Kennedy	typeset before=$1
544*d583b39bSJohn Wren Kennedy	typeset after=$2
545*d583b39bSJohn Wren Kennedy	eval typeset -i count=\${#$before[@]}
546*d583b39bSJohn Wren Kennedy
547*d583b39bSJohn Wren Kennedy	typeset -i i=0
548*d583b39bSJohn Wren Kennedy	while (( i < count )); do
549*d583b39bSJohn Wren Kennedy		eval typeset var1=\${$before[$i]}
550*d583b39bSJohn Wren Kennedy		eval typeset var2=\${$after[$i]}
551*d583b39bSJohn Wren Kennedy
552*d583b39bSJohn Wren Kennedy		if [[ $var1 != $var2 ]]; then
553*d583b39bSJohn Wren Kennedy			return 1
554*d583b39bSJohn Wren Kennedy		fi
555*d583b39bSJohn Wren Kennedy
556*d583b39bSJohn Wren Kennedy		(( i += 1 ))
557*d583b39bSJohn Wren Kennedy	done
558*d583b39bSJohn Wren Kennedy
559*d583b39bSJohn Wren Kennedy	return 0
560*d583b39bSJohn Wren Kennedy}
561*d583b39bSJohn Wren Kennedy
562*d583b39bSJohn Wren Kennedy#
563*d583b39bSJohn Wren Kennedy# This function calculate all the files cksum information in current directory
564*d583b39bSJohn Wren Kennedy# and output them to the specified file.
565*d583b39bSJohn Wren Kennedy#
566*d583b39bSJohn Wren Kennedy# $1 directory from which the files will be cksum.
567*d583b39bSJohn Wren Kennedy# $2 cksum output file
568*d583b39bSJohn Wren Kennedy#
569*d583b39bSJohn Wren Kennedyfunction record_cksum #<outfile>
570*d583b39bSJohn Wren Kennedy{
571*d583b39bSJohn Wren Kennedy	typeset dir=$1
572*d583b39bSJohn Wren Kennedy	typeset outfile=$2
573*d583b39bSJohn Wren Kennedy
574*d583b39bSJohn Wren Kennedy	[[ ! -d ${outfile%/*} ]] && usr_exec $MKDIR -p ${outfile%/*}
575*d583b39bSJohn Wren Kennedy
576*d583b39bSJohn Wren Kennedy	usr_exec cd $dir ; $FIND . -depth -type f -exec cksum {} \\\; | \
577*d583b39bSJohn Wren Kennedy	    $SORT > $outfile
578*d583b39bSJohn Wren Kennedy	usr_exec cd $dir ; $FIND . -depth -type f -xattr -exec runat {} \
579*d583b39bSJohn Wren Kennedy		cksum attribute* \\\; | $SORT >> $outfile
580*d583b39bSJohn Wren Kennedy}
581*d583b39bSJohn Wren Kennedy
582*d583b39bSJohn Wren Kennedy#
583*d583b39bSJohn Wren Kennedy# The function create_files creates the directories and files that the script
584*d583b39bSJohn Wren Kennedy# will operate on to test extended attribute functionality.
585*d583b39bSJohn Wren Kennedy#
586*d583b39bSJohn Wren Kennedy# $1 The base directory in which to create directories and files.
587*d583b39bSJohn Wren Kennedy#
588*d583b39bSJohn Wren Kennedyfunction create_files #<directory>
589*d583b39bSJohn Wren Kennedy{
590*d583b39bSJohn Wren Kennedy	typeset basedir=$1
591*d583b39bSJohn Wren Kennedy
592*d583b39bSJohn Wren Kennedy	[[ ! -d $basedir ]] && usr_exec $MKDIR -m 777 $basedir
593*d583b39bSJohn Wren Kennedy	[[ ! -d $RES_DIR  ]] && usr_exec $MKDIR -m 777 $RES_DIR
594*d583b39bSJohn Wren Kennedy	[[ ! -d $INI_DIR ]] && usr_exec $MKDIR -m 777 $INI_DIR
595*d583b39bSJohn Wren Kennedy	[[ ! -d $TST_DIR ]] && usr_exec $MKDIR -m 777 $TST_DIR
596*d583b39bSJohn Wren Kennedy	[[ ! -d $TMP_DIR  ]] && usr_exec $MKDIR -m 777 $TMP_DIR
597*d583b39bSJohn Wren Kennedy
598*d583b39bSJohn Wren Kennedy	#
599*d583b39bSJohn Wren Kennedy	# Create the original file and its attribute files.
600*d583b39bSJohn Wren Kennedy	#
601*d583b39bSJohn Wren Kennedy	[[ ! -a $RES_DIR/file ]] && \
602*d583b39bSJohn Wren Kennedy		usr_exec $FILE_WRITE -o create -f $RES_DIR/file \
603*d583b39bSJohn Wren Kennedy			-b 1024 -d 0 -c 1
604*d583b39bSJohn Wren Kennedy	[[ ! -a $RES_DIR/attribute ]] && \
605*d583b39bSJohn Wren Kennedy		usr_exec $CP $RES_DIR/file $RES_DIR/attribute
606*d583b39bSJohn Wren Kennedy
607*d583b39bSJohn Wren Kennedy	typeset oldpwd=$PWD
608*d583b39bSJohn Wren Kennedy	cd $INI_DIR
609*d583b39bSJohn Wren Kennedy
610*d583b39bSJohn Wren Kennedy	typeset -i i=0
611*d583b39bSJohn Wren Kennedy	while (( i < NUM_FILE )); do
612*d583b39bSJohn Wren Kennedy		typeset dstfile=$INI_DIR/file.$$.$i
613*d583b39bSJohn Wren Kennedy		usr_exec $CP $RES_DIR/file $dstfile
614*d583b39bSJohn Wren Kennedy
615*d583b39bSJohn Wren Kennedy		typeset -i j=0
616*d583b39bSJohn Wren Kennedy		while (( j < NUM_ATTR )); do
617*d583b39bSJohn Wren Kennedy			usr_exec $RUNAT $dstfile \
618*d583b39bSJohn Wren Kennedy				$CP $RES_DIR/attribute ./attribute.$j
619*d583b39bSJohn Wren Kennedy			(( j += 1 ))
620*d583b39bSJohn Wren Kennedy		done
621*d583b39bSJohn Wren Kennedy
622*d583b39bSJohn Wren Kennedy		(( i += 1 ))
623*d583b39bSJohn Wren Kennedy	done
624*d583b39bSJohn Wren Kennedy
625*d583b39bSJohn Wren Kennedy	cd $oldpwd
626*d583b39bSJohn Wren Kennedy}
627