1 #! /usr/bin/ksh -p
   2 #
   3 # CDDL HEADER START
   4 #
   5 # The contents of this file are subject to the terms of the
   6 # Common Development and Distribution License (the "License").
   7 # You may not use this file except in compliance with the License.
   8 #
   9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10 # or http://www.opensolaris.org/os/licensing.
  11 # See the License for the specific language governing permissions
  12 # and limitations under the License.
  13 #
  14 # When distributing Covered Code, include this CDDL HEADER in each
  15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16 # If applicable, add the following below this CDDL HEADER, with the
  17 # fields enclosed by brackets "[]" replaced with your own identifying
  18 # information: Portions Copyright [yyyy] [name of copyright owner]
  19 #
  20 # CDDL HEADER END
  21 #
  22 
  23 #
  24 # Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  25 # Use is subject to license terms.
  26 #
  27 # NFSv4 server name space test - positive tests
  28 #
  29 
  30 [[ -n $DEBUG ]] && [[ $DEBUG != 0 ]] && set -x
  31 
  32 NAME=`basename $0`
  33 CDIR=`pwd`
  34 NSPC=`echo $NAME | sed 's/./ /g'`
  35 
  36 # Source for common functions
  37 . $TESTROOT/testsh
  38 
  39 # check for root to run 
  40 is_root $NAME "NFSv4 server namespace share test."
  41 
  42 TMPmnt=$ZONE_PATH/$NAME.$$
  43 mkdir -m 0777 -p $TMPmnt
  44 # do not prepend $ZONE_PATH to TMPmnt-2
  45 # It has already been done
  46 TMPmnt2=$TMPmnt-2
  47 mkdir -m 0777 -p $TMPmnt2
  48 
  49 doSHDIR=._doShare_Dir_.
  50 DOSHARE=$MNTPTR/$doSHDIR
  51 [[ ! -d $DOSHARE ]] && mkdir -m 0777 -p $DOSHARE
  52 
  53 allunsupp=0
  54 is_cipso "vers=4" $SERVER
  55 if [ $? -eq $CIPSO_NFSV4 ]; then
  56         cipso_check_mntpaths $BASEDIR $TMPmnt
  57         if [ $? -ne 0 ]; then
  58                 allunsupp=1
  59                 echo "$NAME: UNSUPPORTED"
  60                 echo "$NAME: CIPSO NFSv4 requires non-global zone mount dirs."
  61                 echo "$NSPC  The server's BASEDIR and client's MNTPTR"
  62                 echo "$NSPC  must contain path legs with matching"
  63                 echo "$NSPC  non-global zone paths."
  64                 echo "$NSPC: Please try again ..."
  65         fi
  66 fi
  67 
  68 # Function to to check the DONE file (provided by the "doshare" program in server,
  69 # is available before checking its status
  70 # Usage: ckDone st msg nock_flag
  71 #       where:  "st" is the status to check
  72 #               "msg" is the message to print after checking the status
  73 #               "nock_flag" is the flag not to check status when provided
  74 function ckDONE
  75 {
  76     [[ -n $DEBUG ]] && [[ $DEBUG != 0 ]] && set -x
  77     st=$1
  78     msg=$2
  79     i=0         # set a time limit as well (1 min)
  80     while [[ ! -s $DOSHARE/DONE ]] && ((i<20)) 
  81     do
  82         ((i=i+1))
  83         sleep 3
  84     done
  85     [[ $# == 3 ]] && return $i  # just return if we do not need to check status
  86     if [[ -s $DOSHARE/DONE ]]; then
  87         if [[ $st == OK ]]; then
  88             grep "$st" $DOSHARE/DONE > /dev/null 2>&1
  89         else
  90             grep "$st" $DOSHARE/DONE | grep "fail" > /dev/null 2>&1
  91         fi
  92         ckreturn $? "\"$msg\"" $DOSHARE/DONE
  93         i=$?
  94         rm -f $DOSHARE/DONE
  95     else
  96         ckreturn $i "\"$msg\"" $DOSHARE/DONE
  97     fi
  98     return $i
  99 }
 100 
 101 # Function to check for mount/umount of the path & the access to mount point
 102 # Usage: ckMNT_ACC mopt srvp mptr afile umnt
 103 #       where:  "mopt" is the mount options to be used in mount command
 104 #               "srvp" is the server's path to be used in mount command
 105 #               "mptr" is the client mount point to be used in mount command
 106 #               "afile" is an option to provide a file to check the access
 107 #               "umnt" is the flag to signal if umount (of $mptr) is needed
 108 #                       skip umount if "no" is specified
 109 function ckMNT_ACC
 110 {
 111     [[ -n $DEBUG ]] && [[ $DEBUG != 0 ]] && set -x
 112     mopt=$1
 113     srvp=$2
 114     mptr=$3
 115     afile=""
 116     [[ $# == 4 ]] && afile=$4
 117     umnt="yes"
 118     [[ $# == 5 ]] && umnt=$5
 119     accr=0
 120 
 121     # First mount the server path with the options
 122     mount -o $mopt $SERVER:$srvp $mptr > $TMPDIR/$NAME.mnt.$$ 2>&1
 123     ckreturn $? "mount <$mopt, $SERVER:$srvp> failed" $TMPDIR/$NAME.mnt.$$
 124     [[ $? != 0 ]] && return $FAIL
 125 
 126     # check the mount point or specified file/dir
 127     Acc_file=$mptr
 128     [[ -n $afile ]] && Acc_file=$afile 
 129     if [[ ! -f $Acc_file ]]; then
 130         ls -ltaF $Acc_file > $TMPDIR/$NAME.ls-ltaF.$$ 2>&1
 131         ckreturn $? "ls -ltaF $Acc_file failed" $TMPDIR/$NAME.ls-ltaF.$$
 132         accr=$?
 133     else        # is a file, open/read it
 134         cat $Acc_file > $TMPDIR/$NAME.cat.$$ 2>&1
 135         ckreturn $? "cat $Acc_file failed" $TMPDIR/$NAME.cat.$$
 136         accr=$?
 137     fi
 138 
 139 
 140     if [[ $umnt != no ]]; then
 141         umount $mptr > $TMPDIR/$NAME.umnt.$$ 2>&1
 142         ckreturn $? "umount $mptr FAILed" $TMPDIR/$NAME.umnt.$$
 143         [[ $? != 0 ]] && return $FAIL
 144     fi
 145 
 146     return $accr
 147 }
 148 
 149 
 150 # Start test assertions here
 151 # ----------------------------------------------------------------------
 152 # a: Server share/unshare a rw'able file, expect succeed
 153 function assertion_a
 154 {
 155     [[ -n $DEBUG ]] && [[ $DEBUG != 0 ]] && set -x
 156     ASSERTION="Server share/unshare a file, expect succeed"
 157     echo "$NAME{a}: $ASSERTION"
 158     SRVPATH=$NOTSHDIR/$RWFILE
 159 
 160     if [ $allunsupp -eq 1 ]; then
 161         echo "\t Test UNSUPPORTED"
 162         return $UNSUPPORTED
 163     fi
 164 
 165     # signal $SERVER to share the file
 166     echo $SRVPATH > $DOSHARE/share 2> $TMPDIR/$NAME.share.$$
 167     ckreturn $? "signal server to share" $TMPDIR/$NAME.share.$$ "UNRESOLVED"
 168     [[ $? != 0 ]] && return $UNRESOLVED
 169     ckDONE "OK" "share $SRVPATH failed"
 170     [[ $? != 0 ]] && return $FAIL
 171 
 172     # Test it with mount, access and umount
 173     ckMNT_ACC "vers=4,rw" $SRVPATH $TMPmnt
 174     [[ $? != 0 ]] && return $FAIL
 175 
 176     # and finally signal to unshare it from SERVER
 177     echo "$SRVPATH" > $DOSHARE/unshare 2> $TMPDIR/$NAME.unshare.$$
 178     ckreturn $? "signal server to unshare" $TMPDIR/$NAME.unshare.$$
 179     [[ $? != 0 ]] && return $FAIL
 180     ckDONE "OK" "unshare $SRVPATH failed"
 181     [[ $? != 0 ]] && return $FAIL
 182 
 183     echo "\t Test PASS"
 184 }
 185 
 186 
 187 # f: Server share/unshare a file, try mount it w/v3&4, expect succeed
 188 function assertion_f
 189 {
 190     [[ -n $DEBUG ]] && [[ $DEBUG != 0 ]] && set -x
 191     ASSERTION="Server share/unshare a file mount it w/v3&4, expect succeed"
 192     echo "$NAME{f}: $ASSERTION"
 193     SRVPATH=$NOTSHDIR/$ROFILE
 194 
 195     # signal $SERVER to share the file
 196     echo "$SRVPATH" > $DOSHARE/share 2> $TMPDIR/$NAME.share.$$
 197     ckreturn $? "signal server to share" $TMPDIR/$NAME.share.$$ "UNRESOLVED"
 198     [[ $? != 0 ]] && return $UNRESOLVED
 199     ckDONE "OK" "share $SRVPATH failed"
 200     [[ $? != 0 ]] && return $FAIL
 201 
 202     # Test it with the mount v3 on the $SRVPATH
 203     ckMNT_ACC "vers=3,rw" $SRVPATH $TMPmnt $TMPmnt "no"
 204     [[ $? != 0 ]] && return $FAIL
 205 
 206     # Test it with the mount v4 on the $SRVPATH
 207     ckMNT_ACC "vers=4,rw" $SRVPATH $TMPmnt2 $TMPmnt2 "no"
 208     [[ $? != 0 ]] && return $FAIL
 209 
 210     # umount both mount points
 211     umount $TMPmnt > $TMPDIR/$NAME.umnt.$$ 2>&1
 212     ckreturn $? "umount $TMPmnt failed" $TMPDIR/$NAME.umnt.$$
 213     [[ $? != 0 ]] && return $FAIL
 214     umount $TMPmnt2 > $TMPDIR/$NAME.umnt.$$ 2>&1
 215     ckreturn $? "umount $TMPmnt2 failed" $TMPDIR/$NAME.umnt.$$
 216     [[ $? != 0 ]] && return $FAIL
 217 
 218     # and finally signal to unshare it from SERVER
 219     echo "$SRVPATH" > $DOSHARE/unshare 2> $TMPDIR/$NAME.unshare.$$
 220     ckreturn $? "signal server to unshare" $TMPDIR/$NAME.unshare.$$
 221     [[ $? != 0 ]] && return $FAIL
 222     ckDONE "OK" "unshare $SRVPATH failed"
 223     [[ $? != 0 ]] && return $FAIL
 224 
 225     echo "\t Test PASS"
 226 }
 227 
 228 # g: Server share/unshare a file, try mount it w/v4&2, expect succeed
 229 function assertion_g
 230 {
 231     [[ -n $DEBUG ]] && [[ $DEBUG != 0 ]] && set -x
 232     ASSERTION="Server share/unshare a file mount it w/v4&2, expect succeed"
 233     echo "$NAME{g}: $ASSERTION"
 234     SRVPATH=$NOTSHDIR/$RWFILE
 235 
 236     is_cipso "vers=2" $SERVER
 237     if [ $? -eq $CIPSO_NFSV2 ]; then
 238         echo "$NAME{g}: CIPSO NFSv2 is not supported under Trusted Extensions."
 239         echo "\t Test UNSUPPORTED"
 240         return $UNSUPPORTED
 241     fi
 242 
 243     # signal $SERVER to share the file
 244     echo "$SRVPATH" > $DOSHARE/share 2> $TMPDIR/$NAME.share.$$
 245     ckreturn $? "signal server to share" $TMPDIR/$NAME.share.$$ "UNRESOLVED"
 246     [[ $? != 0 ]] && return $UNRESOLVED
 247     ckDONE "OK" "share $SRVPATH failed"
 248     [[ $? != 0 ]] && return $FAIL
 249 
 250     # Test it with the mount v4 on the $SRVPATH
 251     ckMNT_ACC "vers=4,ro" $SRVPATH $TMPmnt $TMPmnt "no"
 252     [[ $? != 0 ]] && return $FAIL
 253 
 254     # Test it with the mount v2 on the $SRVPATH
 255     ckMNT_ACC "vers=2,rw" $SRVPATH $TMPmnt2 $TMPmnt2 "no"
 256     [[ $? != 0 ]] && return $FAIL
 257 
 258     # umount both mount points
 259     umount $TMPmnt > $TMPDIR/$NAME.umnt.$$ 2>&1
 260     ckreturn $? "umount $TMPmnt failed" $TMPDIR/$NAME.umnt.$$
 261     [[ $? != 0 ]] && return $FAIL
 262     umount $TMPmnt2 > $TMPDIR/$NAME.umnt.$$ 2>&1
 263     ckreturn $? "umount $TMPmnt2 failed" $TMPDIR/$NAME.umnt.$$
 264     [[ $? != 0 ]] && return $FAIL
 265 
 266     # and finally signal to unshare it from SERVER
 267     echo "$SRVPATH" > $DOSHARE/unshare 2> $TMPDIR/$NAME.unshare.$$
 268     ckreturn $? "signal server to unshare" $TMPDIR/$NAME.unshare.$$
 269     [[ $? != 0 ]] && return $FAIL
 270     ckDONE "OK" "unshare $SRVPATH failed"
 271     [[ $? != 0 ]] && return $FAIL
 272 
 273     echo "\t Test PASS"
 274 }
 275 
 276 # i: Server share dir under shared FS and unshare, expect just fail
 277 function assertion_i
 278 {
 279     [[ -n $DEBUG ]] && [[ $DEBUG != 0 ]] && set -x
 280     ASSERTION="Server share dir under shared FS and unshare, expect fail"
 281     echo "$NAME{i}: $ASSERTION"
 282     SRVPATH=$BASEDIR/$DIR0777
 283 
 284     if [ $allunsupp -eq 1 ]; then
 285         echo "\t Test UNSUPPORTED"
 286         return $UNSUPPORTED
 287     fi
 288 
 289     # signal $SERVER to share the file
 290     echo "$SRVPATH" > $DOSHARE/share 2> $TMPDIR/$NAME.share.$$
 291     ckreturn $? "signal server to share" $TMPDIR/$NAME.share.$$ "UNRESOLVED"
 292     [[ $? != 0 ]] && return $UNRESOLVED
 293     ckDONE "share" "share $SRVPATH did not fail as expected"
 294     [[ $? != 0 ]] && return $FAIL
 295 
 296     # try unshare it from SERVER
 297     echo "$SRVPATH" > $DOSHARE/unshare 2> $TMPDIR/$NAME.unshare.$$
 298     ckreturn $? "signal server to unshare" $TMPDIR/$NAME.unshare.$$
 299     [[ $? != 0 ]] && return $FAIL
 300     ckDONE "unshare" "unshare $SRVPATH did not fail as expected"
 301     [[ $? != 0 ]] && return $FAIL
 302 
 303     echo "\t Test PASS"
 304 }
 305 
 306 # m: Server share/unshare a symlink dir in namespace, expect succeed
 307 function assertion_m
 308 {
 309     [[ -n $DEBUG ]] && [[ $DEBUG != 0 ]] && set -x
 310     ASSERTION="Server share/unshare a symlink dir in namespace, expect succeed"
 311     echo "$NAME{m}: $ASSERTION"
 312     SRVPATH=$NOTSHDIR/syml_shnfs
 313 
 314     if [ $allunsupp -eq 1 ]; then
 315         echo "\t Test UNSUPPORTED"
 316         return $UNSUPPORTED
 317     fi
 318 
 319     # signal $SERVER to share the file
 320     echo "$SRVPATH" > $DOSHARE/share 2> $TMPDIR/$NAME.share.$$
 321     ckreturn $? "signal server to share" $TMPDIR/$NAME.share.$$ "UNRESOLVED"
 322     [[ $? != 0 ]] && return $UNRESOLVED
 323     ckDONE "OK" "share $SRVPATH failed"
 324     [[ $? != 0 ]] && return $FAIL
 325 
 326     # Test it with mount, access and umount
 327     ckMNT_ACC "vers=4,rw" $SRVPATH $TMPmnt $TMPmnt/$DIR0755/dir2
 328     [[ $? != 0 ]] && return $FAIL
 329 
 330     # and finally signal to unshare it from SERVER
 331     echo "$SRVPATH" > $DOSHARE/unshare 2> $TMPDIR/$NAME.unshare.$$
 332     ckreturn $? "signal server to unshare" $TMPDIR/$NAME.unshare.$$
 333     [[ $? != 0 ]] && return $FAIL
 334     ckDONE "OK" "unshare $SRVPATH failed"
 335     [[ $? != 0 ]] && return $FAIL
 336 
 337     echo "\t Test PASS"
 338 }
 339 
 340 # n: Server share a symlink outside namespace for client to mount, expect fail
 341 function assertion_n
 342 {
 343     [[ -n $DEBUG ]] && [ $DEBUG != 0 ] && set -x
 344     ASSERTION="Server share a symlink outside namespace, client to mount"
 345     ASSERTION="$ASSERTION, expect fail"
 346     echo "$NAME{n}: $ASSERTION"
 347     SRVPATH=$ZONE_PATH/ck_symlink
 348 
 349     if [ $allunsupp -eq 1 ]; then
 350         echo "\t Test UNSUPPORTED"
 351         return $UNSUPPORTED
 352     fi
 353 
 354     # signal $SERVER to share the file
 355     echo "$SRVPATH" > $DOSHARE/share 2> $TMPDIR/$NAME.share.$$
 356     ckreturn $? "signal server to share" $TMPDIR/$NAME.share.$$ "UNRESOLVED"
 357     [[ $? != 0 ]] && return $UNRESOLVED
 358     ckDONE "OK" "share $SRVPATH failed"
 359     [[ $? != 0 ]] && return $FAIL
 360 
 361     # Test it with the mount on the $SRVPATH
 362     mount -o vers=4,rw $SERVER:$SRVPATH $TMPmnt2 > $TMPDIR/$NAME.mnt.$$ 2>&1
 363     if [[ $? == 0 ]]; then
 364         echo "\t Test FAIL: mounting <$SRVPATH> did not fail"
 365         cat $TMPDIR/$NAME.mnt.$$
 366         return $FAIL
 367     fi
 368 
 369     # verify the mount point is not NFS mounted
 370     df -F nfs $TMPmnt2 > $TMPDIR/$NAME.ck.$$ 2>&1
 371     if [[ $? == 0 ]]; then
 372         echo "\t Test FAIL: mount point <$TMPmnt2> should not be NFS"
 373         cat $TMPDIR/$NAME.ck.$$
 374         return $FAIL
 375     fi
 376 
 377     # and finally signal to unshare it from SERVER
 378     echo "$SRVPATH" > $DOSHARE/unshare 2> $TMPDIR/$NAME.unshare.$$
 379     ckreturn $? "signal server to unshare" $TMPDIR/$NAME.unshare.$$
 380     [[ $? != 0 ]] && return $FAIL
 381     ckDONE "OK" "unshare $SRVPATH failed"
 382     [[ $? != 0 ]] && return $FAIL
 383 
 384     echo "\t Test PASS"
 385 }
 386 
 387 
 388 # Start main program here:
 389 # ----------------------------------------------------------------------
 390 # start a doshare program in server for sharing/unsharing
 391 PROG=doshare
 392 rm -f $TMPDIR/$PROG
 393 sed -e "s%_doSHareDir_%$BASEDIR/$doSHDIR%" \
 394     -e "s%_zonePATH_%$ZONE_PATH%" $PROG > $TMPDIR/$PROG
 395 if [ $? -ne 0 ]; then
 396         echo "$NAME: can't setup [$PROG] file."
 397         echo "\t Test UNINITIATED"
 398         exit $UNINITIATED
 399 fi
 400 rcp $TMPDIR/$PROG $SERVER:$TMPDIR > $TMPDIR/$NAME.rcp.$$ 2>&1
 401 if [[ $? != 0 ]]; then
 402         echo "$NAME: Test UNINITIATED"
 403         echo "\t failed to copy $PROG to $SERVER - \c"
 404         cat $TMPDIR/$NAME.rcp.$$
 405         exit $OTHER
 406 fi
 407 rsh -n $SERVER "chmod +x ${TMPDIR}/$PROG; ${TMPDIR}/$PROG &" \
 408         > $TMPDIR/$NAME.rsh.$$ 2>&1 &
 409 sleep 5 
 410 grep $PROG $TMPDIR/$NAME.rsh.$$ | grep running > /dev/null 2>&1
 411 if [[ $? != 0 ]]; then
 412         echo "$NAME: Test UNINITIATED"
 413         echo "\t failed to run $PROG at $SERVER - \c"
 414         cat $TMPDIR/$NAME.rsh.$$
 415         exit $OTHER
 416 fi
 417 
 418 # run all assertions
 419 assertion_a
 420 ret=$?
 421 if [[ $ret != 0 ]] && [[ $ret != $UNSUPPORTED ]]; then
 422         umount -f $TMPmnt > /dev/null 2>&1
 423         echo "$SRVPATH" > $DOSHARE/unshare
 424         ckDONE "OK" "don't check error" 3
 425 fi
 426 
 427 assertion_f
 428 ret=$?
 429 if [[ $ret != 0 ]] && [[ $ret != $UNSUPPORTED ]]; then
 430         umount -f $TMPmnt > /dev/null 2>&1
 431         umount -f $TMPmnt2 > /dev/null 2>&1
 432         echo "$SRVPATH" > $DOSHARE/unshare 
 433         ckDONE "OK" "don't check error" 3
 434 fi
 435 
 436 assertion_g
 437 ret=$?
 438 if [[ $ret != 0 ]] && [[ $ret != $UNSUPPORTED ]]; then
 439         umount -f $TMPmnt > /dev/null 2>&1
 440         umount -f $TMPmnt2 > /dev/null 2>&1
 441         echo "$SRVPATH" > $DOSHARE/unshare > /dev/null 2>&1
 442         ckDONE "OK" "don't check error" 3
 443 fi
 444 
 445 assertion_i
 446 
 447 assertion_m
 448 [[ $? != 0 ]] && umount -f $TMPmnt > /dev/null 2>&1
 449 
 450 assertion_n
 451 [[ $? != 0 ]] && umount -f $TMPmnt2 > /dev/null 2>&1
 452 
 453 # cleanup PROG from server
 454 echo "killushare" > $DOSHARE/killushare 2>&1
 455 ckDONE "OK" "don't check error" 3
 456 
 457 # cleanup here
 458 rmdir $TMPmnt $TMPmnt2 
 459 rm -f $TMPDIR/$NAME.*.$$ $TMPDIR/$PROG
 460 rm -fr $DOSHARE
 461 
 462 exit 0