1 #
2 # CDDL HEADER START
3 #
4 # The contents of this file are subject to the terms of the
5 # Common Development and Distribution License (the "License").
6 # You may not use this file except in compliance with the License.
7 #
8 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 # or http://www.opensolaris.org/os/licensing.
10 # See the License for the specific language governing permissions
11 # and limitations under the License.
12 #
13 # When distributing Covered Code, include this CDDL HEADER in each
14 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 # If applicable, add the following below this CDDL HEADER, with the
16 # fields enclosed by brackets "[]" replaced with your own identifying
17 # information: Portions Copyright [yyyy] [name of copyright owner]
18 #
19 # CDDL HEADER END
20 #
21
22 #
23 # Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24 # Use is subject to license terms.
25 #
26
27 #
28 # NAME
29 # stmfadm_create_info
30 # DESCRIPTION
31 # Store information about created objects based on information
32 # passed to the function as arguments.
33 #
34 # RETURN
35 # void
36 #
37 function stmfadm_create_info
38 {
39 typeset object=$1
40 shift 1
41 typeset options=$*
42 eval typeset object_id=\${$#}
43
44 echo $object_id |wc -c | read len
45 if [ $len -gt 255 ];then
46 typeset -L255 object_id="$object_id"
47 fi
48
49 case "$object" in
50 "hg")
51 echo "${G_HG}" | grep -w $object_id > /dev/null 2>&1
52 if [ $? -ne 0 ];then
53 G_HG="$object_id $G_HG"
54 fi
55 eval HG_${object_id}_guid="\${HG_${object_id}_guid:=''}"
56 eval HG_${object_id}_member="\${HG_${object_id}_member:=''}"
57 ;;
58 "tg")
59 echo "${G_TG}" | grep -w $object_id > /dev/null 2>&1
60 if [ $? -ne 0 ];then
61 G_TG="$object_id $G_TG"
62 fi
63 eval TG_${object_id}_guid="\${TG_${object_id}_guid:=''}"
64 eval TG_${object_id}_member="\${TG_${object_id}_member:=''}"
65 ;;
66 *)
67 cti_report "unknow object - $object"
68 ;;
69 esac
70 }
71
72
73 #
74 # NAME
75 # stmfadm_delete_info
76 # DESCRIPTION
77 # Delete information about stored objects based on information
78 # passed to the function as arguments.
79 #
80 # RETURN
81 # void
82 #
83 function stmfadm_delete_info
84 {
85 typeset object=$1
86 shift 1
87 typeset options=$*
88 eval typeset object_id=\${$#}
89
90 echo $object_id |wc -c | read len
91 if [ $len -gt 255 ];then
92 typeset -L255 object_id="$object_id"
93 fi
94
95 case "$object" in
96 "hg")
97 echo "${G_HG}" | grep -w $object_id > /dev/null 2>&1
98 if [ $? -eq 0 ];then
99 eval hg_list="\$HG_${object_id}_guid"
100 if [ -z $hg_list ];then
101 G_HG=`echo $G_HG | sed -e "s/\<$object_id\>//g"\
102 | sed 's/^ *//g'`
103 eval HG_${object_id}_member="\${HG_${object_id}_member:=''}"
104 eval member_hglist="\$HG_${object_id}_member"
105 member_hglist=`trunc_space "$member_hglist"`
106 typeset member_id
107 for member_id in $member_hglist
108 do
109 typeset scsi_id=`format_scsiname \
110 "$member_id"`
111 typeset shell_id=`format_shellvar \
112 "$scsi_id"`
113 eval MEMBER_${shell_id}_hg=""
114 stmfadm_remove_info hg-member \
115 -g $object_id $member_id
116 done
117 eval HG_${object_id}_member=""
118 fi
119
120
121
122 fi
123 ;;
124 "tg")
125 echo "${G_TG}" | grep -w $object_id > /dev/null 2>&1
126 if [ $? -eq 0 ];then
127 eval tg_list="\$TG_${object_id}_guid"
128 if [ -z $tg_list ];then
129 G_TG=`echo $G_TG | sed -e "s/\<$object_id\>//g"\
130 | sed 's/^ *//g'`
131 eval TG_${object_id}_member="\${TG_${object_id}_member:=''}"
132 eval member_tglist="\$TG_${object_id}_member"
133 member_tglist=`trunc_space "$member_tglist"`
134 typeset member_id
135 for member_id in $member_tglist
136 do
137 typeset scsi_id=`format_scsiname \
138 "$member_id"`
139 typeset shell_id=`format_shellvar \
140 "$scsi_id"`
141 eval MEMBER_${shell_id}_tg=""
142 stmfadm_remove_info tg-member -g \
143 $object_id $member_id
144 done
145 eval TG_${object_id}_member=""
146 fi
147 fi
148 ;;
149 *)
150 cti_report "unknow object - $object"
151 ;;
152 esac
153 }
154
155 #
156 # NAME
157 # stmfadm_add_info
158 # DESCRIPTION
159 # Add information about stored objects based on information
160 # passed to the function as arguments.
161 #
162 # RETURN
163 # void
164 #
165 function stmfadm_add_info
166 {
167 typeset object=$1
168 shift 1
169
170 case "$object" in
171 "hg-member")
172
173 while getopts g: a_option
174 do
175 case $a_option in
176 g)
177 hg_id=$OPTARG
178 ;;
179 *)
180 cti_report "stmfadm_add_info: "\
181 "unknow option - $a_option"
182 ;;
183 esac
184 done
185
186 shift 2
187 member_id_iter=$*
188
189 echo "${G_HG}" | grep -w $hg_id > /dev/null 2>&1
190 if [ $? -eq 0 ];then
191 eval HG_${hg_id}_member="\${HG_${hg_id}_member:=''}"
192 eval hg_memberlist="\$HG_${hg_id}_member"
193 typeset member_id
194 for member_id in $member_id_iter
195 do
196 typeset scsi_id=`format_scsiname "$member_id"`
197 typeset shell_id=`format_shellvar "$scsi_id"`
198 eval MEMBER_${shell_id}_hg="\${MEMBER_${shell_id}_hg:=''}"
199
200 eval member_hglist="\$MEMBER_${shell_id}_hg"
201 if [ -z $member_hglist ];then
202 eval MEMBER_${shell_id}_hg=\"$hg_id\"
203 else
204 continue
205 fi
206
207 echo $hg_memberlist | grep $scsi_id \
208 >/dev/null 2>&1
209 if [ $? -ne 0 ] ; then
210 eval HG_${hg_id}_member=\"$scsi_id \$HG_${hg_id}_member\"
211 fi
212 done
213 fi
214 ;;
215 "tg-member")
216 while getopts g: a_option
217 do
218 case $a_option in
219 g)
220 tg_id=$OPTARG
221 ;;
222 *)
223 cti_report "stmfadm_add_info: "\
224 "unknow option - $a_option"
225 ;;
226 esac
227 done
228
229 shift 2
230 member_id_iter=$*
231
232 echo "${G_TG}" | grep -w $tg_id > /dev/null 2>&1
233 if [ $? -eq 0 ];then
234 eval TG_${tg_id}_member="\${TG_${tg_id}_member:=''}"
235 eval tg_memberlist="\$TG_${tg_id}_member"
236 typeset member_id
237 for member_id in $member_id_iter
238 do
239 typeset scsi_id=`format_scsiname "$member_id"`
240 typeset shell_id=`format_shellvar "$scsi_id"`
241 eval MEMBER_${shell_id}_tg="\${MEMBER_${shell_id}_tg:=''}"
242
243 eval target_online="\${TARGET_${shell_id}_ONLINE}"
244 oper_tgmember_allowed "add" "$target_online"
245 if [ $? -ne 0 ]; then
246 continue
247 fi
248
249 eval member_tglist="\$MEMBER_${shell_id}_tg"
250 if [ -z $member_tglist ];then
251 eval MEMBER_${shell_id}_tg=\"$tg_id\"
252 else
253 continue
254 fi
255
256 echo $tg_memberlist | grep $scsi_id \
257 >/dev/null 2>&1
258 if [ $? -ne 0 ] ; then
259 eval TG_${tg_id}_member=\"$scsi_id \$TG_${tg_id}_member\"
260 fi
261 done
262 fi
263 ;;
264 "view")
265 unset lu_id
266 unset tg_id
267 unset hg_id
268 lun_specified=1
269 while getopts n:t:h: a_option
270 do
271 case $a_option in
272 n)
273 lun_id=$OPTARG
274 lun_specified=0
275 ;;
276 t)
277 tg_id=$OPTARG
278 ;;
279 h)
280 hg_id=$OPTARG
281 ;;
282 *)
283 cti_report "stmfadm_add_info: "\
284 "unknow option - $a_option"
285 ;;
286 esac
287 done
288 tg_id=${tg_id:="All"}
289 hg_id=${hg_id:="All"}
290
291
292 eval typeset guid=\${$#}
293
294 typeset guid_found=1
295 for vol in $G_VOL
296 do
297 eval t_guid="\$LU_${vol}_GUID"
298 if [ "$t_guid" = "$guid" ];then
299 guid_found=0
300 fi
301 done
302
303 if [ $guid_found -ne 0 ];then
304 typeset -u t_guid=$guid
305 eval LU_${t_guid}_ONLINE=N
306 fi
307
308 # initialize the variable once
309 eval VIEW_${guid}_entry="\${VIEW_${guid}_entry:=''}"
310 eval HG_${hg_id}_guid="\${HG_${hg_id}_guid:=''}"
311 eval TG_${tg_id}_guid="\${TG_${tg_id}_guid:=''}"
312
313 eval LUN_${hg_id}_${tg_id}="\${LUN_${hg_id}_${tg_id}:=''}"
314 eval LUN_All_${tg_id}="\${LUN_All_${tg_id}:=''}"
315 eval LUN_${hg_id}_All="\${LUN_${hg_id}_All:=''}"
316 eval LUN_All_All="\${LUN_All_All:=''}"
317
318 eval entry_list="\$VIEW_${guid}_entry"
319 eval hg_list="\$HG_${hg_id}_guid"
320 hg_list=`trunc_space "$hg_list"`
321 eval tg_list="\$TG_${tg_id}_guid"
322 tg_list=`trunc_space "$tg_list"`
323
324 if [ -z "$entry_list" ];then
325
326 create_view_entry "$lun_specified" \
327 "$tg_id" "$hg_id" "$guid" "$lun_id"
328 if [ $? -eq 1 ];then
329 return
330 fi
331 else
332
333 add_view_entry "$lun_specified" \
334 "$entry_list" "$tg_id" "$hg_id" "$guid" \
335 "$lun_id"
336 if [ $? -eq 1 ];then
337 return
338 fi
339
340 fi
341 ;;
342 *)
343 cti_report "unknow object - $object"
344 ;;
345 esac
346 }
347 #
348 # NAME
349 # create_view_entry
350 # DESCRIPTION
351 # create view entry to build the view entry list of specified guid
352 #
353 # RETURN
354 # 0 successful
355 # 1 failed
356 function create_view_entry
357 {
358 typeset lun_specified="$1"
359 typeset tg_id="$2"
360 typeset hg_id="$3"
361 typeset guid="$4"
362 typeset lun_id="$5"
363 if [ $lun_specified -eq 0 ];then
364 # with -n option, check whether target and host group
365 # combination under this specified GUID is overlapped with the
366 # input view
367 # if overlapped, the input view is the definite conflict, fail
368 # if no overlapped, chech whether the input LU number is
369 # belonged to LU number in all GUIDs' target and host group
370 # combination despite of this specified GUID.
371 # if belonged, the LU number can not be used, the input view is
372 # in conflict, fail
373 # else, the input view is added.
374 if [ $lun_id -ge 16384 ]; then
375 return
376 fi
377 if [ "$hg_id" != "All" -a "$tg_id" != "All" ];then
378 for t_tg_id in $tg_id All
379 do
380 eval hgtg_lun="\$LUN_${hg_id}_${t_tg_id}"
381 echo $hgtg_lun | grep -w $lun_id >/dev/null 2>&1
382 if [ $? -eq 0 ];then
383 return
384 fi
385 done
386 for t_hg_id in $hg_id All
387 do
388 eval hgtg_lun="\$LUN_${t_hg_id}_${tg_id}"
389 echo $hgtg_lun | grep -w $lun_id >/dev/null 2>&1
390 if [ $? -eq 0 ];then
391 return
392 fi
393 done
394 eval hgtg_lun="\$LUN_All_All"
395 echo $hgtg_lun | grep -w $lun_id >/dev/null 2>&1
396 if [ $? -eq 0 ];then
397 return
398 fi
399 elif [ "$hg_id" != "All" -a "$tg_id" = "All" ];then
400 for t_tg_id in $G_TG All
401 do
402 eval hgtg_lun="\$LUN_${hg_id}_${t_tg_id}"
403 echo $hgtg_lun | grep -w $lun_id >/dev/null 2>&1
404 if [ $? -eq 0 ];then
405 return
406 fi
407 done
408 eval hgtg_lun="\$LUN_All_All"
409 echo $hgtg_lun | grep -w $lun_id >/dev/null 2>&1
410 if [ $? -eq 0 ];then
411 return
412 fi
413 elif [ "$hg_id" = "All" -a "$tg_id" != "All" ];then
414 for t_hg_id in $G_HG All
415 do
416 eval hgtg_lun="\$LUN_${t_hg_id}_${tg_id}"
417 echo $hgtg_lun | grep -w $lun_id >/dev/null 2>&1
418 if [ $? -eq 0 ];then
419 return
420 fi
421 done
422 eval hgtg_lun="\$LUN_All_All"
423 echo $hgtg_lun | grep -w $lun_id >/dev/null 2>&1
424 if [ $? -eq 0 ];then
425 return
426 fi
427 else
428 for t_hg_id in $G_HG All
429 do
430 for t_tg_id in $G_TG All
431 do
432 eval hgtg_lun="\$LUN_${t_hg_id}_${t_tg_id}"
433 echo $hgtg_lun | grep -w $lun_id \
434 >/dev/null 2>&1
435 if [ $? -eq 0 ];then
436 return
437 fi
438 done
439 done
440 fi
441 eval hgtg_lun="\$LUN_${hg_id}_${tg_id}"
442 eval LUN_${hg_id}_${tg_id}=\"$lun_id $hgtg_lun\"
443 $STMFADM list-view -l $guid | grep "View Entry" | awk \
444 '{print $NF}' | while read ve
445 do
446 echo $ve_olist | grep -w $ve >/dev/null 2>&1
447 if [ $? -ne 0 ];then
448 break
449 fi
450 done
451 eval VIEW_${guid}_entry=\"$ve:$hg_id:$tg_id:$lun_id $entry_list\"
452
453 eval HG_${hg_id}_guid=\"$guid $hg_list\"
454 eval TG_${tg_id}_guid=\"$guid $tg_list\"
455
456 else
457
458 typeset ve=`$STMFADM list-view -l $guid | \
459 grep "View Entry" | awk '{print $NF}'`
460 typeset lun_id=`$STMFADM list-view -l $guid | \
461 grep "LUN" | awk '{print $NF}'`
462
463 eval VIEW_${guid}_entry=\"$ve:$hg_id:$tg_id:$lun_id\"
464
465 if [ "$hg_id" != "All" -a "$tg_id" != "All" ];then
466 eval hgtg_lun="\$LUN_${hg_id}_${tg_id}"
467 elif [ "$hg_id" != "All" -a "$tg_id" = "All" ];then
468 eval hgtg_lun="\$LUN_${hg_id}_All"
469 elif [ "$hg_id" = "All" -a "$tg_id" != "All" ];then
470 eval hgtg_lun="\$LUN_All_${tg_id}"
471 else
472 eval hgtg_lun="\$LUN_All_All"
473 fi
474 eval LUN_${hg_id}_${tg_id}=\"$lun_id $hgtg_lun\"
475 eval HG_${hg_id}_guid=\"$guid $hg_list\"
476 eval TG_${tg_id}_guid=\"$guid $tg_list\"
477 fi
478 return 0
479 }
480 #
481 # NAME
482 # add_view_entry
483 # DESCRIPTION
484 # add view entry to build the view entry list of specified guid
485 #
486 # RETURN
487 # 0 successful
488 # 1 failed
489 function add_view_entry
490 {
491 typeset lun_specified="$1"
492 typeset entry_list="$2"
493 typeset tg_id="$3"
494 typeset hg_id="$4"
495 typeset guid="$5"
496 typeset lun_id="$6"
497 if [ $lun_specified -eq 0 ];then
498 # with -n option, check whether target and host group
499 # combination under this specified GUID is overlapped with the
500 # input view.
501 # if overlapped, the input view is the definite conflict one, fail
502 # if no overlapped, chech whether the input LU number is
503 # belonged to LU number in all GUIDs' target and host group
504 # combination despite of this specified GUID.
505 # if belonged, the LU number can not be used, the input view is
506 # in conflict, fail
507 # else, the input view is added.
508 if [ $lun_id -ge 16384 ]; then
509 return 1
510 fi
511
512 unset ve_olist
513 for entry in $entry_list
514 do
515 t_tg_id=$tg_id
516 t_hg_id=$hg_id
517
518 eval hg="`echo $entry | awk -F: '{print $2}'`"
519 eval tg="`echo $entry | awk -F: '{print $3}'`"
520 ve_olist="`echo $entry | awk -F: '{print $1}'` $ve_olist"
521
522 if [ "$hg" = "All" ];then
523 t_hg_id=$hg
524 elif [ "$t_hg_id" = "All" ];then
525 hg=$t_hg_id
526 elif [ "$tg" = "All" ];then
527 t_tg_id=$tg
528 elif [ "$t_tg_id" = "All" ];then
529 tg=$t_tg_id
530 fi
531
532 if [ "$hg" = "t_$hg_id" -a "$tg" = "$t_tg_id" ]; then
533 return 1
534 fi
535 done
536 if [ "$hg_id" != "All" -a "$tg_id" != "All" ];then
537 for t_tg_id in $tg_id All
538 do
539 eval hgtg_lun="\$LUN_${hg_id}_${t_tg_id}"
540 echo $hgtg_lun | grep -w $lun_id >/dev/null 2>&1
541 if [ $? -eq 0 ];then
542 return 1
543 fi
544 done
545 for t_hg_id in $hg_id All
546 do
547 eval hgtg_lun="\$LUN_${t_hg_id}_${tg_id}"
548 echo $hgtg_lun | grep -w $lun_id >/dev/null 2>&1
549 if [ $? -eq 0 ];then
550 return 1
551 fi
552 done
553 eval hgtg_lun="\$LUN_All_All"
554 echo $hgtg_lun | grep -w $lun_id >/dev/null 2>&1
555 if [ $? -eq 0 ];then
556 return 1
557 fi
558 elif [ "$hg_id" != "All" -a "$tg_id" = "All" ];then
559 for t_tg_id in $G_TG All
560 do
561 eval hgtg_lun="\$LUN_${hg_id}_${t_tg_id}"
562 echo $hgtg_lun | grep -w $lun_id >/dev/null 2>&1
563 if [ $? -eq 0 ];then
564 return 1
565 fi
566 done
567 eval hgtg_lun="\$LUN_All_All"
568 echo $hgtg_lun | grep -w $lun_id >/dev/null 2>&1
569 if [ $? -eq 0 ];then
570 return 1
571 fi
572 elif [ "$hg_id" = "All" -a "$tg_id" != "All" ];then
573 for t_hg_id in $G_HG All
574 do
575 eval hgtg_lun="\$LUN_${t_hg_id}_${tg_id}"
576 echo $hgtg_lun | grep -w $lun_id >/dev/null 2>&1
577 if [ $? -eq 0 ];then
578 return 1
579 fi
580 done
581 eval hgtg_lun="\$LUN_All_All"
582 echo $hgtg_lun | grep -w $lun_id >/dev/null 2>&1
583 if [ $? -eq 0 ];then
584 return 1
585 fi
586 else
587 for t_hg_id in $G_HG All
588 do
589 for t_tg_id in $G_TG All
590 do
591 eval hgtg_lun="\$LUN_${t_hg_id}_${t_tg_id}"
592 echo $hgtg_lun | grep -w $lun_id \
593 >/dev/null 2>&1
594 if [ $? -eq 0 ];then
595 return 1
596 fi
597 done
598 done
599 fi
600 eval hgtg_lun="\$LUN_${hg_id}_${tg_id}"
601 hgtg_lun=`trunc_space "$hgtg_lun"`
602 eval LUN_${hg_id}_${tg_id}=\"$lun_id $hgtg_lun\"
603 $STMFADM list-view -l $guid | grep "View Entry" | \
604 awk '{print $NF}' | while read ve
605 do
606 echo $ve_olist | grep -w $ve >/dev/null 2>&1
607 if [ $? -ne 0 ];then
608 break
609 fi
610 done
611 eval VIEW_${guid}_entry=\"$ve:$hg_id:$tg_id:$lun_id $entry_list\"
612
613 eval HG_${hg_id}_guid=\"$guid $hg_list\"
614 eval TG_${tg_id}_guid=\"$guid $tg_list\"
615 else
616 # without -n option, check whether target and host group
617 # combination under this specified GUID is overlapped with the
618 # input view
619 # if no overlapped, the input view is not in conflict, the view
620 # is added with default LU number
621 # if overlapped, the input view is the definite conflict one,
622 # fail
623 typeset conflict=1
624 unset ve_olist
625 for entry in $entry_list
626 do
627 t_tg_id=$tg_id
628 t_hg_id=$hg_id
629
630 eval hg="`echo $entry | awk -F: '{print $2}'`"
631 eval tg="`echo $entry | awk -F: '{print $3}'`"
632 ve_olist="`echo $entry | awk -F: '{print $1}'` $ve_olist"
633
634 if [ "$hg" = "All" ];then
635 t_hg_id=$hg
636 elif [ "$t_hg_id" = "All" ];then
637 hg=$t_hg_id
638 elif [ "$tg" = "All" ];then
639 t_tg_id=$tg
640 elif [ "$t_tg_id" = "All" ];then
641 tg=$t_tg_id
642 fi
643
644 if [ "$hg" = "$t_hg_id" -a "$tg" = "$t_tg_id" ]; then
645 return 1
646 fi
647 done
648 $STMFADM list-view -l $guid | grep "View Entry" | awk \
649 '{print $NF}' | while read ve
650 do
651 echo $ve_olist | grep -w $ve >/dev/null 2>&1
652 if [ $? -ne 0 ];then
653 break
654 fi
655 done
656 $STMFADM list-view -l $guid | awk '{print $NF}' | awk \
657 '{if (NR%4==0) printf("%s\n",$0);else printf("%s:",$0);}'\
658 | while read line
659 do
660 echo $line | grep ":$hg_id:$tg_id:" >/dev/null 2>&1
661 if [ $? -eq 0 ];then
662 lun_id=`echo $line | awk -F: '{print $4}'`
663 break
664 fi
665 done
666 eval VIEW_${guid}_entry=\"$ve:$hg_id:$tg_id:$lun_id $entry_list\"
667
668 if [ "$hg_id" != "All" -a "$tg_id" != "All" ];then
669 eval hgtg_lun="\$LUN_${hg_id}_${tg_id}"
670 elif [ "$hg_id" != "All" -a "$tg_id" = "All" ];then
671 eval hgtg_lun="\$LUN_${hg_id}_All"
672 elif [ "$hg_id" = "All" -a "$tg_id" != "All" ];then
673 eval hgtg_lun="\$LUN_All_${tg_id}"
674 else
675 eval hgtg_lun="\$LUN_All_All"
676 fi
677 eval LUN_${hg_id}_${tg_id}=\"$lun_id $hgtg_lun\"
678 eval HG_${hg_id}_guid=\"$guid $hg_list\"
679 eval TG_${tg_id}_guid=\"$guid $tg_list\"
680
681 fi
682 return 0
683 }
684
685 #
686 # NAME
687 # stmfadm_remove_info
688 # DESCRIPTION
689 # Remove information about stored objects based on information
690 # passed to the function as arguments.
691 #
692 # RETURN
693 # void
694 #
695 function stmfadm_remove_info
696 {
697 typeset object=$1
698 shift 1
699
700 case "$object" in
701 "hg-member")
702
703 while getopts g: r_option
704 do
705 case $r_option in
706 g)
707 hg_id=$OPTARG
708 ;;
709 *)
710 cti_report "stmfadm_remove_info: "\
711 "unknow option - $r_option"
712 ;;
713 esac
714 done
715
716 shift 2
717 member_id_iter=$*
718
719 echo "${G_HG}" | grep -w $hg_id > /dev/null 2>&1
720 if [ $? -eq 0 ];then
721 eval HG_${hg_id}_member="\${HG_${hg_id}_member:=''}"
722 eval hg_memberlist="\$HG_${hg_id}_member"
723 typeset member_id
724 for member_id in $member_id_iter
725 do
726 typeset scsi_id=`format_scsiname "$member_id"`
727 typeset shell_id=`format_shellvar "$scsi_id"`
728
729 eval MEMBER_${shell_id}_hg="\${MEMBER_${shell_id}_hg:=''}"
730
731 eval member_hglist="\$MEMBER_${shell_id}_hg"
732 member_hglist=`trunc_space "$member_hglist"`
733 if [ "$member_hglist" = "$hg_id" ];then
734 eval unset MEMBER_${shell_id}_hg
735 else
736 continue
737 fi
738
739 echo $hg_memberlist | grep $scsi_id \
740 >/dev/null 2>&1
741 if [ $? -eq 0 ] ; then
742 eval HG_${hg_id}_member=\"`echo \
743 $hg_memberlist | \
744 sed -e "s/\<$scsi_id\>//" | \
745 sed 's/^ *//g'`\"
746 fi
747 done
748 fi
749 ;;
750 "tg-member")
751 while getopts g: r_option
752 do
753 case $r_option in
754 g)
755 tg_id=$OPTARG
756 ;;
757 *)
758 cti_report "stmfadm_add_info: "\
759 "unknow option - $r_option"
760 ;;
761 esac
762 done
763
764 shift 2
765 member_id_iter=$*
766
767 echo "${G_TG}" | grep -w $tg_id > /dev/null 2>&1
768 if [ $? -eq 0 ];then
769 # initialize the variable once
770 eval TG_${tg_id}_member="\${TG_${tg_id}_member:=''}"
771 # get the variable value for usage
772 eval tg_memberlist="\$TG_${tg_id}_member"
773 typeset member_id
774 for member_id in $member_id_iter
775 do
776 typeset scsi_id=`format_scsiname "$member_id"`
777 typeset shell_id=`format_shellvar "$scsi_id"`
778
779 eval target_online="\${TARGET_${shell_id}_ONLINE}"
780 oper_tgmember_allowed "remove" "$target_online"
781 if [ $? -ne 0 ]; then
782 continue
783 fi
784
785 #initialize the member group info
786 eval MEMBER_${shell_id}_tg="\${MEMBER_${shell_id}_tg:=''}"
787
788 # get the variable value for usage
789 eval member_tglist="\$MEMBER_${shell_id}_tg"
790 member_tglist=`trunc_space "$member_tglist"`
791 if [ "$member_tglist" = "$tg_id" ];then
792 eval unset MEMBER_${shell_id}_tg
793 else
794 continue
795 fi
796
797 echo $tg_memberlist | grep $scsi_id \
798 >/dev/null 2>&1
799 if [ $? -eq 0 ] ; then
800 eval TG_${tg_id}_member=\"`echo $tg_memberlist | \
801 sed -e "s/\<$scsi_id\>//" | \
802 sed 's/^ *//g'`\"
803 fi
804 done
805 fi
806 ;;
807 "view")
808 while getopts al: r_option
809 do
810 case $r_option in
811 l)
812 guid=$OPTARG
813 ;;
814 a)
815
816 ;;
817 *)
818 cti_report "stmfadm_remove_info: "\
819 "unknow option - $r_option"
820 ;;
821 esac
822 done
823
824 shift 2
825 ve_id_iter=$*
826
827 typeset guid_found=1
828 typeset vol
829 for vol in $G_VOL
830 do
831 eval t_guid="\$LU_${vol}_GUID"
832 if [ "$t_guid" = "$guid" ];then
833 guid_found=0
834 break
835 fi
836 done
837 if [ "$guid" != "-a" ];then
838 eval entry_list="\$VIEW_${guid}_entry"
839 if [ -n "$entry_list" ] ;then
840 guid_found=0
841 break
842 fi
843 fi
844 if [ $guid_found -eq 0 ];then
845 # initialize the variable once
846 eval VIEW_${guid}_entry="\${VIEW_${guid}_entry:=''}"
847 eval HG_${hg_id}_guid="\${HG_${hg_id}_guid:=''}"
848 eval TG_${tg_id}_guid="\${TG_${tg_id}_guid:=''}"
849
850 eval entry_list="\$VIEW_${guid}_entry"
851 eval hg_list="\$HG_${hg_id}_guid"
852 eval tg_list="\$TG_${tg_id}_guid"
853 if [ -n "$entry_list" ];then
854 delete_view_entry $# "$entry_list" "$ve_id_iter"
855 fi
856 fi
857 ;;
858 *)
859 cti_report "unknow object - $object"
860 ;;
861 esac
862 }
863 #
864 # NAME
865 # delete_view_entry
866 # DESCRIPTION
867 # delete view entry to rebuild the view entry list of specified guid
868 #
869 # RETURN
870 # 0 successful
871 # 1 failed
872
873 function delete_view_entry
874 {
875 typeset num=$1
876 typeset entry_list="$2"
877 typeset ve_id_iter="$3"
878 if [ $num -eq 1 -a "$ve_id_iter" = "-a" ];then
879 for entry in $entry_list
880 do
881 typeset ve=`echo $entry | awk -F: '{print $1}'`
882 eval hg_id=`echo $entry | awk -F: '{print $2}'`
883 eval tg_id=`echo $entry | awk -F: '{print $3}'`
884 eval lun_id=`echo $entry | awk -F: '{print $4}'`
885
886 eval hg_list="\$HG_${hg_id}_guid"
887 eval tg_list="\$TG_${tg_id}_guid"
888
889 if [ "$hg_id" != "All" -a "$tg_id" != "All" ];then
890 eval hgtg_lun="\$LUN_${hg_id}_${tg_id}"
891 elif [ "$hg_id" != "All" -a "$tg_id" = "All" ];then
892 eval hgtg_lun="\$LUN_${hg_id}_All"
893 elif [ "$hg_id" = "All" -a "$tg_id" != "All" ];then
894 eval hgtg_lun="\$LUN_All_${tg_id}"
895 else
896 eval hgtg_lun="\$LUN_All_All"
897 fi
898 eval LUN_${hg_id}_${tg_id}=\"`echo $hgtg_lun | \
899 sed -e "s/\<$lun_id\>//" | sed 's/^ *//g'`\"
900 eval HG_${hg_id}_guid=\"`echo $hg_list | \
901 sed -e "s/\<$guid\>//g" | sed 's/^ *//g'`\"
902 eval TG_${tg_id}_guid=\"`echo $tg_list | \
903 sed -e "s/\<$guid\>//g" | sed 's/^ *//g'`\"
904
905 eval unset VIEW_${guid}_entry
906 done
907 else
908 for entry in $entry_list
909 do
910 typeset ve=`echo $entry | awk -F: '{print $1}'`
911 echo $ve_id_iter | grep $ve >/dev/null 2>&1
912 if [ $? -eq 0 ];then
913 eval hg_id=`echo $entry | awk -F: '{print $2}'`
914 eval tg_id=`echo $entry | awk -F: '{print $3}'`
915 eval lun_id=`echo $entry | awk -F: '{print $4}'`
916
917 eval hg_list="\$HG_${hg_id}_guid"
918 eval tg_list="\$TG_${tg_id}_guid"
919 eval t_entry_list="\$VIEW_${guid}_entry"
920 eval VIEW_${guid}_entry=\"`echo $t_entry_list |\
921 sed -e "s/\<$entry\>//" | \
922 sed 's/^ *//g'`\"
923
924 if [ "$hg_id" != "All" -a \
925 "$tg_id" != "All" ];then
926 eval hgtg_lun="\$LUN_${hg_id}_${tg_id}"
927 elif [ "$hg_id" != "All" -a \
928 "$tg_id" = "All" ];then
929 eval hgtg_lun="\$LUN_${hg_id}_All"
930 elif [ "$hg_id" = "All" -a \
931 "$tg_id" != "All" ];then
932 eval hgtg_lun="\$LUN_All_${tg_id}"
933 else
934 eval hgtg_lun="\$LUN_All_All"
935 fi
936 eval LUN_${hg_id}_${tg_id}=\"`echo $hgtg_lun | \
937 sed -e "s/\<$lun_id\>//" | \
938 sed 's/^ *//g'`\"
939 eval HG_${hg_id}_guid=\"`echo $hg_list | \
940 sed -e "s/\<$guid\>//" | \
941 sed 's/^ *//g'`\"
942 eval TG_${tg_id}_guid=\"`echo $tg_list | \
943 sed -e "s/\<$guid\>//" | \
944 sed 's/^ *//g'`\"
945 fi
946 done
947 fi
948 }
949 #
950 # NAME
951 # stmfadm_online_info
952 # DESCRIPTION
953 # Store information about online objects based on information
954 # passed to the function as arguments.
955 #
956 # RETURN
957 # void
958 #
959 function stmfadm_online_info
960 {
961 typeset object=$1
962 shift 1
963
964 check_stmf_disable
965 if [ $? -eq 0 ];then
966 return
967 fi
968 case "$object" in
969 "lu")
970 member_id_iter=$*
971 for member_id in $member_id_iter
972 do
973 typeset -i found=0
974 typeset vol
975 for vol in $G_VOL
976 do
977 eval typeset t_guid=\$LU_${vol}_GUID
978 if [ "$t_guid" = "$member_id" ];then
979 found=1
980 break
981 fi
982 done
983 if [ $found -eq 1 ];then
984 eval typeset -u u_guid=$member_id
985 eval LU_${u_guid}_ONLINE=Y
986 fi
987 done
988 ;;
989 "target")
990 member_id_iter=$*
991 typeset member_id
992 for member_id in $member_id_iter
993 do
994 typeset scsi_id=`format_scsiname "$member_id"`
995 typeset shell_id=`format_shellvar "$scsi_id"`
996 echo $G_TARGET | grep $scsi_id >/dev/null 2>&1
997 if [ $? -eq 0 ];then
998 eval TARGET_${shell_id}_ONLINE=Y
999 fi
1000 done
1001 ;;
1002 esac
1003 }
1004
1005 #
1006 # NAME
1007 # stmfadm_offline_info
1008 # DESCRIPTION
1009 # Store information about offline objects based on information
1010 # passed to the function as arguments.
1011 #
1012 # RETURN
1013 # void
1014 #
1015 function stmfadm_offline_info
1016 {
1017 typeset object=$1
1018 shift 1
1019
1020 case "$object" in
1021 "lu")
1022 member_id_iter=$*
1023 for member_id in $member_id_iter
1024 do
1025 typeset -i found=0
1026 typeset vol
1027 for vol in $G_VOL
1028 do
1029 eval typeset t_guid=\$LU_${vol}_GUID
1030 if [ "$t_guid" = "$member_id" ];then
1031 found=1
1032 break
1033 fi
1034 done
1035 if [ $found -eq 1 ];then
1036 eval typeset -u u_guid=$member_id
1037 eval LU_${u_guid}_ONLINE=N
1038 fi
1039 done
1040 ;;
1041 "target")
1042 member_id_iter=$*
1043 typeset member_id
1044 for member_id in $member_id_iter
1045 do
1046 typeset scsi_id=`format_scsiname "$member_id"`
1047 typeset shell_id=`format_shellvar "$scsi_id"`
1048 echo $G_TARGET | grep $scsi_id >/dev/null 2>&1
1049 if [ $? -eq 0 ];then
1050 eval TARGET_${shell_id}_ONLINE=N
1051 fi
1052 done
1053 ;;
1054 esac
1055 }
1056
1057 #
1058 # NAME
1059 # oper_tgmember_allowed
1060 #
1061 # SYNOPSIS
1062 # oper_tgmember_allowed <oper> <target_state>
1063 # [ options for 'add[remove] Y[N]' ]
1064 #
1065 # DESCRIPTION
1066 # Check whether stmfadm add/remove tg-member operation can be allowed
1067 #
1068 # RETURN
1069 # 0 - the specified operation is allowed
1070 # 1 - the specified operation is denied
1071 function oper_tgmember_allowed
1072 {
1073 typeset oper=$1
1074 typeset target_online=$2
1075 case "$TARGET_TYPE" in
1076 "ISCSI")
1077 check_stmf_disable
1078 typeset res1=$?
1079 check_iscsi_target_disable
1080 typeset res2=$?
1081 if [ "$oper" = "add" ];then
1082 return 0
1083 else
1084 if [ $res1 -ne 0 -a $res2 -ne 0\
1085 -a "$target_online" = "Y" ];then
1086 return 1
1087 else
1088 return 0
1089 fi
1090
1091 fi
1092 ;;
1093 *)
1094 check_stmf_disable
1095 typeset res=$?
1096 if [ "$oper" = "add" ];then
1097 return 0
1098 else
1099 if [ $res -ne 0 -a "$target_online" = "Y" ];then
1100 return 1
1101 else
1102 return 0
1103 fi
1104 fi
1105 ;;
1106 esac
1107 }
1108