summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFrancis Luong (Franco) <franco@definefunk.com>2017-09-01 15:28:39 -0400
committerGitHub <noreply@github.com>2017-09-01 15:28:39 -0400
commitc50f7ac59d6dfedf22f6c657698924c81c70382b (patch)
tree339608453f1d237bb4308e1414fa33128f1de68b /lib
parentdcf7873424cce12326a47cd84e2645585cb6c962 (diff)
parenteb017ad756f4ba8db98d20dbb777baddb6836d01 (diff)
downloadipaddress-c50f7ac59d6dfedf22f6c657698924c81c70382b.tar.gz
Merge pull request #84 from garo/feature/allocate
Add allocate() method
Diffstat (limited to 'lib')
-rw-r--r--lib/ipaddress/ipv4.rb31
-rw-r--r--lib/ipaddress/ipv6.rb31
2 files changed, 62 insertions, 0 deletions
diff --git a/lib/ipaddress/ipv4.rb b/lib/ipaddress/ipv4.rb
index ade1851..70d1a51 100644
--- a/lib/ipaddress/ipv4.rb
+++ b/lib/ipaddress/ipv4.rb
@@ -90,6 +90,7 @@ module IPAddress;
# 32 bits interger containing the address
@u32 = (@octets[0]<< 24) + (@octets[1]<< 16) + (@octets[2]<< 8) + (@octets[3])
+ @allocator = 0
end # def initialize
#
@@ -1080,6 +1081,36 @@ module IPAddress;
end
#
+ # Allocates a new ip from the current subnet. Optional skip parameter
+ # can be used to skip addresses.
+ #
+ # Will raise StopIteration exception when all addresses have been allocated
+ #
+ # Example:
+ #
+ # ip = IPAddress("10.0.0.0/24")
+ # ip.allocate
+ # #=> "10.0.0.1/24"
+ # ip.allocate
+ # #=> "10.0.0.2/24"
+ # ip.allocate(2)
+ # #=> "10.0.0.5/24"
+ #
+ #
+ # Uses an internal @allocator which tracks the state of allocated
+ # addresses.
+ #
+ def allocate(skip=0)
+ @allocator += 1 + skip
+
+ next_ip = network_u32+@allocator
+ if next_ip > broadcast_u32+1
+ raise StopIteration
+ end
+ self.class.parse_u32(network_u32+@allocator, @prefix)
+ end
+
+ #
# private methods
#
private
diff --git a/lib/ipaddress/ipv6.rb b/lib/ipaddress/ipv6.rb
index adc6243..f427954 100644
--- a/lib/ipaddress/ipv6.rb
+++ b/lib/ipaddress/ipv6.rb
@@ -103,6 +103,7 @@ module IPAddress;
end
@prefix = Prefix128.new(netmask ? netmask : 128)
+ @allocator = 0
end # def initialize
@@ -664,6 +665,36 @@ module IPAddress;
def self.parse_hex(hex, prefix=128)
self.parse_u128(hex.hex, prefix)
end
+
+ #
+ # Allocates a new ip from the current subnet. Optional skip parameter
+ # can be used to skip addresses.
+ #
+ # Will raise StopIteration exception when all addresses have been allocated
+ #
+ # Example:
+ #
+ # ip = IPAddress("10.0.0.0/24")
+ # ip.allocate
+ # #=> "10.0.0.1/24"
+ # ip.allocate
+ # #=> "10.0.0.2/24"
+ # ip.allocate(2)
+ # #=> "10.0.0.5/24"
+ #
+ #
+ # Uses an internal @allocator which tracks the state of allocated
+ # addresses.
+ #
+ def allocate(skip=0)
+ @allocator += 1 + skip
+
+ next_ip = network_u128+@allocator
+ if next_ip > broadcast_u128
+ raise StopIteration
+ end
+ self.class.parse_u128(next_ip, @prefix)
+ end
private