lib/simp/rspec-puppet-facts.rb in simp-rspec-puppet-facts-1.0.1 vs lib/simp/rspec-puppet-facts.rb in simp-rspec-puppet-facts-1.2.0
- old
+ new
@@ -1,54 +1,114 @@
+require 'json'
+
module Simp; end
module Simp::RspecPuppetFacts
- VERSION = '1.0.1'
+ require File.expand_path('version', File.dirname(__FILE__))
- # TODO: roll this into files
- def extra_os_facts
- {
- 'CentOS' => {
- '6' => {
- 'x86_64' => {
- :grub_version => '0.97',
- :uid_min => '500',
- },
- },
- '7' => {
- 'x86_64' => {
- :grub_version => '2.02~beta2',
- :uid_min => '500',
- },
- },
- },
- 'RedHat' => {
- '6' => {
- 'x86_64' => {
- :grub_version => '0.97',
- :uid_min => '500',
- },
- },
- '7' => {
- 'x86_64' => {
- :grub_version => '2.02~beta2',
- :uid_min => '500',
- },
- },
- },
- }
- end
+ SELINUX_MODES= [:enforcing, :disabled, :permissive]
def on_supported_os( opts = {} )
h = Simp::RspecPuppetFacts::Shim.on_supported_os( opts )
+ selinux_mode = opts.fetch(:selinux_mode,:enforcing)
+
h.each do | os, facts |
- facts[:lsbmajdistrelease] = facts[:operatingsystemmajrelease]
- extra_facts = extra_os_facts.fetch( facts.fetch(:operatingsystem) ).fetch( facts.fetch(:operatingsystemmajrelease) ).fetch( facts.fetch(:architecture) )
- extra_opts_facts = opts.fetch( :extra_facts, {} )
+ facter_version=Facter.version[0..2]
+ facts_file = File.expand_path("../../facts/#{facter_version}/#{os}.facts", File.dirname(__FILE__))
+ if File.file? facts_file
+ captured_facts_raw = File.open(
+ File.expand_path("../../facts/#{facter_version}/#{os}.facts", File.dirname(__FILE__))
+ ).read
+ captured_facts = symbolize_keys JSON.parse( captured_facts_raw )
+ captured_facts.keep_if{ |k,v| (captured_facts.keys-facts.keys).include? k }
- facts.merge! extra_facts
- facts.merge! extra_opts_facts
+ facts.merge! captured_facts
+ facts.merge! opts.fetch( :extra_facts, {} )
+ facts.merge! lsb_facts( facts )
+ facts.merge! selinux_facts( selinux_mode, facts )
+ facts.merge! opts.fetch( :extra_facts_immutable, {} )
+ end
+
+ if ( ENV.key?('SIMP_FACTS_OS') &&
+ !ENV['SIMP_FACTS_OS'].nil? &&
+ ENV['SIMP_FACTS_OS'].strip != '' &&
+ ENV['SIMP_FACTS_OS'] !~ /all/i )
+ unless ENV['SIMP_FACTS_OS'].split(/[ ,]+/).include? os
+ h.delete(os)
+ end
+ end
end
h
+ end
+
+
+ def lsb_facts( facts )
+ lsb_facts = {}
+ # attempt to massage a major release version if missing (for facter 1.6)
+ unless ENV['SIMP_FACTS_lsb'] == 'no'
+ puts "==== mocking lsb facts [disable with SIMP_FACTS_lsb=no]" if ENV['VERBOSE']
+ rel = facts.fetch(:operatingsystemmajrelease,
+ facts.fetch(:operatingsystemrelease).split('.').first)
+ lsb_facts[:lsbmajdistrelease] = rel
+ end
+ lsb_facts
+ end
+
+ def selinux_facts( mode, facts )
+ unless SELINUX_MODES.include?( mode )
+ fail "FATAL: `mode` must be one of: #{SELINUX_MODES.map{|x| x.to_s.sub(/^/,':')}.join(', ')}"
+ end
+ sefacts = {}
+ sefacts_enforcing = {
+ :selinux => true,
+ :selinux_current_mode => 'enforcing',
+ :selinux_state => 'enforcing',
+ }
+ sefacts_permissive = {
+ :selinux => true,
+ :selinux_current_mode => 'permissive',
+ :selinux_state => 'permssive',
+ }
+ sefacts_disabled = {
+ :selinux => false,
+ :selinux_current_mode => 'disabled',
+ :selinux_state => 'disabled',
+ }
+ sefacts = sefacts_enforcing
+ sefacts = sefacts_enforcing if mode == :enforcing
+ sefacts = sefacts_permissive if mode == :permissive
+ sefacts = sefacts_disabled if mode == :disabled
+
+ # ensure mount options in :tmp_mount_* facts match
+ ['tmp','var_tmp','dev_shm'].each do |m|
+ k = "tmp_mount_#{m}".to_sym
+ if mount_opts = facts.fetch(k,false)
+ if mode == :disabled
+ sefacts[k] = mount_opts.sub(/,seclabel$|seclabel,/, '')
+ else
+ unless mount_opts =~ /\bseclabel\b/
+ sefacts[k] = "#{mount_opts},seclabel"
+ end
+ end
+ end
+ end
+ facts.merge sefacts
+ end
+
+ # recursively onvert all hash keys to symbols
+ def symbolize_keys(hash)
+ hash.inject({}){|result, (key, value)|
+ new_key = case key
+ when String then key.to_sym
+ else key
+ end
+ new_value = case value
+ when Hash then symbolize_keys(value)
+ else value
+ end
+ result[new_key] = new_value
+ result
+ }
end
class Shim
require 'rspec-puppet-facts'
extend ::RspecPuppetFacts