#!/bin/sh
+
#
# Copyright 1998 VMware, Inc. All rights reserved.
#
-# vmware: Manages the services needed to run VMware software
+# vmnet: Manages the services needed to run VMware networking
#
-# description: Manages the services needed to run VMware software
+# description: Manages the services needed to run VMware networking
#
-# chkconfig: 5 90 8
+# chkconfig: 235 90 8
#
# probe: true
# hide: true
-
-. /etc/rc.d/init.d/functions
-
-#
-# Create a temporary directory
-#
-
-# They are a lot of small utility programs to create temporary files in a
-# 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=`expr "$serial" + 1`
- if [ "`expr "$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
-
-#
-# From now on, this is a normal startup script. I swear.
-#
-
-# 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
-
-#
-# 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 folowing line is patched to remove the -r in case of
-# Free BSD tools build. Please look at
-# bora-vmsoft/install/FreeBSD/tools-tar.make before making drastic changes to
-# the folowing line.
-# -- 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='\e[71G done'
- rc_failed='\e[71Gfailed'
-fi
-
-subsys=vmware
+subsys=vmnet
driver=vmmon
-ppuser=vmppuser
vnet=vmnet
bridge=vmnet-bridge
dhcpd=vmnet-dhcpd
smbd=vmware-smbd
nmbd=vmware-nmbd
+# Source config files
+vmware_etc_dir=/etc/vmware
+vmware_locations="$vmware_etc_dir"/locations
+vmnet_cfg="$vmware_etc_dir"/vmnet.conf
+
+for f in $vmware_locations $vmnet_cfg; do
+ if [ -r $f ]; then
+ . $f
+ else
+ echo "FATAL: Unable to read $f"
+ exit 1
+ fi
+done
+
+# System wide functions
+. /etc/rc.d/init.d/functions
+
+# Create /dev/vmnetXX device
+vmware_create_vmnet() {
+ local vHubNr="$1" # IN
+ local vDevice="/dev/vmnet$vHubNr"
+
+ if [ ! -e "$vDevice" ]; then
+ mknod -m 600 "$vDevice" c 119 "$vHubNr"
+ fi
+}
+
#
-# Utilities
+# Create a temporary directory
#
-# BEGINNING_OF_IPV4_DOT_SH
+# They are a lot of small utility programs to create temporary files in a
+# 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=`expr "$serial" + 1`
+ if [ "`expr "$serial" % 200`" = '0' ]; then
+ echo 'Warning: The "'"$tmp"'" directory may be under attack.'
+ echo
+ fi
+ fi
+ done
+ eval "$dirname"'="$tmp"'"'"'/'"'"'"$prefix$serial"'
+}
#
-# 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
+# Utilities
#
# Compute the subnet address associated to a couple IP/netmask
ipv4_subnet() {
- local ip="$1"
- local netmask="$2"
+ 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))
+ # 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
ipv4_broadcast() {
- 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 | (255 - $5))).$(($2 | (255 - $6))).$(($3 | (255 - $7))).$(($4 | (255 - $8)))
-}
-
-# END_OF_IPV4_DOT_SH
-
-# Are we running in a VM?
-vmware_inVM() {
- "$vmware_etc_dir"/checkvm >/dev/null 2>&1
-}
+ local ip="$1"
+ local netmask="$2"
-# This is a function in case a future product name contains language-specific
-# escape characters.
-vmware_product_name() {
- echo 'VMware Workstation'
- exit 0
+ # 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)))
}
-
-#
-# Count the number of running virtual machines
-# by looking at the number of references to the
-# $driver module.
-#
+# 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?
-isLoaded() {
- local module="$1"
-
- /sbin/lsmod | awk 'BEGIN {n = "no";} {if ($1 == "'"$module"'") n = "yes";} END {print n;}'
+ # Beware of module dependancies here. An exact match is important
+ /sbin/lsmod | awk 'BEGIN {n = 0;} {if ($1 == "'"$driver"'") n = $3;} END {print n;}'
}
# Check if there is an IP route for a given subnet via a given interface
# Return true if there is _NO_ such route
noRoutePresent() {
- local subnet="$1" # IN
- local intf="$2" # IN
-
- # Beware, there may be several identical routes
- [ "`/sbin/route -n | grep '^'"$subnet"'.*'"$intf"'$'`" = '' ]
-}
-
-#
-# Check that the IP address we are going to assign to the host machine on
-# a private IP network does not already exist
-#
-# NB: If you don't want to do this test, just substitute
-# false for it.
-#
-lookForHostOnlyNetwork() {
- local ip="$1"
-
- "$vmdb_answer_BINDIR"/"$ping" -q "$ip"
-}
-
-# Build a Linux kernel integer version
-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"
-}
-
-# Do we need the ppuser module?
-isPpuserNeeded() {
- local version_integer
-
- version_integer=`get_version_integer`
- echo $(((`kernel_version_integer '2' '1' '127'` <= $version_integer) && ($version_integer <= `kernel_version_integer '2' '3' '9'`)))
-}
-
-vmware_failed() {
- if [ "`type -t 'echo_failure' 2>/dev/null`" = 'function' ]; then
- echo_failure
- else
- echo -n "$rc_failed"
- fi
-}
-
-vmware_success() {
- if [ "`type -t 'echo_success' 2>/dev/null`" = 'function' ]; then
- echo_success
- else
- echo -n "$rc_done"
- fi
-}
+ local subnet="$1" # IN
+ local intf="$2" # IN
-# 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
+ # Beware, there may be several identical routes
+ [ "`/sbin/route -n | grep '^'"$subnet"'.*'"$intf"'$'`" = '' ]
}
-# 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:
# 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
+ 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
-}
-
-vmware_load_module() {
-# /sbin/insmod -s -f "/lib/modules/`uname -r`/misc/$1.o" || exit 1
- /sbin/modprobe $1 || exit 1
-# exit 0
-}
-
-vmware_unload_module() {
- if [ "`isLoaded "$1"`" = 'yes' ]; then
- /sbin/rmmod "$1" || exit 1
- fi
- exit 0
-}
-
-# Start the virtual machine monitor kernel service
-vmware_start_vmmon() {
- vmware_load_module $driver
-}
-
-# Stop the virtual machine monitor kernel service
-vmware_stop_vmmon() {
- vmware_unload_module $driver
-}
-
-# Start the virtual machine parallel port kernel service
-vmware_start_vmppuser() {
- if ! grep -q ' parport_release[^'$'\t'']*$' /proc/ksyms; then
- # parport support is not built in the kernel
- /sbin/modprobe parport || exit 1
- fi
- if ! grep -q ' parport_pc_[^'$'\t'']*$' /proc/ksyms; then
- # parport_pc support is not built in the kernel
- /sbin/modprobe parport_pc || exit 1
- fi
- vmware_load_module $ppuser
-}
-
-# Stop the virtual machine parallel port kernel service
-vmware_stop_vmppuser() {
- if [ "`isLoaded "$ppuser"`" = 'yes' ]; then
- /sbin/rmmod "$ppuser" || exit 1
- fi
- # Try to unload the modules. Failure is allowed because some other process
- # could be using them.
- /sbin/modprobe -r parport_pc
- /sbin/modprobe -r parport
-
- # Return the right exitcode even if the previous commands failed
- exit 0
-}
-
-# Start the virtual ethernet kernel service
-vmware_start_vmnet() {
- vmware_load_module $vnet
-}
-
-# Stop the virtual ethernet kernel service
-vmware_stop_vmnet() {
- vmware_unload_module $vnet
-}
-
-# Create a virtual host ethernet interface and connect it to a virtual
-# ethernet hub
-vmware_start_netifup() {
- local vHostIf="$1" # IN
- local vHubNr="$2" # IN
-
- cd "$vmdb_answer_BINDIR" && "$vmdb_answer_BINDIR"/"$netifup" \
- -d /var/run/"$netifup"-"$vHostIf".pid /dev/vmnet"$vHubNr" "$vHostIf"
-}
-
-# Disconnect a virtual host ethernet interface from a virtual ethernet hub
-# and destroy the virtual host ethernet interface
-vmware_stop_netifup() {
- local vHostIf="$1" # IN
-
- vmware_stop_pidfile /var/run/"$netifup"-"$vHostIf".pid
-}
-
-# Connect a physical host ethernet interface to a virtual ethernet hub
-vmware_start_bridge() {
- local vHubNr="$1" # IN
- local pHostIf="$2" # IN
-
- cd "$vmdb_answer_BINDIR" && "$vmdb_answer_BINDIR"/"$bridge" \
- -d /var/run/"$bridge"-"$vHubNr".pid /dev/vmnet"$vHubNr" "$pHostIf"
-}
-
-# Disconnect a physical host ethernet interface from a virtual ethernet hub
-vmware_stop_bridge() {
- local vHubNr="$1" # IN
-
- vmware_stop_pidfile /var/run/"$bridge"-"$vHubNr".pid
-}
-
-# Start a SMB name server on a private IP network
-vmware_start_nmbd() {
- local vHostIf="$1" # IN
-
- # Disable logging to avoid the uncontrolled creation of unmanaged files
- cd "$vmdb_answer_BINDIR" && "$vmdb_answer_BINDIR"/"$nmbd" -D -l /dev/null \
- -s "$vmware_etc_dir"/"$vHostIf"/smb/smb.conf \
- -f /var/run/"$nmbd"-"$vHostIf".pid
-}
-
-# Stop a SMB name server on a private IP network
-vmware_stop_nmbd() {
- local vHostIf="$1" # IN
-
- vmware_stop_pidfile /var/run/"$nmbd"-"$vHostIf".pid
-}
-
-# Start a SMB share server on a private IP network
-vmware_start_smbd() {
- local vHostIf="$1" # IN
-
- # Disable logging to avoid the uncontrolled creation of unmanaged files
- cd "$vmdb_answer_BINDIR" && "$vmdb_answer_BINDIR"/"$smbd" -D -l /dev/null \
- -s "$vmware_etc_dir"/"$vHostIf"/smb/smb.conf \
- -f /var/run/"$smbd"-"$vHostIf".pid
-}
-
-# Stop a SMB share server on a private IP network
-vmware_stop_smbd() {
- local vHostIf="$1" # IN
-
- vmware_stop_pidfile /var/run/"$smbd"-"$vHostIf".pid
-}
-
-# Start a DHCP server on a private IP network
-vmware_start_dhcpd() {
- local vHostIf="$1" # IN
-
- # The daemon already logs its output in the system log, so we can safely
- # trash it
- cd "$vmdb_answer_BINDIR" && "$vmdb_answer_BINDIR"/"$dhcpd" \
- -cf "$vmware_etc_dir"/"$vHostIf"/dhcpd/dhcpd.conf \
- -lf "$vmware_etc_dir"/"$vHostIf"/dhcpd/dhcpd.leases \
- -pf /var/run/"$dhcpd"-"$vHostIf".pid "$vHostIf" >/dev/null 2>&1
-}
+ local pidfile="$1" # IN
+ local pid
-# Stop a DHCP server on a private IP network
-vmware_stop_dhcpd() {
- local vHostIf="$1" # IN
-
- vmware_stop_pidfile /var/run/"$dhcpd"-"$vHostIf".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
}
# Start the host-only network user service
vmware_start_hostonly() {
- local vHubNr="$1" # IN
- local vHostIf="$2" # IN
- local ifIp="$3" # IN
- local ifMask="$4" # IN
- local run_dhcpd="$5" # IN
- local run_samba="$6" # IN
- local ifNet
-
- #
- # Do a cursory check to see if the host-only network
- # configuration is still ok. We do this so that mobile
- # hosts don't get setup at install time and then moved to
- # a new locale where the host-only network config is no
- # longer valid.
- #
- # NB: This really needs to be done at power-on time when
- # VM is configured to use host-only networking so that
- # we aren't fooled by dynamic changes in the network.
- #
- # XXX ping takes 10 seconds to timeout if nobody answers
- # that slows boot too much so we do this bit in the
- # background.
- #
- if lookForHostOnlyNetwork "$ifIp"; then
- echo 'Host-only networking disabled because '"$ifIp"
- echo 'appears to be a real, physical, existing address.'
- echo 'Please run "'"$vmdb_answer_BINDIR"'/vmware-config.pl" to'
- echo 'modify your host-only network configuration.'
- exit 1
- fi
-
- vmware_start_netifup "$vHostIf" "$vHubNr" || exit 1
-
- # Configure the virtual host ethernet interface and define the private IP
- # network
- #
- # . We provide the broadcast address explicitly because versions of ifconfig
- # prior to 1.39 (1999-03-18) seem to miscompute it
- # . 2.0.x kernels don't install a route when the interface is marked up, but
- # 2.2.x kernel do. Since we want to see any errors from route we don't
- # just discard messages from route, but instead check if the route got
- # installed before manually adding one.
- ifNet=`ipv4_subnet "$ifIp" "$ifMask"`
- if ifconfig "$vHostIf" inet "$ifIp" netmask "$ifMask" \
- broadcast "`ipv4_broadcast "$ifIp" "$ifMask"`" up \
- && noRoutePresent "$ifNet" "$vHostIf"; then
- route add -net "$ifNet" netmask "$ifMask" "$vHostIf"
- fi
-
- if [ "$run_dhcpd" = 'yes' ]; then
- vmware_start_dhcpd "$vHostIf" || exit 1
- fi
-
- if [ "$run_samba" = 'yes' ]; then
- vmware_start_nmbd "$vHostIf" || exit 1
- vmware_start_smbd "$vHostIf" || exit 1
- fi
-
- exit 0
+ local vHubNr="$1" # IN
+ local vHostIf="$2" # IN
+ local ifIp="$3" # IN
+ local ifMask="$4" # IN
+ local run_dhcpd="$5" # IN
+ local run_samba="$6" # IN
+ local ifNet
+
+ # Do a cursory check to see if the host-only network
+ # configuration is still ok. We do this so that mobile
+ # hosts don't get setup at install time and then moved to
+ # a new locale where the host-only network config is no
+ # longer valid.
+ #
+ # NB: This really needs to be done at power-on time when
+ # VM is configured to use host-only networking so that
+ # we aren't fooled by dynamic changes in the network.
+ #
+ # XXX ping takes 10 seconds to timeout if nobody answers
+ # that slows boot too much so we do this bit in the
+ # background.
+ if "$VM_BINDIR"/"$ping" -q "$ifIp"; then
+ echo 'Host-only networking disabled because '"$ifIp"
+ echo 'appears to be a real, physical, existing address.'
+ echo 'Please modify your host-only network configuration.'
+ exit 1
+ fi
+ cd "$VM_BINDIR" && "$VM_BINDIR"/"$netifup" \
+ -d /var/run/"$netifup"-"$vHostIf".pid /dev/vmnet"$vHubNr" "$vHostIf"
+ [ "$?" -eq 0 ] || exit 1
+ # Configure the virtual host ethernet interface and define the private IP
+ # network
+ #
+ # . We provide the broadcast address explicitly because versions of ifconfig
+ # prior to 1.39 (1999-03-18) seem to miscompute it
+ # . 2.0.x kernels don't install a route when the interface is marked up, but
+ # 2.2.x kernel do. Since we want to see any errors from route we don't
+ # just discard messages from route, but instead check if the route got
+ # installed before manually adding one.
+ ifNet=`ipv4_subnet "$ifIp" "$ifMask"`
+ if ifconfig "$vHostIf" inet "$ifIp" netmask "$ifMask" \
+ broadcast "`ipv4_broadcast "$ifIp" "$ifMask"`" up \
+ && noRoutePresent "$ifNet" "$vHostIf"; then
+ route add -net "$ifNet" netmask "$ifMask" "$vHostIf"
+ fi
+ if [ "$run_dhcpd" = 'yes' ]; then
+ # Start a DHCP server on a private IP network
+ # The daemon already logs its output in the system log, so we can safely
+ # trash it
+ cd "$VM_BINDIR" && "$VM_BINDIR"/"$dhcpd" \
+ -cf "$vmware_etc_dir"/"$vHostIf"/dhcpd/dhcpd.conf \
+ -lf "$vmware_etc_dir"/"$vHostIf"/dhcpd/dhcpd.leases \
+ -pf /var/run/"$dhcpd"-"$vHostIf".pid "$vHostIf" >/dev/null 2>&1 || exit 1
+ fi
+ if [ "$run_samba" = 'yes' ]; then
+ # Start a SMB name server on a private IP network
+ # Disable logging to avoid the uncontrolled creation of unmanaged files
+ cd "$VM_BINDIR" && "$VM_BINDIR"/"$nmbd" -D -l /dev/null \
+ -s "$vmware_etc_dir"/"$vHostIf"/smb/smb.conf \
+ -f /var/run/"$nmbd"-"$vHostIf".pid || exit 1
+ # Start a SMB share server on a private IP network
+ # Disable logging to avoid the uncontrolled creation of unmanaged files
+ cd "$VM_BINDIR" && "$VM_BINDIR"/"$smbd" -D -l /dev/null \
+ -s "$vmware_etc_dir"/"$vHostIf"/smb/smb.conf \
+ -f /var/run/"$smbd"-"$vHostIf".pid || exit 1
+ fi
}
# Stop the host-only network user service
vmware_stop_hostonly() {
- local vHostIf="$1" # IN
- local ifIp="$2" # IN
- local ifMask="$3" # IN
- local ifNet
-
- # Terminate the private network
- ifNet=`ipv4_subnet "$ifIp" "$ifMask"`
- noRoutePresent "$ifNet" "$vHostIf" \
- || route del -net "$ifNet" netmask "$ifMask" || exit 1
- # To test if the interface exists, we can not just look at the exitcode
- # because old versions of ifconfig don't exit with 1 when invoked with a
- # non-existing interface
- if [ "`ifconfig "$vHostIf" 2>/dev/null`" != '' ]; then
- ifconfig "$vHostIf" down || exit 1
- fi
-
- vmware_stop_netifup "$vHostIf" || exit 1
-
- exit 0
-}
-
-# Start the NAT network user service
-vmware_start_nat() {
- local vHubNr="$1" # IN
-
- cd "$vmdb_answer_BINDIR" && "$vmdb_answer_BINDIR"/"$natd" \
- -d /var/run/"$natd"-"$vHubNr".pid \
- -m /var/run/"$natd"-"$vHubNr".mac \
- -c "$vmware_etc_dir"/vmnet"$vHubNr"/nat/nat.conf
-}
-
-# Stop the NAT network user service
-vmware_stop_nat() {
- local vHubNr="$1" # IN
-
- vmware_stop_pidfile /var/run/"$natd"-"$vHubNr".pid
+ local vHostIf="$1" # IN
+ local ifIp="$2" # IN
+ local ifMask="$3" # IN
+ local ifNet
+
+ # Terminate the private network
+ ifNet=`ipv4_subnet "$ifIp" "$ifMask"`
+ noRoutePresent "$ifNet" "$vHostIf" || route del -net "$ifNet" netmask "$ifMask" || exit 1
+ # To test if the interface exists, we can not just look at the exitcode
+ # because old versions of ifconfig don't exit with 1 when invoked with a
+ # non-existing interface
+ if [ "`ifconfig "$vHostIf" 2>/dev/null`" != '' ]; then
+ ifconfig "$vHostIf" down || exit 1
+ fi
+ vmware_stop_pidfile /var/run/"$netifup"-"$vHostIf".pid || exit 1
}
# See how we were called.
case "$1" in
start)
- if [ -e "$vmware_etc_dir"/not_configured ]; then
- echo "`vmware_product_name`"' is installed, but it has not been (correctly) configured'
- echo 'for the running kernel. To (re-)configure it, invoke the'
- echo 'following command: '"$vmdb_answer_BINDIR"'/vmware-config.pl.'
- echo
-
- exit 1
- fi
-
- if vmware_inVM; then
- # Refuse to start services in a VM: they are useless
- exit 1
- fi
-
- echo 'Starting VMware services:'
- exitcode='0'
-
- vmware_exec 'Virtual machine monitor' vmware_start_vmmon
- exitcode=`expr "$exitcode" + "$?"`
-
- if [ "`isPpuserNeeded`" = '1' ]; then
- vmware_exec 'Virtual bidirectional parallel port' \
- vmware_start_vmppuser
- exitcode=`expr "$exitcode" + "$?"`
- else
- # Try to load parport_pc. Failure is allowed as it does not exist
- # on kernels 2.0
- /sbin/modprobe parport_pc >/dev/null 2>&1
- fi
-
- if [ "$vmdb_answer_NETWORKING" = 'yes' ]; then
- msg_starting 'Virtual ethernet'
- busy
- vmware_start_vmnet
- exitcode=`expr "$exitcode" + "$?"`
- ok
-
- vHubNr=0
- while [ $vHubNr -lt 256 ]; do
- eval 'interface="$vmdb_answer_VNET_'"$vHubNr"'_INTERFACE"'
- eval 'hostaddr="$vmdb_answer_VNET_'"$vHubNr"'_HOSTONLY_HOSTADDR"'
- eval 'netmask="$vmdb_answer_VNET_'"$vHubNr"'_HOSTONLY_NETMASK"'
- if [ -n "$interface" ]; then
- vmware_exec 'Bridged networking on /dev/vmnet'"$vHubNr" \
- vmware_start_bridge "$vHubNr" "$interface"
- exitcode=`expr "$exitcode" + "$?"`
- elif [ -n "$hostaddr" -a -n "$netmask" ]; then
- eval 'samba="$vmdb_answer_VNET_'"$vHubNr"'_SAMBA"'
- vmware_bg_exec 'Host-only networking on /dev/vmnet'"$vHubNr" \
- vmware_start_hostonly "$vHubNr" 'vmnet'"$vHubNr" \
- "$hostaddr" "$netmask" 'yes' "$samba"
- exitcode=`expr "$exitcode" + "$?"`
-
- eval 'nat="$vmdb_answer_VNET_'"$vHubNr"'_NAT"'
- if [ "$nat" = 'yes' ]; then
- vmware_exec 'NAT networking on /dev/vmnet'"$vHubNr" \
- vmware_start_nat "$vHubNr"
- exitcode=`expr "$exitcode" + "$?"`
- fi
- fi
- vHubNr=`expr $vHubNr + 1`
- done
-
+ if [ -f /var/lock/subsys/"$subsys" ]; then
+ msg_already_running "VMware Workstation networking"
+ fi
+ # Try to load parport_pc. Failure is allowed as it does not exist
+ # on kernels 2.0
+ /sbin/modprobe parport_pc >/dev/null 2>&1
+ msg_starting 'Virtual machine monitor'
+ busy
+ /sbin/modprobe $driver
+ [ "$?" -eq "0" ] && ok || fail
+ if [ "$VM_NETWORKING" = 'yes' ]; then
+ msg_starting 'Virtual ethernet'
+ busy
+ /sbin/modprobe $vnet
+ [ "$?" -eq 0 ] && ok || fail
+ vHubNr=0
+ while [ $vHubNr -lt 9 ]; do
+ eval 'interface="$VNET_'"$vHubNr"'_INTERFACE"'
+ eval 'hostaddr="$VNET_'"$vHubNr"'_HOSTONLY_HOSTADDR"'
+ eval 'netmask="$VNET_'"$vHubNr"'_HOSTONLY_NETMASK"'
+ if [ -n "$interface" ]; then
+ vmware_create_vmnet "$vHubNr"
+ # Connect a physical host ethernet interface to a virtual ethernet hub
+ msg_starting 'Bridged networking on /dev/vmnet'"$vHubNr"
+ busy
+ cd "$VM_BINDIR" && "$VM_BINDIR"/"$bridge" \
+ -d /var/run/"$bridge"-"$vHubNr".pid /dev/vmnet"$vHubNr" "$interface"
+ [ "$?" -eq 0 ] && ok || fail
+ elif [ -n "$hostaddr" -a -n "$netmask" ]; then
+ vmware_create_vmnet "$vHubNr"
+ eval 'samba="$VNET_'"$vHubNr"'_SAMBA"'
+ msg_starting 'Host-only networking on /dev/vmnet'"$vHubNr"
+ busy
+ vmware_start_hostonly "$vHubNr" 'vmnet'"$vHubNr" "$hostaddr" \
+ "$netmask" 'yes' "$samba"
+ [ "$?" -eq 0 ] && ok || fail
+ eval 'nat="$VNET_'"$vHubNr"'_NAT"'
+ if [ "$nat" = 'yes' ]; then
+ # Start the NAT network user service
+ msg_starting 'NAT networking on /dev/vmnet'"$vHubNr"
+ busy
+ cd "$VM_BINDIR" && "$VM_BINDIR"/"$natd" \
+ -d /var/run/"$natd"-"$vHubNr".pid \
+ -m /var/run/"$natd"-"$vHubNr".mac \
+ -c "$vmware_etc_dir"/vmnet"$vHubNr"/nat/nat.conf >/dev/null 2>&1
+ [ "$?" -eq 0 ] && ok || fail
+ fi
+ fi
+ vHubNr=$(($vHubNr + 1))
+ done
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
-
- [ -d /var/lock/subsys ] || mkdir -p /var/lock/subsys
touch /var/lock/subsys/"$subsys"
;;
stop)
- if [ "`countVMs`" -gt 0 ]; then
- echo 'At least one instance of '"`vmware_product_name`"' is still running. Please stop all running'
- echo 'instances of '"`vmware_product_name`"' first.'
- echo
-
- # The unconfigurator handle this exit code differently
- exit 2
+ if [ "`countVMs`" -gt 0 ]; then
+ echo 'At least one instance of VMware Workstation is still running.'
+ echo 'Please stop all running instances of VMware Workstation first.'
+ echo
fi
-
- echo 'Stopping VMware services:'
- exitcode='0'
-
- vmware_exec 'Virtual machine monitor' vmware_stop_vmmon
- exitcode=`expr "$exitcode" + "$?"`
-
- if [ "`isPpuserNeeded`" = '1' ]; then
- vmware_exec 'Virtual bidirectional parallel port' \
- vmware_stop_vmppuser
- exitcode=`expr "$exitcode" + "$?"`
- else
- # Try to unload parport_pc. Failure is allowed as it does not exist
- # on kernels 2.0, and some other process could be using it.
- /sbin/modprobe -r parport_pc >/dev/null 2>&1
- fi
-
- if [ "$vmdb_answer_NETWORKING" = "yes" ]; then
- # NB: must kill off processes using vmnet before
- # unloading module
- vHubNr=0
- while [ $vHubNr -lt 256 ]; do
- eval 'interface="$vmdb_answer_VNET_'"$vHubNr"'_INTERFACE"'
- eval 'hostaddr="$vmdb_answer_VNET_'"$vHubNr"'_HOSTONLY_HOSTADDR"'
- eval 'netmask="$vmdb_answer_VNET_'"$vHubNr"'_HOSTONLY_NETMASK"'
- if [ -n "$interface" ]; then
- vmware_exec "Bridged networking on /dev/vmnet$vHubNr" vmware_stop_bridge "$vHubNr"
- exitcode=`expr "$exitcode" + "$?"`
- elif [ -n "$hostaddr" -a -n "$netmask" ]; then
- vmware_exec "DHCP server on /dev/vmnet$vHubNr" vmware_stop_dhcpd \
- "vmnet$vHubNr"
- exitcode=`expr "$exitcode" + "$?"`
-
- eval 'samba="$vmdb_answer_VNET_'"$vHubNr"'_SAMBA"'
- if [ "$samba" = "yes" ]; then
- vmware_exec 'SMB share server on /dev/vmnet'"$vHubNr" \
- vmware_stop_smbd 'vmnet'"$vHubNr"
- exitcode=`expr "$exitcode" + "$?"`
-
- vmware_exec 'SMB name server on /dev/vmnet'"$vHubNr" \
- vmware_stop_nmbd 'vmnet'"$vHubNr"
- exitcode=`expr "$exitcode" + "$?"`
- fi
-
- eval 'nat="$vmdb_answer_VNET_'"$vHubNr"'_NAT"'
- if [ "$nat" = "yes" ]; then
- vmware_exec 'NAT networking on /dev/vmnet'"$vHubNr" \
- vmware_stop_nat "$vHubNr"
- exitcode=`expr "$exitcode" + "$?"`
- fi
-
- vmware_exec 'Host-only networking on /dev/vmnet'"$vHubNr" \
- vmware_stop_hostonly 'vmnet'"$vHubNr" "$hostaddr" "$netmask"
-
+ if [ ! -f /var/lock/subsys/"$subsys" ]; then
+ msg_not_running "VMware Workstation networking"
+ fi
+ # Try to unload parport_pc. Failure is allowed as it does not exist
+ # on kernels 2.0, and some other process could be using it.
+ /sbin/modprobe -r parport_pc >/dev/null 2>&1
+ if [ "$VM_NETWORKING" = "yes" ]; then
+ # NB: must kill off processes using vmnet before
+ # unloading module
+ vHubNr=0
+ while [ $vHubNr -lt 9 ]; do
+ eval 'interface="$VNET_'"$vHubNr"'_INTERFACE"'
+ eval 'hostaddr="$VNET_'"$vHubNr"'_HOSTONLY_HOSTADDR"'
+ eval 'netmask="$VNET_'"$vHubNr"'_HOSTONLY_NETMASK"'
+ if [ -n "$interface" ]; then
+ # Disconnect a physical host ethernet interface from a virtual ethernet hub
+ msg_stopping "Bridged networking on /dev/vmnet$vHubNr"
+ busy
+ vmware_stop_pidfile /var/run/"$bridge"-"$vHubNr".pid
+ [ "$?" -eq 0 ] && ok || fail
+ elif [ -n "$hostaddr" -a -n "$netmask" ]; then
+ # Stop a DHCP server on a private IP network
+ msg_stopping "DHCP server on /dev/vmnet$vHubNr"
+ busy
+ vmware_stop_pidfile /var/run/"$dhcpd"-"vmnet$vHubNr".pid
+ [ "$?" -eq 0 ] && ok || fail
+ eval 'samba="$VNET_'"$vHubNr"'_SAMBA"'
+ if [ "$samba" = "yes" ]; then
+ # Stop a SMB share server on a private IP network
+ msg_stopping 'SMB share server on /dev/vmnet'"$vHubNr"
+ busy
+ vmware_stop_pidfile /var/run/"$smbd"-'vmnet'"$vHubNr".pid
+ [ "$?" -eq 0 ] && ok || fail
+ # Stop a SMB name server on a private IP network
+ msg_stopping 'SMB name server on /dev/vmnet'"$vHubNr"
+ busy
+ vmware_stop_pidfile /var/run/"$nmbd"-'vmnet'"$vHubNr".pid
+ [ "$?" -eq 0 ] && ok || fail
+ fi
+ eval 'nat="$VNET_'"$vHubNr"'_NAT"'
+ if [ "$nat" = "yes" ]; then
+ # Stop the NAT network user service
+ msg_stopping 'NAT networking on /dev/vmnet'"$vHubNr"
+ busy
+ vmware_stop_pidfile /var/run/"$natd"-"$vHubNr".pid
+ [ "$?" -eq 0 ] && ok || fail
+ fi
+ msg_stopping 'Host-only networking on /dev/vmnet'"$vHubNr"
+ busy
+ vmware_stop_hostonly 'vmnet'"$vHubNr" "$hostaddr" "$netmask"
+ [ "$?" -eq 0 ] && ok || fail
+
+ fi
+ vHubNr=$(($vHubNr + 1))
+ done
+ msg_stopping 'Virtual machine monitor'
+ busy
+ if /sbin/lsmod | grep -q ^"$driver"; then
+ /sbin/rmmod "$driver"
fi
- vHubNr=`expr $vHubNr + 1`
- done
-
- vmware_exec 'Virtual ethernet' vmware_stop_vmnet
- exitcode=`expr "$exitcode" + "$?"`
- fi
-
- if [ "$exitcode" -gt 0 ]; then
- exit 1
- fi
-
+ [ "$?" -eq "0" ] && ok || fail
+ msg_stopping 'Virtual ethernet'
+ busy
+ if /sbin/lsmod | grep -q ^"$vnet"; then
+ /sbin/rmmod "$vnet"
+ fi
+ [ "$?" -eq "0" ] && ok || fail
+ fi
rm -f /var/lock/subsys/"$subsys"
;;
-
status)
- if [ "`countVMs`" -gt 0 ]; then
- echo 'At least one instance of '"`vmware_product_name`"' is still running.'
- echo
+ if [ "`countVMs`" -gt 0 ]; then
+ echo 'At least one instance of VMware Workstation is still running.'
+ echo
+ fi
+ if [ "$VM_NETWORKING" = "yes" ]; then
+ status "$bridge"
+ status "$dhcpd"
+ status "$netifup"
+ fi
+ if [ "$VM_NETWORKING" = "yes" ]; then
+ echo -n "Module $vnet "
+ /sbin/modprobe "$vnet" >/dev/null 2>&1 && echo installed || echo "not installed"
fi
-
- if [ "$vmdb_answer_NETWORKING" = "yes" ]; then
- status "$bridge"
- status "$dhcpd"
- status "$netifup"
- fi
-
- echo -n "Module $driver "
- /sbin/modprobe "$driver" >/dev/null 2>&1 && echo installed || echo "not installed"
- if [ "`isPpuserNeeded`" = '1' ]; then
- echo -n "Module $ppuser "
- /sbin/modprobe "$ppuser" >/dev/null 2>&1 && echo installed || echo "not installed"
- fi
- if [ "$vmdb_answer_NETWORKING" = "yes" ]; then
- echo -n "Module $vnet "
- /sbin/modprobe "$vnet" >/dev/null 2>&1 && echo installed || echo "not installed"
- fi
;;
-
restart)
"$0" stop && "$0" start
;;
-
*)
echo "Usage: `basename "$0"` {start|stop|status|restart}"
- exit 1
+ exit 3
esac
exit 0