Puppet::Type.type(:service).provide :openbsd, :parent => :init do
desc "Provider for OpenBSD's rc.d daemon control scripts"
commands :rcctl => '/usr/sbin/rcctl'
confine :operatingsystem => :openbsd
defaultfor :operatingsystem => :openbsd
has_feature :flaggable
def startcmd
[command(:rcctl), '-f', :start, @resource[:name]]
end
def stopcmd
[command(:rcctl), :stop, @resource[:name]]
end
def restartcmd
(@resource[:hasrestart] == :true) && [command(:rcctl), '-f', :restart, @resource[:name]]
end
def statuscmd
[command(:rcctl), :check, @resource[:name]]
end
# @api private
# When storing the name, take into account not everything has
# '_flags', like 'multicast_host' and 'pf'.
def self.instances
instances = []
begin
execpipe([command(:rcctl), :getall]) do |process|
process.each_line do |line|
match = /^(.*?)(?:_flags)?=(.*)$/.match(line)
attributes_hash = {
:name => match[1],
:flags => match[2],
:hasstatus => true,
:provider => :openbsd,
}
instances << new(attributes_hash);
end
end
instances
rescue Puppet::ExecutionFailure
return nil
end
end
def enabled?
output = execute([command(:rcctl), "get", @resource[:name], "status"],
:failonfail => false, :combine => false, :squelch => false)
if output.exitstatus == 1
self.debug("Is disabled")
return :false
else
self.debug("Is enabled")
return :true
end
end
def enable
self.debug("Enabling")
rcctl(:enable, @resource[:name])
if @resource[:flags]
rcctl(:set, @resource[:name], :flags, @resource[:flags])
end
end
def disable
self.debug("Disabling")
rcctl(:disable, @resource[:name])
end
def running?
output = execute([command(:rcctl), "check", @resource[:name]],
:failonfail => false, :combine => false, :squelch => false).chomp
return true if output =~ /\(ok\)/
end
# Uses the wrapper to prevent failure when the service is not running;
# rcctl(8) return non-zero in that case.
def flags
output = execute([command(:rcctl), "get", @resource[:name], "flags"],
:failonfail => false, :combine => false, :squelch => false).chomp
self.debug("Flags are: \"#{output}\"")
output
end
def flags=(value)
self.debug("Changing flags from #{flags} to #{value}")
rcctl(:set, @resource[:name], :flags, value)
# If the service is already running, force a restart as the flags have been changed.
rcctl(:restart, @resource[:name]) if running?
end
end
Copyright 2K16 - 2K18 Indonesian Hacker Rulez