#!/bin/sh
# Laffer installer  
#
# Copyright (C) 2004 Laffer Project [http://laffer.sf.net]
# Written by: Peio Popov.
# Modified by: Slavej Karadjov
# Licensed under GPL 
# See main LICENSE file for more information
#
#  $Id: install.sh,v 1.19 2005/04/12 08:19:39 slaff Exp $

# 0.02 - Beta 	  - Curious souls only - [Worked more then dozen times]
# 0.01 - Pre-beta - Brave souls only   - [Worked once] 

# TODO:
#	Make it possible to use mysql user other that database admin(with no permissions to create/drop databases)
# Check if the user has enough permissions to write to modules and htdocs directory (unless uid == 0)
# Figure out a better way to make recursive match/replace and implement it as a function
# Laffer uninstaller - to test the installer and perhaps in future ... Something like: ./install.sh --remove

VERSION="";
COPY_FILES=1;

if [ -z $LAFFER_DIR ]; then
	LAFFER_DIR="/tmp/laffer" # Where the laffer archive is unpacked
else 
	# probably called from CVS install script
	COPY_FILES=0		
fi

DB_HOST="" # The database host 
DB_NAME="" # The name of the database
DB_ROOT_USER="" # MySQL administrator user
DB_ROOT_PASS="" # MySQL administrator password
DB_USER="" # User for laffer's database
DB_PASS="" # Password for laffer's database user

MODULES_PATH="" # Where the laffer modules are located
HTDOCS_PATH=""  # Where laffer's public files are located

DEFAULT_MODULES_PATH="/usr/local/laffer"
DEFAULT_HTDOCS_PATH="/var/www/html/" 
DEFAULT_INIT_PATH="/etc/rc.d/init.d/"

DEBUG=0;

VERSION=`cat VERSION`

function debug() {
	if [ $DEBUG -ne 0 ] ; then
		echo "--> debug(): $1";
	fi
}

function print_logo() {
	echo " _               ___   ___";            
	echo "( )            /'___)/'___)";           
	echo "| |       _ _ | (__ | (__   __   _ __"; 
	echo "| |  _  /'_  )| ,__)| ,__)/'__ \( '__)";
	echo "| |_( )( (_| || |   | |  (  ___/| |   ";
	echo "(____/' \__,_)(_)   (_)   \____)(_)   ";
	echo "------------------------------------- ";
	echo "                 http://laffer.sf.net ";
}

# Check for command line argument
if [ -z $1 ]; then
	if [ -z $VERSION ] ; then
		echo "Point it to the laffer archive."
		echo "Per example:"
		echo "./install.sh laffer-0.3.1.tgz"	
		echo "OR run this script from the laffer main directory."
		exit 
	else
		if [ $COPY_FILES -eq 1 ]; then
			if [ -d $LAFFER_DIR ]; then
				# clean directory
				rm -rf $LAFFER_DIR/
			fi 
			mkdir -p $LAFFER_DIR
			
			cp -R `pwd`/* $LAFFER_DIR
			echo "Temp files copied in $LAFFER_DIR"
		fi
	fi
	
	
else
	if [ -d $LAFFER_DIR ]; then
		# clean directory
		rm -rf $LAFFER_DIR/
	fi
	tar zxf $1 -C /tmp/
	echo "Archive unpacked in $LAFFER_DIR"
fi

print_logo

VERSION=`cat $LAFFER_DIR/VERSION`
echo "-- Starting installation of Laffer $VERSION --"

# Ask for database's host, name, user and pass and make changes where needed
# FIXME: laffer is the default name and will not work with other

echo -n "Enter host for the database [localhost]: "
read DB_HOST
if [ -z $DB_HOST ] ; then
	DB_HOST="localhost"
fi

echo -n "Enter name for the database [laffer]: "
read DB_NAME
if [ -z $DB_NAME ] ; then
	DB_NAME="laffer"
fi

while [ -z $DB_USER ] ; do
 	echo -n "Enter user for the laffer's database: "
	read DB_USER
done

while true; do
	echo -n "Enter password for the laffer's database: "
	stty -echo; read DB_PASS; stty echo

	CONFIRM_PASS="" # The retyped password
	echo ""; echo -n "Retype password: "
	stty -echo; read CONFIRM_PASS; stty echo

	if [ $DB_PASS != $CONFIRM_PASS ]; then
		echo ""; echo "Passwords don't match!"			
	else
		break
	fi		
done

# Install the database
echo "";
echo "Setting up the database"
echo  "	DB Host: $DB_HOST";
echo  "	DB Name: $DB_NAME";
echo  "	DB User: $DB_USER";

debug "mysqladmin -u $DB_USER -p$DB_PASS -h $DB_HOST create $DB_NAME";

RESULT="`mysqladmin -u $DB_USER -p$DB_PASS -h$DB_HOST create $DB_NAME 2>&1`"
DB_EXISTS=`echo $RESULT | grep 'Database exists'`
DB_ERROR=`echo $RESULT | grep 'error:'`

debug "Result: $RESULT"
debug "Exit code: $?"

DB_CREATED=0;

if [ -z "$DB_ERROR" ]; then
	if ! [ -z "$DB_EXISTS" ]; then 
		echo "Database \"$DB_NAME\" already exists!";			
	else
		echo "Database $DB_NAME created!"
		DB_CREATED=1;
	fi
else
	echo "Unable to create database: $DB_NAME!."
	echo "Error was: $RESULT"		
	echo "";
fi		

if [ $DB_CREATED -eq 0 ]; then
	CONTINUE="";
	while [ "$CONTINUE" != 'yes' ] && [ "$CONTINUE" != 'no' ]; do					
		echo -n " Continue installation (yes/no)[]:"
		read CONTINUE
	done		
	if [ $CONTINUE == 'no' ]; then
		echo "Exiting installation!";
		exit 1;
	fi
fi

echo ""
# Fix IM_EVENT table if the table already exists.
if ! [ -z "$DB_EXISTS" ]; then
	debug "mysql -u $DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME -e 'ALTER TABLE IM_EVENT add ENC varchar(255);"; 	
	RESULT="`mysql -u $DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME -e 'ALTER TABLE IM_EVENT add ENC varchar(255);' 2>&1`"	
	DB_ERROR=`echo $RESULT | grep "Duplicate column name 'ENC'"`
	#ToDo: Process this error
fi 

mysql -u $DB_USER -p$DB_PASS -h $DB_HOST -D$DB_NAME < $LAFFER_DIR/install/build.sql
if [ $? -eq 0 ]; then
	echo "Database Installed!"
else
	echo "Database installation failed!"
	CONTINUE="";	
	while [ "$CONTINUE" != 'yes' ] && [ "$CONTINUE" != 'no' ]; do			
		echo -n "	Continue installation (yes/no)[]: ";		
		read CONTINUE
	done		
	if [ $CONTINUE == 'no' ]; then
		echo "Exiting installation!";
		exit 1;
	fi	
fi

echo ""

# If DB installation is successful
grep -rn  _ENTER_DB_HOST_  $LAFFER_DIR | awk -v dbhost="$DB_HOST" -F : '{print "sed -i~ -e '\''"$2,"s/_ENTER_DB_HOST_/"dbhost"/'\''", $1 | "sh"  }' 
grep -rn  _ENTER_DB_DATABASE_ $LAFFER_DIR | awk -v dbname="$DB_NAME" -F : '{print "sed -i~ -e '\''"$2,"s/_ENTER_DB_DATABASE_/"dbname"/'\''", $1 | "sh"  }' 
grep -rn  _ENTER_DB_USER_  $LAFFER_DIR | awk -v dbuser="$DB_USER" -F : '{print "sed -i~ -e '\''"$2,"s/_ENTER_DB_USER_/"dbuser"/'\''", $1 | "sh"  }' 
grep -rn  _ENTER_DB_PASS_  $LAFFER_DIR | awk -v dbpass="$DB_PASS" -F : '{print "sed -i~ -e '\''"$2,"s/_ENTER_DB_PASS_/"dbpass"/'\''", $1 | "sh"  }' 

echo "Making test connection to the database..."
perl $LAFFER_DIR/install/test-mysql.pl
if [ $? -eq 0 ]; then 
	echo "Test connection to the database was successfull!"
else 
	echo "*** Perl DBI::MySQL modules are not installed or are not working correctly!***"		
fi

# Ask for laffer's modules directory
while true; do
	echo -n "Laffer's modules directory[$DEFAULT_MODULES_PATH]: " # Or perhaps should be /var/lib/laffer/?
	read MODULES_PATH
	
	if [ -z $MODULES_PATH ] ; then
		MODULES_PATH="$DEFAULT_MODULES_PATH"
	fi
	
	# Make laffer's modules dir	
	if ! [ -d $MODULES_PATH ]; then
		mkdir -p  $MODULES_PATH 				
		if [ $? -ne 0 ]; then
#  			debug "CHECK: ?= $? !=$!"
			continue
		fi
	else 			
		# Check if the user has permissions to write in it
		touch "$MODULES_PATH/test.file" 2>&1	
		if [ $? -eq 0 ] || [ -z $? ]; then
			rm -f "$MODULES_PATH/test.file"
		else			
			debug "Unable to read/write in \"$MODULES_PATH/test.file\""		
			continue
		fi
	fi	
	
		
	# Copy the modules	
	cp -R $LAFFER_DIR/modules/* $MODULES_PATH
	
	# Copy the data files
	cp -R $LAFFER_DIR/data/ $MODULES_PATH	
	
	if [ $? -eq 0 ] || [ -z $? ]; then
		echo "Modules installed!"
		break;
	else	
# 		debug "FINAL: ?= $? !=$!"
		continue
	fi	
done

# Make the changes in the configuration files
# TODO: Wildcards for the substitutions needed

sed -i~  -e 's#../modules#'"$MODULES_PATH"'#' $MODULES_PATH/config.inc
sed -i~  -e 's#../data/tables/#'"$MODULES_PATH"'/data/tables/#' $MODULES_PATH/config.inc # Fix Me
sed -i~  -e 's#__VERSION__#'"$VERSION"'#' $MODULES_PATH/config.inc
sed -i~  -e 's#_FULL_PATH_TO_#'"$MODULES_PATH"'#' $MODULES_PATH/proxy/GW/LINUXBG.pm
sed -i~  -e 's#../modules#'"$MODULES_PATH"'#' $LAFFER_DIR/htdocs/im.php
sed -i~  -e 's#_PATH_TO_MODULES_#'"$MODULES_PATH"'/proxy/#' $LAFFER_DIR/etc/rc.d/rc.improxyd
sed -i~  -e 's#_FULL_MODULES_PATH_#'"$MODULES_PATH"'#' $MODULES_PATH/utils/sync_im_tables.pl
sed -i~  -e 's#_PATH_TO_MODULES_#'"$MODULES_PATH"'#' $MODULES_PATH/proxy/Net/YahooMessenger/CRAM.pm
sed -i~  -e 's#_PATH_TO_MODULES_#'"$MODULES_PATH"'#' $LAFFER_DIR/INSTALLATION
sed -i~  -e 's#_PATH_TO_MODULES_#'"$MODULES_PATH"'#' $MODULES_PATH/proxy/test_oo.pl

echo "Modules files configured"

cp "$LAFFER_DIR/INSTALLATION" "$MODULES_PATH/"
if ! [ -d "$MODULES_PATH/install" ]; then
	mkdir -p "$MODULES_PATH/install"
fi
cp $LAFFER_DIR/install/* "$MODULES_PATH/install/"
cp "$LAFFER_DIR/LICENSE" "$MODULES_PATH/"
cp "$LAFFER_DIR/COPYRIGHT" "$MODULES_PATH/"
cp "$LAFFER_DIR/VERSION" "$MODULES_PATH/"

echo "Documentation files are copied."

# Make laffer's htdocs dir
while true; do
	echo -n "Laffer's web files directory[$DEFAULT_HTDOCS_PATH]: " 
	read HTDOCS_PATH
	
	if [ -z $HTDOCS_PATH ] ; then
		HTDOCS_PATH="$DEFAULT_HTDOCS_PATH"
	fi
	
	if ! [ -d $HTDOCS_PATH  ]; then
		mkdir -p $HTDOCS_PATH 				

		if [ $? -ne 0 ]; then
#  			debug "CHECK: ?= $? !=$!"
			continue
		fi
	else 
		# Check if the user has permissions to write in it
		touch "$HTDOCS_PATH/test.file"	
		if [ $? -eq 0 ] || [ -z $? ]; then
			rm -f "$HTDOCS_PATH/test.file"		
		else 
			debug "Unable to create \"$HTDOCS_PATH/test.file\""		
			continue
		fi		
	fi
	
	# Copy the HTDocs 
	cp -R $LAFFER_DIR/htdocs/* $HTDOCS_PATH
	
	if [ $? -eq 0 ] || [ -z $? ] ; then
		echo "HTDocs installed!"
		break
	else	
#  		debug "FINAL: ?= $? ! = $!"	
		continue
	fi
done

CONTINUE="";
echo -n "Do you want to start IM Proxy Server when the computer boots (yes/no)[no]:"; read CONTINUE;
if [ "$CONTINUE" == "yes" ]; then
	INIT_PATH=""
	while true; do
		echo -n "Path to save init script: [$DEFAULT_INIT_PATH]:";
		read INIT_PATH;
	
		if [ -z $INIT_PATH ]; then
			INIT_PATH="$DEFAULT_INIT_PATH";
		fi 	
		cp -R "$LAFFER_DIR/etc/rc.d/rc.improxyd" $INIT_PATH
	
		if [ $? -eq 0 ] || [ -z $? ] ; then
			echo "Placing init script in $INIT_PATH..."; 	
			break
		else	
			echo "Unable to copy file. Probably you need root account to do this."
			echo -n "Do you want to try again (yes/no)[no]:";
			read CONTINUE;
			if [ "$CONTINUE" != 'yes' ]; then
				echo "-------If you want to start IM Porxy Server at start time -----";
				echo "You will need to copy $LAFFER_DIR/etc/rc.d/rc.improxyd manually to the directory where init scripts are stored";
				echo "--------------------------------------------";
				break
			else
				continue
			fi 
		fi
	done
fi

# Compile Yahoo auhorizer
echo "Compiling Yahoo! Messenger authorizer..."
CDIR=`pwd`
cd $LAFFER_DIR/modules/proxy/utils/
gcc -o $MODULES_PATH/proxy/y_auth_new.bin gen_yahoo_auth.c
cd $CDIR

# 
echo -n "Clean IM messages stored in the DB frequently (yes/no)[yes]:"		
read CLEAN_FREQUENTLY
if [ -z $CLEAN_FREQUENTLY ] ; then
	CLEAN_FREQUENTLY="yes"
fi

if [ "$CLEAN_FREQUENTLY"=="no" ]; then
	sed -i~  -e 's#KEEP_MESSAGES_FOREVER = 0#KEEP_MESSAGES_FOREVER = 1#' $MODULES_PATH/conf/main.conf
fi 

if ! [ -d "$MODULES_PATH/cache/" ]; then
	mkdir -p "$MODULES_PATH/cache/"
fi

# Make the cache dir writable
chmod o+w $MODULES_PATH/cache/
# Make the data/tables/user.tbl file readable by everyone
# Fix it later to be readable only by the web server user
chmod a+r $MODULES_PATH/data/tables/user.tbl

# Show ugly perl errors
echo "Test IM modules and see if you are missing something ..."
perl -wc $MODULES_PATH/proxy/test_oo.pl

if [ $? ]; then
	echo "";
	echo "If perl complains start the CPAN shell:"
	echo "perl -MCPAN -e shell "
	
	echo "And then:"
	echo "install Net::SSLeay" 		
	
# 	echo "Or you have no errors!?! You amateur..."
fi

CONTINUE="";
echo "";
echo -n "Read INSTALLATION file for more information (yes/no)[yes]:"		
read CONTINUE
if [ -z $CONTINUE ]; then
	less "$LAFFER_DIR/INSTALLATION"
fi

# Clean the unpacked archive
rm -rf $LAFFER_DIR

exit 0
