Juin 102011
bdf amélioré sur une seule ligne:
- affiche sur une seule ligne chaque FS
- affiche le type de FS
- affiche les Inodes
- convertit les tailles dans un format humainement lisible
- affiche un total de l’espace présent/utilisé/disponible en fin
Download : bdf.pl
#!/usr/bin/perl -w # # vim:tabstop=3:syntax=perl: # # --------- ## Script : bdf.pl ## Version : 2.0 ## Objet : bdf ameliore ##---------------------------------------------------------------------------- # 0.1 27-aou-09 - Creation Cedrick Gaillard # 2.0 31-aou-09 - Optimisation du temps d'execution # - Prise en compte des arguments de bdf # - n'affiche plus le total s'il n'y a qu'une ligne # - n'affiche plus l'entete si pas de FS a afficher. #----------------------------------------------------------------------------- # # ce script remet en forme l'output de bdf: # - les tailles sont humainement lisible # - afiche en colonne claires et espacees # - affiche l'utilisation des inodes # - affiche le total de l'espace existant/utilise/disponible # - prend en compte tous les arguments de bdf ( -t nfs | -l | -s ...) #----------------------------------------------------------------------------- use strict ; use warnings ; use Time::HiRes qw( gettimeofday tv_interval) ; # Initialisations my (@suff) = qw(K M G T P E Z Y); my $max_iterations = $#suff; # On recupere la sortie du bdf open (BDF,"bdf -i @ARGV |") or die "bdf: $!\n" ; # On recupere les types de FS presents mont�s sur le systeme open(MNTTAB,"</etc/mnttab") or die "/etc/mnttab: $!\n" ; my @mnt_brut = <MNTTAB> ; my (%fs_type) ; foreach my $mnt_line (@mnt_brut) { my @mnt_line = split(' ',$mnt_line) ; next if( $mnt_line[2] =~ m/autofs/ ) ; $fs_type{$mnt_line[0]} = ( $mnt_line[2] ) ; } close( MNTTAB ); # Fonction retournant les nombres convertis avec leur suffixe. sub calc_number { my ($number) = @_; my $iteration = 0; while ( $number > 1023 ) { last if ($iteration >= $max_iterations); $iteration++ ; $number = ($number / 1024); } $number = sprintf("%.2f",$number) ; if( $number =~ m/\.00/ ){ $number = sprintf("%d",$number) ; } $number = sprintf("%s%s",$number, $suff[$iteration]) ; return ($number) ; } # generation d'un tableau, sort un pointeur vers ce tableau sub generateur_ref_tab { my @t = () ; return \@t ; } # pour la premiere ligne my @entte = ( 'File System', 'Size', 'Used', 'Avail', '%Used', 'Inodes', 'IFree', '%IUsed', 'Mounted on', 'Type' ) ; my $index = 1 ; my $seconde_passe = 0 ; my $length = 10 ; my ($bdf_line, $nb_elem, $ref_bdf, @bdf_temp_1, @bdf_one_line) ; my ($ttotal, $utotal, $atotal) = 0 ; # Le premier enregistrement contenant le header ($bdf_one_line[0]) = (\@entte) ; foreach $bdf_line (<BDF>) { next if( $bdf_line =~ m/^Filesystem/ ) ; chomp $bdf_line ; if( $seconde_passe == 0 ){ @bdf_temp_1 = split(' ',$bdf_line) ; $ref_bdf = generateur_ref_tab() ; } else { $seconde_passe = 0 ; my $bdf_temp = join(' ', @bdf_temp_1, $bdf_line) ; @bdf_temp_1 = split(' ',$bdf_temp) ; } ($nb_elem) = $#bdf_temp_1 ; if( $nb_elem <= 1 ) { $seconde_passe = 1 ; next ; } # Calcul de la taille la plus grande if( length($bdf_temp_1[0]) > $length ) { $length = length($bdf_temp_1[0]) ; } # Total des valeurs $ttotal += $bdf_temp_1[1] ; $utotal += $bdf_temp_1[2] ; $atotal += $bdf_temp_1[3] ; # Valeurs calculees $bdf_temp_1[1] = calc_number($bdf_temp_1[1]) ; $bdf_temp_1[2] = calc_number($bdf_temp_1[2]) ; $bdf_temp_1[3] = calc_number($bdf_temp_1[3]) ; # On rajoute un champ pour garder l'ordre $bdf_temp_1[9] = $bdf_temp_1[8] ; # Type de FS $bdf_temp_1[8] = $fs_type{$bdf_temp_1[0]} ; # On place toute la ligne dans le tableau reference (@$ref_bdf) = (@bdf_temp_1) ; ($bdf_one_line[$index]) = ($ref_bdf) ; # On incremente $index++ ; } if ( $index <= 1 ) { print "Pas de FileSysteme a afficher\n" ; exit(0) ; } #Format my $lengthFS = $length ; my $lengthNB = 8 ; $index = 0 ; my ($t, $tk, $u, $uk, $a, $ak) ; my ($fs, $pu, $iu, $if, $pi, $mo, $ty) ; foreach (@bdf_one_line) { $fs = $bdf_one_line[$index][0] ; $t = $bdf_one_line[$index][1] ; $u = $bdf_one_line[$index][2] ; $a = $bdf_one_line[$index][3] ; $pu = $bdf_one_line[$index][4] ; $iu = $bdf_one_line[$index][5] ; $if = $bdf_one_line[$index][6] ; $pi = $bdf_one_line[$index][7] ; $ty = $bdf_one_line[$index][8] ; $mo = $bdf_one_line[$index][9] ; printf( "%-${lengthFS}s %${lengthNB}s %${lengthNB}s %${lengthNB}s %5s %${lengthNB}s %${lengthNB}s %6s %4s %-${lengthNB}s\n",$fs, $t, $u, $a, $pu, $iu, $if, $pi, $ty, $mo) ; $index++ ; } # On affiche pas le total s'il n'y a qu'une ligne if ( $index > 2 ) { ($ttotal) = calc_number($ttotal) ; ($utotal) = calc_number($utotal) ; ($atotal) = calc_number($atotal) ; printf( "%${lengthFS}s %${lengthNB}s %${lengthNB}s %${lengthNB}s\n","Total:", $ttotal, $utotal, $atotal); }
exemple de sortie :
$ bdf.pl File System Size Used Avail %Used Inodes IFree %IUsed Type Mounted on /dev/vg00/lvol3 1.97G 314.57M 1.65G 16% 2581 54443 5% vxfs / /dev/vg00/lvol1 1024M 147.29M 869.96M 14% 144 28048 1% vxfs /stand /dev/vg00/lvol8 6G 3.44G 2.54G 58% 42861 83763 34% vxfs /var /dev/vg00/lvol7 4G 3.25G 761.31M 81% 56491 24533 70% vxfs /usr /dev/vg00/lvol6 7.81G 3.09G 4.69G 40% 55047 154809 26% vxfs /opt /dev/vg00/lvol5 2G 16.38M 1.97G 1% 12 64980 0% vxfs /tmp /dev/vg00/lvol4 2G 16.29M 1.97G 1% 4 64988 0% vxfs /data Total: 24.78G 10.26G 14.40G