From aa60dccdf7e3b75fd25e3d506749448f5341f1c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Romain=20Tarti=C3=A8re?= Date: Wed, 25 Mar 2020 08:08:15 -1000 Subject: [PATCH] Avoid exceptions for zone facts on FreeBSD FreeBSD currently loads all Solaris facts, but FreeBSD does not have "zones", and the zone related facts fail hardly when being processed. Improve error detection when building the zone facts, and do not emit these facts when an error occurred. --- .rubocop_todo.yml | 2 -- lib/facts/solaris/solaris_zones/zone.rb | 2 ++ lib/resolvers/solaris/solaris_zone_name.rb | 2 ++ lib/resolvers/solaris/zone_resolver.rb | 2 ++ spec/facter/resolvers/solaris/current_zone_resolver_spec.rb | 5 ++++- spec/facter/resolvers/solaris/zone_resolver_spec.rb | 5 ++++- 6 files changed, 14 insertions(+), 4 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 282b5c74b..5b9dee155 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -24,9 +24,7 @@ RSpec/ExpectInHook: - 'spec/facter/facts/macosx/filesystems_spec.rb' - 'spec/facter/resolvers/aix/ffi_helper_spec.rb' - 'spec/facter/resolvers/lpar_resolver_spec.rb' - - 'spec/facter/resolvers/solaris/current_zone_resolver_spec.rb' - 'spec/facter/resolvers/solaris/zfs_resolver_spec.rb' - - 'spec/facter/resolvers/solaris/zone_resolver_spec.rb' - 'spec/facter/resolvers/solaris/zpool_resolver_spec.rb' - 'spec/facter/resolvers/ssh_resolver_spec.rb' - 'spec/facter/resolvers/wpar_resolver_spec.rb' diff --git a/lib/facts/solaris/solaris_zones/zone.rb b/lib/facts/solaris/solaris_zones/zone.rb index cad8a1a25..ec746de25 100644 --- a/lib/facts/solaris/solaris_zones/zone.rb +++ b/lib/facts/solaris/solaris_zones/zone.rb @@ -21,6 +21,8 @@ def call_the_resolver zones = {} results = Facter::Resolvers::SolarisZone.resolve(:zone) + return Facter::ResolvedFact.new(FACT_NAME, nil) unless results + results&.each do |result| zones.merge!(parse_result(result)) resolved_facts << create_legacy_zone_facts(result) diff --git a/lib/resolvers/solaris/solaris_zone_name.rb b/lib/resolvers/solaris/solaris_zone_name.rb index 8e2476e28..aa6bf9eac 100644 --- a/lib/resolvers/solaris/solaris_zone_name.rb +++ b/lib/resolvers/solaris/solaris_zone_name.rb @@ -14,6 +14,8 @@ def post_resolve(fact_name) end def build_current_zone_name_fact(fact_name) + return unless File.executable?('/bin/zonename') + zone_name_output, status = Open3.capture2('/bin/zonename') unless status.to_s.include?('exit 0') @log.debug("Command #{command} returned status: #{status}") diff --git a/lib/resolvers/solaris/zone_resolver.rb b/lib/resolvers/solaris/zone_resolver.rb index a2d774b83..b01853b92 100644 --- a/lib/resolvers/solaris/zone_resolver.rb +++ b/lib/resolvers/solaris/zone_resolver.rb @@ -14,6 +14,8 @@ def post_resolve(fact_name) end def build_zone_fact(fact_name) + return unless File.executable?('/usr/sbin/zoneadm') + command = '/usr/sbin/zoneadm list -cp' zone_adm_output, status = Open3.capture2(command) unless status.to_s.include?('exit 0') diff --git a/spec/facter/resolvers/solaris/current_zone_resolver_spec.rb b/spec/facter/resolvers/solaris/current_zone_resolver_spec.rb index 48f8743ba..bea356062 100644 --- a/spec/facter/resolvers/solaris/current_zone_resolver_spec.rb +++ b/spec/facter/resolvers/solaris/current_zone_resolver_spec.rb @@ -3,7 +3,10 @@ describe Facter::Resolvers::SolarisZone do before do status = double(Process::Status, to_s: st) - expect(Open3).to receive(:capture2) + allow(File).to receive(:executable?) + .with('/bin/zonename') + .and_return(true) + allow(Open3).to receive(:capture2) .with('/bin/zonename') .ordered .and_return([zone_name_output, status]) diff --git a/spec/facter/resolvers/solaris/zone_resolver_spec.rb b/spec/facter/resolvers/solaris/zone_resolver_spec.rb index 76ebbbf80..dc585561b 100644 --- a/spec/facter/resolvers/solaris/zone_resolver_spec.rb +++ b/spec/facter/resolvers/solaris/zone_resolver_spec.rb @@ -3,7 +3,10 @@ describe Facter::Resolvers::SolarisZone do before do status = double(Process::Status, to_s: st) - expect(Open3).to receive(:capture2) + allow(File).to receive(:executable?) + .with('/usr/sbin/zoneadm') + .and_return(true) + allow(Open3).to receive(:capture2) .with('/usr/sbin/zoneadm list -cp') .ordered .and_return([output, status])