#!/bin/ksh
# IBM_PROLOG_BEGIN_TAG 
# This is an automatically generated prolog. 
#  
# bos72Q src/bos/usr/sbin/prtconf/prtconf.sh 1.21.1.10 
#  
# Licensed Materials - Property of IBM 
#  
# Restricted Materials of IBM 
#  
# COPYRIGHT International Business Machines Corp. 2001,2019 
# 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 
# @(#)08	1.21.1.10  src/bos/usr/sbin/prtconf/prtconf.sh, uw7cmds, bos72Q, q2019_26A7 5/2/19 12:15:10
# ************************************************************************ 
# *  Program: prtconf                                                    *
# *  Purpose: To list the system configuration.                          * 
# ************************************************************************ 

usage(){                                                 
        msg=`/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 47 "Usage: prtconf [-c] [-k] [-L] [-m] [-s] [-v]"`
	echo "${msg}"
        exit 2                                           
}
getstatic_ip()
{
    IF=`netstat -rn | grep default | grep -v "link" | awk '{printf "%s,",$6}'`
        IF=${IF%%,*}
    if [ -z "$IF" ]; then
        IF=`lsdev -Cc if -S a -F name | grep -v "^lo0" | awk '{printf "%s,",$1}'`
            IF=${IF%%,*}
    fi

#echo $IF
#  if there is no configured interface and there are interfaces, get
#  the first one.
    if [ -z "$IF" -a  -n "$INTERFACES" ]; then
            IF=${INTERFACES%%,*}
    fi
#  After all this, there is no interface, i.e. no LAN device is available
#  If TCPIP client package is installed, we will have loop back configured,
#  so use it.
    if [ -z "$IF" ]; then
         IF="lo0"
    fi
#echo $IF
    CONFIG_MODE=Basic
    if [ "$IF" != "lo0" ]; then
# get IPv6 address and prefixlen if available
        addr6=`odmget -q "name=$IF and attribute=netaddr6" CuAt | grep value | awk '{print $3}' | sed 's/"//g'`
        if [ -n "${addr6}" ]; then
            addr6=`echo $addr6 | sed 's/:/\\\\\\\\\\\\\\\\\\:/g'`
            fi
                prefixlen=`odmget -q "name=$IF and attribute=prefixlen" CuAt | grep value | awk '{print $3}' | sed 's/"//g'`
            fi

}

# Check for command line flags
while getopts :ckLmstv args
do
    isopts=1 # If there are no command line switches, isopts undefined.
    case $args in
	c) cflag=1;;
	k) kflag=1;;
	L) Lflag=1;;
	m) mflag=1;;
	s) sflag=1;;
	t) tflag=1;;
	v) vflag=1;;
	\?)usage;;
    esac
done    

#Add /usr/sbin to the PATH variable
export PATH=/usr/sbin:/usr/bin:$PATH

#Change LC_ALL to C when capturing command output
oldLCALL=$LC_ALL
export LC_ALL=C

# System information

msize=$(( `lsattr -El sys0 -a realmem -F value` / 1024 ))

procstr=`lsdev -Sa -Cc processor`

if [[ -n ${procstr} ]]
then
    procspeed=`lsattr -El ${procstr%% *} -a frequency -F value`
fi

cputype=`getsystype -y`
kerntype=`getsystype -K`
lparinfo=`uname -L`
implementation_mode=`getsystype -i`
system_type=`getsystype -t`
version=`getsystype -v`

# Pre-5.2, `uname -L` returns a leading "AIX"
# Check for a leading AIX and remove it
if [[ $lparinfo = AIX* ]]
then
lparinfo=${lparinfo#* }
fi


# Ensure that procspeed is not null, since the conversion to MHz below will
# cause the script to exit with an error if null.
if [[ ! -z $procspeed ]]
then
    # Convert procspeed to MHz, and round up or down
    if (( ($procspeed%1000000) >= 500000 ))
    then
    	(( procspeedMHz=($procspeed/1000000) + 1 ))
    else
    	(( procspeedMHz=($procspeed/1000000) ))
    fi
fi

export LC_ALL=$oldLCALL

#Handle flags
# -c
if [[ ! -z $cflag ]] then
    /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 49 "CPU Type:"
    echo " ${cputype}-bit"
fi

# -k
if [[ ! -z $kflag ]] then
    /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 50 "Kernel Type:"
    echo " ${kerntype}-bit"
fi

# -L
if [[ ! -z $Lflag ]] then
    /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 51 "LPAR Info:"
    echo " ${lparinfo}"
fi

# -m
if [[ ! -z $mflag ]] then
    /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 2 "Memory Size:"
    echo " ${msize} MB"
fi

# -s
if [[ ! -z $sflag ]] then
    /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 48 "Processor Clock Speed:"
    if [[ -n ${procspeedMHz} ]]
    then
	echo " ${procspeedMHz} MHz"
    else
	print " \c"
        /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 53 "Not Available"
	echo
    fi
fi

# -t
if [[ ! -z $tflag ]] then
    /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 58 "System Type:"
    echo " ${system_type}"
fi

# -v
if [[ ! -z $vflag ]] then
    # Switch back to orignal language before lscfg -v
    lscfg -v
fi


#If there are not command line options, do the default output
if [[ -z $isopts ]] then

# Back to C
export LC_ALL=C

model=`lsattr -El sys0 -a modelname -F value`
# Get Serial number
serial=`lscfg -vpl sysplanar0 2>/dev/null|grep -p "System:" |grep "Machine/Cabinet"`
if [[ $? -eq 0 ]]; then
    serial=${serial##*.}
else
    serial=`lscfg -vpl sysplanar0 2>/dev/null|grep -p "System VPD:" |grep "Machine/Cabinet"`
    if [[ $? -eq 0 ]]; then
	serial=${serial##*.}
    else
	noserial=1
    fi
fi

goodsize=$(lsattr -El mem0 2>/dev/null | grep goodsize)
rc=$?
if [[ $rc -eq 0 ]]
then
    gsize=`echo ${goodsize} | awk '/^goodsize/ {print $2}'`
fi

proc_no=`lsdev -Cc processor | grep Available | head -1 | cut -d' ' -f1`
if [[ -n ${proc_no} ]]
then
    proctype=`lsattr -El $proc_no | awk '/^type/ {print $2}'`
fi

numproc=`lsdev -Cc processor | grep Available | wc -l`
numproc=${numproc##* }

# Find the platform firmware level. The command line interface for obtaining
# the platform firmware level is different for Regatta and Squadron hardware.
# Let us first find whether the system is Squadron or not, using dmpdt_chrp.

/usr/lib/boot/bin/dmpdt_chrp 2>&1 | grep "ibm,manage-flash-image" > /dev/null 2>&1
rc=$?
if [ rc -eq 0 ]
then
	# Squadron systems
	# "lscfg -vp | grep Product Specific.(MI)" command by default will give 
	# three firmware levels : current temporary level, current permanent 
	# level & current level using which the system is booted. Since it is 
	# more appropriate to display the currently booted firmware level, lsconf 
	# will display only this value, which is the last field value.
	pfwversion=`lscfg -vp | egrep "Product Specific.\(MI\)|Microcode Image" | awk '{print $NF}'`
elif [ rc -eq 1 ]
then
	# Regatta or older systems
	pfwversion=`lscfg -vp | grep -p Platform | grep "ROM Level" | sed 's/\./ /g' | awk '{print $4}'`
fi

# If both the conditions fail, use lsmcode command to get current platform firmware level
if [ "$pfwversion" = "" ]
then
	pfwversion=`/usr/sbin/lsmcode -r | awk '{print $((NF-1))}' 2>/dev/null`
	if [ "$?" -ne 0 ]
	then
		pfwversion=""
	fi
fi

fwversion=`lsattr -El sys0 -a fwversion -F value`
conslogin=`lsattr -El sys0 -a conslogin -F value`
autorestart=`lsattr -El sys0 -a autorestart -F value`
fullcore=`lsattr -El sys0 -a fullcore -F value`

# Back to $oldLCALL
export LC_ALL=$oldLCALL

/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 1 "System Model:"
echo " ${model}"

#Print out serial if found, otherwise "Not available"
if [[ -z $noserial ]] then
    /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 52 "Machine Serial Number:"
    echo " ${serial}"
else
    /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 52 "Machine Serial Number:"
    print " \c"
    /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 53 "Not Available"
    echo
fi

/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 5 "Processor Type:"
if [[ -n ${proctype} ]]
then
    echo " ${proctype}"
else
    print " \c"
    /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 53 "Not Available"
    echo
fi

/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 55 "Processor Implementation Mode:"
echo " ${implementation_mode}"

/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 56 "Processor Version:"
echo " ${version}"

/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 4 "Number Of Processors:"
echo " ${numproc}"

/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 48 "Processor Clock Speed:"
if [[ -n ${procspeedMHz} ]]
then
    echo " ${procspeedMHz} MHz"
else
    print " \c"
    /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 53 "Not Available"
    echo
fi

/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 49 "CPU Type:"
echo " ${cputype}-bit"

/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 50 "Kernel Type:"
echo " ${kerntype}-bit"

/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 51 "LPAR Info:"
echo " ${lparinfo}"

/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 2 "Memory Size:"
echo " ${msize} MB"

/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 3 "Good Memory Size:"
if [[ -n ${gsize} ]]
then
    echo " ${gsize} MB"
else
    print " \c"
    /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 53 "Not Available"
    echo
fi

#Print out Platform Firmware level if found, otherwise "Not available"
if [[ -n $pfwversion ]]; then
    /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 54 "Platform Firmware level:"
    echo " ${pfwversion}"
else
    /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 54 "Platform Firmware level:"
    print " \c"
    /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 53 "Not Available"
    echo
fi

/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 6 "Firmware Version:"
echo " ${fwversion}"

/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 7 "Console Login:"
echo " ${conslogin}"

/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 8 "Auto Restart:"
echo " ${autorestart}"

/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 9 "Full Core:"
echo " ${fullcore}"                                               

cryptotype=`getsystype -p`
if [[ -n $cryptotype ]]; then
/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 57 "NX Crypto Acceleration:"
        echo " ${cryptotype}"
fi

in_core_type=`getsystype -c`
if [[ -n $in_core_type ]]; then
/usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 59 "In-Core Crypto Acceleration:"
        echo " ${in_core_type}"
fi

echo " "
#Back to C
export LC_ALL=C
# Network Information
if [[ -n $(lsdev -Cc if) ]]; then 
     VimDATA="/tmp/$$"
     #  Discover the interfaces. loopback (lo0) and Tunnel (cti*) are not
     #  configurable interfaces. Serial optical is not support for this
     #  release.
     INTERFACES=`lsdev -Cc if -F name | grep -v "^lo" | grep -v "^cti" | grep -v "^so" | grep -v "^ca" | grep -v "^es" | awk '{printf "%s,",$1}'`
     INTERFACES=${INTERFACES%,}
     addr6=""
     prefixlen=""
     OUTPUT=""
     lssrc -s dhcpcd | grep active >/dev/null
     RC=$?
     if [[ $RC -eq 0 ]] ; then
         # this is a dhcp client machine
         dhcp_ipaddr=`lssrc -ls dhcpcd | grep -v "^Log" | grep -v "^Tracing" | grep -v "^ " | grep -v "^Subsystem" | grep -v dhcpcd | grep -v "^Interface" | awk '{printf "%s",$2}'`
         IF=`lssrc -ls dhcpcd | grep -v "^Log" | grep -v "^Tracing" | grep -v "^ " | grep -v "^Subsystem" | grep -v dhcpcd | grep -v "^Interface" | awk '{printf "%s,",$1}'`
         IF=${IF%%,*}
         echo $IF
         if [ -n "$IF" ]; then
             CONFIG_MODE=DHCP
         else
           getstatic_ip; 
         fi
     else
        getstatic_ip;   
     fi
     #  Discover the existing configuration data for the interface.
     case $IF in
	 at[0-7] ) /usr/sbin/mktcpip.atm -S $IF 2>${VimDATA}.mktcpip
               	   ;;
       	 * ) /usr/sbin/mktcpip -S $IF 2>&1 | grep -v "^lsattr" | grep -v "device configuration" >${VimDATA}.mktcpip
               	   ;;
     esac
     #  Generate the header for wsmoutput
     HEADER=`grep "^#" ${VimDATA}.mktcpip | sed 's/#//'`
     HEADER="interface:Config_mode:addr6:prefixlen:$HEADER"
     #echo $HEADER
     #  Generate the output string to wsmoutput
     OUTPUT=`cat ${VimDATA}.mktcpip | grep -v "^#"`
     # OUTPUT="$addr6:$prefixlen:$OUTPUT"
     # OUTPUT="$IF:$CONFIG_MODE:$OUTPUT"
     IFS=':'
     set -A LineBuf $OUTPUT
     hostname=${LineBuf[0]}
     ipaddr=${LineBuf[1]}
     subnet=${LineBuf[2]}
     nameserv=${LineBuf[4]}
     domainname=${LineBuf[5]}
     gw=${LineBuf[6]}
     IFS=" "
     if [ -z "${addr6}" ]
            then IPaddress=${ipaddr}
            else IPaddress=${addr6}
     fi
     #Back to oldLCALL
     export LC_ALL=$oldLCALL
     /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 20 "Network Information"
     echo ""
     /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 21 "\tHost Name:"
     echo " ${hostname}"
     if [ ${CONFIG_MODE} = "DHCP" ]
       then
            /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 22 "\tIP Address:"
            echo " ${dhcp_ipaddr}"
       else
            /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 22 "\tIP Address:"
            echo " ${IPaddress}"
     fi
     /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 23 "\tSub Netmask:"
     echo " ${subnet}"

     /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 24 "\tGateway:"
     echo " ${gw}"

     /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 25 "\tName Server:"
     echo " ${nameserv}"

     /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 26 "\tDomain Name:"
     echo " ${domainname}"

     rm -f ${VimDATA}.mktcpip

else
     /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 20 "Network Information"
     echo 
     /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 53 "Not Available"
     echo
fi

# Paging Space information
     echo " "
     /usr/bin/dspmsg -s 1 cmdsolsysmgt 10 "Paging Space Information"
     echo ""
     lsps -s | grep MB | while read pagingspace percentused
	do
	  /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 11 "\tTotal Paging Space:"
	  echo " ${pagingspace}"

	  /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 12 "\tPercent Used:"
	  echo " ${percentused}"
	done
# Volume Group information
     echo " "
     /usr/bin/dspmsg -s 1 cmdsolsysmgt.cat 30 "Volume Groups Information"
     echo ""
     echo "============================================================================== "
     lsvg 2>/dev/null 1>/tmp/lsvg.$$.out
     lsvg -o 2>/dev/null 1>/tmp/lsvg.$$.o.out
     vginact=$(awk 'NR==FNR{a[$0];next}!($0 in a)' /tmp/lsvg.$$.o.out /tmp/lsvg.$$.out 2>/dev/null)
#     vgout=$(lsvg)
     if [[ ! -z $vginact ]]; then
        echo "Inactive VGs"
        echo "============================================================================== "
        echo "$vginact"
        echo "============================================================================== "
     fi
     if [[ -s /tmp/lsvg.$$.o.out ]]; then
        echo "Active VGs"
        echo "============================================================================== "
        cat /tmp/lsvg.$$.o.out | while read vg
        do
          lsvg -p ${vg}
          echo "============================================================================== "
          echo " "
        done
        else
        echo "No active VG found"
        echo "============================================================================== "
     fi
     rm -f /tmp/lsvg.$$.out /tmp/lsvg.$$.o.out 2>/dev/null

#devices information
lscfg                                                                     
fi