#!/bin/sh
#
# Copyright 2005 VMware, Inc.  All rights reserved.
#

# Basic support for IRIX style chkconfig 
# chkconfig: 3 62 30
# description: Initialization for tools requiring later startup
# Must be run before xinetd starts up.

# load system helper functions.
. /etc/init.d/functions
. /etc/init.d/vmware-functions
. /etc/vmware/init/bin/functions.sh

PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH

WATCHDOG=/usr/bin/vmware-watchdog
VOBD_MEM_USAGE_PARAM="--sched.mem.min=0 --sched.mem.max=100"
STORAGERM_MEM_USAGE_PARAM="--sched.mem.min=0 --sched.mem.max=50 --sched.memSizeLimit=50"
SENSORD_MEM_USAGE_PARAM="--sched.mem.min=0 --sched.mem.max=12"

# Start sensord
start_sensord() {
   # In case sensord was already running, stop it first.
   stop_sensord
   # Run sensord in a userworld.
   $WATCHDOG -s sensord /usr/lib/vmware/bin/vmkload_app $SENSORD_MEM_USAGE_PARAM /usr/lib/vmware/bin/sensord > /dev/null 2>&1 &
}

# Stop sensord
stop_sensord() {
   $WATCHDOG -k sensord > /dev/null 2>&1
   KillUWShadowProcess "/usr/lib/vmware/bin/sensord"
}

# Start storageRM
start_storageRM() {
   # In case storageRM was already running, stop it first.
   stop_storageRM
   # Run storageRM in a userworld.
   $WATCHDOG -s storageRM /usr/lib/vmware/bin/vmkload_app $STORAGERM_MEM_USAGE_PARAM /usr/lib/vmware/bin/storageRM > /dev/null 2>&1 &
}

# Stop storageRM
stop_storageRM() {
   $WATCHDOG -k storageRM > /dev/null 2>&1
   KillUWShadowProcess "/usr/lib/vmware/bin/storageRM"
}

# Start vobd
start_vobd() {
   # In case vobd was already running, stop it first.
   stop_vobd
   # Run vobd in a userworld because we don't have poll() for the vob char device.
   $WATCHDOG -s vobd /usr/lib/vmware/bin/vmkload_app  $VOBD_MEM_USAGE_PARAM /usr/lib/vmware/bin/vobd > /dev/null 2>&1 &
}

# Stop vobd
stop_vobd() {
   $WATCHDOG -k vobd > /dev/null 2>&1
   KillUWShadowProcess "/usr/lib/vmware/bin/vobd"
}

# Start vprobed 
start_vprobed() {
   $WATCHDOG -s vprobed /usr/lib/vmware/bin/vprobed > /dev/null 2>&1 &
}

stop_vprobed() {
   $WATCHDOG -k vprobed > /dev/null 2>&1
   killall vprobed > /dev/null 2>&1
   killall vprobed-data > /dev/null 2>&1
}

# Start the VMware kernel's logger
start_vmkernel_logger() {
   $WATCHDOG -k vmklogger > /dev/null 2>&1
   killall vmklogger  > /dev/null 2>&1
   $WATCHDOG -s vmklogger /usr/sbin/vmklogger &
}

stop_vmkernel_logger() {
   $WATCHDOG -k vmklogger > /dev/null 2>&1
   killall vmklogger  > /dev/null 2>&1
}

# Start CDP packet monitoring
start_net_cdp() {
   stop_net_cdp
   $WATCHDOG -s cdp /usr/lib/vmware/bin/vmkload_app /usr/lib/vmware/bin/net-cdp &
}

# Stop CDP packet monitoring
stop_net_cdp() {
   $WATCHDOG -k cdp > /dev/null 2>&1
}

# Start LBT NIC teaming
start_net_lbt() {
   stop_net_lbt
   $WATCHDOG -s net-lbt /usr/lib/vmware/bin/vmkload_app /usr/lib/vmware/bin/net-lbt &
}

# Stop LBT NIC teaming
stop_net_lbt() {
   $WATCHDOG -k net-lbt > /dev/null 2>&1
   killall net-lbt > /dev/null 2>&1
}

# Start vmkeventd
start_vmkeventd() {
   # In case vmkeventd was already running, stop it first.
   stop_vmkeventd
   $WATCHDOG -s vmkeventd /usr/lib/vmware/bin/vmkeventd -t > /dev/null 2>&1 &
}

# Stop vmkeventd
stop_vmkeventd() {
   $WATCHDOG -k vmkeventd > /dev/null 2>&1
   killall vmkeventd  > /dev/null 2>&1
}

# Start the IKEv2 daemons
start_ike() {
   stop_ike
   $WATCHDOG -s spmd /usr/lib/vmware/bin/vmkload_app -i vmktcp /sbin/spmd &
   $WATCHDOG -s iked /usr/lib/vmware/bin/vmkload_app -i vmktcp /sbin/iked &
}

# Stop the IKEv2 daemons
stop_ike() {
   killall -2 iked > /dev/null 2>&1
   killall -2 spmd > /dev/null 2>&1
}

#
# log a message to the summary log
#
summaryLog() {
   TIME=`date +"%s"`
   logger -p "local6.info" "($TIME)" $1
}


# Inform the vmkernel of the hostname and ip address.
vmkernel_late_config() {
  /etc/cron.hourly/updatevmkip

  # Now that all FS drivers are loaded, rescan the storage fabric to
  # discover supported FS volumes.
  vmkfstools -V

  if [ $buildType != "release" ] ; then
      # verify vsi
     /usr/lib/vmware/bin/vsi_traverse -s > /dev/null
  fi 
}


# Start vmkdump services
start_vmkdump() {
  local devname=`/usr/sbin/esxcfg-dumppart --get-config | cut -f1`
  local curTime

  if [ -z "$devname" ]; then
    return 1
  fi

  curTime=`date "+%m%d%y.%H.%M"`
  zDumpName="$vmkdump_dir"/vmkernel-zdump-"$curTime"
  /usr/sbin/esxcfg-dumppart --copy \
           --zdumpname $zDumpName \
           --devname /vmfs/devices/disks/$devname   \
           --newonly >> /tmp/dumppart.log 2>&1

  # log an error to the summary log if we find a core file
  if [ -e  "$zDumpName.1" ]; then
     summaryLog "VMkernel error"
  fi

  action "   VMware dump partition" /usr/sbin/esxcfg-dumppart -S
}

# Load upper level storage drivers
start_storage() {
  # Mount /vmfs.  
  mount -n -t vmfs /vmfs /vmfs

  action "   Restoring SCSI Paths" /usr/sbin/esxcfg-mpath -r
}

# XXX: temporary fix till we get the new init process
start_fpt() {
   if test -f /etc/vmware/esx.conf; then
      for d in `grep '"passthru"' /etc/vmware/esx.conf | cut -d/ -f3`; do
         echo "$d to passthru"
         vmkchdev -p $d
      done
   fi
}

start() {

   # Start vmkeventd. It may be an NFS symlink, so start it here in late script.
   action "   Starting vmkeventd" start_vmkeventd

   # Start vobd. It may be an NFS symlink, so start it here in late script.
   action "   Starting vobd" start_vobd

   # Start vprobed
   action "   Starting vprobed" start_vprobed

   # Start storageRM
   action "   Starting storageRM module" start_storageRM
 
   # Start sensord
   action "   Starting sensord" start_sensord
   
   start_storage

   action "Starting VMware late init tools" /bin/true

   start_vmkdump 

   action "   Restoring Resource Groups" /usr/sbin/esxcfg-resgrp -r

   vmkernel_late_config

   start_vmkernel_logger

   start_net_cdp

   start_net_lbt 

   #remote NAS volumes
   action "   Restoring NAS volumes" /usr/sbin/esxcfg-nas -r

   #s/w based iscsi volumes
   action "   Restoring S/W iscsi volumes" /usr/sbin/esxcfg-swiscsi -r

   #restore path state of SW iSCSI devices
   action "   Restoring S/W iscsi path/device state" /usr/sbin/esxcfg-mpath -r

   #clear pending flag from installed VIBs.
   action "   Updating esxupdate database" /usr/sbin/esxupdate clearpending

   mkdir -p /var/log/oldconf
   cp -f /etc/vmware/esx.conf /var/log/oldconf/esx.conf.`date +"%F_%T"`

   # force load parallel port driver
   /sbin/modprobe parport_pc > /dev/null 2>&1
   /sbin/modprobe ppdev > /dev/null 2>&1

   # Load page classification module
   do_module_file pclassify

   # XXX: change ownership for passthru devices
   start_fpt

   summaryLog "loaded VMkernel"

   # Switching to Welcome Screen
   chvt 11

   exit 0
}

stop() {
   action "Stopping VMware late init tools" /bin/true
   stop_net_cdp
   stop_net_lbt
   stop_vmkeventd
   stop_vobd
   stop_vprobed
   stop_storageRM
   stop_sensord
   stop_vmkernel_logger
}

if isTroubleMode ; then
   action "Skipping $productName late-init services." /bin/true
   exit 1
fi

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

   stop)
	stop
        ;;

   status)
	echo "none"
	;;

   restart)
	"$0" stop && "$0" start
	;;
   *)
	echo "Usage: `basename "$0"` {start|stop|status|restart}"
	exit 1
esac

exit 0
