#!/bin/sh
#
# Copyright 2007 Openedhand Ltd.
#
# Author: Richard Purdie <rpurdie@openedhand.com>
#

# The following script will run all the scriptlets found in #SYSCONFDIR#/deb-postinsts,
# #SYSCONFDIR#/ipk-postinsts or #SYSCONFDIR#/rpm-postinsts or the package manager in
# case available.

# the order of this list is important, do not change!
backend_list="rpm deb ipk"

pm_installed=false

for pm in $backend_list; do
	# found the package manager, it has postinsts
	case $pm in
		"deb")
			if [ -s "#LOCALSTATEDIR#/lib/dpkg/status" ]; then
				pm_installed=true
				break
			fi
			;;

		"ipk")
			if [ -s "#LOCALSTATEDIR#/lib/opkg/status" ]; then
				pm_installed=true
				break
			fi
			;;
	esac

	pi_dir="#SYSCONFDIR#/$pm-postinsts"

	# found postinsts directory
	if [ -d $pi_dir ]; then
		break
	fi
done

remove_rcsd_link () {
	if [ -n "`which update-rc.d`" ]; then
		update-rc.d -f run-postinsts remove
	fi
}

if ! [ -d $pi_dir ] && ! $pm_installed; then
	remove_rcsd_link
	exit 0
fi

echo "Configuring packages on first boot...."
echo " (This may take several minutes. Please do not power off the machine.)"

[ -e #SYSCONFDIR#/default/postinst ] && . #SYSCONFDIR#/default/postinst

if [ "$POSTINST_LOGGING" = "1" ]; then
	rm -f $LOGFILE
	append_log=">>$LOGFILE 2>&1"
fi

exec_postinst_scriptlets() {
	for i in `ls $pi_dir`; do
		i=$pi_dir/$i
		echo "Running postinst $i..."
		[ "$POSTINST_LOGGING" = "1" ] && eval echo "Running postinst $i..." $append_log
		if [ -x $i ]; then
			(sh -c $i $append_log)
			rm $i
		else
			echo "ERROR: postinst $i failed."
			[ "$POSTINST_LOGGING" = "1" ] && eval echo "ERROR: postinst $i failed." $append_log
			remove_rcsd_link=0
		fi
	done
}

remove_rcsd_link=1
if $pm_installed; then
	case $pm in
		"ipk")
			eval opkg configure $append_log
			;;

		"deb")
			eval dpkg --configure -a $append_log
			;;
	esac
else
	exec_postinst_scriptlets
fi

# since all postinstalls executed successfully, remove the rcS.d link
if [ $remove_rcsd_link = 1 ]; then
	remove_rcsd_link
fi
