(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!^\(.*\)$!\&nbsp;\&nbsp;\&nbsp;\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/>