diff options
author | Stafford Brunk <wingrunr21@gmail.com> | 2014-08-27 09:27:22 -0600 |
---|---|---|
committer | Bryan McLellan <btm@opscode.com> | 2015-02-17 11:51:01 -0500 |
commit | e271ab64202bc265595b6d5c2e3673b8a63d2f1b (patch) | |
tree | 3f301e66b2bb7e11a87cb96a7206ad71c5d94e25 | |
parent | bbfecb4481f143090eebd45a6bdb4ce6f10cf32c (diff) | |
download | ohai-e271ab64202bc265595b6d5c2e3673b8a63d2f1b.tar.gz |
Add an IpHelper utility module
-rw-r--r-- | lib/ohai/util/ip_helper.rb | 52 | ||||
-rw-r--r-- | spec/unit/util/ip_helper_spec.rb | 128 |
2 files changed, 180 insertions, 0 deletions
diff --git a/lib/ohai/util/ip_helper.rb b/lib/ohai/util/ip_helper.rb new file mode 100644 index 00000000..92da9956 --- /dev/null +++ b/lib/ohai/util/ip_helper.rb @@ -0,0 +1,52 @@ +# +# Author:: Stafford Brunk (<stafford.brunk@gmail.com>) +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +module Ohai + module Util + module IpHelper + # Corresponding to RFC 4193 + IPV6_PRIVATE_ADDRESS_BLOCK = IPAddress('fc00::/7') + + def private_address?(addr) + ip = IPAddress(addr) + + if ip.respond_to? :private? + ip.private? + else + IPV6_PRIVATE_ADDRESS_BLOCK.include?(ip) + end + end + alias :unique_local_address? :private_address? + + def public_address?(addr) + !private_address?(addr) + end + + # The ipaddress gem doesn't implement loopback? + # for IPv4 addresses + # https://github.com/bluemonk/ipaddress/issues/25 + def loopback?(addr) + ip = IPAddress(addr) + + if ip.respond_to? :loopback? + ip.loopback? + else + IPAddress('127.0.0.0/8').include? ip + end + end + end + end +end diff --git a/spec/unit/util/ip_helper_spec.rb b/spec/unit/util/ip_helper_spec.rb new file mode 100644 index 00000000..946ca47c --- /dev/null +++ b/spec/unit/util/ip_helper_spec.rb @@ -0,0 +1,128 @@ +# +# Author:: Stafford Brunk (<stafford.brunk@gmail.com>) +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require 'ipaddress' +require 'spec_helper' +require 'ohai/util/ip_helper' + +class IpHelperMock + include Ohai::Util::IpHelper +end + +describe "Ohai::Util::IpHelper" do + let(:ip_helper) { IpHelperMock.new } + + shared_examples 'ip address types' do + context 'with an IPv4 address' do + context 'that is private' do + let(:address) { '10.128.142.89' } + + it 'identifies the address as private' do + expect(ip_helper.private_address?(address)).to be_truthy + end + end + + context 'that is public' do + let(:address) { '74.125.224.72' } + + it 'identifies the address as public' do + expect(ip_helper.private_address?(address)).to be_falsey + end + end + end + + context 'with an IPv6 address' do + context 'that is an RFC 4193 unique local address' do + let(:address) { 'fdf8:f53b:82e4::53' } + + it 'identifies the address as a unique local address' do + expect(ip_helper.private_address?(address)).to be_truthy + end + end + + context 'that is a non RFC 4193 unique local address' do + let(:address) { 'FE80::0202:B3FF:FE1E:8329' } + + it 'does not identify the address as a unique local address' do + expect(ip_helper.private_address?(address)).to be_falsey + end + end + end + end + + describe 'private_address?' do + include_examples 'ip address types' + end + + describe 'unique_local_address?' do + include_examples 'ip address types' + end + + describe 'public_address?' do + let(:address) { '10.128.142.89' } + + before do + allow(ip_helper).to receive(:private_address?) + end + + it 'should call #private_address?' do + expect(ip_helper).to receive(:private_address?) + ip_helper.public_address?(address) + end + + it 'should return the inverse of #private_address?' do + expect(ip_helper.public_address?(address)).to equal !ip_helper.private_address?(address) + end + end + + describe 'loopback?' do + context 'with an IPv4 address' do + context 'that is a loopback address' do + let(:address) { '127.0.0.1' } + + it 'should identify the address as a loopback address' do + expect(ip_helper.loopback?(address)).to be_truthy + end + end + + context 'that is not a loopback address' do + let(:address) { '1.2.3.4' } + + it 'should not identify the address as a loopback address' do + expect(ip_helper.loopback?(address)).to be_falsey + end + end + end + + context 'with an IPv6 address' do + context 'that is a loopback address' do + let(:address) { '0:0:0:0:0:0:0:1' } + + it 'should identify the address as a loopback address' do + expect(ip_helper.loopback?(address)).to be_truthy + end + end + + context 'that is not a loopback address' do + let(:address) { '2400:6180:0000:00D0:0000:0000:0009:7001' } + + it 'should not identify the address as a loopback address' do + expect(ip_helper.loopback?(address)).to be_falsey + end + end + end + end +end |