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