#!/bin/sh
#
#    
# -----------------------------------------------
# $Id: ctl-rwmode.sh,v 1.1 2008/02/15 11:03:29 pv Exp $
# -----------------------------------------------

RETVAL=0

TMPSIZE=10M
TMPMOUNT=/tmpram
DIRLIST="/var/local /var/log /var/lock /var/tmp /var/run"
INITDIRLIST="$DIRLIST /dev"

UNIONFS=aufs
uname -r | grep -q 2.6.12 && UNIONFS=unionfs


usage()
{
	echo "${0##*/} {init|on|off|help}"
	echo "on - umount $UNIONFS dirs, mount in rw after"
	echo "off - mount in tw, mount $UNIONFS dirs after"
}

trymount()
{
	local point=$1
	grep -q $point /proc/mounts && return 0
	mount ${point} || return 1
}

remount()
{
	local point=$1
	local mode=$2
	mount -n -o remount,${mode} ${point} || return 1
}

create_ramdir()
{
	# skip mount if already done
	grep -q $TMPMOUNT /proc/mounts && return 0

	mount -n -t tmpfs -o rw,size=$TMPSIZE tmpfs $TMPMOUNT || return 1
	for d in $INITDIRLIST; do
		mkdir -p $TMPMOUNT/$d/ || return 1
	done
}

mount_tmpdir()
{
	local dir="$1"
	mount none $dir/ -n -t $UNIONFS -o dirs=$TMPMOUNT/$dir/=rw:$dir/=ro || return 1
	chmod 775 $dir/
}

mount_ramdir()
{
	for d in $DIRLIST; do
		mount_tmpdir "$d" || echo "Warning: failed to mount tmp dir for '$d'"
	done
}

init_ramdir()
{
	local mode=${1-ro}
	remount / $mode || RETVAL=1
	create_ramdir || RETVAL=1
}

init_dev()
{
	mount_tmpdir /dev
	trymount /dev/pts
}

umount_ramdir()
{
	echo "Note: umount some dir, wait failure if the dir is busy"
	for d in $DIRLIST; do
		umount $d/
	done
}

# See how we were called.
case "$1" in

	init)
		if [ "$2" != "rw" ]; then
			init_ramdir
			mount_ramdir || RETVAL=1
		else
			init_ramdir "rw"
		fi
		;;

	dev)
		init_dev
		;;

	on)
		echo "Warning: Mount in Read Write maintained mode."
		umount_ramdir || RETVAL=1
		remount / rw || RETVAL=1
		;;

	off)
		remount / ro || RETVAL=1
		mount_ramdir || RETVAL=1
		;;

	-h|--help|help)
		usage
		;;
	*)
		RETVAL=1
esac

exit $RETVAL
