77 lines
2.5 KiB
Ruby
77 lines
2.5 KiB
Ruby
|
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
|