#!/bin/sh
#
#  TRIP chkinst script
#
#  Verifies and checks the condition of a TRIP installation on UNIX/Linux
#
#  Copyright (C) Smaser AG
#
#  The following things are verified:
#
#  - The presense of a configuration file (tdbs.conf
#  - The presense of prerequisite software
#  - That the dependencies of libtripxpi.so are fully resolved
#  - The presense of the CONTROL database
#  - The presence of a DEBIT log file
#  - If tripd is running
#  - If tripnetd is running and potentially in conflict with inetd/xinetd
#  - That required files in the installation directories are present
#  - The version of the installation.
#

OPT_NODEPS=0

while [ "$1" != "" ]; do
   case "$1" in
      -h|--help)
         head -25 $0 | tail -24 | cut -c3-
         exit 0 
         ;;
      --nodeps)
         OPT_NODEPS=1
         ;;
      *)
         ;;
   esac
   shift
done

if  [ "x$1" = "x-h" ] || [ "x$1" = "x--help" ]; then
    head -25 $0 | tail -24
    exit
fi

SCR_UPD=`ls -l $0 | awk '{ print $6 " " $7 " " $8 }'`

echo "**********************************************************************"
echo "*              TRIP chkinst script (upd: $SCR_UPD)"
echo "*              Analyzing the current TRIP installation"
echo "**********************************************************************"
echo 

echo INFO: Current date is `date '+%Y-%m-%d %H:%M:%S'`
echo ""

OSTYPE=`uname`
OSARCH=`uname -m`
SOEXT=so
EOKCOUNT=0
ERRCOUNT=0
WARNCOUNT=0
WOKCOUNT=0

WHOM=`(whoami) 2> /dev/null`
if [ $? -ne 0 ] ; then
    if [ -f /usr/ucb/whoami ] ; then
        WHOM=`/usr/ucb/whoami`
    fi
fi
echo "INFO: Running as user $WHOM"
echo ""
if [ "$WHOM" != root ]; then
    echo "INFO: PLEASE NOTE!"
    echo "      If this script is not run as 'root', then"
    echo "      'Permission denied' errors when accessing"
    echo "      certain system (OS) files can cause problems."
    echo ""
fi

if [ "$BASH_SOURCE" != "" ]; then
   SCRIPTDIR=`realpath $BASH_SOURCE`
   SCRIPTDIR=`dirname $SCRIPTDIR`
else
   SCRIPTDIR=`dirname $0 2>/dev/null`
   SCRIPTDIR=`realpath $SCRIPTDIR`
fi

if [ "$TDBS_SBIN" = "" ]; then
   TDBS_SBIN=$SCRIPTDIR
fi

if [ "$TDBS_SBIN" = "" ]; then
   echo "FATAL: unable to locate TRIPsystem privileged program directory (sbin)"
   exit 99
fi

if [ "$TDBS_HOME" = "" ]; then
   # NB: This assumes that the chkinst script is located in the 
   # sbin directory of the TRIPsystem installation.
   TDBS_HOME=`dirname $TDBS_SBIN`      
   if [ ! -f $TDBS_HOME/demo/ALICE.BAF ]; then

      WARNCOUNT=`expr $WARNCOUNT + 1`
      echo "WARNING #$WARNCOUNT: chkinst not executed from a TRIPsystem installation"

      # Assumption failed. Try fallback.
      TDBS_HOME=`readlink /usr/local/trip/sys/lib 2>/dev/null`
      TDBS_HOME=`dirname $TDBS_HOME 2>/dev/null`
   fi
fi

if [ "$TDBS_EXE" = "" ]; then
   TDBS_EXE=$TDBS_HOME/bin
fi

if [ "$TDBS_HOME" = "" ]; then
   echo "FATAL: unable to locate TRIPsystem installation directory"
   exit 99
fi


if [ "$OSTYPE" = "Linux" ] && [ -f /proc/version ]; then
    echo INFO: Running on `/bin/hostname` under `cat /proc/version`
    echo INFO: The Linux distribution is `$TDBS_SBIN/ostype -d`
    OSFAMILY=`$TDBS_SBIN/ostype -f`
    echo "INFO: The Linux distribution family is $OSFAMILY"
    if [ "$OSFAMILY" != "rhel" ]; then
        WARNCOUNT=`expr $WARNCOUNT + 1`
        echo "WARNING #$WARNCOUNT: TRIP is not supported on $OSFAMILY systems"
    fi
else
    echo INFO: Running on `uname -a`
fi

# Flags for what we're looking for
CHECK_EXIST_CONFIG_DIR=0
CHECK_EXIST_CONFIG_FILE=0
CHECK_EXIST_LIBTDBS_FILE=0
CHECK_EXIST_TDBS_EXE_INCONF=0
CHECK_EXIST_DATA_FILES=0
CHECK_EXIST_INETD_CONF=0
CHECK_EXIST_XINETD_CONF=0

resolvelink()
{
    readlink -f /bin/sh > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        readlink -f $1
    else
        RESOLVED=`ls -l $1 | awk '{ print $NF }'`
        echo "$RESOLVED" | grep "^/" 2>/dev/null 1>/dev/null
        if [ $? -ne 0 ]; then
            echo "`dirname $1`/$RESOLVED"
        else
            echo $RESOLVED
        fi
    fi
}

qrcs()
{
    RCSNAME=$1
    shift
    RCSVALUE=`$TDBS_EXE/queryrcs $* $RCSNAME | cut -d\" -f2 | sed 's/<nil>//g'`
    if [ "$RCSVALUE" != "" ]; then
       echo $RCSVALUE
       return 0
    else
       return 1
    fi
}


##########################################################################
#
# Step 1: Check if (and where) the configuration file exists
#

if [ -h /usr/local/trip/sys/conf ]; then
    echo INFO: Found /usr/local/trip/sys/conf

    LINKVALUE=`resolvelink /usr/local/trip/sys/conf`
    if [ ! -d $LINKVALUE ]; then
        ERRCOUNT=`expr 1 + $ERRCOUNT`
        echo "ERROR #$ERRCOUNT: /usr/local/trip/sys/conf points to non-existing target: $LINKVALUE"
    else
        CHECK_EXIST_CONFIG_DIR=1
        TDBS_CONF_ACTUAL=$LINKVALUE

        echo INFO: /usr/local/trip/sys/conf resolved to $TDBS_CONF_ACTUAL
        echo INFO: TDBS_HOME seems to be `dirname $TDBS_CONF_ACTUAL`

        if [ -f $TDBS_CONF_ACTUAL/tdbs.conf ]; then
            CHECK_EXIST_CONFIG_FILE=1
            TRIPRCS=$TDBS_CONF_ACTUAL/tdbs.conf
            echo INFO: Found tdbs.conf under $TDBS_CONF_ACTUAL
        else
            ERRCOUNT=`expr 1 + $ERRCOUNT`
            echo "ERROR #$ERRCOUNT: Unable to find config file under \$TDBS_HOME/conf"
        fi
    fi
else
    WARNCOUNT=`expr 1 + $WARNCOUNT`
    echo WARNING "#$WARNCOUNT: /usr/local/trip/sys/conf not found on this machine"
fi


##########################################################################
#
# Step 2: Check if preprequisite software is installed.
#

if [ $OPT_NODEPS -eq 0 ]; then
   echo "INFO: Checking for prerequisite software..."
   $TDBS_SBIN/dependencies --check --from-installer > /dev/null
   if [ $? -ne 0 ]; then
       WARNCOUNT=`expr 1 + $WARNCOUNT`
       echo "WARNING #$WARNCOUNT: Missing prerequisite software"
       echo "            For more info, run $TDBS_SBIN/dependencies"
   else
       echo "INFO: all prerequisite software packages are installed"
   fi
else
   echo "INFO: prerequisite software scan skipped as requested"
fi


##########################################################################
#
# Step 3: Check if the TDBS_EXE in the config file agrees with where the
#         we have previously determined that its value should be.
#

if [ $CHECK_EXIST_CONFIG_FILE -eq 1 ]; then

    TDBS_EXE_CONFIG=`grep "^TDBS_EXE" $TRIPRCS | ( read r; echo $r | cut -d= -f2 | tr -d '\r')`

    echo INFO: Config says TDBS_EXE=$TDBS_EXE_CONFIG

    if [ -d "$TDBS_EXE_CONFIG" ]; then
        CHECK_EXIST_TDBS_EXE_INCONF=1

        if [ "$TDBS_EXE" = "$TDBS_EXE_CONFIG" ]; then
            echo "INFO: TDBS_EXE location appears to be correct"
        else
            ERRCOUNT=`expr 1 + $ERRCOUNT`
            echo "ERROR #$ERRCOUNT: TDBS_EXE is expected to be $TDBS_EXE"
        fi
    else
        TDBS_EXE_CONFIG=""
        ERRCOUNT=`expr 1 + $ERRCOUNT`
        echo "ERROR #$ERRCOUNT: TDBS_EXE configuration setting is invalid - does not match libtdbs.$SOEXT location"
    fi
else
    ERRCOUNT=`expr 1 + $ERRCOUNT`
    echo "ERROR #$ERRCOUNT: Unable to verify TDBS_EXE value because of prior errors"
fi 


##########################################################################
#
# Step 4: Check that libtdbs.so is correctly set up
#

LINKVALUE=""
if [ -e /usr/local/trip/sys/lib/libtdbs.$SOEXT ]; then
    LINKVALUE=`resolvelink /usr/local/trip/sys/lib/libtdbs.$SOEXT`
    if [ "$LINKVALUE" != "" ] && [ ! -f "$LINKVALUE" ]; then
        ERRCOUNT=`expr 1 + $ERRCOUNT`
        echo "ERROR #$ERRCOUNT: /usr/local/trip/sys/lib/libtdbs.$SOEXT points to non-existing target: $LINKVALUE"
    fi
else
    ERRCOUNT=`expr 1 + $ERRCOUNT`
    echo "ERROR #$ERRCOUNT: /usr/local/trip/sys/lib/libtdbs.$SOEXT does not exist"
fi
if [ "$LINKVALUE" != "" ] && [ -f "$LINKVALUE" ]; then
    CHECK_EXIST_LIBTDBS_FILE=1
    LIBTDBS_ACTUAL=$LINKVALUE
    echo INFO: /usr/local/trip/sys/lib/libtdbs.$SOEXT links to $LINKVALUE

    TDBS_LIB=$TDBS_HOME/lib
    TDBS_LIB_ACTUAL=`dirname $LIBTDBS_ACTUAL`

    if [ "$TDBS_LIB_ACTUAL" != "$TDBS_LIB" ]; then
        ERRCOUNT=`expr 1 + $ERRCOUNT`
        echo "ERROR #$ERRCOUNT: libtdbs.$SOEXT expected to reside in $TDBS_LIB"
    fi

fi

if [ ! -f $TDBS_HOME/lib/libtdbs.$SOEXT ]; then
    ERRCOUNT=`expr 1 + $ERRCOUNT`
    echo "ERROR #$ERRCOUNT: libtdbs.$SOEXT not found in $TDBS_HOME/lib"
fi


##########################################################################
#
# Step 5: Verify the contents of the installation
#

EXECHECKS=0
EXECOUNT=0

export EXECHECKS
export EXECOUNT
export ERRCOUNT

depcheck()
{
   LDDRC=1
   if [ "x$2" != "x" ]; then
      LD_LIBRARY_PATH=$2 ldd $1
      LDDRC=$?
   else
      ldd $1
      LDDRC=$?
   fi
   return $LDDRC
}

brokenlinks()
{
    depcheck $1 $2 | grep "not found" 2>/dev/null
    return $?
}

isbinary()
{
    if [ "$OSTYPE" = "Darwin" ] || [ "$OSTYPE" = "Linux" ]; then
        file --mime $1 | grep application
    else
        file $1 | grep executable | grep -v script
    fi
}

verify_file()
{
    EXECHECKS=`expr $EXECHECKS + 1`; export EXECHECKS
    if [ ! -f "$1" ]; then
        ERRCOUNT=`expr 1 + $ERRCOUNT`; export ERRCOUNT
        echo "ERROR #$ERRCOUNT: $1 not found"
        return 1
    fi

    if [ $CHECK_EXIST_DATA_FILES -eq 1 ]; then
        EXECOUNT=`expr $EXECOUNT + 1`; export EXECOUNT
        return 0
    fi

    if [ -h "$1" ]; then
        LINKVALUE=`resolvelink $1 $2`
        if [ -f "$LINKVALUE" ]; then
           echo "INFO: File $1 is a link"
           echo "INFO:      to $LINKVALUE"
        else
            ERRCOUNT=`expr 1 + $ERRCOUNT`; export ERRCOUNT
            echo "ERROR #$ERRCOUNT: File $1 is a broken link to \"$LINKVALUE\""
            return 2
        fi
    fi

    if [ "x" != "x`isbinary $1`" ]; then
        BROKEN=`brokenlinks $1 $2`
        if [ $? -eq 0 ]; then
            ERRCOUNT=`expr 1 + $ERRCOUNT`; export ERRCOUNT
            echo "ERROR #$ERRCOUNT: Dependency problems found in $1"
            echo "$BROKEN"
        else
            EXECOUNT=`expr $EXECOUNT + 1`; export EXECOUNT
        fi
    else
        EXECOUNT=`expr $EXECOUNT + 1`; export EXECOUNT
    fi
    return 0
}


if [ "x$TDBS_EXE_CONFIG" != "x" ]; then
    verify_file $TDBS_EXE_CONFIG/bafini
    verify_file $TDBS_EXE_CONFIG/doctor
    verify_file $TDBS_EXE_CONFIG/exif
    verify_file $TDBS_EXE_CONFIG/gethw
    verify_file $TDBS_EXE_CONFIG/glbupd
    verify_file $TDBS_EXE_CONFIG/glbupdit
    verify_file $TDBS_EXE_CONFIG/index
    verify_file $TDBS_EXE_CONFIG/load
    verify_file $TDBS_EXE_CONFIG/loadix
    verify_file $TDBS_EXE_CONFIG/modcon
    verify_file $TDBS_EXE_CONFIG/packit
    verify_file $TDBS_EXE_CONFIG/pidit
    verify_file $TDBS_EXE_CONFIG/print
    verify_file $TDBS_EXE_CONFIG/printit
    verify_file $TDBS_EXE_CONFIG/queryrcs
    verify_file $TDBS_EXE_CONFIG/rebif
    verify_file $TDBS_EXE_CONFIG/setlock
    verify_file $TDBS_EXE_CONFIG/showlic
    verify_file $TDBS_EXE_CONFIG/tbserver
    verify_file $TDBS_EXE_CONFIG/tracer
    verify_file $TDBS_EXE_CONFIG/trip
    verify_file $TDBS_EXE_CONFIG/tripd
    verify_file $TDBS_EXE_CONFIG/tripnetd
    verify_file $TDBS_EXE_CONFIG/trmmake
fi

verify_file $TDBS_HOME/sbin/install
verify_file $TDBS_HOME/sbin/uninstall
verify_file $TDBS_HOME/sbin/ostype
verify_file $TDBS_HOME/sbin/isinstalled
verify_file $TDBS_HOME/sbin/dependencies
verify_file $TDBS_HOME/sbin/migrate_control

verify_file $TDBS_HOME/lib/libtdbs.$SOEXT
verify_file $TDBS_HOME/lib/libtripxpi.$SOEXT
verify_file $TDBS_HOME/lib/libtrip3pp.$SOEXT
verify_file $TDBS_HOME/lib/libtripcrt_core.$SOEXT
verify_file $TDBS_HOME/lib/libtripcrt_core++.$SOEXT
verify_file $TDBS_HOME/lib/libtripstem.$SOEXT
verify_file $TDBS_HOME/lib/libmonlog.$SOEXT
verify_file $TDBS_HOME/lib/libtripjsonxml.$SOEXT
verify_file $TDBS_HOME/lib/libtripsql.$SOEXT
verify_file $TDBS_HOME/lib/libxerces-c.$SOEXT


##########################################################################
#
# Step 6: Check consistency of configuration file
#

export ERRCOUNT

TDBS_SYS_CONFIG=`qrcs TDBS_SYS -n`
if [ -d "$TDBS_SYS_CONFIG" ]; then
   echo INFO: TDBS_SYS=$TDBS_SYS_CONFIG
   SAVERR=$ERRCOUNT
   if [ ! -f $TDBS_SYS_CONFIG/TDBSERR.BAF ]; then
       ERRCOUNT=`expr 1 + $ERRCOUNT`
       echo "ERROR #$ERRCOUNT: Unable to find TDBSERR.BAF in TDBS_SYS directory"
    fi
    if [ ! -f $TDBS_SYS_CONFIG/SHELLERR.BAF ]; then
       ERRCOUNT=`expr 1 + $ERRCOUNT`
       echo "ERROR #$ERRCOUNT: Unable to find SHELLERR.BAF in TDBS_SYS directory"
    fi
    # TODO: Add additional system files checks
    if [ $SAVERR -eq $ERRCOUNT ]; then
       echo INFO: Required system files are present in the TDBS_SYS directory
    fi
    if [ -f $TDBS_SYS_CONFIG/DEBIT.LOG ]; then
       echo "INFO: There is a DEBIT.LOG file in the TDBS_SYS directory"
    fi
else
   ERRCOUNT=`expr 1 + $ERRCOUNT`
   echo "ERROR #$ERRCOUNT: Unable to find configuration symbol TDBS_SYS"
fi

TDBS_CTL_CONFIG=`qrcs TDBS_CTL -n`
if [ -d "$TDBS_CTL_CONFIG" ]; then
   echo INFO: TDBS_CTL=$TDBS_CTL_CONFIG
   SAVERR=$ERRCOUNT
   if [ ! -f $TDBS_CTL_CONFIG/CONTROL.BAF ]; then
      ERRCOUNT=`expr 1 + $ERRCOUNT`
      echo "ERROR #$ERRCOUNT: Unable to find CONTROL.BAF in TDBS_CTL directory"
   fi
   if [ ! -f $TDBS_CTL_CONFIG/CONTROL.BIF ]; then
      ERRCOUNT=`expr 1 + $ERRCOUNT`
      echo "ERROR #$ERRCOUNT: Unable to find CONTROL.BIF in TDBS_CTL directory"
   fi
   if [ ! -f $TDBS_CTL_CONFIG/CONTROL.VIF ]; then
      ERRCOUNT=`expr 1 + $ERRCOUNT`
      echo "ERROR #$ERRCOUNT: Unable to find CONTROL.VIF in TDBS_CTL directory"
   fi
   if [ $SAVERR -eq $ERRCOUNT ]; then
      echo INFO: CONTROL database files found in the TDBS_CTL directory
   fi
else
   ERRCOUNT=`expr 1 + $ERRCOUNT`
   echo "ERROR #$ERRCOUNT: Unable to find configuration symbol TDBS_CTL"
fi


##########################################################################
#
# Step 7: Verify existence of other system files
#

CHECK_EXIST_DATA_FILES=1
EXECHECKS=0
EXECOUNT=0
export ERRCOUNT EXECHECKS EXECOUNT

if [ -d $TDBS_SYS_CONFIG ]; then
    verify_file $TDBS_SYS_CONFIG/ADM_CHI.TXT
    verify_file $TDBS_SYS_CONFIG/ADM_ENG.TXT
    verify_file $TDBS_SYS_CONFIG/ADM_FIN.TXT
    verify_file $TDBS_SYS_CONFIG/ADM_GER.TXT
    verify_file $TDBS_SYS_CONFIG/ADM_JPN.TXT
    verify_file $TDBS_SYS_CONFIG/ADM_NOR.TXT
    verify_file $TDBS_SYS_CONFIG/ADM_SWE.TXT
    verify_file $TDBS_SYS_CONFIG/CHINESE.CCL
    verify_file $TDBS_SYS_CONFIG/ENGLISH.CCL
    verify_file $TDBS_SYS_CONFIG/ENGLISH.STP
    verify_file $TDBS_SYS_CONFIG/FINNISH.CCL
    verify_file $TDBS_SYS_CONFIG/FINNISH.STP
    verify_file $TDBS_SYS_CONFIG/GERMAN.CCL
    verify_file $TDBS_SYS_CONFIG/GERMAN.STP
    verify_file $TDBS_SYS_CONFIG/JAPANESE.CCL
    verify_file $TDBS_SYS_CONFIG/NORWEGIAN.CCL
    verify_file $TDBS_SYS_CONFIG/NORWEGIAN.STP
    verify_file $TDBS_SYS_CONFIG/P_CONTROL.BAF
    verify_file $TDBS_SYS_CONFIG/P_CONTROL.BIF
    verify_file $TDBS_SYS_CONFIG/P_CONTROL.VIF
    verify_file $TDBS_SYS_CONFIG/SFM_CHI.TXT
    verify_file $TDBS_SYS_CONFIG/SFM_ENG.TXT
    verify_file $TDBS_SYS_CONFIG/SFM_FIN.TXT
    verify_file $TDBS_SYS_CONFIG/SFM_GER.TXT
    verify_file $TDBS_SYS_CONFIG/SFM_JPN.TXT
    verify_file $TDBS_SYS_CONFIG/SFM_NOR.TXT
    verify_file $TDBS_SYS_CONFIG/SFM_SWE.TXT
    verify_file $TDBS_SYS_CONFIG/SHELLERR.BAF
    verify_file $TDBS_SYS_CONFIG/SHELLHLP.BAF
    verify_file $TDBS_SYS_CONFIG/SWEDISH.CCL
    verify_file $TDBS_SYS_CONFIG/SWEDISH.STP
    verify_file $TDBS_SYS_CONFIG/TDBSERR.BAF
    verify_file $TDBS_SYS_CONFIG/TDBSHLP.BAF
    verify_file $TDBS_SYS_CONFIG/TRIP_CHI.MEN
    verify_file $TDBS_SYS_CONFIG/TRIP_CHI.TXT
    verify_file $TDBS_SYS_CONFIG/TRIP_ENG.MEN
    verify_file $TDBS_SYS_CONFIG/TRIP_ENG.TXT
    verify_file $TDBS_SYS_CONFIG/TRIP_FIN.MEN
    verify_file $TDBS_SYS_CONFIG/TRIP_FIN.TXT
    verify_file $TDBS_SYS_CONFIG/TRIP_GER.MEN
    verify_file $TDBS_SYS_CONFIG/TRIP_GER.TXT
    verify_file $TDBS_SYS_CONFIG/TRIP_JPN.MEN
    verify_file $TDBS_SYS_CONFIG/TRIP_JPN.TXT
    verify_file $TDBS_SYS_CONFIG/TRIP_NOR.MEN
    verify_file $TDBS_SYS_CONFIG/TRIP_NOR.TXT
    verify_file $TDBS_SYS_CONFIG/TRIP_SWE.MEN
    verify_file $TDBS_SYS_CONFIG/TRIP_SWE.TXT
    verify_file $TDBS_SYS_CONFIG/TTY_CHI.TXT
    verify_file $TDBS_SYS_CONFIG/TTY_ENG.TXT
    verify_file $TDBS_SYS_CONFIG/TTY_FIN.TXT
    verify_file $TDBS_SYS_CONFIG/TTY_GER.TXT
    verify_file $TDBS_SYS_CONFIG/TTY_JPN.TXT
    verify_file $TDBS_SYS_CONFIG/TTY_NOR.TXT
    verify_file $TDBS_SYS_CONFIG/TTY_SWE.TXT
fi

echo INFO: Found $EXECOUNT of $EXECHECKS required files in TDBS_SYS

EXECHECKS=0
EXECOUNT=0
export ERRCOUNT EXECHECKS EXECOUNT

if [ "xTRIPRCS" != "x" ]; then
    TDBS_DEMO=`grep "^TRIP_DEMO" $TRIPRCS | ( read r; echo $r | cut -d= -f2 | tr -d '\r')`
fi
if ([ "xTDBS_DEMO" = "x" ] && [ "xTDBS_EXE_CONFIG" != "x" ]); then
    TDBS_DEMO=$TDBS_EXE_CONFIG/../demo
fi
echo INFO: TRIP_DEMO=$TDBS_DEMO
if [ "xTDBS_DEMO" != "x" ]; then
    verify_file $TDBS_DEMO/ALICE.BAF
    verify_file $TDBS_DEMO/ALICE.BIF
    verify_file $TDBS_DEMO/ALICE.VIF
    verify_file $TDBS_DEMO/ALICE_DEMO_HLP.BAF
    verify_file $TDBS_DEMO/ALICE_DEMO_HLP.BIF
    verify_file $TDBS_DEMO/ALICE_DEMO_HLP.VIF
    verify_file $TDBS_DEMO/CARROLL.BAF
    verify_file $TDBS_DEMO/CARROLL.BIF
    verify_file $TDBS_DEMO/CARROLL.VIF
    verify_file $TDBS_DEMO/CORR.BAF
    verify_file $TDBS_DEMO/CORR.BIF
    verify_file $TDBS_DEMO/CORR.VIF
    verify_file $TDBS_DEMO/P_CORR.BAF
    verify_file $TDBS_DEMO/P_CORR.BIF
    verify_file $TDBS_DEMO/P_CORR.VIF
    verify_file $TDBS_DEMO/THESALI.BAF
    verify_file $TDBS_DEMO/THESALI.BIF
    verify_file $TDBS_DEMO/THESALI.VIF
fi
echo INFO: Found $EXECOUNT of $EXECHECKS required files in TRIP_DEMO


##########################################################################
#
# Step 8: Network configuration (tripnetd/tbserver)
#

PORT=""

PCTDBS=`grep "^pctdbs " /etc/services 2>/dev/null`
if [ "x$PCTDBS" != "x" ]; then
   PTCP=`echo $PCTDBS | awk '{ print $2 }' 2>/dev/null`
   PORT=`echo $PTCP | cut -d"/" -f1 2>/dev/null`
   if [ "$PORT" != "" ]; then
      printf "INFO: the tripnet port pctdbs is defined in /etc/services as %s\n" $PORT
   fi
fi
PORT2=`qrcs TripNetPort -n`
if [ "$PORT2" != "" ]; then
   printf "INFO: the tripnet port is defined in tdbs.conf as %s\n" $PORT2
fi
if [ "$PORT" != "" ] && [ "$PORT2" != "" ]; then
   if [ "$PORT" != "$PORT2" ]; then
      WARNCOUNT=`expr $WARNCOUNT + 1`
      echo "WARNING #$WARNCOUNT: Conflict in tripnet port definition"
   fi
fi
if [ "$PORT" = "" ] && [ "$PORT2" = "" ]; then
   WARNCOUNT=`expr $WARNCOUNT + 1`
   echo "WARNING #$WARNCOUNT: The tripnet port is not defined - default port 23457 is used"
fi

# Determine if and how the TRIP network service is started

# NB: the inetd/xinetd check is obsoleted. Using those super servers is
# recommended, although not exactly forbidden. If such config is used,
# emit warnings
# 

stripspace()
{
   echo $1
}

if [ -f /etc/inetd.conf ] && [ "x$PCTDBS" != "x" ]; then
   CONFLINE=`grep "^pctdbs " /etc/inetd.conf`
   if [ "x$CONFLINE" != "x" ]; then
      CONFLINE=`stripspace "$CONFLINE"`
      INETD_TBSERVER_PATH=`echo $CONFLINE | cut -d" " -f6`
      TBUS=`echo $CONFLINE | awk '{ print $5 }'`
      echo "INFO: tbserver will be launched from /etc/inetd.conf (pctdbs)"
      echo "INFO:          as $INETD_TBSERVER_PATH"
      echo INFO: tbserver will be run as $TBUS
      if [ "$TDBS_EXE_CONFIG/tbserver" != "$INETD_TBSERVER_PATH" ]; then
         WARNCOUNT=`expr 1 + $WARNCOUNT`
         echo "WARNING #$WARNCOUNT: tbserver path in /etc/inetd.conf does not point to \$TDBS_EXE/tbserver"
      else
         WARNCOUNT=`expr 1 + $WARNCOUNT`
         echo "WARNING #$WARNCOUNT: tbserver is configured to launch via inetd (obsoleted)"
         CHECK_EXIST_INETD_CONF=1
      fi
   fi
fi

PATH=$PATH:/sbin:/usr/sbin

if [ $CHECK_EXIST_INETD_CONF -eq 1 ]; then

    RUNCHECK=`ps -ef | grep inetd | grep -v grep | grep -v xinetd 2>/dev/null`
    if [ "x$RUNCHECK" != "x" ]; then
        IDUS=`echo $RUNCHECK | awk '{ print $1 }'`
        echo INFO: inetd is running as $IDUS
    else
        WARNCOUNT=`expr 1 + $WARNCOUNT`
        echo "WARNING #$WARNCOUNT: inetd is not running"

        if [ -f /sbin/inetd ]; then
            INET_BINARY=/sbin/inetd
        else
            INET_BINARY=`PATH=$PATH which inetd 2>/dev/null | grep -v "not found"`
        fi
        if [ ! -f "$INET_BINARY" ]; then
           WARNCOUNT=`expr 1 + $WARNCOUNT`
           echo "WARNING #$WARNCOUNT: inetd binary not found (nonstandard location?)"
        fi
    fi
fi


if [ -f /etc/xinetd.conf ]; then

   XINETDD=`grep "^includedir " /etc/xinetd.conf | cut -d" " -f2`
   if [ -d "$XINETDD" ]; then

      # NOTE: This check assumes that the xinetd config file is called 
      # "pctdbs", which may not be correct if this was configured
      # manually.

      if [ -f $XINETDD/pctdbs ]; then
         XINETD_TBSERVER_PATH=`cat /etc/xinetd.d/pctdbs | grep -v "#" | grep server | cut -d= -f2`
         XINETD_TBSERVER_PATH=`stripspace $XINETD_TBSERVER_PATH`
         XINETD_USER=`cat /etc/xinetd.d/pctdbs | grep -v "#" | grep user | cut -d= -f2`

         if [ -f "$XINETD_TBSERVER_PATH" ]; then
            echo INFO: tbserver will be launched from $XINETDD/pctdbs
            echo "INFO:          as $XINETD_TBSERVER_PATH"
            echo INFO: tbserver will be run as $XINETD_USER
         fi
         if [ "$TDBS_EXE_CONFIG/tbserver" != "$XINETD_TBSERVER_PATH" ]; then
            WARNCOUNT=`expr 1 + $WARNCOUNT`
            echo "WARNING #$WARNCOUNT: tbserver path in $XINETDD/pctdbs does not point to $TDBS_EXE_CONFIG/tbserver"
         else
            WARNCOUNT=`expr 1 + $WARNCOUNT`
            echo "WARNING #$WARNCOUNT: tbserver is configured to launch via xinetd (obsoleted)"
            CHECK_EXIST_XINETD_CONF=1
         fi
      fi
   else
      WARNCOUNT=`expr 1 + $WARNCOUNT`
      echo "WARNING #$WARNCOUNT: Unable to find valid xinetd include directory in /etc/xinetd.conf"
   fi

fi


if [ $CHECK_EXIST_XINETD_CONF -eq 1 ]; then

    RUNCHECK=`ps -ef | grep xinetd | grep -v grep 2>/dev/null`
    if [ "x$RUNCHECK" != "x" ]; then
        XIUS=`echo $RUNCHECK | awk '{ print $1 }'`
        echo INFO: xinetd is running as $XIUS
    else
        WARNCOUNT=`expr 1 + $WARNCOUNT`
        echo "WARNING #$WARNCOUNT: xinetd is not running"

        if [ -f /sbin/xinetd ]; then
            XINET_BINARY=/sbin/xinetd
        else
            XINET_BINARY=`PATH=$PATH which xinetd 2>/dev/null | grep -v "not found"`
        fi
        if [ ! -f "$XINET_BINARY" ]; then
           WARNCOUNT=`expr 1 + $WARNCOUNT`
           echo "WARNING #$WARNCOUNT: xinetd binary not found (nonstandard location?)"
        fi
    fi

fi

if [ $CHECK_EXIST_XINETD_CONF -eq 0 ] && [ $CHECK_EXIST_INETD_CONF -eq 0 ]; then

   # The tbserver not configured to start via either inetd or xinetd.
   # This means that the system is either not yet configured for network
   # access, or that tripnetd is configured to start via systemd or initd.

   # TODO: Check for systemd launch of tripnetd / tbserver

   # TODO: Check for initd launch of tripnetd / tbserver

   echo "INFO: Neither of the obsoleted superservers (inetd or xinetd) is used"

fi


##########################################################################
#
# Step 9: Check daemons and possible tripnetd conflicts
#

RUNCHECK=`ps -ef | grep tripd | grep -v grep | grep -v tripdev 2>/dev/null`
if [ "x$RUNCHECK" != "x" ]; then
    CHECK_TRIPD_RUNNING=1
    TDUS=`echo $RUNCHECK | awk '{ print $1 }'`
    echo INFO: tripd is running as $TDUS
    TDPID=`echo $RUNCHECK | awk '{ print $2 }'`
    if [ "$OSTYPE" = "Linux" ]; then
        TDPID=`echo $RUNCHECK | awk '{ print $2 }'`
        TRIPD_PATH=`resolvelink /proc/$TDPID/exe`
    else
        F6=`echo $RUNCHECK | awk '{ print $6 }' | cut -c1`
        if [ "$F6" = "?" ] || [ "$F6" = "-" ]; then
            TRIPD_PATH=`echo $RUNCHECK | awk '{ print $8 }'`
        else
            TRIPD_PATH=`echo $RUNCHECK | awk '{ print $9 }'`
        fi
    fi
    if [ "$TDBS_EXE_CONFIG/tripd" != "$TRIPD_PATH" ]; then
        WARNCOUNT=`expr 1 + $WARNCOUNT`
        echo "WARNING #$WARNCOUNT: path of running tripd, $TRIPD_PATH, does not point to $TDBS_EXE_CONFIG/tripd"
    fi
else
    WARNCOUNT=`expr 1 + $WARNCOUNT`
    echo "WARNING #$WARNCOUNT: tripd is not running"
fi


if [ -f "$TDBS_EXE_CONFIG/tripnetd" ]; then
    RUNCHECK=`ps -ef | grep tripnetd | grep -v grep 2>/dev/null`
    if [ "x$RUNCHECK" != "x" ]; then
        CHECK_TRIPNETD_RUNNING=1
        TNUS=`echo $RUNCHECK | awk '{ print $1 }'`
        echo INFO: tripnetd is running as $TNUS
        echo INFO: tbserver will be launched by tripnetd
        echo "INFO:          as $TDBS_EXE_CONFIG/tbserver"
        echo INFO: tbserver will be run as $TNUS
        if [ $CHECK_EXIST_XINETD_CONF -eq 1 ]; then
            ERRCOUNT=`expr 1 + $ERRCOUNT`
            echo "ERROR #$ERRCOUNT: tripnetd is running but tbserver is configured to launch via xinetd as well"
        fi
        if [ $CHECK_EXIST_INETD_CONF -eq 1 ]; then
            ERRCOUNT=`expr 1 + $ERRCOUNT`
            echo "ERROR #$ERRCOUNT: tripnetd is running but tbserver is configured to launch via inetd as well"
        fi
    else
        if [ "$OSTYPE" = "Darwin" ]; then
            WARNCOUNT=`expr 1 + $WARNCOUNT`
            echo "WARNING #$WARNCOUNT: tripnetd is not running"
        else
            echo INFO: tripnetd is not running
        fi
    fi
fi


##########################################################################
#
# Step 10: Check runtime linker configuration
#

if [ -f /sbin/ldconfig ]; then

   OCCSFILE=`mktemp`
   /sbin/ldconfig -v -N 2>/dev/null | grep ^/ | cut -d: -f1 | while read LIBDIR; do
      if [ -f "$LIBDIR/libtdbs.so" ]; then
         echo "INFO: Found libtdbs.so via runtime linker in $LIBDIR" | tee -a $OCCSFILE
      fi
   done
   LIBTDBSOCCS=`cat $OCCSFILE | wc -l`
   rm -f $OCCSFILE
   if [ $LIBTDBSOCCS -eq 0 ]; then
       ERRCOUNT=`expr 1 + $ERRCOUNT`
       echo "ERROR #$ERRCOUNT: libtdbs.so not found via the runtime linker." 
       echo "      ASEs and custom C TRIP applications may not work correctly."
   elif [ $LIBTDBSOCCS -gt 1 ]; then
       WARNCOUNT=`expr 1 + $WARNCOUNT`
       echo "WARNING #$WARNCOUNT: Multiple instances of libtdbs.so found via runtime linker."
       echo "        ASEs and custom C TRIP applictions may not work correctly."
   fi

elif [ -d /usr/lib ]; then

   if [ ! -e /usr/lib/libtdbs.so ]; then
      ERRCOUNT=`expr 1 + $ERRCOUNT`
      echo "ERROR #$ERRCOUNT: libtdbs.so not found in /usr/lib"
      echo "      ASEs and custom C TRIP applications may not work correctly."
   else
      LIBTDBSACT=`readlink -f /usr/lib/libtdbs.so`
      if [ "$LIBTDBSACT" != "$TDBS_HOME/lib/libtdbs.so" ]; then
         ERRCOUNT=`expr 1 + $ERRCOUNT`
         echo "ERROR #$ERRCOUNT: /usr/lib/libtdbs.so linking to $LIBTDBSACT"
         echo "      Expected a link to $TDBS_HOME/lib/libtdbs.so"
         echo "      ASEs and custom C programs may not work correctly."
      fi
   fi

else

   ERRCOUNT=`expr 1 + $ERRCOUNT`
   echo "ERROR #$ERRCOUNT: Unable to determine runtime linker location for libtdbs.so"
   echo "            ASEs and custom C TRIP applications may not work correctly."

fi


##########################################################################
#
# Step 11: Check version and adjust errors/warnings accordingly
#

if [ -x "$TDBS_EXE_CONFIG/trip" ]; then
   TRIPVERSION=`$TDBS_EXE_CONFIG/trip -v 2>/dev/null`

   VER_MAJ=0
   VER_MIN=0
   VER_SER=0
   VER_PAT=0

   VER_MAJ=`echo $TRIPVERSION | cut -d. -f1`
   REST=`echo $TRIPVERSION | cut -d. -f2-`

   VER_MIN=`echo $REST | cut -d- -f1`
   REST=`echo $REST | cut -d- -f2-`

   VER_SER=`echo $REST | cut -d: -f1`
   if [ "$REST" != "$VER_SER" ]; then
      VER_PAT=`echo $REST | cut -d: -f2-`
   fi

   echo INFO: TRIP version is $VER_MAJ.$VER_MIN-$VER_SER:$VER_PAT

   HAS_TIMESTAMP_BUG=0
   if [ $VER_MAJ -lt 7 ]; then
        if [ $VER_MAJ -lt 6 ]; then
            HAS_TIMESTAMP_BUG=1
        elif [ $VER_MAJ -eq 6 ] && [ $VER_MIN -le 2 ]; then
            if [ $VER_MIN -eq 2 ] && [ $VER_SER -lt 7 ]; then
                HAS_TIMESTAMP_BUG=1
            elif [ $VER_MIN -lt 2 ]; then
                HAS_TIMESTAMP_BUG=1
            fi
        fi

        WOKCOUNT=`expr 1 + $WOKCOUNT`

        if [ $VER_MAJ -eq 6 ] && [ $VER_MIN -eq 2 ] && [ $VER_SER -eq 99 ]; then
            echo INFO: Internal pre-release TRIP7 detected
        elif [ $VER_MAJ -eq 6 ] && [ $VER_MIN -eq 0 ]; then
            echo INFO: TRIP6 beta version detected
        fi
    fi

    if [ $HAS_TIMESTAMP_BUG -eq 1 ]; then
        WARNCOUNT=`expr 1 + $WARNCOUNT`
        echo "WARNING #$WARNCOUNT: The installed TRIP version has the timestamp bug"
    fi
fi
                                  

##########################################################################
#
# Last Step: Summary report
#

echo ""
ERRCOUNT=`expr $ERRCOUNT - $EOKCOUNT`
WARNCOUNT=`expr $WARNCOUNT - $WOKCOUNT`
echo "Found $ERRCOUNT error(s) and $WARNCOUNT potential problem(s) with your installation."
if [ $ERRCOUNT -gt 0 ] || [ $WARNCOUNT -gt 0 ]; then
    echo Please check the above analysis!
else
    echo Your installation is OK!
fi
echo ""

exit $ERRCOUNT

