class Chef::Platform::ServiceHelpers

Public Class Methods

config_for_service(service_name) click to toggle source
# File lib/chef/platform/service_helpers.rb, line 68
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 38
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 105
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 113
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 100
def systemd_is_init?
  ::File.exist?(Chef.path_to("/proc/1/comm")) &&
    ::File.open(Chef.path_to("/proc/1/comm")).gets.chomp == "systemd"
end