#!/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