#!/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
