This was asked about on the puppet-users lists recently so I thought I'd
have a go at writing it. Is this something we'd want in the core?

---
 lib/puppet/parser/functions/ip_in_range.rb     |   15 +++++++++
 spec/unit/parser/functions/ip_in_range_spec.rb |   37 ++++++++++++++++++++++++
 2 files changed, 52 insertions(+), 0 deletions(-)
 create mode 100644 lib/puppet/parser/functions/ip_in_range.rb
 create mode 100644 spec/unit/parser/functions/ip_in_range_spec.rb

diff --git a/lib/puppet/parser/functions/ip_in_range.rb 
b/lib/puppet/parser/functions/ip_in_range.rb
new file mode 100644
index 0000000..b762b45
--- /dev/null
+++ b/lib/puppet/parser/functions/ip_in_range.rb
@@ -0,0 +1,15 @@
+require 'ipaddr'
+
+Puppet::Parser::Functions::newfunction(:ip_in_range, :type => :rvalue, :doc => 
"Return true if the ip is within the network range.") do |args|
+
+    raise Puppet::ParseError, "ip_in_range requires two arguments, ip and 
range" unless args.length == 2
+
+    begin
+        ip    = IPAddr.new( args[0] )
+        range = IPAddr.new( args[1] )
+    rescue ArgumentError => e
+        raise Puppet::ParseError, e.to_s
+    end
+
+    return range.include?( ip )
+end
diff --git a/spec/unit/parser/functions/ip_in_range_spec.rb 
b/spec/unit/parser/functions/ip_in_range_spec.rb
new file mode 100644
index 0000000..01e2947
--- /dev/null
+++ b/spec/unit/parser/functions/ip_in_range_spec.rb
@@ -0,0 +1,37 @@
+#! /usr/bin/env ruby
+
+require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
+
+describe "ip_in_range function" do
+
+  before :each do
+    @scope = Puppet::Parser::Scope.new
+  end
+
+  it "should exist" do
+    Puppet::Parser::Functions.function("ip_in_range").should == 
"function_ip_in_range"
+  end
+
+  it "should raise a ParseError if there are less than 2 arguments" do
+    lambda { @scope.function_ip_in_range([]) }.should( 
raise_error(Puppet::ParseError))
+  end
+
+  it "should return true when an ip is in the range" do
+    @scope.function_ip_in_range( ["192.168.100.12", "192.168.100.0/24"] 
).should be_true
+  end
+
+  it "should return false when an ip is not in the range" do
+    @scope.function_ip_in_range( ["10.10.10.10", "192.168.100.0/24"] ).should 
be_false
+  end
+
+  it "should raise a ParseError when given an invalid IP address" do
+    lambda { @scope.function_ip_in_range( ["a.b.c.d", "192.168.100.0/24"] ) 
}.should( raise_error(Puppet::ParseError))
+  end
+
+  it "should raise a ParseError when given an invalid IP range" do
+    lambda { @scope.function_ip_in_range( ["192.168.100.12", 
"192.168.100.0/CC"] ) }.should( raise_error(Puppet::ParseError))
+    lambda { @scope.function_ip_in_range( ["192.168.100.12", "192.168/24"] )   
    }.should( raise_error(Puppet::ParseError))
+    lambda { @scope.function_ip_in_range( ["192.168.100.12", 
"aaa.168.100.0/CC"] ) }.should( raise_error(Puppet::ParseError))
+  end
+
+end
-- 
1.7.1


-- 
Dean Wilson
http://www.unixdaemon.net       @unixdaemon
http://www.puppetcookbook.com   @puppetcookbook

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to