Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
inspec / lib / resources / platform.rb
Size: Mime:
# encoding: utf-8

module Inspec::Resources
  class PlatformResource < Inspec.resource(1)
    name 'platform'
    desc 'Use the platform InSpec resource to test the platform on which the system is running.'
    example "
      describe platform do
        its('name') { should eq 'redhat' }
      end

      describe platform do
        it { should be_in_family('unix') }
      end
    "

    def initialize
      @platform = inspec.backend.platform
    end

    # add helper methods for easy access of properties
    %w{family release arch}.each do |property|
      define_method(property.to_sym) do
        @platform[property]
      end
    end

    def families
      @platform.family_hierarchy
    end

    def name
      @platform.name
    end

    def [](key)
      # convert string to symbol
      key = key.to_sym if key.is_a? String
      return name if key == :name

      @platform[key]
    end

    def platform?(name)
      @platform.name == name ||
        @platform.family_hierarchy.include?(name)
    end

    def in_family?(family)
      @platform.family_hierarchy.include?(family)
    end

    def params
      h = {
        name: name,
        families: families,
        release: release,
      }

      # Avoid adding Arch for APIs (not applicable)
      unless in_family?('api')
        h[:arch] = arch
      end

      h
    end

    def supported?(supports)
      return true if supports.nil? || supports.empty?

      status = true
      supports.each do |s|
        s.each do |k, v|
          if %i(os_family os-family platform_family platform-family).include?(k)
            status = in_family?(v)
          elsif %i(os platform).include?(k)
            status = platform?(v)
          elsif %i(os_name os-name platform_name platform-name).include?(k)
            status = name == v
          elsif k == :release
            status = check_release(v)
          else
            status = false
          end
          break if status == false
        end
        return true if status == true
      end

      status
    end

    def to_s
      'Platform Detection'
    end

    private

    def check_release(value)
      # allow wild card matching
      if value.include?('*')
        cleaned = Regexp.escape(value).gsub('\*', '.*?')
        !(release =~ /#{cleaned}/).nil?
      else
        release == value
      end
    end
  end
end