Config-IPFilter

 view release on metacpan or  search on metacpan

lib/Config/IPFilter.pm  view on Meta::CPAN

                sub {
                    $_[0]->lower cmp $_[1]->lower
                        || $_[0]->upper cmp $_[1]->upper;
                }
            )
            )
        {   syswrite $IPFilter, $rule->_as_string . "\n";
        }
        return close $IPFilter;
    }

    sub is_banned {
        my ($s, $ip) = @_;
        return $s->first_rule(
            sub {
                $_->in_range($ip) && $_->access_level < 127;
            }
        ) || ();
    }

    #
    no Moose;
}
1;

=pod

=head1 NAME

Config::IPFilter - Simple, rule-based IP filter

=head1 Synopsis

    use Config::IPFilter;
    my $filter = Config::IPFilter->new;
    my $rule   = $filter->add_rule('89.238.128.0', '89.238.191.255', 127,
                                 'Example range');

    # A list of example IPv4 addresses. IPv6 works too.
    my @ipv4 = qw[89.238.156.165 89.238.156.169 89.238.156.170 89.238.167.84
        89.238.167.86 89.238.167.99];

    # Check a list of ips
    say sprintf '%15s is %sbanned', $_, $filter->is_banned($_) ? '' : 'not '
        for @ipv4;

    # Lower the acces level by one pushes it below our ban threshold
    $rule->decrease_access_level;

    # Check a list of ips
    say sprintf '%15s is %sbanned', $_,
        $filter->is_banned($_) ? 'now ' : 'still not '
        for @ipv4;

You could also load rules directly from an C<ipfilter.dat> file.

=head1 Description

    # Example of a "ipfilter.dat" file
    #
    # All entered IP ranges will be blocked in both directions. Be careful
    # what you enter here. Wrong entries may totally block access to the
    # network.
    #
    # Format:
    # IP-Range , Access Level , Description
    #
    # Access Levels:
    # 127 blocked
    # >=127 permitted

    064.094.089.000 - 064.094.089.255 , 000 , Gator.com

This entry will block the IPs from 064.094.089.000 to 064.094.089.255, i.e.
your code should not connect to any IP in this range.

At the moment only one, read-only access level is implemented; a value at or
below C<127> means that addresses in that range are banned.

=head1 Methods

Here's a list of 'em...

=head2 my $filter = Config::IPFilter->B<new>( )

This builds a new, empty object. There are currently no expected arguments.

=head2 $filter->B<add_rule>( $rule )

This method adds a new L<range|Config::IPFilter::Rule> to the in-memory
ipfilter.

=head2 $filter->B<add_rule>( $lower, $upper, $access_level, $description )

This method coerces the arguments into a new L<rule|Config::IPFilter::Rule>
which is then added to the in-memory ipfilter.

=head2 $filter->B<count_rules>( )

Returns a tally of all loaded L<rule|Config::IPFilter::Rule>s.

=head2 $filter->B<is_empty>( )

Returns a boolean value indicating whether or not there are any
L<rule|Config::IPFilter::Rule>s loaded in the ipfilter.

=head2 $filter->B<clear_rules>( )

Deletes all L<rule|Config::IPFilter::Rule>s from the ipfilter.

=head2 $filter->B<load>( $path )

Slurps an C<ipfilter.dat>-like file and adds the
L<rule|Config::IPFilter::Rule>s found inside to the ipfilter.

=head2 $filter->B<save>( $path )

Stores the in-memory ipfilter to disk.

=head2 $filter->B<is_banned>( $ip )

If C<$ip> is banned, the first L<rule|Config::IPFilter::Rule> in which it was
found below the threshold is returned.

If not, a false value is returned. Currently, rules with an
L<< access_level|Config::IPFilter::Rule/"$filter->B<access_level>( )" >> at or
below C<127> are considered banned.

=head1 IPv6 Support



( run in 2.561 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )