#!/bin/sh
#
#    INSTALL
#    Enterprise Messaging Gateway Installation script
#
#    Copyright (C) Braxo AB, 2001-2022, Sweden.
#    Nodic Messaging Technologies is a trademark of Braxo AB.
#    https://nordicmessaging.se

# Default variables
VERSION=`cat VERSION`
EMGUSER="root"
EMGGROUP="root"
ROOTFILES="README RELNOTES LICENSE LICENSE.FOSS"
ETCFILES="server.cfg.tmpl server.cfg.dbconfig server.cfg.emgportal.tmpl client.cfg routing prefixes-sample blacklist users ebe1.sh ebe2.sh plugin.pl"
ETCDIRS="mappings"
EMGDIR="/etc/emg"
BINDIR="/usr/bin"
PROGRAMS="emgd emgclient emgload emgsend emgsink emgstat"
SCRIPTS="checkemg.sh.sample cleandb.sh.sample emgrestart.sh emg_watchdog.pl.sample"
BITS=8
UPGRADE=NO
SEDFILE=/tmp/emg.sed
BASEDIR=emg-dist
prod=emg
OS=Unknown

# Get (y)es or (n)o from user
read_yn() {
	DEF=""
	[ "$1" != "" ] && {
		DEF="$1"
	}
	while read YN
	do
		[ "$YN" = "" ] && YN=$DEF
		case $YN in
		[jJyY])	return 0 ;;
		[nN])	return 1 ;;
		ja)	return 0 ;;
		yes)	return 0 ;;
		nej)	return 1 ;;
		no)	return 1 ;;
		*)		echo "Answer y or n." ;;
		esac
	done
}

ps -e|grep emgd >/dev/null && {
	echo 
	echo "The EMG server, emgd, is running."
	echo
	printf "Do you want to proceed with installation anyway? [y] "

	read_yn y || {
		echo "Installation terminated."
		exit 1
	}
}

#[ -d "$BASEDIR" ] || {
	#echo "The installation files must be in $BASEDIR!"
	#exit 1
#}
#cd $BASEDIR

rm $SEDFILE 2>/dev/null

# Get input from user
read_ans() {
	read ANS
}

add_sed() {
	ARG=`echo "$2" | sed -e 's/\//\\\\\//g'`
	echo "s/$1/$ARG/g" >>$SEDFILE
}

# Create a directory and its parent directories if necessary
# Set user to EMGUSER
create_dir() {
	OLDDIR=`pwd`
	DIR=$1

	[ -d "$DIR" ] && {
		return
	}

	echo $DIR | grep "^/" >/dev/null && cd /
	DIRS=`echo $DIR | tr '/' ' '`

	for dir in $DIRS
	do
		if [ ! -d "$dir" ]
		then
			if mkdir $dir 2>/dev/null 
			then
				chown $EMGUSER $dir
				chgrp $EMGGROUP $dir
			else
				echo "Could not create directory $dir."
				echo "Installation aborted!"
				exit 1
			fi
		fi
		cd $dir
	done

	cd $OLDDIR
}

modify_rc ()
{
	RC_FILE=/etc/rc
	INITD_DIR=/etc/init.d

	[ "$prod" = "emg" ] && {
		SERVER=emgd
		PRODUCT="Enterprise Messaging Gateway"
		PRODDIR=$EMGDIR
		PRODDIRNAME=EMGDIR
	}
	[ -d "/etc/rc.d/init.d" ] &&  {
		INITD_DIR=/etc/rc.d/init.d
	}

	echo
	
	if [ -d "$INITD_DIR" ] 
	then
		RC_FILE=$INITD_DIR/$prod
		echo "By creating $RC_FILE the $PRODUCT server"
		echo "can be automatically started on system boot."
	else
		echo "By modifying $RC_FILE the $PRODUCT server"
		echo "can be automatically started on system boot."
	fi

	echo

	auto=1

	if [ -d "$INIT_DIR" -o -w `dirname "$RC_FILE"` ]
	then
		printf "Should the server be automatically started on system boot? [y] "
		read_yn j || auto=0
	else
		RC_FILE=/tmp/emg.init
		echo "However current user does not have permission do this."
		echo "We will create init file as \"$RC_FILE\" and you can then move"
		echo "this file to $INITD_DIR as \"root\" or using \"sudo\"."
		[ "$OS" = "LINUX" ] && {
			echo
			echo "It is chkconfig-enbled so you can then use \"chkconfig emg on\"."
			echo
		}
	fi
	
	[ "$auto" = "1" ] && {
		echo
		[ -f "$RC_FILE" ] && {
			echo "Copying old $RC_FILE to $PRODDIR/$prod.rc.old."
			cp $RC_FILE $PRODDIR/$prod.rc.old 2>/dev/null
		}
		if [ "$RC_FILE" = "/etc/rc" ]
		then
			echo "Modifying $RC_FILE."
			echo >>$RC_FILE
			echo "# $PRODUCT - Startup" >>$RC_FILE
			echo "$PRODDIRNAME=$PRODDIR ; export $PRODDIRNAME" >>$RC_FILE
			echo "su - $EMGUSER -c \"$BINDIR/$SERVER\"" >>$RC_FILE
		else
			echo "Creating $RC_FILE."
			cat <<EOF >$RC_FILE
#!/bin/sh
# $PRODUCT - Startup
#
# chkconfig: 235 99 01
# description: $PRODUCT startup script

PATH=/bin:/usr/bin ; export PATH
$PRODDIRNAME=$PRODDIR ; export $PRODDIRNAME

case "\$1" in
	"start")
		echo $prod service starting.
		su - $EMGUSER -c "$PRODDIRNAME=$PRODDIR $BINDIR/emgd"
		;;
	"stop")
		echo Stopping the $prod service.
		su - $EMGUSER -c "$PRODDIRNAME=$PRODDIR $BINDIR/emgd -stop"
		;;
esac

exit 0
EOF

			chmod 755 $RC_FILE
			[ -w "/etc/rc2.d" ] && {
				cd /etc/rc2.d
				echo "Linking $RC_FILE to /etc/rc2.d/S99$prod."
				ln -s ../init.d/$prod S99$prod 2>/dev/null
			}
			[ -w "/etc/rc3.d" ] && {
				cd /etc/rc3.d
				echo "Linking $RC_FILE to /etc/rc3.d/S99$prod."
				ln -s ../init.d/$prod S99$prod 2>/dev/null
			}
			[ -w "/etc/rc5.d" ] && {
				cd /etc/rc5.d
				echo "Linking $RC_FILE to /etc/rc5.d/S99$prod."
				ln -s ../init.d/$prod S99$prod 2>/dev/null
			}
		fi
	}
}

# MAIN

echo
echo "* * *  Enterprise Messaging Gateway $VERSION - INSTALLATION  * * *"
echo

echo "EMG can be owned by the user root or by another user."
echo "What user should be the owner of the EMG files? [$EMGUSER] "
read_ans
[ "$ANS" != "" ] && EMGUSER=$ANS

grep "^$EMGUSER:" /etc/passwd >/dev/null || {
	echo "Specified user must exist."
	echo "Please add user and run INSTALL again."
	exit 1
}

echo "What group should be the group for the EMG files? [$EMGGROUP] "
read_ans
[ "$ANS" != "" ] && EMGGROUP=$ANS

grep "^$EMGGROUP:" /etc/group >/dev/null || {
	echo "Specified group must exist."
	echo "Please add group and run INSTALL again."
	exit 1
}

echo "Where should Enterprise Messaging Gateway configuration"
printf "configuration files go? [$EMGDIR] "
read_ans
[ "$ANS" != "" ] && EMGDIR=$ANS

[ "$EMGDIR" = "/etc/emg" ] || {
	echo
	echo "Since the directory is not /etc/emg, the"
	echo "environment variable EMGDIR must be set."
	echo
}

printf "Where should EMG executables go? [$BINDIR] "
read_ans
[ "$ANS" != "" ] && BINDIR=$ANS

echo
echo "* * *  Make sure this directory is in your PATH!  * * *"


uname -a 2>/dev/null | grep SunOS >/dev/null && {
	OS=Sun
}
uname -a 2>/dev/null | grep "Linux" >/dev/null && {
	OS=LINUX
}

printf "Creating directories..."

create_dir $EMGDIR
chmod 755 $EMGDIR

create_dir $EMGDIR/log
chmod 755 $EMGDIR/log

create_dir $EMGDIR/sql

create_dir $BINDIR

echo OK

printf "Moving programs..."
for file in $PROGRAMS
do
	mv bin/$file $BINDIR
	chown $EMGUSER $BINDIR/$file
	chgrp $EMGGROUP $BINDIR/$file
	chmod 555 $BINDIR/$file
done
echo OK

printf "Moving scripts..."
for file in $SCRIPTS
do
	mv scripts/$file $BINDIR
	chown $EMGUSER $BINDIR/$file
	chgrp $EMGGROUP $BINDIR/$file
	chmod 555 $BINDIR/$file
done
echo OK

save_to_old ()
{
	FILE=$1
	[ -f "$FILE" ] && {
		echo "Saving $FILE as $FILE.old."
		mv $FILE $FILE.old
	}
}

save_to_old $EMGDIR/server.cfg
save_to_old $EMGDIR/client.cfg
save_to_old $EMGDIR/routing
save_to_old $EMGDIR/blacklist
save_to_old $EMGDIR/users

printf "Moving data files..."
for file in $ETCFILES
do
	mv etc/$file $EMGDIR
	chown $EMGUSER $EMGDIR/$file
	chgrp $EMGGROUP $EMGDIR/$file
	chmod 644 $EMGDIR/$file
done
for dir in $ETCDIRS
do
	mv etc/$dir $EMGDIR
	chown $EMGUSER $EMGDIR/$dir
	chgrp $EMGGROUP $EMGDIR/$dir
	chmod 755 $EMGDIR/$dir
done

# Scripts should be executable
chmod 755 $EMGDIR/*.sh

for file in `ls sql`
do
	mv sql/$file $EMGDIR/sql/
	chown $EMGUSER $EMGDIR/sql/$file
	chgrp $EMGGROUP $EMGDIR/sql/$file
	chmod 644 $EMGDIR/sql/$file
done

# Scripts should be executable
chmod 444 $EMGDIR/sql/*.sql

for file in $ROOTFILES
do
	mv $file $EMGDIR
	chown $EMGUSER $EMGDIR/$file
	chgrp $EMGGROUP $EMGDIR/$file
	chmod 444 $EMGDIR/$file
done

[ -f license ] && {
	mv license $EMGDIR
	chmod 444 $EMGDIR/license
	chown $EMGUSER $EMGDIR/license
	chgrp $EMGGROUP $EMGDIR/license
}
	
echo OK

export EMGDIR

add_sed _BINDIR $BINDIR

printf "Creating configuration file..."
sed -f $SEDFILE $EMGDIR/server.cfg.tmpl >$EMGDIR/server.cfg
sed -f $SEDFILE $EMGDIR/server.cfg.emgportal.tmpl >$EMGDIR/server.cfg.emgportal
echo "OK"
chown $EMGUSER $EMGDIR/server.cfg
chgrp $EMGGROUP $EMGDIR/server.cfg
chmod 644 $EMGDIR/server.cfg
rm -f $SEDFILE 2>/dev/null

enterlic=YES

[ -f "$EMGDIR/license" ] && {
	echo "You already have a license file in $EMGDIR/license."
	printf "Do you want to use the existing license? [y] "
	read_yn y && enterlic=NO
}

[ "$enterlic" = "YES" ] && {
	echo "LICENSE INFORMATION"
	echo "Enter your license information EXACTLY as received."
	printf "HOSTID     : "
	read_ans ; HOSTID=$ANS
	printf "COMPANY    : "
	read_ans ; COMPANY=$ANS
	printf "TELNO      : "
	read_ans ; TELNO=$ANS
	printf "SERIAL     : "
	read_ans ; SERIAL=$ANS
	printf "LICENSEDATA: "
	read_ans ; LICDATA=$ANS
	printf "ACTIVATION : "
	read_ans ; ACTIVATION=$ANS

	echo "# Enterprise Messaging Gateway $VERSION - License information" >>$EMGDIR/license
	echo "HOSTID=$HOSTID" >>$EMGDIR/license
	echo "COMPANY=$COMPANY" >>$EMGDIR/license
	echo "TELNO=$TELNO" >>$EMGDIR/license
	echo "SERIAL=$SERIAL" >>$EMGDIR/license
	echo "LICENSEDATA=$LICDATA" >>$EMGDIR/license
	echo "ACTIVATION=$ACTIVATION" >>$EMGDIR/license

	chmod 444 $EMGDIR/license
}

modify_rc

echo
echo "INSTALLATION FINISHED!"
echo "======================"
echo
echo "The configuration file is placed in $EMGDIR and named server.cfg."
echo "The EMG server, emgd, can be started with \"emgd\"."
if [ "$EMGDIR" != "/etc/emg" ]
then
	echo "after setting the variable EMGDIR to $EMGDIR."
fi
echo
echo "Check the file $EMGDIR/README for more information."
echo

exit 0

