nutools/SVirtualBox

167 lines
5.4 KiB
Plaintext
Raw Permalink Normal View History

2013-08-27 15:14:44 +04:00
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
2013-08-27 15:14:44 +04:00
function display_help() {
uecho "$scriptname: lancer une machine virtuelle VirtualBox
USAGE
$scriptname [options] vmName
OPTIONS
-n, --nop
Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés
-l, --list
Lister les machines virtuelles
-s, --start
Démarrer la machine virtuelle. C'est l'action par défaut.
2013-08-27 15:14:44 +04:00
Si le nom de la machine virtuelle n'est pas spécifiée, un menu est
affiché
-x, --gui
-b, --headless
--separate
Ces options ne sont valides qu'avec -s et permettent de spécifier le
type de démarrage: 'gui' permet d'afficher une fenêtre complète dans
laquelle l'accélération graphique est supportée, headless démarre la
machine en tâche de fond, et separate affiche une fenêtre qui attaque la
machine démarrée en tâche de fond. --separate est l'option par défaut.
-k, -t, --stop
Arrêter la machine virtuelle. Les options -p, -H, -R, -S et -r
permettent de spécifier le type d'arrêt de la machine virtuelle
-p, --sleep
Mettre en veille la machine virtuelle (par ACPI)
-H, --poweroff
Arrêter sauvagement la machine virtuelle
-R, --reset
Redémarrer sauvagement la machine virtuelle
-S, --savestate
Enregistrer l'état de la machine virtuelle
-r, --rrestart
Arrêter la machine, restaurer l'état du dernier snapshot puis la
relancer.
-g, --gui
Afficher le gestionnaire de machines virtuelle"
2013-08-27 15:14:44 +04:00
}
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=()
2014-09-23 11:56:11 +04:00
eval "$(VBoxManage -q list runningvms | awk '{gsub(/[^"]*$/, ""); print}' | csort | sed 's/^/array_add rvms /g')" #"'bug colorisation
2013-08-27 15:14:44 +04:00
avms=()
2014-09-23 11:56:11 +04:00
eval "$(VBoxManage -q list vms | awk '{gsub(/[^"]*$/, ""); print}' | csort | sed 's/^/array_add avms /g')" #"'bug colorisation
2013-08-27 15:14:44 +04:00
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
type=separate
stopaction=acpipowerbutton
restore=
2013-08-27 15:14:44 +04:00
parse_opts + "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-n,--nop action=nop \
2013-08-27 15:14:44 +04:00
-l,--list action=list \
-s,--start action=start \
-x,--gui type=gui \
-b,--background,--headless type=headless \
--separate type=separate \
2013-08-27 15:14:44 +04:00
-k,-t,--stop '$action=stop; stopaction=acpipowerbutton' \
-p,--sleep '$action=stop; stopaction=acpisleepbutton' \
-H,--poweroff '$action=stop; stopaction=poweroff' \
-R,--reset '$action=stop; stopaction=reset' \
-S,--savestate '$action=stop; stopaction=savestate' \
-r,--rrestart '$action=stop; restore=1' \
-g,--gui action=gui \
2013-08-27 15:14:44 +04:00
@ 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
2015-08-20 07:58:17 +04:00
2013-08-27 15:14:44 +04:00
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
estep "Démarrage de $vm de type $type"
VBoxManage -q startvm --type "$type" "$vm" "$@"
2013-08-27 15:14:44 +04:00
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
[ -n "$vm" ] || die
estep "Arrêt de $vm avec la méthode $stopaction"
VBoxManage -q controlvm "$vm" "$stopaction" || die
if [ -n "$restore" ]; then
ebegin "Attente de l'arrêt"
while true; do
build_arrays
array_contains svms "$vm" && break
2017-02-24 15:19:00 +04:00
edot 0
sleep 1
done
eend
estep "Restauration du snapshot"
VBoxManage -q snapshot "$vm" restorecurrent || die
estep "Démarrage"
VBoxManage -q startvm --type "$type" "$vm"
2013-08-27 15:14:44 +04:00
fi
elif [ "$action" == gui ]; then
start_virtualbox
fi