#!/bin/sh
#
# open-vm-tools	Helper scripts for open-vm-tools
#
# chkconfig:	345 90 20
#
# description:	Helper scripts for open-vm-tools
#
# $Id$

# Source function library.
. /etc/rc.d/init.d/functions

RETVAL=0

is_ESX_running() {
    if [ ! -f /usr/bin/vmware-checkvm ] ; then
	echo no
	return
    fi
    
    if /usr/bin/vmware-checkvm -p | grep -q ESX; then
	echo yes
    else
	echo no
    fi
}

module_exist() {
	module=$1
	kver=`uname -r`
	[ -f /lib/modules/$kver/misc/$module.ko* ] && echo "yes" || echo "no"
}

start_vmxnet() {
	# Check if the service is already running?
	if [ ! -f /var/lock/subsys/open-vm-tools-vmxnet ]; then
		msg_starting "Open Virtual Machine vmxnet script"
		busy
		if is_no `module_exist vmxnet`; then
			fail
			echo -e "\tCan't find vmxnet module"
			RETVAL=1
			return
		fi

		for ethif in `ifconfig -a | grep ^eth | cut -d' ' -f1`; do
			/sbin/ethtool -K $ethif tso on > /dev/null 2>&1
		done
		ok
		touch /var/lock/subsys/open-vm-tools-vmxnet
	else
		msg_already_running "Open Virtual Machine vmxnet script"
	fi
}

stop_vmxnet() {
	if [ -f /var/lock/subsys/open-vm-tools-vmxnet ]; then
		msg_stopping "Open Virtual Machine vmxnet script"
		busy
		rm -f /var/lock/subsys/open-vm-tools-vmxnet
		ok
	else
		msg_not_running "Open Virtual Machine vmxnet script"
	fi
}

start_vmblock() {
	# vmblock is not required and unsupported on ESX so first check
	# if it's installed then try to use
	is_no `module_exist vmblock` && return

	# Check if the service is already running?
	if [ ! -f /var/lock/subsys/open-vm-tools-vmblock ]; then
		_modprobe single vmblock
		msg_starting "Open Virtual Machine vmblock script"
		busy
		mkdir -p /tmp/VMwareDnD
		chmod 1777 /tmp/VMwareDnD
		mount -t vmblock none /proc/fs/vmblock/mountPoint
		RETVAL=$?
		[ $RETVAL -eq 0 ] && touch /var/lock/subsys/open-vm-tools-vmblock && ok && return
		fail
	else
		msg_already_running "Open Virtual Machine vmblock script"
	fi
}

stop_vmblock() {
	is_no `module_exist vmblock` && return

	if [ -f /var/lock/subsys/open-vm-tools-vmblock ]; then
		msg_stopping "Open Virtual Machine vmblock script"
		busy
		umount /proc/fs/vmblock/mountPoint
		RETVAL=$?
		[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/open-vm-tools-vmblock && ok && return
		fail
	else
		msg_not_running "Open Virtual Machine vmblock script"
	fi
}

start_vmhgfs() {
	# vmhgfs is not required and usupported on ESX so first check
	# if it's installed then try to use
	is_no `module_exist vmhgfs` && return

	# Check if the service is already running?
	if [ ! -f /var/lock/subsys/open-vm-tools-vmhgfs ]; then
		_modprobe single vmhgfs
		msg_starting "Open Virtual Machine vmhgfs script"
		busy
		mkdir -p /mnt/hgfs
		mount -t vmhgfs .host:/ /mnt/hgfs
		RETVAL=$?
		[ $RETVAL -eq 0 ] && touch /var/lock/subsys/open-vm-tools-vmhgfs && ok && return
		fail
	else
		msg_already_running "Open Virtual Machine vmhgfs script"
	fi
}

stop_vmhgfs() {
	is_no `module_exist vmhgfs` && return

	if [ -f /var/lock/subsys/open-vm-tools-vmhgfs ]; then
		msg_stopping "Open Virtual Machine vmhgfs script"
		busy
		umount /mnt/hgfs
		RETVAL=$?
		[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/open-vm-tools-vmhgfs && ok && return
		fail
	else
		msg_not_running "Open Virtual Machine vmhgfs script"
	fi
}

start_vmsync() {
	# Check if the service is already running?
	if [ ! -f /var/lock/subsys/open-vm-tools-vmsync ]; then
		_modprobe single vmsync
		msg_starting "Open Virtual Machine vmsync script"
		daemon /usr/bin/vmtoolsd --background /var/run/vmtoolsd.pid
		RETVAL=$?
		[ $RETVAL -eq 0 ] && touch /var/lock/subsys/open-vm-tools-vmsync
	else
		msg_already_running "Open Virtual Machine vmsync script"
	fi
}

stop_vmsync() {
	if [ -f /var/lock/subsys/open-vm-tools-vmsync ]; then
		msg_stopping "Open Virtual Machine vmsync script"
		killproc --pidfile vmtoolsd.pid vmtoolsd
		rm -f /var/lock/subsys/open-vm-tools-vmsync
	else
		msg_not_running "Open Virtual Machine vmsync script"
	fi
}

start() {
	start_vmxnet
	if is_no `is_ESX_running`; then
		start_vmblock
		start_vmhgfs
	fi
	_modprobe single vmware_vmmemctl
	_modprobe single vmci
	_modprobe single vsock
	_modprobe single vmw_pvscsi
	start_vmsync
}

stop() {
	stop_vmxnet
	stop_vmblock
	stop_vmhgfs
	stop_vmsync
}

# See how we were called.
case "$1" in
  start)
	start
	;;
  stop)
  	stop
	;;
  restart)
  	stop
  	start
  	;;
  *)
	msg_usage "$0 {start|stop|restart}"
	exit 3
esac

exit $RETVAL
