X-Git-Url: https://defaria.com/gitweb/?a=blobdiff_plain;f=clients%2FGD%2FFSMon%2FFilesystem.pm;fp=clients%2FGD%2FFSMon%2FFilesystem.pm;h=3d230d6fd83d6988d51346644b391c7a1e1c0348;hb=a8c84d2892f07a6863b68a11eb0a4a79ffd71fb5;hp=0000000000000000000000000000000000000000;hpb=95384f94f88aceeb5eef2d322210ba4a438b6512;p=clearscm.git diff --git a/clients/GD/FSMon/Filesystem.pm b/clients/GD/FSMon/Filesystem.pm new file mode 100644 index 0000000..3d230d6 --- /dev/null +++ b/clients/GD/FSMon/Filesystem.pm @@ -0,0 +1,324 @@ +=pod + +=head2 NAME $RCSfile: FileSystem.pm,v $ + +Object oriented interface to filesystems + +=head2 VERSION + +=over + +=item Author: + +Andrew DeFaria + +=item Revision: + +$Revision: $ + +=item Created: + +Thu Dec 11 10:39:12 MST 2008 + +=item Modified: + +$Date:$ + +=back + +=head2 SYNOPSIS + +This module implements a FileSystem object. + + $fs = new FileSystem ("hosta"); + + while ($fs->filesystem) { + display "Filesystem: $_"; + display "\tSize:\t$fs{$_}->size"; + display "\tUsed:$fs{$_}->used"; + display "\tFree:$fs{$_}->free"; + display "\tUsed %:$fs{$_}->usedPct"; + display "\tMounted on:$fs{$_}->mount"; + } # while + +=head2 DESCRIPTION + +Filesystem creates a filesystem object that encapsulates information +about the file system as a whole. + +=head2 ROUTINES + +The following routines are exported: + +=over + +=cut + +use strict; +use warnings; + +package Filesystem; + +use base "Exporter"; + +use OSDep; +use Display; +use Utils; +use Rexec; + +=pod + +=head3 new () + +Construct a new Filesystem object. The following OO style arguments are +supported: + +Parameters: + +=for html
+ +=over + +=item none + +Returns: + +=for html
+ +=over + +=item Filesystem object + +=back + +=for html
+ +=cut + +sub new ($;$$$$) { + my ($class, $system, $ostype, $username, $password, $prompt, $shellstyle) = @_; + + # Set prompt if not passed in + $prompt ||= $Rexec::default_prompt; + + # Connect to remote machine + my $remote = new Rexec ( + host => $system, + username => $username, + password => $password, + prompt => $prompt, + shellstyle => $shellstyle, + ); + + unless ($remote) { + error "Unable to connect to $system"; + + return undef; + } # if + + my (@fs, %fs); + + # Sun is so braindead! + if ($ostype eq "Unix") { + foreach ("ufs", "vxfs") { + my $cmd = "/usr/bin/df -k -F $_"; + + my @unixfs = $remote->exec ($cmd); + + if ($remote->status != 0) { + error ("Unable to determine fsinfo on $system ($cmd)\n" . join ("\n", @fs));; + return undef; + } # if + + # Skip heading + shift @unixfs; + + for (my $i = 0; $i < scalar @unixfs; $i++) { + my (%fsinfo, $firstField); + + # Trim leading and trailing spaces + $unixfs[$i] =~ s/^\s+//; + $unixfs[$i] =~ s/\s+$//; + + my @fields = split /\s+/, $unixfs[$i]; + + if (scalar @fields == 1) { + $fsinfo{fs} = $fields[0]; + $firstField = 0; + $i++; + + # Trim leading and trailing spaces + $unixfs[$i] =~ s/^\s+//; + $unixfs[$i] =~ s/\s+$//; + + @fields = split /\s+/, $unixfs[$i];; + } else { + $fsinfo{fs} = $fields[0]; + $firstField = 1; + } #if + + $fsinfo{size} = $fields[$firstField] * 1024; + $fsinfo{used} = $fields[$firstField + 1] * 1024; + $fsinfo{free} = $fields[$firstField + 2] * 1024; + $fsinfo{reserve} = $fsinfo{size} - $fsinfo{used} - $fsinfo{free}; + + $fs{$fields[$firstField + 4]} = \%fsinfo; + } # for + } # foreach + } elsif ($ostype eq "Linux") { + foreach ("ext3") { + my $cmd = "/bin/df --block-size=1 -t $_"; + + my @linuxfs = $remote->exec ($cmd); + + if ($remote->status != 0) { + error ("Unable to determine fsinfo on $system ($cmd)\n" . join ("\n", @fs));; + return undef; + } # if + + # Skip heading + shift @linuxfs; + + foreach (@linuxfs) { + my %fsinfo; + my @fields = split; + + $fsinfo{fs} = $fields[0]; + $fsinfo{size} = $fields[1]; + $fsinfo{used} = $fields[2]; + $fsinfo{free} = $fields[3]; + $fsinfo{reserve} = $fsinfo{size} - $fsinfo{used} - $fsinfo{free}; + + $fs{$fields[5]} = \%fsinfo; + } # foreach + } # foreach + } else { + error "Can't handle $ostype", 1; + } # if + + bless \%fs, $class; +} # new + +=pod + +=head3 mounts () + +Returns an array of mount points + +Parameters: + +=for html
+ +=over + +=item none + +None + +=back + +=for html
+ +Returns: + +=for html
+ +=over + +=item Array of mount points + +=back + +=for html
+ +=cut + +sub mounts () { + my ($self) = shift; + + return keys %{$self} +} # mounts + +=pod + +=head3 getFSInfo ($mount) + +Returns a hash of filesystem info for a mount point + +Parameters: + +=for html
+ +=over + +=item $mount: Mount point + +None + +=back + +=for html
+ +Returns: + +=for html
+ +=over + +=item Hash of filesystem info + +=back + +=for html
+ +=cut + +sub getFSInfo ($) { + my ($self, $mount) = @_; + + return %{$self->{$mount}}; +} # getFSInfo + +1; + +=back + +=head2 CONFIGURATION AND ENVIRONMENT + +None + +=head2 DEPENDENCIES + + Display + OSDep + Utils + +=head2 INCOMPATABILITIES + +None yet... + +=head2 BUGS AND LIMITATIONS + +There are no known bugs in this module. + +Please report problems to Andrew DeFaria (Andrew@ClearSCM.com). + +=head2 LICENSE AND COPYRIGHT + +This Perl Module is freely available; you can redistribute it and/or +modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +This Perl Module is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License (L) for more +details. + +You should have received a copy of the GNU General Public License +along with this Perl Module; if not, write to the Free Software Foundation, +Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +reserved. + +=cut