summaryrefslogtreecommitdiff
path: root/open-vm-tools/scripts/common/statechange.sh
blob: 68088d3bf760c5149f83b4fee85c922eb65f8cb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/bin/sh
##########################################################
# Copyright (C) 2010-2015 VMware, Inc. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation version 2.1 and no later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE.  See the Lesser GNU General Public
# License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA.
#
##########################################################

##########################################################################
# DO NOT modify this file directly as it will be overwritten the next
# time the VMware Tools are installed.
##########################################################################

#
# statechange.sh
#
# This script is a refactored version of the legacy power scripts (e.g.,
# poweron-vm-default).  It expects to be installed in their places --
# in other words, `basename "$0"` might be poweron-vm-default.
#
# Handy reference/shorthand used in this doc/scripts:
#    TOOLS_CONFDIR ::= Depends on platform and installation settings.  Likely
#                      "/etc/vmware-tools" or
#                      "/Library/Application Support/VMware Tools"
#    powerOp       ::= One of "poweron-vm", "poweroff-vm", "suspend-vm", and
#                      "resume-vm".
#    vmwScriptDir  ::= $TOOLS_CONFDIR/scripts/vmware
#    userScriptDir ::= $TOOLS_CONFDIR/scripts/${powerOp}-default.d
#
# End users may install scripts of their own under $userScriptDir.  They
# are executed in alphabetical order with "$powerOp" as the only argument.
#
# NB:  This directory layout remains to preserve backwards compatibility. End
# users are free to write a single script which uses its only parameter
# (${powerOp}) as a discriminator, and then install symlinks to it in each
# of the ${powerOp}-default.d directories.
#
# On power-on and resume, VMware's scripts execute before the end user's.  On
# suspend and power-off, the end user's execute before VMware's.  (This way,
# VMware stops services only after the user's scripts have finished their
# work, and conversely restores the same services before the user's scripts
# attempt to use them.)
#
# Should any script exit non-zero, only its value will be saved to exitCode.
# (Any further non-zero exits will have no effect on exitCode.)  This script
# exits with $exitCode.
#
# XXX Consider using the available/enabled pattern for VMware's scripts.
#
# XXX This should be staged as a single executable whereby the desired
# power operation is passed in as a parameter.  (I.e., one would run
# "/path/to/statechange.sh suspend-vm" rather than having to install
# statechange.sh as suspend-vm-default.)
#

echo `date` ": Executing '$0'"

# See above.
TOOLS_CONFDIR=`dirname "$0"`
export TOOLS_CONFDIR

# Pull in subroutines like Panic.
. "$TOOLS_CONFDIR"/statechange.subr


#
# RunScripts --
#
#    Executes scripts installed under $scriptDir.
#
# Side effects:
#    exitCode may be incremented.
#

RunScripts() {
   scriptDir="$1"

   if [ -d "$scriptDir" ]; then
      for scriptFile in "$scriptDir"/*; do
         if [ -x "$scriptFile" ]; then
            "$scriptFile" $powerOp
            exitCode=`expr $exitCode \| $?`
         fi
      done
   fi
}


#
# main --
#
#    Entry point.  See comments at top of file for details.
#
# Results:
#    Exits with $exitCode.
#

main() {
   # This is sanity checked in the case/esac bit below.
   powerOp=`basename "$0" | sed 's,-default,,'`
   exitCode=0

   vmwScriptDir="$TOOLS_CONFDIR/scripts/vmware"
   userScriptDir="$TOOLS_CONFDIR/scripts/${powerOp}-default.d"

   case "$powerOp" in
      poweron-vm|resume-vm)
         RunScripts "$vmwScriptDir"
         RunScripts "$userScriptDir"
         ;;
      poweroff-vm|suspend-vm)
         RunScripts "$userScriptDir"
         RunScripts "$vmwScriptDir"
         ;;
      *)
         Panic "Invalid argument: $powerOp"
         ;;
   esac

   return $exitCode
}

main