The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package DBD::Sys::Plugin::Any::FileSysDf;

use strict;
use warnings;

use vars qw($VERSION @colNames);

use base qw(DBD::Sys::Table);

=pod

=head1 NAME

DBD::Sys::Plugin::Any::FileSysDf - provides a table containing the free space of file systems

=head1 SYNOPSIS

  $filesysdf = $dbh->selectall_hashref("select * from filesysdf", "mountpoint");

=head1 ISA

  DBD::Sys::Plugin::Any::FileSysDf
  ISA DBD::Sys::Table

=cut

my $haveFilesysDf;

$VERSION  = "0.102";
@colNames = qw(mountpoint blocks bfree bavail bused bper files ffree favail fused fper);

=head1 DESCRIPTION

This module provides the table <filesysdf> which contains the free space
on file systems.

=head2 COLUMNS

=head3 mountpoint

The friendly name of the filesystem. This will usually be the same
name as appears in the list returned by the filesystems() method.

=head3 blocks

Total blocks existing on the filesystem.

=head3 bfree

Total blocks free existing on the filesystem.

=head3 bavail

Total blocks available to the user executing the Perl application.
This can be different than C<bfree> if you have per-user quotas on
the filesystem, or if the super user has a reserved amount.
C<bavail> can also be a negative value because of this. For instance
if there is more space being used then you have available to you.

=head3 bused

Total blocks used existing on the filesystem.

=head3 bper

Percent of disk space used. This is based on the disk space available
to the user executing the application. In other words, if the filesystem
has 10% of its space reserved for the superuser, then the percent used
can go up to 110%.

=head3 files

Total inodes existing on the filesystem.

=head3 ffree

Total inodes free existing on the filesystem.

=head3 favail

Total inodes available to the user executing the application.
See the information for the C<bavail> column.

=head3 fused

Total inodes used existing on the filesystem.

=head3 fper

Percent of inodes used on the filesystem.
See the information for the C<bper> column.

=head1 METHODS

=head2 get_col_names

Returns the column names of the table as named in L</Columns>

=cut

sub get_col_names() { return @colNames }

=head2 get_attributes

Return the attributes supported by this module:

=head3 blocksize

Allows to specify the blocksize of the returned free blocks.
This defaults to 1.

    $dbh->{sys_filesysdf_blocksize} = 512; # use UNIX typical blocksize for df

=cut

sub get_attributes() { return qw(blocksize) }

=head2 collect_data

Retrieves the mountpoints of mounted file systems from L<Sys::Filesystem>
and determine the free space on their devices using L<Filesys::DfPortable>.
The mountpoint and the free space information are put in fetchable rows.

=cut

sub collect_data()
{
    my $self = $_[0];
    my @data;

    unless ( defined($haveFilesysDf) )
    {
        $haveFilesysDf = 0;
        eval {
            require Sys::Filesystem;
            require Filesys::DfPortable;
            $haveFilesysDf = 1;
        };
        Filesys::DfPortable->import() if ($haveFilesysDf);
    }

    if ($haveFilesysDf)
    {
        my $fs          = Sys::Filesystem->new();
        my @filesystems = $fs->filesystems( mounted => 1 );
        my $blocksize   = $self->{meta}->{blocksize} || 1;

        foreach my $filesys (@filesystems)
        {
            my @row;
            my $mountpt = $fs->mount_point($filesys);
            my $df = dfportable( $mountpt, $blocksize );
            if ( defined($df) )
            {
                @row = (
                         $fs->mount_point($filesys),
                         @$df{
                             'blocks', 'bfree',  'bavail', 'bused', 'per', 'files',
                             'ffree',  'favail', 'fused',  'fper'
                           }
                       );
            }
            else
            {
                @row = ( $fs->mount_point($filesys), (undef) x 10 );
            }
            push( @data, \@row );
        }
    }

    return \@data;
}

=head1 PREREQUISITES

L<Sys::Filesystem> and L<Filesys::DfPortable> are required in order to
fill the table C<filesysdf> with data.

=head1 AUTHOR

    Jens Rehsack			Alexander Breibach
    CPAN ID: REHSACK
    rehsack@cpan.org			alexander.breibach@googlemail.com
    http://www.rehsack.de/

=head1 COPYRIGHT

This program is free software; you can redistribute
it and/or modify it under the same terms as Perl itself.

The full text of the license can be found in the
LICENSE file included with this module.

=head1 SUPPORT

Free support can be requested via regular CPAN bug-tracking system. There is
no guaranteed reaction time or solution time, but it's always tried to give
accept or reject a reported ticket within a week. It depends on business load.
That doesn't mean that ticket via rt aren't handles as soon as possible,
that means that soon depends on how much I have to do.

Business and commercial support should be acquired from the authors via
preferred freelancer agencies.

=cut

1;