#!/bin/ksh #******************************************************************************* # # NAME: symconf # SUMMARY: %description% # COMPONENT: solsysd # VERSION: 21 # UPDATE DATE: %date_modified: Fri Jul 25 09:05:33 1997 % # PROGRAMMER: %created_by: mgallagh % # # Copyright 1996, 1997 by Symbios Logic Inc. # # DESCRIPTION: # symconf is a shell script whose primary function is to generate the # rdriver.conf file used by the RDAC driver. A related function that it # performs is to inform the RDAC driver about certain bindings that it needs # to be aware of, i.e., module-lun to dev-pairs and HBA-target to module-lun. # # NOTES: # (to maintenance programmers:) the " | while read VAR do ... done # consstruct is used heavily in this script. After spending a great deal of # time trying to figure out why variables were losing their values, it was # discovered that the aforementioned construct invokes a sub-shell for the # while loop, meaning that variables used within the loop are distinct from # those outside the loop having the same name, and are furthermore, not # preserved. This is why files are used where it is necessary to pass a # value from within the loop to the containing part of the script. # # REFERENCE: # # CODING STANDARD WAIVERS: # #******************************************************************************* #******************************************************************************* # PROCEDURE: symconf (main) # SUMMARY: Generate rdriver.conf file and establish related bindings # # DESCRIPTION: # Below is the main procedure for symconf which, as described above, generates # the rdriver.conf and also informs the RDAC driver about certain bindings it # needs to know about, e.g., module-lun to dev-pairs and HBA-target to # module-lun. The output of symconf is written to stdout. # # SYNTAX: # symconf [ -a ] [ -c ] [ -d ] [ -i ] [ -l ] [ -n ] [ -v ] # -a - generate a version of the .conf file showing ALL LUNs, existent or not # -c - use as the reference for preserving user changes # -d - generate a .conf file for only # -i - perform "incremental" .conf rebuild (new devices only) # -l - configure "leaf" (i.e., "rdriver") entries (default mode) # -n - configure "nexus" (i.e., "rdnexus") entries (not used in 6.01 and later # -v - turn on shell trace (-x) # # NOTES: # # RETURNS: # 0 - successful termination # 1 - command line syntax error # 6 - failed to produce any output due to internal error # S Y M C O N F M A I N P R O C E D U R E CONF_FILE=/kernel/drv/rdriver.conf RMPARAMS_FILE=/etc/raid/rmparams MAXLUNS=`grep -v "^#" $RMPARAMS_FILE | grep System_MaxLunsPerController | cut -d= -f2` LUNLIST_ALL_LUNS="" LUN=0 while [ $LUN -lt $MAXLUNS ] do LUNLIST_ALL_LUNS=${LUNLIST_ALL_LUNS}"${LUN} " LUN=`expr $LUN + 1` done RM_HOME=`grep -v "^#" $RMPARAMS_FILE | grep System_RmHomeDirectory | cut -d= -f2` RM_BOOT_HOME=`grep -v "^#" $RMPARAMS_FILE | grep System_RmBootHomeDirectory | cut -d= -f2` RM_NAME_FILE=`grep -v "^#" $RMPARAMS_FILE | grep System_NamefileDirPath | cut -d= -f2` RM_RDAC_NODE_DIR=`grep -v "^#" $RMPARAMS_FILE | grep System_RdacChrDirectory | cut -d= -f2` RMDEVROOT=`grep -v "^#" $RMPARAMS_FILE | grep "System_AltDevDirRoot" | cut -d= -f2 | awk -F/ '{ ORS = "/"; for (i = NF; i > 1; --i) print $i; ORS = "\n"; print $1 }' | cut -d"/" -f3-32 | awk -F/ '{ ORS = "/"; for (i = NF; i > 1; --i) print $i; ORS = "\n"; print $1 }'` SOLARIS_DISKS_CMD=/usr/sbin/disks.std LAD=$RM_BOOT_HOME/lad SYMCONF=$RM_BOOT_HOME/rdacconfig DRIVER_NAME=rdriver USAGE="Usage: $0 [ -a ] [ -c ] [ -d ] [ -i ] [ -l ] [ -n ] [ -v ]" VERBOSE=FALSE CONFIGURE_NEXUS=FALSE CONFIGURE_LEAF=TRUE SPECIFIC_DEVICE="" LUNS_A="" LUNS_B="" BUS_WARNING="" set -- `getopt vanild:c: $* 2>/dev/null` if [ $? != 0 ] then echo $USAGE exit 1 fi for i in $* do case $i in -v) VERBOSE=TRUE; shift;; -a) ALL_LUNS=TRUE; shift;; -n) CONFIGURE_NEXUS=TRUE; CONFIGURE_LEAF=FALSE; shift;; -i) INCREMENTAL_CONFIG=TRUE; shift;; -l) CONFIGURE_LEAF=TRUE; CONFIGURE_NEXUS=FALSE; shift;; -d) SPECIFIC_DEVICE=$2; shift 2;; -c) CONF_FILE=$2; shift 2;; --) shift; break;; esac done if [ $VERBOSE = TRUE ] then set -x fi if [ \( $CONFIGURE_NEXUS = TRUE \) -a \( $CONFIGURE_LEAF = TRUE \) ] then echo $USAGE exit 1 fi if [ $CONFIGURE_NEXUS = TRUE ] then INSTANCES=`find /devices -print | grep "sd@" | awk -F@ '{ ORS = "@"; for (i = 1; i < NF-1; ++i) print $i; ORS="\n"; print $(NF-1) }' | uniq | /bin/wc -l` i=0 while [ $i -lt $INSTANCES ] do echo name=\"rdnexus\" parent=\"pseudo\" instance=$i\; i=`expr $i + 1` done exit 0 fi $LAD >/tmp/lad_out.$$ if [ "$SPECIFIC_DEVICE" != "" ] then # generate a single-controller list CTRL_TARG=`echo $SPECIFIC_DEVICE | cut -dd -f1` SERIAL_NO=`cat /tmp/lad_out.$$ | grep $CTRL_TARG | cut -d' ' -f2` LUN=`echo $SPECIFIC_DEVICE | cut -dd -f2 | cut -ds -f1` SERIAL_NO1=`cat $RM_NAME_FILE | grep $SERIAL_NO | cut -d~ -f2` SERIAL_NO2=`cat $RM_NAME_FILE | grep $SERIAL_NO | cut -d~ -f4` if [ "$SERIAL_NO" = "$SERIAL_NO1" ] then echo "module name~$SERIAL_NO1~ $LUN~$SERIAL_NO2~~$MODULE_NO~0~comment field~${CTRL_TARG}d${LUN}s0~${CTRL_TARG_NO2}d0s0~" >>/tmp/ctrls.$$ else echo "module name~$SERIAL_NO1~~$SERIAL_NO2~ $LUN~$MODULE_NO~0~comment field~${CTRL_TARG_NO1}d0s0~${CTRL_TARG}d${LUN}s0~" >>/tmp/ctrls.$$ fi else cat $RM_NAME_FILE >/tmp/ctrls.$$ 2>/dev/null fi # Extract the components of the root device name, if it is an RDAC device ROOTDEV=`grep -v '^*' /etc/system | grep "rootdev:" | grep $DRIVER_NAME` ROOT_PARENT=`echo "${ROOTDEV}" | cut -d/ -f3` ROOT_TARG=`echo "${ROOTDEV}" | cut -d@ -f3 | cut -d, -f1` ROOT_LUN=`echo "${ROOTDEV}" | cut -d, -f2 | cut -d: -f1` ROOTDEV_CF_ENTRY="lun=${ROOT_LUN} target=${ROOT_TARG} parent=\"/pseudo/${ROOT_PARENT}\"" # save unbound entries in case this is an incremental config grep "unbound" ${CONF_FILE} >/tmp/unbound.$$ echo "0" >/tmp/status.$$ cat /tmp/ctrls.$$ | while read CTRL_INFO do SERIAL_NO_A=`echo $CTRL_INFO | cut -d~ -f2` SERIAL_NO_B=`echo $CTRL_INFO | cut -d~ -f4` CTRL_TARG_A=`cat /tmp/lad_out.$$ | grep $SERIAL_NO_A | cut -dd -f1` A_PRESENT="${CTRL_TARG_A}" if [ -z "${A_PRESENT}" ] # controller A *not* present then CTRL_TARG_A=`cat $RM_NAME_FILE | grep $SERIAL_NO_A | cut -d~ -f9 | cut -dd -f1` fi if [ "$SERIAL_NO_B" != "" ] then CTRL_TARG_B=`cat /tmp/lad_out.$$ | grep $SERIAL_NO_B | cut -dd -f1` B_PRESENT="${CTRL_TARG_B}" if [ -z "${B_PRESENT}" ] # controller B *not* present then CTRL_TARG_B=`cat $RM_NAME_FILE | grep $SERIAL_NO_B | cut -d~ -f10 | cut -dd -f1` fi else CTRL_TARG_B="" B_PRESENT="" fi if [ -z "$A_PRESENT" ] && [ -z "$B_PRESENT" ] # neither A nor B present then continue fi if [ -n "$ALL_LUNS" ] then LUNS_A=$LUNLIST_ALL_LUNS LUNS_B=$LUNLIST_ALL_LUNS else HEX_LUNS_A=`echo $CTRL_INFO | cut -d~ -f3` HEX_LUNS_B=`echo $CTRL_INFO | cut -d~ -f5` LUNS_A="" LUNS_B="" for LUN in $HEX_LUNS_A do DECIMAL_LUN=`echo 0x$LUN=D | adb` LUNS_A="${LUNS_A} "$DECIMAL_LUN done for LUN in $HEX_LUNS_B do DECIMAL_LUN=`echo 0x$LUN=D | adb` LUNS_B="${LUNS_B} "$DECIMAL_LUN done fi MODULE_NO=`echo $CTRL_INFO | cut -d~ -f6` MODULE_NO=`expr $MODULE_NO / 64` MODULE_NO=`expr $MODULE_NO + 1` TARGET_A=`echo $CTRL_TARG_A | cut -dt -f2` TARGET_B=`echo $CTRL_TARG_B | cut -dt -f2` if [ "$TARGET_A" = "" ] then LUNS_B="${LUNS_A} "${LUNS_B} LUNS_A="" fi if [ "$TARGET_B" = "" ] then LUNS_A="${LUNS_A} "${LUNS_B} LUNS_B="" fi for LUN in $LUNS_A do if [ $LUN -ge $MAXLUNS ] then continue fi HBA_NBR=`echo $CTRL_TARG_A | cut -dc -f2 | cut -dt -f1` if [ $HBA_NBR -ge "32" ] && [ -z BUS_WARNING ] then BUS_WARNING="DONE" echo "WARNING: While generating the RDAC driver .conf file (rdriver.conf) more SCSI buses" echo " were found than are allowed for by the default pseudo bus driver (rdnexus)." echo " Please edit rdnexus.conf and add the additional bus entries" fi PARENT=/pseudo/rdnexus@$HBA_NBR TARGET=`echo $CTRL_TARG_A | cut -dt -f2` FULL_PATH_A=$CTRL_TARG_A\d$LUN\s0 if [ -c $RMDEVROOT/dev/rdsk/$FULL_PATH_A ] then DEV_A=`$SYMCONF -dev $RMDEVROOT/dev/rdsk/$FULL_PATH_A | cut -d' ' -f3` else DEV_A="ffffffff" fi FULL_PATH_B=$CTRL_TARG_B\d$LUN\s0 if [ -c $RMDEVROOT/dev/rdsk/$FULL_PATH_B ] then DEV_B=`$SYMCONF -dev $RMDEVROOT/dev/rdsk/$FULL_PATH_B | cut -d' ' -f3` else DEV_B="ffffffff" fi if [ "${DEV_A}" = "ffffffff" ] && [ "${DEV_B}" = "ffffffff" ] then continue fi CF_LINE=`grep "module=${MODULE_NO} lun=${LUN} ".*"dev_" ${CONF_FILE}` # if line doesn't already exist OR we're doing a complete rewrite ... if [ -z "${CF_LINE}" ] || [ -z "${INCREMENTAL_CONFIG}" ] then THIS_LUN_IS_ROOT=`echo "${CF_LINE}" | grep "${ROOTDEV_CF_ENTRY}"` # Effect of following "if" is to NOT change rootdev entry, even if we're rewriting file if [ -z "${THIS_LUN_IS_ROOT}" ] # if this LUN is NOT root ... then CF_LINE=`printf 'name="rdriver" module=%s lun=%s target=%s parent="%s" dev_a=0x%s dev_b=0x%s;\n' "$MODULE_NO" "$LUN" "$TARGET" "$PARENT" "$DEV_A" "$DEV_B"` # inform the rdriver about the module-lun / devs association $SYMCONF -config $RM_RDAC_NODE_DIR/rdac $MODULE_NO $LUN 0x$DEV_A 0x$DEV_B >/dev/null # establish HBA-target / module-lun association $RM_HOME/bin/bind_rd $MODULE_NO $LUN $TARGET $PARENT 2>/dev/null grep -v "module=${MODULE_NO} lun=${LUN} " /tmp/unbound.$$ >/tmp/unbound_new.$$ mv /tmp/unbound_new.$$ /tmp/unbound.$$ fi fi echo ${CF_LINE} >>/tmp/symconf_out.$$ done for LUN in $LUNS_B do if [ $LUN -ge $MAXLUNS ] then continue fi HBA_NBR=`echo $CTRL_TARG_B | cut -dc -f2 | cut -dt -f1` if [ $HBA_NBR -ge "32" ] && [ -z BUS_WARNING ] then BUS_WARNING="DONE" echo "WARNING: While generating the RDAC driver .conf file (rdriver.conf) more SCSI buses" echo " were found than are allowed for by the default pseudo bus driver (rdnexus)." echo " Please edit rdnexus.conf and add the additional bus entries" fi PARENT=/pseudo/rdnexus@$HBA_NBR TARGET=`echo $CTRL_TARG_B | cut -dt -f2` FULL_PATH_A=$CTRL_TARG_A\d$LUN\s0 if [ -c $RMDEVROOT/dev/rdsk/$FULL_PATH_A ] then DEV_A=`$SYMCONF -dev $RMDEVROOT/dev/rdsk/$FULL_PATH_A | cut -d' ' -f3` else DEV_A="ffffffff" fi FULL_PATH_B=$CTRL_TARG_B\d$LUN\s0 if [ -c $RMDEVROOT/dev/rdsk/$FULL_PATH_B ] then DEV_B=`$SYMCONF -dev $RMDEVROOT/dev/rdsk/$FULL_PATH_B | cut -d' ' -f3` else DEV_B="ffffffff" fi if [ "${DEV_A}" = "ffffffff" ] && [ "${DEV_B}" = "ffffffff" ] then continue fi CF_LINE=`grep "module=${MODULE_NO} lun=${LUN} ".*"dev_" ${CONF_FILE}` # if line doesn't already exist OR we're doing a complete rewrite ... if [ -z "${CF_LINE}" ] || [ -z "${INCREMENTAL_CONFIG}" ] then THIS_LUN_IS_ROOT=`echo "${CF_LINE}" | grep "${ROOTDEV_CF_ENTRY}"` # Effect of following "if" is to NOT change rootdev entry, even if we're rewriting file if [ -z "${THIS_LUN_IS_ROOT}" ] # if this LUN is NOT root ... then CF_LINE=`printf 'name="rdriver" module=%s lun=%s target=%s parent="%s" dev_a=0x%s dev_b=0x%s;\n' "$MODULE_NO" "$LUN" "$TARGET" "$PARENT" "$DEV_A" "$DEV_B"` # inform the rdriver about the module-lun / devs association $SYMCONF -config $RM_RDAC_NODE_DIR/rdac $MODULE_NO $LUN 0x$DEV_A 0x$DEV_B >/dev/null # establish HBA-target / module-lun association $RM_HOME/bin/bind_rd $MODULE_NO $LUN $TARGET $PARENT 2>/dev/null grep -v "module=${MODULE_NO} lun=${LUN} " /tmp/unbound.$$ >/tmp/unbound_new.$$ mv /tmp/unbound_new.$$ /tmp/unbound.$$ fi fi echo ${CF_LINE} >>/tmp/symconf_out.$$ done if [ -z "$SPECIFIC_DEVICE" ] && [ -z "$ALL_LUNS" ] && [ -z "${INCREMENTAL_CONFIG}" ] then >/tmp/unbound.$$ # discard prior unbound entries ABLUNS=`echo $LUNS_A $LUNS_B` for LUN in $LUNLIST_ALL_LUNS do if [ $LUN -ge $MAXLUNS ] then continue fi for LUNAB in $ABLUNS do if [ "$LUNAB" = "$LUN" ] then continue 2 fi done if [ "$CTRL_TARG_A" != "" ] then HBA_NBR=`echo $CTRL_TARG_A | cut -dc -f2 | cut -dt -f1` if [ $HBA_NBR -ge "32" ] && [ -z BUS_WARNING ] then BUS_WARNING="DONE" echo "WARNING: While generating the RDAC driver .conf file (rdriver.conf) more SCSI buses" echo " were found than are allowed for by the default pseudo bus driver (rdnexus)." echo " Please edit rdnexus.conf and add the additional bus entries" fi PARENT=/pseudo/rdnexus@$HBA_NBR TARGET=`echo $CTRL_TARG_A | cut -dt -f2` printf 'name="rdriver" module=%s lun=%s target=%s parent="%s" unbound=1;\n' "$MODULE_NO" "$LUN" "$TARGET" "$PARENT" >>/tmp/symconf_out.$$ fi if [ "$CTRL_TARG_B" != "" ] then HBA_NBR=`echo $CTRL_TARG_B | cut -dc -f2 | cut -dt -f1` if [ $HBA_NBR -ge "32" ] && [ -z BUS_WARNING ] then BUS_WARNING="DONE" echo "WARNING: While generating the RDAC driver .conf file (rdriver.conf) more SCSI buses" echo " were found than are allowed for by the default pseudo bus driver (rdnexus)." echo " Please edit rdnexus.conf and add the additional bus entries" fi PARENT=/pseudo/rdnexus@$HBA_NBR TARGET=`echo $CTRL_TARG_B | cut -dt -f2` printf 'name="rdriver" module=%s lun=%s target=%s parent="%s" unbound=1;\n' "$MODULE_NO" "$LUN" "$TARGET" "$PARENT" >>/tmp/symconf_out.$$ fi done fi done rm /tmp/module.$$ /tmp/ctrls.$$ /tmp/lad_out.$$ 2>/dev/null STATUS=`cat /tmp/status.$$` if [ -n "$SPECIFIC_DEVICE" ] then sort -n +1.7 -2.0 +2.4 -3.0 -o /tmp/symconf_out.$$ /tmp/symconf_out.$$ cat /tmp/symconf_out.$$ 2>/dev/null rm /tmp/symconf_out.$$ /tmp/status.$$ 2>/dev/null exit $STATUS fi # if things have gone badly, don't continue if [ $STATUS -ne 0 ] then rm /tmp/symconf_out.$$ /tmp/status.$$ 2>/dev/null exit $STATUS fi grep "^#!noauto_config" $CONF_FILE >>/tmp/globals.$$ grep "boot_config" $CONF_FILE >>/tmp/globals.$$ grep "class=\"scsi\"" $CONF_FILE >/tmp/wildcards.$$ if [ ! -s /tmp/wildcards.$$ ] then cat - <<-EOF >/tmp/wildcards.$$ # These entries allow rdriver to pick up anything not explicitly bound name="rdriver" class="scsi" target=0 lun=0; name="rdriver" class="scsi" target=0 lun=1; name="rdriver" class="scsi" target=0 lun=2; name="rdriver" class="scsi" target=0 lun=3; name="rdriver" class="scsi" target=0 lun=4; name="rdriver" class="scsi" target=0 lun=5; name="rdriver" class="scsi" target=0 lun=6; name="rdriver" class="scsi" target=0 lun=7; name="rdriver" class="scsi" target=1 lun=0; name="rdriver" class="scsi" target=1 lun=1; name="rdriver" class="scsi" target=1 lun=2; name="rdriver" class="scsi" target=1 lun=3; name="rdriver" class="scsi" target=1 lun=4; name="rdriver" class="scsi" target=1 lun=5; name="rdriver" class="scsi" target=1 lun=6; name="rdriver" class="scsi" target=1 lun=7; name="rdriver" class="scsi" target=2 lun=0; name="rdriver" class="scsi" target=2 lun=1; name="rdriver" class="scsi" target=2 lun=2; name="rdriver" class="scsi" target=2 lun=3; name="rdriver" class="scsi" target=2 lun=4; name="rdriver" class="scsi" target=2 lun=5; name="rdriver" class="scsi" target=2 lun=6; name="rdriver" class="scsi" target=2 lun=7; name="rdriver" class="scsi" target=3 lun=0; name="rdriver" class="scsi" target=3 lun=1; name="rdriver" class="scsi" target=3 lun=2; name="rdriver" class="scsi" target=3 lun=3; name="rdriver" class="scsi" target=3 lun=4; name="rdriver" class="scsi" target=3 lun=5; name="rdriver" class="scsi" target=3 lun=6; name="rdriver" class="scsi" target=3 lun=7; name="rdriver" class="scsi" target=4 lun=0; name="rdriver" class="scsi" target=4 lun=1; name="rdriver" class="scsi" target=4 lun=2; name="rdriver" class="scsi" target=4 lun=3; name="rdriver" class="scsi" target=4 lun=4; name="rdriver" class="scsi" target=4 lun=5; name="rdriver" class="scsi" target=4 lun=6; name="rdriver" class="scsi" target=4 lun=7; name="rdriver" class="scsi" target=5 lun=0; name="rdriver" class="scsi" target=5 lun=1; name="rdriver" class="scsi" target=5 lun=2; name="rdriver" class="scsi" target=5 lun=3; name="rdriver" class="scsi" target=5 lun=4; name="rdriver" class="scsi" target=5 lun=5; name="rdriver" class="scsi" target=5 lun=6; name="rdriver" class="scsi" target=5 lun=7; name="rdriver" class="scsi" target=6 lun=0; name="rdriver" class="scsi" target=6 lun=1; name="rdriver" class="scsi" target=6 lun=2; name="rdriver" class="scsi" target=6 lun=3; name="rdriver" class="scsi" target=6 lun=4; name="rdriver" class="scsi" target=6 lun=5; name="rdriver" class="scsi" target=6 lun=6; name="rdriver" class="scsi" target=6 lun=7; EOF fi touch /tmp/unbound.$$ if [ -s /tmp/symconf_out.$$ ] then sort -n +1.7 -2.0 +2.4 -3.0 -o /tmp/symconf_out.$$ /tmp/symconf_out.$$ /tmp/unbound.$$ cat /tmp/globals.$$ /tmp/symconf_out.$$ /tmp/wildcards.$$ else echo "6" >/tmp/status.$$ fi STATUS=`cat /tmp/status.$$` rm /tmp/globals.$$ /tmp/symconf_out.$$ /tmp/unbound.$$ /tmp/unbound_new.$$ /tmp/status.$$ /tmp/lunlist.$$ /tmp/wildcards.$$ 2>/dev/null exit $STATUS