inspec/lib/vulcano/plugins/backend.rb

130 lines
2.4 KiB
Ruby
Raw Normal View History

# encoding: utf-8
require 'digest'
module Vulcano::Plugins
class Backend
2015-09-05 14:07:54 +00:00
def self.name(name)
Vulcano::Plugins::Backend.__register(name, self)
end
def self.__register(id, obj)
# raise errors for all missing methods
%w{ file run_command os }.each do |m|
next if obj.public_method_defined?(m.to_sym)
obj.send(:define_method, m.to_sym) do |*args|
2015-09-03 21:24:42 +00:00
fail NotImplementedError.new("Backend must implement the #{m}() method.")
end
end
Vulcano::Backend.registry[id] = obj
end
class FileCommon
# interface methods: these fields should be implemented by every
# backend File
%w{
exists? mode owner group link_target content mtime size
selinux_label product_version file_version
}
def type
:unknown
end
# The following methods can be overwritten by a derived class
# if desired, to e.g. achieve optimizations.
def md5sum
res = Digest::MD5.new
res.update(content)
res.hexdigest
end
def sha256sum
res = Digest::SHA256.new
res.update(content)
res.hexdigest
end
# Additional methods for convenience
def file?
type == :file
end
def block_device?
type == :block_device
end
def character_device?
type == :character_device
end
def socket?
type == :socket
end
def directory?
type == :directory
end
def symlink?
type == :symlink
end
def pipe?
type == :pipe?
end
def mode?(mode)
mode == mode
end
def owned_by?(owner)
owner == owner
end
def grouped_into?(group)
group == group
end
def linked_to?(dst)
link_target == dst
end
def version?(version)
product_version == version or
file_version == version
end
# helper methods provided to any implementing class
2015-09-05 14:07:54 +00:00
private
UNIX_MODE_OWNERS = {
owner: 00700,
group: 00070,
2015-09-05 14:07:54 +00:00
other: 00007
}
UNIX_MODE_TYPES = {
r: 00444,
w: 00222,
2015-09-05 14:07:54 +00:00
x: 00111
}
def unix_mode_mask(owner, type)
o = UNIX_MODE_OWNERS[owner.to_sym]
return nil if o.nil?
t = UNIX_MODE_TYPES[type.to_sym]
return nil if t.nil?
t & o
end
end
end
end