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.

#26 Le 31/03/2010, à 05:02

dvi43

Re : Problème auto-montage USB sur VirtualBox

ah mais j'avais essayer ça mais du coup ça avait pas été bon vu uq'il faut que tout monte automatiquement

Hors ligne

#27 Le 31/03/2010, à 10:05

JesterXhead

Re : Problème auto-montage USB sur VirtualBox

Disons que dans mon cas, une université, je me vois mal demander à tous les étudiants d'amener leur périphériques pour les cocher lol. D'où la nécessité d'une reconnaissance automatique par la VM.

Hors ligne

#28 Le 01/04/2010, à 11:26

dvi43

Re : Problème auto-montage USB sur VirtualBox

j'ai presque trouvé ici : http://forum.ubuntu-fr.org/viewtopic.php?pid=3375763#p3375763
il me manque juste la gestion des exception (une histoire de sed)

Hors ligne

#29 Le 02/04/2010, à 10:07

dvi43

Re : Problème auto-montage USB sur VirtualBox

ça y est les périphériques usb montent automatiquement au lancement du script, je le nettoie qu'il soit compréhensible au mieux et je le met ici, après il n'y aura normalement plus qu'à mettre une règle UDEV

Hors ligne

#30 Le 04/04/2010, à 08:55

dvi43

Re : Problème auto-montage USB sur VirtualBox

bon j'ai un petit peu nettoyé le script roll je pense que pour le moment c'est plus une usine à gaz qu'autre chose mais ça à l'air de tourner donc si vous avez des simplifications ou des trucs qui pourraient être mieux ça fera pas de mal.

script :  


#!/bin/bash

#V0.9.1.6 du 4 avril 2010

# nom de la machine virtuelle

VBOX="V1"

#part 1

# utilisation de awk pour avoir la liste des périphériques usb avec la commande VboxManage

USBin=`VBoxManage -nologo list usbhost | awk '
BEGIN   { RS = "" ; FS = "\n" }
         {
        if ($1 != "Host USB Devices:") {
 #si le périphérique est déjà capturé on ecrit true sinon on ecrit false
          
            if ( index ($8,"Captured")) {
                printf ("TRUE;")
            } else {
                printf ("FALSE;")
            }
 
            # on recupere l uid
            split ($1,ret1,":"); gsub (" ","",ret1[2]);
                   printf("%s;", ret1[2]);
 
            # on recupere la description
            split ($5,ret5,":"); gsub (" ","",ret5[2]);
            split ($6,ret6,":"); gsub ("  ","",ret6[2]);
                   printf("%s, %s ;\n", ret5[2], ret6[2]);
        }
     }
'
`

# ce IFS est il utile ?

IFS=";"

#ancien morceau de programme à supprimer dans la version finale
#peut etre encore utile à la compréhension
#USBout=$(zenity  \
#        --list \
#        --title "VboxUSB Select" \
#        --text "Select device to attach or detach" \
#        --checklist  \
#        --hide-column=2 \
#        --column "Pick" \
#        --column "UID" \
#        --column "Device" \
#            $USBin );
 

#part 2

#preparer tous les périphériques à etre liés

#on remplace tous les FALSE par des TRUE pour dire qu'on veut tout lier a la vm


#on rempli la variable USBout avec le contenu de USBin
USBout=$USBin

#on passe la variable usbout dans un fichier temporaire

echo $USBout > /home/virtual/usbtmp

#on fait le remplacement de false par true

sed -i "s/FALSE/TRUE/g" /home/virtual/usbtmp

#on remet le contenu du fichier temporaire dans la variable

USBout=$(cat /home/virtual/usbtmp)



#part3

#gestion des exceptions

#on remplace le TRUE sur la ligne du periph qu'on ne veut pas monter par un
#FALSE, on selectionne le peripherique par son UID

#relever au préalable l uid avec la commande VBoxManage -nologo list usbhost

#on met la variable dans un fichier temporaire
echo $USBout > /home/virtual/usbtmp42

#on recherche l uid et on remplace le true qui est sur la meme ligne que l uid recherché par un false

sed '/'"dcc8437e-819a-4396-97f2-df38c4ab7938"'/ s/TRUE/FALSE/g' /home/virtual/usbtmp42 > /home/virtual/usbtmp52

USBout=$(cat /home/virtual/usbtmp52)



#part 4
#formatage de la variable usbout

#on formate USBout pour la suite
#USBout ne doit contenir que la deuxieme colonne (uid)

#on prends toutes les lignes où il y a true et les met dans usbtmp2

grep "TRUE" <<<"$USBout" >/home/virtual/usbtmp2

#dans le fichier usbtmp2 il n'y a maintenant que les périphériques à monter(ceux qui sont true)
#il faut supprimer tout sauf les UID
#on prends que la deuxième colonne (uid) et on l'envoie dans le fichier temporaire
cut -f2 -d" " /home/virtual/usbtmp2 > /home/virtual/usbtmp3
#on met le contenu du fichier temporaire dans la variable
USBout=$(cat /home/virtual/usbtmp3)

#part 5

#debranchement des peripheriques deconnectes
#cette partie est elle encore utile ?voir avec les tests mais normalement non


###  First itteration
### Compare all entries that were true and are now no longer in the return zenety list.  We have to disconnect those.

IFS=$'\n'
 
for i in $USBin;
    do
        if ( echo $i | grep -q TRUE ) ; then
            ## If we have a connected USB device before we started then check if it was unselected
            ii=`echo $i | sed s/TRUE\;//`
            iii=`echo $ii | sed s/\;.*//`
            if ! ( echo $USBout | grep -q $iii ) ; then
                VBoxManage -nologo controlvm $VBOX usbdetach $iii
            fi
        fi
    done        
 

#part6

#passer chaque ligne de usbout et lier a la vm le peripherique correspondant
#le separateur est la fin de ligne (\n)
IFS=$'\n' 


for i in $USBout;
    do
#si le périphérique n est pas encore lié
        if ( echo $USBin | grep -q FALSE\;$i ) ; then
#on l attache
            VBoxManage -nologo controlvm $VBOX usbattach $i
        fi
    done
 
unset IFS

#suppression des fichiers temporaires
rm /home/virtual/usbtemp
rm /home/virtual/usbtmp42
rm /home/virtual/usbtmp52
rm /home/virtual/usbtmp2
rm /home/virtual/usbtmp3


#attention les uid changent 
#qu'est ce qui declenche ce changement ?
#un periphérique branché constamment change t il d'uid ?

#faire une regle UDEV correspondante
#tester avec plein de périphs usb
#voir les droits sur le dossier tmp du système si c est ok on met les fichiers tmp du script dedans

vous ne pourrez pas utiliser le script directement, il y a des chemins de fichier à changer (/home/virtual/xxx)
le nom de la machine virtuelle aussi
la règle udev n'est pas faite mais ça devrait pas être bien compliqué, faudra s'y pencher une fois que ce programme sera bien propre ^^

Hors ligne

#31 Le 07/04/2010, à 08:23

dvi43

Re : Problème auto-montage USB sur VirtualBox

voilà le programme raccourci :

#!/bin/bash

#script de montage automatique de périphériques USB pour virtualbox
# nom de la machine virtuelle

VBOX="V1"

#part 1

# utilisation de awk pour avoir la liste des périphériques usb avec la commande VboxManage

USBin=`VBoxManage -nologo list usbhost | awk '
BEGIN   { RS = "" ; FS = "\n" }
         {
        if ($1 != "Host USB Devices:") {
 #si le périphérique est déjà capturé on ecrit true sinon on ecrit false
          
            if ( index ($8,"Captured")) {
                printf ("TRUE;")
            } else {
                printf ("FALSE;")
            }
 
            # on recupere l uuid
            split ($1,ret1,":"); gsub (" ","",ret1[2]);
                   printf("%s;", ret1[2]);
 
            # on recupere la description
            split ($5,ret5,":"); gsub (" ","",ret5[2]);
            split ($6,ret6,":"); gsub ("  ","",ret6[2]);
                   printf("%s, %s ;\n", ret5[2], ret6[2]);
        }
     }
'
`

# ce IFS est il utile ?
#je sais pas pourquoi mais oui il est bien utile

IFS=";"

#part 2

#preparer tous les périphériques à etre liés

#on remplace tous les FALSE par des TRUE pour dire qu'on veut tout lier a la vm


#on rempli la variable USBout avec le contenu de USBin
USBout=$USBin

#on passe la variable usbout dans un fichier temporaire

echo $USBout > /tmp/usbtmp

#on fait le remplacement de false par true

sed -i "s/FALSE/TRUE/g" /tmp/usbtmp

#on remet le contenu du fichier temporaire dans la variable

USBout=$(cat /tmp/usbtmp)



#part3

#gestion des exceptions

#on remplace le TRUE sur la ligne du periph qu'on ne veut pas monter par un
#FALSE, on selectionne le peripherique par son UUID

#relever au préalable l uuid avec la commande VBoxManage -nologo list usbhost

#on met la variable dans un fichier temporaire
echo $USBout > /tmp/usbtmp42

#on recherche l uuid et on remplace le true qui est sur la meme ligne que l uuid recherché par un false

sed '/'"16597b06-31b9-470e-a4b7-48c87f39bb00"'/ s/TRUE/FALSE/g' /tmp/usbtmp42 > /tmp/usbtmp52

USBout=$(cat /tmp/usbtmp52)



#part 4
#formatage de la variable usbout

#on formate USBout pour la suite
#USBout ne doit contenir que la deuxieme colonne (uuid)

#on prends toutes les lignes où il y a true et les met dans usbtmp2

grep "TRUE" <<<"$USBout" >/tmp/usbtmp2

#dans le fichier usbtmp2 il n'y a maintenant que les périphériques à monter(ceux qui sont true)
#il faut supprimer tout sauf les UuID
#on prends que la deuxième colonne (uuid) et on l'envoie dans le fichier temporaire
cut -f2 -d" " /tmp/usbtmp2 > /tmp/usbtmp3
#on met le contenu du fichier temporaire dans la variable
USBout=$(cat /tmp/usbtmp3)


#part5

#passer chaque ligne de usbout et lier a la vm le peripherique correspondant
#le separateur est la fin de ligne (\n)
IFS=$'\n' 


for i in $USBout;
    do
#si le périphérique n est pas encore lié
        if ( echo $USBin | grep -q FALSE\;$i ) ; then
#on l attache
            VBoxManage -nologo controlvm $VBOX usbattach $i
        fi
    done
 
unset IFS

#suppression des fichiers temporaires
rm /tmp/usbtmp
rm /tmp/usbtmp42
rm /tmp/usbtmp52
rm /tmp/usbtmp2
rm /tmp/usbtmp3


#attention les uuid changent prseque a chaque reboot
#qu'est ce qui declenche ce changement ?


#faire une regle UDEV correspondante à peu près : 
#/etc/udev/rules.d/99-my.rules qui contient : 
BUS=="usb", RUN+="/etc/udev/test.sh"
#/etc/udev/test.sh qui contient : 
#!/bin/sh
#bash /home/virtual/Bureau/scusb
#test.sh fait bien son travail le problème est au niveau de la regle udev
#penser au chmod 777 sur test.sh et peut etre aussi sur scusb
#tester avec plein de périphs usb

il reste quelques petites erreurs mais ça marche quand on le lance à la main.
le problème c'est la règle udev je n'arrive pas à en faire une qui détecte tous les périphériques usb et qui lance la suite, une idée ?

Hors ligne

#32 Le 07/04/2010, à 10:51

dvi43

Re : Problème auto-montage USB sur VirtualBox

le problème avec la règle udev vient du fait que la commande est lancée en root donc lors de la connexion (vboxmanage usbattach...) ça plante il faut que ce soit l'utilisateur courant qui lance sujet ouvert : http://forum.ubuntu-fr.org/viewtopic.php?id=388662

Hors ligne