openfoam/bin/foamInstallationTest
2008-04-15 18:56:58 +01:00

626 lines
18 KiB
Bash
Executable File

#!/bin/sh
#------------------------------------------------------------------------------
# ========= |
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
# \\ / O peration |
# \\ / A nd | Copyright (C) 1991-2007 OpenCFD Ltd.
# \\/ M anipulation |
#-------------------------------------------------------------------------------
# License
# This file is part of OpenFOAM.
#
# OpenFOAM is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenFOAM; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# Script
# foamInstallationTest
#
# Description
# Checks the machine system, the installation of FOAM, and the user's
# personal configuration for running FOAM.
#
#------------------------------------------------------------------------------
# SETTINGS
#~~~~~~~~~
FOAM_VERSION=1.4.2
GCC_VERSION=4.2.2
GZIP_VERSION=1.3.5
GTAR_VERSION=1.13.25
JAVA_VERSION=1.4.2+
#GLOBAL VARIABLES
FATALERROR=0
CRITICALERROR=0
SSHRSHOK=0
#SYSTEM VARIABLES
USER_SHELL=`basename $SHELL`
HOST_NAME=`uname -n`
OS=`uname -s`
OS_VERSION=`uname -r`
USER_NAME=$LOGNAME
# FUNCTIONS
#~~~~~~~~~~
hline () {
echo "-------------------------------------------------------------------------------"
}
expenv () {
eval "echo $1"
}
heading () {
echo ""
echo ""
echo "$1"
}
lenBase () {
echo $1 | tr -d " " | wc -m | tr -d " "
}
length () {
NOCHAR=`lenBase $1`
NOCHAR=`expr $NOCHAR - 1`
if [ $NOCHAR -eq -1 ]; then
NOCHAR=0
fi
echo $NOCHAR
}
stringLength () {
echo $1 | wc -m | tr -d " "
}
fixlen () {
WORD=$1
ONELEN=`stringLength $1`
LDIFF=`expr $ONELEN - $2`
if [ $LDIFF -le 1 ]; then
while [ $LDIFF -lt 0 ] ; do
WORD="$WORD "
LDIFF=`expr $LDIFF + 1`
done
echo "$WORD"
else
LDIFF=`expr $LDIFF + 4`
WORD=`echo "$WORD" | cut -c${LDIFF}-`
echo "...${WORD}"
fi
}
reportEnv () {
EXP_ENV=`eval "echo $1"`
EXP_PATH=`eval "echo $2"`
CRIT="$3"
EXISTS=" no "
ON_PATH=""
if [ `length $EXP_ENV` -gt 0 ] ; then
case $OS in
SunOS)
if /usr/bin/test -e $EXP_ENV ; then
EXISTS=" yes "
if [ "$2" != "noPath" ]; then
ON_PATH=" no "
OLD_IFS=$IFS
IFS=':'
for e in $EXP_PATH
do
if [ "$e" = "$EXP_ENV" -o "$e" = "${EXP_ENV}/bin" -o "${EXP_ENV}/lib" = "$e" ] ; then
ON_PATH="yes "
fi
done
IFS=$OLD_IFS
else
CRIT=" $3"
fi
else
ON_PATH=" "
fi
echo "`fixlen "$1" 21` `fixlen "$EXP_ENV" 40` $EXISTS $ON_PATH $CRIT"
;;
*)
if [ -e "$EXP_ENV" ] ; then
EXISTS=" yes "
if [ "$2" != "noPath" ]; then
ON_PATH=" no "
OLD_IFS=$IFS
IFS=':'
for e in $EXP_PATH
do
if [ "$e" = "$EXP_ENV" -o "$e" = "${EXP_ENV}/bin" -o "${EXP_ENV}/lib" = "$e" ] ; then
ON_PATH="yes "
fi
done
IFS=$OLD_IFS
else
CRIT=" $3"
fi
else
ON_PATH=" "
fi
echo "`fixlen "$1" 21` `fixlen "$EXP_ENV" 40` $EXISTS $ON_PATH $CRIT"
;;
esac
else
echo "`fixlen "$1" 21` --------- env variable not set --------- $3"
fi
ERROR="false"
if [ "$EXISTS" = "no" ] || [ "$ON_PATH" = "no" ]; then
ERROR="true"
fi
if [ "$3" = "yes" ] && [ "$ERROR" = "true" ]; then
CRITICALERROR=`expr $CRITICALERROR + 1`
echo "WARNING: CRITICAL ERROR"
echo
fi
}
findExec() {
OLD_IFS=$IFS
IFS=':'
for d in $1
do
case $OS in
SunOS)
if /usr/bin/test ! -d "$d/$2" -a -x "$d/$2" ; then
IFS=$OLD_IFS
echo "$d/$2"
return 0
fi
;;
*)
if [ ! -d "$d/$2" -a -x "$d/$2" ]; then
IFS=$OLD_IFS
echo "$d/$2"
return 0
fi
;;
esac
done
IFS=$OLD_IFS
return 1
}
reportExecutable () {
APP_PATH=""
APP_PATH=`findExec $PATH $1`
APP_SPEC="$2"
if [ `length $APP_PATH` -eq 0 ];then
echo "`fixlen "$1" 9`" "*** not installed ***"
VERSION=""
case $1 in
icoFoam) echo " CRITICAL ERROR"
CRITICALERROR=`expr $CRITICALERROR + 1` ;;
gcc) echo " CRITICAL ERROR"
CRITICALERROR=`expr $CRITICALERROR + 1`;;
gtar) ;;
gzip) ;;
dx) ;;
java) ;;
esac
echo
return 1
fi
case $1 in
icoFoam) VERSION=`$1 2>&1 | grep ' Version:' | sed -e 's/.*Version:/Version:/' | cut -d" " -f2`;;
gcc) VERSION=`$1 -v 2>&1 | grep 'version' | cut -d" " -f3`;;
gtar) VERSION=`$APP_PATH --version | head -1`;;
gzip)
case $OS in
SunOS) VERSION=`$1 --version 2>&1 | grep gzip | cut -d" " -f2`;;
*) VERSION=`$1 --version | head -1 | cut -d" " -f2`;;
esac
;;
dx) unset DXEXEC; VERSION=`$1 -version 2>&1 | grep 'Open ' | grep 'Script' | cut -d" " -f6`;;
java) VERSION=`$1 -version 2>&1 | grep 'version' | cut -d" " -f3 | tr -d "\""`;;
esac
if [ "$APP_PATH" = "$APP_SPEC" ] || [ ! "$2" ]; then
echo "`fixlen "$1" 9` `fixlen "$VERSION" 10` `fixlen "$APP_PATH" 58`"
else
echo "`fixlen "$1" 9` `fixlen "$VERSION" 10`"
echo "WARNING: Conflicting installations:"
echo " foam settings: $APP_SPEC"
echo " current path : $APP_PATH"
case $1 in
icoFoam) echo " CRITICAL ERROR"
CRITICALERROR=`expr $CRITICALERROR + 1` ;;
gcc) echo " CRITICAL ERROR"
CRITICALERROR=`expr $CRITICALERROR + 1`;;
gtar) ;;
gzip) ;;
dx) ;;
java) ;;
esac
echo
fi
}
checkPermissions () {
PERMISSIONS=""
case $OS in
SunOS)
if /usr/bin/test -e "$1" ; then
if /usr/bin/test -r $1 ; then
PERMISSIONS="${PERMISSIONS}r"
else
PERMISSIONS="${PERMISSIONS} "
fi
if /usr/bin/test -w $1 ; then
PERMISSIONS="${PERMISSIONS}w"
else
PERMISSIONS="${PERMISSIONS} "
fi
if /usr/bin/test -w $1 ; then
PERMISSIONS="${PERMISSIONS}x"
else
PERMISSIONS="${PERMISSIONS} "
fi
echo "`fixlen "$1" 50` `fixlen "$PERMISSIONS" 5` `fixlen "$2" 5` `fixlen "$3" 6`"
else
echo "`fixlen "$1" 50` does not exist `fixlen "" 10` `fixlen "$3" 6`"
fi
;;
*)
if [ -e "$1" ] ; then
if [ -r $1 ] ; then
PERMISSIONS="${PERMISSIONS}r"
else
PERMISSIONS="${PERMISSIONS} "
fi
if [ -w $1 ] ; then
PERMISSIONS="${PERMISSIONS}w"
else
PERMISSIONS="${PERMISSIONS} "
fi
if [ -w $1 ] ; then
PERMISSIONS="${PERMISSIONS}x"
else
PERMISSIONS="${PERMISSIONS} "
fi
echo "`fixlen "$1" 50` `fixlen "$PERMISSIONS" 5` `fixlen "$2" 5` `fixlen "$3" 6`"
else
echo "`fixlen "$1" 50` does not exist `fixlen "" 10` `fixlen "$3" 6`"
fi
;;
esac
if [ "$3" = "yes" ] && [ ! "$PERMISSIONS" = "$2" ]; then
CRITICALERROR=`expr $CRITICALERROR + 1`
echo "WARNING: CRITICAL ERROR"
echo
fi
}
pingTest () {
RESULT=""
case $OS in
SunOS)
PINGTEST=`/usr/sbin/ping $1 2>&1`
if [ "`echo $PINGTEST | grep "alive"`" != "" ] ; then
RESULT="Successful"
elif [ "`echo $PINGTEST | grep "unknown host"`" != "" ] ; then
RESULT="No_entry_for_\"$1\"_in_/etc/hosts"
else
RESULT="Networking_cannot_reach_$1"
fi
;;
*)
PINGTEST=`/bin/ping -w 3 -c 1 $1 2>&1`
if [ "`echo $PINGTEST | grep "1 received"`" != "" ] ; then
RESULT="Successful"
elif [ "`echo $PINGTEST | grep "unknown host"`" != "" ] ; then
RESULT="No_entry_for_\"$1\"_in_/etc/hosts"
else
RESULT="Networking_cannot_reach_$1"
fi
;;
esac
# echo "inna pingtest2 $1 $RESULT" 1>&2
echo "`fixlen "Pinging_$1" 25` `fixlen "$RESULT" 45` `fixlen "$2" 5`"
if [ "$2" = "yes" ] && [ "$RESULT" != "Successful" ]; then
CRITICALERROR=`expr $CRITICALERROR + 1`
echo "WARNING: CRITICAL ERROR"
echo
fi
}
telnetPortTest () {
telnet -e A $1 $2 <<EOF
A
quit
EOF
}
checkTelnetPort () {
if [ -x "/usr/bin/telnet" ] || [ -x "/bin/telnet" ] ; then
RESULT=`telnetPortTest $1 $2 2>&1 | egrep "onnect.* [t|r]"`
if [ "`echo $RESULT | grep 'Connected to'`" ] ; then
RESULT='Successful'
elif [ "`echo $RESULT | grep 'Connection refused'`" ] ; then
RESULT='Unsuccessful_connection_refused*'
else
RESULT="Not_active*"
fi
else
RESULT='No_telnet_running:_cannot_check*'
fi
}
checkRsh () {
checkTelnetPort $HOST_NAME 222
echo "`fixlen "Test_rsh:" 25` `fixlen "$RESULT" 45` "yes""
if [ "$RESULT" != 'Successful' ]; then
SSHRSHOK=`expr $SSHRSHOK + 1`
fi
}
checkSsh () {
checkTelnetPort $HOST_NAME 22
echo "`fixlen "Test_ssh:" 25` `fixlen "$RESULT" 45` "yes""
if [ "$RESULT" != 'Successful' ]; then
SSHRSHOK=`expr $SSHRSHOK + 1`
fi
}
# REMAINING ARGUMENTS
#~~~~~~~~~~~~~~~~~~~~
#
#------------
# MAIN SCRIPT
#------------
#
echo "Executing $0:"
#
heading "Checking basic setup..."
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hline #----------
USER_SHELL=`basename $SHELL`
HOST_NAME=`uname -n`
OS=`uname -s`
OS_VERSION=`uname -r`
USER_NAME=$LOGNAME
WIDTH=20
if [ `length $USER_NAME` -eq 0 ] ; then
USER_NAME=$USER
fi
#
case $USER_SHELL in
csh | tcsh)
USER_CONFIG_TYPE="cshrc"
echo "`fixlen "Shell:" $WIDTH` ${USER_SHELL}"
;;
bash | ksh)
USER_CONFIG_TYPE="bashrc"
echo "`fixlen "Shell:" $WIDTH` ${USER_SHELL}"
;;
*) USER_CONFIG_TYPE=""
echo "`fixlen "Shell:" $WIDTH` ${USER_SHELL}"
echo "FATAL ERROR: Cannot identify the shell you are running."
echo " Fam ${FOAM_VERSION} is compatible with "
echo " csh, tcsh, ksh and bash."
echo
FATALERROR=`expr $FATALERROR + 1`;;
esac
#
if [ ! "$HOST_NAME" ]; then
echo "`fixlen "Host:" $WIDTH` ${HOST_NAME}"
echo "FATAL ERROR: Cannot stat hostname."
echo " Contact your system administrator, "
echo " Foam ${FOAM_VERSION} needs a valid "
echo " hostname to function."
echo
FATALERROR=`expr $FATALERROR + 1`
else
echo "`fixlen "Host:" $WIDTH` ${HOST_NAME}"
fi
#
if [ "$OS" = "Linux" ] || [ "$OS" = "LinuxAMD64" ] || [ "$OS" = "SunOS" ]; then
echo "`fixlen "OS:" $WIDTH` ${OS} version ${OS_VERSION}"
else
echo "FATAL ERROR: Incompatible operating system \"$OS\"."
echo " Foam${FOAM_VERSION} is currently "
echo " available for Linux and SunOS only."
echo
FATALERROR=`expr $FATALERROR + 1`
fi
#
if [ `length $USER_NAME` -eq 0 ]; then
echo "`fixlen "User:" $WIDTH` ${USER_NAME}"
echo "FATAL ERROR: Cannot stat user name ${USER_NAME}."
echo ""
echo " Contact your system administrator, "
echo " Foam${FOAM_VERSION} needs a valid "
echo " user name to function."
echo
FATALERROR=`expr $FATALERROR + 1`
else
echo "`fixlen "User:" $WIDTH` ${USER_NAME}"
fi
#
USER_CONFIG_FILE="${HOME}/.${USER_CONFIG_TYPE}"
if [ -f ${USER_CONFIG_FILE} ] ; then
echo "`fixlen "User_config:" $WIDTH` ${USER_CONFIG_FILE}"
else
echo "`fixlen "User_config:" $WIDTH` ${USER_CONFIG_FILE}"
echo "FATAL ERROR: User config file: *** not located ***"
echo " Create a user config file $USER_CONFIG_FILE"
echo
FATALERROR=`expr $FATALERROR + 1`
fi
#
# heading "Checking if user config file sources the foam config file..."
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FOAM_CONFIG_FILE=`echo $HOME/.OpenFOAM-${FOAM_VERSION}/${USER_CONFIG_TYPE}`
case ${USER_CONFIG_TYPE} in
cshrc) SRC_STR="source";;
bashrc) SRC_STR=".";;
esac
#
SOURCE_FOAM_CONFIG=`grep "^${SRC_STR}.*OpenFOAM-${FOAM_VERSION}/${USER_CONFIG_TYPE}" ${USER_CONFIG_FILE}`
#
if [ ! "$SOURCE_FOAM_CONFIG" = "" ] ; then
echo "`fixlen "Foam_config:" $WIDTH` "$FOAM_CONFIG_FILE sourced correctly.""
else
echo "FATAL ERROR: $FOAM_CONFIG_FILE does not appear to be sourced from:"
echo " $USER_CONFIG_FILE"
echo ""
echo "You need the following at the end of your $USER_CONFIG_FILE file:"
echo "${SRC_STR} $HOME/OpenFOAM/OpenFOAM-${FOAM_VERSION}/etc/${USER_CONFIG_TYPE}"
echo "or equivalent depending on the location of the OpenFOAM installation."
echo
FATALERROR=`expr $FATALERROR + 1`
fi
#
if [ ! "$WM_PROJECT_INST_DIR" ]; then
echo
echo "FATAL ERROR Foam install directory not set."
echo
echo "Set correct path to installation 'WM_PROJECT_INST_DIR' in $HOME/.foam2.3/bashrc"
elif [ ! -d $WM_PROJECT_INST_DIR ]; then
echo
echo "FATAL ERROR Cannot find FOAM installation at: $WM_PROJECT_INST_DIR"
echo
echo "Set correct path to installation 'WM_PROJECT_INST_DIR' in $HOME/.foam2.3/bashrc"
FATALERROR=`expr $FATALERROR + 1`
fi
hline #--------------------
#
heading "Checking main FOAM env variables..."
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
COL1=`fixlen "Environment_variable" 21`
COL2=`fixlen "Set_to_file_or_directory" 40`
COL3="Valid"
COL4="Path"
COL5="Crit"
hline #--------------------
echo "$COL1 $COL2 $COL3 $COL5"
hline #--------------------
reportEnv '$WM_PROJECT_INST_DIR' 'noPath' "yes"
reportEnv '$WM_PROJECT_USER_DIR' 'noPath' "no"
reportEnv '$FOAM_JOB_DIR' 'noPath' "yes"
hline #--------------------
#
heading "Checking the FOAM env variables set on the PATH..."
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hline #--------------------
echo "$COL1 $COL2 $COL3 $COL4 $COL5"
hline #--------------------
reportEnv '$WM_PROJECT_DIR' '$PATH' "yes"
echo ""
reportEnv '$FOAM_USER_APPBIN' '$PATH' "no"
reportEnv '$FOAM_APPBIN' '$PATH' "yes"
reportEnv '$WM_DIR' '$PATH' "yes"
reportEnv '$FOAMX_PATH' '$PATH' "yes"
reportEnv '$CEI_HOME' '$PATH' "no"
echo ""
reportEnv '$JAVA_PATH' '$PATH' "no"
reportEnv '$MICO_ARCH_PATH' '$PATH' "yes"
reportEnv '$LAM_ARCH_PATH' '$PATH' "yes"
reportEnv '$MPICH_ARCH_PATH' '$PATH' "no"
hline #--------------------
#
heading "Checking the FOAM env variables set on the LD_LIBRARY_PATH..."
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hline #--------------------
echo "$COL1 $COL2 $COL3 $COL4 $COL5"
hline #--------------------
reportEnv '$FOAM_LIBBIN' '$LD_LIBRARY_PATH' "yes"
reportEnv '$FOAM_USER_LIBBIN' '$LD_LIBRARY_PATH' "no"
reportEnv '$LAM_ARCH_PATH' '$LD_LIBRARY_PATH' "yes"
hline #--------------------
#
heading "Software versions"
#~~~~~~~~~~~~~~~~~~~~~~~~~~
COL1=`fixlen "Software" 9`
COL2=`fixlen "Version" 10`
COL3=`fixlen "Location" 10`
hline #--------------------
echo "$COL1 $COL2 $COL3"
hline #--------------------
reportExecutable gcc "${WM_COMPILER_DIR}/bin/gcc"
reportExecutable java "${JAVA_HOME}/bin/java"
reportExecutable gzip
if [ "$OS" = "Linux" ] ; then
reportExecutable tar
else
reportExecutable gtar
fi
reportExecutable icoFoam "${FOAM_APPBIN}/icoFoam"
hline #--------------------
#
heading "Checking file/directory permissions..."
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
COL1=`fixlen "File/directory" 50`
COL2=`fixlen "Set" 5`
COL3=`fixlen "Reqd" 5`
COL4=`fixlen "Crit" 5`
hline #--------------------
echo "$COL1 $COL2 $COL3 $COL4"
hline #--------------------
#
heading "Checking networking..."
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
COL1=`fixlen "Action" 25`
COL2=`fixlen "Result" 45`
COL3=`fixlen "Crit" 5`
hline #--------------------
echo "$COL1 $COL2 $COL3"
hline #--------------------
pingTest "$HOST_NAME" "yes"
pingTest "localHost" "yes"
checkRsh
checkSsh
if [ $SSHRSHOK -eq 1 ]; then
echo "(*) Only one of rsh or ssh is required by the Foam enviroment."
elif [ $SSHRSHOK -gt 1 ]; then
echo "FATAL ERROR: No remote shell available."
echo " Foam${FOAM_VERSION} enviroment requires either ssh and/or rsh."
echo " Contact your system administrator."
echo ""
FATALERROR=`expr $FATALERROR + 1`
fi
echo ""
hline #--------------------
echo ""
if [ $FATALERROR -gt 0 ] ; then
echo "The system test has evoked $FATALERROR fatal error(s)."
else
echo "Base configuration ok."
fi
echo ""
if [ $CRITICALERROR -gt 0 ]; then
echo "The foam installation contains $CRITICALERROR critical error(s)."
else
echo "Critical systems ok."
fi
echo ""
if [ $CRITICALERROR -gt 0 ] || [ $FATALERROR -gt 0 ]; then
echo "Review the output for warning messages and consult "
echo "the installation guide for trouble shooting."
fi
echo ""
#------------------------------------------------------------------------------