--- /dev/null
+module Puppet::Parser::Functions
+ newfunction(:postgresql_acls_to_resources_hash, :type => :rvalue, :doc => <<-EOS
+ This internal function translates the ipv(4|6)acls format into a resource
+ suitable for create_resources. It is not intended to be used outside of the
+ postgresql internal classes/defined resources.
+
+ This function accepts an array of strings that are pg_hba.conf rules. It
+ will return a hash that can be fed into create_resources to create multiple
+ individual pg_hba_rule resources.
+
+ The second parameter is an identifier that will be included in the namevar
+ to provide uniqueness. It must be a string.
+
+ The third parameter is an order offset, so you can start the order at an
+ arbitrary starting point.
+ EOS
+ ) do |args|
+ func_name = "postgresql_acls_to_resources_hash()"
+
+ raise(Puppet::ParseError, "#{func_name}: Wrong number of arguments " +
+ "given (#{args.size} for 3)") if args.size != 3
+
+ acls = args[0]
+ raise(Puppet::ParseError, "#{func_name}: first argument must be an array") \
+ unless acls.instance_of? Array
+
+ id = args[1]
+ raise(Puppet::ParseError, "#{func_name}: second argument must be a string") \
+ unless id.instance_of? String
+
+ offset = args[2].to_i
+ raise(Puppet::ParseError, "#{func_name}: third argument must be a number") \
+ unless offset.instance_of? Fixnum
+
+ resources = {}
+ acls.each do |acl|
+ index = acls.index(acl)
+
+ parts = acl.split
+
+ raise(Puppet::ParseError, "#{func_name}: acl line #{index} does not " +
+ "have enough parts") unless parts.length >= 4
+
+ resource = {
+ 'type' => parts[0],
+ 'database' => parts[1],
+ 'user' => parts[2],
+ 'order' => format('%03d', offset + index),
+ }
+ if parts[0] == 'local' then
+ resource['auth_method'] = parts[3]
+ if parts.length > 4 then
+ resource['auth_option'] = parts.last(parts.length - 4).join(" ")
+ end
+ else
+ if parts[4] =~ /^\d/
+ resource['address'] = parts[3] + ' ' + parts[4]
+ resource['auth_method'] = parts[5]
+
+ if parts.length > 6 then
+ resource['auth_option'] = parts.last(parts.length - 6).join(" ")
+ end
+ else
+ resource['address'] = parts[3]
+ resource['auth_method'] = parts[4]
+
+ if parts.length > 5 then
+ resource['auth_option'] = parts.last(parts.length - 5).join(" ")
+ end
+ end
+ end
+ resources["postgresql class generated rule #{id} #{index}"] = resource
+ end
+ resources
+ end
+end