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