class Inspec::Resources::Service

rubocop:disable ClassLength
TODO: extend the logic to detect the running init system, independently of OS
Ubuntu < 15.04 : upstart
Ubuntu 15.04 : systemd
RedHat 7 : systemd
Fedora 15 : systemd
system.
We detect the init system for each operating system, based on the operating

def description

returns the service description from info
def description
  return nil if info.nil?
  info[:description]
end

def enabled?(_level = nil)

verifies if the service is enabled
def enabled?(_level = nil)
  return false if info.nil?
  info[:enabled]
end

def info

def info
  return nil if @service_mgmt.nil?
  @cache ||= @service_mgmt.info(@service_name)
end

def initialize(service_name, service_ctl = nil)

def initialize(service_name, service_ctl = nil)
  @service_name = service_name
  @service_mgmt = nil
  @service_ctl ||= service_ctl
  @cache = nil
  @service_mgmt = select_service_mgmt
  return skip_resource 'The `service` resource is not supported on your OS yet.' if @service_mgmt.nil?
end

def installed?(_name = nil, _version = nil)

verifies the service is registered
def installed?(_name = nil, _version = nil)
  return false if info.nil?
  info[:installed]
end

def name

returns the service name from info
def name
  return @service_name if info.nil?
  info[:name]
end

def params

def params
  return {} if info.nil?
  Hashie::Mash.new(info[:params] || {})
end

def runlevels(*args)

get all runlevels that are available and their configuration
def runlevels(*args)
  return Runlevels.new(self) if info.nil? or info[:runlevels].nil?
  Runlevels.from_hash(self, info[:runlevels], args)
end

def running?(_under = nil)

verifies the service is currently running
def running?(_under = nil)
  return false if info.nil?
  info[:running]
end

def select_service_mgmt # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength

rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
def select_service_mgmt # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
  os = inspec.os
  platform = os[:name]
  # Ubuntu
  # @see: https://wiki.ubuntu.com/SystemdForUpstartUsers
  # Ubuntu 15.04 : Systemd
  #   Systemd runs with PID 1 as /sbin/init.
  #   Upstart runs with PID 1 as /sbin/upstart.
  # Ubuntu < 15.04 : Upstart
  # Upstart runs with PID 1 as /sbin/init.
  # Systemd runs with PID 1 as /lib/systemd/systemd.
  if %w{ubuntu}.include?(platform)
    version = os[:release].to_f
    if version < 15.04
      Upstart.new(inspec, service_ctl)
    else
      Systemd.new(inspec, service_ctl)
    end
  elsif %w{linuxmint}.include?(platform)
    version = os[:release].to_f
    if version < 18
      Upstart.new(inspec, service_ctl)
    else
      Systemd.new(inspec, service_ctl)
    end
  elsif %w{debian}.include?(platform)
    version = os[:release].to_i
    if version > 7
      Systemd.new(inspec, service_ctl)
    else
      SysV.new(inspec, service_ctl || '/usr/sbin/service')
    end
  elsif %w{redhat fedora centos}.include?(platform)
    version = os[:release].to_i
    if (%w{ redhat centos }.include?(platform) && version >= 7) || (platform == 'fedora' && version >= 15)
      Systemd.new(inspec, service_ctl)
    else
      SysV.new(inspec, service_ctl || '/sbin/service')
    end
  elsif %w{wrlinux}.include?(platform)
    SysV.new(inspec, service_ctl)
  elsif %w{mac_os_x}.include?(platform)
    LaunchCtl.new(inspec, service_ctl)
  elsif os.windows?
    WindowsSrv.new(inspec)
  elsif %w{freebsd}.include?(platform)
    BSDInit.new(inspec, service_ctl)
  elsif %w{arch}.include?(platform)
    Systemd.new(inspec, service_ctl)
  elsif %w{suse opensuse}.include?(platform)
    if os[:release].to_i >= 12
      Systemd.new(inspec, service_ctl)
    else
      SysV.new(inspec, service_ctl || '/sbin/service')
    end
  elsif %w{aix}.include?(platform)
    SrcMstr.new(inspec)
  elsif %w{amazon}.include?(platform)
    Upstart.new(inspec, service_ctl)
  elsif os.solaris?
    Svcs.new(inspec)
  end
end

def startmode

returns the service start up mode from info
def startmode
  return nil if info.nil?
  info[:startmode]
end

def to_s

def to_s
  "Service #{@service_name}"
end

def type

returns the service type from info
def type
  return nil if info.nil?
  info[:type]
end