#!/bin/sh
SCRIPT_NAME=`basename $0`
HOST_NAME=`hostname`
DATE_FLAG=`date +%Y%m%d%H`
GET_DATE_FLAG=`date +%Y%m%d`
TMP_DIR="/tmp/mul_dir_ald"
CONFIG_DIR="/etc/paic/check_disk"
DISK_EXCLUDE="${CONFIG_DIR}/disk.exclude"
DISK_PATH_ERROR="/tmp/check_lun_path.log"
TMP_LOG_ALL_LUN="${TMP_DIR}/all_disks_info_output"
TMP_LOG_ALL="${TMP_DIR}/all_disks_output"
MULTIPATH_CMD="/sbin/multipath"
PVSCAN_CMD="/sbin/pvscan"
CSPLIT_CMD="/usr/bin/csplit"
HBA_DIR="/sys/class/fc_host"
CHECK_RESULT="${TMP_DIR}/${HOST_NAME}_${DATE_FLAG}_check"
GET_RESULT="/tmp/hostluninfoget_diskinfofile_${HOST_NAME}_${GET_DATE_FLAG}"
MULTIPATH_V3_RESULT="${TMP_DIR}/multipath_v3_output"
PVSCAN_OUTPUT="${TMP_DIR}/pvscan_output"
PVSCAN_FLAG=0
DEV_MAPPER_DIR="/dev/mapper"
ASM_DISK_DIR="/dev/oracleasm/disks"
ASM_OUTPUT="${TMP_DIR}/asm_output_file.log"
RELEASE_FILE="/etc/redhat-release"
#
# For vxvm
#
VXDG_CMD="/sbin/vxdg"
VXDISK_CMD="/sbin/vxdisk"
VXDMPINQ_CMD="/etc/vx/diag.d/vxdmpinq"
VXPRINT_CMD="/sbin/vxprint"
DEVICE_DIR="/sys/block"
VXDISK_OUTPUT="${TMP_DIR}/vxdisk_output_ald"
HBA_NUM_OUTPUT="${TMP_DIR}/hba_bus_number"
#
# For df result
#
DF_RESULT_FILE="/tmp/hostluninfoget_dfinfo_${HOST_NAME}_${GET_DATE_FLAG}"
ASM_DF_OUTPUT="/tmp/asm_df_output_${HOST_NAME}_${GET_DATE_FLAG}"
DF_DEV_OUTPUT="/tmp/df_dev_output_${HOST_NAME}_${GET_DATE_FLAG}"
VGDISPLAY_CMD="/usr/sbin/vgdisplay"
if [ ! -f ${VGDISPLAY_CMD} ]; then
VGDISPLAY_CMD="/sbin/vgdisplay"
fi
BC_CMD="/usr/bin/bc"
ID_CMD="/usr/bin/id"
GRID_FLAG=0
VGDISPLAY_OUTPUT="/tmp/vgdisplay_output_${HOST_NAME}_${GET_DATE_FLAG}"
CHECK_FLAG=0
GET_FLAG=0
GET_DF_FLAG=0
#
#
create_dir ()
{
if [ -d ${TMP_DIR} ]; then
:
else
mkdir ${TMP_DIR}
chmod 777 ${TMP_DIR}
fi
if [ -d ${CONFIG_DIR} ]; then
:
else
mkdir -p ${CONFIG_DIR}
chmod 755 ${CONFIG_DIR}
fi
if [ -f ${DISK_EXCLUDE} ]; then
:
else
echo "##########################################################################" > ${DISK_EXCLUDE}
echo "# Pls put the disks that need not check the paths into this file and the #">> ${DISK_EXCLUDE}
echo "# format of disk name should be start with it and end with it[should not #">> ${DISK_EXCLUDE}
echo "# include any space of \" \" in the end]. #">> ${DISK_EXCLUDE}
echo "##########################################################################" >> ${DISK_EXCLUDE}
chmod 755 ${DISK_EXCLUDE}
fi
if [ -f ${DISK_PATH_ERROR} ]; then
:
else
touch ${DISK_PATH_ERROR}
fi
}
#
#
check_paths_multipath ()
{
#
#
create_dir
#
# Get the disk name
#
if [ ! -x ${MULTIPATH_CMD} ]; then
echo "The command of <${MULTIPATH_CMD}> is not exist."
return
fi
${MULTIPATH_CMD} -ll > ${TMP_LOG_ALL_LUN}
if [ $? -ne 0 ]; then
echo "Running <${MULTIPATH_CMD} -ll> failed."
return
fi
if [ ! -s ${TMP_LOG_ALL_LUN} ]; then
echo "The output file of <${TMP_LOG_ALL_LUN}> is not exist or empty."
return
fi
cat ${TMP_LOG_ALL_LUN} | grep '(' > ${TMP_LOG_ALL}
if [ ! -s ${TMP_LOG_ALL} ]; then
echo "The output file of <${TMP_LOG_ALL}> is not exist or empty."
return
fi
${MULTIPATH_CMD} -v3 > ${MULTIPATH_V3_RESULT}
if [ ! -s ${MULTIPATH_V3_RESULT} ]; then
echo "The output file of <${MULTIPATH_V3_RESULT}> is not exist or empty."
return
fi
#
# Split the multipath output into single file for each LUN
#
(
COUNT_LINE=`cat ${TMP_LOG_ALL} | wc -l`
NUM_CHAR=`echo ${COUNT_LINE} | wc -c`
cd ${TMP_DIR}
${CSPLIT_CMD} -f lun -ks -n ${NUM_CHAR} ${TMP_LOG_ALL_LUN} '/(/' {${COUNT_LINE}} > /dev/null 2>&1
)
while read LINE; do
LUN_NAME=`echo ${LINE} | awk '{print $1}'`
LUN_WWIDS=`echo ${LINE} | awk '{print $2}'`
VENDOR=`echo ${LINE} | awk '{print $4}' | awk -F',' '{print $1}'`
STOR_TYPE=`echo ${LINE} | awk '{print $4}' | awk -F',' '{print $2}'`
LUN_WWID=
#
# Delete the prefix of 3 for EMC and HP mid-storage
#
if [ "${VENDOR}" = "DGC" ]; then
VENDOR="EMC"
LUN_WWID=`echo ${LUN_WWIDS} | sed 's/^3//'`
elif [ "${VENDOR}" = "HP" ]; then
if `echo ${STOR_TYPE} | grep -i HSV > /dev/null`; then
LUN_WWID=`echo ${LUN_WWIDS} | sed 's/^3//'`
fi
elif [ "${VENDOR}" = "EMC" -a "${STOR_TYPE}" = "SYMMETRIX" ]; then
LUN_WWID=`echo ${LUN_WWIDS} | sed 's/^3//'`
fi
#
# Get lun id[The last four characters] as UUID for advance storage
#
if `echo "${STOR_TYPE}" | grep "OPEN-V" > /dev/null`; then
LUN_WWID=`expr "${LUN_WWIDS}" : '.*\(....\)'`
fi
if `cat ${DISK_EXCLUDE} | grep "^${LUN_NAME}$" > /dev/null`; then
continue
else
TMP_LOG_SING=`grep "^${LUN_NAME} " ${TMP_DIR}/lun* |awk -F':' '{print $1}'`
#
# To check if there is any useless info from multipath command output
#
LINE_NUMB=`grep -n ${LUN_NAME} ${TMP_LOG_SING} | awk -F':' '{print $1}'`
if [ ${LINE_NUMB} -ne 1 ]; then
ALL_LINE_NUMB=`cat ${TMP_LOG_SING} | wc -l `
BOTTOM_LINE=`expr ${ALL_LINE_NUMB} - ${LINE_NUMB}`
tail -${BOTTOM_LINE} ${TMP_LOG_SING} > ${TMP_LOG_SING}_tmp
mv ${TMP_LOG_SING}_tmp ${TMP_LOG_SING}
fi
#
# To get the size of the lun
#
LUN_SIZE=`grep size= ${TMP_LOG_SING} | awk '{print $1}' | awk -F'=' '{print $2}' | awk -F']' '{print $1}'`
#
# To get the storage serial
#
DEVICE_NAME=`grep ':' ${TMP_LOG_SING} | awk '{print $3}' | grep -v ':' |head -1`
#
# The tgt_node_name is the EVA serial from multipath -v3 output
#
if `echo ${STOR_TYPE} | grep -i HSV > /dev/null`; then
STORAGE_SERIAL=`grep "${DEVICE_NAME}: " ${MULTIPATH_V3_RESULT} |grep "tgt_node_name =" | awk -F'=' '{print $2}' | sed -e 's/ //g' -e 's/^0x//'`
else
STORAGE_SERIAL=`grep "${DEVICE_NAME}: " ${MULTIPATH_V3_RESULT} |grep "serial = " | awk -F'=' '{print $2}' | sed 's/ //g'`
fi
#
# For NETAPP storage,the serial from multipath -v3 output is the disk serial
#
if [ "${VENDOR}" = "NETAPP" ]; then
LUN_WWID="${STORAGE_SERIAL}"
STORAGE_SERIAL=
fi
#
# Remove useless info. from the serial string
#
if [ "${VENDOR}" = "EMC" -a "${STOR_TYPE}" = "SYMMETRIX" ]; then
STORAGE_SERIALS="${STORAGE_SERIAL}"
STORAGE_SERIAL=`expr "${STORAGE_SERIALS}" : '\(......\).*'`
fi
#
# The storage serial include LUN ID for HITACHI AMS
#
if [ "${VENDOR}" = "HITACHI" -a "${STOR_TYPE}" = "DF600F" ]; then
STORAGE_SERIALS="${STORAGE_SERIAL}"
STORAGE_SERIAL=`expr "${STORAGE_SERIALS}" : '\(........\).*'`
LUN_WWID=`expr "${STORAGE_SERIALS}" : '.*\(....\)'`
fi
#
# For IBM SVC,the serial from multipath -v3 output should remove the XX.*
#
if [ "${VENDOR}" = "IBM" ]; then
STORAGE_SERIAL=`echo ${STORAGE_SERIAL} | sed 's/XX.*//g'`
LUN_WWID=`echo ${LUN_WWIDS} | sed 's/^3//'`
fi
#
# The multipath -v3 output may not start with devcie name
#
if [ "${STORAGE_SERIAL}x" = "x" -a "${LUN_WWID}x" = "x" ]; then
get_stor_serial_lun_id ${LUN_WWIDS} ${DEVICE_NAME}
STORAGE_SERIAL=`cat ${TMP_DIR}/storage_serial.txt`
LUN_WWID=`cat ${TMP_DIR}/lun_wwid.txt`
fi
#
# To check if the active paths are odd
#
ACTIVE_PATH_NUM=`grep active ${TMP_LOG_SING} | egrep -vi "prio=|round-robin" | wc -l`
if `echo "1357911" | grep "${ACTIVE_PATH_NUM}" > /dev/null`; then
#echo "[${HOST_NAME}] ${LUN_NAME}[${LUN_SIZE};${STORAGE_SERIAL}] active path number is ${ACTIVE_PATH_NUM}!" >> ${CHECK_RESULT}
echo "[ALERT]: [${HOST_NAME}] ${LUN_NAME}[${LUN_SIZE};${STORAGE_SERIAL}] active path number is ${ACTIVE_PATH_NUM}!" >> ${DISK_PATH_ERROR}
fi
#
# To check the failed path
#
#HBA_HOST_NUMS=`egrep "failed|faulty" ${TMP_LOG_SING} | egrep -vi "prio=|round-robin" | awk '{print $2}' | awk -F':' '{print $1}' | sed -e 's/-//g' -e 's/`//g' -e s'/|//g'`
HBA_HOST_NUMS=`egrep "failed|faulty" ${TMP_LOG_SING} | egrep -vi "prio=|round-robin" | awk -F':' '{print $1}' | sed -e 's/-//g' -e 's/\`//g' -e 's/|//g' -e 's/\\\//g' -e 's/_//g' -e 's/ //g'`
if [ "${HBA_HOST_NUMS}x" != "x" ]; then
for HBA_HOST_NUM in ${HBA_HOST_NUMS}; do
HBA_EXIST=`grep active ${TMP_LOG_SING} | egrep -vi "prio=|round-robin" | grep " ${HBA_HOST_NUM}:"`
#
# To check if the hba's failed path has any active path
if [ "${HBA_EXIST}x" = "x" ]; then
if [ -d ${HBA_DIR}/host${HBA_HOST_NUM} ]; then
HBA_WWN=`cat ${HBA_DIR}/host${HBA_HOST_NUM}/port_name`
HBA_SPEED=`cat ${HBA_DIR}/host${HBA_HOST_NUM}/speed |sed 's/ //g'`
#echo "[${HOST_NAME}] ${LUN_NAME}[${LUN_SIZE};${STORAGE_SERIAL}] ALL paths down in hba${HBA_HOST_NUM}[${HBA_SPEED};${HBA_WWN}]!" >> ${CHECK_RESULT}
echo "[ALERT]: [${HOST_NAME}] ${LUN_NAME}[${LUN_SIZE};${STORAGE_SERIAL}] ALL paths down in hba${HBA_HOST_NUM}[${HBA_SPEED};${HBA_WWN}]!" >> ${DISK_PATH_ERROR}
else
echo "The hba file does not exist,ignore the failed path."
echo "[ALERT]: [${HOST_NAME}] ${LUN_NAME}[${LUN_SIZE};${STORAGE_SERIAL}] ALL paths down in hba${HBA_HOST_NUM}[${HBA_SPEED};${HBA_WWN}]!" >> ${DISK_PATH_ERROR}
fi
else
HBA_WWN=`cat ${HBA_DIR}/host${HBA_HOST_NUM}/port_name`
HBA_SPEED=`cat ${HBA_DIR}/host${HBA_HOST_NUM}/speed |sed 's/ //g'`
#echo "[${HOST_NAME}] ${LUN_NAME}[${LUN_SIZE};${STORAGE_SERIAL}] some paths down in hba${HBA_HOST_NUM}[${HBA_SPEED};${HBA_WWN}]!" >> ${CHECK_RESULT}
echo "[ALERT]: [${HOST_NAME}] ${LUN_NAME}[${LUN_SIZE};${STORAGE_SERIAL}] some paths down in hba${HBA_HOST_NUM}[${HBA_SPEED};${HBA_WWN}]!" >> ${DISK_PATH_ERROR}
fi
done
fi
#
# To check if the active paths are all in the same fabric or not
#
FABRIC_NUM=`grep active ${TMP_LOG_SING} | egrep -vi "prio=|round-robin" | sed 's/^|//g' | awk '{print $2}' |awk -F':' '{print $1}' |sort -u | wc -l`
if [ ${FABRIC_NUM} -le 1 ]; then
#echo "[${HOST_NAME}] ${LUN_NAME}[${LUN_SIZE};${STORAGE_SERIAL}] all paths in single fabric!" >> ${CHECK_RESULT}
echo "[ALERT]: [${HOST_NAME}] ${LUN_NAME}[${LUN_SIZE};${STORAGE_SERIAL}] all paths in single fabric!" >> ${DISK_PATH_ERROR}
else
#
# Check for RedHat5,as RedHat4 has not the recode of switch wwn
#
RELEASE_FLAG=`cat ${RELEASE_FILE} | grep -i "release 5"`
if [ "${RELEASE_FLAG}x" != "x" ]; then
FABRIC_NUMS=`grep active ${TMP_LOG_SING} | egrep -vi "prio=|round-robin" | sed 's/^|//g' | awk '{print $2}' |awk -F':' '{print $1}' |sort -u`
rm /tmp/switch_wwn_tmpfile
for FABRIC_NUM in ${FABRIC_NUMS}; do
cat ${HBA_DIR}/host${FABRIC_NUM}/fabric_name >> /tmp/switch_wwn_tmpfile
done
SW_WWN_NUMS=`cat /tmp/switch_wwn_tmpfile | sort -u | wc -l`
if [ ${SW_WWN_NUMS} -le 1 ]; then
#echo "[${HOST_NAME}] ${LUN_NAME}[${LUN_SIZE};${STORAGE_SERIAL}] all paths in single fabric!" >> ${CHECK_RESULT}
echo "[ALERT]: [${HOST_NAME}] ${LUN_NAME}[${LUN_SIZE};${STORAGE_SERIAL}] all paths in single fabric!" >> ${DISK_PATH_ERROR}
fi
fi
fi
fi
done < ${TMP_LOG_ALL}
}
#
#
check_paths_vxvm ()
{
DAEMON_RUN=`ps -ef | grep vxconfigd | grep -v grep`
if [ "${DAEMON_RUN}x" = "x" ]; then
echo "The daemon of is not running."
return
fi
ALL_DG=`${VXDG_CMD} list | grep -v "^NAME" | awk '{print $1}'`
if [ "${ALL_DG}x" = "x" ]; then
echo "No dg exist in the host."
return
fi
for SING_DG in ${ALL_DG}; do
ALL_LUN=`${VXPRINT_CMD} -dg ${SING_DG} | grep "^dm" | awk '{print $3}'`
for SING_LUN in ${ALL_LUN}; do
if `cat ${DISK_EXCLUDE} | grep "^${SING_LUN}$" > /dev/null`; then
continue
else
${VXDISK_CMD} list ${SING_LUN} > ${VXDISK_OUTPUT}
if [ $? -ne 0 ]; then
echo "Running <${VXDISK_CMD} list ${SING_LUN}> failed."
continue
fi
# Check if path number is odd
ENABLE_PATH_NUM=`cat ${VXDISK_OUTPUT} | grep 'state=enabled' | wc -l`
if `echo "1357911" | grep "${ENABLE_PATH_NUM}" > /dev/null`; then
echo "[ALERT]: [${HOST_NAME}] ${SING_LUN}[${SING_DG}] active path number is ${ACTIVE_PATH_NUM}!" >> ${DISK_PATH_ERROR}
fi
# Check if any disable path
DISABLED_PATH=`cat ${VXDISK_OUTPUT} | grep 'state=disabled'`
if [ "${DISABLED_PATH}x" != "x" ]; then
echo "[ALERT]: [${HOST_NAME}] ${SING_LUN}[${SING_DG}] has disabled path of `cat ${VXDISK_OUTPUT} | grep 'state=disabled'`!" >> ${DISK_PATH_ERROR}
fi
# Check if the enable path in the same fabric
DEVICES_NAME=`cat ${VXDISK_OUTPUT} | grep 'state=enabled' | awk '{print $1}'`
cat /dev/null > ${HBA_NUM_OUTPUT}
for DEVICE_NAME in ${DEVICES_NAME}; do
ls -l ${DEVICE_DIR}/${DEVICE_NAME} | grep device | awk '{print $NF}' | awk -F'/' '{print $NF}' | awk -F':' '{print $1}' >> ${HBA_NUM_OUTPUT}
done
HBA_BUS_NUM=`cat ${HBA_NUM_OUTPUT} | sort -u | wc -l`
if [ ${HBA_BUS_NUM} -le 1 ]; then
echo "[ALERT]: [${HOST_NAME}] ${SING_LUN}[${SING_DG}] all paths in single fabric!" >> ${DISK_PATH_ERROR}
fi
fi
done
done
}
#
# $1 = lun wwid
# $2 = device name
#
get_stor_serial_lun_id ()
{
LUN_WWIDS=$1
DEVICE_NAME=$2
#
# split the multipath -v3 output based on each device
#
(
cd ${TMP_DIR}
HEADER_FILE=`grep -n "===== path info" ${MULTIPATH_V3_RESULT} | head -1 | awk -F':' '{print $1}'`
TOTAL_LINE=`cat ${MULTIPATH_V3_RESULT} | wc -l`
CONTENT_LINES=`expr ${TOTAL_LINE} - ${HEADER_FILE}`
CONTENT_LINE=`expr ${CONTENT_LINES} + 1`
tail -${CONTENT_LINE} ${MULTIPATH_V3_RESULT} > ${MULTIPATH_V3_RESULT}_tmp001
TAIL_FILE=`grep -n "all paths" ${MULTIPATH_V3_RESULT}_tmp001 | head -1 | awk -F':' '{print $1}'`
head -${TAIL_FILE} ${MULTIPATH_V3_RESULT}_tmp001 > ${MULTIPATH_V3_RESULT}
rm ${MULTIPATH_V3_RESULT}_tmp001
FILES_NUMS=`grep -c "===== path info" ${MULTIPATH_V3_RESULT}`
FILES_NUM=`expr ${FILES_NUMS} - 1`
SUFFIX_NUM=`echo ${FILES_NUM} | wc -c`
${CSPLIT_CMD} -f multipathv3 -ks -n ${SUFFIX_NUM} ${MULTIPATH_V3_RESULT} '/===== path info /' {${FILES_NUM}}
DEVICE_FILE_NAME=`grep ${DEVICE_NAME} multipathv3* | awk -F':' '{print $1}'`
STORAGE_SERIAL=`grep serial ${DEVICE_FILE_NAME} | awk '{print $3}'`
VENDOR=`grep vendor ${DEVICE_FILE_NAME} | awk '{print $3}'`
STOR_TYPE=`grep product ${DEVICE_FILE_NAME} | awk '{print $3}'`
#
# Delete the prefix of 3 for EMC and HP mid-storage
#
if [ "${VENDOR}" = "DGC" ]; then
VENDOR="EMC"
LUN_WWID=`echo ${LUN_WWIDS} | sed 's/^3//'`
elif [ "${VENDOR}" = "HP" ]; then
if `echo ${STOR_TYPE} | grep -i HSV > /dev/null`; then
LUN_WWID=`echo ${LUN_WWIDS} | sed 's/^3//'`
STORAGE_SERIAL=`grep tgt_node_name ${DEVICE_FILE_NAME} | awk '{print $3}' | sed 's/^0x//'`
fi
elif [ "${VENDOR}" = "EMC" -a "${STOR_TYPE}" = "SYMMETRIX" ]; then
LUN_WWID=`echo ${LUN_WWIDS} | sed 's/^3//'`
fi
#
# Get lun id[The last four characters] as UUID for advance storage
#
if `echo "${STOR_TYPE}" | grep "OPEN-V" > /dev/null`; then
LUN_WWID=`expr "${LUN_WWIDS}" : '.*\(....\)'`
fi
echo "${STORAGE_SERIAL}" > storage_serial.txt
echo "${LUN_WWID}" > lun_wwid.txt
)
}
#
#
get_config_multipath ()
{
rm -f /tmp/hostluninfoget_diskinfofile*
#cat /dev/null > ${GET_RESULT}
#find /tmp/ -name "hostluninfoget_diskinfofile_*" -mtime +7 -exec rm -f {} \;
#
#
create_dir
#
# Get the disk name
#
if [ ! -x ${MULTIPATH_CMD} ]; then
echo "The command of <${MULTIPATH_CMD}> is not exist."
return
fi
${MULTIPATH_CMD} -ll > ${TMP_LOG_ALL_LUN}
if [ $? -ne 0 ]; then
echo "Running <${MULTIPATH_CMD} -ll> failed."
return
fi
if [ ! -s ${TMP_LOG_ALL_LUN} ]; then
echo "The output file of <${TMP_LOG_ALL_LUN}> is not exist or empty."
return
fi
cat ${TMP_LOG_ALL_LUN} | grep '(' > ${TMP_LOG_ALL}
if [ ! -s ${TMP_LOG_ALL} ]; then
echo "The output file of <${TMP_LOG_ALL}> is not exist or empty."
return
fi
${MULTIPATH_CMD} -v3 > ${MULTIPATH_V3_RESULT}
if [ ! -s ${MULTIPATH_V3_RESULT} ]; then
echo "The output file of <${MULTIPATH_V3_RESULT}> is not exist or empty."
return
fi
${PVSCAN_CMD} > ${PVSCAN_OUTPUT} 2>/dev/null
if [ $? -ne 0 ]; then
echo "Running <${PVSCAN_CMD}> failed."
PVSCAN_FLAG=1
fi
#
# Get the ASM config
#
ASM_SID=`ps -ef | grep pmon | grep ASM | awk '{print $NF}' | awk -F'_' '{print $3}' | head -1`
if [ "${ASM_SID}x" != "x" ]; then
#
# The grid account does not exists in 10g asm
#
${ID_CMD} grid > /dev/null 2>&1
if [ $? -eq 0 ]; then
QUERY_STRING="
ORACLE_SID=${ASM_SID}
export ORACLE_SID
sqlplus '/as sysdba' <
select a.label||'#'||b.name as name from v\\\$asm_disk a, v\\\$asm_diskgroup b where a.GROUP_NUMBER=b.GROUP_NUMBER;
EOF
"
su - grid -c "${QUERY_STRING}" > ${ASM_OUTPUT}
QUERY_STRING2="
sqlplus '/as sysdba' <
set line 120
column NAME format a40
column PATH format a40
spool /tmp/mul_dir_ald/asm_output_file2.log
select a.path||'#'||b.name as name from v\\\$asm_disk a, v\\\$asm_diskgroup b where a.GROUP_NUMBER=b.GROUP_NUMBER;
spool off
EOF
"
su - grid -c "${QUERY_STRING2}" > /dev/null 2>&1
else
#
# Tag GRID_FLAG to specify the grid account does not exist and will be used
# in the following part.
#
GRID_FLAG=1
ASM_ACCOUNT=`ps -ef | grep pmon | grep ASM | awk '{print $1}' | head -1`
QUERY_STRING="
sqlplus '/as sysdba' <
set line 120
column NAME format a40
column PATH format a40
spool /tmp/mul_dir_ald/asm_output_file.log
select a.path||'#'||b.name as name from v\\\$asm_disk a, v\\\$asm_diskgroup b where a.GROUP_NUMBER=b.GROUP_NUMBER;
spool off
EOF
"
su - ${ASM_ACCOUNT} -c "${QUERY_STRING}" > /dev/null 2>&1
fi
fi
#
# Split the multipath output into single file for each LUN
#
(
COUNT_LINE=`cat ${TMP_LOG_ALL} | wc -l`
NUM_CHAR=`echo ${COUNT_LINE} | wc -c`
cd ${TMP_DIR}
${CSPLIT_CMD} -f lun -ks -n ${NUM_CHAR} ${TMP_LOG_ALL_LUN} '/(/' {${COUNT_LINE}} > /dev/null 2>&1
)
while read LINE; do
LUN_NAME=`echo ${LINE} | awk '{print $1}'`
LUN_WWIDS=`echo ${LINE} | awk '{print $2}' |sed -e 's/(//g' -e 's/)//g'`
DM_NAME=`echo ${LINE} | awk '{print $3}'`
VENDOR=`echo ${LINE} | awk '{print $4}' | awk -F',' '{print $1}'`
#STOR_TYPE=`echo ${LINE} | awk '{print $4}' | awk -F',' '{print $2}'`
STOR_TYPE=`echo ${LINE} | awk '{print $4 $5}' | awk -F',' '{print $2}'`
LUN_WWID=
#
# Delete the prefix of 3 for EMC and HP mid-storage
#
if [ "${VENDOR}" = "DGC" ]; then
VENDOR="EMC"
LUN_WWID=`echo ${LUN_WWIDS} | sed 's/^3//'`
elif [ "${VENDOR}" = "HP" ]; then
if `echo ${STOR_TYPE} | grep -i HSV > /dev/null`; then
LUN_WWID=`echo ${LUN_WWIDS} | sed 's/^3//'`
fi
elif [ "${VENDOR}" = "EMC" -a "${STOR_TYPE}" = "SYMMETRIX" ]; then
LUN_WWID=`echo ${LUN_WWIDS} | sed 's/^3//'`
fi
#
# Get lun id[The last four characters] as UUID for advance storage
#
if `echo "${STOR_TYPE}" | grep "OPEN-V" > /dev/null`; then
LUN_WWID=`expr "${LUN_WWIDS}" : '.*\(....\)'`
fi
TMP_LOG_SING=`grep "^${LUN_NAME} " ${TMP_DIR}/lun* |awk -F':' '{print $1}'`
#
# To check if there is any useless info from multipath command output
#
LINE_NUMB=`grep -n ${LUN_NAME} ${TMP_LOG_SING} | awk -F':' '{print $1}'`
if [ ${LINE_NUMB} -ne 1 ]; then
ALL_LINE_NUMB=`cat ${TMP_LOG_SING} | wc -l `
BOTTOM_LINE=`expr ${ALL_LINE_NUMB} - ${LINE_NUMB}`
tail -${BOTTOM_LINE} ${TMP_LOG_SING} > ${TMP_LOG_SING}_tmp
mv ${TMP_LOG_SING}_tmp ${TMP_LOG_SING}
fi
#
# To get the DG name of LVM
#
if [ "${PVSCAN_FLAG}" = "1" ]; then
DG_NAME=
elif [ ! -s ${PVSCAN_OUTPUT} ]; then
DG_NAME=
else
DG_EXPORT_FLAG=`grep -i "/${LUN_NAME} " ${PVSCAN_OUTPUT} | grep "is in exported"`
if [ "${DG_EXPORT_FLAG}x" = "x" ]; then
DG_NAME=`grep -i "/${LUN_NAME} " ${PVSCAN_OUTPUT} | awk '{print $4}'`
else
DG_NAME=`grep -i "/${LUN_NAME} " ${PVSCAN_OUTPUT} | awk '{print $7}'`
fi
if [ "${DG_NAME}x" = "x" ]; then
DG_EXPORT_FLAG=`grep -i "/${LUN_NAME}p1 " ${PVSCAN_OUTPUT} | grep "is in exported"`
if [ "${DG_EXPORT_FLAG}x" = "x" ]; then
DG_NAME=`grep -i "/${LUN_NAME}p1 " ${PVSCAN_OUTPUT} | awk '{print $4}'`
else
DG_NAME=`grep -i "/${LUN_NAME}p1 " ${PVSCAN_OUTPUT} | awk '{print $7}'`
fi
fi
if [ "${DG_NAME}x" = "x" ]; then
DG_EXPORT_FLAG=`grep -i "/${DM_NAME} " ${PVSCAN_OUTPUT} | grep "is in exported"`
if [ "${DG_EXPORT_FLAG}x" = "x" ]; then
DG_NAME=`grep -i "/${DM_NAME} " ${PVSCAN_OUTPUT} | awk '{print $4}'`
else
DG_NAME=`grep -i "/${DM_NAME} " ${PVSCAN_OUTPUT} | awk '{print $7}'`
fi
fi
fi
#
# To get the DG name of ASM
#
if [ "${DG_NAME}x" = "x" ]; then
if `grep NAME ${ASM_OUTPUT} > /dev/null`; then
#
# If it is the 10g asm, the disk will not be tag by kpartx
#
if [ "${GRID_FLAG}" = "1" ]; then
DEV_FLAG=`ls -l ${DEV_MAPPER_DIR} | grep " ${LUN_NAME}" | cut -c 1`
if [ "${DEV_FLAG}" = "l" ]; then
REAL_DEV=`ls -l ${DEV_MAPPER_DIR} | grep " ${LUN_NAME}" | awk '{print $NF}'`
cd ${DEV_MAPPER_DIR};MINOR_NUM=`ls -l ${REAL_DEV} | awk '{print $5" "$6}'`
else
MINOR_NUM=`ls -l ${DEV_MAPPER_DIR} | grep " ${LUN_NAME}" | awk '{print $5" "$6}'`
fi
else
DEV_FLAG=`ls -l ${DEV_MAPPER_DIR} | grep " ${LUN_NAME}p1" | cut -c 1`
if [ "${DEV_FLAG}" = "l" ]; then
REAL_DEV=`ls -l ${DEV_MAPPER_DIR} | grep " ${LUN_NAME}p1" | awk '{print $NF}'`
cd ${DEV_MAPPER_DIR};MINOR_NUM=`ls -l ${REAL_DEV} | awk '{print $5" "$6}'`
else
MINOR_NUM=`ls -l ${DEV_MAPPER_DIR} | grep " ${LUN_NAME}p1" | awk '{print $5" "$6}'`
fi
fi
if [ "${MINOR_NUM}x" = "x" ]; then
DG_NAME="NULL"
else
ORACLE_ASM_DISK=`ls -l ${ASM_DISK_DIR} | grep " ${MINOR_NUM} " |awk '{print $NF}'`
if [ "${ORACLE_ASM_DISK}x" = "x" ]; then
MINOR_NUM_NEW=`echo ${MINOR_NUM} | sed 's/, /,[ ]*/g'`
ORACLE_ASM_DISK=`ls -l ${ASM_DISK_DIR} | grep " ${MINOR_NUM_NEW} " |awk '{print $NF}'`
fi
#comment it as the [ ]* has include it
#if [ "${ORACLE_ASM_DISK}x" = "x" ]; then
# MINOR_NUM_NEW=`echo ${MINOR_NUM} | sed 's/, /, /g'`
# ORACLE_ASM_DISK=`ls -l ${ASM_DISK_DIR} | grep " ${MINOR_NUM_NEW} " |awk '{print $NF}'`
#fi
if [ "${ORACLE_ASM_DISK}x" = "x" ]; then
DG_NAME="NULL"
else
#
# If it is the 10g asm, the disk will not be tag by kpartx
#
if [ "${GRID_FLAG}" = "1" ]; then
DG_NAME=`grep "${ORACLE_ASM_DISK}#" ${ASM_OUTPUT} | awk -F'#' '{print $2}'`
else
DG_NAME=`grep "^${ORACLE_ASM_DISK}#" ${ASM_OUTPUT} | awk -F'#' '{print $2}'`
fi
if [ "${DG_NAME}x" = "x" ]; then
DG_NAME=`grep "${ORACLE_ASM_DISK}" /tmp/mul_dir_ald/asm_output_file2.log | awk '{print $2}'`
fi
if [ "${DG_NAME}x" = "x" ]; then
DG_NAME="NULL"
fi
fi
if [ "${DG_NAME}" = "NULL" ]; then
DG_NAME=`grep -i "${LUN_NAME}#" ${ASM_OUTPUT} | awk -F'#' '{print $2}'`
fi
#
# If the DG_NAME is more than 2,should get it from the head of # asm disk but not from v$asm_disk and v$asm_group
#
DG_NUMS=`echo ${DG_NAME} | wc -w`
if [ ${DG_NUMS} -ge 2 ]; then
# get the ORACLE_HOME first
if [ "${GRID_FLAG}" = "1" ]; then
KFED_PRE=`su - ${ASM_ACCOUNT} -c 'echo $ORACLE_HOME'`
else
KFED_PRE=`su - grid -c 'echo $ORACLE_HOME'`
fi
KFED_CMD="${KFED_PRE}/bin/kfed"
DG_NAME=`${KFED_CMD} read ORCL:${ORACLE_ASM_DISK} |\
grep grpname | awk '{print $2}' | sed -e 's/;//g' -e 's/://g'`
fi
fi
fi
fi
#
# To get the size of the lun
#
LUN_SIZE=`grep size= ${TMP_LOG_SING} | awk '{print $1}' | awk -F'=' '{print $2}' | awk -F']' '{print $1}'`
#
# To get the storage serial
#
DEVICE_NAME=`grep ':' ${TMP_LOG_SING} | awk '{print $3}' |grep -v ':' | head -1`
#
# The tgt_node_name is the EVA serial from multipath -v3 output
#
if `echo ${STOR_TYPE} | grep -i HSV > /dev/null`; then
STORAGE_SERIAL=`grep "${DEVICE_NAME}: " ${MULTIPATH_V3_RESULT} |grep "tgt_node_name =" | awk -F'=' '{print $2}' | sed -e 's/ //g' -e 's/^0x//'`
else
STORAGE_SERIAL=`grep "${DEVICE_NAME}: " ${MULTIPATH_V3_RESULT} |grep "serial = " | awk -F'=' '{print $2}' | sed 's/ //g'`
fi
#
# For NETAPP storage,the serial from multipath -v3 output is the disk serial
#
if [ "${VENDOR}" = "NETAPP" ]; then
LUN_WWID="${STORAGE_SERIAL}"
STORAGE_SERIAL=
fi
#
# Remove useless info. from the serial string
#
if [ "${VENDOR}" = "EMC" -a "${STOR_TYPE}" = "SYMMETRIX" ]; then
STORAGE_SERIALS="${STORAGE_SERIAL}"
STORAGE_SERIAL=`expr "${STORAGE_SERIALS}" : '\(......\).*'`
fi
#
# The storage serial include LUN ID for HITACHI AMS
#
if [ "${VENDOR}" = "HITACHI" -a "${STOR_TYPE}" = "DF600F" ]; then
STORAGE_SERIALS="${STORAGE_SERIAL}"
STORAGE_SERIAL=`expr "${STORAGE_SERIALS}" : '\(........\).*'`
LUN_WWID=`expr "${STORAGE_SERIALS}" : '.*\(....\)'`
fi
#
# For IBM SVC,the serial from multipath -v3 output should remove the XX.*
#
if [ "${VENDOR}" = "IBM" ]; then
STORAGE_SERIAL=`echo ${STORAGE_SERIAL} | sed 's/XX.*//g'`
LUN_WWID=`echo ${LUN_WWIDS} | sed 's/^3//'`
fi
#
# The multipath -v3 output may not start with devcie name
#
if [ "${STORAGE_SERIAL}x" = "x" -a "${LUN_WWID}x" = "x" ]; then
get_stor_serial_lun_id ${LUN_WWIDS} ${DEVICE_NAME}
STORAGE_SERIAL=`cat ${TMP_DIR}/storage_serial.txt`
LUN_WWID=`cat ${TMP_DIR}/lun_wwid.txt`
fi
#
# To get total path number
#
TOTAL_PATH=`grep ':' ${TMP_LOG_SING} | wc -l`
#
# To get active path number
#
ACTIVE_PATH=`grep ':' ${TMP_LOG_SING} | grep active | wc -l`
#
# To get failed path number
#
FAILED_PATH=`grep ':' ${TMP_LOG_SING} | grep falied | wc -l`
#
# Specify the DG_NAME as - if it is not exist
#
if [ "${DG_NAME}x" = "x" ]; then
DG_NAME='-'
fi
#
# make STORAGE_SERIAL for G1000
#
STORAGE_SERIAL_NUM=`echo ${STORAGE_SERIAL} | wc -c`
if [ ${STORAGE_SERIAL_NUM} -eq 7 ]; then
if `echo ${STORAGE_SERIAL} | grep "^5" > /dev/null`; then
STORAGE_SERIAL_NEW=`echo ${STORAGE_SERIAL} | cut -c 1-5`
STORAGE_SERIAL="${STORAGE_SERIAL_NEW}"
fi
fi
#
# To get device name HBA and WWN
#
WWN_AND_SPEED=
SWITCH_WWNS=
HBA_DEVICES=`grep ':' ${TMP_LOG_SING} | sed 's/^|//g' |awk '{print $2","$3}'`
for HBA_DEVICE in ${HBA_DEVICES}; do
HBA_HOST=`echo ${HBA_DEVICE} | awk -F',' '{print $1}'|awk -F':' '{print $1}'`
LUN_DEVICE=`echo ${HBA_DEVICE} | awk -F',' '{print "/dev/"$2}'`
if [ -d ${HBA_DIR}/host${HBA_HOST} ]; then
HBA_WWN=`cat ${HBA_DIR}/host${HBA_HOST}/port_name | sed 's/^0x//g'`
HBA_SPEED=`cat ${HBA_DIR}/host${HBA_HOST}/speed |sed 's/ //g'`
SWITCH_WWN=`cat ${HBA_DIR}/host${HBA_HOST}/fabric_name | sed 's/^0x//g'`
echo "${LUN_NAME},${HOST_NAME},${DG_NAME},${STORAGE_SERIAL},${LUN_WWID},${ACTIVE_PATH},${FAILED_PATH},${LUN_DEVICE},${HBA_WWN},${HBA_SPEED},${SWITCH_WWN}" >> ${GET_RESULT}
else
echo "HBA file of <${HBA_DIR}/host${HBA_HOST}> is not exits."
echo "${LUN_NAME},${HOST_NAME},${DG_NAME},${STORAGE_SERIAL},${LUN_WWID},${ACTIVE_PATH},${FAILED_PATH},${LUN_DEVICE},${HBA_WWN},${HBA_SPEED},${SWITCH_WWN}" >> ${GET_RESULT}
fi
done
#echo "${LUN_NAME},${HOST_NAME} ${LUN_SIZE} ${TOTAL_PATH} ${ACTIVE_PATH} ${FAILED_PATH} ${STORAGE_SERIAL} ${VENDOR} ${LUN_WWID} ${DEVICE_NAMES} ${WWN_AND_SPEED} ${SWITCH_WWNS}"
done < ${TMP_LOG_ALL}
}
#
#
#
get_config_vxvm ()
{
DAEMON_RUN=`ps -ef | grep vxconfigd | grep -v grep`
if [ "${DAEMON_RUN}x" = "x" ]; then
echo "The daemon of is not running."
return
fi
#need to find the disk first but not DG 20150804
#ALL_DG=`${VXDG_CMD} list | grep -v "^NAME" | awk '{print $1}'`
#if [ "${ALL_DG}x" = "x" ]; then
# echo "No dg exist in the host."
# return
#fi
ALL_LUN_FILE="/tmp/all_lun_info.$$"
ALL_LUN=`${VXDISK_CMD} -o alldgs list | egrep -v "^DEVICE|invalid" > ${ALL_LUN_FILE}`
#for SING_DG in ${ALL_DG}; do
ALL_LUNS=`cat ${ALL_LUN_FILE} | awk '{print $1}'`
for SING_LUN in ${ALL_LUNS}; do
SING_DG=`grep "${SING_LUN} " ${ALL_LUN_FILE} | awk '{print $4}' | sed -e 's/)//g' -e 's/(//g'`
${VXDISK_CMD} list ${SING_LUN} > ${VXDISK_OUTPUT}
if [ $? -ne 0 ]; then
echo "Running <${VXDISK_CMD} list ${SING_LUN}> failed."
continue
fi
STORAGE_SERIAL_HEX=`grep "udid: " ${VXDISK_OUTPUT} | awk -F'%' '{print $(NF-1)}' | sed 's/^5F//'`
if `echo "${STORAGE_SERIAL_HEX}" | grep -i disk > /dev/null`; then
STORAGE_SERIAL_HEX_01=`grep "udid: " ${VXDISK_OUTPUT} | awk -F'%' '{print $NF}' | sed 's/^5F//'`
if [ "${HOST_NAME}" = "cnsz081044" ]; then
STORAGE_SERIAL_HEX=`expr "${STORAGE_SERIAL_HEX_01}" : '.*\(.....\)........'`
else
STORAGE_SERIAL_HEX=`expr "${STORAGE_SERIAL_HEX_01}" : '.*\(....\)........'`
fi
STORAGE_SERIAL=`echo "obase=10;ibase=16;${STORAGE_SERIAL_HEX}" | bc`
LUN_WWID_01=`grep "udid: " ${VXDISK_OUTPUT} | awk -F'%' '{print $NF}' | sed 's/^5F//'`
LUN_WWID=`expr "${LUN_WWID_01}" : '.*\(....\)'`
#for svc
elif `echo "${STORAGE_SERIAL_HEX}" | grep XX > /dev/null`; then
STORAGE_SERIAL=`echo ${STORAGE_SERIAL_HEX} | sed 's/XX.*//'`
LUN_WWID=`grep "udid: " ${VXDISK_OUTPUT} | awk -F'%' '{print $NF}' | sed 's/^5F//'`
#for HDS storage
else
STORAGE_SERIAL=`echo "obase=10;ibase=16;${STORAGE_SERIAL_HEX}" | bc`
LUN_WWID=`grep "udid: " ${VXDISK_OUTPUT} | awk -F'%' '{print $NF}' | sed 's/^5F//'`
fi
ACTIVE_PATH=`grep 'state=enabled' ${VXDISK_OUTPUT} | wc -l`
FAILED_PATH=`grep 'state=disabled' ${VXDISK_OUTPUT} | wc -l`
LUN_DEVICES=`grep 'state=' ${VXDISK_OUTPUT} | awk '{print $1}'`
for LUN_DEVICE in ${LUN_DEVICES}; do
HBA_NUM=`ls -l ${DEVICE_DIR}/${LUN_DEVICE} | grep device | awk '{print $NF}' | awk -F'/' '{print $NF}' | awk -F':' '{print $1}'`
if [ -d ${HBA_DIR}/host${HBA_NUM} ]; then
HBA_WWN=`cat ${HBA_DIR}/host${HBA_NUM}/port_name | sed 's/^0x//g'`
HBA_SPEED=`cat ${HBA_DIR}/host${HBA_NUM}/speed |sed 's/ //g'`
SWITCH_WWN=`cat ${HBA_DIR}/host${HBA_NUM}/fabric_name | sed 's/^0x//g'`
echo "${SING_LUN},${HOST_NAME},${SING_DG},${STORAGE_SERIAL},${LUN_WWID},${ACTIVE_PATH},${FAILED_PATH},${LUN_DEVICE},${HBA_WWN},${HBA_SPEED},${SWITCH_WWN}" >> ${GET_RESULT}
else
echo "HBA file of <${HBA_DIR}/host${HBA_HOST}> is not exits."
echo "${SING_LUN},${HOST_NAME},${SING_DG},${STORAGE_SERIAL},${LUN_WWID},${ACTIVE_PATH},${FAILED_PATH},${LUN_DEVICE},${HBA_WWN},${HBA_SPEED},${SWITCH_WWN}" >> ${GET_RESULT}
fi
done
done
#done
rm ${ALL_LUN_FILE}
}
#
# $1 = The size with KB unit.
#
convert_size_unit ()
{
SIZE_WITH_KB=$1
SIZE_RESULT=`echo "${SIZE_WITH_KB}/1024/1024" | ${BC_CMD}`
echo "${SIZE_RESULT}"
}
#
#
#
get_df_config ()
{
rm -f /tmp/hostluninfoget_dfinfo*
#cat /dev/null > ${DF_RESULT_FILE}
#find /tmp/ -name "hostluninfoget_dfinfo_*" -mtime +7 -exec rm -f {} \;
#
# Get the ASM config
#
ASM_SID=`ps -ef | grep pmon | grep ASM | awk '{print $NF}' | awk -F'_' '{print $3}' | head -1`
if [ "${ASM_SID}x" != "x" ]; then
QUERY_STRING="
ORACLE_SID=${ASM_SID}
export ORACLE_SID
sqlplus '/as sysdba' <
set pagesize 10000
set linesize 10000
select name,TOTAL_MB/1024 T_GB,FREE_MB/1024 F_GB,(TOTAL_MB-FREE_MB)/TOTAL_MB a from v\\\$asm_diskgroup where TOTAL_MB != 0;
EOF
"
#
# The grid account does not exists in 10g asm
#
${ID_CMD} grid > /dev/null 2>&1
if [ $? -eq 0 ]; then
su - grid -c "${QUERY_STRING}" > ${ASM_DF_OUTPUT}
else
QUERY_STRING="
sqlplus '/as sysdba' <
set pagesize 10000
set linesize 10000
select name,TOTAL_MB/1024 T_GB,FREE_MB/1024 F_GB,(TOTAL_MB-FREE_MB)/TOTAL_MB a from v\\\$asm_diskgroup where TOTAL_MB != 0;
EOF
"
ASM_ACCOUNT=`ps -ef | grep pmon | grep ASM | awk '{print $1}' | head -1`
su - ${ASM_ACCOUNT} -c "${QUERY_STRING}" > ${ASM_DF_OUTPUT}
fi
DECH_NUM=`grep -n -- "-----" ${ASM_DF_OUTPUT} | awk -F':' '{print $1}'`
TOTAL_DECH=`cat ${ASM_DF_OUTPUT} | wc -l`
CONTENT_LINE=`expr ${TOTAL_DECH} - ${DECH_NUM}`
tail -${CONTENT_LINE} ${ASM_DF_OUTPUT} | sed '/^$/d' > ${ASM_DF_OUTPUT}_tmp001
BOOT_LINE=`grep -n "SQL>" ${ASM_DF_OUTPUT}_tmp001 | awk -F':' '{print $1}'`
NEED_LINT=`expr ${BOOT_LINE} - 1`
head -${NEED_LINT} ${ASM_DF_OUTPUT}_tmp001 | grep -v "rows selected" > ${ASM_DF_OUTPUT}
rm ${ASM_DF_OUTPUT}_tmp001
#grep "DG" ${ASM_DF_OUTPUT} | \
cat ${ASM_DF_OUTPUT} | \
while read LINE; do
ASM_DG_NAME=`echo ${LINE} | awk '{print $1}'`
ASM_DG_TOTAL_SIZE=`echo ${LINE} | awk '{print $2}' | awk -F'.' '{print $1}'`
ASM_DG_FREE_SIZE=`echo ${LINE} | awk '{print $3}' | awk -F'.' '{print $1}'`
ASM_DG_USED_RATE1=`echo ${LINE} | awk '{print $4}'`
ASM_DG_USED_RATE2=`expr "${ASM_DG_USED_RATE1}" : '.\(..\).*'`
ASM_DG_USED_RATE=`echo ${ASM_DG_USED_RATE2}"%" | sed 's/^0//g'`
SACNNAME=`cat /etc/hosts| grep scan|awk '{print $NF}'`
DGID=`echo "${ASM_DG_NAME}_$SACNNAME"`
echo "${HOST_NAME},${ASM_DG_NAME},NULL,${ASM_DG_TOTAL_SIZE},${ASM_DG_FREE_SIZE},NULL,NULL,NULL,${ASM_DG_USED_RATE},NULL,,$DGID" >> ${DF_RESULT_FILE}
done
rm -f ${ASM_DF_OUTPUT}
fi
#
# Get the FS config
#
${MULTIPATH_CMD} -ll > /tmp/multipath_ll_output_$$
df -h | egrep -v 'VolGroup00|Filesystem|tmp|boot|root|home' | grep dev | awk '{print $1}' > ${DF_DEV_OUTPUT}
if [ -s ${DF_DEV_OUTPUT} ]; then
MULTIPATH_VGS=`grep mapper ${DF_DEV_OUTPUT}`
if [ "${MULTIPATH_VGS}x" != "x" ]; then
for MULTIPATH_VG in ${MULTIPATH_VGS}; do
VG_NAME=`echo ${MULTIPATH_VG} | awk -F'/' '{print $4}' | awk -F'-' '{print $1}'`
DGID=`vgdisplay $VG_NAME| grep "VG UUID"|awk '{print $3}'`
VOLUME_NAME=`echo ${MULTIPATH_VG} | awk -F'/' '{print $4}' | awk -F'-' '{print $2}'`
${VGDISPLAY_CMD} ${VG_NAME} > ${VGDISPLAY_OUTPUT}
VG_TOTAL_SIZE_UNIT=`cat ${VGDISPLAY_OUTPUT} |grep "VG Size" |awk '{print $4}'`
if [ "${VG_TOTAL_SIZE_UNIT}" = "GB" -o "${VG_TOTAL_SIZE_UNIT}" = "GiB" ]; then
VG_TOTAL_SIZE=`cat ${VGDISPLAY_OUTPUT} |grep "VG Size" |awk '{print $3}' | awk -F'.' '{print $1}'`
elif [ "${VG_TOTAL_SIZE_UNIT}" = "MB" -o "${VG_TOTAL_SIZE_UNIT}" = "MiB" ]; then
VG_TOTAL_SIZE_MB=`cat ${VGDISPLAY_OUTPUT} |grep "VG Size" |awk '{print $3}' | awk -F'.' '{print $1}'`
VG_TOTAL_SIZE=`expr ${VG_TOTAL_SIZE_MB} / 1024`
elif [ "${VG_TOTAL_SIZE_UNIT}" = "TB" -o "${VG_TOTAL_SIZE_UNIT}" = "TiB" ]; then
VG_TOTAL_SIZE_TB=`cat ${VGDISPLAY_OUTPUT} |grep "VG Size" |awk '{print $3}' | awk -F'.' '{print $1}'`
VG_TOTAL_SIZE=`expr ${VG_TOTAL_SIZE_TB} \* 1024`
fi
VG_FREE_SIZE_UNIT=`cat ${VGDISPLAY_OUTPUT} |grep "Free PE" |awk '{print $8}'`
if [ "${VG_FREE_SIZE_UNIT}" = "GB" -o "${VG_FREE_SIZE_UNIT}" = "GiB" ]; then
VG_FREE_SIZE=`cat ${VGDISPLAY_OUTPUT} |grep "Free PE" |awk '{print $7}' | awk -F'.' '{print $1}'`
elif [ "${VG_FREE_SIZE_UNIT}" = "MB" -o "${VG_FREE_SIZE_UNIT}" = "MiB" ]; then
VG_FREE_SIZE_MB=`cat ${VGDISPLAY_OUTPUT} |grep "Free PE" |awk '{print $7}' | awk -F'.' '{print $1}'`
VG_FREE_SIZE=`expr ${VG_FREE_SIZE_MB} / 1024`
elif [ "${VG_FREE_SIZE_UNIT}" = "TB" -o "${VG_FREE_SIZE_UNIT}" = "TiB" ]; then
VG_FREE_SIZE_TB=`cat ${VGDISPLAY_OUTPUT} |grep "Free PE" |awk '{print $7}' | awk -F'.' '{print $1}'`
VG_FREE_SIZE=`expr ${VG_FREE_SIZE_TB} \* 1024`
else
if [ "${VG_TOTAL_SIZE}x" != "x" ]; then
VG_FREE_SIZE=0
fi
fi
DF_LINE=`df -k ${MULTIPATH_VG} | grep -v Filesystem | grep '%'`
FS_TOTAL_SIZE=`echo ${DF_LINE} | awk '{print $1}'`
if `echo ${FS_TOTAL_SIZE} | grep mapper > /dev/null`; then
FS_TOTAL_SIZE_TMP=`echo ${DF_LINE} | awk '{print $2}'`
FS_TOTAL_SIZE=`convert_size_unit ${FS_TOTAL_SIZE_TMP}`
FS_USED_SIZE_TMP=`echo ${DF_LINE} | awk '{print $3}'`
FS_USED_SIZE=`convert_size_unit ${FS_USED_SIZE_TMP}`
FS_FREE_SIZE_TMP=`echo ${DF_LINE} | awk '{print $4}'`
FS_FREE_SIZE=`convert_size_unit ${FS_FREE_SIZE_TMP}`
FS_USED_RATE=`echo ${DF_LINE} | awk '{print $5}'`
FS_MOUNTPOINT=`echo ${DF_LINE} | awk '{print $6}'`
else
FS_TOTAL_SIZE_TMP=`echo ${DF_LINE} | awk '{print $1}'`
FS_TOTAL_SIZE=`convert_size_unit ${FS_TOTAL_SIZE_TMP}`
FS_USED_SIZE_TMP=`echo ${DF_LINE} | awk '{print $2}'`
FS_USED_SIZE=`convert_size_unit ${FS_USED_SIZE_TMP}`
FS_FREE_SIZE_TMP=`echo ${DF_LINE} | awk '{print $3}'`
FS_FREE_SIZE=`convert_size_unit ${FS_FREE_SIZE_TMP}`
FS_USED_RATE=`echo ${DF_LINE} | awk '{print $4}'`
FS_MOUNTPOINT=`echo ${DF_LINE} | awk '{print $5}'`
fi
if [ "${VOLUME_NAME}x" = "x" -a "${VG_TOTAL_SIZE}x" = "x" -a "${VG_FREE_SIZE}x" = "x" ]; then
DISK_NAME=`echo "${VG_NAME}" | sed 's/p.$//'`
VG_NAME="${DISK_NAME}"
DGID=`vgdisplay $VG_NAME| grep "VG UUID"|awk '{print $3}'`
VG_TOTAL_SIZE=`cat /tmp/multipath_ll_output_$$ | grep -A 1 ${VG_NAME} | tail -1 | awk -F']' '{print $1}' | awk -F'=' '{print $2}' | sed 's/G//'`
VOLUME_NAME=disk
fi
echo "${HOST_NAME},${VG_NAME},${VOLUME_NAME},${VG_TOTAL_SIZE},${VG_FREE_SIZE},${FS_TOTAL_SIZE},${FS_USED_SIZE},${FS_FREE_SIZE},${FS_USED_RATE},${FS_MOUNTPOINT},,$DGID" >> ${DF_RESULT_FILE}
VG_TOTAL_SIZE=""
VG_FREE_SIZE=""
done
fi
VXVM_DGS=`grep '/vx/' ${DF_DEV_OUTPUT}`
if [ "${VXVM_DGS}x" != "x" ]; then
for VXVM_DG in ${VXVM_DGS}; do
VXVM_DG_NAME=`echo ${VXVM_DG} | awk -F'/' '{print $5}'`
DGID=`vxdg list| grep ${VXVM_DG_NAME}|awk '{print $NF}'`
VXVM_VOLUME_NAME=`echo ${VXVM_DG} | awk -F'/' '{print $6}'`
DG_TOTAL_SIZE=`${VXPRINT_CMD} -dg ${VXVM_DG_NAME} | grep "^dm" | awk '{total+=$5}'END'{printf "%d\n", total/1024/1024/2}'`
DG_FREE_SIZE=`${VXDG_CMD} -g ${VXVM_DG_NAME} free | grep -v "LENGTH" | awk '{free+=$5}'END'{printf "%d\n", free/1024/1024/2}'`
DG_USED_SIZE=`echo ${DG_TOTAL_SIZE} - ${DG_FREE_SIZE} | ${BC_CMD} -l`
VXVM_DF_LINE=`df -k ${VXVM_DG} | grep -v Filesystem | grep '%'`
FS_TOTAL_SIZE=`echo ${VXVM_DF_LINE} | awk '{print $1}'`
if `echo ${FS_TOTAL_SIZE} | grep '/vx' > /dev/null`; then
FS_TOTAL_SIZE_TMP=`echo ${VXVM_DF_LINE} | awk '{print $2}'`
FS_TOTAL_SIZE=`convert_size_unit ${FS_TOTAL_SIZE_TMP}`
FS_USED_SIZE_TMP=`echo ${VXVM_DF_LINE} | awk '{print $3}'`
FS_USED_SIZE=`convert_size_unit ${FS_USED_SIZE_TMP}`
FS_FREE_SIZE_TMP=`echo ${VXVM_DF_LINE} | awk '{print $4}'`
FS_FREE_SIZE=`convert_size_unit ${FS_FREE_SIZE_TMP}`
FS_USED_RATE=`echo ${VXVM_DF_LINE} | awk '{print $5}'`
FS_MOUNTPOINT=`echo ${VXVM_DF_LINE} | awk '{print $6}'`
else
FS_TOTAL_SIZE_TMP=`echo ${VXVM_DF_LINE} | awk '{print $1}'`
FS_TOTAL_SIZE=`convert_size_unit ${FS_TOTAL_SIZE_TMP}`
FS_USED_SIZE_TMP=`echo ${VXVM_DF_LINE} | awk '{print $2}'`
FS_USED_SIZE=`convert_size_unit ${FS_USED_SIZE_TMP}`
FS_FREE_SIZE_TMP=`echo ${VXVM_DF_LINE} | awk '{print $3}'`
FS_FREE_SIZE=`convert_size_unit ${FS_FREE_SIZE_TMP}`
FS_USED_RATE=`echo ${VXVM_DF_LINE} | awk '{print $4}'`
FS_MOUNTPOINT=`echo ${VXVM_DF_LINE} | awk '{print $5}'`
fi
if [ "${VXVM_DG_NAME}x" = "x" ]; then
VXVM_DG_NAME='-'
fi
echo "${HOST_NAME},${VXVM_DG_NAME},${VXVM_VOLUME_NAME},${DG_TOTAL_SIZE},${DG_FREE_SIZE},${FS_TOTAL_SIZE},${FS_USED_SIZE},${FS_FREE_SIZE},${FS_USED_RATE},${FS_MOUNTPOINT},,$DGID" >> ${DF_RESULT_FILE}
done
fi
rm -f ${DF_DEV_OUTPUT} ${VGDISPLAY_OUTPUT} /tmp/multipath_ll_output_$$
fi
}
#
#
#
show_usage ()
{
echo ""
echo "Usage:"
echo "`basename $0` -h -c -g -d"
echo " -h = Show this usage."
echo " -c = Check the disk path."
echo " -g = Get disk path configurations."
echo " -d = Get df result informations."
echo ""
}
#if [ $# -lt 1 ]; then
# show_usage
# exit 0
#fi
#while getopts \?hcgd flag; do
# case ${flag} in
# \?|h) show_usage
# exit 0 ;;
# c) CHECK_FLAG=1 ;;
# g) GET_FLAG=1 ;;
# d) GET_DF_FLAG=1 ;;
# esac
#done
GET_DF_FLAG=1
GET_FLAG=1
if [ "${CHECK_FLAG}" = "0" -a "${GET_FLAG}" = "0" -a "${GET_DF_FLAG}" = "0" ]; then
show_usage
exit 0
fi
if [ `/usr/bin/whoami` != "root" ]; then
echo "This script should be runed by root."
exit 1
fi
if [ "${CHECK_FLAG}" = "1" ]; then
SCRIPT_RUNNING_FLAG=`ps -ef | grep "${SCRIPT_NAME} -c" | grep -v grep | wc -l`
#
# Will fork a new progress,so should be great than 3.
#
if [ ${SCRIPT_RUNNING_FLAG} -ge 3 ]; then
echo "The check path script still running, pls wait."
exit 1
fi
#
# Clear the old error log
#
cat /dev/null > ${DISK_PATH_ERROR}
check_paths_multipath
check_paths_vxvm
if [ -s ${DISK_PATH_ERROR} ]; then
cat ${DISK_PATH_ERROR}
else
echo "[OK]: [${HOST_NAME}] All paths are right." >> ${DISK_PATH_ERROR}
fi
fi
if [ "${GET_FLAG}" = "1" ]; then
SCRIPT_RUNNING_FLAG=`ps -ef | grep -v "${SCRIPT_NAME} -c" | grep "${SCRIPT_NAME}" | grep -v grep | wc -l`
if [ ${SCRIPT_RUNNING_FLAG} -ge 3 ]; then
echo "This script still running, pls wait."
exit 1
fi
get_config_multipath
get_config_vxvm
chmod 644 ${GET_RESULT}
fi
if [ "${GET_DF_FLAG}" = "1" ]; then
SCRIPT_RUNNING_FLAG=`ps -ef | grep -v "${SCRIPT_NAME} -c" | grep "${SCRIPT_NAME}" | grep -v grep | wc -l`
if [ ${SCRIPT_RUNNING_FLAG} -ge 3 ]; then
echo "This script still running, pls wait."
exit 1
fi
get_df_config
chmod 644 ${DF_RESULT_FILE}
fi
rm -rf ${TMP_DIR}
#echo collect debug info
currentTime=`date "+%Y-%m-%d %H:%M:%S"`
echo $currentTime 'End Collect' >> /home/stadmin/testdate.log
阅读(2341) | 评论(0) | 转发(0) |