128 lines
3.7 KiB
Plaintext
128 lines
3.7 KiB
Plaintext
|
#!/bin/bash
|
||
|
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
||
|
|
||
|
function display_help() {
|
||
|
uecho "$scriptname: lancer une machine virtuelle VirtualBox
|
||
|
|
||
|
USAGE
|
||
|
$scriptname [options] vmName
|
||
|
|
||
|
OPTIONS
|
||
|
-n Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés
|
||
|
-l Lister les machines virtuelles
|
||
|
-s Démarrer la machine virtuelle (par défaut)
|
||
|
Si le nom de la machine virtuelle n'est pas spécifiée, un menu est
|
||
|
affiché
|
||
|
-k Arrêter la machine virtuelle (par ACPI)
|
||
|
-p Mettre en veille la machine virtuelle (par ACPI)
|
||
|
-H Arrêter sauvagement la machine virtuelle
|
||
|
-R Redémarrer sauvagement la machine virtuelle
|
||
|
-S Enregistrer l'état de la machine virtuelle
|
||
|
-g Afficher le gestionnaire de machines virtuelle"
|
||
|
}
|
||
|
|
||
|
source "$(dirname "$0")/ulib/ulib" &&
|
||
|
urequire DEFAULTS ||
|
||
|
exit 1
|
||
|
|
||
|
function build_arrays() {
|
||
|
# Construire les listes avms, rvms, svms
|
||
|
# rvms: les vms qui tournent
|
||
|
# avms: toutes les vms
|
||
|
# svms: les vms qui sont arrêtées
|
||
|
rvms=()
|
||
|
eval "$(VBoxManage -q list runningvms | sort | sed 's/^/array_add rvms /g')"
|
||
|
avms=()
|
||
|
eval "$(VBoxManage -q list vms | sort | sed 's/^/array_add avms /g')"
|
||
|
svms=()
|
||
|
for avm in "${avms[@]}"; do
|
||
|
array_contains rvms "$avm" || array_add svms "$avm"
|
||
|
done
|
||
|
}
|
||
|
|
||
|
function is_numeric() {
|
||
|
[ -n "$1" -a -z "${1//[0-9]/}" ]
|
||
|
}
|
||
|
|
||
|
function select_vm() {
|
||
|
# Afficher un menu pour sélectionner la machine virtuelle
|
||
|
simple_menu "${2:-vm}" "${1:-avms}" \
|
||
|
-t "Machines virtuelles" \
|
||
|
-m "${3:-Choisissez la VM}"
|
||
|
}
|
||
|
|
||
|
function start_virtualbox() {
|
||
|
# Lancer le gestionnaire de machines virtuelles
|
||
|
# Les mesures prises le sont pour compatibilité avec Fedora, si la commande
|
||
|
# est lancée depuis le menu. En effet, toutes les processus fils sont tués
|
||
|
# s'ils ne sont pas détachés avant la fin de la commande du menu. Le délai
|
||
|
# est donc pour laisser le temps à VirtualBox de s'initialiser.
|
||
|
nohup >/dev/null 2>&1 VirtualBox &
|
||
|
sleep 3
|
||
|
}
|
||
|
|
||
|
action=start
|
||
|
stopaction=acpipowerbutton
|
||
|
parse_opts + "${PRETTYOPTS[@]}" \
|
||
|
--help '$exit_with display_help' \
|
||
|
-n action=nop \
|
||
|
-l,--list action=list \
|
||
|
-s,--start action=start \
|
||
|
-k,-t,--stop '$action=stop; stopaction=acpipowerbutton' \
|
||
|
-p,--sleep '$action=stop; stopaction=acpisleepbutton' \
|
||
|
-H '$action=stop; stopaction=poweroff' \
|
||
|
-R '$action=stop; stopaction=reset' \
|
||
|
-S '$action=stop; stopaction=savestate' \
|
||
|
-g action=gui \
|
||
|
@ args -- "$@" && set -- "${args[@]}" || die "$args"
|
||
|
|
||
|
"$scriptdir/EnsureVM" virtualbox || die
|
||
|
[ "$action" == "nop" ] && exit 0
|
||
|
|
||
|
build_arrays
|
||
|
|
||
|
vm="$1"; shift
|
||
|
if [ -n "$vm" ]; then
|
||
|
if ! array_contains avms "$vm" && is_numeric "$vm"; then
|
||
|
vm=$(($vm - 1))
|
||
|
vm="${avms[$vm]}"
|
||
|
enote "Sélection de la VM $vm"
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
if [ "$action" == list ]; then
|
||
|
for avm in "${avms[@]}"; do
|
||
|
if array_contains rvms "$avm"; then
|
||
|
avm="$(get_color @ g)$avm [running]$(get_color z)"
|
||
|
fi
|
||
|
echo "$avm$state"
|
||
|
done
|
||
|
|
||
|
elif [ "$action" == start ]; then
|
||
|
if [ -z "$vm" -a -n "${svms[*]}" ]; then
|
||
|
[ -n "${rvms[*]}" ] &&
|
||
|
einfo "Les machines virtuelles suivantes sont déjà démarées:
|
||
|
$(array_join rvms "
|
||
|
" "" " ")" #"
|
||
|
select_vm svms vm "Choisissez la VM à démarrer"
|
||
|
fi
|
||
|
|
||
|
if [ -n "$vm" ]; then
|
||
|
VBoxManage -q startvm "$vm" "$@"
|
||
|
else
|
||
|
ewarn "Aucune VM à démarrer n'a été trouvée"
|
||
|
fi
|
||
|
|
||
|
elif [ "$action" == stop ]; then
|
||
|
if [ -z "$vm" -a "${rvms[*]}" ]; then
|
||
|
select_vm rvms vm "Choisissez la VM à arrêter avec la méthode $stopaction"
|
||
|
fi
|
||
|
|
||
|
if [ -n "$vm" ]; then
|
||
|
VBoxManage -q controlvm "$vm" "$stopaction"
|
||
|
fi
|
||
|
|
||
|
elif [ "$action" == gui ]; then
|
||
|
start_virtualbox
|
||
|
fi
|