module-postgresql/lib/puppet/provider/postgresql_replication_slot/ruby.rb
2015-03-12 18:14:58 +01:00

68 lines
1.8 KiB
Ruby

Puppet::Type.type(:postgresql_replication_slot).provide(:ruby) do
# For confinement
commands :psql => 'psql'
def self.instances
run_sql_command('SELECT * FROM pg_replication_slots;')[0].split("\n").select { |l| l =~ /\|/ }.map do |l|
name, *others = l.strip.split(/\s+\|\s+/)
new({
:name => name,
:ensure => :present,
})
end
end
def self.prefetch(resources)
instances.each do |i|
if slot = resources[i.name]
slot.provider = i
end
end
end
def exists?
@property_hash[:ensure] == :present
end
def create
output = self.class.run_sql_command("SELECT * FROM pg_create_physical_replication_slot('#{resource[:name]}');")
if output[1].success?
@property_hash[:ensure] = :present
else
raise Puppet::Error, "Failed to create replication slot #{resource[:name]}:\n#{output[0]}"
end
end
def destroy
output = self.class.run_sql_command("SELECT pg_drop_replication_slot('#{resource[:name]}');")
if output[1].success?
@property_hash[:ensure] = :absent
else
raise Puppet::Error, "Failed to destroy replication slot #{resource[:name]}:\n#{output[0]}"
end
end
private
def self.run_sql_command(sql)
command = ['psql', '-t', '-c', sql]
self.run_command(command, 'postgres', 'postgres')
end
def self.run_command(command, user, group)
if Puppet::PUPPETVERSION.to_f < 3.4
Puppet::Util::SUIDManager.run_and_capture(command, user, group)
else
output = Puppet::Util::Execution.execute(command, {
:uid => user,
:gid => group,
:failonfail => false,
:combine => true,
:override_locale => true,
:custom_environment => {}
})
[output, $CHILD_STATUS.dup]
end
end
end