#!/bin/sh

# This is a script that gathers up information for problem determination.
# The files are created and stored in the $HOME directory
# The resulting tar file is created relative to the $HOME directory
TIMESTAMP=`date +'%Y%m%d_%H.%M.%S'`
OUTFILE_DIRNAME=cwbmedic.$TIMESTAMP
OUTFILE_NAME=$OUTFILE_DIRNAME.out
OUTFILE_DIR=~/$OUTFILE_DIRNAME
OUTFILE=$OUTFILE_DIR/$OUTFILE_NAME
TARFILE=~/cwbmedic.$TIMESTAMP.tar
USER_IBMIACCESS_DIR=.iSeriesAccess

mkdir -p $HOME/$USER_IBMIACCESS_DIR 1> /dev/null 2>&1


set -u
if [ -d $OUTFILE_DIR ]
then
  rm -rf $OUTFILE_DIR > /dev/null 2>&1
fi
set +u

mkdir $OUTFILE_DIR

cp -r $HOME/$USER_IBMIACCESS_DIR $OUTFILE_DIR


HEADERLEN=68

ARCH=`uname -m`
OS=`uname -s`

DEBIAN=false
if which dpkg > /dev/null 2>&1
then
  DEBIAN=true
fi

print_separator()
{
  printf -- '-%.0s' `seq $HEADERLEN` >> $OUTFILE
  echo >> $OUTFILE
}

print_header()
{
  HEADER="$1"
  DESCRIPTION="$2"
  
  DIFF=$(($HEADERLEN - ${#HEADER} - 2))
  LEFT=$(($DIFF / 2))
  RIGHT=$(($DIFF - $LEFT))
  
  printf '=%.0s' `seq $LEFT` >> $OUTFILE
  printf " $HEADER " >> $OUTFILE
  printf '=%.0s' `seq $RIGHT` >> $OUTFILE
  echo >> $OUTFILE
  
  if [ ! -z "$DESCRIPTION" ]
  then
    echo "$DESCRIPTION" >> $OUTFILE
  fi
}

print_status()
{
  printf '.'
}

collect()
{
  HEADER="$1"
  COMMAND="$2"
  
  print_header $HEADER "Output from $COMMAND"
  print_separator
  
  eval $COMMAND >> $OUTFILE 2>&1
  
  echo >> $OUTFILE
  print_status
}

collect_files()
{
  HEADER="$1"
  FILES="$2"
  
  print_header $HEADER
  
  for f in $FILES
  do
    if [ "$f" = "$FILES" ]
    then
      break
    fi
    
    print_separator
    echo $f >> $OUTFILE
    print_separator
    
    cat $f >> $OUTFILE
    echo >> $OUTFILE
  done
  
  echo >> $OUTFILE
  print_status
}

echo "================== IBM i Access Client Solutions ===================" >> $OUTFILE
echo "============================ cwbMedic ==============================" >> $OUTFILE
echo "IBM i Access Client Solutions"
echo "cwbMedic - Service information collection tool"
echo
printf "collecting service information, please wait..."

case $OS in
Linux)
  PATH=/opt/ibm/iaccess/bin:/bin:/usr/bin/:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin:$PATH
  INSTALLDIR=/opt/ibm/iaccess
  ;;
OS400)
  PATH=/QOpenSys/usr/bin:/usr/ccs/bin:/QOpenSys/usr/bin/X11:/usr/sbin:/usr/bin:/QOpenSys/pkgs/bin:$PATH
  ;;
Darwin)
  PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/IBMiAccess/bin:$PATH
  INSTALLDIR=/Library/IBMiAccess
  ;;
esac

export PATH

collect 'DATE' 'date'

collect 'UNAME' 'uname -a'

if [ $OS = Linux ]
then
  if [ -e /etc/os-release ]
  then
    collect 'RELEASE_INFO' 'cat /etc/os-release'
  else
    collect_files 'RELEASE_INFO' '/etc/*-release'
  fi
elif [ $OS = Darwin ]
then
  collect 'RELEASE_INFO' 'system_profiler SPSoftwareDataType'
fi

if [ $OS = Linux ]
then
  if [ $DEBIAN = 'false' ]
  then
    collect 'IBM-IACCESS-PKG-INFO' 'rpm -qi ibm-iaccess'
    
    case $ARCH in
      x86_64|ppc64)
        collect 'IBM-IACCESS-32BIT-PKG-INFO' 'rpm -qi ibm-iaccess-32bit'
        ;;
      *) ;;
    esac
    
  else
    collect 'IBM-IACCESS-PKG-INFO' 'dpkg -s ibm-iaccess'

    case $ARCH in
      x86_64|ppc64)
        collect 'IBM-IACCESS-32BIT-PKG-INFO' 'dpkg -s ibm-iaccess-32bit'
        ;;
      *) ;;
    esac
  fi
elif [ $OS = OS400 ]
then
  collect 'IBM-IACCESS-PKG-INFO' 'rpm -qi ibm-iaccess'
elif [ $OS = Darwin ]
then
  collect 'IBM-IACCESS-PKG-INFO' 'pkgutil --pkg-info com.ibm.iaccess'
fi

if [ $OS = Linux ]
then
  collect 'CPU_INFO' 'cat /proc/cpuinfo'

  collect 'MEMORY_INFO' 'cat /proc/meminfo'
fi

collect 'ENVIRONMENT' 'env'

collect 'ID' 'id'

collect 'PS' 'ps auxw'

if [ $OS = OS400 ]
then
  collect 'DF' 'df'
else
  collect 'DF' 'df -h'
  
  collect 'MOUNT' 'mount'
fi

if [ $OS != OS400 ]
then
  collect 'IFCONFIG' 'ifconfig -a'

  collect 'NETSTAT' 'netstat -r'

  collect 'ARP' 'arp -a'

  collect "DNS_INFO" 'cat /etc/resolv.conf'

  collect "HOST_INFO" 'cat /etc/hosts'
fi

if [ $OS = Linux ]
then
  collect "VERSION_INFO" 'cat /proc/version'

  collect 'DMESG' 'dmesg'
fi

collect 'LOCALE' 'locale'

collect 'ALL_LOCALES' 'locale -a'

collect 'JAVA' 'java -version'

if [ $OS = Linux ]
then
  if [ $DEBIAN = 'false' ]
  then
    collect 'IBM-IACCESS-VERIFY' 'rpm --verify ibm-iaccess'
    
    case $ARCH in
      x86_64|ppc64)
        collect 'IBM-IACCESS-32BIT-VERIFY' 'rpm --verify ibm-iaccess-32bit'
        ;;
      *) ;;
    esac
    
    collect 'ALL-PKG-LIST' 'rpm -qa'
  else
    collect 'IBM-IACCESS-VERIFY' 'debsums -c ibm-iaccess'

    case $ARCH in
      x86_64|ppc64)
        collect 'IBM-IACCESS-32BIT-VERIFY' 'debsums -c ibm-iaccess-32bit'
        ;;
      *) ;;
    esac
    
    collect 'ALL-PKG-LIST' 'dpkg -l'
  fi
elif [ $OS = OS400 ]
then
  collect 'ALL-PKG-LIST' 'rpm -qa'
elif [ $OS = Darwin ]
then
  collect 'ALL-PKG-LIST' 'pkgutil --pkgs'
fi

case $OS in
  Linux) TBLDIR=/opt/ibm/iaccess/conv_tables ;;
  Darwin) TBLDIR=/Library/Caches/ibm-iaccess ;;
  OS400) TBLDIR=/QOpenSys/var/cache/ibm-iaccess ;;
esac
collect 'CONVERSION_TABLES' "ls -l $TBLDIR"

collect 'ODBC_INFO' 'odbcinst -j'

ODBCINST=`odbcinst -j | grep DRIVERS | awk -F': ' '{ print $2 }'`
collect 'DRIVERS' "cat $ODBCINST"

ODBCINI=`odbcinst -j | grep 'SYSTEM DATA SOURCES' | awk -F': ' '{ print $2 }'`
collect 'SYSTEM_DSNS' "cat $ODBCINI"

FILEODBCDIR=`odbcinst -j | grep 'FILE DATA SOURCES' | awk -F': ' '{ print $2 }'`
collect_files 'FILE_DSNS' "$FILEODBCDIR/*"

USERODBCINI=`odbcinst -j | grep 'USER DATA SOURCES' | awk -F': ' '{ print $2 }'`
collect 'USER_DSNS' "cat $USERODBCINI"

if [ $OS != OS400 ]
then
  collect 'IBM-IACCESS_FILE_TREE' "ls -RAlF $INSTALLDIR"
fi

if [ $OS = Linux ]
then
  collect 'SHARED_OBJECT_CACHE_INFO' 'cat /etc/ld.so.conf'

  collect_files 'SHARED_OBJECT_CACHE_ENTRIES_INFO' '/etc/ld.so.conf.d/*'

  collect 'SHARED_OBJECT_CHACHE' 'ldconfig -p'
  LIBDIR=/usr/lib
  LIB64DIR=/usr/lib64

  if [ $DEBIAN = 'true' ]
  then
    case $ARCH in
      i386|x86_64)
        LIBDIR=/usr/lib/i386-linux-gnu
        LIB64DIR=/usr/lib/x86_64-linux-gnu
        ;;
      
      ppc|ppc64)
        LIBDIR=/usr/lib/powerpc-linux-gnu
        LIBDIR=/usr/lib/ppc64-linux-gnu
        ;;
        
      ppc64le)
        LIBDIR=/usr/lib/ppcel-linux-gnu
        LIB64DIR=/usr/lib/ppc64el-linux-gnu
        ;;
    esac
  fi

  collect 'SYMLINK_CHECK_(64)' "ls -l $LIB64DIR/libcwb*"
  collect 'SYMLINK_CHECK_(32)' "ls -l $LIBDIR/libcwb*"

  collect 'LDD_CHECK_(64)' "ldd $INSTALLDIR/lib64/*.so"
  collect 'LDD_CHECK_(32)' "ldd $INSTALLDIR/lib/*.so"
elif [ $OS = Darwin ]
then
  collect "OTOOL_LIB_CHECK" "otool -Ll $INSTALLDIR/lib/*.dylib"
elif [ $OS = OS400 ]
then
  collect "DUMP_LIB_CHECK" "dump -X64 -HTv /QOpenSys/pkgs/lib/libcwb*"
fi


# Remove any passwords from the output
sed 's/\([Pp][Aa][Ss][Ss][Ww][Oo][Rr][Dd][ \t]*=[ \t]*\).*/\1*********/' $OUTFILE > $OUTFILE.1
mv $OUTFILE.1 $OUTFILE

# Now that we've got a lot gathered up, tar it to save space
rm -f $TARFILE > /dev/null 2>&1

# Tar up the output and the user's .iSeriesAccess
cd `dirname $OUTFILE_DIR`
tar cf $TARFILE `basename $OUTFILE_DIR`  2>&1 | grep -v "Removing leading"
gzip $TARFILE

echo
echo "cwbMedic has produced the following file: $TARFILE.gz"
echo
echo "If requested, please send this file ($TARFILE.gz) to IBM Service for analysis"
echo
echo "To view the contents of this file, enter the following commands:"
echo "tar xzvf $TARFILE.gz"
echo "cat `basename $OUTFILE_DIR`/$OUTFILE_NAME"
echo

# Remove the temp file
set -u
rm -rf $OUTFILE_DIR > /dev/null 2>&1
set +u
