--- parse_df.pl 2002/07/16 14:39:53 1.6 +++ parse_df.pl 2003/05/13 16:00:53 1.11 @@ -5,13 +5,14 @@ # filesystems in same order always) # # Dobrica Pavlinusic +# http://www.rot13.org/~dpavlin/sysadm.html # # Usage: # -# parse_df.pl "ssh -i ~cricket/.ssh/df host.dom" /mount_point +# parse_df.pl "ssh -i ~cricket/.ssh/df target.host" /mount_point # ssh into remote host and get data for /mount_point # -# parse_df.pl "ssh -i ~cricket/.ssh/df --config" +# parse_df.pl "ssh -i ~cricket/.ssh/df target.host" --config # dump configuration file to stdout # @@ -20,22 +21,43 @@ my $ssh = shift @ARGV || ""; my $mount = shift @ARGV || "/"; -my %df; +# do we have Cache::FileCache installed? + +my $USE_CACHE = 0; +eval("use Cache::FileCache;"); +if (! $@) { $USE_CACHE = 1; } + +my $df; + +my $cache = new Cache::FileCache() if ($USE_CACHE); sub parse_df { my $ssh = shift @_; - open(DF,"$ssh df -k |") || die "$ssh df: $!"; + if ($USE_CACHE) { + print STDERR " [using cache] "; + $df = $cache->get( $ssh ); + return if (defined $df); + print STDERR " [cache miss] "; + } + eval { + local $SIG{ALRM} = sub { die "ssh timeout\n"; }; + alarm 10; # wait for ssh to connect and return first line + open(DF,"$ssh df -klP |") || die "$ssh df: $!"; + }; + print STDERR " read DF eof=",eof(DF); while() { chomp; my ($node,$total,$used,$aval,$use_pcnt,$mount) = split(/\s+/,$_,6); if ($use_pcnt && $use_pcnt =~ s/(\d+)%/$1/) { # print STDERR "$_\n"; -# $df{$mount}=$use_pcnt; - $df{$mount}=$used * 100 / $total if ($total != 0); -# print $df{$mount}," == $use_pcnt\n"; +# $df->{$mount}=$use_pcnt; + $df->{$mount}=$used * 100 / $total if ($total != 0); +# print $df->{$mount}," == $use_pcnt\n"; } } close(DF); + alarm 0; # turn alarm off + $cache->set( $ssh, $df, "1 min" ) if ($USE_CACHE); } parse_df($ssh); @@ -49,7 +71,7 @@ EOF my @targets; - foreach my $mnt (keys %df) { + foreach my $mnt (keys %{$df}) { my $target = $mnt; if ($mnt eq "/") { $target = "root"; @@ -76,5 +98,5 @@ # dump free % # -print $df{$mount} || "unknown"; +print $df->{$mount} || "unknown"; print "\n";