-
Notifications
You must be signed in to change notification settings - Fork 0
/
c4vbox
276 lines (205 loc) · 8.95 KB
/
c4vbox
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
#!/bin/bash
# This must be run as the virtual box user (usually "vbox") and NO ONE ELSE
# it is meant to be run with variables set in /etc/default/virtualbox
# $VMLIST should be a UNIX text file formatted like:
# "VMNAME:UUID:VRDEPORT"
# problems:
# can't set the vrde port on a vm that is in a saved state that
# already has it's vrde port configured to something else, since it isn't mutable. SO:
# we wait 10 seconds and use vboxmanage controlvm to do this after startup
# set these for your environment
VBOXHEADLESS=/usr/bin/vboxheadless
VBOXMNG=/usr/bin/vboxmanage
# in case env wasn't inherited from su or is run by VBOXUSER directly
test -f /etc/default/virtualbox && . /etc/default/virtualbox
# nothing else configurable below this line
# set field separator so our for loops work
IFS=$'\n'
# function to ignore comments
strip_comments (){
grep -v '^[[:space:]]*#'
}
if [ ! $USER = $VBOXUSER ] ; then
echo "This script is meant to be run as $VBOXUSER. It won't run as you so just give up"
exit 1
fi
case $1 in
start)
for line in `cat ${VMLIST} | strip_comments`
do
VM=`echo $line | awk -F: '{print $1}'`
VBUUID=`echo $line | awk -F: '{print $2}'`
VRDEPORT=`echo $line | awk -F: '{print $3}'`
# make sure the VM is not already started
$VBOXMNG -q list runningvms | grep $VBUUID > /dev/null
if [ $? = 1 ] ; then
echo "Starting $VM with UUID $VBUUID"
$VBOXHEADLESS --startvm $VBUUID &
sleep 15
echo "Setting VRDE port on $VM to $VRDEPORT"
$VBOXMNG -q controlvm $VBUUID vrdeport $VRDEPORT
sleep 1
echo "done"
else
echo "$VM is already running"
fi
done
;;
stop)
for line in `cat ${VMLIST} | strip_comments`
do
VM=`echo $line | awk -F: '{print $1}'`
VBUUID=`echo $line | awk -F: '{print $2}'`
# make sure the VM is not already stopped
$VBOXMNG -q list runningvms | grep $VBUUID > /dev/null
if [ $? = 0 ] ; then
echo "Saving state of ${VM} with UUID ${VBUUID}"
$VBOXMNG -q controlvm ${VBUUID} savestate
else
echo "$VM is not running anyway, continuing ..."
fi
done
;;
stopall)
$VBOXMNG -q list runningvms | sed 's/ {/:/g' | sed 's/}//g' > /tmp/allvmlist.tmp
VMLISTALL=/tmp/allvmlist.tmp
for line in `cat ${VMLISTALL}`
do
VM=`echo $line | awk -F: '{print $1}'`
VBUUID=`echo $line | awk -F: '{print $2}'`
echo "Saving state of ${VM} with UUID ${VBUUID}"
$VBOXMNG -q controlvm ${VBUUID} savestate
done
rm -f $VMLISTALL
;;
poweroff)
for line in `cat ${VMLIST} | strip_comments`
do
VM=`echo $line | awk -F: '{print $1}'`
VBUUID=`echo $line | awk -F: '{print $2}'`
echo "POWERING OFF ${VM} with UUID ${VBUUID}"
echo "Are you SURE you want to poweroff the VM? (y|n)"
read QUESTION
case "$QUESTION" in
y|Y|yes|Yes) echo "OK, pulling the plug on ${VM}"
$VBOXMNG -q controlvm ${VBUUID} poweroff
;;
n|N|no|No) echo "Good choice. Use "stop" instead"
;;
*) echo "Uh, please type "y" or "n". Quitting."
exit 0
;;
esac
done
;;
reset)
for line in `cat ${VMLIST} | strip_comments`
do
VM=`echo $line | awk -F: '{print $1}'`
VBUUID=`echo $line | awk -F: '{print $2}'`
echo "Performing hardware reset of ${VM} with UUID ${VBUUID}"
echo "Are you SURE you want to hard reset the VM? (y|n)"
read QUESTION
case "$QUESTION" in
y|Y|yes|Yes) echo "OK, pulling the plug on ${VM}"
$VBOXMNG -q controlvm ${VBUUID} reset
;;
n|N|no|No) echo "Good choice. Use "stop" instead"
;;
*) echo "Uh, please type "y" or "n". Quitting."
exit 0
;;
esac
done
;;
listrunning)
$VBOXMNG -q list runningvms
;;
listall)
$VBOXMNG -q list vms
;;
config)
echo "Reconfiguring VRDE ports for VM's managed in $VMLIST"
for line in `cat ${VMLIST} | strip_comments`
do
VM=`echo $line | awk -F: '{print $1}'`
VBUUID=`echo $line | awk -F: '{print $2}'`
VRDEPORT=`echo $line | awk -F: '{print $3}'`
$VBOXMNG -q controlvm $VBUUID vrdeport $VRDEPORT
done
;;
status)
echo "Status of VM's run as $VBOXUSER:"
$VBOXMNG -q list vms | sed 's/ {/:/g' | sed 's/}//g' > /tmp/allvmlist.tmp
VMLISTALL=/tmp/allvmlist.tmp
for line in `cat ${VMLISTALL}`
do
VM=`echo $line | awk -F: '{print $1}'`
VBUUID=`echo $line | awk -F: '{print $2}'`
STATE=`$VBOXMNG -q showvminfo --machinereadable $VBUUID | grep VMState= | awk -F= '{print $2}'`
OS=`$VBOXMNG -q showvminfo --machinereadable $VBUUID | grep OSType= | awk -F= '{print $2}'`
MEM=`$VBOXMNG -q showvminfo --machinereadable $VBUUID | grep memory= | awk -F= '{print $2}'`
cat $VMLIST | strip_comments | grep $VBUUID > /dev/null
if [ $? = 0 ] ; then
echo "Virtual Machine $VM ($OS ${MEM}MB) is in state: $STATE (MANAGED)"
else
echo "Virtual Machine $VM ($OS ${MEM}MB) is in state: $STATE (UNMANAGED)"
fi
done
/bin/rm -f /tmp/allvmlist.tmp
;;
createvmlist)
$VBOXMNG -q list vms | sed 's/ {/:/g' | sed 's/}//g' > /tmp/allvmlist.tmp
VMLISTALL=/tmp/allvmlist.tmp
NEWVMLIST=~/vmlist
cat /dev/null > $NEWVMLIST
VRDEPORT=4000
for line in `cat $VMLISTALL`
do
let "VRDEPORT+=1"
VM=`echo $line | awk -F: '{print $1}'`
VBUUID=`echo $line | awk -F: '{print $2}'`
echo $line:$VRDEPORT >> $NEWVMLIST
echo "Added $VM to $NEWVMLIST"
done
echo "You may now copy $NEWVMLIST to $VMLIST (as root)"
echo "Be sure to comment out and VM's you do NOT want managed by this script!"
rm -f $VMLISTALL
;;
setvrdeauth)
$VBOXMNG -q list vms | sed 's/ {/:/g' | sed 's/}//g' > /tmp/allvmlist.tmp
VMLISTALL=/tmp/allvmlist.tmp
for line in `cat ${VMLISTALL}`
do
VM=`echo $line | awk -F: '{print $1}'`
VBUUID=`echo $line | awk -F: '{print $2}'`
STATE=`$VBOXMNG -q showvminfo --machinereadable $VBUUID | grep VMState= | awk -F= '{print $2}' | sed 's/"//g'`
cat $VMLIST | strip_comments | grep $VBUUID > /dev/null
if [ $STATE = "poweroff" ] ; then
$VBOXMNG -q modifyvm $VBUUID --vrdeauthtype external
if [ $? = 0 ] ; then
echo "Successfullly set VRDE authtype to "external" for $VM"
else
echo "Unable to set VRDE authtype for $VM"
fi
else
echo "Virtual Machine $VM is not in state: poweroff"
fi
done
rm -f $VMLISTALL
;;
*)
echo "Usage:
start: Start all VM's specified in $VMLIST
stop: Save the state of all VM's specified in $VMLIST
stopall: Save the state of all VM's running as $VBOXUSER on this system
poweroff: hard poweroff all VM's specified in $VMLIST
reset: hard reset all VM's specified in $VMLIST
listrunning: list all VM's currently running as $VBOXUSER
listall: list all VM's (running or not) as $VBOXUSER
config: set the VRDE port for running VM's listed in $VMLIST
status: information about VM's managed by this script
createvmlist: create a vmlist suitable for use by this script
setvrdeauth: attempt to set VRDE authtype to external"
;;
esac