508 lines
13 KiB
Bash
Executable File
508 lines
13 KiB
Bash
Executable File
#!/bin/ksh
|
|
#
|
|
# SCRIPT: SSAidentify.ksh
|
|
#
|
|
# AUTHOR: Randy Michael
|
|
#
|
|
# DATE: 11/7/2007
|
|
#
|
|
# REV: 2.5.A
|
|
#
|
|
# PURPOSE: This script is used to turn on, or off, the
|
|
# identify lights on the system's SSA disks
|
|
#
|
|
# REV LIST:
|
|
# 11/27/2007: Added code to allow the user to turn on/off
|
|
# individual pdisk lights
|
|
#
|
|
# 12/10/2007: Added code to accept a combination of pdisks
|
|
# and hdisks. For each hdisk passed the script translates
|
|
# the hdisk# into the associated pdisk#(s).
|
|
#
|
|
# 12/10/2007: Added code to ALLOW using the currently VARIED ON
|
|
# Volume Group's disks (-v switch), as opposed to ALL DEFINED SSA disks,
|
|
# which is the default behavior. Very helpful in a HACMP environment.
|
|
#
|
|
# 12/11/2007: Added the "twirl" function to give the user feedback
|
|
# during long processing periods, i.e. translating a few hundred
|
|
# hdisks into associated pdisks. The twirl function is just a rotating
|
|
# cursor and it twirls during the translation processing.
|
|
|
|
|
|
# set -x # Uncomment to debug this script
|
|
|
|
SCRIPTNAME=$(basename $0)
|
|
|
|
##############################################
|
|
|
|
function usage
|
|
{
|
|
echo "\nUSAGE ERROR...
|
|
\nMAN PAGE ==> $SCRIPTNAME -?
|
|
\nTo Turn ALL Lights Either ON or OFF:
|
|
\nUSAGE: SSAidentify.ksh [-v] [on] [off]
|
|
EXAMPLE: SSAidentify.ksh -v on
|
|
\nWill turn ON ALL of the system's currently VARIED ON
|
|
SSA identify lights. NOTE: The default is all DEFINED SSA disks
|
|
\nTo Turn SPECIFIC LIGHTS Either ON or OFF Using EITHER
|
|
the pdisk#(s) AND/OR the hdisk#(s):
|
|
\nUSAGE: SSAidentify.ksh [on] [off] pdisk{#1} [hdisk{#2}]...
|
|
EXAMPLE: SSAidentify.ksh on hdisk36 pdisk44 pdisk47
|
|
\nWill turn ON the lights to all of the associated pdisk#(s)
|
|
that hdisk36 translates to and PDISKS pdisk44 and pdisk47.
|
|
\nNOTE: Can use all pdisks, all hdisks or BOTH hdisk
|
|
and pdisk together if you want..."
|
|
exit 1
|
|
}
|
|
|
|
##############################################
|
|
|
|
function man_page
|
|
{
|
|
MAN_FILE="/tmp/man_file.out"
|
|
>$MAN_FILE
|
|
|
|
# Text for the man page...
|
|
|
|
echo "\n\t\tMAN PAGE FOR SSAidentify.ksh SHELL SCRIPT\n
|
|
This script is used to turn on, or off, the system's SSA disk drive
|
|
identification lights. You can use this script in the following ways:\n
|
|
To turn on/off ALL DEFINED SSA drive identification lights, ALL VARIED-ON SSA
|
|
drive identification lights (-v switch), AN INDIVIDUAL SSA drive identification
|
|
light or A LIST OF SSA drive identification lights.\n
|
|
SSA disk drives can be specified by EITHER the pdisk OR the hdisk, or
|
|
a COMBINATION OF BOTH. The script translates all hdisks into the
|
|
associated pdisk(s) using the system's /usr/sbin/ssaxlate command and turns
|
|
the SSA identification light on/off using the system's /usr/sbin/ssaidentify
|
|
command.\n
|
|
|
|
This script has four switches that control its' action:\n
|
|
-? - Displays this man page.\n
|
|
on - Turns the SSA identify light(s) ON.\n
|
|
off - Turns the SSA identify light(s) OFF.\n
|
|
-v - Specifies to only act on SSA disks which are in currently varied-on
|
|
volume groups. The default action is to act on ALL DEFINED SSA disks.\n
|
|
NOTE: This switch is ignored for turning on/off individual SSA drive lights,
|
|
only valid when turning on/off ALL lights. This option is very helpful in an
|
|
HACMP environment since ALL DEFINED, the default action, will turn on/off all
|
|
of the SSA drive lights even if the SSA disk is in a volume group which is not
|
|
currently varied-on. This can be confusing in an HA cluster.\n
|
|
Using this script is very straight forward. The following examples show the
|
|
correct use of this script:\n" >> $MAN_FILE
|
|
echo "\nUSAGE: SSAidentify.ksh [-v] [on] [off] [pdisk#/hdisk#] [pdisk#/hdisk# list]
|
|
\n\nTo Turn ALL Lights Either ON or OFF:
|
|
\nUSAGE: SSAidentify.ksh [-v] [on] [off]
|
|
\nEXAMPLE: $SCRIPTNAME on
|
|
\nWill turn ON ALL of the system's DEFINED SSA identify lights.
|
|
This is the default.
|
|
EXAMPLE: SSAidentify.ksh -v on
|
|
\nWill turn ON ALL of the system's currently VARIED ON
|
|
SSA identify lights. OVERRIDES THE DEFAULT ACTION OF ALL DEFINED SSA DISKS
|
|
\nTo Turn SPECIFIC LIGHTS Either ON or OFF Using EITHER
|
|
the pdisk#(s) AND/OR the hdisk#(s):
|
|
\nUSAGE: $SCRIPTNAME [on] [off] pdisk{#1} [hdisk{#2}]...
|
|
\nEXAMPLE: $SCRIPTNAME on hdisk36 pdisk44 pdisk47
|
|
\nWill turn ON the lights to all of the associated pdisk#(s)
|
|
that hdisk36 translates to and PDISKS pdisk44 and pdisk47.
|
|
\nNOTE: Can use all pdisks, all hdisks or BOTH hdisk
|
|
and pdisk together if you want...\n\n" >> $MAN_FILE
|
|
|
|
more $MAN_FILE
|
|
|
|
# End of man_page function
|
|
}
|
|
|
|
##############################################
|
|
|
|
function cleanup
|
|
{
|
|
echo "\n...Exiting on a trapped signal...EXITING STAGE LEFT...\n"
|
|
|
|
kill $TWIRL_PID
|
|
|
|
# End of cleanup function
|
|
}
|
|
|
|
##############################################
|
|
|
|
function twirl
|
|
{
|
|
TCOUNT="0" # For each TCOUNT the line twirls one increment
|
|
|
|
while : # Loop forever...until you break out of the loop
|
|
do
|
|
TCOUNT=$(expr ${TCOUNT} + 1) # Increment the TCOUNT
|
|
case ${TCOUNT} in
|
|
"1") echo '-'"\b\c"
|
|
sleep 1
|
|
;;
|
|
"2") echo '\\'"\b\c"
|
|
sleep 1
|
|
;;
|
|
"3") echo "|\b\c"
|
|
sleep 1
|
|
;;
|
|
"4") echo "/\b\c"
|
|
sleep 1
|
|
;;
|
|
*) TCOUNT="0" ;; # Reset the TCOUNT to "0", zero.
|
|
esac
|
|
done
|
|
# End of twirl finction
|
|
}
|
|
|
|
############################################
|
|
|
|
function kill_twirl
|
|
{
|
|
kill `jobs -p` 2>/dev/null
|
|
# End of kill_twirl function
|
|
}
|
|
|
|
############################################
|
|
function all_defined_pdisks
|
|
|
|
{
|
|
# TURN ON/OFF ALL LIGHTS:
|
|
# Loop through each of the system.s pdisks by using the "lsdev"
|
|
# command with the "-Cc pdisk" switch while using "awk" to extract
|
|
# out the actual pdisk number. We will either
|
|
# turn the identifier lights on or off, specified by the
|
|
# $SWITCH variable:
|
|
#
|
|
# Turn lights on: -y
|
|
# Turn lights off: -n
|
|
#
|
|
# as the $SWITCH value to the "ssaidentify" command, as used below...
|
|
|
|
echo "\nTurning $STATE ALL of the system.s pdisks...Please Wait...\n"
|
|
|
|
for PDISK in $(lsdev -Cc pdisk -s ssar -H | awk .{print $1}. | grep pdisk)
|
|
do
|
|
echo "Turning $STATE ==> $PDISK"
|
|
ssaidentify -l $PDISK -${SWITCH} || echo "Turning $STATE $PDISK Failed"
|
|
done
|
|
echo "\n...TASK COMPLETE...\n"
|
|
|
|
}
|
|
|
|
############################################
|
|
|
|
function all_varied_on_pdisks
|
|
{
|
|
trap 'kill -9 $TWIRL_PID; return 1' 1 2 3 15
|
|
|
|
cat /dev/null > $HDISKFILE
|
|
|
|
echo "\nGathering a list of Varied on system SSA disks...Please wait...\c"
|
|
|
|
VG_LIST=$(lsvg -o) # Get the list of Varied ON Volume Groups
|
|
|
|
for VG in $(echo $VG_LIST)
|
|
do
|
|
lspv | grep $VG >> $HDISKFILE # List of Varied ON PVs
|
|
done
|
|
|
|
twirl & # Gives the user some feedback during long processing times...
|
|
|
|
TWIRL_PID=$!
|
|
|
|
echo "\nTranslating hdisk(s) into the associated pdisk(s)...Please Wait... \c"
|
|
|
|
for DISK in $(cat $HDISKFILE) # Translate hdisk# into pdisk#(s)
|
|
do
|
|
# Checking for an SSA disk
|
|
/usr/sbin/ssaxlate -l $DISK # 2>/dev/null 1>/dev/null
|
|
|
|
if (($? == 0))
|
|
then
|
|
/usr/sbin/ssaxlate -l $DISK >> $PDISKFILE # Add to pdisk List
|
|
fi
|
|
done
|
|
|
|
kill -9 $TWIRL_PID # Kill the user feedback function...
|
|
echo "\b "
|
|
|
|
echo "\nTurning $STATE all VARIED-ON system pdisks...Please Wait...\n"
|
|
|
|
for PDISK in $(cat $PDISKFILE)
|
|
do # Act on each pdisk individually...
|
|
echo "Turning $STATE ==> $PDISK"
|
|
/usr/sbin/ssaidentify -l $PDISK -${SWITCH} || echo "Turning $STATE $PDISK Failed"
|
|
done
|
|
|
|
echo "\n\t...TASK COMPLETE...\n"
|
|
}
|
|
|
|
############################################
|
|
|
|
function list_of_disks
|
|
{
|
|
# TURN ON/OFF INDIVDUAL LIGHTS:
|
|
# Loop through each of the disks that was passed to this script
|
|
# via the positional parameters greater than $1, i.e., $2, $3, $4...
|
|
# We first determine if each of the parameters is a pdisk or an hdisk.
|
|
# For each hdisk passed to the script we first need to translate
|
|
# the hdisk definition into a pdisk definition. This script has
|
|
# been set up to accept a combination of hdisks and pdisks.
|
|
#
|
|
# We will either turn the identifier lights on or off, specified by
|
|
# the $SWITCH variable for each pdisk#:
|
|
#
|
|
# Turn lights on: -y
|
|
# Turn lights off: -n
|
|
#
|
|
# as the $SWITCH value to the "ssaidentify" command.
|
|
|
|
echo "\n"
|
|
|
|
# The disks passed to this script can be all hdisks, all pdisks
|
|
# or a combination of pdisks and hdisks; it just does not matter.
|
|
# We translate each hdisk into the associated pdisk(s).
|
|
|
|
echo "\nTurning $STATE individual SSA disk lights...\n"
|
|
|
|
for PDISK in $PDISKLIST
|
|
do
|
|
# Is it a real pdisk??
|
|
if [ -c /dev/${PDISK} ] 2>/dev/null
|
|
then # Yep - act on it...
|
|
|
|
/usr/sbin/ssaidentify -l $PDISK -${SWITCH}
|
|
if [ $? -eq 0 ]
|
|
then
|
|
/usr/bin/ssaxlate -l $PDISK -${SWITCH}
|
|
if (($? == 0))
|
|
then
|
|
echo "Light on $PDISK is $STATE"
|
|
else
|
|
echo "Turning $STATE $PDISK Failed"
|
|
fi
|
|
fi
|
|
else
|
|
echo "\nERROR: $PDISK is not a defined device on $THISHOST\n"
|
|
fi
|
|
done
|
|
|
|
echo "\n...TASK COMPLETE...\n"
|
|
}
|
|
|
|
############################################
|
|
############# BEGINNING OF MAIN ############
|
|
############################################
|
|
|
|
# Set a trap...
|
|
|
|
# Remember...Cannot trap a "kill -9" !!!
|
|
|
|
trap 'cleanup; exit 1' 1 2 3 15
|
|
|
|
##############################################
|
|
|
|
# Check for the correct number of arguments (1)
|
|
|
|
if (($# == 0))
|
|
then
|
|
usage
|
|
fi
|
|
|
|
##############################################
|
|
|
|
# See if the system has any pdisks defined before proceeding
|
|
|
|
PCOUNT=$(lsdev -Cc pdisk -s ssar | grep -c pdisk)
|
|
|
|
if ((PCOUNT == 0))
|
|
then
|
|
echo "\nERROR: This system has no SSA disks defined\n"
|
|
echo "\t\t...EXITING...\n"
|
|
exit 1
|
|
fi
|
|
|
|
##############################################
|
|
|
|
# Make sure that the ssaidentify program is
|
|
# executable on this system...
|
|
|
|
if [ ! -x /usr/sbin/ssaidentify ]
|
|
then
|
|
echo "\nERROR: /usr/sbin/ssaidentify is NOT an executable"
|
|
echo "program on $THISHOST"
|
|
echo "\n...EXITING...\n"
|
|
exit 1
|
|
fi
|
|
|
|
##############################################
|
|
|
|
# Make sure that the ssaxlate program is
|
|
# executable on this system...
|
|
|
|
if [ ! -x /usr/sbin/ssaxlate ]
|
|
then
|
|
echo "\nERROR: /usr/sbin/ssaxlate is NOT an executable"
|
|
echo "program on $THISHOST"
|
|
echo "\n...EXITING...\n"
|
|
exit 1
|
|
fi
|
|
|
|
##############################################
|
|
##############################################
|
|
#
|
|
# Okay, we should have valid data at this point
|
|
# Let.s do a light show.
|
|
#
|
|
##############################################
|
|
##############################################
|
|
|
|
# Always use the UPPERCASED value for the $STATE, $MODE,
|
|
# and $PASSED variables...
|
|
|
|
typeset -u MODE
|
|
MODE="DEFINED_DISKS"
|
|
typeset -u STATE
|
|
STATE=UNKNOWN
|
|
typeset -u PASSED
|
|
|
|
# Use lowercase for the argument list
|
|
typeset -l ARGUMENT
|
|
|
|
# Grab the system hostname
|
|
|
|
THISHOST=$(hostname)
|
|
|
|
# Define the hdisk and pdisk FILES
|
|
|
|
HDISKFILE="/tmp/disklist.out"
|
|
>$HDISKFILE
|
|
PDISKFILE="/tmp/pdisklist.identify"
|
|
>$PDISKFILE
|
|
|
|
# Define the hdisk and pdisk list VARIABLES
|
|
|
|
HDISKLIST=
|
|
PDISKLIST=
|
|
|
|
# Use getopts to parse the command-line arguments
|
|
|
|
while getopts ":vV" ARGUMENT 2>/dev/null
|
|
do
|
|
case $ARGUMENT in
|
|
v|V) MODE="VARIED_ON"
|
|
;;
|
|
\?) man_page
|
|
;;
|
|
esac
|
|
done
|
|
|
|
##############################################
|
|
|
|
# Decide if we are to turn the lights on or off...
|
|
|
|
(echo $@ | grep -i -w on >/dev/null) && STATE=ON
|
|
(echo $@ | grep -i -w off >/dev/null) && STATE=OFF
|
|
|
|
case $STATE in
|
|
|
|
ON)
|
|
# Turn all of the lights ON...
|
|
SWITCH="y"
|
|
;;
|
|
OFF)
|
|
# Turn all of the lights OFF...
|
|
SWITCH="n"
|
|
;;
|
|
*)
|
|
# Unknown Option...
|
|
echo "\nERROR: Please indicate the action to turn lights ON or OFF\n"
|
|
usage
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
##############################################
|
|
##############################################
|
|
########## PLAY WITH THE LIGHTS ##############
|
|
##############################################
|
|
##############################################
|
|
|
|
if (($# == 1)) && [[ $MODE = "DEFINED_DISKS" ]]
|
|
then
|
|
# This function will turn all lights on/off
|
|
|
|
all_defined_pdisks
|
|
|
|
elif [[ $MODE = "VARIED_ON" ]] && (($# = 2))
|
|
then
|
|
# This function will turn on/off SSA disk lights
|
|
# in currently varied-on volume groups only
|
|
|
|
all_varied_on_pdisks
|
|
|
|
# Now check for hdisk and pdisk arguments
|
|
|
|
elif [ $MODE = DEFINED_DISKS ] && (echo $@ | grep disk >/dev/null) \
|
|
&& (($# >= 2))
|
|
then
|
|
# If we are here we must have a list of hdisks
|
|
# and/or pdisks
|
|
|
|
# Look for hdisks and pdisks in the command-line arguments
|
|
|
|
for DISK in $(echo $@ | grep disk)
|
|
do
|
|
case $DISK in
|
|
hdisk*) HDISKLIST="$HDISKLIST $DISK"
|
|
;;
|
|
pdisk*) PDISKLIST="$PDISKLIST $DISK"
|
|
;;
|
|
*) : # No-Op - Do nothing
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ ! -z "$HDISKLIST" ]] # Check for hdisks to convert to pdisks
|
|
then
|
|
|
|
# We have some hdisks that need to be converted to pdisks
|
|
# so start converting the hdisks to pdisks
|
|
|
|
# Give the user some feedback
|
|
|
|
echo "\nConverting hdisks to pdisk definitions"
|
|
echo "\n ...Please be patient...\n"
|
|
|
|
# Start converting the hdisks to pdisks
|
|
|
|
for HDISK in $HDISKLIST
|
|
do
|
|
PDISK=$(ssaxlate -l $HDISK)
|
|
if (($? == 0))
|
|
then
|
|
echo "$HDISK translates to ${PDISK}"
|
|
else
|
|
echo "ERROR: hdisk to pdisk translation FAILED for $HDISK"
|
|
fi
|
|
|
|
# Build a list of pdisks
|
|
# Add pdisk to the pdisk list
|
|
|
|
PDISKLIST="$PDISKLIST $PDISK"
|
|
done
|
|
fi
|
|
|
|
if [[ -z "$PDISKLIST" ]]
|
|
then
|
|
echo "\nERROR: You must specify at least one hdisk or pdisk\n"
|
|
man_page
|
|
exit 1
|
|
else
|
|
# Turn on/off the SSA identification lights
|
|
|
|
list_of_disks
|
|
fi
|
|
fi
|
|
|
|
##############################################
|
|
# END OF SCRIPT #
|
|
##############################################
|