68 lines
1.8 KiB
Ruby
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
|