--- /dev/null
+require 'ipaddr'
+
+# Custom function to lookup the interface which matches the subnet
+# of the provided IP address.
+# The function iterates over all the interfaces and chooses the
+# first locally assigned interface which matches the IP.
+module Puppet::Parser::Functions
+ newfunction(:interface_for_ip, :type => :rvalue, :doc => "Find the bind IP address for the provided subnet.") do |arg|
+ if arg[0].class == String
+ begin
+ ip_to_find = arg[0]
+ Dir.foreach('/sys/class/net/') do |interface|
+ next if interface == '.' or interface == '..'
+ iface_no_dash = interface.gsub('-', '_')
+ interface_ip = lookupvar("ipaddress_#{iface_no_dash}")
+ netmask = lookupvar("netmask_#{iface_no_dash}")
+ if not interface_ip.nil? then
+ ip1=IPAddr.new(interface_ip)
+ ip2=IPAddr.new(ip_to_find)
+ if ip1.mask(netmask) == ip2.mask(netmask) then
+ return interface
+ end
+ end
+ end
+ rescue JSON::ParserError
+ raise Puppet::ParseError, "Syntax error: #{arg[0]} is invalid"
+ end
+ else
+ raise Puppet::ParseError, "Syntax error: #{arg[0]} is not a String"
+ end
+ return ''
+ end
+end