(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/>