#!/bin/bash
# UNINSTALL
# This UNINSTALL script is meant to uninstall niusrpriodistributioni 1.0.1f0 from
# a Linux system.
#
#  (c) Copyright 2004-2014,
#  National Instruments Corporation.
#  All Rights reserved.
#

kProductVersion="1.0.1f0"
kProductName="niusrpriodistributioni"
kProductStringSentence="NI USRP RIO distribution installer"
kProductStringBanner="NI USRP RIO distribution installer"
uninstallPackageList="nibdski nibdski nifpgai nifpgai nikal-bin nikal-bin nikali nip2pi nip2pki nip2pki nirioi nirioi niusrprioerrorsi niusrprioerrorsi niusrprioi niusrprioi niusrprioki niusrprioki niusrpriorpci niusrpriorpci"

# Set the path
PATH=/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/local/bin
export PATH

# General constants
kNo=0
kYes=1
kFalse=0
kTrue=1
statusSuccess=0
statusFail=1

# Additional constants
kTarPackageName="$kProductName-$kProductVersion.tar.gz"
kTmpInstallSrcPath="/tmp/$kProductName-$kProductVersion.install"
kInstallationLog="/etc/natinst/$kProductName-$kProductVersion.plist"
kInstallerBinDir="$kTmpInstallSrcPath/bin"

# Error messages
eNotFound="Not found in current path"
eInvalidSel="Invalid selection."
eInstallAborted="Installer is aborted."
eInstallComplete="Installer is finished."

# findutil gets the path to a utility
# Input: $1: name of utility to find
# Output: $FINDUTIL: path of found utility or empty string
# Returns: 0=success, nonzero=failure
FINDUTIL=""
findutil()
{
   # Validate inputs
   if [ -z $1 ]; then
      return $statusFail
   fi
   # Use which to locate the executable
   FINDUTIL=`which $1 --skip-alias 2> /dev/null`
   # If not found, display an error
   if [ -z "$FINDUTIL" ]; then
      STRING="$1"
      # Pad spaces to account for aesthetics
      while [ ${#STRING} -lt 10 ]; do
         STRING="$STRING "
      done
      echo "$STRING $eNotFound"
      return $statusFail
   fi
   return $statusSuccess
}

# inputynq get a yes / no / quit response from the user
# Input: $1: Prompt string associated with input
#        $2: Default selection
# Output: $INPUT: character entered and accepted
# Returns: Nothing
INPUT=""
inputynq()
{
   inputynqLOOP=$kYes
   while [ "$inputynqLOOP" -eq "$kYes" ]; do
      echo -n "$1"
      read INPUT
      test -z "$INPUT" && INPUT="$2"
      case "$INPUT" in
      [YyNn])
         inputynqLOOP=$kNo
         ;;
      [Qq])
         exit $statusFail
         ;;
      *)
         echo -n "$eInvalidSel  "
         ;;
      esac
   done
}

# initNIDrivers attempt to start or stop all NI Drivers on the system.
#   This is done by searching for all init scripts for the current run
#   level that are just links in /etc/init.d to a natinst location.
# Input: $1: init action, start or stop are the only valid options
# Output: Nothing
# Returns: statusSuccess or statusFail
initNIDrivers ()
{
   initAction=$1
   if [ "$initAction" = "start" ]; then
      sortCommand="$SORT"
   elif [ "$initAction" = "stop" ]; then
      sortCommand="$SORT -r"
   else
      echo "initNIDrivers unknown action: $initAction"
      return $statusFail
   fi

   currentRunLevel="`$RUNLEVEL | $AWK '{ print $2}'`"
   if [ -d /etc/rc${currentRunLevel}.d ]; then
      currentRunLevelDir=/etc/rc${currentRunLevel}.d
   elif [ -d /etc/init.d/rc${currentRunLevel}.d ]; then
      currentRunLevelDir=/etc/init.d/rc${currentRunLevel}.d
   else
      return $statusFail
   fi

   for strInitModule in `ls ${currentRunLevelDir}/S* | $sortCommand`; do
      strInitModule=${strInitModule##*\/}
      strInitModule=${strInitModule#S[0-9][0-9]}
      if [ `ls -al /etc/init.d/$strInitModule 2> /dev/null | $GREP -wc natinst` -ne 0 ]; then
         /etc/init.d/$strInitModule $initAction >/dev/null 2>&1
         nReturnValue=$?
         if [ $nReturnValue -ne 0 ]; then
            return $nReturnValue
         fi
      fi
   done

   return $statusSuccess
}

reloadNIDrivers ()
{
   initNIDrivers stop
   nReturnValue=$?
   if [ $nReturnValue -ne 0 ]; then
      return $nReturnValue
   fi
   initNIDrivers start
   return $?
}

# requirementsInList checks that the passed variables exist in
#    uninstallPackageList
# inputs: $*: list of packages to check for
# outputs: none
# returns: $statusSuccess if all packages passed are in the list
#          $statusFail if any package passed is not in the list
requirementsInList()
{
   dependencyList=$*

   for dependantPackage in $dependencyList
   do
      packageBasename=${dependantPackage%-*-*}

      possiblePackage=${uninstallPackageList/$packageBasename}
      if [ "$possiblePackage" = "$uninstallPackageList" ]; then
         return $statusFail
      fi
   done

   return $statusSuccess
}

# willBeUninstalled checks if the passed package will be uninstalled during this
#    uninstallation.
# Input: $1: package name to query
#        $uninstallPackageList: list of packages that will be uninstalled
# Output: none
# Returns: 0=success, nonzero=failure
willBeUninstalled()
{
   queryPackage=$1

   for uninstallingPackage in $uninstallPackageList
   do
      uninstallingPackage=${uninstallingPackage##*\/}
      if [ "$uninstallingPackage" = "$queryPackage" ]; then
         return $statusSuccess
      fi
   done
   return $statusFail
}

# cleanexit performs script cleanup and quits
#           can only be used after RM has been defined
# Input: $1: exit code
# Output: None
# Returns: Nothing
cleanexit ()
{
   if [ -z $RM ]; then
      exit $statusFail
   fi
   # Clean up temporary directories
   rm -rf "$kTmpInstallSrcPath"

   # Display an exit message based on exit code
   if [ $1 -ne 0 ]; then
      echo ""
      echo "$eInstallAborted"
   else
      echo ""
      echo "$eInstallComplete"
   fi

   exit $1
}

# cleanwoexit performs script cleanup w/o exiting
# Input: None
# Output: None
# Returns: Nothing
cleanwoexit ()
{
   if [ ! -z "$RM" ]; then
      # Clean up temporary directories
      rm -rf "$kTmpInstallSrcPath"
   fi
}

parseArguments()
{
   promptUser=$kTrue
   noPromptRpmUninstall=$kFalse

   while [ "$1" != "" ]; do
      case $1 in
         --no-prompt)
            promptUser=$kFalse
            ;;
         --accept-license)
            licenseAcceptedByUser=true
            ;;
         --no-prompt-rpm)
            noPromptRpmUninstall=$kTrue
            ;;
         *)
            echo "Unrecognized Option: $1" > /dev/stderr
            echoUsage
            exit $statusFail
            ;;
      esac
      shift
   done
}

# Perform cleanup if a Ctrl+C or kill signal is received
trap "cleanexit 1" SIGINT SIGTERM

#
# Display software information
#
echo ""
echo "*****************************************************************************"
echo "  $kProductStringBanner"
echo "     version $kProductVersion for Linux"
echo "*****************************************************************************"
echo ""

currentdir="`pwd`"

#
# Verify root user
#
if [ $EUID -ne 0 ]; then
   echo "This script must be run as root."
   echo "$eInstallAborted"
   # Not a cleanexit call because cleanexit uses $RM, which has
   # not been set yet
   exit $statusFail
fi

originalArguments=$*
parseArguments $*

findutil "awk"
let "RETURN+=$?"
AWK=$FINDUTIL

findutil "grep"
let "RETURN+=$?"
GREP=$FINDUTIL

findutil "rm"
let "RETURN+=$?"
RM=$FINDUTIL

findutil "rmdir"
let "RETURN+=$?"
RMDIR=$FINDUTIL

findutil "sed"
let "RETURN+=$?"
SED=$FINDUTIL

findutil "tar"
let "RETURN+=$?"
TAR=$FINDUTIL

findutil "runlevel"
let "RETURN+=$?"
RUNLEVEL=$FINDUTIL

findutil "sort"
let "RETURN+=$?"
SORT=$FINDUTIL

# Quit if there was an error
if [ "$RETURN" -ne 0 ]; then
   cleanexit $RETURN
fi

CDPATH="`dirname $0`"
case "$CDPATH" in
   /*) ;;
   .) CDPATH="`pwd`" ;;
   *) CDPATH="`pwd`/$CDPATH" ;;
esac

#
# Verify installation tools
#

findutil "rpm"
let "RETURN+=$?"
RPM=$FINDUTIL
if [ $RETURN -eq 0 ]; then
   echo "rpm found"
   rpmFound=$kTrue
else
   echo "rpm not found.  RPM will not be used"
   rpmFound=$kFalse
fi

findutil "dpkg"
RETURN=$?
DPKG=$FINDUTIL
if [ $RETURN -eq 0 ]; then
   echo "dpkg found"
   findutil "dpkg-query"
   RETURN=$?
   DPKG_QUERY=$FINDUTIL
   if [ "$rpmFound" -eq "$kTrue" ]; then
      if [ "$noPromptRpmUninstall" -eq "$kTrue" ]; then
         echo "Dpkg is available but installing with rpm anyway."
         bUseDpkg=$kFalse
      else
         bUseDpkg=$kTrue
      fi
   else
      bUseDpkg=$kTrue
   fi
else
   echo "dpkg not available, uninstall will not be using dpkg."
   bUseDpkg=$kFalse
fi

echo "$kProductStringSentence version $kProductVersion"
if [ "$bUseDpkg" -eq $kTrue ]; then
   echo "is about to be uninstalled using dpkg at /usr/local/natinst"
else
   echo "is about to be uninstalled using rpm at /usr/local/natinst"
fi

echo ""
if [ "$promptUser" -eq $kTrue ]; then
   inputynq "Continue? [Yn] " 'Y'
   case "$INPUT" in
   [Yy])
      ;;
   [Nn])
      exit $statusFail
      ;;
   esac
   echo ""
fi

# Clean up any stale contents
if [ -d "$kTmpInstallSrcPath" ] ; then
  rm -rf "$kTmpInstallSrcPath"
fi
mkdir -p "$kTmpInstallSrcPath"

bRebootRequired=$kFalse

initNIDrivers stop
if [ $? -ne 0 ] ; then
   bRebootRequired=$kTrue
fi

uninstallStatus=$statusSuccess

if ls /lib/modules/$(uname -r)/kernel/natinst > /dev/null 2>&1
then
   echo "Stopping USRP-RIO PCIe daemon/service..."
   DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
   niusrprio_pcie stop > /dev/null 2>&1
   rm -f /usr/local/bin/niusrprio_pcie
fi

echo "Uninstalling $kProductStringSentence version $kProductVersion..."
# Perform uninstall with dpkg if available 
if [ $bUseDpkg -eq $kTrue ]; then

# Define component locations
if [ -e /etc/natinst/nibds/nibds.dir ]; then
   nibdsDir=`cat /etc/natinst/nibds/nibds.dir`
fi
if [ -e /etc/natinst/nibds/nibds.dir ]; then
   nibdsDir=`cat /etc/natinst/nibds/nibds.dir`
fi
if [ -e /etc/natinst/nifpga/nifpga.dir ]; then
   nifpgaDir=`cat /etc/natinst/nifpga/nifpga.dir`
fi
if [ -e /etc/natinst/nifpga/nifpga.dir ]; then
   nifpgaDir=`cat /etc/natinst/nifpga/nifpga.dir`
fi
if [ -e /etc/natinst/nikal/nikal.dir ]; then
   nikalDir=`cat /etc/natinst/nikal/nikal.dir`
fi
if [ -e /etc/natinst/nikal/nikal.dir ]; then
   nikalDir=`cat /etc/natinst/nikal/nikal.dir`
fi
if [ -e /etc/natinst/nip2p/nip2p.dir ]; then
   nip2pDir=`cat /etc/natinst/nip2p/nip2p.dir`
fi
if [ -e /etc/natinst/nip2p/nip2p.dir ]; then
   nip2pDir=`cat /etc/natinst/nip2p/nip2p.dir`
fi
if [ -e /etc/natinst/nip2p/nip2p.dir ]; then
   nip2pDir=`cat /etc/natinst/nip2p/nip2p.dir`
fi
if [ -e /etc/natinst/nirio/nirio.dir ]; then
   nirioDir=`cat /etc/natinst/nirio/nirio.dir`
fi
if [ -e /etc/natinst/nirio/nirio.dir ]; then
   nirioDir=`cat /etc/natinst/nirio/nirio.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/nikal/nikal.dir ]; then
   nikalDir=`cat /etc/natinst/nikal/nikal.dir`
fi

# Pre-process driver

# Source each of the installerUtility.sh scripts to get their functions and
# defines
for instutil in "$nibdsDir/bin/"nibdskiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nibdsDir/bin/"nibdskiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nifpgaDir/bin/"nifpgaiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nifpgaDir/bin/"nifpgaiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nikalDir/bin/"nikal_binInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nikalDir/bin/"nikal_binInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nip2pDir/bin/"nip2piInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nip2pDir/bin/"nip2pkiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nip2pDir/bin/"nip2pkiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nirioDir/bin/"nirioiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nirioDir/bin/"nirioiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrprioerrorsiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrprioerrorsiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrprioiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrprioiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrpriokiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrpriokiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrpriorpciInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrpriorpciInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nikalDir/bin/"nikaliInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done

continueLoop=$kYes

while [ "$continueLoop" -eq $kYes ]; do
   continueLoop=$kNo
   for package in $uninstallPackageList
   do
      if dpkg-query -W $package > /dev/null 2>&1 ; then
         requirements=`dpkg --purge --dry-run $package 2>&1 |                       sed -n 's/ \(.*\) depends on.*/\1/p' |                       LANG=C sort | uniq`
         if [ $? -eq 0 ]; then
            if ! requirementsInList $requirements; then
               echo "$package cannot be removed, other packages depend on it."
               uninstallPackageList=`echo ${uninstallPackageList} | sed 's/$package//g'`
               if [ -n "$uninstallPackageList" ]; then
                  continueLoop=$kYes
               fi
               break
            fi
         fi
      else
         uninstallPackageList=`echo ${uninstallPackageList} | sed 's/$package//g'`
      fi
   done
done

# clean out extra white space
tmpUninstallPackageList="$uninstallPackageList"
uninstallPackageList=""
for package in $tmpUninstallPackageList
do
   if [ -n "$uninstallPackageList" ]; then
      uninstallPackageList="$uninstallPackageList $package"
   else
      uninstallPackageList=$package
   fi
done

if [ -z "$uninstallPackageList" ]; then
   echo "All packages in the distribution are still in use or are already removed."
   echo "Nothing to Uninstall."
   exit $statusSuccess
fi

# Call each of the preUninstall functions

echo -n "Pre Uninstallation ."
if willBeUninstalled nibdski; then
   if declare -f nibdskiPreUninstall > /dev/null; then
      preUninstall=nibdskiPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: nibdski pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled nibdski; then
   if declare -f nibdskiPreUninstall > /dev/null; then
      preUninstall=nibdskiPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: nibdski pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled nifpgai; then
   if declare -f nifpgaiPreUninstall > /dev/null; then
      preUninstall=nifpgaiPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: nifpgai pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled nifpgai; then
   if declare -f nifpgaiPreUninstall > /dev/null; then
      preUninstall=nifpgaiPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: nifpgai pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled nikal-bin; then
   if declare -f nikal_binPreUninstall > /dev/null; then
      preUninstall=nikal_binPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: nikal-bin pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled nikal-bin; then
   if declare -f nikal_binPreUninstall > /dev/null; then
      preUninstall=nikal_binPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: nikal-bin pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled nip2pi; then
   if declare -f nip2piPreUninstall > /dev/null; then
      preUninstall=nip2piPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: nip2pi pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled nip2pki; then
   if declare -f nip2pkiPreUninstall > /dev/null; then
      preUninstall=nip2pkiPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: nip2pki pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled nip2pki; then
   if declare -f nip2pkiPreUninstall > /dev/null; then
      preUninstall=nip2pkiPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: nip2pki pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled nirioi; then
   if declare -f nirioiPreUninstall > /dev/null; then
      preUninstall=nirioiPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: nirioi pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled nirioi; then
   if declare -f nirioiPreUninstall > /dev/null; then
      preUninstall=nirioiPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: nirioi pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled niusrprioerrorsi; then
   if declare -f niusrprioerrorsiPreUninstall > /dev/null; then
      preUninstall=niusrprioerrorsiPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: niusrprioerrorsi pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled niusrprioerrorsi; then
   if declare -f niusrprioerrorsiPreUninstall > /dev/null; then
      preUninstall=niusrprioerrorsiPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: niusrprioerrorsi pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled niusrprioi; then
   if declare -f niusrprioiPreUninstall > /dev/null; then
      preUninstall=niusrprioiPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: niusrprioi pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled niusrprioi; then
   if declare -f niusrprioiPreUninstall > /dev/null; then
      preUninstall=niusrprioiPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: niusrprioi pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled niusrprioki; then
   if declare -f niusrpriokiPreUninstall > /dev/null; then
      preUninstall=niusrpriokiPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: niusrprioki pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled niusrprioki; then
   if declare -f niusrpriokiPreUninstall > /dev/null; then
      preUninstall=niusrpriokiPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: niusrprioki pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled niusrpriorpci; then
   if declare -f niusrpriorpciPreUninstall > /dev/null; then
      preUninstall=niusrpriorpciPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: niusrpriorpci pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled niusrpriorpci; then
   if declare -f niusrpriorpciPreUninstall > /dev/null; then
      preUninstall=niusrpriorpciPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: niusrpriorpci pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."

if willBeUninstalled nikali; then
   if declare -f nikaliPreUninstall > /dev/null; then
      preUninstall=nikaliPreUninstall
   fi
   if [ "$preUninstall" != "" ]; then
      if ! $preUninstall > /tmp/${preUninstall}.log 2>&1; then
         echo ""
         echo "Warning: nikali pre uninstallation failed! /tmp/${preUninstall}.log follows:"
         cat ${preUninstall}.log
         uninstallStatus=$statusFail
      fi
   fi
fi
echo -n "."


# Perform the uninstallation with the package list
$DPKG --purge $uninstallPackageList > /dev/null 2>&1
if [ $? -ne 0 ]; then
   echo "Error uninstalling $kProductStringSentence $kProductVersion."
   exit $statusFail
fi

# Uninstall with RPM if not using dpkg
else

# Define component locations
if [ -e /etc/natinst/nibds/nibds.dir ]; then
   nibdsDir=`cat /etc/natinst/nibds/nibds.dir`
fi
if [ -e /etc/natinst/nibds/nibds.dir ]; then
   nibdsDir=`cat /etc/natinst/nibds/nibds.dir`
fi
if [ -e /etc/natinst/nifpga/nifpga.dir ]; then
   nifpgaDir=`cat /etc/natinst/nifpga/nifpga.dir`
fi
if [ -e /etc/natinst/nifpga/nifpga.dir ]; then
   nifpgaDir=`cat /etc/natinst/nifpga/nifpga.dir`
fi
if [ -e /etc/natinst/nikal/nikal.dir ]; then
   nikalDir=`cat /etc/natinst/nikal/nikal.dir`
fi
if [ -e /etc/natinst/nikal/nikal.dir ]; then
   nikalDir=`cat /etc/natinst/nikal/nikal.dir`
fi
if [ -e /etc/natinst/nip2p/nip2p.dir ]; then
   nip2pDir=`cat /etc/natinst/nip2p/nip2p.dir`
fi
if [ -e /etc/natinst/nip2p/nip2p.dir ]; then
   nip2pDir=`cat /etc/natinst/nip2p/nip2p.dir`
fi
if [ -e /etc/natinst/nip2p/nip2p.dir ]; then
   nip2pDir=`cat /etc/natinst/nip2p/nip2p.dir`
fi
if [ -e /etc/natinst/nirio/nirio.dir ]; then
   nirioDir=`cat /etc/natinst/nirio/nirio.dir`
fi
if [ -e /etc/natinst/nirio/nirio.dir ]; then
   nirioDir=`cat /etc/natinst/nirio/nirio.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/niusrp/niusrp.dir ]; then
   niusrpDir=`cat /etc/natinst/niusrp/niusrp.dir`
fi
if [ -e /etc/natinst/nikal/nikal.dir ]; then
   nikalDir=`cat /etc/natinst/nikal/nikal.dir`
fi

# Pre-process driver

# Source each of the installerUtility.sh scripts to get their functions and
# defines
for instutil in "$nibdsDir/bin/"nibdskiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nibdsDir/bin/"nibdskiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nifpgaDir/bin/"nifpgaiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nifpgaDir/bin/"nifpgaiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nikalDir/bin/"nikal_binInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nikalDir/bin/"nikal_binInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nip2pDir/bin/"nip2piInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nip2pDir/bin/"nip2pkiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nip2pDir/bin/"nip2pkiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nirioDir/bin/"nirioiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nirioDir/bin/"nirioiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrprioerrorsiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrprioerrorsiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrprioiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrprioiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrpriokiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrpriokiInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrpriorpciInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$niusrpDir/bin/"niusrpriorpciInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done
for instutil in "$nikalDir/bin/"nikaliInstallerUtility{64,}.sh;
do
   if [ -e "$instutil" ]; then
      source "$instutil"
   fi
done

continueLoop=$kYes

while [ $continueLoop -eq $kYes ]; do
   continueLoop=$kNo
   for package in $uninstallPackageList
   do
      if rpm -q $package > /dev/null 2>/dev/null; then
         requirements=`$RPM -q --whatrequires $package`
         if [ $? -eq 0 ]; then
            if ! requirementsInList $requirements; then
               echo "$package cannot be removed, other packages depend on it."
               uninstallPackageList=${uninstallPackageList/$package}
               if [ -n "$uninstallPackageList" ]; then
                  continueLoop=$kYes
               fi
               break
            fi
         fi
      else
         uninstallPackageList=${uninstallPackageList/$package}
      fi
   done
done

# clean out extra white space
tmpUninstallPackageList="$uninstallPackageList"
uninstallPackageList=""
for package in $tmpUninstallPackageList
do
   if [ -n "$uninstallPackageList" ]; then
      uninstallPackageList="$uninstallPackageList $package"
   else
      uninstallPackageList=$package
   fi
done

# Call each of the preUninstall functions
if [ -n "$uninstallPackageList" ]; then
   echo -n "Pre Uninstallation ."
   if willBeUninstalled nibdski; then
      if declare -f nibdskiPreUninstall > /dev/null; then
         if ! nibdskiPreUninstall > /tmp/nibdskiPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: nibdski pre uninstallation failed! /tmp/nibdskiPreUninstall.log follows:"
            cat nibdskiPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f nibdskiPreUninstall64 > /dev/null; then
         if ! nibdskiPreUninstall64 > /tmp/nibdskiPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: nibdski pre uninstallation failed! /tmp/nibdskiPreUninstall64.log follows:"
            cat nibdskiPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled nibdski; then
      if declare -f nibdskiPreUninstall > /dev/null; then
         if ! nibdskiPreUninstall > /tmp/nibdskiPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: nibdski pre uninstallation failed! /tmp/nibdskiPreUninstall.log follows:"
            cat nibdskiPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f nibdskiPreUninstall64 > /dev/null; then
         if ! nibdskiPreUninstall64 > /tmp/nibdskiPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: nibdski pre uninstallation failed! /tmp/nibdskiPreUninstall64.log follows:"
            cat nibdskiPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled nifpgai; then
      if declare -f nifpgaiPreUninstall > /dev/null; then
         if ! nifpgaiPreUninstall > /tmp/nifpgaiPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: nifpgai pre uninstallation failed! /tmp/nifpgaiPreUninstall.log follows:"
            cat nifpgaiPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f nifpgaiPreUninstall64 > /dev/null; then
         if ! nifpgaiPreUninstall64 > /tmp/nifpgaiPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: nifpgai pre uninstallation failed! /tmp/nifpgaiPreUninstall64.log follows:"
            cat nifpgaiPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled nifpgai; then
      if declare -f nifpgaiPreUninstall > /dev/null; then
         if ! nifpgaiPreUninstall > /tmp/nifpgaiPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: nifpgai pre uninstallation failed! /tmp/nifpgaiPreUninstall.log follows:"
            cat nifpgaiPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f nifpgaiPreUninstall64 > /dev/null; then
         if ! nifpgaiPreUninstall64 > /tmp/nifpgaiPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: nifpgai pre uninstallation failed! /tmp/nifpgaiPreUninstall64.log follows:"
            cat nifpgaiPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled nikal-bin; then
      if declare -f nikal_binPreUninstall > /dev/null; then
         if ! nikal_binPreUninstall > /tmp/nikal_binPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: nikal-bin pre uninstallation failed! /tmp/nikal_binPreUninstall.log follows:"
            cat nikal_binPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f nikal_binPreUninstall64 > /dev/null; then
         if ! nikal_binPreUninstall64 > /tmp/nikal_binPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: nikal-bin pre uninstallation failed! /tmp/nikal_binPreUninstall64.log follows:"
            cat nikal_binPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled nikal-bin; then
      if declare -f nikal_binPreUninstall > /dev/null; then
         if ! nikal_binPreUninstall > /tmp/nikal_binPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: nikal-bin pre uninstallation failed! /tmp/nikal_binPreUninstall.log follows:"
            cat nikal_binPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f nikal_binPreUninstall64 > /dev/null; then
         if ! nikal_binPreUninstall64 > /tmp/nikal_binPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: nikal-bin pre uninstallation failed! /tmp/nikal_binPreUninstall64.log follows:"
            cat nikal_binPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled nip2pi; then
      if declare -f nip2piPreUninstall > /dev/null; then
         if ! nip2piPreUninstall > /tmp/nip2piPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: nip2pi pre uninstallation failed! /tmp/nip2piPreUninstall.log follows:"
            cat nip2piPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f nip2piPreUninstall64 > /dev/null; then
         if ! nip2piPreUninstall64 > /tmp/nip2piPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: nip2pi pre uninstallation failed! /tmp/nip2piPreUninstall64.log follows:"
            cat nip2piPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled nip2pki; then
      if declare -f nip2pkiPreUninstall > /dev/null; then
         if ! nip2pkiPreUninstall > /tmp/nip2pkiPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: nip2pki pre uninstallation failed! /tmp/nip2pkiPreUninstall.log follows:"
            cat nip2pkiPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f nip2pkiPreUninstall64 > /dev/null; then
         if ! nip2pkiPreUninstall64 > /tmp/nip2pkiPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: nip2pki pre uninstallation failed! /tmp/nip2pkiPreUninstall64.log follows:"
            cat nip2pkiPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled nip2pki; then
      if declare -f nip2pkiPreUninstall > /dev/null; then
         if ! nip2pkiPreUninstall > /tmp/nip2pkiPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: nip2pki pre uninstallation failed! /tmp/nip2pkiPreUninstall.log follows:"
            cat nip2pkiPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f nip2pkiPreUninstall64 > /dev/null; then
         if ! nip2pkiPreUninstall64 > /tmp/nip2pkiPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: nip2pki pre uninstallation failed! /tmp/nip2pkiPreUninstall64.log follows:"
            cat nip2pkiPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled nirioi; then
      if declare -f nirioiPreUninstall > /dev/null; then
         if ! nirioiPreUninstall > /tmp/nirioiPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: nirioi pre uninstallation failed! /tmp/nirioiPreUninstall.log follows:"
            cat nirioiPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f nirioiPreUninstall64 > /dev/null; then
         if ! nirioiPreUninstall64 > /tmp/nirioiPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: nirioi pre uninstallation failed! /tmp/nirioiPreUninstall64.log follows:"
            cat nirioiPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled nirioi; then
      if declare -f nirioiPreUninstall > /dev/null; then
         if ! nirioiPreUninstall > /tmp/nirioiPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: nirioi pre uninstallation failed! /tmp/nirioiPreUninstall.log follows:"
            cat nirioiPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f nirioiPreUninstall64 > /dev/null; then
         if ! nirioiPreUninstall64 > /tmp/nirioiPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: nirioi pre uninstallation failed! /tmp/nirioiPreUninstall64.log follows:"
            cat nirioiPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled niusrprioerrorsi; then
      if declare -f niusrprioerrorsiPreUninstall > /dev/null; then
         if ! niusrprioerrorsiPreUninstall > /tmp/niusrprioerrorsiPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: niusrprioerrorsi pre uninstallation failed! /tmp/niusrprioerrorsiPreUninstall.log follows:"
            cat niusrprioerrorsiPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f niusrprioerrorsiPreUninstall64 > /dev/null; then
         if ! niusrprioerrorsiPreUninstall64 > /tmp/niusrprioerrorsiPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: niusrprioerrorsi pre uninstallation failed! /tmp/niusrprioerrorsiPreUninstall64.log follows:"
            cat niusrprioerrorsiPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled niusrprioerrorsi; then
      if declare -f niusrprioerrorsiPreUninstall > /dev/null; then
         if ! niusrprioerrorsiPreUninstall > /tmp/niusrprioerrorsiPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: niusrprioerrorsi pre uninstallation failed! /tmp/niusrprioerrorsiPreUninstall.log follows:"
            cat niusrprioerrorsiPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f niusrprioerrorsiPreUninstall64 > /dev/null; then
         if ! niusrprioerrorsiPreUninstall64 > /tmp/niusrprioerrorsiPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: niusrprioerrorsi pre uninstallation failed! /tmp/niusrprioerrorsiPreUninstall64.log follows:"
            cat niusrprioerrorsiPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled niusrprioi; then
      if declare -f niusrprioiPreUninstall > /dev/null; then
         if ! niusrprioiPreUninstall > /tmp/niusrprioiPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: niusrprioi pre uninstallation failed! /tmp/niusrprioiPreUninstall.log follows:"
            cat niusrprioiPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f niusrprioiPreUninstall64 > /dev/null; then
         if ! niusrprioiPreUninstall64 > /tmp/niusrprioiPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: niusrprioi pre uninstallation failed! /tmp/niusrprioiPreUninstall64.log follows:"
            cat niusrprioiPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled niusrprioi; then
      if declare -f niusrprioiPreUninstall > /dev/null; then
         if ! niusrprioiPreUninstall > /tmp/niusrprioiPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: niusrprioi pre uninstallation failed! /tmp/niusrprioiPreUninstall.log follows:"
            cat niusrprioiPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f niusrprioiPreUninstall64 > /dev/null; then
         if ! niusrprioiPreUninstall64 > /tmp/niusrprioiPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: niusrprioi pre uninstallation failed! /tmp/niusrprioiPreUninstall64.log follows:"
            cat niusrprioiPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled niusrprioki; then
      if declare -f niusrpriokiPreUninstall > /dev/null; then
         if ! niusrpriokiPreUninstall > /tmp/niusrpriokiPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: niusrprioki pre uninstallation failed! /tmp/niusrpriokiPreUninstall.log follows:"
            cat niusrpriokiPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f niusrpriokiPreUninstall64 > /dev/null; then
         if ! niusrpriokiPreUninstall64 > /tmp/niusrpriokiPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: niusrprioki pre uninstallation failed! /tmp/niusrpriokiPreUninstall64.log follows:"
            cat niusrpriokiPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled niusrprioki; then
      if declare -f niusrpriokiPreUninstall > /dev/null; then
         if ! niusrpriokiPreUninstall > /tmp/niusrpriokiPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: niusrprioki pre uninstallation failed! /tmp/niusrpriokiPreUninstall.log follows:"
            cat niusrpriokiPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f niusrpriokiPreUninstall64 > /dev/null; then
         if ! niusrpriokiPreUninstall64 > /tmp/niusrpriokiPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: niusrprioki pre uninstallation failed! /tmp/niusrpriokiPreUninstall64.log follows:"
            cat niusrpriokiPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled niusrpriorpci; then
      if declare -f niusrpriorpciPreUninstall > /dev/null; then
         if ! niusrpriorpciPreUninstall > /tmp/niusrpriorpciPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: niusrpriorpci pre uninstallation failed! /tmp/niusrpriorpciPreUninstall.log follows:"
            cat niusrpriorpciPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f niusrpriorpciPreUninstall64 > /dev/null; then
         if ! niusrpriorpciPreUninstall64 > /tmp/niusrpriorpciPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: niusrpriorpci pre uninstallation failed! /tmp/niusrpriorpciPreUninstall64.log follows:"
            cat niusrpriorpciPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled niusrpriorpci; then
      if declare -f niusrpriorpciPreUninstall > /dev/null; then
         if ! niusrpriorpciPreUninstall > /tmp/niusrpriorpciPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: niusrpriorpci pre uninstallation failed! /tmp/niusrpriorpciPreUninstall.log follows:"
            cat niusrpriorpciPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f niusrpriorpciPreUninstall64 > /dev/null; then
         if ! niusrpriorpciPreUninstall64 > /tmp/niusrpriorpciPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: niusrpriorpci pre uninstallation failed! /tmp/niusrpriorpciPreUninstall64.log follows:"
            cat niusrpriorpciPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."

   if willBeUninstalled nikali; then
      if declare -f nikaliPreUninstall > /dev/null; then
         if ! nikaliPreUninstall > /tmp/nikaliPreUninstall.log 2>&1; then
            echo ""
            echo "Warning: nikali pre uninstallation failed! /tmp/nikaliPreUninstall.log follows:"
            cat nikaliPreUninstall.log
            uninstallStatus=$statusFail
         fi
      fi
      if declare -f nikaliPreUninstall64 > /dev/null; then
         if ! nikaliPreUninstall64 > /tmp/nikaliPreUninstall64.log 2>&1; then
            echo ""
            echo "Warning: nikali pre uninstallation failed! /tmp/nikaliPreUninstall64.log follows:"
            cat nikaliPreUninstall64.log
            uninstallStatus=$statusFail
         fi
      fi
   fi
   echo -n "."


   # Perform the uninstallation with the package list
   $RPM -e --allmatches $uninstallPackageList
   if [ $? -ne 0 ]; then
      echo "Error uninstalling $kProductStringSentence $kProductVersion."
      exit $statusFail
   fi

else
   echo "All packages in the distribution are still in use or are already removed."
   echo "Nothing to Uninstall."
fi

fi
# End of generated uninstallation \n
distStatus=$statusSuccess
failedDists=

if [ -f "$CDPATH/$kTarPackageName" ]; then
   # Unpack the child distributions from the TZ package
   $TAR -zxvf "$CDPATH/$kTarPackageName" -C $kTmpInstallSrcPath dists 1>/dev/null 2>/dev/null
   if [ -d $kTmpInstallSrcPath/dists ]; then
      for childDist in `ls $kTmpInstallSrcPath/dists`;
      do
         childDistVersion=`$GREP '^kProductVersion=' $kTmpInstallSrcPath/dists/$childDist/INSTALL | $SED 's/kProductVersion="\(.*\)"$/\1/'`
         childDistString=`$GREP '^kProductStringSentence=' $kTmpInstallSrcPath/dists/$childDist/INSTALL | $SED 's/kProductStringSentence="\(.*\)"$/\1/'`

         uninstallChild=$kTrue

         if [ $promptUser -eq $kTrue ]; then
            echo ""
            echo -n "Would you like to uninstall $childDistString ($childDistVersion)? [Yn] "
            read ans
            test -z "$ans" && ans=y

            case "$ans" in
                 [nN]*) echo "$childDistString will be left installed."
                        uninstallChild=$kFalse
                        ;;
                 [yY]*)
                        uninstallChild=$kTrue
                        ;;
            esac
         else
            echo ""
            echo "Uninstalling $childDistString ($childDistVersion)"
         fi

         if [ $uninstallChild -eq $kTrue ]; then

            # Transfer arguments to child distribution
            (
               cd "$kTmpInstallSrcPath/dists/$childDist"
               /bin/sh ./UNINSTALL $originalArguments
               exit $?
            )
            if [ $? -ne $statusSuccess ]; then
               distStatus=$statusFail
               failedDists="$failedDists $childDistString"
            fi

            echo ""
         fi

      done
   fi
fi

# remove the installation log from installation for this distribution
rm -f $kInstallationLog

if [ "$bRebootRequired" -ne $kTrue ]; then
  reloadNIDrivers
  if [ $? -ne 0 ] ; then
    bRebootRequired=$kTrue
  fi
fi

#
# Finish uninstallation
#
if [ "$bRebootRequired" -eq $kTrue ]; then
   echo ""
   echo "******************************************************************************"
   echo "* A reboot is required before attempting to finish uninstalling the"
   echo "* $kProductStringSentence software from your system."
   echo "******************************************************************************"
   if [ "$promptUser" -eq $kTrue ]; then
      while :
      do
         echo -n "Would you like to reboot now? [yes|no] "
         read rebootConfirm 
         if [ "$rebootConfirm" != "yes" ] && [ "$rebootConfirm" != "no" ]; then
            echo "Please input yes or no."
         else
            break
         fi
      done
      if [ "$rebootConfirm" = "yes" ]; then
         cleanwoexit
         echo ""
         if [ "$uninstallStatus" -eq $statusSuccess ]; then
            echo "$kProductStringSentence Uninstallation completed successfully."
         else
            echo "$kProductStringSentence Uninstallation completed with errors."
         fi
         if [ $distStatus -ne $statusSuccess ]; then
            echo "WARNING: The following related products failed to uninstall: $failedDists"
         fi
         echo ""
         echo "Rebooting...."
         reboot
         exit $uninstallStatus
      fi
   fi
   echo ""
   if [ "$uninstallStatus" -eq $statusSuccess ]; then
      echo "$kProductStringSentence Uninstallation completed successfully."
   else
      echo "$kProductStringSentence Uninstallation completed with errors."
   fi
   if [ $distStatus -ne $statusSuccess ]; then
      echo "WARNING: The following related products failed to uninstall: $failedDists"
   fi
   echo ""
   cleanwoexit
   echo "Please reboot manually in order to complete the removal of"
   echo "$kProductStringSentence Instrument Driver software from your system."
   echo ""
else
   echo ""
   if [ "$uninstallStatus" -eq "$statusSuccess" ]; then
      echo "$kProductStringSentence Uninstallation completed successfully."
   else
      echo "$kProductStringSentence Uninstallation completed with errors."
   fi
   if [ $distStatus -ne $statusSuccess ]; then
      echo "WARNING: The following related products failed to uninstall: $failedDists"
   fi
   echo ""
   cleanwoexit
fi

cleanexit "$uninstallStatus"

