diff options
Diffstat (limited to 'usr/src/cmd/avs/dscfg/dscfgadm.sh')
-rw-r--r-- | usr/src/cmd/avs/dscfg/dscfgadm.sh | 1547 |
1 files changed, 0 insertions, 1547 deletions
diff --git a/usr/src/cmd/avs/dscfg/dscfgadm.sh b/usr/src/cmd/avs/dscfg/dscfgadm.sh deleted file mode 100644 index 736a89b2a2..0000000000 --- a/usr/src/cmd/avs/dscfg/dscfgadm.sh +++ /dev/null @@ -1,1547 +0,0 @@ -#!/usr/bin/ksh -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License (the "License"). -# You may not use this file except in compliance with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright 2010 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# - -typeset -r PROG=$(basename $0) -typeset -r CTAG_NULL="-" - -# -# help message -# -help() -{ - $xopt - - cluster_configured - CLUSTER_CONFIGURED=$? - - echo "\ -usage: - $PROG - $PROG -i - $PROG -e [-r][-p] - $PROG -d [-r]" >&2 - if [ $CLUSTER_CONFIGURED -eq 1 ]; then - echo "\ - $PROG -s" >&2 - fi - - echo "\ - -i : display information on the Availability Suite services - -e : enable Availability Suite services (all, by default) - -d : disable Availability Suite services (all, by default) - -r : enable/disable Remote Mirror - -p : enable Point in Time Copy" >&2 - if [ $CLUSTER_CONFIGURED -eq 1 ]; then - echo "\ - -s : set the location of the cluster configuration database" >&2 - fi - echo "\ - -x : turn on script debugging (may be used with any valid option) - - When executed with no options or with nothing but -x, $PROG runs in - interactive fashion, allowing the user to initialize the local (and - if applicable, the cluster) configuration database, and to start the - Availability Suite services." >&2 - - exit 2 -} - -########################## SET GLOBAL VARIABLES ###################### - -# root directory -PKG_INSTALL_ROOT="" -export PKG_INSTALL_ROOT - -# set lib path -LD_LIBRARY_PATH=/usr/lib:/usr/lib -export LD_LIBRARY_PATH - -# set dscfg -DSCFG="/usr/sbin/dscfg" -export DSCFG - -# set parser config location -PCONFIG="/etc/dscfg_format" -export PCONFIG - -# set local dscfg location -export LOCAL_DSCFG="/etc/dscfg_local" - -# set cluster dscfg reference file -export CLUSTER_REF="/etc/dscfg_cluster" - -# a service that has a dependency on us -FS_LOCAL_SVC="svc:/system/filesystem/local" - -NODELIST="/tmp/nodelist" -DSCFGLOCKDCF="/etc/dscfg_lockdb" -DSCFG_DEPEND_NOCHK="/tmp/.dscfgadm_pid" - -# SMF defines -MANIFEST_PATH=/lib/svc/manifest/system - -# SMF services (enable and disable) -SMF_ENABLE="nws_scm nws_sv nws_ii nws_rdc nws_rdcsyncd" -SMF_DISABLE="nws_rdcsyncd nws_rdc nws_ii nws_sv nws_scm" - -# state of each service -nws_scm_enabled=0 -nws_sv_enabled=0 -nws_ii_enabled=0 -nws_rdc_enabled=0 -nws_rdcsyncd_enabled=0 - -# set path -PATH=/usr/bin:/usr/sbin:/sbin/sh -export PATH - -# set architecture -ARCH=`uname -p` -export ARCH -OS_MINOR=`uname -r | cut -d '.' -f2` - -# number of sectors required for database -# 1024*1024*5.5/512 -REQUIRED=11264 - -# must set here, else seen as null in MAIN -VALID_DB_ENTERED=0 - -NO_ARGS=0 - -# for debugging -xopt= - -# set lengthy message here -CLUST_LOC_MESS="The current location is invalid for a Sun StorageTek \ -Data Services configuration database. Once a valid location is \ -entered (raw slice on \"did\" device), you may upgrade the existing \ -database to this new location - following the procedure outlined \ -in the Installation and Configuration Guide." - -########################## SET GLOBAL VARIABLES ###################### - - -########################## ERROR #################################### - -# called with optional error msg $1 -# prints basic guidelines for configuration of the database location -error() -{ - $xopt - - echo >&2 - echo "INSTALLATION ERROR" >&2 - echo "Error: $1" >&2 - echo >&2 - in_cluster - - if [ $? -eq 1 ]; then - echo "GENERAL INSTALLATION RULES:" >&2 - echo "\tBecause you are installing on a cluster," >&2 - echo "\tthe database must be located on a raw slice of a did device.">&2 - echo "\t e.g. /dev/did/rdsk/d17s1" >&2 - fi - # let? - MB=`expr $REQUIRED / 2 / 1024` - echo "\t$REQUIRED sectors ($MB MBs) are required for the database." >&2 -} - -########################## ERROR #################################### - -########################## ALL LOCATION TESTS ######################## - -# sets numerous environment variables describing the state of the system -get_system_state() -{ - $xopt - - valid_local_dscfg_exists - VALID_LOCAL_DB=$? - OLD_VALID_LOCAL_DB=$VALID_LOCAL_DB - - in_cluster - IN_CLUSTER=$? - - cluster_configured - CLUSTER_CONFIGURED=$? - - if [ $IN_CLUSTER = 1 ]; then - valid_cluster_dscfg_exists - VALID_CLUSTER_DB=$? - OLD_VALID_CLUSTER_DB=$VALID_CLUSTER_DB - else - VALID_CLUSTER_DB=0 - fi -} - -# Checks if in cluster -# returns 1 if in cluster, else 0 -# -in_cluster() -{ - $xopt - - if [ -x /usr/sbin/clinfo ]; then - clinfo - if [ $? -eq 0 ]; then - return 1 - else - return 0 - fi - else - return 0 - fi -} - -# checks if a system is configured as a cluster -# returns 1 if configured as a cluster, 0 if not -# -cluster_configured() -{ - $xopt - - if [ -f /etc/cluster/nodeid ]; then - return 1 - else - return 0 - fi -} - -# Check the list of Sun Cluster device groups known in the dscfg, determing -# if they are currently enabled on this Sun Cluster node. If so, fail allowing -# the system administator to scswitch them elsewhere. -# -check_device_groups() -{ - $xopt - - if [ $VALID_CLUSTER_DB == 1 ]; then - DEVICE_GROUPS=`$DSCFG -s $FILE_LOC -l 2>/dev/null | \ - grep "^dsvol:" | cut -d' ' -f3 | sort | uniq | xargs` - for x in $DEVICE_GROUPS - do - $DSCFG -D $x 2>/dev/null - if [ $? -eq 1 ] - then - IN_USE="$IN_USE $x" - fi - done - - if [ -n "$IN_USE" ] - then - print "The following Sun Cluster device groups are in use " - print "by Availability Suite on this node." - print "" - print "$IN_USE" - print "" - print "'scswitch' them to another Sun Cluster node before " - print "attempting to disable any data services." - return 1 - else - return 0 - fi - fi - - return 0 -} - -# checks to see if this is a char device in the -# /dev/did/rdsk directory returns 1 if so. -# -is_did_device() -{ - $xopt - - DID=`echo $1 | awk -F/ '{print $3}'` - RDSK=`echo $1 | awk -F/ '{print $4}'` - - if [ "did" = $DID -a "rdsk" = $RDSK -a -c $1 ]; then - return 1 - else - return 0 - fi -} - -# -# checks size of area for db location -# -check_size() -{ - $xopt - - # if in cluster look for d*s* - SLICE=`echo $1 | sed -n 's/.*d.*s\(.*\)/\1/p'` - - SECTORS=`prtvtoc $1 | tr -s ' '| grep "^ $SLICE " | awk '{print $5}'` - - if [ -z "$SECTORS" ]; then - echo "SLICE at $1 not found on this device" - return 0 - fi - - # if required size is greater than space available, then fail - if [ $REQUIRED -gt $SECTORS ]; then - return 0 - else - return 1 - fi -} - -# looks in dscfg_cluster reference file. if a location is configured, -# tests to see if it is a valid database. if so, returns 1 -# -valid_cluster_dscfg_exists() -{ - $xopt - - if [ -s $CLUSTER_REF ]; then - FILE_LOC=`head -1 $CLUSTER_REF` - contains_data $FILE_LOC - return $? - else - return 0 - fi -} - - -# checks for the existence of dscfg_local database, and if it exists, -# tests to see if it is a valid database. if so, returns 1 -# -valid_local_dscfg_exists() -{ - $xopt - - if [ -s $LOCAL_DSCFG ]; then - contains_data $LOCAL_DSCFG - return $? - else - return 0 - fi -} - -# used to test if a valid DS config database exists on machine already -# MAGIC_STRING is the top line in the config used in v3.1 & v3.2 -# -contains_data() -{ - $xopt - - # dscfg distinct strings, varies on the architecture - if [ $ARCH = "sparc" ] - then - MAGIC_STRING="MAGI" - elif [ $ARCH = "i386" ] - then - MAGIC_STRING="IGAM" - fi - - # Create a PID unique temporary file - TMP_FILE=/tmp/$$ - - # Write the first or 16th block (skipping over VTOC) to - # the TMP_FILE, then scan for the presence of the "MAGI" - # - for offset in 0 16 - do - if [ ! -z "$1" ]; then - dd if=$1 of=$TMP_FILE count=1 iseek=$offset 2>/dev/null - FILECONTENTS=`strings $TMP_FILE | head -1 2>/dev/null` - if [ `echo $FILECONTENTS | grep -c "$MAGIC_STRING"` -gt 0 ]; then - rm $TMP_FILE - return 1 - fi - fi - done - - rm $TMP_FILE - return 0 -} - -########################## ALL LOCATION TESTS ######################## - - -########################## MAIN FUNCTIONS ############################ - -# since location already has been set, asks what to do now? keeping -# it still checks the size (since an upgrade from 3.0 may still be -# occuring) and also checks if was an old cluster config on disallowed -# /dev/did/dsk directory -# -# returns: -# 0 if cluster location is invalid or the user does not want to keep it -# 1 if the location is valid and the user wants to keep it. -# -keep_it() -{ - $xopt - - NOTE="\nThe Sun StorageTek Data Services database configuration" - NOTE="$NOTE location has already been set." - echo $NOTE - - echo "\nCurrent location: $PKG_INSTALL_ROOT$FILE_LOC" - - QUEST="Would you like to preserve the existing configuration" - QUEST="$QUEST information at its current location? " - - ANS=`ckyorn -Qd n -p "$QUEST"` - - case $ANS in - y|Y|yes|YES|Yes) - #Since the user has said "yes I want to keep this current one" - #it may actually be a 3.x database, which only required 4.5mb - #space, so now will check that there is room to grow another 1mb" - check_location $FILE_LOC - if [ $? = 0 ]; then - error "$CLUST_LOC_MESS" - return 0 - else - OLD_FILE_LOC=$FILE_LOC - FILE_LOC=$NULL - return 1 - fi - ;; - *) - return 0 - ;; - esac -} - -# -# asks if user wants to keep existing db information, overwrite with -# a new db, or view the contents, and be asked again... -# returns: -# 0 if old location is bad -# 1 if old location is good -# -preserve_overwrite_maybe() -{ - $xopt - - echo "\nIt appears a valid database configuration exists here already." - - while true - do - SAFE_LOC=$FILE_LOC - - echo "\nWould you like to preserve this information and continue?" - echo "\ty - preserve current configuration" - echo "\tn - overwrite with new configuration" - echo "\tmaybe - view contents of current configuration" - - ANS=`ckkeywd -Q y n maybe` - case $ANS in - y) - check_location $FILE_LOC - if [ $? = 0 ]; then - error "$CLUST_LOC_MESS" - return 0 - else - $DSCFG -s "$FILE_LOC" -C $CTAG_NULL >/dev/null 2>&1 - OLD_FILE_LOC=$FILE_LOC - FILE_LOC=$NULL - return 1 - fi - ;; - n) - check_location $FILE_LOC - if [ $? = 0 ]; then - error "$CLUST_LOC_MESS" - return 0 - else - return 1 - fi - ;; - - maybe) - # print contents of this db config. - echo "\nContents of database configuration found at $SAFE_LOC are:" - $DSCFG -l -s "$FILE_LOC" | more - FILE_LOC=$SAFE_LOC - continue - ;; - esac - done -} - -# gets location from user -# -get_location() -{ - $xopt - - #Checks for absolute path name, and if file name and file doesn't - #exist, creates it. - echo "\n\n----------ENTER DATABASE CONFIGURATION LOCATION-----------------" - echo "Note: Please ensure this location meets all requirements specified" - echo "in the Availability Suite Installation Guide." - - FILE_LOC=`ckpath -artwQ -p "Enter location:"` - if [ $? = 1 ] - then - exit 1 - fi - - # allow non-root user to access for least privileges - chmod 666 $FILE_LOC -} - - -# -# tests for proper config -# -# returns: -# 0 if bad location -# 1 if good location -# -check_location() -{ - $xopt - - # set to FILE_LOC - LOCATION=$1 - - did_clust_msg="You are in cluster and $LOCATION is not valid DID device" - - # Set "actual file location" variable here to equal file location - # entered by user because getting here means contains_data was already - # successfully called before and now the two can equal each other for - # future testing. - - SAFE_LOC=$FILE_LOC - - if [ $IN_CLUSTER = 1 -o $CLUSTER_CONFIGURED = 1 ]; then - if [ -b "$LOCATION" ] || [ -c "$LOCATION" ]; then - is_did_device $LOCATION - if [ $? = 0 ]; then - error "$did_clust_msg" - return 0 - fi - else - error "$did_clust_msg" - return 0 - fi - else - echo "Location may not be changed in a non Sun Cluster OE." 2>&1 - return 0 - fi - - check_size $LOCATION - - if [ $? != 1 ]; then - error "$LOCATION does not meet minimum space requirement." - return 0 - else - return 1 - fi -} - -# -# Notifies the user that the SMF services are online, -# and gives him the option to disable the services before proceeding. If -# the services are not disabled, the program cannot proceed with setting -# a new dscfg location. -# -ask_to_disable() -{ - $xopt - - echo "\ -\nYour services must be disabled before a new configuration location is set.\n" - - QUEST="Would you like to disable the services now and continue with the" - QUEST="$QUEST Availability Suite setup? " - - ANS=`ckyorn -Qd n -p "$QUEST"` - - case $ANS - in y|Y|yes|YES|Yes) - return 1 - ;; - *) - return 0 - ;; - esac -} - -# -# Asks the user if he would like to enable the services now. If so, -# import them (if necessary) and enable them. -# -ask_to_enable() -{ - $xopt - - echo "\ -\nIf you would like to start using the Availability Suite immediately, you may -start the SMF services now. You may also choose to start the services later -using the $PROG -e command." - - QUEST="Would you like to start the services now? " - - ANS=`ckyorn -Qd n -p "$QUEST"` - - case $ANS - in y|Y|yes|YES|Yes) - return 1 - ;; - *) - return 0 - ;; - esac -} - -# -# display information about the system -# -display_info() -{ - $xopt - - typeset grp_error_flg=0 - typeset -L15 svc state en SVC="SERVICE" STATE="STATE" EN="ENABLED" - echo "$SVC\t$STATE\t$EN" - - for i in $SMF_ENABLE - do - is_imported $i - if [ $? = 1 ] - then - state=`svcprop -c -p restarter/state \ - svc:/system/${i}:default` - en=`svcprop -c -p general/enabled \ - svc:/system/${i}:default` - check_fs_local_grouping $i - if [ $? -ne 0 ] - then - svc="${i}***" - grp_error_flg=$((grp_error_flg + 1)) - else - svc=$i - fi - - echo "$svc\t$state\t$en" - fi - done - - print "\nAvailability Suite Configuration:" - printf "Local configuration database: " - if [ $VALID_LOCAL_DB = 1 ] - then - print "valid" - else - print "invalid" - fi - - if [ $CLUSTER_CONFIGURED = 1 ] - then - printf "cluster configuration database: " - if [ $VALID_CLUSTER_DB = 1 ] - then - print "valid" - print "cluster configuration location: ${FILE_LOC}" - else - print "invalid" - fi - fi - - if [ $grp_error_flg -gt 0 ] - then - typeset p - typeset p_has - if [ $grp_error_flg -gt 1 ] - then - p="s" - p_has="have" - else - p="" - p_has="has" - fi - - printf "\n*** Warning: The service$p above $p_has an incorrect " - printf "dependency. To repair the\n" - printf "problem, run \"dscfgadm\".\n" - fi -} - -# -# initialize the local configuration database (only called if none exists) -# returns 0 if successful, 1 if failed -# -initialize_local_db() -{ - $xopt - - echo "Could not find a valid local configuration database." - echo "Initializing local configuration database..." - echo y | ${DSCFG} -i > /dev/null 2>&1 - ${DSCFG} -i -p ${PCONFIG} > /dev/null 2>&1 - - # Make sure the new location is initialized properly - valid_local_dscfg_exists - VALID_LOCAL_DB=$? - if [ $VALID_LOCAL_DB != 1 ] - then - echo "Unable to initialize local configuration database" >&2 - return 1 - else - echo "Successfully initialized local configuration database" - fi - - return 0 -} - -# -# initialize the cluster configuration database, if necessary -# returns 0 if successful, 1 if failed -# -initialize_cluster_db() -{ - $xopt - - if [ ! -n "$FILE_LOC" ] - then - return 0 - fi - - echo "Initializing cluster configuration database..." - ${DSCFG} -s ${FILE_LOC} -C $CTAG_NULL > /dev/null 2>&1 - echo y | ${DSCFG} -i -C $CTAG_NULL > /dev/null 2>&1 - ${DSCFG} -i -p ${PCONFIG} -C $CTAG_NULL > /dev/null 2>&1 - - # make sure the cluster db is valid now - valid_cluster_dscfg_exists - VALID_CLUSTER_DB=$? - if [ $VALID_CLUSTER_DB != 1 ] - then - echo "Unable to initialize cluster configuration database" >&2 - return 1 - else - echo "Successfully initialized cluster configuration database" - fi - - return 0 - -} - -# -# prompt the user for a config location and set AVS to use that location -# -set_cluster_config() -{ - -$xopt - -REPEAT=0 -while [ $REPEAT -eq 0 ]; do - # See if user has entered location already, and it was an existing - # db. Retruns FILE_LOC value - if [ $VALID_DB_ENTERED = 1 ]; then - - # reset - VALID_DB_ENTERED=0 - preserve_overwrite_maybe - - # if 1, location passes, and FILE_LOC being passed to end, else - # set VALID_CLUSTER_DB to 0 since the "valid one" isn't valid anymore - # (bad size, etc) thereby when looping go straight to get_location - if [ $? = 1 ]; then - REPEAT=1 - continue - else - VALID_CLUSTER_DB=0 - continue - fi - fi - - # if 1, then valid db exists, now see what user wants to do - if [ $VALID_CLUSTER_DB = 1 ]; then - SAFE_LOC=$FILE_LOC - keep_it - - # if 0, then user can't or won't keep location. set PROMPT - # so we will get new location from user. - if [ $? = 0 ]; then - PROMPT=0 - else - PROMPT=1 - fi - fi - - # if either are 0, then user wants or needs new db as outlined in - # earlier comments - if [ $VALID_CLUSTER_DB = 0 ] || [ $PROMPT = 0 ]; then - # - # We cannot proceed if the services are running. Give the user - # a chance to stop the services. If he chooses not to, bail. - # - check_enabled - if [ $? = 1 ] - then - show_enabled - ask_to_disable - if [ $? = 0 ] - then - echo "A new configuration location was not set." - exit 1 - else - disable_services - if [ $? != 0 ] - then - exit 1 - fi - fi - - fi - - get_location - contains_data $FILE_LOC - - # if 1, then user entered an existsing db location, loop - # back to ask what to do with it - if [ $? = 1 ]; then - VALID_DB_ENTERED=1 - continue - else - check_location $FILE_LOC - - # if 0, that means location has failed, loop and - # get_location again - if [ $? = 0 ]; then - VALID_CLUSTER_DB=0 - continue - fi - # entered location passes tests - REPEAT=1 - continue - fi - else - # user wants to leave location where and how it is - # FILE_LOC being passed all the way to end - REPEAT=1 - continue - fi -done - -} - -########################## MAIN FUNCTIONS ############################ - -######################## SMF HELPER FUNCTIONS ######################## -# -# check if any SMF service is online (enabled) -# -check_enabled() -{ - $xopt - typeset ret=0 - typeset svc - - for svc in $SMF_ENABLE - do - is_enabled $svc - eval ${svc}_enabled=$? - ret=$((ret | ${svc}_enabled)) - done - - return $ret -} - -# -# Display which services are enabled. (Must be called after check_enabled) -# -show_enabled() -{ - $xopt - typeset svc - - echo "\nThe following Availability Suite services are enabled:" - - for svc in $SMF_ENABLE - do - if (( ${svc}_enabled == 1 )) - then - printf "$svc " - fi - done - - echo "" -} - - -# -# check if the given SMF service is online (enabled) -# -# $1: service name to check for -# -is_enabled() -{ - $xopt - typeset en - - is_imported $1 - if [ $? = 1 ] - then - en=`svcprop -c -p general/enabled svc:/system/${1}:default` - if [ $en = "true" ] - then - return 1 - fi - fi - - return 0 - -} - -# -# If necessary, flag no dependency check -# -no_depend_check() -{ - $xopt - typeset pid - typeset msg=0 - - if [ $OS_MINOR -lt 11 ] - then - if [ -f $DSCFG_DEPEND_NOCHK ] - then - pid=`cat $DSCFG_DEPEND_NOCHK` - echo "Another dscfgadm disable is in progress." - echo "Waiting for pid: $pid to terminate..." - - while [ -f $DSCFG_DEPEND_NOCHK ] - do - if (( msg && (msg % 6 == 0))) - then - printf "\nAnother dscfgadm disable " - printf "(pid: $pid) still appears to " - printf " be in progress.\n" - printf "If this is not the case, you " - printf "may remove " - printf "$DSCFG_DEPEND_NOCHK.\n" - fi - sleep 5 - msg=$((msg + 1)) - done - fi - - touch $DSCFG_DEPEND_NOCHK - echo $$ >> $DSCFG_DEPEND_NOCHK - fi -} - -# -# If necessary, remove the no dependency check flag -# -rm_no_depend_check() -{ - $xopt - if [ $OS_MINOR -lt 11 ] - then - rm -f $DSCFG_DEPEND_NOCHK - fi -} - -# -# set the filesystem/local dependency type and refresh -# -# $1: service name -# $2: either "require_all" or "optional_all" -# -set_fs_local_grouping() -{ - $xopt - typeset svc=$1 - typeset dep_group=$2 - - # set proper dependency type for fs-local - if [ $svc != nws_rdcsyncd ]; then - svccfg -s $FS_LOCAL_SVC setprop \ - ${svc}-local-fs/grouping=$dep_group - if [ $? -ne 0 ] - then - printf "command failed: svccfg -s $FS_LOCAL_SVC " - printf "setprop ${svc}-local-fs/grouping=$dep_group " - printf ">&2\n" - return 1 - fi - - # we need local-fs to know about the new grouping attributes - svcadm refresh ${FS_LOCAL_SVC}:default - if [ $? -ne 0 ] - then - print "Failed to refresh ${FS_LOCAL_SVC} >&2" - return 1 - fi - fi - - return 0 -} - -# -# check if the grouping dependency type for filesystem/local is correct -# -# input: -# $1: service name -# -# returns: -# 0 if the setting is correct -# 1 if the setting is incorrect -# outputs: sets CORRECT_GROUPING with the value of what the grouping should be. -# -check_fs_local_grouping() -{ - $xopt - typeset svc=$1 - typeset cur_grouping - - if [ $svc = nws_rdcsyncd ] - then - return 0 - fi - - # If it's not imported, we just return success, since we don't want - # further processing - is_imported $svc - if [ $? = 0 ] - then - return 0 - fi - - # get the current grouping value from the repository - cur_grouping=`svcprop -c -p ${svc}-local-fs/grouping $FS_LOCAL_SVC` - - # Figure out what the grouping should be (based on enabled status) - is_enabled $svc - if [ $? = 1 ] - then - CORRECT_GROUPING="require_all" - else - CORRECT_GROUPING="optional_all" - fi - - if [ "$cur_grouping" != "$CORRECT_GROUPING" ] - then - # grouping is incorrect - return 1 - else - # grouping is just fine - return 0 - fi -} - -# -# enable/disable the given SMF service. Also, update the filesystem-local -# dependency, if appropriate. -# -# $1: service name to check for -# $2: "enable" or "disable" -# -svc_operation() -{ - $xopt - typeset svc=$1 - typeset command=$2 - typeset enable_state - typeset dep_group - - # If disabling, then enable_state better be true, and we are - # transitioning to "option_all" grouping - if [ $command = "disable" ] - then - enable_state=1 - dep_group="optional_all" - - # If enabling, then enable_state better be false, and we are - # transitioning to "require_all" grouping - elif [ $command = "enable" ] - then - enable_state=0 - dep_group="require_all" - else - echo "invalid command: $command" >&2 - fi - - is_imported $svc - if [ $? = 1 ] - then - is_enabled $svc - if [ $? = $enable_state ] - then - if [ $enable_state -eq 1 ] - then - # we're doing a disable--remove hard dependency - set_fs_local_grouping $svc $dep_group - if [ $? -ne 0 ] - then - return 1 - fi - fi - - svcadm $command -s svc:/system/$svc - if [ $? != 0 ] - then - echo "$svc failed to $command" >&2 - return 1 - fi - - if [ $enable_state -eq 0 ] - then - # we just did an enable--create hard dependency - set_fs_local_grouping $svc $dep_group - if [ $? -ne 0 ] - then - return 1 - fi - fi - - else - echo "$svc service already ${command}d... skipping" - fi - fi - - return 0 -} - -# -# This chart summarizes the behavior of the -r and -p sub-options for the -# -e and -d options. -# There are 5 possible states, and 5 transitions out of each state. -# -# states: (vertical axis) -# ------- -# 0: no services enabled -# C: one or both core services enabled (illegal state) -# R: both core services and RM services enabled -# P: both core services and PITC service enabled -# A: all services enabled -# -# transitions: (horizontal axis) -# ------------ -# +/-a: enable/disable, respectively, with neither -r nor -p -# +/-r: enable/disable, respectively, with -r flag -# +p: enable with -p flag -# -# The result of the function is the next state after the action has been -# successfully performed. -# -# +a | -a | +r | -r | +p | -# ++----+----+----+----+----+ -# ++----+----+----+----+----+ -# 0 || A | 0* | R | 0* | P | -# --++----+----+----+----+----+ -# C || A* | 0* | R | 0 | P | -# --++----+----+----+----+----+ -# R || A* | 0* | R* | 0 | A | -# --++----+----+----+----+----+ -# P || A* | 0* | A* | P* | P* | -# --++----+----+----+----+----+ -# A || A* | 0 | A* | P | A* | -# --++----+----+----+----+----+ -# -# *: warning message is displayed, stating that a service is already -# enabled/disabled. -# - -# enable the SMF services needed for the Availability Suite -# -enable_services() -{ - $xopt - typeset svc - - # first, import them if they have not yet been imported - import_services - - # if neither r_flag nor p_flag is set, enable all services - if (( (r_flag | p_flag) == 0 )) - then - for svc in $SMF_ENABLE - do - if ! svc_operation $svc enable - then - return 1 - fi - done - else - # figure out which services are enabled - check_enabled - - # First, make sure both core services are enabled - for svc in nws_scm nws_sv - do - if (( ${svc}_enabled == 0 )) && \ - ! svc_operation $svc enable - then - return 1 - fi - done - - if ((p_flag)) - then - if ! svc_operation nws_ii enable - then - return 1 - fi - fi - - if ((r_flag)) - then - for svc in nws_rdc nws_rdcsyncd - do - if ! svc_operation $svc enable - then - return 1 - fi - done - fi - - fi - - return 0 -} - -# -# disable the SMF services needed for the Availability Suite -# -disable_services() -{ - $xopt - typeset svc - - check_device_groups - if [ $? == 1 ] - then - return 1 - fi - - # This flags the shutdown scripts to not check to make sure the - # services' dependents have been disabled. The flag must be removed - # before returning from this function. - no_depend_check - - # NB: p_flag is not allowed for disables. II should not be - # disabled if sndr is enabled. If rdc is not enabled, disabling just - # II is equivalent to disabling all the remaining services. - - # If no flags passed in, just disable everything - if (( r_flag == 0 )) - then - for svc in $SMF_DISABLE - do - if ! svc_operation $svc disable - then - rm_no_depend_check - return 1 - fi - done - - # Now that we've disable the services, lets unload them - # from the Solaris kernel - # - modinfo | grep '(nws:' | grep -v "kRPC Stub" | sort -r | cut -d' ' -f1 | xargs -l modunload -i 2>/dev/null - modinfo | grep '(nws:' | grep -v "kRPC Stub" | sort -r | cut -d' ' -f1 | xargs -l modunload -i 2>/dev/null - else - # we're disabling just rdc. If II is not already enabled, - # we disable core services, as well. - - # figure out which services are enabled - check_enabled - - for svc in nws_rdcsyncd nws_rdc - do - if ! svc_operation $svc disable - then - rm_no_depend_check - return 1 - fi - done - - if (( nws_ii_enabled == 0 )) - then - for svc in nws_sv nws_scm - do - if ((${svc}_enabled)) && \ - ! svc_operation $svc disable - then - rm_no_depend_check - return 1 - fi - done - fi - fi - - - rm_no_depend_check - return 0 -} - -# -# check if a service has been imported into the repository -# $1: service to check -# returns 1 if it is imported, 0 if it is not -# -is_imported() -{ - $xopt - - typeset svc=$1 - - svcprop -q -p general/entity_stability svc:/system/${svc} - if [ $? = 1 ] - then - return 0 - else - return 1 - fi -} - -# -# import the SMF services into the repository, if necessary -# -import_services() -{ - $xopt - typeset svc - - for svc in $SMF_ENABLE - do - import_service $svc - done -} - -# -# check to see if an SMF service is in the repository. If it is not, -# import it in. -# $1: name of service to import -# -import_service() -{ - $xopt - typeset svc=$1 - - is_imported $svc - if [ $? = 0 ] - then - if [ -f $PKG_INSTALL_ROOT/$MANIFEST_PATH/$svc.xml ] - then - svccfg import $PKG_INSTALL_ROOT/$MANIFEST_PATH/$svc.xml - - if [ $OS_MINOR -lt 11 ] - then - # workaround for 6221374--let local-fs know - # that it depends on us. - svcadm refresh ${FS_LOCAL_SVC}:default - fi - fi - fi -} - - -########################## MAIN ###################################### - -# getopt processing -enable=0 -disable=0 -set_location=0 -get_info=0 -r_flag=0 -p_flag=0 -while getopts "xedsirp" opt 2>/dev/null -do - case $opt in - \?) - help - ;; - e) - enable=1 - ;; - d) - disable=1 - ;; - x) - xopt="set -x" - set -x - ;; - s) - set_location=1 - ;; - i) - get_info=1 - ;; - r) - r_flag=1 - ;; - p) - p_flag=1 - ;; - esac -done - -# at most one option (besides -x) may be specified at a time -options_count=$((enable + disable + set_location + get_info)) -if [ $options_count -gt 1 ] -then - help -elif [ $options_count = 0 ] -then - NO_ARGS=1 -fi - -if (( ((r_flag + p_flag) > 0) && ((enable | disable) == 0) )) -then - echo "-r and -p options may only be used with -d or -e options" >&2 - return 1 -elif (( p_flag && disable )) -then - echo "The -p option may not be used with the -d option" >&2 - return 1 -fi - - - -# set all the system information variables -get_system_state - -# if we're enabling, we need to make sure we have a valid dscfg out there. -if [ $enable = 1 -a $VALID_LOCAL_DB != 1 ] -then - echo "Cannot find a valid configuration database" >&2 - return 1 -fi - -if [ $NO_ARGS = 1 ] -then - - # only initialize the database if necessary - if [ $VALID_LOCAL_DB = 1 ]; then - echo "Local configuration database is already initialized." - else - initialize_local_db - if [ $? != 0 ]; then - return 1 - fi - fi - - if [ $CLUSTER_CONFIGURED = 1 ] - then - if [ $VALID_CLUSTER_DB = 1 ]; then - printf "Cluster configuration database is already " - printf "initialized.\n" - else - # ask the user for a cluster database location - set_cluster_config - - # initialize the new db - initialize_cluster_db - if [ $? != 0 ]; then - return 1 - fi - fi - - fi - - # make sure that the local filesystem dependency type is correct - for svc in $SMF_ENABLE - do - check_fs_local_grouping $svc - if [ $? -ne 0 ] - then - # NOTE: check_fs_local_grouping sets CORRECT_GROUPING - # To avoid this issue in the future, always administer - # the services using dscfgadm. - printf "Warning: Fixing dependency for $svc.\n" - set_fs_local_grouping $svc $CORRECT_GROUPING - if [ $? -ne 0 ] - then - return 1 - fi - fi - done - - # give the user the chance to startup AVS services, if not started - check_enabled - if [ $? = 1 ]; then - if [ $OLD_VALID_LOCAL_DB = 0 ]; then - printf "WARNING: AVS services are running on a system " - printf "which had no valid configuration\ndatabase\n" - fi - show_enabled - else - ask_to_enable - if [ $? = 1 ]; then - enable_services - if [ $? != 0 ] - then - return 1 - fi - fi - fi - -elif [ $enable = 1 ] -then - enable_services - if [ $? != 0 ] - then - return 1 - fi - -elif [ $disable = 1 ] -then - disable_services - if [ $? != 0 ] - then - return 1 - fi - -elif [ $get_info = 1 ] -then - display_info - -elif [ $set_location = 1 ] -then - if [ $CLUSTER_CONFIGURED = 1 ] - then - # ask the user for a cluster database location - set_cluster_config - - # initialize the new db - initialize_cluster_db - if [ $? != 0 ]; then - return 1 - fi - else - echo "$PROG -s is only available on Sun Cluster OE systems" >&2 - return 1 - fi -fi - -return 0 - - -########################## MAIN ###################################### - |