Skip to content
Snippets Groups Projects
foamInstallationTest 15.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/bin/sh
    #------------------------------------------------------------------------------
    # =========                 |
    
    # \\      /  F ield         | foam-extend: Open Source CFD
    
    #  \\    /   O peration     | Version:     4.1
    
    Henrik's avatar
    Henrik committed
    #   \\  /    A nd           | Web:         http://www.foam-extend.org
    #    \\/     M anipulation  | For copyright notice see file Copyright
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
    #------------------------------------------------------------------------------
    
    #     This file is part of foam-extend.
    
    #     foam-extend 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.
    #
    
    #     foam-extend 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 foam-extend.  If not, see <http://www.gnu.org/licenses/>.
    
    #
    # Script
    #     foamInstallationTest
    #
    # Description
    
    #     Checks the machine system, the installation of foam-extend, and the user's
    #     personal configuration for running foam-extend.
    
    #
    #------------------------------------------------------------------------------
    
    # Base settings
    
    Henrik's avatar
    Henrik committed
    FOAM_VERSION=foam-extend-4.1
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
    SUPPLIED_VERSION_GCC=4.3.3
    MIN_VERSION_GCC=4.3.1
    
    
    # General
    WIDTH=20
    
    # Global variables
    FATALERROR=0
    CRITICALERROR=0
    SSHRSHOK=0
    
    # System variables
    HOST_NAME=`uname -n`
    OS=`uname -s`
    USER_NAME=$LOGNAME
    if [ ! -n $USER_NAME ]; then
        USER_NAME=$USER
    fi
    
    #==============================================================================
    #                             HELPER 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 () {
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
        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 "
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
                    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 "
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
                    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"
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
        if [ "$EXISTS" = no ] || [ "$ON_PATH" = no ]; then
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
        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 [ ! -n $APP_PATH ];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`
                    ;;
                tar) ;;
                gtar) ;;
                gzip) ;;
                dx) ;;
            esac
            echo
            return 1
        fi
        case $1 in
            icoFoam)
                VERSION=`$1 2>&1                      \
                    | \grep ' Version:'               \
                    | sed -e 's/.*Version:/Version:/' \
                    | cut -d" " -f3`
                ;;
            gcc)
                VERSION=`$1 -v 2>&1                  \
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
                    | grep 'gcc version'                 \
    
                    | cut -d" " -f3`
                if [ ! "$VERSION" = "$SUPPLIED_VERSION_GCC" ]; then
                    echo "WARNING: gcc version does not match gcc supplied" \
    
                         "with this release of foam-extend"
    
                    echo "         Supplied version: $SUPPLIED_VERSION_GCC"
                    echo "         User version    : $VERSION"
                    echo "         Minimum required: $MIN_VERSION_GCC"
                    echo ""
                fi
                ;;
            gtar)
                VERSION=`$APP_PATH --version | head -1`
                ;;
            tar)
                VERSION=`$APP_PATH --version | head -1 | cut -d" " -f4`
                ;;
            gzip)
                case $OS 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 "          foam-extend 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) ;;
            esac
            echo ""
        fi
    }
    
    
    pingTest () {
        RESULT=""
        case $OS in
            SunOS)
                PINGTEST=`/usr/sbin/ping $1 2>&1`
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
                if  [ "`echo $PINGTEST | grep alive`" != "" ] ; then
    
                    RESULT="Successful"
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
                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`
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
                if  [ "`echo $PINGTEST | grep '1 received'`" != "" ] ; then
    
                    RESULT="Successful"
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
                elif  [ "`echo $PINGTEST | grep 'unknown host'`" != "" ] ; then
    
                    RESULT="No_entry_for_\"$1\"_in_/etc/hosts"
                else
                    RESULT="Networking_cannot_reach_$1"
                fi
                ;;
        esac
    
        echo "`fixlen "Pinging_$1" 25` `fixlen "$RESULT" 45` `fixlen "$2" 5`"
    
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
        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 () {
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
        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
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
            RESULT='No_telnet_installed:_cannot_check*'
    
        fi
    }
    
    
    checkRsh () {
        checkTelnetPort $HOST_NAME 222
        echo "`fixlen "Test_rsh:" 25` `fixlen "$RESULT" 45` "yes""
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
        if [ "$RESULT" != Successful ]; then
    
            SSHRSHOK=`expr $SSHRSHOK + 1`
        fi
    }
    
    
    checkSsh () {
        checkTelnetPort $HOST_NAME 22
        echo "`fixlen "Test_ssh:" 25` `fixlen "$RESULT" 45` "yes""
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
        if [ "$RESULT" != Successful ]; then
    
            SSHRSHOK=`expr $SSHRSHOK + 1`
        fi
    }
    
    
    
    checkFoamEnvironment() {
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
        [ -d "$WM_PROJECT_INST_DIR" ] && [ -d "$WM_THIRD_PARTY_DIR" ] || {
    
            echo "FATAL ERROR: foam-extend environment not configured."
    
            echo "    Please refer to the installation section of the file:"
            echo "    <foam installation dir>/${FOAM_VERSION}/ReleaseNotes-${FOAM_VERSION}"
            echo "    to source the foam-extend environment."
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
        }
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
        case $SHELL in
            */csh | */tcsh)
                # USER_CONFIG_TYPE="cshrc"
                echo "`fixlen "Shell:" $WIDTH` ${SHELL##*/}"
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
            */bash | */ksh)
                # USER_CONFIG_TYPE="bashrc"
                echo "`fixlen "Shell:" $WIDTH` ${SHELL##*/}"
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
            *)
                # USER_CONFIG_TYPE=""
                echo "`fixlen "Shell:" $WIDTH` ${SHELL##*/}"
    
                echo "FATAL ERROR: Cannot identify the shell you are running."
    
                echo "             ${FOAM_VERSION} is compatible with "
    
                echo "             csh, tcsh, ksh and bash."
                echo
                FATALERROR=`expr $FATALERROR + 1`;;
        esac
    }
    
    
    checkHostName() {
        if [ ! "$HOST_NAME" ]; then
            echo "`fixlen "Host:" $WIDTH` ${HOST_NAME}"
            echo "FATAL ERROR: Cannot stat hostname."
            echo "             Contact your system administrator, "
    
            echo "             ${FOAM_VERSION} needs a valid "
    
            echo "             hostname to function."
            echo
            FATALERROR=`expr $FATALERROR + 1`
        else
            echo "`fixlen "Host:" $WIDTH` ${HOST_NAME}"
        fi
    }
    
    
    checkOS () {
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
        case "$OS" in
        Linux | LinuxAMD64 | SunOS )
            echo "`fixlen "OS:" $WIDTH` ${OS} version $(uname -r)"
            ;;
        *)
    
            echo "FATAL ERROR: Incompatible operating system \"$OS\"."
    
            echo "             ${FOAM_VERSION} is currently "
    
            echo "             available for Linux and SunOS only."
            echo
            FATALERROR=`expr $FATALERROR + 1`
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
            ;;
        esac
    
    }
    
    
    #==============================================================================
    #                                MAIN SCRIPT
    #==============================================================================
    #
    echo "Executing $0:"
    
    #------------------------------------------------------------------------------
    heading "Checking basic setup..."
    hline
    
    checkFoamEnvironment
    
    checkUserShell
    checkHostName
    checkOS
    hline
    
    #------------------------------------------------------------------------------
    
    heading "Checking main foam-extend 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 foam-extend 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"
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
    reportEnv '$FOAM_SITE_APPBIN' '$PATH' "no"
    
    reportEnv '$FOAM_USER_APPBIN' '$PATH' "no"
    reportEnv '$WM_DIR'           '$PATH' "yes"
    hline
    
    #------------------------------------------------------------------------------
    
    heading "Checking the foam-extend env variables set on the LD_LIBRARY_PATH..."
    
    hline
    echo "$COL1 $COL2 $COL3 $COL4 $COL5"
    hline
    reportEnv '$FOAM_LIBBIN'      '$LD_LIBRARY_PATH' "yes"
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
    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 gcc "${WM_COMPILER_DIR}/bin/gcc"
    reportExecutable gzip
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
    if [ "$OS" = Linux ]  ; then
    
        reportExecutable tar
    else
        reportExecutable gtar
    fi
    reportExecutable icoFoam "${FOAM_APPBIN}/icoFoam"
    
    hline
    
    #------------------------------------------------------------------------------
    
    Hrvoje Jasak's avatar
    Hrvoje Jasak committed
    heading "Summary"
    
    hline
    
    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 ""
    
    echo "done."
    
    echo ""
    
    exit 0
    
    #------------------------------------------------------------------------------