[Bash] Script affichant les modules des matos PCI et USB

Autres projets et contributions
Avatar de l’utilisateur
PillOow
Daikyu
Messages : 68
Inscription : mer. 18 juin 2008, 22:07

[Bash] Script affichant les modules des matos PCI et USB

Message par PillOow »

Bonjour !

Voici un p'tit script permettant de lister les modules nécessaire au fonctionnement du matos PCI et USB de votre machine. J'avais trouvé une astuce sur un blog dont j'ai perdu l'adresse permettant de trouver le module pour un materiel. Mais ça me gonflait de le faire à chaque fois pour chaque matos, là ça automatise et c'est plus mieux. Bon un script de ce genre a déjà dû être fait mais je me faisais chié et j'avais envie d'apprendre à scripter. Voici le code:

Code : Tout sélectionner

#!/bin/bash
## Script affichant les modules permettant le fonctionnement des appareils branchés sur les ports PCI et USB


## Note: Tous les \033[**m servent à la coloration du texte


echo
echo


echo " Recherche des modules des périphériques du bus PCI: "
echo
## Première boucle permettant d'afficher les modules des périphériques des ports PCI
while [ "$nombre_lignes" != `lspci | wc -l` ]
do
	## Le tableau en question "materiel_pci[]" va stocker chaque ligne sortie par sed de la commande lspci
	nombre_lignes=$(($nombre_lignes + 1))
	materiel_pci[$nombre_lignes]=`lspci | sed -n ''$nombre_lignes'p'`
	echo -e "\033[01m ${materiel_pci[$nombre_lignes]}\033[00m"

	## De ces lignes on récupère juste l'addresse que l'on stock dans cette variable
	kernel_addr=`echo ${materiel_pci[$nombre_lignes]} | cut -d" " -f 1`
	#echo $kernel_addr
	
	## On récupère ensuite son identifiant numérique
	id_num=`lspci -s $kernel_addr -n | cut -d" " -f 3`
	#echo $id_num

	## On sépare l'identifiant du fabricant de l'identifiant du matériel
	id_vendor=`echo $id_num | cut -d: -f 1`
	
	#echo "id vendeur: $id_vendor"

	id_device=`echo $id_num | cut -d: -f 2`
	
	#echo "id materiel: $id_device"


	## Et on va chercher le module correspondant
	module=$(grep $id_vendor /lib/modules/`uname -r`/modules.pcimap | grep $id_device | cut -d" " -f 1)
       
       ## Si un module n' existe pas pour le matos, on le dit sinon on l'affiche	
	if [ "$module" =  "" ]; then
	{
		echo -e "\033[31m Aucun module trouvé pour ce matériel\033[00m"
	}
	else
	{
		echo -e "\033[32m Module: $module \033[00m"
	}
	fi

	echo 	
done


echo
echo "Recherche des modules des périphérique des ports USB: "
echo 

# Seconde boucle pour le matos USB
while [ "$nbre_lignes" != `lsusb | wc -l` ]
do
	## Toujours le traitement par tableau
	nbre_lignes=$(($nbre_lignes + 1))
	materiel_usb[$nbre_lignes]=`lsusb | sed -n ''$nbre_lignes'p'`
	echo -e "\033[01m ${materiel_usb[$nbre_lignes]}\033[00m"
	
	## Sauf que la on peut récupérer directement les identifiants numériques
	id_numerique=`echo ${materiel_usb[$nbre_lignes]} | cut -d" " -f 6`
	
	#echo $id_numerique

	# On sépare l'identifiant du vendeur de celui du materiel
	id_vendor_usb=`echo $id_numerique | cut -d: -f 1`

	id_device_usb=`echo $id_numerique | cut -d: -f 2`
	
	
	## Puis on cherche le module correspondant
	module_usb=$(grep $id_vendor_usb /lib/modules/`uname -r`/modules.usbmap | grep $id_device_usb | cut -d" " -f 1)
	

	## Pour finir par l'affichage
	if [ "$module_usb" =  "" ]; then
	{
		echo -e "\033[31m Aucun module trouvé pour ce périphérique\033[00m"
	}
	else
	{
		echo -e "\033[32m Module: $module_usb \033[00m"
	}
	fi

done
exit 0;
Ca fonctionne, mais c'est mon premier script alors peut-être pourriez-vous me donner des conseils pour le rendre plus propre comme par exemple éviter de faire des "echo" partout juste pour faire des sauts de ligne. ( Tout con surement mais j'ai pas trouvé )

Et je voudrais savoir si selon vous, il trouve absolument tous les modules nécessaire ( exepté les proprios évidemment ).

Vous pouvez l'utiliser bien sûr, mais ce serait cool de me rapporter d'éventuels bugs.

Merci bien

T'chô

EDIT: Et j'oubliais, dites moi si la coloration ne vous gêne pas.
Cactus
Maître du Kyudo
Messages : 2073
Inscription : sam. 16 sept. 2006, 10:39
Localisation : 31 - Toulouse Nord

Re: [Bash] Script affichant les modules des matos PCI et USB

Message par Cactus »

en attendant de tester, pourquoi ne pas lancer simplement un hwd -e ?
Avatar de l’utilisateur
gyo
Maître du Kyudo
Messages : 1049
Inscription : jeu. 19 avr. 2007, 10:40
Localisation : Nantes (44)

Re: [Bash] Script affichant les modules des matos PCI et USB

Message par gyo »

PillOow a écrit :Bonjour !
Salut !
Ca fonctionne, mais c'est mon premier script alors peut-être pourriez-vous me donner des conseils pour le rendre plus propre comme par exemple éviter de faire des "echo" partout juste pour faire des sauts de ligne. ( Tout con surement mais j'ai pas trouvé )
Pas mal pour un premier script :D
si tu veux réduire le nombre d’appels à la commande echo, fais comme suit, par exemple, 3 sauts de ligne :

Code : Tout sélectionner

echo -e "\n\n"
ou

Code : Tout sélectionner

echo -ne "\n\n\n"
(l’option -n pour que echo ne fasse pas de saut de ligne tout seul à la fin ;))
Vous pouvez l'utiliser bien sûr, mais ce serait cool de me rapporter d'éventuels bugs.
Je regarderais ce soir je pense…
EDIT: Et j'oubliais, dites moi si la coloration ne vous gêne pas.
Non, on aime ça, on est tous(?) fans de yaourt :P

Sinon ben oui, comme Cactus, il y a un outil pour :)
commentaire rédigé à l’aide d’un clavier ergonomique bépo
KISS MY ARCH
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Re: [Bash] Script affichant les modules des matos PCI et USB

Message par tuxce »

c'est bien pour apprendre, mais si je peux me permettre:

Code : Tout sélectionner

lspci -k
te sort tous les modules actuellement utilisés, hwd -e tente de savoir ceux qui pourrait être utilisés, et ta méthode ne sort pas tout ;)

pour le lsusb, tu peux te servir de l'arborescence /sys, par exemple:

Code : Tout sélectionner

Bus 005 Device 003: ID 046d:c505 Logitech, Inc. Cordless Mouse+Keyboard Receiver
correspond à (bus 5, device 3 -> 5.3):

Code : Tout sélectionner

/sys/class/usb_device/usbdev5.3/
et le module s'il y en a un:

Code : Tout sélectionner

/sys/class/usb_device/usbdev5.3/device/driver/module
pour avoir le nom de ce module:

Code : Tout sélectionner

basename $(readlink -f  /sys/class/usb_device/usbdev5.3/device/driver/module)
par contre, ça te donne que celui de base, pour avoir plus, il faut creuser dans l'arborescence

Code : Tout sélectionner

basename $(readlink -f /sys/class/usb_device/usbdev5.3/device/5-1.1\:1.0/driver/module)
avec des *, ça devrait faire l'affaire
(d'ailleurs si quelqu'un a trouvé plus simple, je suis preneur :))
sinon, en ce qui concerne le script, t'as autant d'appel à lsusb et lspci que de ligne, ça ralentit et ça appelle pour rien:

Code : Tout sélectionner

lspci | while read; do echo $REPLY; done
appelle une seule fois lspci et traite chaque ligne (qui se retrouve dans $REPLY).
ce qui t'évite l'appel répété, le wc etc.
Répondre