#!/usr/local/bin/perl -w ######################################################################## # (C) 2001, Workhorse Computing # All rights reserved. # This code is released under the same terms as Perl, see the # Artistic License for a complete definition. ######################################################################## ######################################################################## # housekeeping ######################################################################## # matches the file name: diskfrie.pm local $/; use Parse::RecDescent; use Quantum::Superpositions; { package Quantum::Duality; use overload q{""} => sub { $_[0] }, q{+0} => sub { $_[1] }, q{cmp} => sub { $_[2] ? $_[1]->[0] cmp $_[0] : $_[0]->[0] cmp $_[1] }, q{<=>} => sub { $_[2] ? $_[1]->[1] <=> $_[0] : $_[0]->[1] <=> $_[1] }, ; } ######################################################################## # real work begins here ######################################################################## # generate a parser from the __DATA__ section of this # file (see below) then call its "input" rule passing # it the result of running "df -k" on the system. the # parser hands back a reference to an array of blessed # disk informatin. my $mountz = Parse::RecDescent->new( )->input( qx(df -k) ) or die "Roadkill: bad data"; # display df on the mount points that are over the threshold. if( my $overz = any( @$mountz ) > 90 ) { print "\n", qx(df -k @$overz), "\n"; } # keep the shell happy 0 __DATA__ ######################################################################## # # df -k on a bsd system looks like: # # Filesystem kbytes used avail capacity Mounted on # /proc 0 0 0 0% /proc # /dev/md/dsk/d2 1987399 1034737 893041 54% / # fd 0 0 0 0% /dev/fd # /dev/md/dsk/d11 3009327 55418 2893723 2% /var # # on a linux box with devfs it might look like: # # Filesystem 1k-blocks Used Available Use% Mounted on # /dev/scsi/host0/bus0/target0/lun0/part2 # 323536 179936 127216 59% /var # /dev/scsi/host0/bus0/target0/lun0/part3 # 2070736 309308 1656572 16% /scratch # /lvm/vg00/lvol1 486344 418760 43008 91% /opt/src # /lvm/vg00/lvol2 258832 2060 243668 1% /backup # # # problem is to figure out which drives are over the threshold # and need to be reported. # ######################################################################## { $::HD_HINT = $::HD_TRACE = 1 if $^P } input : input : line(s) { $return = \@dir } line : path number(s) '%' path { push @dir, bless [ $item[-1], $item{number}->[-1] ], 'Quantum::Duality' } | /.+/ { 1 } path : m{/\S+} { $return = $item[1] } number : /\d+/ { $return = $item[1] }