#!/bin/ksh93 # IBM_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # 61haes_r714 src/43haes/usr/sbin/cluster/utilities/err_convert.sh 1.13 # # Licensed Materials - Property of IBM # # COPYRIGHT International Business Machines Corp. 1998,2011 # All Rights Reserved # # US Government Users Restricted Rights - Use, duplication or # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. # # IBM_PROLOG_END_TAG # @(#)39 1.13 src/43haes/usr/sbin/cluster/utilities/err_convert.sh, hacmp.utils, 61haes_r714 11/28/11 15:25:13 ##################################################################### # # Name: err_convert # # Function: Creates an error log entry for an error label and a # resource that is either a resource specified by an # errnotify stanza or a volume group. # For all error labels except LVM_SA_QUORCLOSE, the # error log entry will look as follows: # resource name: errnotify.en_resource # detail data: none # otherwise no error is logged. # For LVM_SA_QUORCLOSE, the error log entry will look # as follows: # resource name: LVDD # detail data: hex string which encodes major and # minor number of the volume group # given as argument resource # Calls command ras_logger. Argument checking needs to # be somewhat strict to avoid a hang, since ras_logger # reads arguments interactively. # # Arguments: error label # # if error label != LVM_SA_QUORCLOSE # name of a errnotify stanza (errnotify.en_name) # if error label == LVM_SA_QUORCLOSE # name of a volume group # ##################################################################### PROGNAME=${0##*/} export PATH="$(/usr/es/sbin/cluster/utilities/cl_get_path all)" [[ $VERBOSE_LOGGING == high ]] && set -x [[ $VERBOSE_LOGGING == high ]] && version='1.13 $Source: 61haes_r711 43haes/usr/sbin/cluster/utilities/err_convert.sh 1$' export LC_ALL=C ERR_LABEL=$1 RESOURCE=$2 integer KERNEL_T integer KERNEL_M # : Check that the error label exists in the error record template # if [[ -z $(errpt -t -J $ERR_LABEL) ]] then echo "Error record template does not contain label $ERR_LABEL." echo "exit 1" exit 1 fi # : Determine if 32 or 64 bit kernel # KERNEL_T=$(bootinfo -K) if (( $KERNEL_T == 32 )) then KERNEL_M=0 elif (( $KERNEL_T == 64 )) then KERNEL_M=1 else # : should never happen # echo "Cannot determine value of 64-bit flag for command ras_logger" echo "exit 1" exit 1 fi case $ERR_LABEL in LVM_SA_QUORCLOSE ) # : first line of detail data contain major and minor number for the VG : in hexadecimal. The format differs between 32 and 64 bit kernel, : see /usr/include/sys/sysmacros.h : In 64 bit, the high order nibble of the major number is always 8. : The minor number for a volume group is always zero. # RESOURCE_NAME="LVDD" typeset -i10 VG_MAJ VG_MAJ=$(odmget -q "value3=$RESOURCE" CuDvDr | \ sed -n '/value1 =/s/.*"\(.*\)".*/\1/p') if [[ -z $VG_MAJ ]] then echo "Major number not found for volume group $RESOURCE" exit 1 fi # : Set up some variables to construct detail data string # typeset -i16 HEX16_MAJ (( HEX16_MAJ = $VG_MAJ )) HEX_MAJ=$(echo $HEX16_MAJ | sed 's/^16\#//') LENGTH_HEX_MAJ=${#HEX_MAJ} HEX_MAJ_ZEROES=0 # : Construct detail data string # if (( $KERNEL_M == 0 )) then # : 32 bit kernel. Format is : XXXX 0000 # (( LENGTH_DIFF_HEX_MAJ = 4 - LENGTH_HEX_MAJ )) typeset -RZ$LENGTH_DIFF_HEX_MAJ HEX_MAJ_ZEROES HEX_MIN=0000 DETAIL_DATA="$HEX_MAJ_ZEROES$HEX_MAJ$HEX_MIN" else # : 64 bit kernel. Format is : 8XXX XXXX 0000 0000 # typeset -i10 LENGTH_DIFF_HEX_MAJ (( LENGTH_DIFF_HEX_MAJ = 7 - $LENGTH_HEX_MAJ )) typeset -RZ$LENGTH_DIFF_HEX_MAJ HEX_MAJ_ZEROES HEX_MIN=00000000 DETAIL_DATA="8$HEX_MAJ_ZEROES$HEX_MAJ$HEX_MIN" fi # : log the error # /usr/lib/ras/ras_logger |& print -p $ERR_LABEL print -p $RESOURCE_NAME print -p $KERNEL_M print -p $DETAIL_DATA ;; LVM_IO_FAIL ) # : The detailed data contains the major and minor numbers of the : device that got the I/O error. The format differs between 32 : and 64 bit kernels. See /usr/include/sys/sysmacros.h : : A real LVM_IO_FAIL error log record actually contains other : detailed information, but clreserror only processes the device : major and minor numbers. # RESOURCE_NAME="LVDD" # : Extract the disk device major and minor numbers from ODM # typeset -i10 HDISK_MAJ typeset -i10 HDISK_MIN LC_ALL=C odmget -q "resource = devno and value3 = $RESOURCE" CuDvDr | grep -w 'value[12]' | sed 's/.*"\(.*\)".*/\1/' | paste -s - | read HDISK_MAJ HDISK_MIN if [[ -z $HDISK_MAJ || -z $HDISK_MIN ]] then echo "Major, minor numbers not found for hdisk $RESOURCE" exit 1 fi # : Set up some variables to construct detail data string # typeset -i16 HEX16_MAJ (( HEX16_MAJ = $HDISK_MAJ )) HEX_MAJ=$(echo $HEX16_MAJ | sed 's/^16\#//') LENGTH_HEX_MAJ=${#HEX_MAJ} HEX_MAJ_ZEROES=0 typeset -i16 HEX16_MIN (( HEX16_MIN = $HDISK_MIN )) HEX_MIN=$(echo $HEX16_MIN | sed 's/^16\#//') LENGTH_HEX_MIN=${#HEX_MIN} HEX_MIN_ZEROES=0 # : Construct detail data string # if (( $KERNEL_M == 0 )) then # : 32 bit kernel. Format is : XXXX YYYY # (( LENGTH_DIFF_HEX_MAJ = 4 - LENGTH_HEX_MAJ )) typeset -RZ$LENGTH_DIFF_HEX_MAJ HEX_MAJ_ZEROES (( LENGTH_DIFF_HEX_MIN = 4 - LENGTH_HEX_MIN )) typeset -RZ$LENGTH_DIFF_HEX_MIN HEX_MIN_ZEROES DETAIL_DATA="$HEX_MAJ_ZEROES$HEX_MAJ$HEX_MIN_ZEROES$HEX_MIN" else # : 64 bit kernel. Format is : 8XXX XXXX YYYY YYYYY # typeset -i10 LENGTH_DIFF_HEX_MAJ (( LENGTH_DIFF_HEX_MAJ = 7 - $LENGTH_HEX_MAJ )) typeset -RZ$LENGTH_DIFF_HEX_MAJ HEX_MAJ_ZEROES typeset -i10 LENGTH_DIFF_HEX_MIN (( LENGTH_DIFF_HEX_MIN = 8 - $LENGTH_HEX_MIN )) typeset -RZ$LENGTH_DIFF_HEX_MIN HEX_MIN_ZEROES DETAIL_DATA="8$HEX_MAJ_ZEROES$HEX_MAJ$HEX_MIN_ZEROES$HEX_MIN" fi # : log the error # /usr/lib/ras/ras_logger |& print -p $ERR_LABEL print -p $RESOURCE_NAME print -p $KERNEL_M print -p $DETAIL_DATA ;; * ) # : Check that an error notification method exists # RESOURCE_NAME=$(odmget -q "en_name = $RESOURCE and en_label=$ERR_LABEL" errnotify | \ sed -n '/en_resource =/s/.*"\(.*\)".*/\1/p') # : the following values for errnotify.en_resource can occur but : are not handled by ras_logger. Set a resource name. : errnotify.en_resource="-" : AEN sets this as wildcard : errnotify.en_resource="" : legitimate value for this descriptor # if [[ -z $RESOURCE_NAME || $RESOURCE_NAME == "-" ]] then RESOURCE_NAME="EMULATE" fi # : log the error # /usr/lib/ras/ras_logger |& print -p $ERR_LABEL print -p $RESOURCE_NAME print -p $KERNEL_M ;; esac