#!/bin/ksh93
# IBM_PROLOG_BEGIN_TAG
# This is an automatically generated prolog.
#
# perf720 src/perf/pmaix/usr/bin/pmcfg/pmcfg_ext 1.17
#
# Licensed Materials - Property of IBM
#
# Restricted Materials of IBM
#
# COPYRIGHT International Business Machines Corp. 2012,2014
# 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
#########################################################################
# Purpose: #
# pmcfg_ext is configuration script for Performance Management #
# called from pmcfg to collect additional data #
# Functions: #
# Configure_Environment #
# CollectSppData #
# CollectCrossLparData #
# CollectAmsData #
# Parse_Inputs #
#########################################################################
LANG=C
Usage()
{
echo "Usage: pmcfg_ext [ -A | -C ] "
#echo "-S Prints shared processor pool info"
echo "-A Prints Active memory sharing info"
echo "-C Provide Cross Lpar Info "
}
Configure_Environment()
{
# ------------------------------------------------------------
# Get the hostname from uname and append to the data directory
# -----------------------------------------------------------
HOSTNAME=`/usr/bin/hostname -s`
#only DATADIR,TODAY, LOGFILE variables are exported as they
# are required in pmcfg_ext script
DATADIR=/var/perf/pm/daily/${HOSTNAME}
PMCONF=/var/perf/pm/config/pmconf
PMRecService=pmperfrec
TODAY=`/usr/bin/date +%Y.%m.%d.%a`
LOGFILE=/var/perf/pm/daily/pmcfg.log
# Compress today's stats and process files
PmcfgExtStartHr=$(date +%H)
PmcfgExtStartMin=$(date +%M)
TYP=`/usr/bin/lparstat -i | /usr/bin/grep -iw Type | /usr/bin/cut -d":" -f 2 | /usr/bin/cut -d"-" -f 1`
TYP=`echo $TYP | /usr/bin/sed 's/ //g'`
if [[ $TYP == "Dedicated" ]]
then
EXT_SECTION="E1"
else
EXT_SECTION="shrpool E1"
fi
hw_sup=`/usr/sbin/getsystype -i | /usr/bin/awk '{print $2}' 2>/dev/null`
memtyp=`lparstat -i | grep -iw "Memory Mode" | /usr/bin/cut -d":" -f 2 | /usr/bin/cut -d"-" -f 1`
memtyp=`echo $memtyp | /usr/bin/sed 's/ //g'`
if [[ $memtyp != "Dedicated" ]] then
EXT_SECTION="$EXT_SECTION shrmem"
fi
/usr/bin/lssrc -s ${PMRecService} >/dev/null 2>&1
if [[ $? -eq 0 ]]
then
EXT_SECTION="$EXT_SECTION meminfo"
fi
}
CollectSppData()
{
#set -x
if [[ ${hw_sup} -le 6 ]]
then
return
fi
SppstatsFile="${DATADIR}/pm_shrprocstat.${TODAY}"
SPP_SCRIPT_CMD="/var/perf/pm/bin/shrpoolinfo"
${SPP_SCRIPT_CMD} ${SppstatsFile} 2>&4
}
CollectAmsData()
{
#set -x
if [[ ${hw_sup} -le 6 ]]
then
return
fi
AmsstatsFile="${DATADIR}/pm_amsstat.${TODAY}"
AMS_SCRIPT_CMD="/var/perf/pm/bin/amsinfo"
${AMS_SCRIPT_CMD} ${AmsstatsFile} 2>&4
}
GetYesterday()
{
year=`echo ${TODAY} | /usr/bin/cut -c 1-4`
mon=`echo ${TODAY} | /usr/bin/cut -c 6,7`
day=`echo ${TODAY} | /usr/bin/cut -c 9,10`
wday=`echo ${TODAY} | /usr/bin/cut -c 12-14`
myyear=${year}
mymon=${mon}
myday=$((${day}-1))
if [[ ${myday} -eq 0 ]] then
mymon=$((${mon}-1))
if [[ ${mymon} -eq 0 ]] then
myyear=$((${year}-1))
mymon=12
myday=31
else
case ${mymon} in
1|3|5|7|8|10|12) myday=31;;
4|6|9|11) myday=30;;
2)
modyear=$((${year}%4))
if [[ ${modyear} -eq 0 ]] then
myday=29
else
myday=28
fi
;;
esac
fi
fi
case $wday in
"Mon") mywday="Sun";;
"Tue") mywday="Mon";;
"Wed") mywday="Tue";;
"Thu") mywday="Wed";;
"Fri") mywday="Thu";;
"Sat") mywday="Fri";;
"Sun") mywday="Sat";;
esac
if [[ $myday -lt 10 ]] then
myday="0${myday}"
fi
if [[ $mymon -lt 10 ]] then
mymon=$((${mymon}/1))
mymon="0${mymon}"
fi
YESTERDAY="${myyear}.${mymon}.${myday}.${mywday}"
YESTERDAY_YYYYMMDD="${myyear}${mymon}${myday}"
}
# To filenames passed as arguments located in PM output folder will be compressed
CompressFiles()
{
FileList=$*
if [[ $FileList == "" ]]
then
return
fi
# Loop throught each file name
for pmfile in $FileList
do
# If filename is not compressed already
if [[ ${pmfile##*.} != "Z" ]]
then
# Force compress to avoid any prompt
/usr/bin/compress -f ${DATADIR}/${pmfile} >&4 2>&4
if [[ $? -ne 0 ]]
then
echo "Failed to compress ${DATADIR}/${pmfile} file" >&4 2>&4
fi
fi
done
}
# To filenames passed as arguments located in PM output folder will be uncompressed
UnCompressFiles()
{
FileList=$*
if [[ $FileList == "" ]]
then
return
fi
# Loop throught each file name
for pmfile in $FileList
do
# if Z is at end of filename and uncompressed file does not exist
if [[ ${pmfile##*.} == "Z" && ! -e ${pmfile%.Z} ]]
then
/usr/bin/uncompress ${DATADIR}/${pmfile} >&4 2>&4
if [[ $? -ne 0 ]]
then
echo "Failed to uncompress ${DATADIR}/${pmfile} file" >&4 2>&4
fi
else
echo "Either file ${pmfile} is not compressed or uncompressed file ${pmfile%.Z} already exist!" >&4 2>&4
fi
done
}
CollectCrossLparData()
{
# Appending errors to log file
#set -x
if [[ ${hw_sup} -lt 6 || ${hw_sup} -gt 7 ]]
then
if [[ ${hw_sup} -gt 7 ]]
then
XlparInt=`/usr/bin/grep Xlpar_Interval ${PMCONF} | /usr/bin/awk -F ':' '{print $2}'`
/var/perf/pm/bin/config_pm_ext.sh -C "${XlparInt}"
fi
return
fi
ClparTmpFile="${DATADIR}/pm_crosslparstat.tmp"
CLPAR_SCRIPT_CMD="/var/perf/pm/bin/crosslpar"
${CLPAR_SCRIPT_CMD} ${ClparTmpFile} 2>&4
if [[ -f ${ClparTmpFile} ]] then
Xlpar_Hour=`date +%H`
Xlpar_Min=`date +%M`
if [[ (${Xlpar_Hour} -eq 0) && (${Xlpar_Min} -lt 14) ]] then
GetYesterday
CLPARstatsFile="${DATADIR}/pm_crosslparstat.${YESTERDAY}"
statsfile="${DATADIR:?}/pm_stats.${YESTERDAY}"
statssend="${DATADIR:?}/pm_stats.send"
if [[ -f ${CLPARstatsFile} ]] then
`/usr/bin/egrep -v "date and time|Clock Offset|^$" ${CLPARstatsFile} >> ${ClparTmpFile}` 2>&4
#`/usr/bin/cat ${CLPARstatsFile} >> ${ClparTmpFile}` 2>&4
fi
/usr/bin/mv ${ClparTmpFile} ${CLPARstatsFile} 2>&4
# Wait for pmcfg to complete to avoid corrupting pm_stats.date file
if [[ ! -f $statssend ]]
then
/usr/bin/sleep 60
if [[ ! -f $statssend ]]
then
echo " Error Generating $statsfile " 2>&4
return
fi
fi
if [[ -f $statsfile ]] then
echo "" >> ${statsfile} 2>&4
echo "# " >> ${statsfile} 2>&4
/usr/bin/cat $CLPARstatsFile >> ${statsfile} 2>&4
echo "" >> ${statsfile} 2>&4
fi
# Call pmcfg to regenerate pm_stats.send file
/var/perf/pm/bin/pmcfg -D ${YESTERDAY_YYYYMMDD} -n
else
CLPARstatsFile="${DATADIR}/pm_crosslparstat.${TODAY}"
if [[ -f ${CLPARstatsFile} ]] then
`/usr/bin/egrep -v "date and time|Clock Offset|^$" ${CLPARstatsFile} >> ${ClparTmpFile}` 2>&4
#`/usr/bin/cat ${CLPARstatsFile} >> ${ClparTmpFile}` 2>&4
fi
/usr/bin/mv ${ClparTmpFile} ${CLPARstatsFile} 2>&4
fi
fi
}
# Process the pmcfg required flags
ProcessPmcfgFlag()
{
# Get the first argument in action variable
action=$1
# Remove the first argument
shift
while getopts ':D:' flag
do
case ${flag} in
D)
# -D option for pmcfg, re-transmit required stats file
if [[ ${action} == "-pre" ]]
then
# uncompress the required stats files before re-transmitting
Dvalue=${OPTARG}
if [[ ${Dvalue} -eq 0 ]]
then
# Get all compressed stats file names
Files_To_UnCompress=$(/usr/bin/ls ${DATADIR} | /usr/bin/grep "^pm_stats.[[:digit:]]\{4\}.[[:digit:]]\{2\}.[[:digit:]]\{2\}.[[:alpha:]]\{3\}.Z$" 2>&4)
else
#Convert the YYYYMMDD to YYYY.MM.DD
year=`echo ${Dvalue} | /usr/bin/cut -c 1-4`
month=`echo ${Dvalue} | /usr/bin/cut -c 5,6`
day=`echo ${Dvalue} | /usr/bin/cut -c 7,8`
date=${year}.${month}.${day}
# Uncompress the stats.date file if its found and compressed
Files_To_UnCompress=$(/usr/bin/ls ${DATADIR} | /usr/bin/grep "^pm_stats.${date}.*.Z$" 2>&4)
fi
# Get all filenames in one line
FileList=$(echo ${Files_To_UnCompress} | tr '\n' ' ')
# If no compressed stats files found, dont call Uncompress Function
if [[ ! -z ${FileList} ]]
then
UnCompressFiles "${FileList}" 2>&4
fi
elif [[ ${action} == "-post" ]]
then
# compress the stats files after re-transmitting
Dvalue=${OPTARG}
if [[ ${Dvalue} -eq 0 ]]
then
# Get all uncompressed stats file names
Files_To_Compress=$(/usr/bin/ls ${DATADIR} | /usr/bin/grep "^pm_stats.[[:digit:]]\{4\}.[[:digit:]]\{2\}.[[:digit:]]\{2\}.[[:alpha:]]\{3\}$" | \
/usr/bin/grep -v "${TODAY}$" 2>&4)
else
#Convert the YYYYMMDD to YYYY.MM.DD
year=`echo ${Dvalue} | /usr/bin/cut -c 1-4`
month=`echo ${Dvalue} | /usr/bin/cut -c 5,6`
day=`echo ${Dvalue} | /usr/bin/cut -c 7,8`
date=${year}.${month}.${day}
# Compress the stats.date file if its found and uncompressed
Files_To_Compress=$(/usr/bin/ls ${DATADIR} | /usr/bin/grep "^pm_stats.${date}.*" | /usr/bin/grep -v ".Z$" | /usr/bin/grep -v "${TODAY}$" 2>&4)
# Now search for the pm_stats file
fi
# Get all filenames in one line
FileList=$(echo ${Files_To_Compress} | tr '\n' ' ')
# If no uncompressed stats files found, dont call Compress Function
if [[ ! -z ${FileList} ]]
then
CompressFiles "${FileList}" 2>&4
fi
fi
;;
esac
done
}
# Parse the input flags and set the appropriate flags
Parse_Inputs()
{
while getopts 'Cgs' flag 2>/dev/null
do
case ${flag} in
#S)
# Collect Shared Processor related statistics and exit
# Call CollectSppData function
#CollectSppData
#exit
#;;
#A)
# Collect Shared Memory Pool related statistics and exit
# Call CollectAmsData function
#CollectAmsData
#exit
#;;
C)
# Collect Cross Lpar related statistics and exit
# Call CollectCrossLparData function
CollectCrossLparData
exit
;;
g)
#Get all new section tags
echo ${EXT_SECTION}
exit
;;
s)
# Collect Software info and exit
# Call GetSoftwareInfo function
GetSoftwareInfo
exit
;;
[?])
Usage
;;
esac
done
}
GetSoftwareInfo()
{
#set -x
# Check if AIX 6.1 and if its not VIO, do not collect software info
OSLEVEL=`/usr/bin/oslevel | awk -F'.' '{printf $1"."$2}'`
if [[ ${OSLEVEL} == "6.1" && ! -f /usr/ios/cli/ioscli ]]
then
return
fi
statsfile="${DATADIR:?}/pm_stats.${TODAY}"
if [[ ! -e ${statsfile} ]]
then
# If the stats file is not generated, return to calling function
echo "statsfile ${statsfile} not found to update software info" >&4
return
fi
# Get today's day of the month (1 to 31)
CurDayOfMon=`date +%d`
# Collect software info only if day is first day of the month
if [[ ${CurDayOfMon} -eq 1 ]] then
echo "" >> ${statsfile} 2>&4
echo "#Fileset,Level,Description" >> ${statsfile} 2>&4
# Get list of licensed software,
# Replace blank space with #_# to use complete line in for loop
for lin in `/usr/sbin/inulag -lc -n all | /usr/bin/awk -F':' '{print $1":"$4}' | /usr/bin/sed 's/ /#_#/g' | /usr/bin/grep -v ^Fileset`
do
levl=""
# Replace #_# with blank space
line=`echo $lin | /usr/bin/sed 's/#_#/ /g'`
filset=`echo $line | /usr/bin/cut -d':' -f1`
# If the fileset name is blank, go to next line
if [[ -z $filset ]]
then
continue
fi
# Get fileset level
levl=`/usr/bin/lslpp -lc $filset | /usr/bin/grep -v '#Fileset' | /usr/bin/head -1 | /usr/bin/awk -F':' '{print $3}'`
fildes=`/usr/bin/lslpp -lc $filset | /usr/bin/grep -v '#Fileset' | /usr/bin/head -1 | /usr/bin/awk -F':' '{print $7}'`
echo "$filset,$levl,$fildes" >> ${statsfile} 2>&4
done
echo >> ${statsfile} 2>&4
echo "RPM" >> ${statsfile} 2>&4
# Get rpm package list
for pkgs in `/usr/bin/rpm -qa`
do
# For each rpm package, get details like version and summary info
val=`/usr/bin/rpm -qi $pkgs | /usr/bin/egrep 'Name|Version|Summary'`
pkgnam=`echo "$val" | /usr/bin/grep Name | /usr/bin/awk '{print $3}'`
pkgver=`echo "$val" | /usr/bin/grep Version | /usr/bin/awk '{print $3}'`
pkgsum=`echo "$val" | /usr/bin/grep Summary | /usr/bin/awk -F':' '{print $2}'`
echo "$pkgnam,$pkgver,$pkgsum" >> ${statsfile} 2>&4
done
echo "" >> ${statsfile} 2>&4
fi
}
main()
{
## Check for RBAC authorization
if [[ -f /usr/ios/cli/ioscli ]]
then
# If its vios, check for vios authorization
/usr/bin/ckauth vios.system.perfmgr.config
rc=$?
if [[ $rc -ne 0 ]]; then
exit 1
fi
else
# If its aix, check for aix authorization
/usr/bin/ckauth aix.system.perfmgr.config
rc=$?
if [[ $rc -ne 0 ]]; then
exit 1
fi
fi
Configure_Environment
exec 4>>${LOGFILE}
#collect shared processor pool and shared memory pool data if this program is called without arguments
#else parse the inputs to determine the path to follow.
if [ $# -eq 0 ]
then
statsfile="${DATADIR:?}/pm_stats.${TODAY}"
# Customer Demographics from ESA by calling function GetESACustInfo in config_pm_ext.sh
/var/perf/pm/bin/config_pm_ext.sh -E 2>&4
SppstatsFile="${DATADIR}/pm_shrprocstat.${TODAY}"
if [[ -f $SppstatsFile ]]
then
echo "" >> ${statsfile} 2>&4
/usr/bin/cat $SppstatsFile >> ${statsfile} 2>&4
echo "" >> ${statsfile} 2>&4
fi
MemInfoFile="${DATADIR}/pm_meminfo.${TODAY}"
if [[ -f $MemInfoFile ]]
then
echo "" >> ${statsfile} 2>&4
/usr/bin/cat $MemInfoFile >> ${statsfile} 2>&4
echo "<\meminfo>" >> ${statsfile} 2>&4
fi
AmsstatsFile="${DATADIR}/pm_amsstat.${TODAY}"
if [[ -f $AmsstatsFile ]]
then
echo "" >> ${statsfile} 2>&4
/usr/bin/cat $AmsstatsFile >> ${statsfile} 2>&4
echo "" >> ${statsfile} 2>&4
fi
# If POWER 8, append Crosslpar output to PM stats file
if [[ ${hw_sup} -gt 7 ]]; then
CLPARstatsFile="${DATADIR}/pm_crosslparstat.${TODAY}"
if [[ -f ${statsfile} && -f ${CLPARstatsFile} ]]; then
echo "" >> ${statsfile} 2>&4
echo "# " >> ${statsfile} 2>&4
/usr/bin/cat $CLPARstatsFile >> ${statsfile} 2>&4
echo "" >> ${statsfile} 2>&4
fi
fi
# Get software information
GetSoftwareInfo
# Compress PM output files
if [[ (${PmcfgExtStartHr} -eq 23) && (${PmcfgExtStartMin} -ge 55) ]] then
Files_To_Compress=$(/usr/bin/ls ${DATADIR} | /usr/bin/egrep "^pm_stats|^pm_process|^pm_shrprocstat|^pm_amsstat|^pm_meminfo|^pm_crosslparstat" | \
/usr/bin/egrep -v ".send$|${TODAY}$|.Z$" 2>&4)
# Get all filenames in one line
FileList=$(echo ${Files_To_Compress} | tr '\n' ' ')
# If no compressed stats files found, dont call Compress Function
if [[ ! -z ${FileList} ]]
then
CompressFiles ${FileList} 2>&4
fi
fi
/usr/bin/grep "# PMExt:2" ${PMCONF} > /dev/null 2>&1
if [ $? -ne 0 ]
then
return
fi
# Collect shared processor pool data
# ----------------------------------
#CollectSppData
#CollectAmsData
else
# pre and post processing of pmcfg flag
if [[ "$1" == "-pre" || "$1" == "-post" ]]
then
ProcessPmcfgFlag $*
else
Parse_Inputs $*
fi
fi
return
}
main $*