inspec/lib/resources/package.rb
2015-09-22 02:17:28 +02:00

136 lines
2.9 KiB
Ruby

# encoding: utf-8
# Resource to determine package information
#
# Usage:
# describe package('nginx') do
# it { should be_installed }
# end
class Package < Vulcano.resource(1)
name 'package'
def initialize(package_name = nil)
@package_name = package_name
@name = @package_name
@cache = nil
# select package manager
@pkgman = nil
case vulcano.os[:family]
when 'ubuntu', 'debian'
@pkgman = Deb.new(vulcano)
when 'redhat', 'fedora'
@pkgman = Rpm.new(vulcano)
when 'arch'
@pkgman = Pacman.new(vulcano)
when 'darwin'
@pkgman = Brew.new(vulcano)
else
fail 'The `package` resource is not supported on your OS yet. Please open an issue on Github.'
end
end
# returns true if the package is installed
def installed?(_provider, _version)
!info.nil?
end
# returns the package description
def info
return @cache if !@cache.nil?
@pkgman.info(@package_name)
end
# return the package version
def version
info = @pkgman.info(@package_name)
return nil if info.nil?
info[:version]
end
def to_s
"System package #{@package_name}"
end
end
class PkgManagement
def initialize(vulcano)
@vulcano = vulcano
end
end
# Debian / Ubuntu
class Deb < PkgManagement
def info(package_name)
cmd = @vulcano.run_command("dpkg -s #{package_name}")
return nil if cmd.exit_status.to_i != 0
params = SimpleConfig.new(
cmd.stdout.chomp,
assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/,
multiple_values: false,
).params
{
name: params['Package'],
installed: true,
version: params['Version'],
type: 'deb',
}
end
end
# RHEL family
class Rpm < PkgManagement
def info(package_name)
cmd = @vulcano.run_command("rpm -qia #{package_name}")
return nil if cmd.exit_status.to_i != 0
params = SimpleConfig.new(
cmd.stdout.chomp,
assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/,
multiple_values: false,
).params
{
name: params['Name'],
installed: true,
version: params['Version'],
type: 'rpm',
}
end
end
# MacOS / Darwin implementation
class Brew < PkgManagement
def info(package_name)
cmd = @vulcano.run_command("brew info --json=v1 #{package_name}")
return nil if cmd.exit_status.to_i != 0
# parse data
pkg = JSON.parse(cmd.stdout)[0]
{
name: "#{pkg.name}",
installed: true,
version: "#{pkg.installed.version}",
type: 'brew',
}
end
end
# Arch Linux
class Pacman < PkgManagement
def info(package_name)
cmd = @vulcano.run_command("pacman -Qi #{package_name}")
return nil if cmd.exit_status.to_i != 0
params = SimpleConfig.new(
cmd.stdout.chomp,
assignment_re: /^\s*([^:]*?)\s*:\s*(.*?)\s*$/,
multiple_values: false,
).params
{
name: params['Name'],
installed: true,
version: params['Version'],
type: 'pacman',
}
end
end