You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.7 KiB
75 lines
2.7 KiB
From 2a401c6897af3abbc27dfaaf162556745267d6b2 Mon Sep 17 00:00:00 2001
|
|
From: Jeroen van Meeuwen (Fedora Unity) <kanarip@fedoraunity.org>
|
|
Date: Wed, 24 Jun 2009 15:30:19 +0200
|
|
Subject: [PATCH/puppet 2/6] Support supplementary groups (Till Maas)
|
|
|
|
---
|
|
lib/puppet/util.rb | 5 +++--
|
|
lib/puppet/util/suidmanager.rb | 11 ++++++++++-
|
|
2 files changed, 13 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/lib/puppet/util.rb b/lib/puppet/util.rb
|
|
index f8a8721..51a2a16 100644
|
|
--- a/lib/puppet/util.rb
|
|
+++ b/lib/puppet/util.rb
|
|
@@ -58,10 +58,11 @@ module Util
|
|
end
|
|
unless Puppet::Util::SUIDManager.uid == user
|
|
begin
|
|
+ Puppet::Util::SUIDManager.initgroups(user)
|
|
Puppet::Util::SUIDManager.uid = user
|
|
Puppet::Util::SUIDManager.euid = user
|
|
- rescue
|
|
- $stderr.puts "could not change to user %s" % user
|
|
+ rescue => detail
|
|
+ $stderr.puts "could not change to user %s: %s" % [user, detail]
|
|
exit(74)
|
|
end
|
|
end
|
|
diff --git a/lib/puppet/util/suidmanager.rb b/lib/puppet/util/suidmanager.rb
|
|
index b071dca..9f6e3b6 100644
|
|
--- a/lib/puppet/util/suidmanager.rb
|
|
+++ b/lib/puppet/util/suidmanager.rb
|
|
@@ -7,7 +7,7 @@ module Puppet::Util::SUIDManager
|
|
extend Forwardable
|
|
|
|
to_delegate_to_process = [ :euid=, :euid, :egid=, :egid,
|
|
- :uid=, :uid, :gid=, :gid ]
|
|
+ :uid=, :uid, :gid=, :gid, :groups=, :groups ]
|
|
|
|
to_delegate_to_process.each do |method|
|
|
def_delegator Process, method
|
|
@@ -26,13 +26,16 @@ module Puppet::Util::SUIDManager
|
|
# We set both because some programs like to drop privs, i.e. bash.
|
|
old_uid, old_gid = self.uid, self.gid
|
|
old_euid, old_egid = self.euid, self.egid
|
|
+ old_groups = self.groups
|
|
begin
|
|
self.egid = convert_xid :gid, new_gid if new_gid
|
|
+ self.initgroups(convert_xid(:uid, new_uid)) if new_uid
|
|
self.euid = convert_xid :uid, new_uid if new_uid
|
|
|
|
yield
|
|
ensure
|
|
self.euid, self.egid = old_euid, old_egid
|
|
+ self.groups = old_groups
|
|
end
|
|
end
|
|
module_function :asuser
|
|
@@ -49,6 +52,12 @@ module Puppet::Util::SUIDManager
|
|
end
|
|
module_function :convert_xid
|
|
|
|
+ # Initialize supplementary groups
|
|
+ def initgroups(user)
|
|
+ require 'etc'
|
|
+ Process.initgroups(Etc.getpwuid(user).name, Process.gid)
|
|
+ end
|
|
+ module_function :initgroups
|
|
|
|
def run_and_capture(command, new_uid=nil, new_gid=nil)
|
|
output = Puppet::Util.execute(command, :failonfail => false, :uid => new_uid, :gid => new_gid)
|
|
--
|
|
1.6.3.3
|
|
|