summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitch Jackson <mitch@freeside.biz>2018-06-26 18:18:51 -0500
committerMitch Jackson <mitch@freeside.biz>2018-10-23 17:22:21 -0400
commite81c112f4cb6b4e617697a3308b5128ff14a5f4c (patch)
tree7c9e9b09159aea59df7b69a054f3a02c93c95cd6
parentf1b5eac395f720a40baac99b0fd04f0da198086e (diff)
RT# 30783 Clean up IP utility code
-rw-r--r--FS/FS/IP_Mixin.pm30
-rwxr-xr-xFS/FS/addr_block.pm4
-rw-r--r--FS/FS/svc_IP_Mixin.pm33
3 files changed, 16 insertions, 51 deletions
diff --git a/FS/FS/IP_Mixin.pm b/FS/FS/IP_Mixin.pm
index 07fa9e7..1967ccd 100644
--- a/FS/FS/IP_Mixin.pm
+++ b/FS/FS/IP_Mixin.pm
@@ -268,45 +268,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
diff --git a/FS/FS/addr_block.pm b/FS/FS/addr_block.pm
index 31c7cff..a9f7d4b 100755
--- a/FS/FS/addr_block.pm
+++ b/FS/FS/addr_block.pm
@@ -249,7 +249,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');
[
@@ -285,7 +285,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 ce9218c..19c7e05 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 ) {