Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/08/2024, à 20:58

greg73

[résolu] script bash : Lancer une VM VirtualBox grace à un wakeonlan

Bonjour,

J'ai le projet de pouvoir lancer certaines machines virtuelles (VirtualBox) grace à un wake-on-lan.

J'essaie de faire un script bash pour le faire, mais honnêtement mes connaissances du bash sont assez limitées.

j'arrive déjà à repérer les paquets magiques d'un WoL sur mon réseau et à lire l'adresse mac qui est demandée

#!/bin/bash

nc -dknl -p 9 -u |
 stdbuf -o0 xxd -c 6 -p |
 stdbuf -o0 uniq |
 stdbuf -o0 grep -v 'ffffffffffff' |
 while read ; do
   MAC_ADR=${REPLY:0:2}:${REPLY:2:2}:${REPLY:4:2}:${REPLY:6:2}:${REPLY:8:2}:${REPLY:10:2};
   echo $MAC_ADR;
 done

il faudrait maintenant que je liste les vms

VBoxManage list vms

qui me sort une list:

"LFS" {0d20e59f-6010-4dc4-a72b-b1b433307b03}
"Ubuntu_Desktop" {e6dd1dc0-46ab-46d4-9ca1-7b1985b08b4c}
"Guacamole" {47a9edca-60a5-40a5-a855-b78b1272dace}
"Ubuntu_Server" {d3c70df5-ddff-42ef-a74c-94e8d4159227}

Ensuite je devrait pour chaque VM aller regarder si je trouve l'adresse mac demandée et lancer la machine si elle est éteinte.

Je peux récupérer les informations sur la VM avec

VBoxManage showvminfo --machinereadable "LFS"

ou

VBoxManage showvminfo --machinereadable {0d20e59f-6010-4dc4-a72b-b1b433307b03} 

ce qui donne l'output suivant:

name="LFS"
encryption="disabled"
groups="/"
ostype="Ubuntu (64-bit)"
UUID="0d20e59f-6010-4dc4-a72b-b1b433307b03"
CfgFile="/home/serveur/VirtualBox VMs/LFS/LFS.vbox"
SnapFldr="/home/serveur/VirtualBox VMs/LFS/Snapshots"
LogFldr="/home/serveur/VirtualBox VMs/LFS/Logs"
hardwareuuid="0d20e59f-6010-4dc4-a72b-b1b433307b03"
memory=4096
pagefusion="off"
vram=33
cpuexecutioncap=100
hpet="off"
cpu-profile="host"
chipset="piix3"
firmware="BIOS"
cpus=2
pae="off"
longmode="on"
triplefaultreset="off"
apic="on"
x2apic="on"
nested-hw-virt="off"
cpuid-portability-level=0
bootmenu="messageandmenu"
boot1="disk"
boot2="dvd"
boot3="floppy"
boot4="none"
acpi="on"
ioapic="on"
biosapic="apic"
biossystemtimeoffset=0
NvramFile="/home/serveur/VirtualBox VMs/LFS/LFS.nvram"
rtcuseutc="on"
hwvirtex="on"
nestedpaging="on"
largepages="on"
vtxvpid="on"
vtxux="on"
virtvmsavevmload="on"
iommu="none"
paravirtprovider="default"
effparavirtprovider="kvm"
VMState="poweroff"
VMStateChangeTime="2023-06-07T20:20:38.000000000"
graphicscontroller="vmsvga"
monitorcount=1
accelerate3d="off"
accelerate2dvideo="off"
teleporterenabled="off"
teleporterport=0
teleporteraddress=""
teleporterpassword=""
tracing-enabled="off"
tracing-allow-vm-access="off"
tracing-config=""
autostart-enabled="off"
autostart-delay=0
defaultfrontend=""
vmprocpriority="default"
storagecontrollername0="IDE"
storagecontrollertype0="PIIX4"
storagecontrollerinstance0="0"
storagecontrollermaxportcount0="2"
storagecontrollerportcount0="2"
storagecontrollerbootable0="on"
storagecontrollername1="SATA"
storagecontrollertype1="IntelAhci"
storagecontrollerinstance1="0"
storagecontrollermaxportcount1="30"
storagecontrollerportcount1="3"
storagecontrollerbootable1="on"
"IDE-0-0"="none"
"IDE-0-1"="none"
"IDE-1-0"="emptydrive"
"IDE-IsEjected-1-0"="off"
"IDE-1-1"="none"
"SATA-0-0"="/home/serveur/VirtualBox VMs/LFS/LFS.vdi"
"SATA-ImageUUID-0-0"="edc71280-5ec0-407c-bbb7-3a4012d0c89e"
"SATA-hot-pluggable-0-0"="off"
"SATA-nonrotational-0-0"="off"
"SATA-discard-0-0"="off"
"SATA-1-0"="none"
"SATA-2-0"="none"
bridgeadapter1="enp2s0"
macaddress1="080027944E77"
cableconnected1="on"
nic1="bridged"
nictype1="82540EM"
nicspeed1="0"
nic2="none"
nic3="none"
nic4="none"
nic5="none"
nic6="none"
nic7="none"
nic8="none"
hidpointing="usbtablet"
hidkeyboard="ps2kbd"
uart1="off"
uart2="off"
uart3="off"
uart4="off"
lpt1="off"
lpt2="off"
audio="default"
audio_out="on"
audio_in="off"
clipboard="bidirectional"
draganddrop="disabled"
vrde="off"
usb="on"
ehci="on"
xhci="off"
recording_enabled="off"
recording_screens=1
rec_screen0
rec_screen_enabled="on"
rec_screen_id=0
rec_screen_video_enabled="on"
rec_screen_dest="File"
rec_screen_dest_filename="/home/serveur/VirtualBox VMs/LFS/LFS-screen0.webm"
rec_screen_opts="vc_enabled=true,ac_enabled=false,ac_profile=med"
rec_screen_video_res_xy="1024x768"
rec_screen_video_rate_kbps=512
rec_screen_video_fps=25
GuestMemoryBalloon=0

Il suffirait alors de comparer l'adresse mac

macaddress1="080027944E77"

avec celle du paquet magique et de lancer la VM si cela correspond

VBoxManage startvm "LFS" --type headless

Je suis conscient que je demande beaucoup mais mon problème intéressera peut-être qqn. Pour expliquer le contexte, j'utilise apache guacamole pour accéder en rdp à différentes VM au travers de n'importe quel browser. Apache Guacamole gère le wake-on-lan. J'aimerais donc pouvoir lancer la VMs voulue sans à avoir à laisser tourner des dizaines de VMs pour rien.

Dernière modification par greg73 (Le 23/08/2024, à 14:43)

Hors ligne

#2 Le 23/08/2024, à 14:43

greg73

Re : [résolu] script bash : Lancer une VM VirtualBox grace à un wakeonlan

Bonjour,

J'ai réussi à faire ce que je voulais. Cela sera peut-etre utile à quelqu'un.

#!/bin/bash

nc -dknl -p 9 -u |
 stdbuf -o0 xxd -c 6 -p |
 stdbuf -o0 uniq |
 stdbuf -o0 grep -v 'ffffffffffff' |
 while read ; do
        MAC_ADR=${REPLY:0:2}:${REPLY:2:2}:${REPLY:4:2}:${REPLY:6:2}:${REPLY:8:2}:${REPLY:10:2};
        LIST_ALL_VM=($(su -c "VBoxManage list vms" VBoxUser | awk '{print $2}'));
        LIST_RUNNING_VM=($(su -c "VBoxManage list runningvms" VBoxUser | awk '{print $2}'));
        LIST_VM=($(echo ${LIST_ALL_VM[@]} ${LIST_RUNNING_VM[@]} | tr ' ' '\n' | sort | uniq -u));
        for i in "${LIST_VM[@]}"
        do
                MAC_VM=$(su -c "VBoxManage showvminfo --machinereadable $i" VBoxUser | awk '/macaddress1/ {split($0, array, "="); print array [2]}')
                MAC_VM2=${MAC_VM:1:2}:${MAC_VM:3:2}:${MAC_VM:5:2}:${MAC_VM:7:2}:${MAC_VM:9:2}:${MAC_VM:11:2};
                if test "${MAC_ADR^^}" = "${MAC_VM2^^}"
                then
                        su -c "VBoxManage startvm $i --type headless" VBoxUser > /dev/null;
                fi
        done
done

Hors ligne

#3 Le 23/08/2024, à 21:00

Watael

Re : [résolu] script bash : Lancer une VM VirtualBox grace à un wakeonlan

$ var='0123456789ab'
$ for ((i=0;i<${#var};i+=2)); do addrMAC+=( ${var:$i:2} ); done
$ macAddr=$(IFS=':'; echo ${addrMAC[*]}")
$ echo $macAddr
01:23:45:67:89:ab
$

tu peux en faire une fonction qui sera utilisée avec $REPLY et ${MAC_VM:1}

NB: les noms de variables tout en majuscules sont, par convention, réservés aux variables d'environnement (REPLY, HOME, PWD...)
un utilisateur peut panacher majuscules et minuscules (nomVar, par exemple)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 26/08/2024, à 15:04

greg73

Re : [résolu] script bash : Lancer une VM VirtualBox grace à un wakeonlan

Hello,

Merci pour tes suggestions, le code est un peu plus propre!

J'ai encore une petite question. J'essaie de faire un petit service init.d qui lance ce script au démarrage. Ca fonctionne mais le pid qui est enregistré pour ce service est en fait le pid du script et non le pid de la commande nc qui lit le flux reseau.

Comment puis-je le recuperer?

Hors ligne

#5 Le 26/08/2024, à 16:12

Watael

Re : [résolu] script bash : Lancer une VM VirtualBox grace à un wakeonlan

avec pgrep


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 26/08/2024, à 16:43

greg73

Re : [résolu] script bash : Lancer une VM VirtualBox grace à un wakeonlan

Ok parfait merci avec pgrep ou ps dans le script d'init.d. Je pensais qu'il y avait un moyen dans mon script avec qqch du genre

 nc -dknl -p 9 -u & echo $! > pidfile | 

mais avec le pipe c'est un peu problématique j'imagine.

Hors ligne