[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, master, updated. debian/0.24.6-1-356-g5718585
James Turnbull
james at lovedthanlost.net
Fri Jan 23 14:20:43 UTC 2009
The following commit has been merged in the master branch:
commit 97987a705da7b8126569b1f5b7c3676ad0220f66
Author: James Turnbull <james at lovedthanlost.net>
Date: Tue Jul 29 08:07:56 2008 +1000
Feature #1241 : Improve performance of group lookups
diff --git a/CHANGELOG b/CHANGELOG
index 9004cf6..05c6021 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,10 @@
+0.24.x
+ Added feature #1241 : Improve performance of group lookups
+
+ Fixed bug #1448: Puppet CA incorrectly writes out all certs to inventory .txt on each certificate signing
+
+ Fixing puppetlast to make it work with 0.24.5 / 0.25
+
0.24.5
You can now select the encoding format when transferring the catalog,
with 'yaml' still being the default but 'marshal' being an option.
diff --git a/lib/puppet/util/posix.rb b/lib/puppet/util/posix.rb
index cc0340e..9281169 100755
--- a/lib/puppet/util/posix.rb
+++ b/lib/puppet/util/posix.rb
@@ -3,23 +3,22 @@ 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. It's also broken on
- # some platforms, unfortunately.
- def old_get_posix_field(space, field, id)
+ # some platforms, unfortunately, which is why we fall back to the other
+ # method search_posix_field in the gid and uid methods if a sanity check
+ # fails
+ def get_posix_field(space, field, id)
unless id
raise ArgumentError, "Did not get id"
end
- if id =~ /^\d+$/
- id = Integer(id)
- end
prefix = "get" + space.to_s
if id.is_a?(Integer)
if id > Puppet[:maximum_uid].to_i
Puppet.err "Tried to get %s field for silly id %s" % [field, id]
return nil
end
- method = (prefix + idfield(space).to_s).intern
+ method = methodbyid(space)
else
- method = (prefix + "nam").intern
+ method = methodbyname(space)
end
begin
@@ -31,13 +30,11 @@ module Puppet::Util::POSIX
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)
+ # to retrieve all objects of a certain type, search for a specific entry
+ # and then return a given field from that entry.
+ def search_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 > Puppet[:maximum_uid].to_i
@@ -112,14 +109,70 @@ module Puppet::Util::POSIX
end
end
+ # Determine what the method is to get users and groups by id
+ def methodbyid(space)
+ case Puppet::Util.symbolize(space)
+ when :gr, :group: return :getgrgid
+ when :pw, :user, :passwd: return :getpwuid
+ else
+ raise ArgumentError.new("Can only handle users and groups")
+ end
+ end
+
+ # Determine what the method is to get users and groups by name
+ def methodbyname(space)
+ case Puppet::Util.symbolize(space)
+ when :gr, :group: return :getgrnam
+ when :pw, :user, :passwd: return :getpwnam
+ else
+ raise ArgumentError.new("Can only handle users and groups")
+ end
+ end
+
# Get the GID of a given group, provided either a GID or a name
def gid(group)
- get_posix_field(:group, :gid, group)
+ begin
+ group = Integer(group)
+ rescue ArgumentError
+ # pass
+ end
+ if group.is_a?(Integer)
+ name = get_posix_field(:group, :name, group)
+ gid = get_posix_field(:group, :gid, name)
+ check_value = gid
+ else
+ gid = get_posix_field(:group, :gid, group)
+ name = get_posix_field(:group, :name, gid)
+ check_value = name
+ end
+ if check_value != group
+ return search_posix_field(:group, :gid, group)
+ else
+ return gid
+ end
end
# Get the UID of a given user, whether a UID or name is provided
def uid(user)
- get_posix_field(:passwd, :uid, user)
+ begin
+ user = Integer(user)
+ rescue ArgumentError
+ # pass
+ end
+ if user.is_a?(Integer)
+ name = get_posix_field(:passwd, :name, user)
+ uid = get_posix_field(:passwd, :uid, name)
+ check_value = uid
+ else
+ uid = get_posix_field(:passwd, :uid, user)
+ name = get_posix_field(:passwd, :name, uid)
+ check_value = name
+ end
+ if check_value != user
+ return search_posix_field(:passwd, :uid, user)
+ else
+ return uid
+ end
end
end
diff --git a/test/util/posixtest.rb b/test/util/posixtest.rb
index 34d68e3..f64a95d 100755
--- a/test/util/posixtest.rb
+++ b/test/util/posixtest.rb
@@ -25,16 +25,29 @@ class TestPosixUtil < Test::Unit::TestCase
def test_get_posix_field
{: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|
+ [obj.name, obj.send(id)].each do |test|
value = nil
assert_nothing_raised do
value = get_posix_field(space, :name, test)
end
- assert_equal(obj.name, value, "did not get correct value from get_posix_field")
+ assert_equal(obj.name, value, "did not get correct value from get_posix_field (known to be broken on some platforms)")
end
end
end
+ def test_search_posix_field
+ {:group => nonrootgroup, :passwd => nonrootuser}.each do |space, obj|
+ id = Puppet::Util.idfield(space)
+ [obj.name, obj.send(id)].each do |test|
+ value = nil
+ assert_nothing_raised do
+ value = search_posix_field(space, :name, test)
+ end
+ assert_equal(obj.name, value, "did not get correct value from search_posix_field")
+ end
+ end
+ end
+
def test_get_provider_value
user = nonrootuser
obj = mk_posix_resource(:user, user)
--
Puppet packaging for Debian
More information about the Pkg-puppet-devel
mailing list