2a922f104a
This commit provides a working implementation of a ruby type/provider (`postgresql_psql` for handling the PSQL commands. This is a little more flexible than doing it via Exec resources, which is what the `postgresql::psql` type was doing. The old type is still present but now includes a deprecation notification, and all of the other types that were using the `::psql` type have been ported over to use the `postgresql_psql` type instead.
58 lines
No EOL
1.9 KiB
Ruby
58 lines
No EOL
1.9 KiB
Ruby
Puppet::Type.type(:postgresql_psql).provide(:ruby) do
|
|
|
|
def command()
|
|
if ((! resource[:unless]) or (resource[:unless].empty?))
|
|
if (resource[:refreshonly])
|
|
# So, if there's no 'unless', and we're in "refreshonly" mode,
|
|
# we need to return the target command here. If we don't,
|
|
# then Puppet will generate an event indicating that this
|
|
# property has changed.
|
|
return resource[:command]
|
|
end
|
|
|
|
# if we're not in refreshonly mode, then we return nil,
|
|
# which will cause Puppet to sync this property. This
|
|
# is what we want if there is no 'unless' value specified.
|
|
return nil
|
|
end
|
|
|
|
output, status = run_unless_sql_command(resource[:unless])
|
|
|
|
if status != 0
|
|
self.fail("Error evaluating 'unless' clause: '#{output}'")
|
|
end
|
|
result_count = output.strip.to_i
|
|
if result_count > 0
|
|
# If the 'unless' query returned rows, then we don't want to execute
|
|
# the 'command'. Returning the target 'command' here will cause
|
|
# Puppet to treat this property as already being 'insync?', so it
|
|
# won't call the setter to run the 'command' later.
|
|
return resource[:command]
|
|
end
|
|
|
|
# Returning 'nil' here will cause Puppet to see this property
|
|
# as out-of-sync, so it will call the setter later.
|
|
nil
|
|
end
|
|
|
|
def command=(val)
|
|
output, status = run_sql_command(val)
|
|
|
|
if status != 0
|
|
self.fail("Error executing SQL; psql returned #{status}: '#{output}'")
|
|
end
|
|
end
|
|
|
|
|
|
def run_unless_sql_command(sql)
|
|
# for the 'unless' queries, we wrap the user's query in a 'SELECT COUNT',
|
|
# which makes it easier to parse and process the output.
|
|
run_sql_command('SELECT COUNT(*) FROM (' << sql << ') count')
|
|
end
|
|
|
|
def run_sql_command(sql)
|
|
Puppet::Util::SUIDManager.
|
|
run_and_capture('psql -t -c "' << sql.gsub('"', '\"') << '"', resource[:psql_user], resource[:psql_group])
|
|
end
|
|
|
|
end |