nutools/SVirtualBox

140 lines
4.5 KiB
Bash
Executable File

#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
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é
-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 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"
}
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 | awk '{gsub(/[^"]*$/, ""); print}' | csort | sed 's/^/array_add rvms /g')" #"'bug colorisation
avms=()
eval "$(VBoxManage -q list vms | awk '{gsub(/[^"]*$/, ""); print}' | csort | sed 's/^/array_add avms /g')" #"'bug colorisation
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
type=separate
parse_opts + "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-n action=nop \
-l,--list action=list \
-s,--start action=start \
-x,--gui type=gui \
-b,--background,--headless type=headless \
--separate type=separate \
-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
estep "Démarrage de $vm de type $type"
VBoxManage -q startvm --type "$type" "$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
estep "Arrêt de $vm avec la méthode $stopaction"
VBoxManage -q controlvm "$vm" "$stopaction"
fi
elif [ "$action" == gui ]; then
start_virtualbox
fi