RT# 30783 Clean up IP utility code
authorMitch Jackson <mitch@freeside.biz>
Tue, 26 Jun 2018 23:18:51 +0000 (18:18 -0500)
committerMitch Jackson <mitch@freeside.biz>
Tue, 26 Jun 2018 23:21:03 +0000 (18:21 -0500)
FS/FS/IP_Mixin.pm
FS/FS/addr_block.pm
FS/FS/svc_IP_Mixin.pm

index 2d69d9c..b68b0b6 100644 (file)
@@ -264,45 +264,27 @@ sub router {
   FS::router->by_key($self->routernum);
 }
 
-=item used_addresses [ BLOCK ]
+=item used_addresses [ FS::addr_block ]
 
-Returns a list of all addresses that are in use by a service.  If called as an
-instance method, excludes that instance from the search.
+Returns a list of all addresses in use within the given L<FS::addr_block>.
 
-Does not filter by block, will return ALL used addresses. ref:f197bdbaa1
+If called as an instance method, excludes that instance from the search.
 
 =cut
 
 sub used_addresses {
-  my $self = shift;
-  my $block = shift;
-  return ( map { $_->_used_addresses($block, $self) } @subclasses );
-}
-
-sub _used_addresses {
-  my $class = shift;
-  die "$class->_used_addresses not implemented";
-}
-
-=item used_addresses_in_block [ FS::addr_block ]
-
-Returns a list of all addresses in use within the given L<FS::addr_block>
-
-=cut
-
-sub used_addresses_in_block {
   my ($self, $block) = @_;
 
   (
     $block->ip_gateway ? $block->ip_gateway : (),
     $block->NetAddr->broadcast->addr,
-    map { $_->_used_addresses_in_block($block, $self ) } @subclasses
+    map { $_->_used_addresses($block, $self ) } @subclasses
   );
 }
 
-sub _used_addresses_in_block {
+sub _used_addresses {
   my $class = shift;
-  die "$class->_used_addresses_in_block not implemented";
+  die "$class->_used_addresses not implemented";
 }
 
 =item is_used ADDRESS
index 74c372e..5fd64bf 100755 (executable)
@@ -218,7 +218,7 @@ sub free_addrs {
 
   my %used_addr_map =
     map {$_ => 1}
-    FS::IP_Mixin->used_addresses_in_block($self),
+    FS::IP_Mixin->used_addresses($self),
     FS::Conf->new()->config('exclude_ip_addr');
 
   [
@@ -254,7 +254,7 @@ sub next_free_addr {
     $selfaddr->addr,
     $selfaddr->network->addr,
     $selfaddr->broadcast->addr,
-    FS::IP_Mixin->used_addresses_in_block($self)
+    FS::IP_Mixin->used_addresses($self)
   );
 
   # just do a linear search of the block
index 4266a2a..0fce86c 100644 (file)
@@ -91,38 +91,21 @@ sub svc_ip_check {
 }
 
 sub _used_addresses {
+  my ($class, $block, $exclude_svc) = @_;
 
-  # Returns all addresses in use.  Does not filter with $block. ref:f197bdbaa1
-
-  my ($class, $block, $exclude) = @_;
-  my $ip_field = $class->table_info->{'ip_field'}
-    or return ();
-  # if the service doesn't have an ip_field, then it has no IP addresses 
-  # in use, yes? 
-
-  my %hash = ( $ip_field => { op => '!=', value => '' } );
-  #$hash{'blocknum'} = $block->blocknum if $block;
-  $hash{'svcnum'} = { op => '!=', value => $exclude->svcnum } if ref $exclude;
-  map { my $na = $_->NetAddr; $na ? $na->addr : () }
-    qsearch({
-        table     => $class->table,
-        hashref   => \%hash,
-        extra_sql => " AND $ip_field != '0e0'",
-    });
-}
-
-sub _used_addresses_in_block {
-  my ($class, $block) = @_;
-
-  croak "_used_addresses_in_block() requires an FS::addr_block parameter"
+  croak "_used_addresses() requires an FS::addr_block parameter"
     unless ref $block && $block->isa('FS::addr_block');
 
   my $ip_field = $class->table_info->{'ip_field'};
   if ( !$ip_field ) {
-    carp "_used_addresses_in_block() skipped, no ip_field";
+    carp "_used_addresses() skipped, no ip_field";
     return;
   }
 
+  my %qsearch = ( $ip_field => { op => '!=', value => '' });
+  $qsearch{svcnum} = { op => '!=', value => $exclude_svc->svcnum }
+    if ref $exclude_svc && $exclude_svc->svcnum;
+
   my $block_na = $block->NetAddr;
 
   my $octets;
@@ -152,7 +135,7 @@ sub _used_addresses_in_block {
   my %qsearch = (
       table     => $class->table,
       select    => $ip_field,
-      hashref   => { $ip_field => { op => '!=', value => '' }},
+      hashref   => \%qsearch,
       extra_sql => " AND $ip_field != '0e0' ",
   );
   if ( $octets ) {