View | Details | Raw Unified
Collapse All | Expand All

(-) services.sh (-711 / +51 lines)
 Lines 1-338    Link Here 
#!/bin/sh
#!/sbin/runscript
#
#
# Copyright (C) 1998-2002 VMware, Inc.  All Rights Reserved.
# Copyright (C) 1998-2002 VMware, Inc.  All Rights Reserved.
# Updated by stuart@gentoo.org to support Gentoo Linux
#
#
# This script manages the services needed to run VMware software
# $Header: /var/cvsroot/gentoo-x86/app-emulation/vmware-linux-tools/files/5.0.0/vmware-linux-tools,v 1.1 2005/04/30 21:26:48 stuart Exp $
# Basic support for IRIX style chkconfig
# chkconfig: 3 90 08
# description: Manages the services needed to run VMware software
# Basic support for the Linux Standard Base Specification 1.0.0 (to be used by
# insserv for exemple)
### BEGIN INIT INFO
# Provides: VMware_Tools
# Required-Start:
# Required-Stop: $network
# Default-Start: 3 5
# Default-Stop:
# Description: Manages the services needed to run VMware Tools
### END INIT INFO
# BEGINNING_OF_TMPDIR_DOT_SH
#!/bin/sh
# Create a temporary directory
#
#
# They are a lot of small utility programs to create temporary files in a
# This script manages the services needed to run VMware software
# secure way, but none of them is standard. So I wrote this --hpreg
make_tmp_dir() {
  local dirname="$1" # OUT
  local prefix="$2"  # IN
  local tmp
  local serial
  local loop
  tmp="${TMPDIR:-/tmp}"
  # Don't overwrite existing user data
  # -> Create a directory with a name that didn't exist before
  #
  # This may never succeed (if we are racing with a malicious process), but at
  # least it is secure
  serial=0
  loop='yes'
  while [ "$loop" = 'yes' ]; do
    # Check the validity of the temporary directory. We do this in the loop
    # because it can change over time
    if [ ! -d "$tmp" ]; then
      echo 'Error: "'"$tmp"'" is not a directory.'
      echo
      exit 1
    fi
    if [ ! -w "$tmp" -o ! -x "$tmp" ]; then
      echo 'Error: "'"$tmp"'" should be writable and executable.'
      echo
      exit 1
    fi
    # Be secure
    # -> Don't give write access to other users (so that they can not use this
    # directory to launch a symlink attack)
    if mkdir -m 0755 "$tmp"'/'"$prefix$serial" >/dev/null 2>&1; then
      loop='no'
    else
      serial=$(($serial + 1))
      if [ "$(($serial % 200))" = '0' ]; then
        echo 'Warning: The "'"$tmp"'" directory may be under attack.'
        echo
      fi
    fi
  done
  eval "$dirname"'="$tmp"'"'"'/'"'"'"$prefix$serial"'
}
# END_OF_TMPDIR_DOT_SH
vmware_etc_dir=/etc/vmware-tools
# Since this script is installed, our main database should be installed too and
# should contain the basic information
vmware_db="$vmware_etc_dir"/locations
if [ ! -r "$vmware_db" ]; then
    echo 'Warning: Unable to find '"`vmware_product_name`""'"'s main database '"$vmware_db"'.'
    echo       
    
    exit 1
fi
# BEGINNING_OF_DB_DOT_SH
#!/bin/sh
#
# Manage an installer database
#
# Add an answer to a database in memory
db_answer_add() {
  local dbvar="$1" # IN/OUT
  local id="$2"    # IN
  local value="$3" # IN
  local answers
  local i
  eval "$dbvar"'_answer_'"$id"'="$value"'
  eval 'answers="$'"$dbvar"'_answers"'
  # There is no double quote around $answers on purpose
  for i in $answers; do
    if [ "$i" = "$id" ]; then
      return
    fi
  done
  answers="$answers"' '"$id"
  eval "$dbvar"'_answers="$answers"'
}
# Remove an answer from a database in memory
db_answer_remove() {
  local dbvar="$1" # IN/OUT
  local id="$2"    # IN
  local new_answers
  local answers
  local i
  eval 'unset '"$dbvar"'_answer_'"$id"
  new_answers=''
  eval 'answers="$'"$dbvar"'_answers"'
  # There is no double quote around $answers on purpose
  for i in $answers; do
    if [ "$i" != "$id" ]; then
      new_answers="$new_answers"' '"$i"
    fi
  done
  eval "$dbvar"'_answers="$new_answers"'
}
# Load all answers from a database on stdin to memory (<dbvar>_answer_*
# variables)
db_load_from_stdin() {
  local dbvar="$1" # OUT
  eval "$dbvar"'_answers=""'
  # read doesn't support -r on FreeBSD 3.x. For this reason, the following line
  # is patched to remove the -r in case of FreeBSD tools build. So don't make
  # changes to it. -- Jeremy Bar
  while read -r action p1 p2; do
    if [ "$action" = 'answer' ]; then
      db_answer_add "$dbvar" "$p1" "$p2"
    elif [ "$action" = 'remove_answer' ]; then
      db_answer_remove "$dbvar" "$p1"
    fi
  done
}
# Load all answers from a database on disk to memory (<dbvar>_answer_*
# variables)
db_load() {
  local dbvar="$1"  # OUT
  local dbfile="$2" # IN
  db_load_from_stdin "$dbvar" < "$dbfile"
}
# Iterate through all answers in a database in memory, calling <func> with
# id/value pairs and the remaining arguments to this function
db_iterate() {
  local dbvar="$1" # IN
  local func="$2"  # IN
  shift 2
  local answers
  local i
  local value
  eval 'answers="$'"$dbvar"'_answers"'
  # There is no double quote around $answers on purpose
  for i in $answers; do
    eval 'value="$'"$dbvar"'_answer_'"$i"'"'
    "$func" "$i" "$value" "$@"
  done
}
# If it exists in memory, remove an answer from a database (disk and memory)
db_remove_answer() {
  local dbvar="$1"  # IN/OUT
  local dbfile="$2" # IN
  local id="$3"     # IN
  local answers
  local i
  eval 'answers="$'"$dbvar"'_answers"'
  # There is no double quote around $answers on purpose
  for i in $answers; do
    if [ "$i" = "$id" ]; then
      echo 'remove_answer '"$id" >> "$dbfile"
      db_answer_remove "$dbvar" "$id"
      return
    fi
  done
}
# Add an answer to a database (disk and memory)
db_add_answer() {
  local dbvar="$1"  # IN/OUT
  local dbfile="$2" # IN
  local id="$3"     # IN
  local value="$4"  # IN
  db_remove_answer "$dbvar" "$dbfile" "$id"
  echo 'answer '"$id"' '"$value" >> "$dbfile"
  db_answer_add "$dbvar" "$id" "$value"
}
# Add a file to a database on disk
# 'file' is the file to put in the database (it may not exist on the disk)
# 'tsfile' is the file to get the timestamp from, '' if no timestamp
db_add_file() {
  local dbfile="$1" # IN
  local file="$2"   # IN
  local tsfile="$3" # IN
  local date
  if [ "$tsfile" = '' ]; then
    echo 'file '"$file" >> "$dbfile"
  else
    date=`date -r "$tsfile" '+%s' 2> /dev/null`
    if [ "$date" != '' ]; then
      date=' '"$date"
    fi
    echo 'file '"$file$date" >> "$dbfile"
  fi
}
# Add a directory to a database on disk
db_add_dir() {
  local dbfile="$1" # IN
  local dir="$2"    # IN
  echo 'directory '"$dir" >> "$dbfile"
}
# END_OF_DB_DOT_SH
db_load 'vmdb' "$vmware_db"
# This comment is a hack to prevent RedHat distributions from outputing
# "Starting <basename of this script>" when running this startup script.
# We just need to write the word daemon followed by a space --hpreg.
# This defines echo_success() and echo_failure() on RedHat
if [ -r "$vmdb_answer_INITSCRIPTSDIR"'/functions' ]; then
    . "$vmdb_answer_INITSCRIPTSDIR"'/functions'
fi
# This defines $rc_done and $rc_failed on S.u.S.E.
if [ -f /etc/rc.config ]; then
   # Don't include the entire file: there could be conflicts
   rc_done=`(. /etc/rc.config; echo "$rc_done")`
   rc_failed=`(. /etc/rc.config; echo "$rc_failed")`
else
   # Make sure the ESC byte is literal: Ash does not support echo -e
   rc_done=' done'
   rc_failed='failed'
fi
#
# Global variables
#
vmmemctl="vmmemctl"
vmxnet="vmxnet"
vmhgfs="vmhgfs"
GUESTD_PID_FILE='/var/run/vmware-guestd.pid'
#
# Utilities
#
# BEGINNING_OF_IPV4_DOT_SH
#!/bin/sh
#
# IPv4 address functions
#
# Thanks to Owen DeLong <owen@delong.com> for pointing me at bash's arithmetic
# expansion ability, which is a lot faster than using 'expr' --hpreg
#
# Compute the subnet address associated to a couple IP/netmask
ipv4_subnet() {
  local ip="$1"
  local netmask="$2"
  # Split quad-dotted addresses into bytes
  # There is no double quote around the back-quoted expression on purpose
  # There is no double quote around $ip and $netmask on purpose
  set -- `IFS='.'; echo $ip $netmask`
  echo $(($1 & $5)).$(($2 & $6)).$(($3 & $7)).$(($4 & $8))
}
# Compute the broadcast address associated to a couple IP/netmask
VMWARE_ETC_DIR=/etc/vmware-tools
ipv4_broadcast() {
VMWARE_BIN_DIR=/usr/bin
  local ip="$1"
VMWARE_SBIN_DIR=/usr/sbin
  local netmask="$2"
VMWARE_LIB_DIR=/usr/lib/vmware-tools
  # Split quad-dotted addresses into bytes
  # There is no double quote around the back-quoted expression on purpose
  # There is no double quote around $ip and $netmask on purpose
  set -- `IFS='.'; echo $ip $netmask`
  echo $(($1 | (255 - $5))).$(($2 | (255 - $6))).$(($3 | (255 - $7))).$(($4 | (255 - $8)))
VMWARE_GUESTD_PID=/var/run/vmware-guestd.pid
}
VMWARE_GUESTD_BIN=${VMWARE_SBIN_DIR}/vmware-guestd
# END_OF_IPV4_DOT_SH
VMWARE_CHECKVM_BIN=${VMWARE_SBIN_DIR}/vmware-checkvm
# Are we running in a VM?
VMWARE_CONFIG_TOOLS=${VMWARE_BIN_DIR}/vmware-config-tools.pl
vmware_inVM() {
  "$vmdb_answer_SBINDIR"/vmware-checkvm >/dev/null 2>&1
}
# This is a function in case a future product name contains language-specific
VMWARE_VMHGFS_MOD=vmhgfs
# escape characters.
vmware_product_name() {
  echo 'VMware Tools'
  exit 0
}
#
VMWARE_NOT_CONFIGURED=${VMWARE_ETC_DIR}/not_configured
# Count the number of running virtual machines
# by looking at the number of references to the
# $driver module.
#
countVMs() {
    # Beware of module dependancies here. An exact match is important
    /sbin/lsmod | awk 'BEGIN {n = 0;} {if ($1 == "'"$driver"'") n = $3;} END {print n;}'
}
# Is a given module loaded?
# Is a given module loaded?
isLoaded() {
isLoaded() {
 Lines 341-753    Link Here 
  /sbin/lsmod | awk 'BEGIN {n = "no";} {if ($1 == "'"$module"'") n = "yes";} END {print n;}'
  /sbin/lsmod | awk 'BEGIN {n = "no";} {if ($1 == "'"$module"'") n = "yes";} END {print n;}'
}
}
# Build a Linux kernel integer version
vmware_tools_load_module() {
kernel_version_integer() {
  echo $(((($1 * 256) + $2) * 256 + $3))
}
# Get the running kernel integer version
get_version_integer() {
  local version_uts
  local v1
  local v2
  local v3
  version_uts=`uname -r`
  # There is no double quote around the back-quoted expression on purpose
  # There is no double quote around $version_uts on purpose
  set `IFS='.'; echo $version_uts`
  v1="$1"
  v2="$2"
  v3="$3"
  # There is no double quote around the back-quoted expression on purpose
  # There is no double quote around $v3 on purpose
  set `IFS='-ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz'; echo $v3`
  v3="$1"
  kernel_version_integer "$v1" "$v2" "$v3"
}
vmware_failed() {
  if [ "`type -t 'echo_failure' 2>/dev/null`" = 'function' ]; then
    echo_failure
  else
    echo -ne "$rc_failed"
  fi
}
vmware_success() {
  if [ "`type -t 'echo_success' 2>/dev/null`" = 'function' ]; then
    echo_success
  else
    echo -ne "$rc_done"
  fi
}
# Execute a macro
vmware_exec() {
  local msg="$1"  # IN
  local func="$2" # IN
  shift 2
  echo -n '   '"$msg"
  # On Caldera 2.2, SIGHUP is sent to all our children when this script exits
  # I wanted to use shopt -u huponexit instead but their bash version
  # 1.14.7(1) is too old
  #
  # Ksh does not recognize the SIG prefix in front of a signal name
  if [ "$VMWARE_DEBUG" = 'yes' ]; then
    (trap '' HUP; "$func" "$@")
  else
    (trap '' HUP; "$func" "$@") >/dev/null 2>&1
  fi
  if [ "$?" -gt 0 ]; then
    vmware_failed
    echo
    return 1
  fi
  vmware_success
  echo
  return 0
}
# Execute a macro in the background
vmware_bg_exec() {
  local msg="$1"  # IN
  local func="$2" # IN
  shift 2
  if [ "$VMWARE_DEBUG" = 'yes' ]; then
    # Force synchronism when debugging
    vmware_exec "$msg" "$func" "$@"
  else
    echo -n '   '"$msg"' (background)'
    # On Caldera 2.2, SIGHUP is sent to all our children when this script exits
    # I wanted to use shopt -u huponexit instead but their bash version
    # 1.14.7(1) is too old
    #
    # Ksh does not recognize the SIG prefix in front of a signal name
    (trap '' HUP; "$func" "$@") 2>&1 | logger -t 'VMware[init]' -p daemon.err &
    vmware_success
    echo
    return 0
  fi
}
#
# Macro definitions
#
# Note:
#  . Each daemon must be started from its own directory to avoid busy devices
#  . Each PID file doesn't need to be added to the installer database, because
#    it is going to be automatically removed when it becomes stale (after a
#    reboot). It must go directly under /var/run, or some distributions
#    (RedHat 6.0) won't clean it
#
# Terminate a process synchronously
vmware_synchrone_kill() {
  local pid="$1"    # IN
  local signal="$2" # IN
  local second
  kill -"$signal" "$pid"
  # Wait a bit to see if the dirty job has really been done
  for second in 0 1 2 3 4 5 6 7 8 9 10; do
    if [ ! -d /proc/"$pid" ]; then
      # Success
      return 0
    fi
    sleep 1
  done
  # Timeout
  return 1
}
# Kill the process associated to a pidfile
vmware_stop_pidfile() {
  local pidfile="$1" # IN
  local pid
  pid=`cat "$pidfile" 2>/dev/null`
  if [ "$pid" = '' ]; then
    # The file probably does not exist or is empty. Success
    return 0
  fi
  # Keep only the first number we find, because some Samba pid files are really
  # trashy: they end with NUL characters
  # There is no double quote around $pid on purpose
  set $pid
  pid="$1"
  # First try a nice SIGTERM
  if vmware_synchrone_kill "$pid" 15; then
    return 0
  fi
  # Then send a strong SIGKILL
  if vmware_synchrone_kill "$pid" 9; then
    return 0
  fi
  return 1
}
# Be sure we enable DMA on all the disks for best performance.
vmware_start_dma() {
  if [ -x /sbin/hdparm ]; then
     /sbin/hdparm -d 1 /dev/hda > /dev/null 2>&1
     /sbin/hdparm -d 1 /dev/hdb > /dev/null 2>&1
     /sbin/hdparm -d 1 /dev/hdc > /dev/null 2>&1
     /sbin/hdparm -d 1 /dev/hdd > /dev/null 2>&1
  fi
  exit 0
}
vmware_load_module() {
   if [ "`isLoaded "$1"`" = 'yes' ]; then
   if [ "`isLoaded "$1"`" = 'yes' ]; then
      /sbin/rmmod "$1"
      /sbin/rmmod "$1"
   fi
   fi
   /sbin/insmod -s -f "/lib/modules/`uname -r`/misc/$1.o" >/dev/null 2>&1 || /sbin/insmod -s -f "$1" >/dev/null 2>&1 || exit 1
   /sbin/insmod -s -f "/lib/modules/`uname -r`/misc/$1.o" >/dev/null 2>&1 || /sbin/insmod -s -f "$1" >/dev/null 2>&1 || exit 1
   exit 0
}
}
vmware_unload_module() {
vmware_tools_unload_module() {
   if [ "`isLoaded "$1"`" = 'yes' ]; then
   if [ "`isLoaded "$1"`" = 'yes' ]; then
      /sbin/rmmod "$1" >/dev/null 2>&1 || exit 1
      /sbin/rmmod "$1" >/dev/null 2>&1 || exit 1
   fi
   fi
   exit 0
}
}
# Start the virtual ethernet kernel service
depend ()
vmware_start_vmxnet() {
{
   # only load vmxnet if it's not already loaded
	before checkfs
   if [ "`isLoaded "$vmxnet"`" = 'no' ]; then
     vmware_load_module $vmxnet
   fi
}
}
# Stop the virtual ethernet kernel service
checkconfig ()
# XXX Might want to stop the network in case the device is
{
#     configured.
	if [ -f $VMWARE_NOT_CONFIGURED ]; then
vmware_stop_vmxnet() {
		eerror "Please run $VMWARE_CONFIG_TOOLS first"
  vmware_unload_module $vmxnet
		eend 1
}
		return 1
	fi
vmware_switch() {
	if ! $VMWARE_CHECKVM_BIN > /dev/null 2>&1 ; then
  "$vmdb_answer_BINDIR"/vmware-config-tools.pl --switch
		eerror "Not running inside vmware"
  exit 0
		eend 1
		return 1
	fi
}
}
# Start the guest virtual memory manager
start ()
vmware_start_vmmemctl() {
{
  vmware_load_module $vmmemctl
	checkconfig || exit 1
}
# Stop the guest virtual memory manager
	ebegin "Loading vmware filesystem"
vmware_stop_vmmemctl() {
	vmware_tools_load_module $VMWARE_VMHGFS_MOD
  vmware_unload_module $vmmemctl
	eend $?
}
# Start the guest filesystem driver
	ebegin "Starting vmware guestd"
vmware_start_vmhgfs() {
	start-stop-daemon -b --quiet -m --pidfile ${VMWARE_GUESTD_PID} --start --startas ${VMWARE_GUESTD_BIN}
   # only load vmhgfs if it's not already loaded
	eend $?
   if [ "`isLoaded "$vmhgfs"`" = 'no' ]; then
     vmware_load_module $vmhgfs
   fi
}
# Unmount all hgfs filesystems left mounted
vmware_unmount_vmhgfs() {
   # This emulates 'umount -a -t vmware-hgfs' but with /proc/mounts instead of /etc/mtab
   cat /proc/mounts | while read dev path fs rest; do
      case "$fs" in
         vmware-hgfs)
            umount "$path"
            ;;
         *)
            ;;
      esac
   done
}
}
# Stop the guest filesystem driver
stop ()
vmware_stop_vmhgfs() {
{
  vmware_unmount_vmhgfs
	ebegin "Stopping vmware guestd"
  vmware_unload_module $vmhgfs
	start-stop-daemon --stop --pidfile ${VMWARE_GUESTD_PID} -x ${VMWARE_GUESTD_BIN}
}
	eend $?
#
	ebegin "Unloading vmware filesystem"
# Note:
	vmware_tools_unload_module $VMWARE_VMHGFS_MOD
#  . Each daemon must be started from its own directory to avoid busy devices
	eend $?
#  . Each PID file doesn't need to be added to the installer database, because
#    it is going to be automatically removed when it becomes stale (after a
#    reboot). It must go directly under /var/run, or some distributions
#    (RedHat 6.0) won't clean it
#
# Start the guest OS daemon
vmware_start_guestd() {
  cd "$vmdb_answer_SBINDIR" && "$vmdb_answer_SBINDIR"/vmware-guestd \
    --background "$GUESTD_PID_FILE"
}
# Stop the guest OS daemon
vmware_stop_guestd() {
  if vmware_stop_pidfile "$GUESTD_PID_FILE"; then
    rm -f "$GUESTD_PID_FILE"
  fi
}
is_ESX_running() {
  if "$vmdb_answer_SBINDIR"/vmware-checkvm -p | grep -q ESX; then
    echo yes
  else
    echo no
  fi
}
}
is_vmhgfs_needed() {
reload ()
  local min_kver=`kernel_version_integer '2' '4' '0'`
{
  local run_kver=`get_version_integer`
	stop ; start
  if [ "`is_ESX_running`" = 'yes' ]; then
    echo no
  else
    if [ $min_kver -le $run_kver -a "$vmdb_answer_VMHGFS_CONFED" = 'yes' ]; then
      echo yes
    else
      echo no
    fi
  fi
}
}
is_vmmemctl_needed() {
  if [ "`is_ESX_running`" = 'yes' -a "$vmdb_answer_VMMEMCTL_CONFED" = 'yes' ]; then
    echo yes
  else
    echo no
  fi
}
is_vmxnet_needed() {
  cat /proc/bus/pci/devices | grep -qi "^[0-9a-f]*	15ad0720	"
  if [ "$?" -eq 0 -a "$vmdb_answer_VMXNET_CONFED" = 'yes' ]; then
    echo yes
  else
    echo no
  fi
}
# See how we were called.
case "$1" in
  start)
    exitcode='0'
    if vmware_inVM; then
      if [ -e "$vmware_etc_dir"/not_configured ]; then
        echo "`vmware_product_name`"' is installed, but it has not been '
        echo '(correctly) configured for the running kernel.'
        echo 'To (re-)configure it, invoke the following command: '
        echo "$vmdb_answer_BINDIR"'/vmware-config-tools.pl.'
        echo
        exit 1
      fi
      echo 'Starting VMware Tools services in the virtual machine:'
      vmware_exec 'Switching to guest configuration:' vmware_switch
      exitcode=$(($exitcode + $?))
      if [ "`is_vmhgfs_needed`" = 'yes' ]; then
        vmware_exec 'Guest filesystem driver:' vmware_start_vmhgfs
        exitcode=$(($exitcode + $?))
      fi
      if [ "`is_vmmemctl_needed`" = 'yes' ]; then
        vmware_exec 'Guest memory manager:' vmware_start_vmmemctl
        exitcode=$(($exitcode + $?))
      fi
      if [ "`is_vmxnet_needed`" = 'yes' ]; then
        vmware_exec 'Guest vmxnet fast network device:' vmware_start_vmxnet
        exitcode=$(($exitcode + $?))
      fi
      vmware_exec 'DMA setup:' vmware_start_dma
      exitcode=$(($exitcode + $?))
      vmware_exec 'Guest operating system daemon:' vmware_start_guestd
      exitcode=$(($exitcode + $?))
    else
      echo 'Starting VMware Tools services on the host:'
      vmware_exec 'Switching to host config:' vmware_switch
      exitcode=$(($exitcode + $?))
    fi
    if [ "$exitcode" -gt 0 ]; then
      # Set the 'not configured' flag
      touch "$vmware_etc_dir"'/not_configured'
      chmod 644 "$vmware_etc_dir"'/not_configured'
      db_add_file "$vmware_db" "$vmware_etc_dir"'/not_configured' \
        "$vmware_etc_dir"'/not_configured'
      exit 1
    fi
  ;;
  stop)
    exitcode='0'
    if vmware_inVM; then
      echo 'Stopping VMware Tools services in the virtual machine:'
      vmware_exec 'Guest operating system daemon:' vmware_stop_guestd
      exitcode=$(($exitcode + $?))
      if [ "`is_vmhgfs_needed`" = 'yes' ]; then
        vmware_exec 'Guest filesystem driver:' vmware_stop_vmhgfs
        exitcode=$(($exitcode + $?))
      fi
      if [ "`is_vmmemctl_needed`" = 'yes' ]; then
        vmware_exec 'Guest memory manager:' vmware_stop_vmmemctl
        exitcode=$(($exitcode + $?))
      fi
      if [ "`is_vmxnet_needed`" = 'yes' ]; then
        if [ -x "$vmdb_answer_INITSCRIPTSDIR"'/network' ]; then
          "$vmdb_answer_INITSCRIPTSDIR"/network stop
        fi
        vmware_exec 'Guest vmxnet fast network device:' vmware_stop_vmxnet
        exitcode=$(($exitcode + $?))
      fi
    else
      echo -n 'Skipping VMware Tools services shutdown on the host:'
      vmware_success
      echo
    fi
    if [ "$exitcode" -gt 0 ]; then
      exit 1
    fi
  ;;
  status)
    status "vmware-guestd"
  ;;
  restart)
    "$0" stop && "$0" start
  ;;
  *)
    echo "Usage: `basename "$0"` {start|stop|status|restart}"
    exit 1
esac
exit 0