[Rt-commit] r5692 - in rtir/branches/2.1-EXPERIMENTAL: .

ruz at bestpractical.com ruz at bestpractical.com
Wed Aug 2 16:35:09 EDT 2006


Author: ruz
Date: Wed Aug  2 16:35:08 2006
New Revision: 5692

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

Log:
 r1543 at cubic-pc:  cubic | 2006-08-02 07:17:24 +0400
 * store IP in special format
 * searches by IP ranges


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	Wed Aug  2 16:35:08 2006
@@ -96,6 +96,60 @@
 
 }
 
+
+# IPs processing hooks
+# in order too implement searches by IP ranges we
+# store IPs in "%03d.%03d.%03d.%03d" format so ops
+# like > and < make sense.
+use Hook::LexWrap;
+use Regexp::Common qw(net);
+
+# limit formatting "%03d.%03d.%03d.%03d"
+require RT::Tickets;
+wrap 'RT::Tickets::_CustomFieldLimit',
+    pre => sub {
+        return unless $_[3] =~ /^\s*($RE{net}{IPv4})\s*$/o;
+        $_[3] = sprintf "%03d.%03d.%03d.%03d", split /\./, $1;
+    };
+
+# "= '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;
+        my ($start_ip, $end_ip) = ($1, $2);
+        my ($tickets, $field, $op, $value, @rest) = @_[0..($#_-1)];
+        my $negative = ($op =~ /NOT|!=|<>/i)? 1 : 0;
+        $tickets->_CustomFieldLimit($field, ($negative? '<': '>='), $start_ip, @rest);
+        @_[2, 3] = ( ( $negative? '>': '<=' ), $end_ip );
+    };
+$RT::Tickets::dispatch{'CUSTOMFIELD'} = \&RT::Tickets::_CustomFieldLimit;
+
+# on OCFV create format storage
+require RT::ObjectCustomFieldValue;
+wrap 'RT::ObjectCustomFieldValue::Create',
+    pre => sub {
+        for ( my $i = 1; $i < @_; $i += 2 ) {
+            next unless $_[$i] && $_[$i] eq 'Content';
+            return unless $_[++$i] =~ /^\s*($RE{net}{IPv4})\s*$/o;
+            $_[$i] = sprintf "%03d.%03d.%03d.%03d", split /\./, $1;
+            return;
+        }
+    };
+
+# strip nulls(deserialize)
+wrap 'RT::ObjectCustomFieldValue::Content',
+    post => sub {
+        return unless $_[-1];
+        if ( ref $_[-1] ) {
+            return unless $_[-1][0] =~ /^\s*($RE{net}{IPv4})\s*$/;
+            $_[-1][0] = sprintf "%d.%d.%d.%d", split /\./, $1;
+        } else {
+            return unless $_[-1] =~ /^\s*($RE{net}{IPv4})\s*$/;
+            $_[-1] = sprintf "%d.%d.%d.%d", split /\./, $1;
+        }
+    };
+
 eval "require RT::IR_Vendor";
 die $@ if ($@ && $@ !~ qr{^Can't locate RT/IR_Vendor.pm});
 eval "require RT::IR_Local";


More information about the Rt-commit mailing list