#!/bin/sh

hardware_str=`cat /proc/cpuinfo | grep Hardware`
model_str=`expr match "$hardware_str" 'Hardware\s\+:\s\+\(M[0-9]\+\)-.*'`

TEMP_DIR="/home/main-user/MPItempfiles"
L2KERNEL_ARCHIVE="M000-EMVL2K-V*"
CTLS_EP_ARCHIVE="M000-EMVL2EP-V*"
CTLS_L2K1_ARCHIVE="M000-EMVL2K1-V*"
CTLS_L2K2_ARCHIVE="M000-EMVL2K2-V*"
echo $model_str
if [ "$model_str" = "M007" ]; then
	echo "M007 detected - using K3 V1-3"
	CTLS_L2K3_ARCHIVE="M000-EMVL2K3-V1-3"
else
	echo "using K3 V1-0"
	CTLS_L2K3_ARCHIVE="M000-EMVL2K3-V1-0"
fi
CTLS_L2K4_ARCHIVE="M000-EMVL2K4-V*"
CTLS_L2K6_ARCHIVE="M000-EMVL2K6-V*"
CTLS_L2KA_ARCHIVE="M000-EMVL2KA-V*"
CTLS_LIB_ARCHIVE="M000-EMVL2CL-V*"
L2LIBS_ARCHIVE="M000-EMVL2L-V*"
SSL_LIB="libssl.so.1.0.0"
SIGNATURES_ARCHIVE="signatures"
RELEASE_ARCHIVE='Install'

LIB_DIR="/usr/local/share/lib"
EXEC_DIR="/usr/local/main-user"
HOME_DIR="/home/main-user"

LOGFILE="$TEMP_DIR/mpi-installation.log"

MPI_VERSION="NOTFOUND"
MPI_CONF="NOTFOUND"

installlog () {
	echo $1 >> "$LOGFILE"
	echo $1
}

checkerror () {
if [ "$1" -ne "0" ]; then
	installlog "Error $1";
	cp $LOGFILE /mnt/vfat/
	exit $1;
fi
}

cmpfiles () {
	sum_1=`md5sum "$1"`
	if [ -f $2 ]; then
		sum_2=`md5sum "$2"`
	else
		sum_2="a missing file"
	fi
	md5_1=`expr match "$sum_1" '\([0-9a-f]\+\)'`
	md5_2=`expr match "$sum_2" '\([0-9a-f]\+\)'`
	[ $md5_1 = $md5_2 ]
	return $?
}

installfile () {
	SOURCEFILE=$1
	DESTFILE=$2
	if [ -f $DESTFILE ]; then miura-auth --remove $DESTFILE; fi
	miura-auth --install $SOURCEFILE $DESTFILE
	checkerror $?
}

cmpinstall () {
	COMMENT=$1
	SOURCEFILE=$2
	DESTFILE=$3
	if ! cmpfiles $SOURCEFILE.sig $DESTFILE.sig ; then
		if [ -f $DESTFILE ]; then
			installlog "Upgrading $COMMENT"
		else
			installlog "Installing $COMMENT"
		fi
		installfile $SOURCEFILE $DESTFILE
	fi
}

checkos () {

approved="7"
unapproved="C"
cpuinfo=/proc/cpuinfo

verline=`cat $cpuinfo | grep Software`
verdata=`expr match "$verline" '.*OS-V\([0-9A-Z]\+-[0-9]\+\).*'`
major=`expr match "$verdata" '\([0-9A-Z]\+\).*'`
minor=`expr match "$verdata" '[0-9A-Z]\+-\([0-9]\+\).*'`
major_is_approved=`expr "$major" '<' "A"`

if [ "$major_is_approved" -eq "0" ]; then
	#Check unapproved version
	major_ok=`expr "$major" '>=' "$unapproved"`
else
	#Check approved version
	major_ok=`expr "$major" '>=' "$approved"`
fi

if [ "$major_ok" -eq "0" ]; then
	#OS not recent enough to run this version of MPI.
	installlog "This version of MPI is not supported on this OS"
	installlog "$verline"
	installlog "Please upgrade to either V$approved or V$unapproved or later"
	cp $LOGFILE /mnt/vfat/
	rm -rf $TEMP_DIR/*
	exit 99
fi
}

if [ -f /usr/local/main-user/install ]; then miura-auth --remove /usr/local/main-user/install; fi

echo "Detecting MPI Archive"
#extract archive on MSD if present
if [ -f /mnt/vfat/M000-*MPI-V[[:digit:]]*.tar.gz ]; then
	echo "MPI Archive detected, extracting."
	ls /mnt/vfat/
	tar -C /mnt/vfat -zxvf /mnt/vfat/M000-*MPI-V[[:digit:]]*.tar.gz
# echo archive name into new temp file for use in start script after reboot.
	echo /mnt/vfat/M000-*MPI-V[[:digit:]]*.tar.gz > /home/main-user/installedarchivenames
	tmpVar=`echo /mnt/vfat/M000-*MPI-V[[:digit:]]*.tar.gz`
	MPI_VERSION=`expr match "$tmpVar" '.*\(M000-.*MPI-V[0-9]\+-[0-9]\+[^.]*\)'`

	rm /mnt/vfat/M000-*MPI-V[[:digit:]]*.tar.gz
	mv /mnt/vfat/M000-*MPI-V[[:digit:]]*/Install/* /mnt/vfat
fi

#extract archive on sent via MPI interface in the temp dir if present
if [ -f $TEMP_DIR/M000-*MPI-V[[:digit:]]*.tar.gz ]; then
	echo "MPI Archive detected, extracting."
	ls $TEMP_DIR/
	tar -C $TEMP_DIR -zxvf $TEMP_DIR/M000-*MPI-V[[:digit:]]*.tar.gz
# echo archive name into new temp file for use in start script after reboot.
	echo $TEMP_DIR/M000-*MPI-V[[:digit:]]*.tar.gz > /home/main-user/installedarchivenames
	tmpVar=`echo $TEMP_DIR/M000-*MPI-V[[:digit:]]*.tar.gz`
	MPI_VERSION=`expr match "$tmpVar" '.*\(M000-.*MPI-V[0-9]\+-[0-9]\+[^.]*\)'`

	rm $TEMP_DIR/M000-*MPI-V[[:digit:]]*.tar.gz
	mv $TEMP_DIR/M000-*MPI-V[[:digit:]]*/Install/* $TEMP_DIR/
fi

echo "Preparing installation directory"
if [ -f /mnt/vfat/install ]; then
	echo 'install script present on USB'
	if [ ! -d $TEMP_DIR ]; then
		echo 'Creating install directory'
		mkdir $TEMP_DIR
	else
		echo 'Install directory already exists'
	fi
	echo 'Moving installation files'
	cp -r /mnt/vfat/* $TEMP_DIR/
	rm -rf /mnt/vfat/*
else
	echo 'install script NOT present on USB, assume install through MPI'
fi

# temp dir now exists, can start using installlog calls after truncating logfile...
echo "Starting Installation of Miura Payments Interface" > "$LOGFILE"
date >> "$LOGFILE"
echo "Serial: "`miura-conf --get Serial` >> "$LOGFILE"
echo "Version: $MPI_VERSION" >> "$LOGFILE"

#As of V1-23 MPI will not run on older OS version. The cut off point for majior versions is VC and V7
checkos

# detect and extract CONFxx.tar.gz
if [ -f $TEMP_DIR/M000-*MPI-Vx-x-CONF*.tar.gz ]; then
# echo CONF archive name into existing temp file for use in start script after reboot.
	installlog "CONF archive found: $TEMP_DIR/M000-*MPI-Vx-x-CONF*.tar.gz"
	tar -C $TEMP_DIR/ -zxvf $TEMP_DIR/M000-*MPI-Vx-x-CONF*.tar.gz
	echo $TEMP_DIR/M000-*MPI-Vx-x-CONF*.tar.gz >> /home/main-user/installedarchivenames
	tmpVar=`echo $TEMP_DIR/M000-*MPI-Vx-x-CONF*.tar.gz`
	MPI_CONF=`expr match "$tmpVar" '.*\(-CONF[0-9]\+[^.]*\)'`

	if [ -f $TEMP_DIR/M000-*MPI-Vx-x-CONF*/MPI-Production.cfg ]; then
		cp -r $TEMP_DIR/M000-*MPI-Vx-x-CONF*/MPI-*.* /home/main-user/
	fi

	if [ -f /usr/local/share/certs/keysign-main-user.crt ]; then
		   installlog "keysign-main-user certificate already present"
	else
		   installlog "Installing keysign-main-user certificate"
		   miura-auth --install-cert $TEMP_DIR/M000-*MPI-Vx-x-CONF*/keysign-main-user.crt
		   result=$?
		   if [ "0" -ne $result ];then
			#check for another keysign-main-user certificate in certs sub-directory
			if [ -d  $TEMP_DIR/M000-*MPI-Vx-x-CONF*/certs ]; then
		            miura-auth --install-cert $TEMP_DIR/M000-*MPI-Vx-x-CONF*/certs/keysign-main-user.crt
		            checkerror $?
			else
			    checkerror $result
		        fi
		   fi
	fi
else
	if [ -f /usr/local/share/certs/keysign-main-user.crt ]; then
		installlog "M000-MPI-Vx-x-CONF archive not found in MSD. Continue to use the installed..."
	else
		installlog "M000-MPI-Vx-x-CONF archive not found. Aborting..."
		checkerror 99
	fi
fi

installlog "Detecting communications system"
if cat /proc/bus/usb/devices | grep Bluetooth; then
	installlog "Bluetooth Detected"
fi

if cat /proc/bus/usb/devices | grep WLAN; then
	installlog "WLAN Detected"
	if [ ! -d /home/main-user/.ip_config ]; then
		echo 'Creating IP Config directory'
		mkdir /home/main-user/.ip_config
	else
		echo 'IP Config directory already exists'
	fi
	if [ -f /home/main-user/IP_Server_Configuration ]; then
		installlog "Default server configuration present"
	else
		installlog "Creating default server configuration"
		echo "Server:192.168.10.2:16107" > /home/main-user/IP_Server_Configuration
	fi
fi

installlog 'Extracting installation'
tar -C $TEMP_DIR -zxvf $TEMP_DIR/$RELEASE_ARCHIVE.tar.gz
checkerror $?
mv $TEMP_DIR/$RELEASE_ARCHIVE/* $TEMP_DIR/

installlog 'Extracting archives'
tar -C $TEMP_DIR -zxvf $TEMP_DIR/$L2KERNEL_ARCHIVE.tar.gz
checkerror $?
tar -C $TEMP_DIR -zxvf $TEMP_DIR/$L2LIBS_ARCHIVE.tar.gz
checkerror $?
tar -C $TEMP_DIR -zxvf $TEMP_DIR/$CTLS_L2K1_ARCHIVE.tar.gz
checkerror $?
tar -C $TEMP_DIR -zxvf $TEMP_DIR/$CTLS_L2K2_ARCHIVE.tar.gz
checkerror $?
tar -C $TEMP_DIR -zxvf $TEMP_DIR/$CTLS_L2K3_ARCHIVE.tar.gz
checkerror $?
tar -C $TEMP_DIR -zxvf $TEMP_DIR/$CTLS_L2K4_ARCHIVE.tar.gz
checkerror $?
tar -C $TEMP_DIR -zxvf $TEMP_DIR/$CTLS_L2K6_ARCHIVE.tar.gz
checkerror $?
tar -C $TEMP_DIR -zxvf $TEMP_DIR/$CTLS_L2KA_ARCHIVE.tar.gz
checkerror $?
tar -C $TEMP_DIR -zxvf $TEMP_DIR/$CTLS_EP_ARCHIVE.tar.gz
checkerror $?
tar -C $TEMP_DIR -zxvf $TEMP_DIR/$CTLS_LIB_ARCHIVE.tar.gz
checkerror $?

installlog 'Extracting signatures'
tar -C $TEMP_DIR -zxvf $TEMP_DIR/$SIGNATURES_ARCHIVE.tar.gz
checkerror $?
mv $TEMP_DIR/signatures/* $TEMP_DIR/

mv $TEMP_DIR/libemvl2_kernel.so.sig $TEMP_DIR/$L2KERNEL_ARCHIVE/
mv $TEMP_DIR/libemvl2_kernel1.so.sig $TEMP_DIR/$CTLS_L2K1_ARCHIVE/
mv $TEMP_DIR/libemvl2_kernel2.so.sig $TEMP_DIR/$CTLS_L2K2_ARCHIVE/
if [ "$model_str" = "M007" ]; then
	mv $TEMP_DIR/libemvl2_kernel3_M007.so.sig $TEMP_DIR/$CTLS_L2K3_ARCHIVE/libemvl2_kernel3.so.sig
else
	mv $TEMP_DIR/libemvl2_kernel3.so.sig $TEMP_DIR/$CTLS_L2K3_ARCHIVE/
fi
mv $TEMP_DIR/libemvl2_kernel4.so.sig $TEMP_DIR/$CTLS_L2K4_ARCHIVE/
mv $TEMP_DIR/libemvl2_kernel6.so.sig $TEMP_DIR/$CTLS_L2K6_ARCHIVE/
mv $TEMP_DIR/libemvl2_kernelA.so.sig $TEMP_DIR/$CTLS_L2KA_ARCHIVE/
mv $TEMP_DIR/libemvl2_entry_point.so.sig $TEMP_DIR/$CTLS_EP_ARCHIVE/
mv $TEMP_DIR/libemvl2_common.so.sig $TEMP_DIR/$CTLS_LIB_ARCHIVE/
mv $TEMP_DIR/libemvl2_hal.so.sig $TEMP_DIR/$L2LIBS_ARCHIVE/
mv $TEMP_DIR/libemvl2_util.so.sig $TEMP_DIR/$L2LIBS_ARCHIVE/

cmpinstall "EMV Kernel" $TEMP_DIR/$L2KERNEL_ARCHIVE/libemvl2_kernel.so $LIB_DIR/libemvl2_kernel.so
cmpinstall "EMV Contactless Kernel C1" $TEMP_DIR/$CTLS_L2K1_ARCHIVE/libemvl2_kernel1.so $LIB_DIR/libemvl2_kernel1.so
cmpinstall "EMV Contactless Kernel C2" $TEMP_DIR/$CTLS_L2K2_ARCHIVE/libemvl2_kernel2.so $LIB_DIR/libemvl2_kernel2.so
cmpinstall "EMV Contactless Kernel C3" $TEMP_DIR/$CTLS_L2K3_ARCHIVE/libemvl2_kernel3.so $LIB_DIR/libemvl2_kernel3.so
cmpinstall "EMV Contactless Kernel C4" $TEMP_DIR/$CTLS_L2K4_ARCHIVE/libemvl2_kernel4.so $LIB_DIR/libemvl2_kernel4.so
cmpinstall "EMV Contactless Kernel C6" $TEMP_DIR/$CTLS_L2K6_ARCHIVE/libemvl2_kernel6.so $LIB_DIR/libemvl2_kernel6.so
cmpinstall "EMV Contactless Kernel EFTPOS" $TEMP_DIR/$CTLS_L2KA_ARCHIVE/libemvl2_kernelA.so $LIB_DIR/libemvl2_kernelA.so
cmpinstall "EMV Contactless Entry Point" $TEMP_DIR/$CTLS_EP_ARCHIVE/libemvl2_entry_point.so $LIB_DIR/libemvl2_entry_point.so
cmpinstall "EMV Contactless Common" $TEMP_DIR/$CTLS_LIB_ARCHIVE/libemvl2_common.so $LIB_DIR/libemvl2_common.so

cmpinstall "EMV hal" $TEMP_DIR/$L2LIBS_ARCHIVE/libemvl2_hal.so $LIB_DIR/libemvl2_hal.so
cmpinstall "EMV utils" $TEMP_DIR/$L2LIBS_ARCHIVE/libemvl2_util.so $LIB_DIR/libemvl2_util.so

cmpinstall "SSL library" $TEMP_DIR/$SSL_LIB $LIB_DIR//$SSL_LIB
cmpinstall "Crypto library" $TEMP_DIR/libcrypto.so.1.0.0 $LIB_DIR/libcrypto.so.1.0.0

cmpinstall 'Bluetooth init script' $TEMP_DIR/init-bluetooth $EXEC_DIR/init-bluetooth
cmpinstall 'Bluetooth pinagent' $TEMP_DIR/dbus-pinagent $EXEC_DIR/dbus-pinagent

if [ -d  $TEMP_DIR/M000-*MPI-Vx-x-CONF*/libs ]; then
	installlog 'Installing additional libraries'
	for filename in $TEMP_DIR/M000-*MPI-Vx-x-CONF*/libs/*.so;
	do
		cmpinstall  "${filename##*/}" $TEMP_DIR/M000-*MPI-Vx-x-CONF*/libs/${filename##*/} $LIB_DIR/${filename##*/}
	done
fi

installlog 'Copying config files'

# EMV Configuration
if [ -f /home/main-user/emvl2config.date ]; then rm /home/main-user/emvl2config.date; fi
if [ ! -d /home/main-user/emvconfig ]; then mkdir /home/main-user/emvconfig; fi
cp $TEMP_DIR/EMV-Config/* /home/main-user/emvconfig/
checkerror $?

# supporting files
cp $TEMP_DIR/Images/*.bmp /home/main-user/
DISP_RES="`miura-conf --get Display | cut -d ' ' -f 2`"
if [ "$DISP_RES" == "132*48" ]; then
	cp $TEMP_DIR/Images/Mono-132x48/*.bmp /home/main-user/
fi
if [ "$DISP_RES" == "256*128" ]; then
	cp $TEMP_DIR/Images/Mono-256x128/*.bmp /home/main-user/
fi

# MPI application configs
cp $TEMP_DIR/MPI-Dynamic.cfg /home/main-user/
cp $TEMP_DIR/ctls-prompts.txt /home/main-user/

installlog 'Processing Secure Config Files'
cp $TEMP_DIR/SecureConfig/*.bmp $TEMP_DIR/
cp $TEMP_DIR/SecureConfig/*.txt $TEMP_DIR/
cp $TEMP_DIR/SecureConfig/*.cfg $TEMP_DIR/
cp $TEMP_DIR/SecureConfig/*.bdf $TEMP_DIR/

cmpinstall "prompts.txt" $TEMP_DIR/prompts.txt $EXEC_DIR/prompts.txt
cmpinstall "acc-data-prompts.txt" $TEMP_DIR/acc-data-prompts.txt $EXEC_DIR/acc-data-prompts.txt
cmpinstall "capkeys.cfg" $TEMP_DIR/capkeys.cfg $EXEC_DIR/capkeys.cfg
cmpinstall "emv-arc.cfg" $TEMP_DIR/emv-arc.cfg $EXEC_DIR/emv-arc.cfg
cmpinstall "emv-pinbypass.cfg" $TEMP_DIR/emv-pinbypass.cfg $EXEC_DIR/emv-pinbypass.cfg
cmpinstall "numeric-entry.cfg" $TEMP_DIR/numeric-entry.cfg $EXEC_DIR/numeric-entry.cfg
cmpinstall "sred-mag.cfg" $TEMP_DIR/sred-mag.cfg $EXEC_DIR/sred-mag.cfg
cmpinstall "Font: Sazanami-Mincho-Regular-20.bdf" $TEMP_DIR/Sazanami-Mincho-Regular-20.bdf $EXEC_DIR/Sazanami-Mincho-Regular-20.bdf
cmpinstall "Font: Sazanami-Mincho-Regular-10.bdf" $TEMP_DIR/Sazanami-Mincho-Regular-10.bdf $EXEC_DIR/Sazanami-Mincho-Regular-10.bdf
cmpinstall "Font: lcd-std.bdf" $TEMP_DIR/lcd-std.bdf $EXEC_DIR/lcd-std.bdf
cmpinstall "Font: 12x32.bdf" $TEMP_DIR/12x32.bdf $EXEC_DIR/12x32.bdf
cmpinstall "Font: 6x12.bdf" $TEMP_DIR/6x12.bdf $EXEC_DIR/6x12.bdf
cmpinstall "Font: 9x18.bdf" $TEMP_DIR/9x18.bdf $EXEC_DIR/9x18.bdf
cmpinstall "Font: 14x28.bdf" $TEMP_DIR/14x28.bdf $EXEC_DIR/14x28.bdf
cmpinstall "Start script" $TEMP_DIR/start $EXEC_DIR/start
# install a copy of start as restore
cmpinstall "Restore script" $TEMP_DIR/start $EXEC_DIR/restore

installlog 'Installing MPI Binary'
if [ -f $EXEC_DIR/Retail-API ]; then
	miura-auth --remove $EXEC_DIR/Retail-API;
	echo 'upgrade' > /home/main-user/installerflag
else
	installlog "Initial Install"
	echo 'REBOOTME' > /home/main-user/cleaninstall_rebootme
	echo 'make-factory' > /home/main-user/installerflag
	miura-auth --make-factory
	checkerror $?
fi
miura-auth --install $TEMP_DIR/Retail-API $EXEC_DIR/
checkerror $?

installlog 'Setting restore point'
miura-auth --make-restore
checkerror $?

date >> "$LOGFILE"
installlog "Installation Complete: $MPI_VERSION$MPI_CONF"
cp $LOGFILE /mnt/vfat/

# Remove legacy fonts which are only used by older MPI builds (V1-40 and older)
if [ -f $EXEC_DIR/16x30.bdf ]; then
	installlog "Removing legacy font $EXEC_DIR/16x30.bdf"
	miura-auth --remove $EXEC_DIR/16x30.bdf
fi
if [ -f $EXEC_DIR/9x17.bdf ]; then
	installlog "Removing legacy font $EXEC_DIR/9x17.bdf"
	miura-auth --remove $EXEC_DIR/9x17.bdf
fi
if [ -f $EXEC_DIR/8x16.bdf ]; then
	installlog "Removing legacy font $EXEC_DIR/8x16.bdf"
	miura-auth --remove $EXEC_DIR/8x16.bdf
fi
if [ -f $EXEC_DIR/6x10.bdf ]; then
	installlog "Removing legacy font $EXEC_DIR/6x10.bdf"
	miura-auth --remove $EXEC_DIR/6x10.bdf
fi

# Clean up Temp files
rm -rf $TEMP_DIR/*

exit 0
