diff options
-rwxr-xr-x | lib/puppet/util/posix.rb | 39 | ||||
-rwxr-xr-x | test/util/posixtest.rb | 10 |
2 files changed, 37 insertions, 12 deletions
diff --git a/lib/puppet/util/posix.rb b/lib/puppet/util/posix.rb index 06df632a9..d7e3bb8b2 100755 --- a/lib/puppet/util/posix.rb +++ b/lib/puppet/util/posix.rb @@ -1,8 +1,10 @@ # Utility methods for interacting with POSIX objects; mostly user and group module Puppet::Util::POSIX + # Retrieve a field from a POSIX Etc object. The id can be either an integer - # or a name. This only works for users and groups. - def get_posix_field(space, field, id) + # or a name. This only works for users and groups. It's also broken on + # some platforms, unfortunately. + def old_get_posix_field(space, field, id) unless id raise ArgumentError, "Did not get id" end @@ -27,8 +29,35 @@ module Puppet::Util::POSIX return nil end end + + # A degenerate method of retrieving name/id mappings. The job of this method is + # to find a specific entry and then return a given field from that entry. + def get_posix_field(type, field, id) + idmethod = idfield(type) + integer = false + if id =~ /^\d+$/ + id = Integer(id) + end + if id.is_a?(Integer) + integer = true + if id > 1000000 + Puppet.err "Tried to get %s field for silly id %s" % [field, id] + return nil + end + end + + Etc.send(type) do |object| + if integer and object.send(idmethod) == id + return object.send(field) + elsif object.name == id + return object.send(field) + end + end + return nil + end # Look in memory for an already-managed type and use its info if available. + # Currently unused. def get_provider_value(type, field, id) unless typeklass = Puppet::Type.type(type) raise ArgumentError, "Invalid type %s" % type @@ -70,7 +99,7 @@ module Puppet::Util::POSIX def idfield(space) case Puppet::Util.symbolize(space) when :gr, :group: return :gid - when :pw, :user: return :uid + when :pw, :user, :passwd: return :uid else raise ArgumentError.new("Can only handle users and groups") end @@ -78,12 +107,12 @@ module Puppet::Util::POSIX # Get the GID of a given group, provided either a GID or a name def gid(group) - get_provider_value(:group, :gid, group) or get_posix_field(:gr, :gid, group) + get_posix_field(:group, :gid, group) end # Get the UID of a given user, whether a UID or name is provided def uid(user) - get_provider_value(:user, :uid, user) or get_posix_field(:pw, :uid, user) + get_posix_field(:passwd, :uid, user) end end diff --git a/test/util/posixtest.rb b/test/util/posixtest.rb index 8c4174144..0dd437fa8 100755 --- a/test/util/posixtest.rb +++ b/test/util/posixtest.rb @@ -23,18 +23,14 @@ class TestPosixUtil < Test::Unit::TestCase end def test_get_posix_field - {:gr => nonrootgroup, :pw => nonrootuser}.each do |space, obj| - if space == :gr - id = :gid - else - id = :uid - end + {:group => nonrootgroup, :passwd => nonrootuser}.each do |space, obj| + id = Puppet::Util.idfield(space) [obj.name, obj.send(id), obj.send(id).to_s].each do |test| value = nil assert_nothing_raised do value = get_posix_field(space, :name, test) end - assert_equal(obj.name, value) + assert_equal(obj.name, value, "did not get correct value from get_posix_field") end end end |