class Inspec::Resources::SysV

Constants

RUNLEVELS

Public Class Methods

new(service_name, service_ctl = nil) click to toggle source
Calls superclass method Inspec::Resources::ServiceManager::new
# File lib/inspec/resources/service.rb, line 430
def initialize(service_name, service_ctl = nil)
  @service_ctl = service_ctl || "service"
  super
end

Public Instance Methods

info(service_name) click to toggle source
# File lib/inspec/resources/service.rb, line 435
def info(service_name)
  # check if service is installed
  # read all available services via ls /etc/init.d/
  srvlist = inspec.command("ls -1 /etc/init.d/")
  return nil if srvlist.exit_status != 0

  # check if the service is in list
  service = srvlist.stdout.split("\n").select { |srv| srv == service_name }

  # abort if we could not find any service
  return nil if service.empty?

  # read all enabled services from runlevel
  # on rhel via: 'chkconfig --list', is not installed by default
  # bash: for i in `find /etc/rc*.d -name S*`; do basename $i | sed -r 's/^S[0-9]+//'; done | sort | uniq
  enabled_services_cmd = inspec.command('find /etc/rc*.d /etc/init.d/rc*.d -name "S*"').stdout
  service_line = %r{rc(?<runlevel>[0-6])\.d/S[^/]*?#{Regexp.escape service_name}$}
  all_services = enabled_services_cmd.split("\n").map do |line|
    service_line.match(line)
  end.compact
  enabled = !all_services.empty?

  # Determine a list of runlevels which this service is activated for
  runlevels = RUNLEVELS.dup
  all_services.each { |x| runlevels[x[:runlevel].to_i] = true }

  # check if service is really running
  # service throws an exit code if the service is not installed or
  # not enabled

  cmd = inspec.command("#{service_ctl} #{service_name} status")
  running = cmd.exit_status == 0
  {
    name: service_name,
    description: nil,
    installed: true,
    running: running,
    enabled: enabled,
    runlevels: runlevels,
    type: "sysv",
  }
end