X-Git-Url: https://git.openstreetmap.org./chef.git/blobdiff_plain/89634c26de56cac77a87cfed1b36770e7f144c59..5a207c66f87d1d119e0b3824345e1371e686eb7c:/cookbooks/networking/libraries/ipaddresses.rb?ds=inline diff --git a/cookbooks/networking/libraries/ipaddresses.rb b/cookbooks/networking/libraries/ipaddresses.rb index d31d885f9..5f746c9aa 100644 --- a/cookbooks/networking/libraries/ipaddresses.rb +++ b/cookbooks/networking/libraries/ipaddresses.rb @@ -1,27 +1,55 @@ -class Chef - class Node - def ipaddresses(options = {}, &block) - addresses = [] - - interfaces(options).each do |interface| - address = interface[:public_address] || interface[:address] - - if block.nil? - addresses << address - else - yield address +require "ipaddr" + +module OpenStreetMap + module Mixin + module IPAddresses + class Address + attr_reader :address, :prefix, :gateway, :network, :netmask + + def initialize(address) + @address = address[:public_address] || address[:address] + @prefix = address[:prefix] + @gateway = address[:gateway] + + ip = IPAddr.new(address[:address]).mask(address[:prefix]) + + @network = ip.to_s + @netmask = ip.netmask + end + + def <=>(other) + address <=> other.address + end + + def to_s + address + end + + def to_str + address + end + + def subnet + "#{@network}/#{@prefix}" end end - addresses - end + def ipaddresses(role: nil, family: nil) + interfaces(:role => role).each_with_object([]) do |interface, addresses| + addresses << Address.new(interface[:inet]) if interface[:inet] && (family.nil? || family == :inet) + addresses << Address.new(interface[:inet6]) if interface[:inet6] && (family.nil? || family == :inet6) + end + end - def internal_ipaddress - ipaddresses(:role => :internal).first - end + def internal_ipaddress(family: nil) + ipaddresses(:role => :internal, :family => family).first + end - def external_ipaddress - ipaddresses(:role => :external).first + def external_ipaddress(family: nil) + ipaddresses(:role => :external, :family => family).first + end end end end + +Chef::Node.include(OpenStreetMap::Mixin::IPAddresses)