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