1 #!/bin/ksh 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 # Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 # Use is subject to license terms. 24 # 25 ####################################################################### 26 # 27 # This file contains system setup requirements for scm. 28 # 29 # For systems before Solaris 10 it should be located in /etc/init.d 30 # directory with the following links: 31 # 32 # ln /etc/init.d/scm /etc/rc0.d/K84scm 33 # ln /etc/init.d/scm /etc/rc2.d/S002scm 34 # 35 # For Solaris 10 or later systems this script is run as part of SVC by 36 # svc.startd and should be located in /lib/svc/method 37 # 38 #USAGE="Usage: $0 { start | stop } 39 # 40 ####################################################################### 41 42 SVCS=/usr/bin/svcs 43 DSCFG_DEPEND_NOCHK="/tmp/.dscfgadm_pid" 44 OS_MINOR=`/usr/bin/uname -r | /usr/bin/cut -d '.' -f2` 45 46 . /lib/svc/share/smf_include.sh 47 48 # Make sure prior SMF dependents are not 'online' 49 # $1 = name of SMF service to validate dependents 50 # 51 do_smf_depends () 52 { 53 times=0 54 count=1 55 56 if [ $OS_MINOR -ge 11 ] 57 then 58 return 0 59 elif [ -f $DSCFG_DEPEND_NOCHK ] 60 then 61 for pid in `pgrep dscfgadm` 62 do 63 if [ `grep -c $pid $DSCFG_DEPEND_NOCHK` -gt 0 ] 64 then 65 return 0 66 fi 67 done 68 elif [ `ps -ef | grep preremove | grep -c SUNWscmu` -gt 0 ] 69 then 70 return 0 71 72 fi 73 74 while [ $count -ne 0 ] 75 do 76 count=`$SVCS -o STATE -D $1 2>>/dev/null | grep "^online" | wc -l` 77 if [ $count -ne 0 ] 78 then 79 # Output banner after waiting first 5 seconds 80 # 81 if [ $times -eq 1 ] 82 then 83 echo "Waiting for $1 dependents to be 'offline'" 84 $SVCS -D $1 2>>/dev/null | grep "^online" 85 fi 86 87 # Has it been longer then 5 minutes? (60 * 5 secs.) 88 # 89 if [ $times -eq 60 ] 90 then 91 echo "Error: Failed waiting for $1 dependents to be 'offline'" 92 $SVCS -D $1 2>>/dev/null | grep "^online" 93 exit $SMF_EXIT_ERR_FATAL 94 fi 95 96 # Now sleep, giving other services time to stop 97 # 98 sleep 5 99 times=`expr $times + 1` 100 fi 101 done 102 return 0 103 } 104 105 set_system_type() 106 { 107 CLINFO=/usr/sbin/clinfo 108 ESMSBIN=/usr/sbin 109 SCMBIN=/usr/sbin 110 ESMSCMLIB=/usr/lib 111 SCMLIB=/usr/lib 112 DSCFG_LOCKDB=/etc/dscfg_lockdb 113 } 114 115 do_stopsdbc () 116 { 117 if [ ! -r /dev/sdbc ] 118 then 119 return 120 fi 121 122 ${SCMBIN}/scmadm -d 123 if [ $? -ne 0 ] ; then 124 # If the disable failed that means we have pinned data. 125 echo "Cache Not Deconfigured" 126 fi 127 } 128 129 do_stopnskernd () 130 { 131 ps -e | grep -w nskernd > /dev/null 2>&1 132 if [ $? -eq 0 ] ; then 133 # make sure that all data services are unloaded before stopping 134 # nskernd - cannot stop nskernd when its threads could be in use 135 # Note: sv is unloadable, but its threadset is shutdown in the 136 # final close(9e) call. 137 stop=1 138 for m in ste rdc rdcsrv ii sdbc ; do 139 mid=`/usr/sbin/modinfo | grep -w $m | awk '{print $1}' -` 140 if [ -z "$mid" ] ; then 141 continue # not loaded 142 fi 143 /usr/sbin/modunload -i $mid > /dev/null 2>&1 144 if [ $? -ne 0 ] ; then 145 stop=0 146 break 147 fi 148 done 149 150 # kill nskernd if we can 151 pid=`ps -e | grep -w nskernd | sed -e 's/^ *//' -e 's/ .*//'` 152 if [ $stop -eq 1 ] ; then 153 if [ -n "$pid" ] ; then 154 kill -15 $pid 155 fi 156 fi 157 fi 158 159 if [ -r /dev/ncall -a -x $ESMSCMLIB/ncalladm ] 160 then 161 $ESMSCMLIB/ncalladm -d 162 fi 163 } 164 165 do_stopdscfglockd () 166 { 167 pid=`ps -e | grep -w dscfgloc | sed -e 's/^ *//' -e 's/ .*//'` 168 if [ -n "$pid" ] ; then 169 kill -15 $pid 170 fi 171 } 172 173 do_stop () 174 { 175 do_smf_depends "system/nws_scm" 176 do_stopsdbc 177 do_stopnskernd 178 do_stopdscfglockd 179 } 180 181 do_nskernd () 182 { 183 if [ -x $ESMSCMLIB/ncalladm ] 184 then 185 $ESMSCMLIB/ncalladm -e 186 fi 187 188 ps -e | grep -w nskernd > /dev/null 2>&1 189 if [ $? -ne 0 ] ; then 190 ${SCMLIB}/nskernd 191 if [ $? -ne 0 ] ; then 192 echo "Error: Unable to start nskernd" 193 exit $SMF_EXIT_ERR_FATAL 194 fi 195 fi 196 } 197 198 do_dscfglockd () 199 { 200 ps -e | grep -w dscfgloc > /dev/null 2>&1 201 if [ $? -ne 0 ] 202 then 203 rm -f /var/tmp/.cfglockd.pid 204 else 205 # dscfglockd already running 206 return 207 fi 208 209 if ${CLINFO} 210 then 211 # 212 # create or update the dscfg_lockdb file 213 # 214 215 # create clean tmpnodelist 216 NODELIST=/tmp/$$.dscfg_nodelist 217 rm -f $NODELIST >/dev/null 2>&1 218 touch $NODELIST 219 220 if [ -x /usr/cluster/bin/scstat ] 221 then 222 # get valid names in cluster 223 /usr/cluster/bin/scstat -n | grep node: | \ 224 awk '{print $3}' >> $NODELIST 225 if [ ! -f $DSCFG_LOCKDB ] 226 then 227 printf "In clustered environment.\n" 228 printf "creating per node dscfg_lockdb database" 229 printf " with following nodenames:\n" 230 cat $NODELIST 231 cp $NODELIST $DSCFG_LOCKDB 232 else 233 # check if there are any changes 234 diff $NODELIST $DSCFG_LOCKDB > /dev/null 235 if [ $? != 0 ] 236 then 237 printf "The cluster node names have " 238 printf "changed. Updating dscfg_lockdb " 239 printf "database.\n" 240 printf "Previous node names:\n" 241 cat $DSCFG_LOCKDB 242 printf "New node names:\n" 243 cat $NODELIST 244 rm -f $DSCFG_LOCKDB 245 cp $NODELIST $DSCFG_LOCKDB 246 fi 247 fi 248 else 249 # we're in a cluster, but scstat is not available 250 printf "In clustered environment.\n" 251 printf "Required configuration file, $DSCFG_LOCKDB\n" 252 printf "was not properly populated with the cluster " 253 printf "nodenames.\nThis file needs to be manually" 254 printf "updated with the cluster\nnodenames before " 255 printf "reboot. Refer to Sun Storage Availability\n" 256 printf "Suite Installation Guide for details.\n" 257 fi 258 259 # clustered start of dscfglockd 260 if [ -f $DSCFG_LOCKDB ] 261 then 262 printf "Starting dscfglockd\n" 263 ${SCMLIB}/dscfglockd -f $DSCFG_LOCKDB 264 else 265 printf "WARNING: Mis-Configuration of Availability " 266 printf "Suite for Sun Cluster\n" 267 printf "WARNING: Can't find configuration file for " 268 printf "dscfglockd\n" 269 fi 270 271 rm -f $NODELIST 272 fi 273 274 } 275 276 do_sdbc () 277 { 278 ${SCMBIN}/scmadm -e 279 } 280 281 282 do_start () 283 { 284 # do nothing if we do not have a dscfg 285 if [ ! -f /etc/dscfg_local ] 286 then 287 echo "Cannot find Availability Suite configuration location" 288 exit $SMF_EXIT_ERR_NOSMF 289 fi 290 291 # 292 # Ordering: 293 # dscfglockd -- locking must be present before any dscfg access 294 # nskernd -- starts infrastructure (nskernd, ncall). 295 # sdbc -- start the cache itself 296 # 297 do_dscfglockd 298 do_nskernd 299 do_sdbc 300 } 301 302 303 do_usage () 304 { 305 echo "Usage: $0" 306 echo " start" 307 echo " stop" 308 exit 1 309 } 310 311 set_system_type 312 313 USED=0 314 ACTION= 315 CLUSTERTAG= 316 317 case $# in 318 '0') 319 do_usage 320 ;; 321 '1') 322 ACTION=$1 323 USED=1 324 ;; 325 '2') 326 ACTION=$1 327 CLUSTERTAG="$2" 328 USED=1 329 exit 0 330 ;; 331 '*') 332 do_usage 333 ;; 334 esac 335 336 if [ $USED = 0 ] ; then 337 do_usage 338 fi 339 340 if [ $ACTION = "start" ] ; then 341 do_start 342 elif [ $ACTION = "stop" ] ; then 343 do_stop 344 else 345 do_usage 346 fi 347 348 exit $SMF_EXIT_OK