#!/bin/sh

# Persistence enhancer script
# This script saves precious time on slow persistence devices/image files
# and writes on flash based device.
# a tmpfs on $PERSTMP is mounted and directories listed in
# /etc/live-persistence.binds will be copied there and then bind mounted back.

#set -e

# initramfs-tools header

PREREQ=""

prereqs()
{
	echo "${PREREQ}"
}

case "${1}" in
	prereqs)
		prereqs
		exit 0
		;;
esac

# live-initramfs header

if [ -z "${PERSISTENT}" ] || [ -n "${NOPERSISTENT}" ] || [ -z "${PERSISTENCE_IS_ON}" ] || [ ! -f /root/etc/live-persistence.binds ]
then
	exit 0
fi

. /scripts/live-functions

# live-initramfs script

dirs="$(sed -e '/^ *$/d' -e '/^#.*$/d' /root/etc/live-persistence.binds | tr '\n' '\0')"
if [ -z "${dirs}" ]
then
	exit 0
fi

log_begin_msg "Moving persistence bind mounts"

PERSTMP="/root/live/persistence-binds"
CPIO="/bin/cpio"

if [ ! -d "${PERSTMP}" ]
then
	mkdir -p "${PERSTMP}"
fi

mount -t tmpfs tmpfs "${PERSTMP}"

for dir in $(echo "${dirs}" | tr '\0' '\n')
do
	if [ ! -e "/root/${dir}" ] && [ ! -L "/root/${dir}" ]
	then
		# directory do not exists, create it
		mkdir -p "/root/${dir}"
	elif [ ! -d "/root/${dir}" ]
	then
		# it is not a directory, skip it
		break
	fi

	# Copy previous content if any
	cd "/root/${dir}"
	find . -print0 | ${CPIO} -pumd0 "${PERSTMP}/${dir}"
	cd "${OLDPWD}"

	# Bind mount it to origin
	mount -o bind "${PERSTMP}/${dir}" "/root/${dir}"
done

log_end_msg
