class Inspec::Resources::Systemd

@see: www.freedesktop.org/software/systemd/man/systemctl.html @see: www.freedesktop.org/software/systemd/man/systemd-system.conf.html

Public Class Methods

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

Public Instance Methods

info(service_name) click to toggle source
# File lib/inspec/resources/service.rb, line 308
def info(service_name)
  cmd = inspec.command("#{service_ctl} show --no-pager --all #{service_name}")
  return nil if cmd.exit_status.to_i != 0

  # parse data
  params = SimpleConfig.new(
    cmd.stdout.chomp,
    assignment_regex: /^\s*([^=]*?)\s*=\s*(.*?)\s*$/,
    multiple_values: false
  ).params

  # LoadState values eg. loaded, not-found
  installed = params["LoadState"] == "loaded"
  startname = params["User"]

  {
    name: params["Id"],
    description: params["Description"],
    startname: startname,
    installed: installed,
    running: is_active?(service_name),
    enabled: is_enabled?(service_name),
    type: "systemd",
    params: params,
  }
end
is_active?(service_name) click to toggle source
# File lib/inspec/resources/service.rb, line 304
def is_active?(service_name)
  inspec.command("#{service_ctl} is-active #{service_name} --quiet").exit_status == 0
end
is_enabled?(service_name) click to toggle source
# File lib/inspec/resources/service.rb, line 290
def is_enabled?(service_name)
  result = inspec.command("#{service_ctl} is-enabled #{service_name} --quiet")
  return true if result.exit_status == 0

  # Some systems may not have a `.service` file for a particular service
  # which causes the `systemctl is-enabled` check to fail despite the
  # service being enabled. In that event we fallback to `sysv_service`.
  if result.stderr =~ /Failed to get.*No such file or directory/
    return inspec.sysv_service(service_name).enabled?
  end

  false
end