class Chef::Provider::Service::Freebsd

Attributes

enabled_state_found[R]

Public Class Methods

new(new_resource, run_context) click to toggle source
Calls superclass method Chef::Provider::Service::Init::new
# File lib/chef/provider/service/freebsd.rb, line 33
def initialize(new_resource, run_context)
  super
  @enabled_state_found = false
  @init_command = nil
  if ::File.exist?("/etc/rc.d/#{new_resource.service_name}")
    @init_command = "/etc/rc.d/#{new_resource.service_name}"
  elsif ::File.exist?("/usr/local/etc/rc.d/#{new_resource.service_name}")
    @init_command = "/usr/local/etc/rc.d/#{new_resource.service_name}"
  end
end

Public Instance Methods

define_resource_requirements() click to toggle source
# File lib/chef/provider/service/freebsd.rb, line 59
def define_resource_requirements
  shared_resource_requirements

  requirements.assert(:start, :enable, :reload, :restart) do |a|
    a.assertion { init_command }
    a.failure_message Chef::Exceptions::Service, "#{new_resource}: unable to locate the rc.d script"
    a.whyrun("Assuming rc.d script will be installed by a previous action.")
  end

  requirements.assert(:all_actions) do |a|
    a.assertion { enabled_state_found }
    # for consistency with original behavior, this will not fail in non-whyrun mode;
    # rather it will silently set enabled state=>false
    a.whyrun "Unable to determine enabled/disabled state, assuming this will be correct for an actual run.  Assuming disabled."
  end

  requirements.assert(:start, :enable, :reload, :restart) do |a|
    a.assertion { !service_enable_variable_name.nil? }
    a.failure_message Chef::Exceptions::Service, "Could not find the service name in #{init_command} and rcvar"
    # No recovery in whyrun mode - the init file is present but not correct.
  end
end
disable_service() click to toggle source
# File lib/chef/provider/service/freebsd.rb, line 114
def disable_service
  set_service_enable("NO") if current_resource.enabled
end
enable_service() click to toggle source
# File lib/chef/provider/service/freebsd.rb, line 110
def enable_service
  set_service_enable("YES") unless current_resource.enabled
end
load_current_resource() click to toggle source
# File lib/chef/provider/service/freebsd.rb, line 44
def load_current_resource
  @current_resource = Chef::Resource::Service.new(new_resource.name)
  current_resource.service_name(new_resource.service_name)

  return current_resource unless init_command

  logger.trace("#{current_resource} found at #{init_command}")

  @status_load_success = true
  determine_current_status! # see Chef::Provider::Service::Simple

  determine_enabled_status!
  current_resource
end
restart_service() click to toggle source
# File lib/chef/provider/service/freebsd.rb, line 98
def restart_service
  if new_resource.restart_command
    super
  elsif supports[:restart]
    shell_out!("#{init_command} fastrestart", default_env: false)
  else
    stop_service
    sleep 1
    start_service
  end
end
start_service() click to toggle source
# File lib/chef/provider/service/freebsd.rb, line 82
def start_service
  if new_resource.start_command
    super
  else
    shell_out!("#{init_command} faststart", default_env: false)
  end
end
stop_service() click to toggle source
# File lib/chef/provider/service/freebsd.rb, line 90
def stop_service
  if new_resource.stop_command
    super
  else
    shell_out!("#{init_command} faststop", default_env: false)
  end
end

Private Instance Methods

determine_enabled_status!() click to toggle source
# File lib/chef/provider/service/freebsd.rb, line 151
def determine_enabled_status!
  var_name = service_enable_variable_name
  if ::File.exist?("/etc/rc.conf") && var_name
    read_rc_conf.each do |line|
      case line
      when /^#{Regexp.escape(var_name)}="(\w+)"/
        enabled_state_found!
        if $1.casecmp?("yes")
          current_resource.enabled true
        elsif $1.casecmp?("no") || $1.casecmp?("none")
          current_resource.enabled false
        end
      end
    end
  end

  if current_resource.enabled.nil?
    logger.debug("#{new_resource.name} enable/disable state unknown")
    current_resource.enabled false
  end
end
enabled_state_found!() click to toggle source
# File lib/chef/provider/service/freebsd.rb, line 182
def enabled_state_found!
  @enabled_state_found = true
end
read_rc_conf() click to toggle source
# File lib/chef/provider/service/freebsd.rb, line 120
def read_rc_conf
  ::File.open("/etc/rc.conf", "r", &:readlines)
end
service_enable_variable_name() click to toggle source

The variable name used in /etc/rc.conf for enabling this service

# File lib/chef/provider/service/freebsd.rb, line 131
def service_enable_variable_name
  @service_enable_variable_name ||=
    if init_command
      ::File.open(init_command) do |rcscript|
        rcscript.each_line do |line|
          if line =~ /^name="?(\w+)"?/
            return $1 + "_enable"
          end
        end
      end
      # some scripts support multiple instances through symlinks such as openvpn.
      # We should get the service name from rcvar.
      logger.trace("name=\"service\" not found at #{init_command}. falling back to rcvar")
      shell_out!("#{init_command} rcvar").stdout[/(\w+_enable)=/, 1]
    else
      # for why-run mode when the rcd_script is not there yet
      new_resource.service_name
    end
end
set_service_enable(value) click to toggle source
# File lib/chef/provider/service/freebsd.rb, line 173
def set_service_enable(value)
  lines = read_rc_conf
  # Remove line that set the old value
  lines.delete_if { |line| line =~ /^\#?\s*#{Regexp.escape(service_enable_variable_name)}=/ }
  # And append the line that sets the new value at the end
  lines << "#{service_enable_variable_name}=\"#{value}\""
  write_rc_conf(lines)
end
write_rc_conf(lines) click to toggle source
# File lib/chef/provider/service/freebsd.rb, line 124
def write_rc_conf(lines)
  ::File.open("/etc/rc.conf", "w") do |file|
    lines.each { |line| file.puts(line) }
  end
end