class Chef::Platform::ServiceHelpers

Public Class Methods

config_for_service(service_name) click to toggle source
# File lib/chef/platform/service_helpers.rb, line 71
def config_for_service(service_name)
  configs = []

  if file_exist?(Chef.path_to("/etc/init.d/#{service_name}"))
    configs += [ :initd, :systemd ]
  end

  if file_exist?(Chef.path_to("/etc/init/#{service_name}.conf"))
    configs << :upstart
  end

  if file_exist?(Chef.path_to("/etc/xinetd.d/#{service_name}"))
    configs << :xinetd
  end

  if file_exist?(Chef.path_to("/etc/rc.d/#{service_name}"))
    configs << :etc_rcd
  end

  if file_exist?(Chef.path_to("/usr/local/etc/rc.d/#{service_name}"))
    configs << :usr_local_etc_rcd
  end

  if has_systemd_service_unit?(service_name) || has_systemd_unit?(service_name)
    configs << :systemd
  end

  configs
end
service_resource_providers() click to toggle source

This helper is mostly used to sort out the mess of different linux mechanisms that can be used to start services. It does not necessarily need to linux-specific, but currently all our other service providers are narrowly platform-specific with no alternatives.

NOTE: if a system has (for example) chkconfig installed then we should report that chkconfig is installed. The fact that a system may also have systemd installed does not mean that we do not report that systemd is also installed. This module is purely for discovery of all the alternatives, handling the priority of the different services is NOT a design concern of this module.

# File lib/chef/platform/service_helpers.rb, line 41
def service_resource_providers
  providers = []

  if file_exist?(Chef.path_to("/usr/sbin/update-rc.d"))
    providers << :debian
  end

  if file_exist?(Chef.path_to("/usr/sbin/invoke-rc.d"))
    providers << :invokercd
  end

  if file_exist?(Chef.path_to("/sbin/initctl"))
    providers << :upstart
  end

  if file_exist?(Chef.path_to("/sbin/insserv"))
    providers << :insserv
  end

  if systemd_is_init?
    providers << :systemd
  end

  if file_exist?(Chef.path_to("/sbin/chkconfig"))
    providers << :redhat
  end

  providers
end

Private Class Methods

has_systemd_service_unit?(svc_name) click to toggle source
# File lib/chef/platform/service_helpers.rb, line 108
def has_systemd_service_unit?(svc_name)
  %w{ /etc /usr/lib /lib /run }.any? do |load_path|
    file_exist?(
      Chef.path_to("#{load_path}/systemd/system/#{svc_name.gsub(/@.*$/, '@')}.service")
    )
  end
end
has_systemd_unit?(svc_name) click to toggle source
# File lib/chef/platform/service_helpers.rb, line 116
def has_systemd_unit?(svc_name)
  # TODO: stop supporting non-service units with service resource
  %w{ /etc /usr/lib /lib /run }.any? do |load_path|
    file_exist?(Chef.path_to("#{load_path}/systemd/system/#{svc_name}"))
  end
end
systemd_is_init?() click to toggle source
# File lib/chef/platform/service_helpers.rb, line 103
def systemd_is_init?
  file_exist?(Chef.path_to("/proc/1/comm")) &&
    file_open(Chef.path_to("/proc/1/comm")).gets.chomp == "systemd"
end