#!/bin/bash


# Created by jiaqiang.ye@lnxall.com
# unpack installer for /opt/lnxall_app
# 2024/08/28

export PATH=/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin
LINO= # starting line number for dumping
SCRIPTFILE="$(readlink -f $0)"

check_system() {
	if [ -z "$(cat /proc/device-tree/model | tr -d '\0' | grep -a -e AM654)" ] ; then
		echo "Error, not EM1000 gateway device." 1>&2
		return 1
	fi
	return 0
}

TDengine_install() {
	[ ! -d /etc/taos ] && mkdir -p /etc/taos
	if [ ! -f lnxall_app/platspec/taosd.service ] ; then
		: no need to install
		return 0
	fi

	if [ -f app/config/taos.cfg ] ; then
		diff -q lnxall_app/app/config/taos.cfg /etc/taos/taos.cfg >/dev/null 2>/dev/null
		[ $? -ne 0 ] && cp -v -f lnxall_app/app/config/taos.cfg /etc/taos/taos.cfg
	fi

	local tfile=/usr/lib/systemd/system/taosd.service
	diff -q lnxall_app/platspec/taosd.service ${tfile} >/dev/null 2>/dev/null
	if [ $? -ne 0 ] ; then
		cp -v -f lnxall_app/platspec/taosd.service ${tfile}
		systemctl daemon-reload
		systemctl enable taosd.service
		systemctl restart taosd.service
	fi
	return 0
}

install_system_language() {
	if [ -f /opt/.lnxall_system/default/locale ] ; then
		mkdir -p /etc/default
		cp -v -f /opt/.lnxall_system/default/locale /etc/default/locale
	fi
	rm -rf /opt/.lnxall_system
	return 0
}


post_install() {
	if [ -e '/opt/lnxall_app/lnxall-app-build-info.txt' ] ; then
		cp -v -f /opt/lnxall_app/lnxall-app-build-info.txt /etc/
	fi
	# TODO: add specific operations here

	# systemctl restart emud
	# systemctl restart emsd
	# systemctl restart linit

	rm -rf -v /app/upstart/.*.done
	TDengine_install
	install_system_language

	rm -rf "${SCRIPTFILE}"
	sync
	return 0
}


KEEP_CFGS=1
check_args() {
	FWFILE="$1"
	if [ "${FWFILE}" = "-n" ] ; then
		KEEP_CFGS=0
	fi
	return 0
}


backupstar='lnxall_backup.tar'
backuped=0

backups(){
	[ ${backuped} -eq 1 ] && return

	if [ ${KEEP_CFGS} -eq 1 ] ; then
		cd /opt
		rm -rf ${backupstar} # remove backup settings
		backuped=1
		echo "Backing up lnxall configs..."
		local KEEPDIRS='lnxall_app/app/config' # /app/config always exists
		[ -e 'lnxall_app/app/node' ] && KEEPDIRS="${KEEPDIRS} lnxall_app/app/node"
		[ -e 'lnxall_app/app/adapter' ] && KEEPDIRS="${KEEPDIRS} lnxall_app/app/adapter"
		[ -e 'lnxall_app/app/global/template' ] && KEEPDIRS="${KEEPDIRS} lnxall_app/app/global/template"
		[ -e 'lnxall_app/app/global/alarminfo' ] && KEEPDIRS="${KEEPDIRS} lnxall_app/app/global/alarminfo"
		[ -e 'lnxall_app/app/template' ] && [ ! -L 'lnxall_app/app/template' ] && KEEPDIRS="${KEEPDIRS} lnxall_app/app/template"
		[ -e 'lnxall_app/etc/config' ] && KEEPDIRS="${KEEPDIRS} lnxall_app/etc/config"
		[ -e 'lnxall_app/lib/dyiot/appdis' ] && KEEPDIRS="${KEEPDIRS} lnxall_app/lib/dyiot/appdis"
		[ -d 'lnxall_app' ] && tar -cvf "${backupstar}" ${KEEPDIRS}
		rm -rf db_backup
		if [ -e 'lnxall_app/app/database' ] ; then
			mv -vf 'lnxall_app/app/database' db_backup
		fi
		cd -
	fi
}

rebackups(){
	[ ${backuped} -eq 0 ] && return

	if [ ${KEEP_CFGS} -eq 1 ] ; then
		cd /opt
		echo "Restoring backups..."
		[ -e "${backupstar}" ] && tar -x -v -f "${backupstar}"
		if [ -e 'db_backup' ] ; then
			if [ -L 'db_backup' ] ; then
				mv -vf db_backup lnxall_app/app/database
			else
				mkdir -vp lnxall_app/app/database
				mv -vf db_backup/* lnxall_app/app/database/
				rm -vrf db_backup
			fi
		fi
		rm -rf "${backupstar}"
		cd -
	fi
}


init_install() {
	if [ ! -f "${SCRIPTFILE}" ] ; then
		echo "Error, script path not found." 1>&2
		return 1
	fi

	local -i lino=$(grep -a -n -e '^# BEGIN_OF_RAW_DATA' "${SCRIPTFILE}" | awk -F: '{print $1}')
	if [ -z "${lino}" ] ; then
		echo "Error, binary raw data not found." 1>&2
		return 2
	fi
	lino+=1
	declare -g LINO=${lino}
	return 0
}

unpack_install() {
	cd /opt || return 1

	# stop services
	systemctl stop emsd 2>/dev/null
	systemctl stop emud 2>/dev/null
	systemctl stop linit 2>/dev/null

	# extract in temporary directory
	rm -rf .tmpdir
	mkdir -p .tmpdir
	cd .tmpdir

	local -i uncnt=0
	while true ; do
		backups
		# remove existing directories
		rm -rf lnxall_app elect_resources
		echo "Unpacking for /opt/lnxall_app /opt/elect_resources..."
		tail -n "+${LINO}" "${SCRIPTFILE}" | xz -T 3 -d -c | tar --touch -x -f -
		[ $? -eq 0 ] && break

		uncnt+=1
		[ ${uncnt} -ge 5 ] && break
	done
	if [ ${uncnt} -ge 5 ] ; then
		echo "Error, failed to unpack compressed tarball." 1>&2
		rm -rf lnxall_app elect_resources
		return 2
	fi

	if [ ! -d ../node_modules.bak ] ; then
		mv -f -v ../elect_resources/resources/app/node_modules ../node_modules.bak
	fi
	# remove existing directories
	rm -rf ../lnxall_app ../elect_resources ../.lnxall_services ../.lnxall_system
	mv -v -f * ../ && mv -v -f .lnxall_services .. && mv -v -f .lnxall_system .. ; cd ..

	if [ -d node_modules.bak ] ; then
		rm -rf elect_resources/resources/app/node_modules
		mv -v -f /opt/node_modules.bak elect_resources/resources/app/node_modules
	fi
	rebackups
	# disable/enable emsd or emud
	if [ -e .lnxall_services/emsd.service ] ; then
		cp -v -f lnxall_app/platspec/emsd.service /usr/lib/systemd/system/ && \
			systemctl daemon-reload && systemctl enable emsd.service
	else
		systemctl disable emsd.service
	fi
	if [ -e .lnxall_services/emud.service ] ; then
		cp -v -f lnxall_app/platspec/emud.service /usr/lib/systemd/system/ && \
			systemctl daemon-reload && systemctl enable emud.service
	else
		systemctl disable emud.service
	fi
	rm -rf .lnxall_services

	return 0
}
check_args "$@" || exit 1
check_system    || exit 1
init_install    || exit 2
unpack_install  || exit 3
post_install    || exit 4
exit 0
# BEGIN_OF_RAW_DATA
