Skip to content
Snippets Groups Projects
foamInstallationTest 12.8 KiB
Newer Older
Henry's avatar
Henry committed
#!/bin/sh
#------------------------------------------------------------------------------
# =========                 |
# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
#  \\    /   O peration     |
#   \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
Henry's avatar
Henry committed
#    \\/     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 3 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, see <http://www.gnu.org/licenses/>.
#
# Script
#     foamInstallationTest
#
# Description
#     Checks the machine system, the installation of OpenFOAM, and the user's
#     personal configuration for running OpenFOAM.
#
#------------------------------------------------------------------------------

# Base settings
MIN_VERSION_GCC=4.5.0

# General
WIDTH=20

# Global variables
fatalError=0
criticalError=0

# System variables
HOST=`uname -n`
OSTYPE=`uname -s`
USER_NAME=$LOGNAME
: ${USER_NAME:=$USER}

# which OpenFOAM application to test for the Version
foamTestApp=icoFoam

#==============================================================================
#                             HELPER FUNCTIONS
#==============================================================================

hline()
{
    echo "-------------------------------------------------------------------------------"
}


heading()
{
    echo
    echo
    echo "$1"
}


lenBase()
{
    echo $1 | tr -d " " | wc -m | tr -d " "
}


length()
{
    NOCHAR=`lenBase $1`
    NOCHAR=`expr $NOCHAR - 1`
    [ $NOCHAR -ge 0 ] || NOCHAR=0
    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 "$OSTYPE" in
        SunOS)
            if /usr/bin/test -e $EXP_ENV
            then
                EXISTS=" yes "
                if [ "$2" != noPath ]
                then
                    ON_PATH=" no "
                    oldIFS=$IFS
                    IFS=':'
                    for e in $EXP_PATH
                    do
                        case "$e" in
                        "$EXP_ENV" | "$EXP_ENV/bin" | "$EXP_ENV/lib")
                            ON_PATH="yes "
                            ;;
                        esac
                    done
                    IFS=$oldIFS
               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 "
                    oldIFS=$IFS
                    IFS=':'
                    for e in $EXP_PATH
                    do
                        case "$e" in
                        "$EXP_ENV" | "$EXP_ENV/bin" | "$EXP_ENV/lib")
                            ON_PATH="yes "
                            ;;
                        esac
                    done
                    IFS=$oldIFS
               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()
{
    oldIFS=$IFS
    IFS=':'
    for d in $1
    do
        case "$OSTYPE" in
        SunOS)
            if /usr/bin/test ! -d "$d/$2" -a -x "$d/$2"
            then
                IFS=$oldIFS
                echo "$d/$2"
                return 0
            fi
            ;;
        *)
            if [ ! -d "$d/$2" -a -x "$d/$2" ]
            then
                IFS=$oldIFS
                echo "$d/$2"
                return 0
            fi
            ;;
        esac
    done
    IFS=$oldIFS
    return 1
}


reportExecutable()
{
    APP_PATH=""
    APP_PATH=`findExec $PATH $1`
    APP_SPEC="$2"
    if [ ! -n $APP_PATH ]
    then
        echo "`fixlen "$1" 9`" "*** not installed ***"
        VERSION=""
        case "$1" in
Henry's avatar
Henry committed
            echo "          CRITICAL ERROR"
            criticalError=`expr $criticalError + 1`
            ;;
        esac
        echo
        return 1
    fi
    case "$1" in
    $foamTestApp)
        VERSION=`$1 -case /dev/null 2>&1      \
            | sed -ne 's/^.*Version: *\([^ ][^ ]*\).*/\1/p'`
        ;;
    flex)
        VERSION=`$1 --version /dev/null 2>&1      \
            | sed -ne 's/flex \([0-9][0-9.]*\).*/\1/p' `
        ;;
Henry's avatar
Henry committed
        VERSION=`$1 -v 2>&1 \
            | sed -ne 's/^gcc version \([0-9][0-9.]*\).*/\1/p' `

        case "$1" in
        gcc*)
            BINARYCODENAME=gcc
            ;;
        g++*)
            BINARYCODENAME=g++
            ;;
        esac

Henry's avatar
Henry committed
        MINV1=`echo $MIN_VERSION_GCC | cut -d. -f1`
        MINV2=`echo $MIN_VERSION_GCC | cut -d. -f2`
        MINV3=`echo $MIN_VERSION_GCC | cut -d. -f3`

        V1=`echo $VERSION | cut -d. -f1`
        V2=`echo $VERSION | cut -d. -f2`
        V3=`echo $VERSION | cut -d. -f3`


        gccOK=""
        pass=""
        if [ $V1 -lt $MINV1 ]; then
            gccOk="ERROR"
        elif [ $V1 -gt $MINV1 ]; then
            pass="yes"
        fi

        if [ "$pass" = "" ] && [ "$gccOk" = "" ]; then
            if [ $V2 -lt $MINV2 ]; then
                gccOk="ERROR"
            elif [ $V2 -gt $MINV2 ]; then
                pass="yes"
            fi
        fi

        if [ "$pass" = "" ] && [ "$gccOk" = "" ] && [ $V3 != "" ] && [ $MINV3 != "" ]; then
            if [ $V3 -lt $MINV3 ]; then
                gccOk="ERROR"
            fi
        fi

        if [ "$gccOk" != "" ]; then
            echo "ERROR: $BINARYCODENAME version is too old for this release of OpenFOAM"
Henry's avatar
Henry committed
            echo "    User version    : $VERSION"
            echo "    Minimum required: $MIN_VERSION_GCC"
            echo ""
            fatalError=`expr $fatalError + 1`
        fi

        ;;
    gtar)
        VERSION=`$APP_PATH --version | head -1`
        ;;
    tar)
        VERSION=`$APP_PATH --version | head -1 | cut -d" " -f4`
        ;;
    gzip)
        case "$OSTYPE" in
        SunOS)
            VERSION=`$1 --version 2>&1 | grep gzip | cut -d" " -f2`
            ;;
        *)
            VERSION=`$1 --version | head -1 | cut -d" " -f2`
            ;;
        esac
        ;;
    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 "          OpenFOAM settings        : $APP_SPEC"
        echo "          current path             : $APP_PATH"
        case "$1" in
        gcc | $foamTestApp)
            echo "          CRITICAL ERROR"
            criticalError=`expr $criticalError + 1`
            ;;
        esac
        echo ""
    fi
}


checkOpenFOAMEnvironment()
{
    [ -d "$WM_PROJECT_INST_DIR" ] && [ -d "$WM_THIRD_PARTY_DIR" ] || {
        echo ""
        echo "FATAL ERROR: OpenFOAM environment not configured."
        echo ""
        echo "    Please refer to the installation section of the README file:"
        echo "    <OpenFOAM installation dir>/OpenFOAM-${WM_PROJECT_VERSION}/README"
        echo "    to source the OpenFOAM environment."
        echo ""
        exit 1
    }
}


checkUserShell()
{
    echo "`fixlen Shell: $WIDTH` ${SHELL##*/}"
    case $SHELL in
    */csh | */tcsh | */bash | */ksh)
        ;;
    *)
        echo "FATAL ERROR: Cannot identify the shell you are running."
        echo "             OpenFOAM ${WM_PROJECT_VERSION} is compatible with "
        echo "             csh, tcsh, ksh and bash."
        echo
        fatalError=`expr $fatalError + 1`
        ;;
    esac
}


checkHostName()
{
    echo "`fixlen Host: $WIDTH` $HOST"
    if [ ! "$HOST" ]
    then
        echo "FATAL ERROR: Cannot stat hostname."
        echo "             Contact your system administrator, "
        echo "             OpenFOAM ${WM_PROJECT_VERSION} needs a valid "
        echo "             hostname to function."
        echo
        fatalError=`expr $fatalError + 1`
    fi
}


checkOS()
{
    case "$OSTYPE" in
    Linux | LinuxAMD64 | SunOS )
        echo "`fixlen OS: $WIDTH` $OSTYPE version $(uname -r)"
        ;;
    *)
        echo "FATAL ERROR: Incompatible operating system \"$OSTYPE\"."
        echo "             OpenFOAM ${FWM_PROJECT_VERSION} is currently "
        echo "             available for Linux and SunOS only."
        echo
        fatalError=`expr $fatalError + 1`
        ;;
    esac
}


#==============================================================================
#                                MAIN SCRIPT
#==============================================================================
#
echo "Executing $0:"

#------------------------------------------------------------------------------
heading "Checking basic setup..."
hline
checkOpenFOAMEnvironment
checkUserShell
checkHostName
checkOS
hline

#------------------------------------------------------------------------------
heading "Checking main OpenFOAM 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 '$WM_THIRD_PARTY_DIR'  'noPath' "yes"
hline

#------------------------------------------------------------------------------
heading "Checking the OpenFOAM env variables set on the PATH..."
hline
echo "$COL1 $COL2 $COL3 $COL4 $COL5"
hline
reportEnv '$WM_PROJECT_DIR'   '$PATH' "yes"
echo ""
reportEnv '$FOAM_APPBIN'      '$PATH' "yes"
reportEnv '$FOAM_SITE_APPBIN' '$PATH' "no"
reportEnv '$FOAM_USER_APPBIN' '$PATH' "no"
reportEnv '$WM_DIR'           '$PATH' "yes"
hline

#------------------------------------------------------------------------------
heading "Checking the OpenFOAM 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_SITE_LIBBIN' '$LD_LIBRARY_PATH' "no"
reportEnv '$FOAM_USER_LIBBIN' '$LD_LIBRARY_PATH' "no"
reportEnv '$MPI_ARCH_PATH'    '$LD_LIBRARY_PATH' "yes"
hline

#------------------------------------------------------------------------------
heading "Third party software"
COL1=`fixlen Software 9`
COL2=`fixlen Version 10`
COL3=`fixlen Location 10`
hline
echo "$COL1 $COL2 $COL3"
hline
reportExecutable flex
reportExecutable "$WM_CC"
reportExecutable "$WM_CXX"
Henry's avatar
Henry committed
reportExecutable gzip
if [ "$OSTYPE" = Linux ]
then
    reportExecutable tar
else
    reportExecutable gtar
fi
reportExecutable $foamTestApp  "$FOAM_APPBIN/$foamTestApp"

hline

#------------------------------------------------------------------------------
heading "Summary"
hline

if [ $fatalError -gt 0 ]
then
    echo "The system test has evoked $fatalError fatal error(s)."
else
    echo "Base configuration ok."
fi
if [ $criticalError -gt 0 ]
then
    echo "The foam installation contains $criticalError critical error(s)."
else
    echo "Critical systems ok."
fi
if [ $criticalError -gt 0 ] || [ $fatalError -gt 0 ]
then
    echo
    echo "Review the output for warning messages and consult"
    echo "the installation guide for troubleshooting."
fi

echo
echo Done
echo

exit 0

#------------------------------------------------------------------------------