ACL for hardware class config, RT#85057
[freeside.git] / FS / FS / IP_Mixin.pm
index b3c1052..1967ccd 100644 (file)
@@ -4,6 +4,7 @@ use strict;
 use NetAddr::IP;
 use FS::addr_block;
 use FS::router;
+use FS::addr_range;
 use FS::Record qw(qsearch);
 use FS::Conf;
 # careful about importing anything here--it will end up in a LOT of 
@@ -93,6 +94,10 @@ sub ip_check {
     $self->ip_addr('');
   }
 
+  # Will strip extraneous leading zeros from ip adddresses
+  # e.g. 10.0.022.220 corrected to 10.0.22.220
+  $self->ut_ip46n('ip_addr');
+
   if ( $self->ip_addr
        and !$self->router
        and $self->conf->exists('auto_router') ) {
@@ -129,6 +134,10 @@ sub assign_ip_addr {
   my $self = shift;
   my %opt = @_;
 
+  #otherwise we'll get the same assignment for concurrent identical calls
+  # this will serialize them
+  $_->lock_table foreach @subclasses;
+
   my @blocks;
   my $na = $self->NetAddr;
 
@@ -152,14 +161,14 @@ sub assign_ip_addr {
     # don't exit early on assigning a free address--check the rest of 
     # the blocks to see if the current address is in one of them.
     if (!$new_addr) {
-      $new_addr = $block->next_free_addr->addr;
+      $new_addr = $block->next_free_addr;
       $new_block = $block;
     }
   }
  
   return 'No IP address available on this router' unless $new_addr;
 
-  $self->ip_addr($new_addr);
+  $self->ip_addr($new_addr->addr);
   $self->addr_block($new_block);
   '';
 }
@@ -259,18 +268,22 @@ sub router {
   FS::router->by_key($self->routernum);
 }
 
-=item used_addresses [ BLOCK ]
+=item used_addresses [ FS::addr_block ]
+
+Returns a list of all addresses in use within the given L<FS::addr_block>.
 
-Returns a list of all addresses (in BLOCK, or in all blocks)
-that are in use.  If called as an instance method, excludes 
-that instance from the search.
+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 );
+  my ($self, $block) = @_;
+
+  (
+    $block->ip_gateway ? $block->ip_gateway : (),
+    $block->NetAddr->broadcast->addr,
+    map { $_->_used_addresses($block, $self ) } @subclasses
+  );
 }
 
 sub _used_addresses {