#!/bin/ksh
##----------------------------------------------------------------------------
# ATTENTION : Pour lecture plus clair tapez :tabstop=3 sous vi ou positionner
# ---------   "set tabstop=3" dans le fichier ".exrc"
## Script  : bdfa
## Version : 2.0.0
## Objet   : Formatage de la commande bdf.
## Auteur  : Cedrick GAILLARD
##----------------------------------------------------------------------------
# 1.0.0 27-oct-06 - Cedrick - Creation
# 1.0.1 19-mar-07 - Cedrick - Ajout du PATH
# 1.1.0 19-mar-07 - Cedrick - modification du script en profondeur
#                             pour une selection du/des chemin(s) plus vaste.
# 2.0.0 02-jul-08 - Cedrick - reecriture quasi complete avec apparition de:
#                              - taille affichees du Ko jusqu'au Yo
#                              - plus de doublon sur les FS nfs
#                              - amelioration syntaxique
# 2.0.1 30-jul-08 - Cedrick - modification du code pour corriger les problemes suivants:
#                              - bdfa ne remontait pas jusqu'a la racine lors de: bdfa /somedir
#                              - bdfa ne prenais pas bien en compte le repertoire "."
# 2.0.2 02-avr-09 - Cedrick - Utilisation de df pour localiser le point de montage.
# 2.1.0 13-aou-09 - Cedrick - le metrique (M,G,Y,Etc...) est sur un caractere maintenant.
#                           - ajout du total de tout les FS en fin de calcul
#                           - correction de l'anayse des chemins donnes en argument.
# 3.0.0 21-sep-09 - cedrick - reecriture complete.
#                           - beaucoup plus rapide.
#                           - affichage du total si plus d'un FS.
#                           - accepte tous les arguments de bdf.
#                             
#-----------------------------------------------------------------------------
##
## Ce script permet d'afficher la sortie d'un bdf sans chevauchement de ligne
## l'option -i de bdf est utilisee ce qui permet d'afficher des informations
## sur les inodes.
##

[ "$(uname -s)" != "HP-UX" ] && {
   echo "Erreur: script indisponible pour [ $(uname -s) ]."
   exit
}

# Initialisations
SUFFIXES="KMGTPEZY"
MAX_SUFF=${#SUFFIXES}

# On recupere la sortie du bdf et on met sur une ligne ce qui doit l'etre
BDF_OUTPUT=$(bdf -i $@ |tail +2 |sed -e '/^[^ ][^ ]*$/{
N
s/[ ]*\n[ ]*/ /
}')

# On recupere les types de FS presents montés sur le systeme
MNT_OUTPUT=$(awk '{if($3 ~ "^"autofs"$") {next} else {printf("%s %s\n",$1, $3)}}' /etc/mnttab)

#------------------------------------------------------------------------------#
# Fonction retournant les nombres convertis avec leur suffixe.
#
calc_number () {
	NUMBER=$1
	ITERATION=1
	while [ "$NUMBER" -gt "1023" ]
	do
		[ "$ITERATION" -ge "$MAX_SUFF" ] && break
		ITERATION=$(($ITERATION + 1))
		NUMBER=$(echo "scale=2; $NUMBER / 1024" |bc)
	done

	NUMBER=$(printf "%.2f" $NUMBER)
	[ -n "$(echo "$NUMBER" |fgrep ".00")" ] && {
		NUMBER=$(printf "%.0f" $NUMBER)
	}
	echo "${NUMBER}$(echo $SUFFIXES |cut -c${ITERATION})"
}
#
# Fin - calc_number
#------------------------------------------------------------------------------#


#------------------------------------------------------------------------------#
# affiche le resultat
#
printf_data () {
	if [ "${#}" -gt "4" ]
		then
			printf "%-${LENGTH_LV}s %8s %8s %8s %5s %8s %8s %5s %5s %s\n" "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}"
		else
			printf "%${LENGTH_LV}s %8s %8s %8s\n" $1 $2 $3 $4
	fi
}
#
# Fin - printf_data
#------------------------------------------------------------------------------#

# On compte le nombre de caracteres du premier champ avec awk
LENGTH_LV=$(echo "${BDF_OUTPUT}" |awk 'BEGIN{name=0} {
	if(length($1) > name) {
		name=length($1)
	}
} END {
	print name
}')

# Affichage de l'En-tete
printf_data 'File System' Size Used Avail '%Used' Inodes Ifree '%IUsed' Type '%Mounted On'

TSIZE=0 TUSED=0 TAVAIL=0
# On met en forme
echo "${BDF_OUTPUT}" |while read LVOL SIZE USED AVAIL PUSED IUSED IFREE IUSE MOUNTED
do
	TSIZE=$(($TSIZE + $SIZE))
	TUSED=$(($TUSED + $USED))
	TAVAIL=$(($TAVAIL + $AVAIL))

	SIZE=$(calc_number $SIZE)
	USED=$(calc_number $USED)
	AVAIL=$(calc_number $AVAIL)

	# Type de FS
	FS_TYPE=$(echo "$MNT_OUTPUT" |grep "^$LVOL " |cut -d" " -f2)
	printf_data $LVOL $SIZE $USED $AVAIL $PUSED $IUSED $IFREE $IUSE $FS_TYPE $MOUNTED
done

# Affichage du total si plusieurs FS affiches
[ "$(echo "${BDF_OUTPUT}" |wc -l)" -gt "1" ] && {
	TSIZE=$(calc_number $TSIZE)
	TUSED=$(calc_number $TUSED)
	TAVAIL=$(calc_number $TAVAIL)
	printf_data -------- -------- -------- --------
	printf_data "Total:" $TSIZE $TUSED $TAVAIL
}

