#!/bin/bash

#------------------------------------------------------------------------------
# ncl_install
#------------------------------------------------------------------------------
# Send comments to:
#   support@novell.com
#------------------------------------------------------------------------------
# Copyright 2005-2009, Novell, Inc.
#
# This program 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.
#
# This script and its embedded programs are distributed with
# absolutely, positively NO WARRANTY WHATSOEVER, without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
# PURPOSE.  The author and Novell, Inc. take no responsibility for
# the consequences of running this script.
#------------------------------------------------------------------------------

CLIENT_NAME="Novell Client for Linux"
SCRIPT_NAME='ncl_install'
VERSION=3.0
REPO_ALIAS="ncl-iso-repo"

if [ -z "$1" ]
then
    MODE=""
else
    MODE=$1
    if [ -z "$2" ]
    then
        OPTION=""
    else
        OPTION=$2
        if [ ! -z "$3" ]
        then
            MODE=""
	    OPTION=""
        fi
    fi
fi

# Takes 1 argument, the default option
# Sets the READ_OPTION variable at the end of computation
readOption()
{
  DEFAULT="$1"

  case $DEFAULT in
    "yes" | "YES" )
      OPTION_YES="YES"
      OPTION_NO="no"
      ;;
    "no" | "NO" )
      OPTION_YES="yes"
      OPTION_NO="NO"
      ;;
    * )
      echo "ERROR: Invalid option for a default answer. Aborting.."
      exit 1
      ;;
  esac

  READ_OPTION=""
  while [ ! \( "$READ_OPTION" = "y" -o "$READ_OPTION" = "n" \) ]
  do
    USER_INPUT=""
    echo -n "($OPTION_YES/$OPTION_NO) "
    read USER_INPUT
    case $USER_INPUT in
      "yes" | "YES" | "y" | "Y" )
        READ_OPTION="y"
        ;;
      "no" | "NO" | "n" | "N" )
        READ_OPTION="n"
        ;;
      * )
        echo -n "Invalid answer '$USER_INPUT'. Enter 'y' for 'yes' or 'n' for 'no' if nothing else works for you. "
        ;;
    esac
  done
}

# Takes 1 argument, the rpm to be queried for
# Sets the RPM_INSTALLED variable at the end of computation
isRPMInstalled()
{
    case "$1" in
      "" )
        echo "ERROR: isRPMInstalled() called without passing an RPM name. Aborting.."
	exit 1
        ;;
      * )
        ;;
    esac

    # query rpm to see if the package is installed
    # the rpm query results are returned from this function
    RPM_QUERY_RESULTS=`rpm -q $1`

    if [ $? -ne 0 ]; then
        RPM_INSTALLED=0  # not found
    else
        RPM_INSTALLED=1  # found
    fi
}

echoUsage()
{
    echo ""
    echo "[$SCRIPT_NAME] Usage:  $SCRIPT_NAME  [ install | upgrade | uninstall | verify | information | files ] [ force ]"
    echo ""
}

echo ""
echo "[$SCRIPT_NAME] WARNING: This script is intended for use with $CLIENT_NAME"
echo "[$SCRIPT_NAME] only when shipped as a separate ISO by itself."
echo "[$SCRIPT_NAME] It may not function as intended when used on other installations."
echo ""

# validate that the user running the script is root
if [ $UID -ne 0 ]; then
    echo ""
    echo "[$SCRIPT_NAME] ERROR: You are not the root user."
    echo "[$SCRIPT_NAME] To install the $CLIENT_NAME, you must login as the root user."
    echo ""
    exit 0
fi

case $HOSTTYPE in
  "i386" | "i586" | "i686" )
    RPM_ARCH="i586"
    NICI_RPM="nici"
    ;;
  "x86_64" )
    RPM_ARCH="x86_64"
    NICI_RPM="nici64"
    ;;
  * )
    echo "[$SCRIPT_NAME] ERROR: Unknown hosttype. Aborting.."
    exit 7
    ;;
esac

BASE_DEPENDENCIES_LIST="
  $NICI_RPM
  novell-nmasclient
  novell-xtier-base
  novell-xtier-core
  novell-xtier-xplat
  novell-xplatlib
"

MAIN_RPM_LIST="
  novell-novfsd
  novell-ui-base
  novell-qtgui-cli
  novell-qtgui
  novell-client-script
  yast2-novell-client
  novell-client
"

PLUGIN_RPM_LIST="
  novell-konqueror-plugin
  novell-nautilus-plugin
"

echo ""
echo "[$SCRIPT_NAME] $SCRIPT_NAME v$VERSION started"
echo "[$SCRIPT_NAME] mode = $MODE"
echo "[$SCRIPT_NAME] option = $OPTION"
echo ""

# verify that a valid option was entered
case "$OPTION" in
    "force" | "--force" )
    FORCE_OPTION=" --force "
    ;;

    "" )
    FORCE_OPTION=""
    ;;

    * )
    echo "[$SCRIPT_NAME] ERROR: Invalid option."
    echoUsage
    exit 4
    ;;
esac

# verify that a valid mode was entered
# set the necessary variables based on the mode
case "$MODE" in
    "install" )
    ACTION="Installing"
    ACTION_QUESTION="install"
    ACTION_PAST_TENSE="Installation"
    ACTION_PAST_TENSE_LOWER_CASE="installation"
    CMD="zypper install $FORCE_OPTION "
    ;;

    "upgrade" )
    ACTION="Upgrading"
    ACTION_QUESTION="upgrade"
    ACTION_PAST_TENSE="Upgrade"
    ACTION_PAST_TENSE_LOWER_CASE="upgrade"
    CMD="zypper update "
    ;;

    "uninstall" )
    ACTION="Uninstalling"
    ACTION_QUESTION="uninstall"
    ACTION_PAST_TENSE="Uninstallation"
    ACTION_PAST_TENSE_LOWER_CASE="uninstallation"
    CMD="zypper remove "

    # confirm un-install
    echo ""
    echo -n "[$SCRIPT_NAME] Are you sure you want to $MODE the $CLIENT_NAME? "
    readOption "NO"
    if [ ! "$READ_OPTION" = "y" ]; then
        echo "[$SCRIPT_NAME] Cancelling the $MODE of $CLIENT_NAME."
        echo ""
        exit 8
    fi
    echo ""
    ;;

    "verify" )
    ACTION="Verifying the installation of"
    ACTION_QUESTION="verify the installation of"
    ACTION_PAST_TENSE="Installation verification"
    ACTION_PAST_TENSE_LOWER_CASE="installation verification"
    CMD="rpm -V "
    ;;

    "information" )
    ACTION="Querying information for"
    ACTION_QUESTION="query the information in"
    ACTION_PAST_TENSE="Information query"
    ACTION_PAST_TENSE_LOWER_CASE="information query"
    CMD="rpm -qi "
    ;;

    "files" )
    ACTION="Querying file list for"
    ACTION_QUESTION="query the file list in"
    ACTION_PAST_TENSE="File list query"
    ACTION_PAST_TENSE_LOWER_CASE="file list query"
    CMD="rpm -ql "
    ;;

    "usage" | "help" | "--help" | "" )
    echoUsage
    exit 0
    ;;

    * )
    echo "[$SCRIPT_NAME] ERROR: Invalid mode."
    echoUsage
    exit 1
    ;;
esac

# verify that the script was launched from the right location
if [[ "$MODE" = "install" || "$MODE" = "upgrade" ]]
then
    if [ ! -d "$PWD/suse/$RPM_ARCH" ]
    then
        echo ""
        echo "[$SCRIPT_NAME] ERROR: script was launched from an invalid location: $PWD"
        echo "[$SCRIPT_NAME] The 'suse/$RPM_ARCH' directory is missing."
        echo ""
        exit 6
    else
        zypper addrepo --type plaindir --name "$CLIENT_NAME" --check --refresh "$PWD/suse/$RPM_ARCH" "$REPO_ALIAS"
    fi
fi

echo ""
echo "[$SCRIPT_NAME] $ACTION $CLIENT_NAME. Please wait..."
echo ""

case $MODE in
  "install" )
    # install all the main packages
    $CMD $BASE_DEPENDENCIES_LIST $MAIN_RPM_LIST
    # optionally install the plugins
    for RPM_NAME in $PLUGIN_RPM_LIST
    do
      echo ""
      echo -n "[$SCRIPT_NAME] Do you want to $ACTION_QUESTION the optional $RPM_NAME rpm? "
      readOption "YES"
      if [ "$READ_OPTION" = "y" ]; then
        $CMD $RPM_NAME
      fi
      echo ""
    done
    ;;

  "upgrade" )
    # zypper will upgrade only installed packages
    $CMD $BASE_DEPENDENCIES_LIST $MAIN_RPM_LIST $PLUGIN_RPM_LIST
    ;;

  "uninstall" )
    # zypper will uninstall only installed packages
    $CMD $MAIN_RPM_LIST $PLUGIN_RPM_LIST
    # confirm uninstall of base packages - this option is useful on OES installations
    echo ""
    echo -n "[$SCRIPT_NAME] Do you also want to $MODE the base dependencies (XTier, XPlat packages) of $CLIENT_NAME? "
    readOption "NO"
    if [ "$READ_OPTION" = "y" ]; then
        $CMD $BASE_DEPENDENCIES_LIST
    fi
    echo ""
    ;;

  "verify" | "information" | "files" )
    for RPM_NAME in $BASE_DEPENDENCIES_LIST $MAIN_RPM_LIST $PLUGIN_RPM_LIST
    do
      echo ""
      isRPMInstalled "$RPM_NAME"
      if [ $RPM_INSTALLED -eq 1 ]; then
        echo "[$SCRIPT_NAME] $ACTION $RPM_NAME..."
        # search for rpm
        $CMD $RPM_NAME
        if [ $? != 0 ]; then
          echo "[$SCRIPT_NAME] ERROR: $ACTION_PAST_TENSE of the $RPM_NAME rpm failed."
        fi
      else
            echo "[$SCRIPT_NAME] $RPM_NAME is not installed - $ACTION_PAST_TENSE_LOWER_CASE is not possible."
      fi
      echo ""
    done
    ;;
esac
 
case $MODE in 
    "install" | "upgrade" )
        rcnovfsd stop
	rcnovell-xregd stop
	rcnovell-xregd start
	rcnovfsd start
	zypper removerepo "$REPO_ALIAS"
        ;;

    "verify" )
        echo ""
        echo "[$SCRIPT_NAME] Verification error definitions:"
        echo "[$SCRIPT_NAME] S....... size"
        echo "[$SCRIPT_NAME] .M...... mode"
        echo "[$SCRIPT_NAME] ..5..... MD5 checksum"
        echo "[$SCRIPT_NAME] ...D.... major and minor numbers"
        echo "[$SCRIPT_NAME] ....L... symbolic link contents"
        echo "[$SCRIPT_NAME] .....U.. owner"
        echo "[$SCRIPT_NAME] ......G. group"
        echo "[$SCRIPT_NAME] .......T modification time"
        echo "[$SCRIPT_NAME] ........ c indicates a configuration file"
        echo ""
	;;

    * )
        ;;
esac

echo ""
echo "[$SCRIPT_NAME] $SCRIPT_NAME $MODE is complete."
echo ""

exit 0
