(Courriels de diversion: <repensons@epaississement-feutrer.com> <adverbiaux@commanditer-bacteriologie.com> <numeroterait@postiches-taille.com> <issues@benir-surmenerez.com> <cariaient@vouvoieront-tournebroche.com> <enrobions@voua-rarefieraient.com> <dogmatiques@devoile-egides.com> <empesant@absorbaient-terrassent.com> <expeditifs@coagulerais-elinguer.com> <suspensions@entrouvrir-transborderiez.com> )
version 0.2: #!/bin/bash # Distributed under the terms of the GNU General Public License v2 # Distribué sous les termes de la licence GNU General Public License v2 #Ce script a été créé pour répondre au besoin du CULTe (LUG de toulouse) # http://www.culte.org #Ce script donne certaines des caractéristiques #principales d'une machine. #auteur: Jean-Michel Gay #date: 21 décembre 2004 # revisions: Tue, 21 Dec 2004 12:43:12 +0100 # revisions: Tue, 21 Dec 2004 19:45:32 +0100 # revisions: Wed, 22 Dec 2004 11:34:50 +0100 # TODO: man page # # Change History: # 0.1 : # Philippe Coulonges (cphil@cphil.net)# Introduction du changelog # Parsing des paramètres # Traitement du mode verbose # Traitemenent du help # Différentiation dans la détection de la distrib # Ajout du mode texte # Ajout de l'option de fichier de sortie # Passage en mode texte par défaut (mieux sur la sortie standard) # 0.2 : # Jean-Michel Gay # nom de la machine # élimination du root # recherche de "inet ad*r" pour le réseau program_name=`basename $0` program_version="0.1" #on ne genére que du html; pas de texte OUTPUT=txt #FILE=`hostname` FILE="-" verbose=0 #########" Routines générales vecho() { if [ 1 = $verbose ]; then echo $program_name: "$1" 1>&2; fi } version() { echo "$program_name $program_version" exit 0 } aide() { echo "\ Usage: $program_name [OPTION] Détecte la configuration de la machine -a automatique -h, --help affiche l'aide -o fichier sélectionne un fichier de sortie -t type sélection le type de la sortie. types valides : txt html -v mode verbeux (plus de messages) --version affiche la version du programme " exit 0 } # loop over arguments while [ $# -ne 0 ]; do case "$1" in -a) FILE=`hostname` OUTPUT=html ;; -o) shift FILE=$1 ;; -t) shift if [[ html = $1 ||txt = $1 ]] then OUTPUT=$1 else echo "Type $1 non reconnu" exit 0 fi ;; -h) aide ;; --help) aide ;; --version) version ;; -v) verbose="1" ;; *) aide ;; esac shift done #########" Routines HTML #html:balise de début de table html_tab_start () { if [ html = $OUTPUT ] then echo "<table>" fi } #html:balise de fin de table html_tab_stop () { if [ html = $OUTPUT ] then echo "</table>" fi } #html:balise internes à la table html_tab_line () { if [ html = $OUTPUT ] then echo "<tr>" echo "<td>" fi echo $1 if [ html = $OUTPUT ] then echo "</td>" echo "<td>" fi echo $2 if [ html = $OUTPUT ] then echo "</td>" echo "</tr>" fi } #html: création d'une table d'une ligne html_make_sample_table () { html_tab_start sed 's!^\(.*\)$!<tr><td>\1</td></tr>!g' | sed 's!:!</td><td>!g' html_tab_stop } # création d'une table d'une ligne make_sample_table () { if [ html = $OUTPUT ] then html_make_sample_table else cat fi } #indentation d'un flux indent () { if [ html = $OUTPUT ] then if [ text2 = "$1" ] then sed 's!^\(.*\)$!\ \ \ \1<br />!g' fi cat else sed "s/^/ /g" fi } #affichage d'un titre de section section () { echo if [ html = $OUTPUT ] then echo "<h4>" fi echo $1 : if [ html = $OUTPUT ] then echo "</h4>" fi } #########" Routines de détéction #détection du système #Donne la version du noyau, et le nom de la distribution #note: j'ai un doute sur le issu. Dans mon cas, ca donne Mandrake 10. #TODO : changer detect_sys () { kern=`uname -r ` # On teste d'abord /etc/distrib-release #FIXME: rien ne nous garantie qu'il n'y ait qu'un seul fichier! distro_version_file="/etc/unexisting-release-file-release" pushd /etc > /dev/null for i in *-release do if test lsb-release = $i then true else if test -f $i then distro_version_file=/etc/$i fi fi done popd > /dev/null #distro_version_file=`find /etc -name *-release | #grep -v "lsb-release" | #head ` #if [ "" = "$distro_version_file" ] #then #distro_version_file="/etc/unexisting-release-file-release" #else ##echo i"" i"$distro_version_file" #true #fi vecho $distro_version_file # Si ça marche pas, on essaye d'autres trucs connus # pour deviner la distrib if ( ! ( test -f $distro_version_file ) ) then test -f /etc/slackware-version && distro_version_file="/etc/slackware-version" test -f /etc/debian_version && distro_version_file="/etc/debian_version" fi syst_lsb='Distribution non basée sur la linux standard base' if test -f /etc/lsb-release then syst_lsb=`cat /etc/lsb-release| grep "ID" ` syst_lsb="$syst_lsb",`cat /etc/lsb-release | grep "RELEASE" ` fi # Une fois détectée, on applique un traitement adapté if test -f $distro_version_file then distro_version=`cat $distro_version_file` case "$distro_version_file" in /etc/redhat-release) distro="redhat" ;; /etc/mandrake-release) distro="mandrake" ;; /etc/gentoo-release) distro="gentoo" ;; /etc/slackware-version) distro="slackware" ;; /etc/debian_version) distro="debian" ;; *) distro="inconnue" ;; esac else distro="inconnue" fi vecho "distribution : $distro" html_tab_start html_tab_line "noyau" "$kern" html_tab_line "système LSB " "$syst_lsb" #html_tab_line "système" "$syst" html_tab_line "version système" "$distro_version" html_tab_stop } #detection du cpu #en se basant sur les infos de /proc detect_cpu () { cat /proc/cpuinfo | grep -e "^\(model name\|cpu MHz\|bogomips\)" } #détéction de la mémoire RAM. detect_mem () { cat /proc/meminfo | grep "MemTotal" #experimental: semmble détécter les barettes! cat /proc/mtrr | sed "s!^.*size=\(.*\):\(.*\),.*! \2 : \1!g" | sed "s/\(write-back\)/\1 (barette?)/g" | sed "s/\(write-combining\)/\1 (video?)/g" | sed "s/\(uncachable\)/\1 (partagé?)/g" } #detection des modules ''hard'' #En fait, on ne s'interesse qu'aux modules qui nous intéressent. #Mais quels sont-ils? detect_mod () { html_tab_start lsmod | grep -v Module| ( while read a b do ( #echo $a desc=`modinfo $a | grep "^description:" | sed 's/^description://g' ` #grep -v "^depends:" | #grep -v "^alias:" | #grep -v "^parm:"| case $desc in *Audio* | *Midi* | *sound* | *Sound* ) #FIXME: est on intéréssé par les modules de son? ;; *ether* | *Ether* | *Modem* ) #echo $a $desc html_tab_line "$a" "$desc" ;; esac #echo "### " $a $desc | indent ) done ) html_tab_stop } #detection des disques #On récupére les informations principales sur les 4 disques IDE. detect_disk () { for disk in hda hdb hdc hdd do DSK=/proc/ide/$disk if [ -d $DSK ] then media=`cat $DSK/media` model=`cat $DSK/model` echo $disk: $media: $model ( if [ cdrom != $media ] then capacity=`cat $DSK/capacity` geometry=`cat $DSK/geometry` echo "capacité: " $capacity "blocs/secteurs" echo "géométrie:" $geometry fi #echo $media #echo $model ) | indent text2 | sed "s!^!::!g" fi if [ 1 = $verbose ] then # Tant que l'on y est: liste des partitions if ! [ html = $OUTPUT ] then fdisk -l /dev/$disk | indent text2 | indent text2 fi fi done } #Detection de la configuration réseau courante. (adresses IP). detect_net () { ifconfig | grep "inet add*r" | grep -v 127.0.0.1 } #Detéction du matériel présent sur le bus PCI. detect_pci () { lspci | grep "controller:" | sed "s/^..:..\.. //g" | sed 's!controller:!:!g' } #########" Routines de détéction principale #detection de tout detect_all () { host=`hostname ` today=`date "+%A %d %B %Y"` if [ html = $OUTPUT ] then today="<small> $today </small>" echo "Description de la machine <b>$host</b> à la date du <b>$today</b>" else today="$today" fi echo ":$host:$today" | make_sample_table section "Système" detect_sys | indent section "Processeur" detect_cpu | make_sample_table section "Mémoire" detect_mem | make_sample_table section "Disques" detect_disk | make_sample_table section "Réseau" detect_net | indent section "Modules spécifiques" detect_mod | indent section "Pci" detect_pci | make_sample_table } #########" Verification de l'environnement d'execution du script. verif () { # vérification du $PATH for i in lspci ifconfig cat sed grep lsmod fdisk do if ( which $i > /dev/null ) then true else echo missing $i exit 1 fi done if [ /bin/bash != $BASH ] then echo "Désolé, ce script n'a été testé que sous bash!" exit 1 fi } #########" Programme principal verif #if [ `hostname` = $FILE ] if [ "-" = $FILE ] then detect_all else RESULT=$FILE.$OUTPUT detect_all > $RESULT fi #-- # > Toute machine qui se respecte a sa console sur un port serie... :-) # La question n'est pas de savoir si elle a une console sur port # série, # mais de savoir de quelle planète provient le connecteur ;-) # -- fr.comp.ordinosaures --- #-- #Si dieux avait créé l'Homme avec de la toile émeri au creux des mains, #Il y aurait moins de branleurs. # -- Pierre Desproges. -------------------------------------------------------------------- Les listes de diffusion occultes: <URL:http://www.CULTe.org/listes/>