2
require 'puppet/util/network_device'
3
module Puppet::Util::NetworkDevice::IPCalc
5
# This is a rip-off of authstore
6
Octet = '(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])'
7
IPv4 = "#{Octet}\.#{Octet}\.#{Octet}\.#{Octet}"
8
IPv6_full = "_:_:_:_:_:_:_:_|_:_:_:_:_:_::_?|_:_:_:_:_::((_:)?_)?|_:_:_:_::((_:){0,2}_)?|_:_:_::((_:){0,3}_)?|_:_::((_:){0,4}_)?|_::((_:){0,5}_)?|::((_:){0,6}_)?"
9
IPv6_partial = "_:_:_:_:_:_:|_:_:_:_::(_:)?|_:_::(_:){0,2}|_::(_:){0,3}"
10
IP = "#{IPv4}|#{IPv6_full}".gsub(/_/,'([0-9a-fA-F]{1,4})').gsub(/\(/,'(?:')
14
when /^(#{IP})\/(\d+)$/ # 12.34.56.78/24, a001:b002::efff/120, c444:1000:2000::9:192.168.0.1/112
15
[$2.to_i,IPAddr.new($1)]
16
when /^(#{IP})$/ # 10.20.30.40,
17
value = IPAddr.new(value)
18
[bits(value.family),value]
23
family == Socket::AF_INET6 ? 128 : 32
27
(1 << bits(family)) - 1
30
def mask(family, length)
31
(1 << (bits(family) - length)) - 1
34
# returns ip address netmask from prefix length
35
def netmask(family, length)
36
IPAddr.new(fullmask(family) & ~mask(family, length) , family)
39
# returns an IOS wildmask
40
def wildmask(family, length)
41
IPAddr.new(mask(family, length) , family)
44
# returns ip address prefix length from netmask
45
def prefix_length(netmask)
46
mask_addr = netmask.to_i
47
return 0 if mask_addr == 0
53
mask = mask_addr < 2**length ? length : 128
56
if ((mask_addr & 1) == 1)
59
mask_addr = mask_addr >> 1
b'\\ No newline at end of file'