The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

  IPTables::IPv4::DBTarpit::Tools - to manipulate tarpit database

SYNOPSIS

  use IPTables::IPv4::DBTarpit::Tools qw(
        $DBTP_ERROR
        inet_aton
        inet_ntoa
        bdbversion
        libversion
        db_strerror
);

  $tool = new IPTables::IPv4::DBTarpit::Tools (
        # defaults shown - one or more db's
        dbfile  =>      ['tarpit','... etc'],
        dbhome  =>      '/var/run/dbtarpit',
        umask   =>      007,
  # optional
        txtfile =>      ['name1','... etc'],
        recover =>      1,
  );

  $string = db_strerror($DBTP_ERROR);
  $tool = new IPTables::IPv4::DBTarpit::Tools(%hash);
  $tool->closedb;
  $rv = $tool->get($db,$4byteIPaddress);
  ($key,$data) = $tool->getrecno($db,$recno);
  $rv = $tool->remove($db,$4byteIPaddress);
  $rv = $tool->put($db,$4byteIPaddress,$value);
  $rv = $tool->touch($db,$4byteIPaddress,$timestamp);
  $rv = $tool->sync($db);
  $rv = $tool->clear($db);
  $rv = $tool->cull($db,$age,\%hash,$nop); 
  $rv = $tool->dump($db,\%hash);
  $number = $tool->nkeys($db)
  ($string,$major,$minor,$patch)=bdbversion();
  ($string,$major,$minor,$patch)=libversion()  
  $netaddr = inet_aton($dotquad);
  $dotquad = inet_ntoa($netaddr);

DESCRIPTION

IPTables::IPv4::DBTarpit::Tools provides utilities to manage the database for IPtables QUEUE packets delivered to user space routine dbtarpit. Utilities are available to add/update the DB file as well as get, remove, and expire the host ip's in the databases.

  • $DBTP_ERROR;

    The code returned by the last DB operation. A text string representing the code will be returned by:

  • $string = db_strerror($DBTP_ERROR);

    Return a string describing the error condition in $DBTP_ERROR.

  • $tool = new IPTables::IPv4::DBTarpit::Tools(%hash);

    Open a database environment and its databases and return its reference. Returns undef on failure.

      %hash = (
            # defaults shown - one or more db's
            dbfile  =>      ['tarpit','... etc'],
            dbhome  =>      '/var/run/dbtarpit',
            umask   =>      007,
      # optional
            txtfile =>      ['name1','... etc'],
            recover =>      1,
      );
    
            dbhome  =>      '/var/run/dbtarpit',

    Default if not present. Location of BerkeleyDB sub-system files.

    The leading directories must be present and writable.

            dbfile  =>      ['tarpit','...etc'],

    Default is 'tarpit' if not present. However, if 'dbfile' is omitted and 'txtfile' is present, no 'dbfile' will be forced by default. BerkeleyDB file located in dbhome containing keys which are four byte ip address's (as returned by inet_aton() and values which are time in seconds since epoch of the record update.

    The combined maximum total number of open dbfiles + txtfiles must be 10 or less.

    Multiple db files may be created, each referenced in other methods by the file name specified. The dbname will be the file portion of the path/file database name.

    The home directory and database will be created if they do not exist. However, the parent directories for dbhome must already exist and have adequate premissions.

            umask   =>      007,

    Default if omitted. Files and directories are created with mode 0666 and 0777, respectively, masked with 'umask' of 007 by default.

            txtfile =>      ['name1','name2', etc...]

    Optional database(s) that take text as the value. The databases specified by dbfile only accept and return unsigned long timestamps.

            recover =>      1, # any true value

    Use this flag if the Berkeley DB returns a DB_RUNRECOVERY error. The database environment is destroyed and recreated. Since the databases for this application are not transactional, the DB_RECOVER flag is not applicable. DBENV->remove is called to remove the corrupt environment. All other threads must be stopped and this thread run by itself. See the Berkeley DB documentation for further details.

    See: DATABASE CONFIGURATION FILE below for additional configuration options.

  • $rv = $tool->closedb();

      returns:      FALSE unconditional
    
      Close the database files
  • $rv = $tool->get($db,$4byteIPaddress);

      input:        dbname,
                    address,  # as returned by inet_aton()
    
      For dbfile type db's:
      returns:      action code or
                    time (seconds) of last update
                      or
                    undef if db or key not found
                      or
                    0 on ERROR (real db error)
      NOTE: the error will be in $DBTP_ERROR.
            Use $tool->db_error($DBTP_ERROR) to
            get a string describing the error.
    
      For txtfile type db's:
      returns:      text string
  • ($key,$data) = $tool->getrecno($db,$recno);

      input:        dbname,
                    record number
    
      for all types the first element,
      returns:      a key consisting of
                    a 4byteIPaddress
    
      for dbaddr types a second element
      returns:      action code or
                    time (seconds) of last update
    
      for dbtxt types a second element
      returns:      text string
    
      In scalar context, returns only
            only the key -- 4byteIPaddress
    
      returns:      an empty array or undef
                    if there is a db error 
                    or record is not found
                    for array and scalar 
                    context as appropriate
      

    NOTE: (in BIG LETTERS!)

    Berkeley DB provides a "1" based numbering system for record numbers. i.e. the first record number is "1". Attempting to access record "0" will create and error, you've been warned.

  • $rv = $tool->remove($db,$4byteIPaddress);

      input:        dbname,
                    address,  # as returned by inet_aton()
            
      returns:      ZERO (null) on success
                      or
                    undef on key not found
                      or
                    non-zero, see BerkeleyDB documentation
    
      Removes database record
      
  • $rv = $tool->put($db,$4byteIPaddress,$value);

      input:        dbname,
                    address, # as returned by inet_aton()
                    value
    
      returns:      ZERO on success
                      or
                    non-zero, see BerkeleyDB documentation
    
      Update or insert a record into named database
    
      USE caution, do not insert text values into databases
      specified with B<dbfile>. You will get erroneous results.
  • $rv = $tool->touch($db,$4byteIPaddress,$timestamp);

      input:        dbname,
                    address, # as returned by inet_aton()
                    $timestamp   or current time
    
      returns:      ZERO on success
                      or
                    non-zero, see BerkeleyDB documentation
    
      Updates or creates or updates record with the
      $timestamp or current epoch time in seconds if
      $timestamp is not present. 
    
      (may be used to put arbitrary non-zero values in
      the database for test purposes -- this will break
       normal operations)
  • $rv = $tool->sync($db);

    Flush the cached pages of the database to file. $tool->sync() should be performed after database update (remove, put, touch) when the operation(s) are complete.

      input:        db name
      returns:      false on success or
                    Berkeley DB error code
  • $rv = $tool->clear($db);

    Clear a database of all records.

      input:        db name
      returns:      false on success or
                    Berkeley DB error code
  • $rv = $tool->cull($db,$age,\%hash,$nop);

      input:        dbname,
                    age in seconds from now,
                    hash pointer,
                    no operation = true
    
      returns:      number of keys removed

    Fills the %hash with 4 byte IP address and time tag for each address older than $age seconds from the current time.

    If $nop is false, the %hash represents the addresses deleted from the database. If $nop is true, no action is taken on the database. The %hash is just returned showing what action is proposed.

    This operation can consume a lot of memory and is intended primarily for use in testing on smallish databases. Use a tied %hash if you expect large arrays.

  • $rv = $tool->dump($db,\%hash);

      input:        dbname,
                    pointer to hash
    
      returns:      0 on success
                      or
                    BerkeleyDB error code

    Returns the hash filled with the contents of the database.

    This operation can consume a lot of memory and is intended primarily for use in testing on smallish databases. Use a tied %hash if you expect large arrays.

  • $number = $tool->nkeys($db)

    Returns the number of unique keys (or records) in a connected database. If there is an error, it return undef and sets the error number in $DBTP_ERROR.

      input:        database name
      returns:      number of keys
                    or zero

    Note: zero is a perfectly good answer. If the error number is also zero, then that's the real answer.

  • ($string,$major,$minor,$patch)=bdbversion();

    Returns the version of the installed Berkeley DB.

      input:        none
      output:       scalar context, a string
                    describing the version
        or          array context, the string
                    as above followed by the
                    major, minor, and patch
                    revision levels
  • ($string,$major,$minor,$patch)=libversion();

    Returns the version of the bdbtarpit library.

      input:        none
      output:       scalar context, a string
                    describing the version
        or          array context, the string
                    as above followed by the
                    major, minor, and patch
                     revision levels
  • $netaddr = inet_aton($dotquad);

    Provided for convenience. This method is the same as the one in Socket from perl 5.8. Takes a string giving the name of a host, and translates that to the 4-byte string (structure). Takes arguments of both the 'blackhole.spamcannibal.org' type and '86.1.2.4'. If the host name cannot be resolved, returns undef. For multi-homed hosts (hosts with more than one address), the first address found is returned.

  • $dotquad = inet_ntoa($netaddr);

    Provided for convenience. This method is the same as the one in Socket from perl 5.8. Takes a four byte ip address (as returned by inet_aton()) and translates it into a string of the form 'd.d.d.d' where the 'd's are numbers less than 256 (the normal readable four dotted number notation for internet addresses).

DATABASE CONFIGURATION FILE [optional]

Usually used to increase database cache size.

Most of the configuration information that can be specified to DB_ENV methods can also be specified using a configuration file. Any file named DB_CONFIG in the database home directory will be read for lines of the format NAME VALUE.

One or more whitespace characters are used to delimit the two parts of the line, and trailing whitespace characters are discarded. All empty lines or lines whose first character is a whitespace or hash (#) character will be ignored. Each line must specify both the NAME and the VALUE of the pair. The specific NAME VALUE pairs are documented in the Berkeley DB manual for the corresponding methods.

See: http://www.sleepycat.com/docs/ref/env/db_config.html

DEPENDENCIES

        none

EXPORT

        DB_NOTFOUND
        DB_RUNRECOVERY

EXPORT_OK

        $DBTP_ERROR 
        inet_aton
        inet_ntoa
        bdbversion
        libversion
        db_strerror

ACKNOWLEDGEMENTS

inet_aton and inet_ntoa have been included with a few modifications from perl-5.80 by Larry Wall, copyright 1989-2002. Thank you Larry for making PERL possible for all of us.

Much of how to write this module and the bdb functions in the SpamCannibal package I learned from reading the source code of Paul Marquess's BerkeleyDB-0.20. The versioning information for Berkeley DB was all taken directly from Paul's module. Thanks Paul.

COPYRIGHT

Copyright 2003 - 2008, Michael Robinton <michael@bizsystems.com> 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.

AUTHOR

Michael Robinton <michael@bizsystems.com>

SEE ALSO

perl(1), Socket(3)

1 POD Error

The following errors were encountered while parsing the POD:

Around line 527:

=cut found outside a pod block. Skipping to next block.