92 lines
2.1 KiB
Ruby
92 lines
2.1 KiB
Ruby
Puppet::Type.type(:policy_rcd).provide(:policy_rcd) do
|
|
|
|
desc 'Provider for managing policy-rc.d for Ubuntu'
|
|
|
|
mk_resource_methods
|
|
|
|
def check_os
|
|
Facter.value(:osfamily) == 'Debian'
|
|
end
|
|
|
|
def check_policy_rcd
|
|
return File.exist? policy_rcd
|
|
end
|
|
|
|
def file_lines
|
|
@file_lines ||= File.open(policy_rcd).readlines
|
|
end
|
|
|
|
def policy_rcd
|
|
'/usr/sbin/policy-rc.d'
|
|
end
|
|
|
|
def service
|
|
@resource[:service]
|
|
end
|
|
|
|
def set_code
|
|
@resource[:set_code]
|
|
end
|
|
|
|
def self.write_to_file(file, content, truncate=false)
|
|
File.truncate(file, 0) if truncate
|
|
policy = File.open(file, 'a+')
|
|
policy.puts(content)
|
|
policy.close
|
|
File.chmod(0744, file)
|
|
end
|
|
|
|
def exists?
|
|
# we won't do anything if os family is not debian
|
|
return true unless check_os
|
|
if check_policy_rcd
|
|
file_lines.each do |line|
|
|
unless line =~ /"#{@resource[:service]}"/
|
|
next
|
|
end
|
|
return true
|
|
end
|
|
end
|
|
false
|
|
end
|
|
|
|
def create
|
|
unless check_policy_rcd
|
|
header = "#!/bin/bash\n# THIS FILE MANAGED BY PUPPET\n"
|
|
else
|
|
header = ""
|
|
end
|
|
content = "#{header}[[ \"$1\" == \"#{@resource[:service]}\" ]] && exit #{@resource[:set_code]}\n"
|
|
self.class.write_to_file(policy_rcd, content)
|
|
end
|
|
|
|
def destroy
|
|
if check_policy_rcd
|
|
file_lines.delete_if { |l| l =~ /"#{@resource[:service]}"/ }
|
|
self.class.write_to_file(policy_rcd, file_lines, true)
|
|
end
|
|
end
|
|
|
|
def flush
|
|
if @resource[:ensure] == :present and ! file_lines.nil?
|
|
new_line = nil
|
|
outdated_line = nil
|
|
file_lines.each do |line|
|
|
unless line =~ /"#{@resource[:service]}"/
|
|
next
|
|
end
|
|
code = line.match(/exit\s(\d+)/)[1]
|
|
if code != @resource[:set_code]
|
|
new_line = "[[ \"$1\" == \"#{@resource[:service]}\" ]] && exit #{@resource[:set_code]}\n"
|
|
outdated_line = line
|
|
end
|
|
end
|
|
unless new_line.nil?
|
|
file_lines.delete(outdated_line)
|
|
file_lines.push(new_line)
|
|
self.class.write_to_file(policy_rcd, file_lines, true)
|
|
end
|
|
end
|
|
end
|
|
end
|