1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
# encoding: utf-8
module Train::Platforms
class Platform
include Train::Platforms::Common
attr_accessor :backend, :condition, :families, :family_hierarchy, :platform
def initialize(name, condition = {})
@name = name
@condition = condition
@families = {}
@family_hierarchy = []
@platform = {}
@detect = nil
@title = name.to_s.capitalize
# add itself to the platform list
Train::Platforms.list[name] = self
end
def direct_families
@families.collect { |k, _v| k.name }
end
def find_family_hierarchy(platform = self)
families = platform.families.map { |k, v| [k.name, find_family_hierarchy(k)] }
@family_hierarchy = families.flatten
end
def family
@platform[:family] || @family_hierarchy[0]
end
def name
# Override here incase a updated name was set
# during the detect logic
clean_name
end
def clean_name(force: false)
@cleaned_name = nil if force
@cleaned_name ||= (@platform[:name] || @name).downcase.tr(" ", "_")
end
def uuid
@uuid ||= Train::Platforms::Detect::UUID.new(self).find_or_create_uuid.downcase
end
# This is for backwords compatability with
# the current inspec os resource.
def[](name)
if respond_to?(name)
send(name)
else
"unknown"
end
end
def title(title = nil)
return @title if title.nil?
@title = title
self
end
def to_hash
@platform
end
# Add generic family? and platform methods to an existing platform
#
# This is done later to add any custom
# families/properties that were created
def add_platform_methods
# Redo clean name if there is a detect override
clean_name(force: true) unless @platform[:name].nil?
# Add in family methods
family_list = Train::Platforms.families
family_list.each_value do |k|
name = "#{k.name}?"
next if respond_to?(name)
define_singleton_method(name) do
family_hierarchy.include?(k.name)
end
end
# Helper methods for direct platform info
@platform.each_key do |m|
next if respond_to?(m)
define_singleton_method(m) do
@platform[m]
end
end
# Create method for name if its not already true
m = name + "?"
return if respond_to?(m)
define_singleton_method(m) do
true
end
end
end
end
|