# helper library for notamock

pgrep_wait(){
	[ -z "$1" ] && return
	while pgrep $1 >/dev/null ; do
		echo -n '.'
		sleep 1
	done
	echo ''
}

vecho() {
	[ "$VERBOSE" ] && echo "==> $(basename $0): $@"
}

vrun() {
	vecho "run: $@"
	$@
}

waitfor(){
	while [ -f "$1" ] ; do
		echo "$2"
		sleep 5
	done
}

echo_exit() {
	echo "==> $(basename $0): $@"
	exit $2
}

chroot_internal() {
	for a in dev sys proc ; do
		mkdir -p ${1}/$a
		mount -o bind /$a ${1}/$a
	done
	mkdir -p ${1}/etc/
	cp /etc/resolv.conf ${1}/etc/
	chroot $@
}

build_new_rootfs() {
	vecho "Build new rootfs: ${BASE}/$ROOTFSNAME"
	if [ -f ${BASE}/${ROOTFSNAME}.lock ] ; then
		waitfor "${BASE}/${ROOTFSNAME}.lock" "==> $(basename $0): waiting while another notamock process update rootfs"
	else
		echo "==> $(basename $0): create new ${BASE}/${ROOTFSNAME}"
		rm -rf ${BASE}/$ROOTFSNAME
		mkdir -p ${BASE}/$ROOTFSNAME
		: > "${BASE}/${ROOTFSNAME}.lock"
		if vrun $PM_install  $PM_root_opt ${BASE}/$ROOTFSNAME $PM_opts $PM_list ; then 
			NEWROOTFS=yes
			rm -f "${BASE}/${ROOTFSNAME}.lock"
			return 0
		fi
		rm -f "${BASE}/${ROOTFSNAME}.lock"
		return 1
	fi
}

update_rootfs() {
	vecho "update direct ${BASE}/$ROOTFSNAME"
	if [ $UPD == 'yes' -a  "$REUSABLE" != 'yes' ] ; then
		echo "==> $(basename $0): update ${BASE}/${ROOTFSNAME} directly"
		: > "${BASE}/${ROOTFSNAME}.lock"
		if vrun $PM_update $PM_root_opt ${BASE}/$ROOTFSNAME  $PM_opts ; then
			rm -f "${BASE}/${ROOTFSNAME}.lock"
			return 0
		fi
		rm -f "${BASE}/${ROOTFSNAME}.lock"
		return 1
	fi
}

clear_overlay() {
	ECODE=0
	timeout=1
	# ten attempts to unmount
	for qqq in $(seq 10) ; do
		echo -n '.'
		for a in dev sys proc $@ ; do
			umount ${OVERLAY}/$a 
		done
		umount ${OVERLAY} 
		rmdir ${OVERLAY}
		[ -d ${OVERLAY} ] || break
		sleep $timeout
		timeout=$(( $timeout + 1 ))
	done >/dev/null 2>&1
	[ -d ${OVERLAY} ] && echo "==> $(basename $0): Using lazy umount  $OVERLAY" || echo ''
	vrun umount -l ${OVERLAY} 2>/dev/null
	rmdir ${OVERLAY} 2>/dev/null
	if [ "$REUSABLE" != 'yes' ] ; then
		[ -d $OVERLAY ] || rm -rf ${BUILD_DIR}
		[ -d $BUILD_DIR ] && ECODE=1
	else
		[ -d $OVERLAY ] || rm -rf ${WORKDIR}
		[ -d $WORKDIR ] && ECODE=1
	fi
	rm -f /run/notamock_$PLATFORM
	rm -f "${BASE}/${ROOTFSNAME}.lock"
	echo "==> $(basename $0): Clear rootfs: $ECODE" 1>&2
	return $ECODE
}

full_clear_tmp(){
	vecho "Clear $TMPD"
	if [ "$TMPD" -a "$TMPD" != '/' ] ; then
		for a in $(ls -1 $TMPD) ; do
			umount ${TMPD}/$a/* 2>/dev/null
			umount ${TMPD}/$a
		done
		grep 'overlay.*'$TMPD /proc/mounts |cut -f2 -d ' ' |while read ovl ; do
			vrun umount -l $ovl || umounterror=yes
		done
		if [ $umounterror ] ; then
			echo "==> $(basename $0): cannot unmount some overlay fs from $TMPD"
			exit ${LINENO}
		else
			echo "==> $(basename $0): clear $TMPD"
			rm -rf  ${TMPD}
			mkdir -p ${TMPD}
		fi
	fi
}

inter_mount() {
	local a MP from to
	for a in $(echo $BIND |sed 's/,/ /g') ; do
		unset MP
		a="$(echo $a |sed 's/:\+/:/')" # one or more ":" as separator
		from="$(echo $a |cut -f1 -d ':')"
		to="$(echo $a |cut -f2 -d ':')"
		mkdir -p "${OVERLAY}/$to"
		params="$(echo $a |cut -f '3-100' -d ':')"
		if [ -d "$from" ] ; then
			[ -n "$params" ] && params=",$(echo $params |sed 's/:/,/g')"
			vrun mount -o bind"$params"  "$from" "${OVERLAY}$to" && MP=$to
		elif [ -b "$from" ] ; then
			[ -n "$params" ] && params="-o $(echo $params |sed 's/:/,/g')"
			vrun mount "$params"  "$from" "${OVERLAY}$to" && MP=$to
		else
			# try to mount as loop (iso, img, squashfs)
			[ -n "$params" ] && params=",$(echo $params |sed 's/: /,/g')"
			vrun mount -o loop"$params"  "$from" "${OVERLAY}$to" && MP=$to
		fi
		[ "$MP" ] && MBINDS="$MBINDS $MP"
	done
}
