From: Mitch Jackson Date: Tue, 26 Jun 2018 23:18:51 +0000 (-0500) Subject: RT# 30783 Clean up IP utility code X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=04c717c096f556a9ba0e8c4a137e867029c78a1b RT# 30783 Clean up IP utility code --- diff --git a/FS/FS/IP_Mixin.pm b/FS/FS/IP_Mixin.pm index 2d69d9cc1..b68b0b624 100644 --- a/FS/FS/IP_Mixin.pm +++ b/FS/FS/IP_Mixin.pm @@ -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. -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 - -=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 diff --git a/FS/FS/addr_block.pm b/FS/FS/addr_block.pm index 74c372e29..5fd64bf7a 100755 --- a/FS/FS/addr_block.pm +++ b/FS/FS/addr_block.pm @@ -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 diff --git a/FS/FS/svc_IP_Mixin.pm b/FS/FS/svc_IP_Mixin.pm index 4266a2a5e..0fce86c1d 100644 --- a/FS/FS/svc_IP_Mixin.pm +++ b/FS/FS/svc_IP_Mixin.pm @@ -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 ) {