Add is_ipv4_address and is_ipv6_address functions

These are useful when making decisions based on the type of IP
address received.
This commit is contained in:
Giulio Fidente 2016-01-22 17:55:03 +01:00
parent 2a510169d6
commit d85aec41a3
5 changed files with 182 additions and 0 deletions

View file

@ -518,6 +518,14 @@ Returns 'true' if the variable returned to this string is an integer. *Type*: rv
Returns 'true' if the string passed to this function is a valid IP address. *Type*: rvalue.
#### `is_ipv6_address`
Returns 'true' if the string passed to this function is a valid IPv6 address. *Type*: rvalue.
#### `is_ipv4_address`
Returns 'true' if the string passed to this function is a valid IPv4 address. *Type*: rvalue.
#### `is_mac_address`
Returns 'true' if the string passed to this function is a valid MAC address. *Type*: rvalue.

View file

@ -0,0 +1,28 @@
#
# is_ipv4_address.rb
#
module Puppet::Parser::Functions
newfunction(:is_ipv4_address, :type => :rvalue, :doc => <<-EOS
Returns true if the string passed to this function is a valid IPv4 address.
EOS
) do |arguments|
require 'ipaddr'
if (arguments.size != 1) then
raise(Puppet::ParseError, "is_ipv4_address(): Wrong number of arguments "+
"given #{arguments.size} for 1")
end
begin
ip = IPAddr.new(arguments[0])
rescue ArgumentError
return false
end
return ip.ipv4?
end
end
# vim: set ts=2 sw=2 et :

View file

@ -0,0 +1,28 @@
#
# is_ipv6_address.rb
#
module Puppet::Parser::Functions
newfunction(:is_ipv6_address, :type => :rvalue, :doc => <<-EOS
Returns true if the string passed to this function is a valid IPv6 address.
EOS
) do |arguments|
require 'ipaddr'
if (arguments.size != 1) then
raise(Puppet::ParseError, "is_ipv6_address(): Wrong number of arguments "+
"given #{arguments.size} for 1")
end
begin
ip = IPAddr.new(arguments[0])
rescue ArgumentError
return false
end
return ip.ipv6?
end
end
# vim: set ts=2 sw=2 et :

View file

@ -0,0 +1,52 @@
#! /usr/bin/env ruby -S rspec
require 'spec_helper_acceptance'
describe 'is_ipv4_address function', :unless => UNSUPPORTED_PLATFORMS.include?(fact('operatingsystem')) do
describe 'success' do
it 'is_ipv4_addresss' do
pp = <<-EOS
$a = '1.2.3.4'
$b = true
$o = is_ipv4_address($a)
if $o == $b {
notify { 'output correct': }
}
EOS
apply_manifest(pp, :catch_failures => true) do |r|
expect(r.stdout).to match(/Notice: output correct/)
end
end
it 'is_ipv4_addresss strings' do
pp = <<-EOS
$a = "aoeu"
$b = false
$o = is_ipv4_address($a)
if $o == $b {
notify { 'output correct': }
}
EOS
apply_manifest(pp, :catch_failures => true) do |r|
expect(r.stdout).to match(/Notice: output correct/)
end
end
it 'is_ipv4_addresss ipv4 out of range' do
pp = <<-EOS
$a = '1.2.3.400'
$b = false
$o = is_ipv4_address($a)
if $o == $b {
notify { 'output correct': }
}
EOS
apply_manifest(pp, :catch_failures => true) do |r|
expect(r.stdout).to match(/Notice: output correct/)
end
end
end
describe 'failure' do
it 'handles improper argument counts'
end
end

View file

@ -0,0 +1,66 @@
#! /usr/bin/env ruby -S rspec
require 'spec_helper_acceptance'
describe 'is_ipv6_address function', :unless => UNSUPPORTED_PLATFORMS.include?(fact('operatingsystem')) do
describe 'success' do
it 'is_ipv6_addresss' do
pp = <<-EOS
$a = "fe80:0000:cd12:d123:e2f8:47ff:fe09:dd74"
$b = true
$o = is_ipv6_address($a)
if $o == $b {
notify { 'output correct': }
}
EOS
apply_manifest(pp, :catch_failures => true) do |r|
expect(r.stdout).to match(/Notice: output correct/)
end
end
it 'is_ipv6_addresss ipv6 compressed' do
pp = <<-EOS
$a = "fe00::1"
$b = true
$o = is_ipv6_address($a)
if $o == $b {
notify { 'output correct': }
}
EOS
apply_manifest(pp, :catch_failures => true) do |r|
expect(r.stdout).to match(/Notice: output correct/)
end
end
it 'is_ipv6_addresss strings' do
pp = <<-EOS
$a = "aoeu"
$b = false
$o = is_ipv6_address($a)
if $o == $b {
notify { 'output correct': }
}
EOS
apply_manifest(pp, :catch_failures => true) do |r|
expect(r.stdout).to match(/Notice: output correct/)
end
end
it 'is_ipv6_addresss ip out of range' do
pp = <<-EOS
$a = 'fe80:0000:cd12:d123:e2f8:47ff:fe09:gggg'
$b = false
$o = is_ipv6_address($a)
if $o == $b {
notify { 'output correct': }
}
EOS
apply_manifest(pp, :catch_failures => true) do |r|
expect(r.stdout).to match(/Notice: output correct/)
end
end
end
describe 'failure' do
it 'handles improper argument counts'
end
end