# Copyright (C) 2006 OpenWrt.org
# Copyright (C) 2010 Vertical Communications

missing_lines() {
	local file1 file2 line
	file1="$1"
	file2="$2"
	oIFS="$IFS"
	IFS=":"
	while read line; do
		set -- $line
		grep -q "^$1:" "$file2" || echo "$*"
	done < "$file1"
	IFS="$oIFS"
}

do_mount_root() {
	mount_root
	[ "$?" -eq 0 ] || reboot -f
	boot_run_hook preinit_mount_root
	[ -f /sysupgrade.tgz ] && {
		echo "- config restore -"
		cp /etc/passwd /etc/group /etc/shadow /tmp
		mkdir -p /tmp/conffiles
		cd /tmp/conffiles
		tar xzf /sysupgrade.tgz
		find $(sed -ne '/^[[:space:]]*$/d; /^#/d; s/^\///; p' \
			/etc/sysupgrade.conf /lib/upgrade/keep.d/* 2>/dev/null) \
			-type f -o -type l 2>/dev/null | sort -u > whitelist.txt
		tar czf /sysupgrade.tgz -T whitelist.txt
		cd /
		rm -rf /tmp/conffiles
		tar xzf /sysupgrade.tgz
		missing_lines /tmp/passwd /etc/passwd >> /etc/passwd
		missing_lines /tmp/group /etc/group >> /etc/group
		missing_lines /tmp/shadow /etc/shadow >> /etc/shadow
		rm /tmp/passwd /tmp/group /tmp/shadow
		# Prevent configuration corruption on a power loss
		sync
	}
}

[ "$INITRAMFS" = "1" ] || boot_hook_add preinit_main do_mount_root
