#!/bin/bash

install_bin() {
	local file=$1
	local install_dir=${2:-/usr/local/bin}
	local mode=${3:-0755}

	if [[ ! -e "${file}" ]] ; then
		echo "Unable to find $(basename ${file})"
		return
	fi

	mkdir -p ${install_dir}
	install -t ${install_dir} -m ${mode}  ${file}
	echo "installed $(basename ${file})"
}

install_bin_as() {
	local file=$1
	local dest=${2}
	local mode=${3:-0755}

	if [[ ! -e "${file}" ]] ; then
		echo "Unable to find $(basename ${file})"
		return
	fi

	if [[ -z "${dest}" ]] ; then
		echo "must specify destination name"
		return
	fi

	mkdir -p $(dirname ${dest})
	install  -m ${mode} -T ${file} ${dest}
	echo "installed $(basename ${dest})"
}

install_deb() {
	local file=$1

	if [[ ! -e "${file}" ]] ; then
		echo "unable to find $(basename ${file})"
		return
	fi

	dpkg -i ${file}
	echo "installed $(basename ${file})"
	echo
}


install_firmware() {
	local new_fw=$1
	local cur_fw=$2

	echo "   -- Updating FPGA firmware from ${cur_fw} to ${new_fw}"
	cat <<-EOS | /usr/bin/jtag
		cable ft2232 vid=0403 pid=6010
		detect
		svf ./firmware/nipc.svf progress
EOS
}

logfile=/var/log/nip-update.log
source ./build.info

./bin/setled 7 # set LED to White-Purple
exec &> >(tee "${logfile}")

echo
echo "[$(date)] Beggining rppl NIP update"
echo


rm -f /etc/rppl_version

if [[ "$HOSTNAME" == "nomad" ]]; then
	echo "This update can only be run on the NIP"
	exit 1
fi

echo "Installing kernel drivers"
if [[ -d "./drv" ]] ; then
	rm -rf /lib/modules/2.6.33.9-rt31-nipc/kernel/rppl
	mkdir -p /lib/modules/2.6.33.9-rt31-nipc/kernel/rppl
	cp -r ./drv/* /lib/modules/2.6.33.9-rt31-nipc/kernel/rppl/
	depmod -a
else
	echo "  no kernel drivers detected."
fi


echo "Deleting old startup scripts"
update-rc.d -f acpid                remove  >/dev/null 2>&1
update-rc.d -f bootlogd             remove  >/dev/null 2>&1
update-rc.d -f stop-bootlogd        remove  >/dev/null 2>&1
update-rc.d -f stop-bootlogd-single remove  >/dev/null 2>&1
update-rc.d -f ondemand             remove  >/dev/null 2>&1
update-rc.d -f checkroot            remove  >/dev/null 2>&1
update-rc.d -f checkfs              remove  >/dev/null 2>&1
update-rc.d -f grub-common          remove  >/dev/null 2>&1
update-rc.d -f mountall             remove  >/dev/null 2>&1
update-rc.d -f mountall-bootclean   remove  >/dev/null 2>&1
update-rc.d -f mountoverflowtmp     remove  >/dev/null 2>&1
update-rc.d -f mountnfs             remove  >/dev/null 2>&1
update-rc.d -f mountnfs-bootclean   remove  >/dev/null 2>&1
update-rc.d -f plymouth             remove  >/dev/null 2>&1
update-rc.d -f plymouth-log         remove  >/dev/null 2>&1
update-rc.d -f plymouth-splash      remove  >/dev/null 2>&1
update-rc.d -f plymouth-stop        remove  >/dev/null 2>&1
update-rc.d -f udev-mtab            remove  >/dev/null 2>&1
update-rc.d -f urandom              remove  >/dev/null 2>&1

update-rc.d -f rppl-nip      remove  >/dev/null 2>&1
update-rc.d -f rppl-nipexec  remove  >/dev/null 2>&1
update-rc.d -f rppl-slowcpu  remove  >/dev/null 2>&1
update-rc.d -f rppl-cgosfan  remove  >/dev/null 2>&1


echo "Installing system /etc files"
if [[ -d "./etc/nip" ]] ; then
	cp -fdr ./etc/nip/* /etc
	echo "..installed /etc files."
else
	echo "..no system files detected."
fi

# Dpkg needs this
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin

echo "Removing old library files"
dpkg --purge nomad-libnipboard
dpkg --purge nomad-libs
rm -rf /usr/local/rppl/lib

echo "Installing library files"
install_deb ./deb/nomad-libs*.deb
install_deb ./deb/nomad-libnipboard*.deb
echo


echo "Deleting old NIP programs"
rm -rf /usr/rppl/nipexec*
rm -f /usr/rppl/nipc.conf
rm -f /etc/nipc.conf
rm -f /usr/local/sbin/rppl-update


echo "Installing NIP programs"
#/usr/local/sbin
install_bin_as "./bin/nip-rppl-update" "/usr/local/sbin/rppl-update"

# /usr/local/bin
install_bin "./bin/nipspy"
install_bin "./bin/nipserial"
install_bin "./bin/cb_detect"
install_bin "./bin/sys-detect"
install_bin "./bin/niptest"
install_bin "./bin/setled"
echo


#/usr/rppl
install_bin "./bin/${NIPEXEC}" "/usr/rppl"
( cd /usr/rppl && ln -fs ${NIPEXEC} nipexec )

install_bin "./bin/${NIPEXEC}-debug" "/usr/rppl"

if [[ -e "./nipexec_release_notes.md" ]] ; then
    echo "Installing release notes..."
    install_bin_as ./nipexec_release_notes.md /usr/rppl/nipexec_release_notes.md 0644
fi

echo


#/usr/rppl/cgos
install_bin "./bin/cgosdump" "/usr/rppl/cgos"
install_bin "./bin/cgosfan" "/usr/rppl/cgos"
install_bin "./bin/cgosmon" "/usr/rppl/cgos"
install_bin "./bin/setfan" "/usr/rppl/cgos"
echo


echo "Installing NIP services"
update-rc.d rppl-slowcpu start 15 S .         2>/dev/null
update-rc.d rppl-cgosfan start 85 2 1 0 .     2>/dev/null
update-rc.d rppl-nip     start 90 2 .         2>/dev/null


if [[ ! -e /root/.bash_login ]] ; then
	echo "cd /usr/rppl" > /root/.bash_login
	echo "installed .bash_login"
fi

if [[ ! -e /dev/disk/by-uuid/e3bedded-5217-40c9-8968-e513e3d2c7a1 ]] ; then
	echo "Assigning UUID to embedded drive"
	tune2fs -L nipembed -U e3bedded-5217-40c9-8968-e513e3d2c7a1 /dev/disk/by-id/usb-TS_TS2GUFM-V*-part1

	echo "Updating GRUB device map"
	cat <<-EOS > /boot/grub/device.map
		(hd0) /dev/sda
		(hd1) /dev/sdb
EOS

	echo "Updating GRUB Menu List"
	cat <<-EOS > /boot/grub/menu.lst
		default 0
		timeout 0
		title   NIP Kernel 2.6.33.9-rt31-nipc (rppl-01_i386)
		kernel  /boot/vmlinuz-2.6.33.9-rt31-nipc root=UUID=e3bedded-5217-40c9-8968-e513e3d2c7a1 ro quiet
		initrd  /boot/initrd.img-2.6.33.9-rt31-nipc
EOS

	echo "Updating Filesystem table"
	cat <<-EOS > /etc/fstab
		/proc /proc proc defaults 0 0
		UUID=e3bedded-5217-40c9-8968-e513e3d2c7a1 / ext3 defaults,ro,noatime 0 0
EOS
fi

# [ELB-2014/06/03]
# On Kontron board this module does not seem to load automatically so the module
# will get put in /etc/modules.  Only do this if we are on a Kontron board.
# grep -v '^#' /etc/modules | grep -q jida; -> lines that don't start with #
# and contain "jida"
if lspci -v | grep -q Kontron && ! grep -v '^#' /etc/modules | grep -q jida; then
    echo "jida" >> /etc/modules
fi

NEW_FPGA_FW="r04"
CURRENT_FPGA_FW=$(lspci -d 0139: -vmm | grep "^Rev:" | awk '{print "r" $2; }')
if [[ "${CURRENT_FPGA_FW}" != "${NEW_FPGA_FW}" ]]; then
	install_firmware ${NEW_FPGA_FW} ${CURRENT_FPGA_FW}
elif [[ "${OPT_FORCE}" == "True" ]] ; then
	install_firmware ${NEW_FPGA_FW} ${CURRENT_FPGA_FW}
fi

if ! lspci -v | grep -q Kontron; then
    CGOSCHK=`./bin/cgutlcmd MODULE /OT:BOARD /INFO`
    if [ "$CGOSCHK" = "${CGOSCHK%RPPLNIP1*}" ]; then
	echo "   -- updating cgos bios modules"
	./bin/cgutlcmd MODULE /OT:BOARD /DEL /T:2
	./bin/cgutlcmd MODULE /OT:BOARD /DEL /T:1
	./bin/cgutlcmd MODULE /OT:BOARD /ADD /IF:./bios/CS45R110-RPPLNIP1-DefMap.mod
	./bin/cgutlcmd MODULE /OT:BOARD /ADD /IF:./bios/CS45R110-RPPLNIP1-BkupMap.mod
	./bin/cgutlcmd MODULE /OT:BOARD /OEM:RPPLNIP1
    fi

    echo "installed CGOS Bios"
    sleep 5
fi

nipc_driver=""
if [[ -e ./drv/nipc.ko ]] ; then
	nipc_driver=$(modinfo -F version ./drv/nipc.ko)
fi

cat <<-EOS > /etc/rppl_version
	kernel = 2.6.33.9-rt31-nipc
	nipc_driver = ${nipc_driver}
	nipc_firmware = ${NEW_FPGA_FW}
	nipexec = ${NIPEXEC}
	build_tag = ${BUILD_TAG}
	update = ${UPDATE_FILE}
EOS

#nipc.conf (all old NIPs have BTRIP set now)
_RIPPLE_SYSTEM=$(./bin/nomad-exec ./bin/sys-detect)
case ${_RIPPLE_SYSTEM} in
	NIP)
		echo "SYSTEM = NIP" > /etc/nipc.conf
		;;

	SCOUT)
		echo "SYSTEM = SCOUT" > /etc/nipc.conf
		;;
	*)
		echo "invalid RIPPLE_SYTEM: ${_RIPPLE_SYSTEM} detected!"
		echo "using SYSTEM = NIP"
		echo "SYSTEM = NIP" > /etc/nipc.conf
		;;
esac

echo "BTRIP = true" >> /etc/nipc.conf
[[ "${OPT_TWONIP}" == "True" ]] && echo "TWONIP = true" >> /etc/nipc.conf
[[ "${OPT_TCP}" == "True" ]] && echo "TCP = true" >> /etc/nipc.conf
echo "installed nipc.conf"

echo "waiting to sync"
sync

echo "[$(date)] NIP Update complete."

exit 0
