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/CDDL.txt 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/CDDL.txt. 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 2008 Sun Microsystems, Inc. All rights reserved. 24 # Use is subject to license terms. 25 # 26 # ident "@(#)functions.ksh 1.11 08/04/15 SMI" 27 # 28 29 # define variables 30 31 validate_options() 32 { 33 debug_message "Function: validate_options - Begin" 34 ${SET_DEBUG} 35 36 # 37 # Ensure all options are set 38 # 39 rc_validate_options=0 40 41 for i in RESOURCE RESOURCEGROUP PARDIR 42 do 43 case ${i} in 44 RESOURCE) 45 if [ -z ${RESOURCE} ]; then 46 # SCMSGS 47 # @explanation 48 # The option is not specified in the start, 49 # stop or probe command. 50 # @user_action 51 # Make sure that the appropriate config file 52 # is correct and reregister the resource. 53 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 54 "Function: validate_options - %s Option %s not set" \ 55 "${MYNAME}" "-R" 56 rc_validate_options=1 57 fi;; 58 59 RESOURCEGROUP) 60 if [ -z ${RESOURCEGROUP} ]; then 61 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 62 "Function: validate_options - %s Option %s not set" \ 63 "${MYNAME}" "-G" 64 rc_validate_options=1 65 fi;; 66 67 PARDIR) 68 if [ -z ${PARDIR} ]; then 69 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 70 "Function: validate_options - %s Option %s not set" \ 71 "${MYNAME}" "-P" 72 rc_validate_options=1 73 else 74 # construct the variable PARFILE 75 PARFILE=${PARDIR}/sczbt_${RESOURCE} 76 fi;; 77 78 esac 79 done 80 81 debug_message "Function: validate_options returns ${rc_validate_options} - End" 82 return ${rc_validate_options} 83 } 84 85 validate() 86 { 87 # 88 # Validate sczbt 89 # 90 91 debug_message "Function: validate - Begin" 92 ${SET_DEBUG} 93 94 rc_validate=0 95 96 # 97 # Validate that prameter file exists and is syntactically correct 98 # 99 100 if ! val_parfile ${PARFILE} "Zonename Zonebootopt Milestone" ${PARDIR} 101 then 102 debug_message "Function: validate - End" 103 rc_validate=1 104 return ${rc_validate} 105 fi 106 107 # test the semantic of the parameters 108 109 . ${PARFILE} 110 111 for i in `/bin/cat ${PARFILE} | /bin/grep -v "^#"| /bin/grep -v "^ "| /bin/nawk -F= '{print $1}'` 112 do 113 case ${i} in 114 115 Zonename) 116 117 # test the Zonename 118 119 # is the zone name specified 120 121 if [ -z ${Zonename} ]; then 122 # SCMSGS 123 # @explanation 124 # The variable Zonename does not contain a 125 # value. 126 # @user_action 127 # Review the components configuration file and 128 # make sure the variable Zonename is properly 129 # defined. 130 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 131 "Function: validate - Zone name not set in %s" \ 132 "${PARFILE}" 133 rc_validate=1 134 else 135 debug_message "Function: validate - Zone name (${Zonename}) set" 136 fi 137 138 # is the current zone state valid 139 140 get_zone_state ${Zonename} 141 142 if [ "${ZONE_STATE}" = "installed" -o "${ZONE_STATE}" = "ready" -o "${ZONE_STATE}" = "running" ] 143 then 144 debug_message "Function: validate - ${Zonename} state is ${ZONE_STATE}" 145 else 146 # SCMSGS 147 # @explanation 148 # The referenced zone is not in the state 149 # installed, ready or running. 150 # @user_action 151 # Make sure that the referenced zone name is 152 # configured properly. Check if you have done 153 # a zlogin -C. Make sure that the name in the 154 # appropriate config file is correct. 155 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 156 "Function: validate - %s state is %s" \ 157 "${Zonename}" "${ZONE_STATE}" 158 rc_validate=1 159 fi 160 161 # is the autobooot set to false 162 163 if ! ${ZONECFG} -z ${Zonename} info | /bin/grep autoboot| /bin/grep false >/dev/null 2>&1 164 then 165 # SCMSGS 166 # @explanation 167 # The referenced zone is configured with 168 # autoboot = true. This option needs to be 169 # set to false. 170 # @user_action 171 # Configure the autoboot variable of the 172 # configured zone to false. You need to run 173 # the zoncfg command to complete this task. 174 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 175 "Function: validate - %s configured with autoboot true, it needs to be false" \ 176 "${Zonename}" 177 rc_validate=1 178 else 179 debug_message "Function: validate - ${Zonename} configured with autoboot false" 180 fi;; 181 182 Zonebrand) 183 184 # verify supported zone brand 185 186 case ${Zonebrand} in 187 native) 188 debug_message "Function: validate - Zonebrand configured as ${Zonebrand}" 189 ZONE_BRAND=`${ZONECFG} -z ${Zonename} info | /bin/grep "^brand:" | /bin/awk '{print $2}'` 190 if [ -n "${ZONE_BRAND}" ]; then 191 if [ "${ZONE_BRAND}" = "native" ]; then 192 debug_message "Function: validate - Zonebrand verified as being ${ZONE_BRAND}" 193 else 194 # SCMSGS 195 # @explanation 196 # Zonebrand is set to 197 # "native". But the 198 # Zone is configured 199 # as a different brand 200 # type (i.e. lx) 201 # according to zonecfg 202 # info. 203 # @user_action 204 # Review the components 205 # configuration file and 206 # make sure the variable 207 # Zonebrand defines the 208 # actual zone brand 209 # type for the Zone. 210 scds_syslog -p daemon.err \ 211 -t $(syslog_tag) -m \ 212 "Function: validate - Zonebrand for zone %s is configured as native, but the zone is configured as brand type %s." \ 213 "${Zonename}" "${ZONE_BRAND}" 214 rc_validate=1 215 fi 216 fi;; 217 218 lx) 219 debug_message "Function: validate - Zonebrand configured as ${Zonebrand}" 220 if [ "`/usr/bin/uname -p`" != "i386" ]; then 221 # SCMSGS 222 # @explanation 223 # The lx brand for zones 224 # is only supported on 225 # the i386 platform. 226 # @user_action 227 # Review the components 228 # configuration file and 229 # make sure the variable 230 # Zonebrand defines "lx" 231 # only on a i386 system. 232 scds_syslog -p daemon.err \ 233 -t $(syslog_tag) -m \ 234 "Function: validate - Zonebrand for zone %s is configured as %s on a non-i386 system. It is only supported on i386 systems." \ 235 "${Zonename}" "${Zonebrand}" 236 rc_validate=1 237 else 238 ZONE_BRAND=`${ZONECFG} -z ${Zonename} info | /bin/grep "^brand:" | /bin/awk '{print $2}'` 239 if [ "${ZONE_BRAND}" = "lx" ]; then 240 debug_message "Function: validate - Zonebrand verified as being ${ZONE_BRAND}" 241 else 242 # SCMSGS 243 # @explanation 244 # Zonebrand is set to 245 # "lx". But the 246 # Zone is not configured 247 # as brand type lx 248 # according to zonecfg 249 # info. 250 # @user_action 251 # Review the components 252 # configuration file and 253 # make sure the variable 254 # Zonebrand defines "lx" 255 # only for a Zone that 256 # got really setup with 257 # brand type "lx". 258 scds_syslog -p daemon.err \ 259 -t $(syslog_tag) -m \ 260 "Function: validate - Zonebrand for zone %s is configured as lx, but the zone is configured as brand type %s." \ 261 "${Zonename}" "${ZONE_BRAND}" 262 rc_validate=1 263 fi 264 fi;; 265 266 solaris8|solaris9) 267 debug_message "Function: validate - Zonebrand configured as ${Zonebrand}" 268 if [ "`/usr/bin/uname -p`" != "sparc" ]; then 269 # SCMSGS 270 # @explanation 271 # The solaris8 and 272 # solaris9 brand for 273 # zones is only 274 # supported on the 275 # sparc platform. 276 # @user_action 277 # Review the components 278 # configuration file and 279 # make sure the variable 280 # Zonebrand defines 281 # "solaris8" or 282 # "solaris9" only on a 283 # sparc system. 284 scds_syslog -p daemon.err \ 285 -t $(syslog_tag) -m \ 286 "Function: validate - Zonebrand for zone %s is configured as %s on a non-sparc system. It is only supported on sparc systems." \ 287 "${Zonename}" "${Zonebrand}" 288 rc_validate=1 289 else 290 ZONE_BRAND=`${ZONECFG} -z ${Zonename} info | /bin/grep "^brand:" | /bin/awk '{print $2}'` 291 if [ "${ZONE_BRAND}" = "${Zonebrand}" ]; then 292 debug_message "Function: validate - Zonebrand verified as being ${ZONE_BRAND}" 293 else 294 # SCMSGS 295 # @explanation 296 # Zonebrand is set to 297 # "solaris8" or 298 # "solaris9". But the 299 # Zone is not configured 300 # as brand type solaris8 301 # or solaris9 302 # according to zonecfg 303 # info. 304 # @user_action 305 # Review the components 306 # configuration file and 307 # make sure the variable 308 # Zonebrand defines 309 # "solaris8" or 310 # "solaris9" only for a 311 # Zone that got really 312 # setup with brand type 313 # "solaris8" or 314 # "solaris9". 315 scds_syslog -p daemon.err \ 316 -t $(syslog_tag) -m \ 317 "Function: validate - Zonebrand for zone %s is configured as %s, but the zone is configured as brand type %s." \ 318 "${Zonename}" "${Zonebrand}" "${ZONE_BRAND}" 319 rc_validate=1 320 fi 321 fi;; 322 323 *) 324 # SCMSGS 325 # @explanation 326 # Currently Zonebrand can only 327 # be set to "native", "lx" or 328 # "solaris8". 329 # @user_action 330 # Review the components 331 # configuration file and make 332 # sure the variable Zonebrand 333 # defines either "native", "lx" 334 # or "solaris8". 335 scds_syslog -p daemon.err \ 336 -t $(syslog_tag) -m \ 337 "Function: validate - Zonebrand for zone %s is configured as %s. Valid values are native, lx, solaris8 and solaris9." \ 338 "${Zonename}" "${Zonebrand}" 339 rc_validate=1;; 340 esac;; 341 342 Zonebootopt) 343 344 # test the Zones boot options 345 346 # is the Zone boot option specified and a supported one 347 348 if [ ! -z ${Zonebootopt} ] && [ "${Zonebootopt}" != "-s" ]; then 349 350 # SCMSGS 351 # @explanation 352 # The specified boot option is not allowed. 353 # @user_action 354 # Consult the manpage of zoneadm which boot 355 # options are allowed and specify one of 356 # them. 357 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 358 "Function: validate - %s invalid boot option [%s]" \ 359 "${Zonename}" "${Zonebootopt}" 360 rc_validate=1 361 else 362 debug_message "Function: validate - ${Zonename} boot option (${Zonebootopt})" 363 fi;; 364 365 Milestone) 366 367 # test the smf service which indicate that the zone is online 368 369 # is the Milestone specified 370 371 if [ -z ${Milestone} ]; then 372 # SCMSGS 373 # @explanation 374 # The Milestone variable is not set in the 375 # parameter file sczbt_<resource name>. 376 # @user_action 377 # Set the Milestone variable in the parameter 378 # file sczbt_<resource name>. 379 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 380 "Function: validate - Milestone not set in %s" \ 381 "${PARFILE}" 382 rc_validate=1 383 else 384 debug_message "Function: validate - Milestone (${Milestone}) set" 385 fi;; 386 387 LXrunlevel) 388 389 # verify that LXrunlevel is setup if Zonebrand="lx" 390 391 if [ -z "${LXrunlevel}" ] && [ "${Zonebrand}" = "lx" ]; then 392 # SCMSGS 393 # @explanation 394 # The LXrunlevel variable is not set in the 395 # parameter file sczbt_<resource name>. 396 # @user_action 397 # Set the LXrunlevel variable in the parameter 398 # file sczbt_<resource name>. 399 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 400 "Function: validate - LXrunlevel not set in %s" \ 401 "${PARFILE}" 402 rc_validate=1 403 else 404 debug_message "Function: validate - LXrunlevel (${LXrunlevel}) set" 405 fi;; 406 407 SLrunlevel) 408 409 # verify that SLrunlevel is setup if Zonebrand is set 410 # to "solaris8" or "solaris9" 411 412 if [ -z "${SLrunlevel}" ] && [ "${Zonebrand}" = "solaris8" -o "${Zonebrand}" = "solaris9" ]; then 413 # SCMSGS 414 # @explanation 415 # The SLrunlevel variable is not set in the 416 # parameter file sczbt_<resource name>. 417 # @user_action 418 # Set the SLrunlevel variable in the parameter 419 # file sczbt_<resource name>. 420 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 421 "Function: validate - SLrunlevel not set in %s" \ 422 "${PARFILE}" 423 rc_validate=1 424 else 425 debug_message "Function: validate - SLrunlevel (${SLrunlevel}) set" 426 fi;; 427 428 esac 429 done 430 431 # validates the Zonepath 432 433 # get the zone path 434 435 get_zonepath ${Zonename} 436 437 # is the Zonepath a directory 438 439 if [ ! -d ${Zonepath} ]; then 440 # SCMSGS 441 # @explanation 442 # The zone path extracted from the zones configuration is not 443 # present or not a directory. 444 # @user_action 445 # Make sure that the filesystem for the zone path is mounted. 446 # Consider using a SUNW.HAStoragePlus resource. If already used, 447 # check if the resource dependency to it is in place. 448 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 449 "Function: validate - Zonepath %s needs to be a directory" \ 450 "${Zonepath}" 451 rc_validate=1 452 else 453 debug_message "Function: validate - Zonepath ${Zonepath} is a directory" 454 fi 455 456 # Validate that we are in the global zone 457 458 val_in_global 459 if [ ${?} -ne 0 ]; then 460 rc_validate=1 461 fi 462 463 # Get list of configured SUNW.LogicalHostname resources 464 LH_LIST=`${SCHA_RESOURCE_GET} -O NETWORK_RESOURCES_USED -R ${RESOURCE} -G ${RESOURCEGROUP}` 465 466 # Check if ip-type=exclusive is set for the Zone. In that case 467 # ${LH_LIST} must be empty, since assigning an IP by setting the zone 468 # flag to the Zone does only work if ip-type=shared. 469 IPTYPE=`${ZONECFG} -z ${Zonename} info | /bin/grep "^ip-type:" | /bin/awk '{print $2}'` 470 471 if [ "${IPTYPE}" = "exclusive" ] && [ -n "${LH_LIST}" ] 472 then 473 # SCMSGS 474 # @explanation 475 # The configured non-global zone has set ip-type=exclusive 476 # within its zone config, and the resource was configured 477 # to depend on a SUNW.LogicalHostname resource. It is not 478 # possible to assign the IP address from this 479 # SUNW.LogicalHostname resource for the non-global zone if 480 # ip-type=exclusive is set. 481 # @user_action 482 # Either set ip-type=shared for the non-global zone config, 483 # or remove the dependency to the SUNW.LogicalHostname resource. 484 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 485 "Function: validate - Zone %s is configured with ip-type=exclusive, and the sczbt resource is dependand on a SUNW.LogicalHostname resource. This combination does not work." \ 486 "${Zonename}" 487 rc_validate=1 488 fi 489 490 # Check if any IPMP_HOST_IP has been configured with the Zone 491 492 for LH in ${LH_LIST} 493 do 494 get_ipmp_state ${LH} 495 496 # Test if the IPMP_HOST_IP has been configured within the Zone 497 498 ZONE_NET_INFO=/tmp/${RESOURCE}_zoneinfo.txt 499 500 echo info net | ${ZONECFG} -z ${Zonename} > ${ZONE_NET_INFO} 501 502 for j in ${IPMP_HOST_IP} 503 do 504 for i in `/bin/grep address ${ZONE_NET_INFO} | /bin/awk '{print $2}' | /bin/awk -F/ '{print $1}'` 505 do 506 if [ "${i}" = "${j}" ] 507 then 508 # SCMSGS 509 # @explanation 510 # There is an IP address conflict 511 # between the SUNW.LogicalHostname 512 # resource and the configured zone. 513 # @user_action 514 # Remove the IP address from the zones 515 # configuration with the zonecfg 516 # command. 517 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 518 "Function: validate - %s configured with address %s, please remove the address using zonecfg" \ 519 "${Zonename}" "${j}" 520 rc_validate=1 521 fi 522 done 523 done 524 525 # Test if the IPMP_HOST has been configured within the Zone 526 527 for j in ${IPMP_HOST} 528 do 529 for i in `/bin/grep address ${ZONE_NET_INFO} | /bin/awk '{print $2}' | /bin/awk -F/ '{print $1}'` 530 do 531 if [ "${i}" = "${j}" ] 532 then 533 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 534 "Function: validate - %s configured with address %s, please remove the address using zonecfg" \ 535 "${Zonename}" "${j}" 536 rc_validate=1 537 fi 538 done 539 done 540 541 # Test if another zone is already using this IPMP_HOST_IP 542 543 for ADAPTER in ${ADAPTER_LIST} 544 do 545 for i in `${IFCONFIG} -a | /bin/grep ${ADAPTER} | /bin/awk -F: '{print $2}' | /bin/grep -v flags` 546 do 547 IPMP_ADAPTER_IP=`${IFCONFIG} ${ADAPTER}:${i} | /bin/grep -w inet | /bin/awk '{print $2}'` 548 549 for j in ${IPMP_HOST_IP} 550 do 551 if [ "${IPMP_ADAPTER_IP}" = "${j}" ] 552 then 553 if ${IFCONFIG} ${ADAPTER}:${i} | /bin/grep -w zone > /dev/null 554 then 555 ZONE_ADAPTER=`${IFCONFIG} ${ADAPTER}:${i} | /bin/grep -w zone | /bin/awk '{print $2}'` 556 557 # SCMSGS 558 # @explanation 559 # The logical host is 560 # used in another zone 561 # already. A logical 562 # host can not be used 563 # in two zones at the 564 # same time. 565 # @user_action 566 # Resolve the 567 # conflicting IP address 568 # configuration for 569 # your zones. 570 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 571 "Function: validate - %s (%s) already in use on %s:%s for %s, please resolve this conflict" \ 572 "${LH}" "${j}" "${ADAPTER}" "${i}" "${ZONE_ADAPTER}" 573 rc_validate=1 574 fi 575 fi 576 done 577 done 578 done 579 done 580 581 # Check Zonebootopt="-s" has Milestone=single-user 582 583 if [ "${Zonebootopt}" = "-s" ] 584 then 585 case ${Zonebrand} in 586 native) 587 if ! echo ${Milestone} | /bin/grep single-user > /dev/null 588 then 589 # SCMSGS 590 # @explanation 591 # The Zoneboot variable is set to -s. Every 592 # milestone other than single-user is invalid. 593 # @user_action 594 # Correct the milestone in the paramter file 595 # sczbt_<resource name>. You need to specify 596 # single user together with the boot option -s. 597 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 598 "Function: validate - Milestone (%s) is invalid with Zonebootopt=%s, needs single-user" \ 599 "${Milestone}" "${Zonebootopt}" 600 rc_validate=1 601 fi;; 602 603 lx) 604 if [ "${LXrunlevel}" != "unknown" ] 605 then 606 # SCMSGS 607 # @explanation 608 # The Zoneboot variable is set to -s. Every 609 # LXrunlevel other than "unknown" is invalid. 610 # @user_action 611 # Correct the LXrunlevel variable in the 612 # paramter file sczbt_<resource name>. You need 613 # to specify "unknown" together with the boot 614 # option -s. 615 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 616 "Function: validate - LXrunlevel (%s) is invalid with Zonebootopt=%s, needs single-user" \ 617 "${LXrunlevel}" "${Zonebootopt}" 618 rc_validate=1 619 fi;; 620 621 solaris8|solaris9) 622 if [ "${SLrunlevel}" != "S" ] 623 then 624 # SCMSGS 625 # @explanation 626 # The Zoneboot variable is set to -s. Every 627 # SLrunlevel other than "S" is invalid. 628 # @user_action 629 # Correct the SLrunlevel variable in the 630 # paramter file sczbt_<resource name>. You need 631 # to specify "S" together with the boot 632 # option -s. 633 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 634 "Function: validate - SLrunlevel (%s) is invalid with Zonebootopt=%s, needs single-user" \ 635 "${SLrunlevel}" "${Zonebootopt}" 636 rc_validate=1 637 fi;; 638 639 esac 640 fi 641 642 # Check that lofs is not excluded, first check if an exclude lofs in in /etc/system 643 644 if /bin/grep -w exclude /etc/system | /bin/grep lofs >/dev/null 2>&1 645 then 646 647 # if yes check if it is commented out 648 649 if ! /bin/grep -w exclude /etc/system |/bin/grep lofs | /bin/egrep "^\*|^ +\*|^#|^ +| +#|^ +\*" >/dev/null 2>&1 650 then 651 # SCMSGS 652 # @explanation 653 # The kernel module for the lofs filesystem is still 654 # excluded in /etc/system. 655 # @user_action 656 # Place a ☆ in front of the exlude: lofs line and 657 # reboot the node. 658 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 659 "Function: validate - exclude: lofs found in /etc/system" 660 rc_validate=1 661 else 662 debug_message "Function: validate - exclude: lofs commented out in /etc/system" 663 fi 664 else 665 debug_message "Function: validate - No exclude: lofs found in /etc/system" 666 fi 667 668 if [ -n "${Mounts}" ] 669 then 670 for i in ${Mounts} 671 do 672 directory= 673 localdir= 674 675 if echo ${i} | /bin/grep : >/dev/null 2>&1 676 then 677 echo ${i} | /bin/awk -F: '{ print NF,$1,$2 }' | read field_count val1 val2 678 679 case ${field_count} in 680 2) # Support <global zone directory>:<local zone directory> 681 # Support <global zone directory>:<mount options> 682 directory=${val1} 683 684 if echo ${val2} | /bin/grep / > /dev/null 2>&1 685 then 686 localdir=${Zonepath}/root${val2} 687 else 688 localdir=${Zonepath}/root${val1} 689 fi 690 ;; 691 3) # Support <global zone directory>:<local zone directory>:<mount options> 692 # Support <global zone directory>:<local zone directory>: 693 directory=${val1} 694 localdir=${Zonepath}/root${val2} 695 ;; 696 *) scds_syslog -p daemon.err -t $(syslog_tag) -m \ 697 "Function: validate - Mounts=%s is invalid" 698 "${Mounts}" 699 rc_validate=1 700 ;; 701 esac 702 else 703 # Support just <global zone directory> without any further entries 704 directory=${i} 705 localdir=${Zonepath}/root${i} 706 fi 707 708 if [ ! -d ${directory} ] 709 then 710 # SCMSGS 711 # @explanation 712 # The directory used as a mountpoint in the 713 # global zone is missing. 714 # @user_action 715 # Create the mountpoint in the global zone. 716 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 717 "Function: validate - Global zones mountpoint %s does not exist" \ 718 "${directory}" 719 rc_validate=1 720 else 721 debug_message "Function: validate - mountpoint ${directory} exists in the global zone" 722 fi 723 724 if [ ! -d ${localdir} ] 725 then 726 # SCMSGS 727 # @explanation 728 # The directory used as a mountpoint in the 729 # non-global zone is missing. 730 # @user_action 731 # Create the mountpoint in the non-global zone. 732 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 733 "Function: validate - Non-global zones mountpoint %s does not exist" \ 734 "${localdir}" 735 rc_validate=1 736 else 737 debug_message "Function: validate - mountpoint ${localdir} exists in the non-global zone" 738 fi 739 740 done 741 fi 742 743 debug_message "Function: validate - End" 744 return ${rc_validate} 745 } 746 747 lofs_mounts() 748 { 749 debug_message "Function: lofs_mount - Begin" 750 ${SET_DEBUG} 751 752 lofs_mounts_rc=0 753 754 if [ "${Zonebrand}" = "native" ]; then 755 # wait until svc:/system/filesystem/minimal:default gets online 756 get_svc_state ${Zonename} svc:/system/filesystem/minimal:default 757 758 while [ "${SVC_STATE}" != "online" ] 759 do 760 debug_message "wait until svc:/system/filesystem/minimal:default gets online in zone ${Zonename}" 761 sleep 2 762 get_svc_state ${Zonename} svc:/system/filesystem/minimal:default 763 done 764 fi 765 766 # start with the mounts 767 768 get_zonepath ${Zonename} 769 770 for i in ${Mounts} 771 do 772 source= 773 target= 774 mountopt= 775 776 if echo ${i} | /bin/grep : >/dev/null 2>&1 777 then 778 echo ${i} | /bin/awk -F: '{ print NF,$1,$2,$3 }' | read field_count val1 val2 val3 779 780 case ${field_count} in 781 2) # Support <global zone directory>:<local zone directory> 782 # Support <global zone directory>:<mount options> 783 source=${val1} 784 785 if echo ${val2} | /bin/grep / > /dev/null 2>&1 786 then 787 target=${Zonepath}/root${val2} 788 else 789 target=${Zonepath}/root${val1} 790 [ ${val2} ] && mountopt="-o ${val2}" 791 fi 792 ;; 793 3) # Support <global zone directory>:<local zone directory>:<mount options> 794 # Support <global zone directory>:<local zone directory>: 795 source=${val1} 796 target=${Zonepath}/root${val2} 797 [ ${val3} ] && mountopt="-o ${val3}" 798 ;; 799 *) scds_syslog -p daemon.err -t $(syslog_tag) -m \ 800 "Function: validate - Mounts=%s is invalid" 801 "${Mounts}" 802 ;; 803 esac 804 else 805 # Support just <global zone directory> without any further entries 806 source=${i} 807 target=${Zonepath}/root${i} 808 fi 809 810 debug_message "Function: lofs_mounts - will mount ${source} to ${target} with the options ${mountopt}" 811 812 if /usr/sbin/mount -F lofs ${mountopt} ${source} ${target} >>${LOGFILE} 2>&1 813 then 814 # SCMSGS 815 # @explanation 816 # The mount of the directory into the root path of the 817 # non-global zone was successful. 818 # @user_action 819 # None. 820 scds_syslog -p daemon.notice -t $(syslog_tag) -m \ 821 "Function: lofsmount - Non-global zones mount from %s to %s with options %s successful" \ 822 "${source}" "${target}" "${mountopt}" 823 else 824 # SCMSGS 825 # @explanation 826 # The mount of the directory into the root path of the 827 # non-global zone failed. 828 # @user_action 829 # Watch the verbose error message in the zones start 830 # messages and fix the issue with appropriate methods. 831 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 832 "Function: lofsmount - Non-global zones mount from %s to %s with options %s failed" \ 833 "${source}" "${target}" "${mountopt}" 834 lofs_mount_rc=1 835 fi 836 done 837 838 debug_message "Function: lofs_mount - End" 839 return ${lofs_mount_rc} 840 } 841 842 get_zonepath() 843 { 844 debug_message "Function: get_zonepath - Begin" 845 ${SET_DEBUG} 846 847 myzone=${1} 848 Zonepath=`${ZONECFG} -z ${myzone} info | /bin/grep ^zonepath: | /bin/awk '{print $2}'` 849 850 debug_message "Function: zonepath - End" 851 } 852 853 get_ipmp_hosts() 854 { 855 debug_message "Function: get_ipmp_hosts - Begin" 856 ${SET_DEBUG} 857 858 LH=$1 859 860 IPMP_HOST=`${SCHA_RESOURCE_GET} -O Extension -R ${LH} -G ${RESOURCEGROUP} HostnameList | /bin/tail +2` 861 IPMP_HOST_IP=`/bin/getent hosts ${IPMP_HOST} | /bin/awk '{print $1}'` 862 863 debug_message "Function: get_ipmp_hosts - End" 864 } 865 866 get_ipmp_state() 867 { 868 # Retreive IPMP information for each Network_resources_used entry 869 870 debug_message "Function: get_ipmp_state - Begin" 871 ${SET_DEBUG} 872 873 LH=$1 874 875 get_ipmp_hosts ${LH} 876 877 NODEID=`${CLINFO} -n` 878 879 # Get the correct IPMP group, i.e. <IPMP>@${NODEID} 880 881 IPMP_LIST=`${SCHA_RESOURCE_GET} -O Extension -R ${LH} -G ${RESOURCEGROUP} NetIfList | /bin/tail +2` 882 883 for i in ${IPMP_LIST} 884 do 885 if [ `echo ${i} | /bin/awk -F@ '{print $2}'` -eq "${NODEID}" ] 886 then 887 IPMP_GROUP=`echo ${i} | /bin/awk -F@ '{print $1}'` 888 fi 889 done 890 891 # Get the Online IPMP adapter list for that IPMP Group 892 893 LOCALNODENAME=`${SCHA_CLUSTER_GET} -O NODENAME_LOCAL` 894 895 ADAPTER_LIST=`/bin/env LC_ALL=POSIX ${SCSTAT} -i -h ${LOCALNODENAME} | /bin/grep " ${IPMP_GROUP} " | /bin/grep Online | /bin/awk '{print $6}'` 896 897 debug_message "Function: get_ipmp_state - End" 898 } 899 900 start_sczbt() 901 { 902 # 903 # Start sczbt 904 # 905 906 debug_message "Function: start_sczbt - Begin" 907 ${SET_DEBUG} 908 909 # If the zone is of brand type "solaris8" or "solaris9" and if the 910 # platform changed from where the zone was previously started, 911 # the s8_p2v or s9_p2v script needs to get called prior boot to make 912 # sure that any platform specific libraries are properly setup within 913 # the zone rootpath. 914 # The script needs to run only once per new platform. The file 915 # .platform.orig stores the platform names for which the s8_p2v or 916 # s9_p2v script had already run. Only if a new platform gets introduced 917 # into the cluster, the s8_p2v or s9_p2v script gets called on that 918 # node again. 919 if [ "${Zonebrand}" = "solaris8" -o "${Zonebrand}" = "solaris9" ]; then 920 921 case ${Zonebrand} in 922 solaris8) 923 P2V_SCRIPT=/usr/lib/brand/solaris8/s8_p2v 924 ;; 925 solaris9) 926 P2V_SCRIPT=/usr/lib/brand/solaris9/s9_p2v 927 ;; 928 esac 929 930 get_zonepath ${Zonename} 931 932 myplatform=`/bin/uname -i` 933 myplatformfile=${Zonepath}/root/.platform.orig 934 need_p2v=true 935 936 # if there is no .platform.orig file or if the current 937 # platform is not contained, s8_p2v needs to run 938 if [ -f ${myplatformfile} ]; then 939 940 if /usr/bin/grep "^${myplatform}$" ${myplatformfile} > /dev/null 2>&1 941 then 942 need_p2v=false 943 fi 944 fi 945 946 if [ -x "${P2V_SCRIPT}" -a "${need_p2v}" = "true" ]; then 947 ${P2V_SCRIPT} ${Zonename} >${LOGFILE} 2>&1 948 if [ $? -ne 0 ]; then 949 # SCMSGS 950 # @explanation 951 # Unable to perform platform specific 952 # setup for the solaris8 or solaris9 zone. 953 # @user_action 954 # Disable the resource and manually run 955 # '/usr/lib/brand/solaris8/s8_p2v 956 # <zonename>' for solaris8 or 957 # '/usr/lib/brand/solaris9/s9_p2v <zonename>' 958 # for solaris9 on the node where the start 959 # failed. Correct any errors reported, then 960 # restart the resource. 961 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 962 "Function: start_sczbt - Running command %s %s failed. Unable to start zone." \ 963 "${P2V_SCRIPT}" "${Zonename}" 964 rc_start_command=1 965 return 1 966 fi 967 968 # Only update the file if it is not a symbolic link. 969 # Otherwise it would be a security issue. 970 if [ ! -h ${myplatformfile} ]; then 971 # Add platform to the .platform.orig file 972 echo ${myplatform} >> ${myplatformfile} 973 fi 974 fi 975 976 # Only update the file if it is not a symbolic link. 977 # Otherwise it would be a security issue. 978 if [ ! -h ${Zonepath}/root/.host.orig ]; then 979 # This update is necessary to make sure the 980 # solaris8 or solaris9 zone can get booted without 981 # manual intervention. 982 /usr/bin/hostid > ${Zonepath}/root/.host.orig 983 fi 984 fi 985 986 # boot the zone 987 ${ZONEADM} -z ${Zonename} boot ${Zonebootopt} >>${LOGFILE} 2>&1 988 989 rc_start_command=${?} 990 991 # disable the pmf tag and run a sleep in the background, to assure, that there will be a valid pmftag during the start phase 992 993 START_TIMEOUT=`${SCHA_RESOURCE_GET} -O START_TIMEOUT -R ${RESOURCE} -G ${RESOURCEGROUP}` 994 sleep ${START_TIMEOUT} & 995 996 ${PMFADM} -s ${RESOURCEGROUP},${RESOURCE},0.svc 997 998 # mount the requested loopbakcmount to the local zone 999 1000 if ! lofs_mounts 1001 then 1002 rc_start_command=1 1003 fi 1004 1005 # assign zone flag to registered interfaces of the SUNW.LogicalHostname resources 1006 1007 if [ "${LH_LIST}" ] 1008 then 1009 for LH in ${LH_LIST} 1010 do 1011 get_ipmp_state ${LH} 1012 1013 # Place the IPMP ADAPTER into the local zone 1014 1015 for ADAPTER in ${ADAPTER_LIST} 1016 do 1017 for j in ${IPMP_HOST_IP} 1018 do 1019 for i in `${IFCONFIG} -a | /bin/grep ${ADAPTER} | /bin/awk -F: '{print $2}' | /bin/grep -v flags` 1020 do 1021 IPMP_ADAPTER_IP=`${IFCONFIG} ${ADAPTER}:${i} | /bin/grep -w inet | /bin/awk '{print $2}'` 1022 1023 if [ "${IPMP_ADAPTER_IP}" = "${j}" ] 1024 then 1025 if ! ${IFCONFIG} ${ADAPTER}:${i} zone ${Zonename} 1026 then 1027 rc_start_command=1 1028 fi 1029 1030 # SCMSGS 1031 # @explanation 1032 # The interface of the 1033 # logical host 1034 # resource is placed 1035 # by the start command 1036 # into the referenced 1037 # zone. 1038 # @user_action 1039 # None. 1040 scds_syslog -p daemon.notice -t $(syslog_tag) -m \ 1041 "Function: start_sczbt - logical interface %s:%s placed into %s" \ 1042 "${ADAPTER}" "${i}" "${Zonename}" 1043 fi 1044 done 1045 done 1046 done 1047 done 1048 fi 1049 1050 debug_message "Function: start_sczbt - End" 1051 return ${rc_start_command} 1052 } 1053 1054 stop_sczbt() 1055 { 1056 # 1057 # Stop sczbt 1058 # 1059 1060 debug_message "Function: stop_sczbt - Begin" 1061 ${SET_DEBUG} 1062 1063 rc_stop_command=0 1064 1065 # RETRIEVE STOP_TIMEOUT 1066 STOP_TIMEOUT=`${SCHA_RESOURCE_GET} -O STOP_TIMEOUT -R ${RESOURCE} -G ${RESOURCEGROUP}` 1067 1068 # 60 % of the STOP_TIMEOUT can be spend on waiting for normal shutdown 1069 MAX_STOP_TIMEOUT=`expr ${STOP_TIMEOUT} \* 60 \/ 100` 1070 1071 # 15 % of the STOP_TIMEOUT can be spend on waiting for clear_zone() 1072 CLEAR_STOP_TIMEOUT=`expr ${STOP_TIMEOUT} \* 15 \/ 100` 1073 1074 # reset SECONDS to zero 1075 SECONDS=0 1076 1077 # Place the IPMP ADAPTER back into the global zone 1078 LH_LIST=`${SCHA_RESOURCE_GET} -O NETWORK_RESOURCES_USED -R ${RESOURCE} -G ${RESOURCEGROUP}` 1079 1080 if [ "${LH_LIST}" ] 1081 then 1082 for LH in ${LH_LIST} 1083 do 1084 get_ipmp_state ${LH} 1085 1086 for ADAPTER in ${ADAPTER_LIST} 1087 do 1088 for j in ${IPMP_HOST_IP} 1089 do 1090 for i in `${IFCONFIG} -a | /bin/grep ${ADAPTER} | /bin/awk -F: '{print $2}' | /bin/grep -v flags` 1091 do 1092 # For each ${ADAPTER}:${i} check "${IPMP_ADAPTER_IP}" = "${j}" , ${j} is one of the list of ip addresses 1093 # If there's a match, then for each ${ADAPTER}:${i} check the zone flag = "${Zonename}" 1094 # If there's a match then place the ${ADAPTER}:${i} back into the global zone 1095 1096 IPMP_ADAPTER_IP=`${IFCONFIG} ${ADAPTER}:${i} | /bin/grep -w inet | /bin/awk '{print $2}'` 1097 1098 if [ "${IPMP_ADAPTER_IP}" = "${j}" ] 1099 then 1100 if ${IFCONFIG} ${ADAPTER}:${i} | /bin/grep -w zone > /dev/null 1101 then 1102 ZONE_ADAPTER=`${IFCONFIG} ${ADAPTER}:${i} | /bin/grep -w zone | /bin/awk '{print $2}'` 1103 1104 if [ "${ZONE_ADAPTER}" = "${Zonename}" ] 1105 then 1106 ${IFCONFIG} ${ADAPTER}:${i} -zone 1107 1108 # SCMSGS 1109 # @explanation 1110 # The 1111 # interface 1112 # of 1113 # the 1114 # associated 1115 # logical 1116 # host 1117 # is 1118 # placed 1119 # back 1120 # into 1121 # the 1122 # global 1123 # zone 1124 # by 1125 # the 1126 # stop 1127 # command 1128 # of 1129 # the 1130 # sczbt 1131 # component. 1132 # @user_action 1133 # None 1134 scds_syslog -p daemon.notice -t $(syslog_tag) -m \ 1135 "Function: stop_sczbt - Logical interface %s:%s placed into the global zone" \ 1136 "${ADAPTER}" "${i}" 1137 fi 1138 fi 1139 fi 1140 done 1141 done 1142 done 1143 done 1144 fi 1145 1146 # bring down the zone 1147 debug_message "Function: stop_sczbt - Shuting down non-global zone ${Zonename}" 1148 case ${Zonebrand} in 1149 native|solaris8|solaris9) 1150 ${ZLOGIN} ${Zonename} /usr/sbin/shutdown -y -g0 -i0 >${LOGFILE} 2>&1 1151 ;; 1152 lx) 1153 ${ZLOGIN} ${Zonename} /sbin/shutdown -h now >${LOGFILE} 2>&1 1154 ;; 1155 esac 1156 1157 # 1158 # run a test loop to determine if the zone reached state "installed" 1159 # or if the timeout for proper shutdown is exceeded 1160 # 1161 while [ ${SECONDS} -lt ${MAX_STOP_TIMEOUT} ] 1162 do 1163 # check if the zone reached state "installed" 1164 get_zone_state ${Zonename} 1165 debug_message "Function: stop_sczbt - ${Zonename} state is ${ZONE_STATE}, time passed while waiting for shutdown: ${SECONDS}" 1166 if [ "${ZONE_STATE}" = "installed" ]; then 1167 SECONDS=${MAX_STOP_TIMEOUT} 1168 else 1169 # wait 4 seconds 1170 sleep 4 1171 fi 1172 done 1173 1174 # 1175 # bring the zone down at all costs if the shutdown has exceeded 1176 # its time limit and did not reach state "installed" 1177 # 1178 1179 if [ "${ZONE_STATE}" != "installed" ]; then 1180 1181 debug_message "Function: stop_sczbt - Halting non-global zone ${Zonename}" 1182 1183 # 1184 # According to 1185 # http://docs.sun.com/app/docs/doc/819-2450/6n4o5mde2?a=view 1186 # zoneadm halt will bring down all processes running within 1187 # the non-global zone, devices are unconfigured, network 1188 # interfaces are unplumbed, file systems are unmounted, and the 1189 # kernel data structures are destroyed. 1190 # 1191 # However, processes running within the global zone could 1192 # block a non-global zones file system (e.g. a backup app), 1193 # for that reason after the first zoneadm halt got issued, 1194 # but the non-global zone did not yet reach state "installed", 1195 # the clear_zone script will get called. It will try to kill 1196 # any processes blocking the non-global zones file systems 1197 # from the global zone. 1198 # 1199 # Afterwards zoneadm halt is called a second time to bring 1200 # the non-global zone into state "installed. If this is 1201 # not possible, an error message indicates the need for 1202 # manual intervention through the systems administrator 1203 # in order to cleanup the non-global zone. 1204 # 1205 ${ZONEADM} -z ${Zonename} halt >>${LOGFILE} 2>&1 1206 rc_stop_command=$? 1207 1208 get_zone_state ${Zonename} 1209 1210 debug_message "Function: stop_sczbt - ${Zonename} state is ${ZONE_STATE}" 1211 1212 if [ "${ZONE_STATE}" != "installed" ]; then 1213 SECONDS=0 1214 get_zonepath ${Zonename} 1215 /usr/cluster/bin/hatimerun -t ${CLEAR_STOP_TIMEOUT} /opt/SUNWsczone/sczbt/bin/clear_zone ${Zonepath} ${RESOURCEGROUP} ${RESOURCE} >>${LOGFILE} 1216 debug_message "Function: stop_sczbt - ${Zonename} state is ${ZONE_STATE}, time passed while waiting for clear_zone: ${SECONDS}" 1217 1218 # give some time to let killed processes finish 1219 sleep 2 1220 1221 debug_message "Function: stop_sczbt - Halting non-global zone ${Zonename} again" 1222 ${ZONEADM} -z ${Zonename} halt >>${LOGFILE} 2>&1 1223 rc_stop_command=$? 1224 1225 get_zone_state ${Zonename} 1226 if [ "${ZONE_STATE}" != "installed" ]; then 1227 # SCMSGS 1228 # @explanation 1229 # The non-global zones shutdown command did not 1230 # complete in time or zoneadm halt was not able 1231 # to bring the non-global zone into state 1232 # "installed". In order to prevent failed 1233 # starts of the non-global zone on this 1234 # node, manual cleanup is necessary. 1235 # @user_action 1236 # Follow the Solaris System Administrator Guide 1237 # for Zones to bring the non-global zone into 1238 # state "installed" before trying to restart 1239 # the resource on this node. 1240 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 1241 "Function: stop_sczbt - Manual intervention needed for non-global zone %s - unable to get into state installed." \ 1242 "${Zonename}" 1243 else 1244 debug_message "Function: stop_sczbt - ${Zonename} state is ${ZONE_STATE}" 1245 echo "Successfully halted the non-global zone ${Zonename}, it is in state ${ZONE_STATE}" >>${LOGFILE} 2>&1 1246 # SCMSGS 1247 # @explanation 1248 # The second zoneadm halt was able to get the 1249 # non-global zone into state "installed". 1250 # @user_action 1251 # None 1252 scds_syslog -p daemon.notice -t $(syslog_tag) -m \ 1253 "Function: stop_sczbt - The non-global zone %s was successfully halted and reached state %s" \ 1254 "${Zonename}" "${ZONE_STATE}" 1255 fi 1256 fi 1257 fi 1258 1259 # Send a kill to any pids under the PMFtag 1260 ${PMFADM} -s ${RESOURCEGROUP},${RESOURCE},0.svc KILL 2> /dev/null 1261 1262 debug_message "Function: stop_sczbt - End" 1263 return ${rc_stop_command} 1264 } 1265 1266 check_sczbt() 1267 { 1268 # 1269 # Probe sczbt 1270 # 1271 1272 debug_message "Function: check_sczbt - Begin" 1273 ${SET_DEBUG} 1274 1275 rc_check_sczbt=0 1276 1277 # check if start program is running 1278 1279 if /bin/pgrep -z global -f "start_sczbt -R ${RESOURCE} " >/dev/null 2>&1 1280 then 1281 debug_message "Function: check_sczbt - Start program is still running " 1282 rc_check_sczbt=100 1283 return ${rc_check_sczbt} 1284 fi 1285 1286 # do a reduced check as long as the gds_svc_start is running otherwise do an extensive check 1287 1288 if /bin/pgrep -z global -f "gds_svc_start .*-R ${RESOURCE} " >/dev/null 2>&1 1289 then 1290 1291 # check if the scheduler is running 1292 1293 if ! /bin/pgrep -z ${Zonename} zsched>/dev/null 2>&1 1294 then 1295 rc_check_sczbt=100 1296 debug_message "Function: check_sczbt - Early end" 1297 return ${rc_check_sczbt} 1298 fi 1299 1300 # check if zone service is online 1301 1302 case ${Zonebrand} in 1303 native) 1304 get_svc_state ${Zonename} ${Milestone} 1305 1306 if [ "${SVC_STATE}" != "online" -a "${SVC_STATE}" != "degraded" ] 1307 then 1308 rc_check_sczbt=100 1309 debug_message "Function: check_sczbt - ${Zonename} milestone (${Milestone}) state is ${SVC_STATE}" 1310 return ${rc_check_sczbt} 1311 fi;; 1312 lx) 1313 if get_lx_state ${Zonename} 1314 then 1315 if [ "${LX_STATE}" != "${LXrunlevel}" ] 1316 then 1317 rc_check_sczbt=100 1318 debug_message "Function: check_sczbt - ${Zonename} runlevel (${LXrunlevel}) state is ${LX_STATE}" 1319 return ${rc_check_sczbt} 1320 fi 1321 else 1322 rc_check_sczbt=100 1323 debug_message "Function: check_sczbt - runlevel did not return successfully (return code ${rc_get_lx_state}) for the non-global zone {Zonename}" 1324 return ${rc_check_sczbt} 1325 fi;; 1326 1327 solaris8|solaris9) 1328 if get_solaris_legacy_state ${Zonename} 1329 then 1330 if [ "${SOLARIS_LEGACY_STATE}" != "${SLrunlevel}" ] 1331 then 1332 rc_check_sczbt=100 1333 debug_message "Function: check_sczbt - ${Zonename} runlevel (${SLrunlevel}) state is ${SOLARIS_LEGACY_STATE}" 1334 return ${rc_check_sczbt} 1335 fi 1336 else 1337 rc_check_sczbt=100 1338 debug_message "Function: check_sczbt - runlevel did not return successfully (return code ${rc_get_solaris_legacy_state}) for the non-global zone {Zonename}" 1339 return ${rc_check_sczbt} 1340 fi;; 1341 esac 1342 1343 else 1344 1345 # check if the scheduler is running 1346 1347 if ! /bin/pgrep -z ${Zonename} zsched>/dev/null 2>&1 1348 then 1349 # SCMSGS 1350 # @explanation 1351 # The zsched prcess of the referenced zone is not 1352 # running. The zone is not operable. 1353 # @user_action 1354 # None. The resource will be restarted or the resource 1355 # group will be failed over. 1356 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 1357 "Function: check_sczbt - Zone scheduler for %s not running" \ 1358 "${Zonename}" 1359 rc_check_sczbt=100 1360 debug_message "Function: check_sczbt - Early end" 1361 return ${rc_check_sczbt} 1362 fi 1363 1364 # check if the ip addresses of the logical hoists are online 1365 1366 LH_LIST=`${SCHA_RESOURCE_GET} -O NETWORK_RESOURCES_USED -R ${RESOURCE} -G ${RESOURCEGROUP}` 1367 1368 if [ "${LH_LIST}" ] 1369 then 1370 1371 ip_config=`${IFCONFIG} -a` 1372 1373 for LH in ${LH_LIST} 1374 do 1375 get_ipmp_hosts ${LH} 1376 1377 for i in ${IPMP_HOST_IP} 1378 do 1379 if ! echo ${ip_config} | /bin/grep -w ${i} >/dev/null 2>&1 1380 then 1381 # SCMSGS 1382 # @explanation 1383 # The referenced zones ip 1384 # address is unplumbed. 1385 # @user_action 1386 # None. The resource will be 1387 # restarted or the resource 1388 # group will be failed over. 1389 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 1390 "Function: check_sczbt - Zones %s ip address %s is not running" \ 1391 "${Zonename}" "${i}" 1392 rc_check_sczbt=201 1393 debug_message "Function: check_sczbt - immediate failover" 1394 1395 return ${rc_check_sczbt} 1396 fi 1397 done 1398 done 1399 fi 1400 1401 # check if zone service is online if not try for 60 percent of the probe timout 1402 1403 # RETRIEVE PROBE_TIMEOUT 1404 1405 PROBE_TIMEOUT=`${SCHA_RESOURCE_GET} -O Extension -R ${RESOURCE} -G ${RESOURCEGROUP} PROBE_TIMEOUT |tail -1` 1406 1407 # 60 % OF THE PROBE_TIMEOUT CAN BE SPEND ON WAITING 1408 1409 MAX_PROBE_TIMEOUT=`expr ${PROBE_TIMEOUT} \* 60 \/ 100` 1410 SECONDS=0 1411 1412 # test for 60 percent of the probe timeoput if the zone is online 1413 case ${Zonebrand} in 1414 native) 1415 while [ ${SECONDS} -lt ${MAX_PROBE_TIMEOUT} ] 1416 do 1417 get_svc_state ${Zonename} ${Milestone} 1418 1419 if [ "${SVC_STATE}" != "online" -a "${SVC_STATE}" != "degraded" ] 1420 then 1421 # SCMSGS 1422 # @explanation 1423 # The milestone is not online or degraded. The 1424 # state is checked again in 5 seconds. 1425 # @user_action 1426 # None. 1427 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 1428 "Function: check_sczbt - %s Milestone [%s] not online, try again in 5 seconds" \ 1429 "${Zonename}" "${Milestone}" 1430 rc_check_sczbt=100 1431 sleep 5 1432 else 1433 SECONDS=${MAX_PROBE_TIMEOUT} 1434 rc_check_sczbt=0 1435 fi 1436 done;; 1437 1438 lx) 1439 while [ ${SECONDS} -lt ${MAX_PROBE_TIMEOUT} ] 1440 do 1441 if get_lx_state ${Zonename} 1442 then 1443 if [ "${LX_STATE}" != "${LXrunlevel}" ] 1444 then 1445 # SCMSGS 1446 # @explanation 1447 # The runlevel is not equal to the 1448 # configured LXrunlevel. The state is 1449 # checked again in 5 seconds. 1450 # @user_action 1451 # None. 1452 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 1453 "Function: check_sczbt - %s runlevel [%s] not online, runlevel is %s, try again in 5 seconds" \ 1454 "${Zonename}" "${LXrunlevel}" "${LX_STATE}" 1455 rc_check_sczbt=100 1456 sleep 5 1457 else 1458 SECONDS=${MAX_PROBE_TIMEOUT} 1459 rc_check_sczbt=0 1460 fi 1461 else 1462 # SCMSGS 1463 # @explanation 1464 # The runlevel command did not run 1465 # successfully in the configured 1466 # non-global zone. The state is 1467 # checked again in 5 seconds. 1468 # @user_action 1469 # None. 1470 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 1471 "Function: check_sczbt - runlevel did not run successfully (return code %s) in the non-global zone %s, try again in 5 seconds" \ 1472 "${rc_get_lx_state}" "${Zonename}" 1473 rc_check_sczbt=100 1474 sleep 5 1475 fi 1476 done;; 1477 1478 solaris8|solaris9) 1479 while [ ${SECONDS} -lt ${MAX_PROBE_TIMEOUT} ] 1480 do 1481 if get_solaris_legacy_state ${Zonename} 1482 then 1483 if [ "${SOLARIS_LEGACY_STATE}" != "${SLrunlevel}" ] 1484 then 1485 # SCMSGS 1486 # @explanation 1487 # The legacy runlevel is not 1488 # equal to the configured 1489 # SLrunlevel. The state is 1490 # checked again in 5 seconds. 1491 # @user_action 1492 # None. 1493 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 1494 "Function: check_sczbt - %s legacy runlevel [%s] not online, runlevel is %s, try again in 5 seconds" \ 1495 "${Zonename}" "${SLrunlevel}" "${SOLARIS_LEGACY_STATE}" 1496 rc_check_sczbt=100 1497 sleep 5 1498 else 1499 SECONDS=${MAX_PROBE_TIMEOUT} 1500 rc_check_sczbt=0 1501 fi 1502 else 1503 # SCMSGS 1504 # @explanation 1505 # The who -r command did not run 1506 # successfully in the configured 1507 # non-global zone. The state is 1508 # checked again in 5 seconds. 1509 # @user_action 1510 # None. 1511 scds_syslog -p daemon.err -t $(syslog_tag) -m \ 1512 "Function: check_sczbt - who -r did not run successfully (return code %s) in the non-global zone %s, try again in 5 seconds" \ 1513 "${rc_get_solaris_legacy_state}" "${Zonename}" 1514 rc_check_sczbt=100 1515 sleep 5 1516 fi 1517 done;; 1518 1519 esac 1520 fi 1521 1522 debug_message "Function: check_sczbt - End" 1523 return ${rc_check_sczbt} 1524 } 1525