I refactored the password/min_age/max_age methods into a common base method,
and added a test for it. My patch for that follows.

---
 lib/puppet/provider/user/user_role_add.rb     |   23
+++++++++--------------
 spec/unit/provider/user/user_role_add_spec.rb |    7 +++++++
 2 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/lib/puppet/provider/user/user_role_add.rb
b/lib/puppet/provider/user/user_role_add.rb
index dd91de3..7e7ad78 100644
--- a/lib/puppet/provider/user/user_role_add.rb
+++ b/lib/puppet/provider/user/user_role_add.rb
@@ -143,28 +143,23 @@ Puppet::Type.type(:user).provide :user_role_add,
:parent => :useradd, :source =>
     run([command(:modify)] + build_keys_cmd(keys_hash) << @resource[:name],
"modify attribute key pairs")
   end

-  #Read in /etc/shadow, find the line for this user (skipping comments,
because who knows) and return the hashed pw (the second entry)
+  #Read in /etc/shadow, find the line for this user (skipping comments,
because who knows) and return it
   #No abstraction, all esoteric knowledge of file formats, yay
+  def shadow_entry
+    return @shadow_entry if defined? @shadow_entry
+    @shadow_entry = File.readlines("/etc/shadow").reject { |r| r =~
/^[^\w]/ }.collect { |l| l.chomp.split(':') }.find { |user, _| user ==
@resource[:name] }
+  end
+
   def password
-    #got perl?
-    if ary = File.readlines("/etc/shadow").reject { |r| r =~
/^[^\w]/}.collect { |l| l.split(':')[0..1] }.find { |user, passwd| user ==
@resource[:name] }
-      pass = ary[1]
-    end
-    pass
+    shadow_entry[1] if shadow_entry
   end

   def min_age
-    if ary = File.readlines("/etc/shadow").reject { |r| r =~
/^[^\w]/}.collect { |l| l.split(':')[0..3] }.find { |user, _, _, minage|
user == @resource[:name] }
-      minage = ary[3]
-    end
-    :absent
+    shadow_entry ? shadow_entry[3] : :absent
   end

   def max_age
-    if ary = File.readlines("/etc/shadow").reject { |r| r =~
/^[^\w]/}.collect { |l| l.split(':')[0..3] }.find { |user, _, _, _, maxage|
user == @resource[:name] }
-      maxage = ary[4]
-    end
-    :absent
+    shadow_entry ? shadow_entry[4] : :absent
   end

   #Read in /etc/shadow, find the line for our used and rewrite it with the
new pw
diff --git a/spec/unit/provider/user/user_role_add_spec.rb
b/spec/unit/provider/user/user_role_add_spec.rb
index 298ac22..82c06a5 100644
--- a/spec/unit/provider/user/user_role_add_spec.rb
+++ b/spec/unit/provider/user/user_role_add_spec.rb
@@ -256,4 +256,11 @@ describe provider_class do
       @provider.password=("hashedpassword")
     end
   end
+
+  describe "#shadow_entry" do
+    it "should return the line for the right user" do
+      File.stubs(:readlines).returns(["someuser:!:10:5:20:7:1::\n",
"fakeval:*:20:10:30:7:2::\n", "testuser:*:30:15:40:7:3::\n"])
+      @provider.shadow_entry.should == ["fakeval", "*", "20", "10", "30",
"7", "2"]
+    end
+  end
 end
-- 
1.7.2.1

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to