#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