#!/bin/bash
#########################################################
# 	     vmware-buslogic-config 			#
# This scripts configures the BusLogic driver for all   #
# installed kernels, it also removes the driver for     #
# uninstalled kernels.					#
#########################################################
#  Usage:					 	#
#	$> vmware-buslogic-config 			#
#########################################################

thisScript="vmware-buslogic-config"

#Install driver for given kernel
installForKernelVer()
{
	
	kernelVer=${1}	

	initrdimg="/boot/initrd-${kernelVer}.img"

	#Pre-install
	#
	#check for enough space in /boot
	#
	boot_avail=$(df -B 1 /boot/ | tail -1 |awk '{print $(NF-2)}')
	if [ -f /boot/${initrdimg} ]
	then
		initrd_size=$(ls -l ${initrdimg} | awk '{print $5}')
	        remain=$(expr ${boot_avail} / ${initrd_size})
	
	        if [ $remain -le "2" ]
	        then
	        	echo "${thisScript}: Not enough space in /boot to backup ${initrdimg}"
		       	echo "${thisScript}: Not Cannot install new initrd"
        	        exit 1
        	fi
	fi

	# install the driver
	if [ ! -d /lib/modules/${kernelVer}/updates ]
	then
		mkdir /lib/modules/${kernelVer}/updates
		if [ $? -ne 0 ]
		then
			echo "${thisScript}: mkdir /lib/modules/${kernelVer}/updates Failed."
			exit
		fi
	fi
	cp -f /usr/lib/vmware/BusLogic/${kernelVer}/i686/BusLogic.ko /lib/modules/${kernelVer}/updates/
	if [ $? -ne 0 ]
	then
		echo "${thisScript}: cp /usr/lib/vmware/BusLogic/${kernelVer}/i686/BusLogic.ko /lib/modules/${kernelVer}/updates/ Failed."
		exit 3
	fi
	
	#Post-install
	#
	#Update dependenies...

	/sbin/depmod ${kernelVer}
	if [ $? -ne 0 ]
	then
		echo "${thisScript}: /sbin/depmod ${kernelVer} Failed."
		exit 5
	fi
	
	#Create new initrd backup the existing one
	#Build new initrd
	#
	/sbin/mkinitrd -f ${initrdimg}.buslogic ${kernelVer} >& /dev/null
	if [ $? -ne 0 ]
	then
		rm -f ${initrdimg}.buslogic
	        echo "${thisScript}: Failed to build the new initrd for ${kernelVer} kernel"
	        exit 7
	fi
	
	if [ ! -e ${initrdimg}.prebuslogic ]
	then
		ln ${initrdimg} ${initrdimg}.prebuslogic
		echo "${thisScript}: Backed up ${initrdimg} as ${initrdimg}.prebuslogic before recreating."
	fi	

	mv -f ${initrdimg}.buslogic ${initrdimg}
	if [ $? -ne 0 ]
	then	
		echo "${thisScript}: mv -f ${initrdimg}.buslogic ${initrdimg} Failed."
		exit 9
	fi
}


#Uninstall driver for a given kernel
uninstallForKernelVer()
{
	kernelVer=${1}

	initrdimg="/boot/initrd-${kernelVer}.img"

	#Remove the driver
	if [ -e /lib/modules/${kernelVer}/updates/BusLogic.ko ]
	then
		rm -f /lib/modules/${kernelVer}/updates/BusLogic.ko

		#Update dependencies
		/sbin/depmod ${kernelVer}
		if [ $? -ne 0 ]
		then
			echo "${thisScript}: /sbin/depmod ${kernelVer} Failed."
			exit 11
		fi

		#Restore original initrd...
		if [ -f ${initrdimg}.prebuslogic ]
		then
			rm -f ${initrdimg}.prebuslogic
			if [ $? -ne 0 ]
			then
				echo "${thisScript}: rm -f ${initrdimg}.prebuslogic Failed."
				exit 13
			fi
		fi
	fi
}

main()
{
	kernelVer=""
	kernelsInstalled=$(rpm -q --whatprovides kernel | grep -f /usr/lib/vmware/BusLogic/kvers )
	#UP kernel
	kernelup="$(echo "${kernelsInstalled}"  | grep -v smp | grep -v hugemem | sed 's/kernel-//g' | tr '\n' ' ')"	
	#SMP kernels
	kernelsmp="$(echo "${kernelsInstalled}" | grep smp |  sed 's/kernel-smp-//g' | tr '\n' ' ')"
	#HUGEMEM kernels
	kernelhugemem="$(echo "${kernelsInstalled}" | grep hugemem | sed 's/kernel-hugemem-//g' | tr '\n' ' ')"

	#Build list of kernel version to work on
	for ver in ${kernelup}
	do
		kernelVer="${kernelVer} ${ver}"
	done
	for ver in ${kernelsmp}
	do
		ver=${ver}smp
        	kernelVer="${kernelVer} ${ver}"
	done
       	for ver in ${kernelhugemem}
        do
               	ver=${ver}hugemem
       	        kernelVer="${kernelVer} ${ver}"
        done

	for ver in ${kernelVer}
	do
		if [ -e /boot/vmlinuz-${ver} ]
		then
			if [ ! -e /lib/modules/${ver}/updates/BusLogic.ko ]
			then
				installForKernelVer ${ver}
			fi
		else
			if [ -e /lib/modules/${ver}/updates/BusLogic.ko ]
			then
				uninstallForKernelVer ${ver}
			fi
		fi
	done
	
}

if [ `id -u` -eq 0 ]
then
	export PATH="/bin:/sbin:/usr/bin:/usr/sbin"
	cd /
	main
else
	echo "${thisScript}: Only a super user can run this script"
	echo
fi 
	


