#!/bin/sh

#Copyright (c) 2007, Novell, Inc.  All rights reserved.

##########################################################################
# eDirectory migration script for Linux
##########################################################################

##########################################################################
# Script Initialization
##########################################################################
if [ $# -ne 5 ]; then
	str=`gettext migrate "INFO: This utility is not to be executed directly. To perform eDirectory server health check only execute 'ndscheck' or execute 'migedir' for eDirectory server migration."`
	echo $str
	exit 1
fi

# Message severity
FATAL="Fatal"
ERROR="Error"
WARN="Warning"
INFO="Information"

DATE=`date +%d-%m-%Y:%T`

OS=`uname -s`

this_file=$0
source_server=$1
verbose=$2
log_file_path=$3
testOnly=$4
dontPrompt=$5

cmd_line="$@"

true=1
false=0
target_backup_dir=/var/opt/novell/.edir_migrate
data_log="${log_file_path}"/data.log
edir_install_path=/opt/novell/eDirectory/bin

PATH=.:/usr/xpg4/bin:/usr/bin:/usr/sbin:/usr/local/bin:$edir_install_path:$PATH
package_dir=`dirname $this_file`
if [ -z "$package_dir" -o $package_dir = "." ]; then
	package_dir=`pwd`
fi

readme="$package_dir/../readme.txt"
firstchar=`echo $package_dir | sed -n "s/^\(.\).*$/\1/p"`
if [ "$package_dir" != "`pwd`" -a "$firstchar" != "/" ]; then
	readme="`pwd`/$readme"
fi

this_file_name=`basename $this_file`
case "${1}" in
	-h | --help | --h* )
					printUsage=1
					;;
esac

# assign the credentials to local variables
user="$ADMIN"
passwd="$ADM_PASSWD"

testTree="MIG-TARGET-TREE"
testContext="novell"
testServer="MIG-TARGET"
testLDAPPort=389
testLDAPSPort=636
testHTTPPort=8028
testHTTPSPort=8030
testLocation="/var/opt/novell/eDirectory"
testDIB="/var/opt/novell/eDirectory/data/dib"


##########################################################################
#Variable used and changed by the functions#
##########################################################################
inCmd=0
str1=""
curr_nici_version=""
inst_nici_version=""
pkg_name=""
pkg_exists=0

##########################################################################
# Hardcoded paths of files  #
##########################################################################
log_file="$log_file_path"/$this_file_name".log"
install_dir=/opt/novell/eDirectory/bin

##########################################################################
# Library Functions #
##########################################################################
printToScreen()
{
	echo $*
}

logToFile()
{
	if [ $verbose -eq 1 -o "$1" = "$FATAL" ]; then
		printToScreen "$2"
	fi

	echo "${DATE}:$1: $2" >> "$log_file"
}

ckyorn()
{
	shift
	ckyornstr="$@"
	ans=""

	while [ -z "$ans" ] || [ "$ans" = "ERRVAL" ]
	do
		echo -n "$ckyornstr '[y/n/q] ? '"
		read ans
		ans=`echo $ans | tr "[:upper:]" "[:lower:]"`
		case $ans in
			y|yes)
				return 1
				;;
			n|no)
				exit 2
				;;
			q|quit)
				exit 2
				;;
			*)
				str1=`gettext migrate "Invalid option: $ans "`
				printToScreen "$str1"
				ans="ERRVAL"
				;;
		esac
	done
}


##########################################################################
# Functions #
##########################################################################
checkForPackageInstalled()
{
	pkg=$1
	version=0

	if rpm -q $pkg >/dev/null 2>&1; then
		pkg_exists=1
		return 0
	else
		pkg_exists=0
	fi
}


checkInstall()
{
	checkForPackageInstalled novell-NDSserv
	if [ $pkg_exists == 0 ]; then
		checkForPackageInstalled edirectory-oes-server
	fi
	if [ $pkg_exists != 0 ]; then
		str=`gettext migrate "eDirectory packages are installed."`
		logToFile $INFO "$str"
		PATH=/opt/novell/eDirectory/bin:/opt/novell/eDirectory/sbin:$PATH
	else
		str=`gettext migrate "ERROR: Could not locate eDirectory installation. Install eDirectory on this machine before proceeding with the migration."`
		logToFile $INFO "$str"
		exit 1
	fi

	status=`ndsd --version`
	err=$?
	if [ $err -eq 0 ]; then
		version=`echo $status | grep "9"`

		if [ $? != 0 ]; then
			str=`gettext migrate "ERROR: The target server has eDirectory '$version', it should be running at least v9.0 version of eDirectory."`
			logToFile $FATAL "$str"
			exit 1
		fi 
	fi
}


getFileName()
{
	pkg_name=`grep -w $OS"_"$1 $this_file | awk -F"=" '{print $2}'`
}


checkForPackageExistence()
{
	pkg=$1
	version=0

	if [ "$pkg" = "nici" ]; then
		if rpm -q $pkg > /dev/null 2>&1; then
			pkg_exists=1
			version=`rpm -qi $pkg 2>>"$log_file" | grep "Version" | awk '{print $3}'`
			str="(Check-package-Existence)pkg=$pkg,pkg_exists=$pkg_exists,version=$version"
			logToFile $INFO "$str"
			echo ""
			return 0
		else
			pkg_exists=0
			str="(Check-package-Existence)pkg=$pkg,pkg_exists=$pkg_exists"
			logToFile $INFO "$str"
			echo ""
			return 
		fi
	fi
}

verpkgGetter()
{
	pkg=$1

	if [ $pkg = NICI ]; then
		pkg=nici
	fi

	pkg_src="$pkg""*.rpm" 

	curr_nici_version=`ls $package_dir/$pkg_src | awk -F$pkg"-" '{print $2}' | awk -F"-" '{print $1}'` 
}

performCheck()
{
	str=`gettext migrate "Performing pre-migration checks on the source server, '${source_server}'..."`
	printToScreen "$str"

	if [ -f "${data_log}" ]; then
		rm -f "${data_log}"
	fi

	if [ -f $install_dir/ndscheck ]; then
		if [ -z "$source_server" -o -z "$ADMIN" -o -z "$ADM_PASSWD" ]; then
			str=`gettext migrate "ERROR: Insufficient inputs."`
			logToFile $FATAL "$str"
			exit 1
		fi

		if [ $testOnly -eq 1 ]; then
			$install_dir/ndscheck -h $source_server -a "$ADMIN" -w env:ADM_PASSWD -F "${data_log}"
		else
			$install_dir/ndscheck -h $source_server -a "$ADMIN" -w env:ADM_PASSWD -q -F "${data_log}"
		fi

		err=$?
		if [ -f "${data_log}" ]; then
			echo "" >> "${data_log}"
			echo "Complete:$err" >> "${data_log}"

			if [ $err -eq 0 ]; then
				str=`gettext migrate "ndscheck performed successfully."`
				logToFile $INFO "$str"
			elif [ $err -eq 2 ]; then
				str=`gettext migrate "eDirectory health check failed. Refer ${data_log} for more details."`
				logToFile $FATAL "$str"
				exit 1
			elif [ $err -eq 1 ]; then
				warning=`cat "${data_log}" | grep "WARNING"`
				str=`gettext migrate "Warning: Some minor errors were detected during the eDirectory health check."`
				printToScreen "$str"
				printToScreen "$warning"

				if test $testOnly -eq 0 -a $dontPrompt -eq 0; then
					ckyornstr=`gettext migrate "Continue"`
					ckyorn -p "$ckyornstr"
				fi
			else
				str=`gettext migrate "eDirectory health check returned unknown error. Refer ${data_log} for more details."`
				logToFile $FATAL "$str"
				exit 1
			fi
		else
			str=`gettext migrate "eDirectory health check report, ${data_log} could not be created."`
			logToFile $FATAL "$str"
			exit 1
		fi

		str=`gettext migrate "Checking time synchronization between source and target servers."`
		logToFile $INFO "$str"

		timeSyncErr=`cat "${data_log}" | grep "time difference"`
		if [ -z "$timeSyncErr" ]; then
			str=`gettext migrate "Source and Target servers are in time synchronization"`
			logToFile $INFO "$str"
		else
			str=`gettext migrate "Source and Target servers are not in time synchronization."`
			printToScreen "$str"
			printToScreen "$timeSyncErr"

			if test $testOnly -eq 0 -a $dontPrompt -eq 0; then
				ckyornstr=`gettext migrate "Continue"`
				ckyorn -p "$ckyornstr"
			fi
		fi
	else
		str=`gettext migrate "ndscheck utility is not available. Check eDirectory Installation path."`
		logToFile $FATAL "$str"
		exit 1
	fi
}

##########################################################################

main()
{
	checkInstall
	performCheck

	return 0
}

main

