]> git.openstreetmap.org Git - chef.git/blob - cookbooks/networking/libraries/ipaddresses.rb
Add comparison operator for IP addresses
[chef.git] / cookbooks / networking / libraries / ipaddresses.rb
1 require "ipaddr"
2
3 module OpenStreetMap
4   module Mixin
5     module IPAddresses
6       class Address
7         attr_reader :address, :prefix, :gateway, :network, :netmask
8
9         def initialize(address)
10           @address = address[:public_address] || address[:address]
11           @prefix = address[:prefix]
12           @gateway = address[:gateway]
13
14           ip = IPAddr.new(address[:address]).mask(address[:prefix])
15
16           @network = ip.to_s
17           @netmask = ip.netmask
18         end
19
20         def <=>(other)
21           address <=> other.address
22         end
23
24         def to_s
25           address
26         end
27
28         def subnet
29           "#{@network}/#{@prefix}"
30         end
31       end
32
33       def ipaddresses(role: nil, family: nil)
34         interfaces(:role => role).each_with_object([]) do |interface, addresses|
35           addresses << Address.new(interface[:inet]) if interface[:inet] && (family.nil? || family == :inet)
36           addresses << Address.new(interface[:inet6]) if interface[:inet6] && (family.nil? || family == :inet6)
37         end
38       end
39
40       def internal_ipaddress(family: nil)
41         ipaddresses(:role => :internal, :family => family).first
42       end
43
44       def external_ipaddress(family: nil)
45         ipaddresses(:role => :external, :family => family).first
46       end
47     end
48   end
49 end
50
51 Chef::Node.include(OpenStreetMap::Mixin::IPAddresses)