#! /bin/sh

PATH=/usr/sbin:/usr/bin:/sbin:/bin
. /lib/init/vars.sh

. /lib/lsb/init-functions

umask 022

full_live=/live/bin/live-umount
[ -x $full_live ] || continue
exec $full_live --umountfs >/dev/tty1 2>/dev/tty1

PROTECTED_MOUNTS="$(sed -n ':a;/^[^ ]* \/ /!{H;n;ba};{H;s/.*//;x;s/\n//;p}' /proc/mounts)"
WEAK_MTPTS="" # be gentle, don't use force
REG_MTPTS=""
TMPFS_MTPTS=""
while read -r DEV MTPT FSTYPE REST
do
	echo "$PROTECTED_MOUNTS" | grep -qsF "$DEV $MTPT " && continue
	case "$MTPT" in
		 /|/usr|/proc|/dev|/.dev|/dev/pts|/dev/shm|/dev/.static/dev|/proc/*|/sys|/sys/*|/run|/run/lock|/run/shm|/run/rpc_pipefs|/dev/vcs)
		continue
		;;
	esac
	case "$FSTYPE" in
		 proc|procfs|linprocfs|sysfs|securityfs|usbfs|usbdevfs|devpts)
		continue
		;;
		 tmpfs)
		TMPFS_MTPTS="$MTPT $TMPFS_MTPTS"
		;;
		 *)
		if echo "$PROTECTED_MOUNTS" | grep -qs "^$DEV "; then
			WEAK_MTPTS="$MTPT $WEAK_MTPTS"
		else
			REG_MTPTS="$MTPT $REG_MTPTS"
		fi
		;;
	esac
done < /proc/mounts

#
# Make sure tmpfs file systems are umounted before turning off
# swap, to avoid running out of memory if the tmpfs filesystems
# use a lot of space.
#
if [ "$TMPFS_MTPTS" ]
then
	if [ "$VERBOSE" = no ]
	then
		log_action_begin_msg "Unmounting temporary filesystems"
		fstab-decode umount $TMPFS_MTPTS
		log_action_end_msg $?
	else
		log_daemon_msg "Will now unmount temporary filesystems"
		fstab-decode umount -v $TMPFS_MTPTS
		log_end_msg $?
	fi
fi

#
# Deactivate swap
#
if [ "$VERBOSE" = no ]
then
	log_action_begin_msg "Deactivating swap"
	swapoff -a >/dev/null
	log_action_end_msg $?
else
	log_daemon_msg "Will now deactivate swap"
	swapoff -a -v
	log_end_msg $?
fi

#
# Unmount local filesystems
#
if [ "$WEAK_MTPTS" ]; then
	# Do not use -f umount option for WEAK_MTPTS
	if [ "$VERBOSE" = no ]
	then
		log_action_begin_msg "Unmounting weak filesystems"
		fstab-decode umount -r -d $WEAK_MTPTS
		log_action_end_msg $?
	else
		log_daemon_msg "Will now unmount weak filesystems"
		fstab-decode umount -v -r -d $WEAK_MTPTS
		log_end_msg $?
	fi
fi
if [ "$REG_MTPTS" ]
then
	if [ "$VERBOSE" = no ]
	then
		log_action_begin_msg "Unmounting local filesystems"
		fstab-decode umount -f -r -d $REG_MTPTS
		log_action_end_msg $?
	else
		log_daemon_msg "Will now unmount local filesystems"
		fstab-decode umount -f -v -r -d $REG_MTPTS
		log_end_msg $?
	fi
fi
