#!/bin/bash
#
# Auteurs :	Benoît			Tavernier
#				Emmanuel			Nesly
#
# But : Afficher des informations relatives à l'ordinateur
# Remerciements tout particuliers à notre bien aimé enseignant, M. Pinault.  =]
#
# Encodage : fr_FR.UTF-8


## Fonctions utilisées ##

#Affichage du type de l'OS
function disp_os()
{
	echo "Votre OS est du type" `uname -o`
	echo ""
}

#Affichage de la distribution ou de celle dont il dérive (i.e. Ubuntu dérivé de Debian)
function disp_dist()
{
	echo "Distribution (ou issue de branche)" `ls /etc/*_version | sed -r 's:^.*/([a-Z]*)_.*$:\1:'`", version" `cat /etc/*_version`
	echo ""
}

#Affichage de l'utilisateur en cours et du nom de la machine
function disp_user()
{
	echo -n "Utilisateur : $USER, machine : "
	cat /etc/hostname
	echo ""
}

#Affichage des informations relatives au CPU
function disp_cpu()
{
	echo "Infos CPU :"
	echo "----"
	if [ $1 -eq 1 ]; then
		cat /proc/cpuinfo
	else
		echo "Modèle :" `grep model\ name /proc/cpuinfo | cut -d':' -f2`
	fi

	echo "Architecture :" `uname -m`
	echo ""
}

#Affichage des informations sur la carte graphique
function disp_cg()
{
	echo "Info carte graphique :"
	echo "----"
	echo "Modèle :" `lspci | grep VGA | cut -d":" -f3`

	echo -n "Driver utilisé :" 
	grep -A50 'Section "Device"' /etc/X11/xorg.conf | grep -m1 Driver | sed -r 's/^[^"]*"([[:alpha:]]*)"$/\1/'

	echo "Autres détails :"
	glxinfo | head -3 2>/dev/null | sed -e 's/.*/\t\0/'
	echo ""
}

#Affichage des informations sur la carte (ou le chipset) audio
function disp_audio()
{
	echo "Info carte (ou chipset) audio"
	echo "----"
	echo -n "Modèle :"
	lspci | grep "Multimedia audio controller" | cut -d":" -f3
	echo "Version du gestionnaire audio utilisé :"
	cat /proc/asound/version
	echo ""
}

#cat /proc/asound/oss/sndstat

function disp_acpi()
{
	echo "info ACPI"
	echo "----"
	echo "Version :"
	acpi -V
	echo ""
}

#Affichage des périphériques détectés (disques durs, lecteurs CDROM, clés USB, webcam, etc. --ports parallèles non supportés--)
function disp_periph()
{
	echo "info périphériques"
	echo "----"
	for i in `ls /proc/ide | grep -o hd.`; do
		echo -n "Disque appelé ${i} : "
		cat /proc/ide/${i}/model 2> /dev/null || echo "?"
		echo ""
	done

	echo "Périphériques usb :"
	if [ $1 -eq 1 ]; then
		lsusb | sed -e 's/.*/\t\0/'
	else
		lsusb | sed -r "s/.*:[[:alnum:]]{4} ([[:alnum:]]*)/\t\1/" | grep -v "^[[:blank:]]*$"
	fi	
	echo ""
}

#Affichage détaillé de la mémoire utilisée, disponible
function disp_mem()
{
	echo "info mémoire"
	echo "----"
	echo "Plage globale d'attribution de mémoire :"
	cat /proc/iomem
	
	echo "Etat de la mémoire :"
	vmstat -n -S k
	free -mt
	echo ""
}

#Affichage du kernel utilisé
function disp_kernel()
{
	echo "Kernel :"
	echo "----"
	echo -n "Utilisé :"
	uname -r

	if [ $1 -eq 1 ]; then
		echo "Détails :"
		cat /proc/version
	fi

	echo "Autres disponibles :"
	if [ -e /sbin/grub ]; then
		grep ^kernel /boot/grub/menu.lst | grep -v `uname -r` | grep -o "\-[^\ ]*" | uniq
	elif [ -e /sbin/lilo ]; then
		egrep image[^=]*=[^/]*/boot/[ ]+/etc/lilo.conf | grep -v `uname -r` | grep -o "\-[^\ ]*" | uniq
	fi
	echo ""
}

#Affichage des points montés
function disp_mount()
{
	echo "Points montés :"
	echo "----"
	if [ $1 -eq 1 ]; then
		echo "Partitions système :"
		grep -v ^/dev/ /etc/mtab | cut -d" " -f1,2,3,4 | sed "s|^\([^\ ]*\)\ \([^\ ]*\)\ \([^\ ]*\)\ \([^\ ]*\)$|partition '\1' de type '\3' montée dans '\2' avec les droits '\4'|"
		echo ""
		echo "Partitions utilisateur :"
		grep ^/dev/ /etc/mtab | cut -d" " -f1,2,3,4 | sed -r "s|^([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*)$|partition '\1' de type '\3' montée dans '\2' avec les droits '\4'|"
	else
		echo "Partitions utilisateur :"
		grep ^/dev/ /etc/mtab | cut -d" " -f1,2,3 | sed -r "s|^([^ ]*) ([^ ]*) ([^ ]*)$|partition '\1' de type '\3' montée dans '\2'|"
	fi
	echo ""
}

#Affichage de l'occupation des disques
function disp_disques()
{
	echo "Occupation des disques selon les points de montage :"
	echo "----"
	df -hT --si
	echo ""
}
	
#Affichage des processus en cours
function disp_processus()
{
	echo "Processus en cours, hiérarchisés"
	echo "----"
	if [ $1 -eq 1 ]; then
		ps -efHw
	else
		pstree
	fi
	echo ""
}

#Affichage de la quantité de mémoire occupée par un dossier
function disp_taille_dossier()
{
	if [ -d $1 ]; then
		echo `du -sh --si ~ | grep -o ^[[:alnum:]]*`"o utilisés du votre dossier personnel"
	else
		echo "dossier inexistant, taille nulle" >&2
	fi
	echo ""
}

#Affichage du guide d'utilisation
function aide()
{
		echo "Ce script permet d'afficher des informations detaillées de votre système"
		echo "Usage : `basename $0` -[aAcdDgkmMopPstuv][-X fichier][-Z fichier][-h]"
		echo "Détail des options :"
		echo "-a : afficher toutes les informations suivantes :"
		echo "-A : acpi"
		echo "-c : processeur"
		echo "-d : distribution utilisée"
		echo "-D : disques"
		echo "-g : carte graphique"
		echo "-k : noyau utilisé et ceux disponibles"
		echo "-K fichier : enregistrer dans 'fichier' le tampon des messages du noyau"
		echo "-m : mémoire"
		echo "-M : partitions montées"
		echo "-o : type du système d'exploitation"
		echo "-p : processus en cours"
		echo "-P : périphériques reconnus"
		echo "-s : audio"
		echo "-t : quantité de mémoire occupée par un dossier"
		echo "-u : noms de l'utilisateur et de la machine"
		echo "-X fichier : enregistrer dans 'fichier' la trace de connexion à X"
		echo ""
		echo "-v : Mode verbeux (informations complètes sur le système)"
		echo "-h : Cette aide d'utilisation"
}

## Gestion des options et affichage des informations relatives ##
afficher=""
verbose=0

if [ $# -eq 0 ]; then 
	aide
	exit 0
else
	while getopts aAcdDghkK:mMopPst:uvX: option
	do
		case "$option" in
		"a")	afficher="disp_os disp_dist disp_user disp_cpu disp_cg disp_audio disp_acpi disp_periph disp_mem disp_kernel disp_mount disp_disques disp_processus" ;;
		"A")	afficher="$afficher disp_acpi" ;;
		"c")	afficher="$afficher disp_cpu" ;;
		"d")	afficher="$afficher disp_dist" ;;
		"D")	afficher="$afficher disp_disques" ;;
		"g")	afficher="$afficher disp_cg" ;;
		"k")	afficher="$afficher disp_kernel" ;;
		"K")	dmesg > $OPTARG ;;
		"m")	afficher="$afficher disp_mem" ;;
		"M")	afficher="$afficher disp_mount" ;;
		"o")	afficher="$afficher disp_os" ;;
		"p")	afficher="$afficher disp_processus" ;;
		"P")	afficher="$afficher disp_periph" ;;
		"s")		afficher="$afficher disp_audio" ;;
		"t")		if [ -d $OPTARG ]; then echo `du -sh --si $OPTARG | grep -o ^[[:alnum:]]*`"o utilisés sur $OPTARG"; else echo "dossier erroné" >&2; fi;;
		"u")	afficher="$afficher disp_user" ;;
		"v") verbose=1 ;;
		"X")	cp /var/log/Xorg*.log $OPTARG ;;

		"h" | *) aide;	exit 0 ;;
		esac
	done
fi

for i in $afficher; do
	eval "$i $verbose"
done


#Affichage des infos

#fin
echo "  --> tests effectués le `date`" >&2

