#! /bin/sh
#
# Copyright Matthias Hentges <devel@hentges.net> (c) 2006
# License: GPL (see http://www.gnu.org/licenses/gpl.txt for a copy of the license)
#
# Filename: 40-bootNFS
# Date: 14-Apr-06


M_TITLE="Boot from NFS"

die() {
	echo -e "ERROR: $1" >/dev/tty0
	exec $SH_SHELL </dev/tty0 >/dev/tty0 2>&1
}

# This function is activated by init.altboot by calling this script with the "run" option
run_module() {

	test -e /etc/altboot.func && . /etc/altboot.func || die "ERROR: /etc/altboot.func not found. Check your installation!"

	# Mount /proc, etc
	init_rootfs

	# Needed for NFS
	/etc/init.d/portmap start >/dev/null 2>&1 || die "/etc/init.d/portmap start failed!"
	
	# For some reason NFS mounts hang if /e/i/networking is not run.
	# For the time beeing I'm too lazy to investigate ;)
	/etc/init.d/networking start >/dev/null 2>&1 || die "/etc/init.d/networking start failed!"
	
	sleep 2
	
	# After the PCMCIA service is started, an inserted WLAN card should automatically
	# activate itself.
	
	if test -x /etc/init.d/pcmcia
	then
		/etc/init.d/pcmcia start >/dev/null 2>&1 || die "/etc/init.d/pcmcia start failed!"
	else	
		# With kernel 2.6.16+ udev is used 
		/etc/init.d/udev start >/dev/null 2>&1 || die "/etc/init.d/udev start failed!"
		
		/etc/init.d/udev stop
	fi
	
	nfs_host="`cat /etc/fstab | grep -v ^# | grep nfs | awk '{print $1}'|sed -n "s/\(.*\)\:\(.*\)/\1/p" `"
	nfs_mounts="`cat /etc/fstab | grep -v ^# | grep nfs | awk '{print $1}'`"
	nfs_mountpoints="`cat /etc/fstab | grep -v ^# | grep nfs | awk '{print $2}'`"	
	
	WLAN_NIC="`iwconfig 2>/dev/null | grep ESSID | awk '{print $1}'`"
	
	if test -z "$nfs_host"
	then
		die "${C_RED}No configured NFS drives found in /etc/fstab$C_RESET"
		
	fi
	
	# WLAN with DHCP needs some time to get a lease, set up the routing, etc.	
	echo -n "Waiting for WLAN"
	cnt=0
	while true
	do
		if (ping -c 1 $nfs_host) >/dev/null 2>&1
		then
			echo " found"
			break
		else
			if test "$cnt" = 30 -o "$cnt" = 60
			then
				echo ""
				echo "WARNING: WLAN didn't activate in $cnt seconds!"
				
				if test "$cnt" = 30
				then
					let cnt=$cnt+1
					echo "Restarting udhcpc for [$WLAN_NIC]"
					killall udhcpc
					
					udhcpc -i "$WLAN_NIC" -H `cat /etc/hostname` >/dev/tty1 2>&1
					
					
				else
					mdie "Failed to activate WLAN!"
					break			
				fi
			else
				echo -n "."
				let cnt=$cnt+1
			fi
		fi
		sleep 1
	done				
	
	if test "` echo "$nfs_mountpoints" |wc -l | tr -d " "`" -gt 1
	then
		echo -e "Please select your NFS root:\n"

		cnt=1
		for nfs_mount in $nfs_mountpoints
		do
			echo -e "\t[$cnt] $nfs_mount"
			let cnt=$cnt+1
		done
		
		echo ""
		
		while test -z "$selection"
		do
			stty echo
			echo -n "Boot NFS root: "
			
			if test "$AUTOBOOT" != "yes"
			then
				read junk < /dev/tty1
			else
				if test -e /etc/.altboot-bootNFS-source.last
				then
					junk="`cat /etc/.altboot-bootNFS-source.last`"
					test -z "$junk" && read junk < /dev/tty1 || echo "$junk (autoboot)"
				else
					read junk < /dev/tty1
				fi
			fi	
				
			
			cnt=1
			for nfs_mount in $nfs_mounts
			do
				if test "$junk" = "$cnt"
				then
					selection="$nfs_mount"
					echo "$junk" > /etc/.altboot-bootNFS-source.last
				fi
				let cnt=$cnt+1
			done			
			
		done
	else
		test -z "$nfs_mounts" && die "No NFS mounts configured in /etc/fstab!"	
		selection="$nfs_mounts"
	fi
	
	mkdir -p /media/nfsroot || die "mkdir -p /media/nfsroot failed!"
	
	echo -n "Mounting NFS root..."
	
	if ( mount | grep -q "/media/nfsroot" )
	then
		echo "/media/nfsroot already used, tying to umount..."
		umount /media/image
		losetup -d /dev/loop0
		umount /media/nfsroot || die "umount failed!"
	fi
		
	mount -t nfs "$selection" /media/nfsroot && echo ok || die "mount -t nfs "$selection" /media/nfsroot failed!"
	
	# Use configured resolv.conf in the pivoted rootfs
	#echo -n "Copying resolv.conf..."
	#cp /etc/resolv.conf /media/nfsroot/etc && echo ok || echo "FAILED"
	
	check_target "/media/nfsroot" bootNFS
	
}	

case "$1" in
title)	echo "$M_TITLE";;
run)	run_module "$2";;
esac

