[Rt-commit] r5946 - in rtir/branches/2.1-EXPERIMENTAL: . lib/RT

ruz at bestpractical.com ruz at bestpractical.com
Fri Sep 15 18:45:56 EDT 2006


Author: ruz
Date: Fri Sep 15 18:45:55 2006
New Revision: 5946

Modified:
   rtir/branches/2.1-EXPERIMENTAL/   (props changed)
   rtir/branches/2.1-EXPERIMENTAL/Makefile.PL
   rtir/branches/2.1-EXPERIMENTAL/lib/RT/Action/RTIR_FindIP.pm
   rtir/branches/2.1-EXPERIMENTAL/lib/RT/IR.pm

Log:
 r1568 at cubic-pc:  cubic | 2006-09-16 02:55:52 +0400
 CIDR
 * add support for CIDR blocks in:
 ** messages
 ** searches


Modified: rtir/branches/2.1-EXPERIMENTAL/Makefile.PL
==============================================================================
--- rtir/branches/2.1-EXPERIMENTAL/Makefile.PL	(original)
+++ rtir/branches/2.1-EXPERIMENTAL/Makefile.PL	Fri Sep 15 18:45:55 2006
@@ -19,10 +19,20 @@
 unshift @INC, $local_lib_path, $lib_path;
 requires('RT::FM');
 
+# RTIR needs this version of SB due lack
+# of features in priviouse
 requires('DBIx::SearchBuilder', 1.40);
+
+# work hours
 requires('Business::Hours');
+# service level agreement
 requires('Business::SLA');
+# whois tool
 requires('Net::Whois::RIPE');
+# CIDR parsing and converting
+requires('Net::CIDR');
+requires('Regexp::Common::net::CIDR');
+
 auto_install();
 
 substitute( {

Modified: rtir/branches/2.1-EXPERIMENTAL/lib/RT/Action/RTIR_FindIP.pm
==============================================================================
--- rtir/branches/2.1-EXPERIMENTAL/lib/RT/Action/RTIR_FindIP.pm	(original)
+++ rtir/branches/2.1-EXPERIMENTAL/lib/RT/Action/RTIR_FindIP.pm	Fri Sep 15 18:45:55 2006
@@ -6,6 +6,7 @@
 use base qw(RT::Action::RTIR);
 
 use Regexp::Common qw(net);
+use Regexp::Common::net::CIDR ();
 
 =head2 Prepare
 
@@ -31,7 +32,7 @@
     my $attach = $self->TransactionObj->ContentObj;
     return 1 unless $attach && $attach->id;
 
-    my @IPs = ( $attach->Content =~ /($RE{net}{IPv4})/g );
+    my @IPs = ( $attach->Content =~ /($RE{net}{IPv4})/go );
     foreach ( @IPs ) {
         my ($status, $msg) = $ticket->AddCustomFieldValue(
             Value => $_,
@@ -40,6 +41,22 @@
         $RT::Logger->error("Couldn't add CF value: $msg") unless $status;
     }
 
+    my @CIDRs = ( $attach->Content =~ /$RE{net}{CIDR}{IPv4}{-keep}/go );
+    while ( my ($addr, $bits) = splice @CIDRs, 0, 2 ) {
+        my $cidr = join( '.', map $_||0, (split /\./, $addr)[0..3] ) ."/$bits";
+        my ($sip, $eip) = split /-/, ( (Net::CIDR::cidr2range( $cidr ))[0] or next );
+        $RT::Logger->crit("$sip - $eip");
+        my $snum = unpack( 'N', pack( 'C4', split /\./, $sip ) );
+        my $enum = unpack( 'N', pack( 'C4', split /\./, $eip ) );
+        while ( $snum++ <= $enum ) {
+            my ($status, $msg) = $ticket->AddCustomFieldValue(
+                Value => join( '.', unpack( 'C4', pack( 'N', $snum ) ) ),
+                Field => $cf,
+            );
+            $RT::Logger->error("Couldn't add CF value: $msg") unless $status;
+        }
+    }
+
     return 1;
 }
 

Modified: rtir/branches/2.1-EXPERIMENTAL/lib/RT/IR.pm
==============================================================================
--- rtir/branches/2.1-EXPERIMENTAL/lib/RT/IR.pm	(original)
+++ rtir/branches/2.1-EXPERIMENTAL/lib/RT/IR.pm	Fri Sep 15 18:45:55 2006
@@ -102,7 +102,9 @@
 # store IPs in "%03d.%03d.%03d.%03d" format so ops
 # like > and < make sense.
 use Hook::LexWrap;
-use Regexp::Common qw(net);
+use Regexp::Common qw(RE_net_IPv4);
+use Regexp::Common::net::CIDR;
+require Net::CIDR;
 
 # limit formatting "%03d.%03d.%03d.%03d"
 require RT::Tickets;
@@ -113,7 +115,7 @@
     };
 
 # "= 'sIP-eIP'" => "( >=sIP AND <=eIP)"
-# "! 'sIP-eIP'" => "( <sIP AND >eIP)"
+# "!= 'sIP-eIP'" => "( <sIP AND >eIP)"
 wrap 'RT::Tickets::_CustomFieldLimit',
     pre => sub {
         return unless $_[3] =~ /^\s*($RE{net}{IPv4})\s*-\s*($RE{net}{IPv4})\s*$/o;
@@ -123,6 +125,14 @@
         $tickets->_CustomFieldLimit($field, ($negative? '<': '>='), $start_ip, @rest);
         @_[2, 3] = ( ( $negative? '>': '<=' ), $end_ip );
     };
+
+# "[!]= 'CIDR'" => "op 'sIP-eIP'"
+wrap 'RT::Tickets::_CustomFieldLimit',
+    pre => sub {
+        return unless $_[3] =~ /^\s*$RE{net}{CIDR}{IPv4}{-keep}\s*$/o;
+        my $cidr = join( '.', map $_||0, (split /\./, $1)[0..3] ) ."/$2";
+        $_[3] = (Net::CIDR::cidr2range( $cidr ))[0] || $_[3];
+    };
 $RT::Tickets::dispatch{'CUSTOMFIELD'} = \&RT::Tickets::_CustomFieldLimit;
 
 # on OCFV create format storage
@@ -137,7 +147,7 @@
         }
     };
 
-# strip nulls(deserialize)
+# strip zero chars(deserialize)
 wrap 'RT::ObjectCustomFieldValue::Content',
     post => sub {
         return unless $_[-1];


More information about the Rt-commit mailing list