From 2d8d9ceff86363ea303eaf4584d767040a343794 Mon Sep 17 00:00:00 2001 From: Jeff McCune Date: Tue, 28 Feb 2012 14:42:21 -0800 Subject: [PATCH] (#12881) Fix cron type default name error on windows On windows I ran into this error with the cron type: err: Failed to apply catalog: undefined method 'name' for nil:NilClass Without this patch, the problem appears to be that the cron type name parameter defaults to the following block: defaultto { Etc.getpwuid(Process.uid).name || "root" } On windows `Etc.getpwuid(Process.uid)` returns `nil`. This patch fixes the problem by binding the object returned by `Etc.getpwuid(Process.uid)` to a variable. We then check if the variable responds to the `name` method, and only send a message to name if so. Otherwise, we return "root" The included spec test will fail if there is a regression in the desired behavior. The expected failure looks like: Failures: 1) Puppet::Type::Cron should default to user => root if Etc.getpwuid(Process.uid) returns nil (#12357) Failure/Error: entry = described_class.new(:name => "test_entry", :ensure => :present) NoMethodError: undefined method `name' for nil:NilClass # ./lib/puppet/type/cron.rb:359:in `default' # ./lib/puppet/type.rb:540:in `set_default' # ./lib/puppet/type.rb:1834:in `set_parameters' # ./lib/puppet/type.rb:1833:in `each' # ./lib/puppet/type.rb:1833:in `set_parameters' # ./lib/puppet/type.rb:1797:in `initialize' # ./spec/unit/type/cron_spec.rb:474:in `new' # ./spec/unit/type/cron_spec.rb:474 --- lib/puppet/type/cron.rb | 5 ++++- spec/unit/type/cron_spec.rb | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/puppet/type/cron.rb b/lib/puppet/type/cron.rb index adf502ba506..40f9fe81d16 100755 --- a/lib/puppet/type/cron.rb +++ b/lib/puppet/type/cron.rb @@ -352,7 +352,10 @@ def should_to_s(newvalue = @should) The user defaults to whomever Puppet is running as." - defaultto { Etc.getpwuid(Process.uid).name || "root" } + defaultto { + struct = Etc.getpwuid(Process.uid) + struct.respond_to?(:name) && struct.name or 'root' + } end newproperty(:target) do diff --git a/spec/unit/type/cron_spec.rb b/spec/unit/type/cron_spec.rb index 0a82e309613..8216a5b1107 100755 --- a/spec/unit/type/cron_spec.rb +++ b/spec/unit/type/cron_spec.rb @@ -468,4 +468,10 @@ entry = described_class.new(:name => "test_entry", :ensure => :absent) entry.value(:command).should == nil end + + it "should default to user => root if Etc.getpwuid(Process.uid) returns nil (#12357)" do + Etc.expects(:getpwuid).returns(nil) + entry = described_class.new(:name => "test_entry", :ensure => :present) + entry.value(:user).should eql "root" + end end