Hi Folks,

This is a module that I wrote for in-house use as I am somewhat apprehensive
about the reliability of low-end SATA raid controllers.  Admittedly, this
module scratches a rather niche itch.  My two questions are a) is this
functionality general enough to warrant placing it on CPAN and b) is the
namespace appropriate?

Cheers,

-J

--
NAME
    File::Corruption - Detect file corruption

SYNOPSIS
        use File::Corruption;
        use File::Find::Rule;

        my $checker= File::Corruption->new(
            db          => './test.yml',
            verbose     => 1,
            autoflush   => 1,
        );

        my $checker2 = $checker->clone;

        my @files = File::Find::Rule->file->name( '*' )->in( "." );
        my $added   = $checker->add( [EMAIL PROTECTED] );
        my $bad     = $checker->check( [EMAIL PROTECTED] );
        my $deleted = $checker->delete( [EMAIL PROTECTED] );

        print "has file\n" if $checker->has( qw( foo ) );

        $checker->save;

DESCRIPTION
    This module attempts to detect file corruption caused by errors in the
    storage medium. The design philosophy is very different from intrusion
    detection systems like Tripwire and AIDE. While both of those well known
    systems will detect and report file corruption, they will also detect
    (and report) almost *any* file modification. In contrast this module
    attempts to *stay out of your face* by ignoring intentional file
    modification and only reporting files that have had bit values
    *silently* changed.

    File corruption is detected by recording a file's "mtime" and it's SHA1
    checksum into a persistent database. The next time a file is inspected
    by "check" the file's current "mtime" is compared to the value stored in
    the database. If the "mtime"s are the same but the checksum has changed
    then the file is said to be corrupted. If the "mtime"s are different
    then the new "mtime" and checksum are recorded to the database.
    Obvously, this technique is NOT suitable for intrusion detection.

USAGE
  Import Parameters
    This module accepts no arguments to it's "import" method and exports no
    *symbols*.

  Methods
   Constructors
    * new(...)
        Accepts a mandatory hash and returns a File::Corruption object.

            my $checker = File::Corruption->new(
                db          => './foo.yml',
                verbose     => 1,
                autoflush   => 1
            );

        * db
            A file path to either a pre-existing File::Corruption YAML
            database or a location where a new database can be created. A
            pre-existing database must be writable. If a path to a new
            database is specified the directory must already exist (new
            directories will not be automatically created) and have
            permissions that allow file creation.

        * verbose
            A boolean value (0, 1, undef). Causes corrupt, non-existent, and
            non-plain files to be reported to the STDERR.

            This key is optional.

        * autoflush
            A boolean value (0, 1, undef). When set to true, check will
            flush any files from the database that were not passed in to be
            tested. This behavior is on a per invocation basis.

            This key is optional.

    * clone
        This object method returns a replica of the given object.

   Object Methods
    * add
        Accepts either a filename or an arrayref to filenames that will be
        added to the File::Corruption database.

        Returns a list of File::Corruption::Stat objects representing files
        actually added to the database. In scalar context returns either an
        arrayref to File::Corruption::Stat objects or undef if no files were
        added.

    * check
        Accepts either a filename or an arrayref to filenames that will be
        checked against the File::Corruption database. Filenames that don't
        already exist in the database will be automatically added.

        Returns a list of File::Corruption::Detected objects representing
        files that are suspected to have been corrupted. In scalar context
        returns either an arrayref to File::Corruption::Detected objects or
        undef if no corrupt files were detected.

    * delete
        Accepts either a filename or an arrayref to filenames that will be
        deleted from the File::Corruption database.

        Returns a list of File::Corruption::Stat objects representing the
        files actually deleted from the database. In scalar context returns
        either an arrayref to File::Corruption::Stat objects or undef if no
        files were deleted.

    * has
        Accepts a filename.

        Returns a File::Corruption::Stat object if the filename has an entry
        in the database or undef if it doesn't.

    * save
        Accepts no arguments. Writes the in memory database to disk.

   Destructors
    * DESTROY
        Calls save.

DEVELOPER NOTES
    In the environment this module was development in the file processing is
    completely I/O bound. If this was not the case, performance could be
    enhanced on SMP systems by placing the files to be "check"ed into a work
    queue and having them processed by a pool of worker threads.

    If you believe that your environment is CPU bound and would scale with
    multi-threading please e-mail the author.

REFERENCES
    * Tripwire

        <http://www.tripwire.com/>
        <http://www.tripwire.org/>

    * AIDE

        <http://www.cs.tut.fi/~rammer/aide.html>
        <http://sourceforge.net/projects/aide>

CREDITS
    Just me, myself, and I.

SUPPORT
    Please contact the author directly via e-mail.

AUTHOR
    Joshua Hoblitt <[EMAIL PROTECTED]>

COPYRIGHT
    Copyright (C) 2004 Joshua Hoblitt. All rights reserved.

    This program is free software; 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 program 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 for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

    The full text of the license can be found in the LICENSE file included
    with this module, or in the perlgpl Pod as supplied with Perl 5.8.1 and
    later.

SEE ALSO
    File::Corruption::Stat, File::Corruption::Detected, stat(2),
    Digest::SHA1

Reply via email to