+1 On Tue, Nov 24, 2009 at 1:45 PM, Jesse A Wolfe <[email protected]> wrote:
> Apparently I left in a redundant #to_s. Am I particular enough to fix it? I > think, actually, yes, I am. Just one second. > > > On Tue, Nov 24, 2009 at 1:40 PM, Jesse Wolfe <[email protected]> wrote: > >> Symlinks confuse the "What file system am I on?" logic. This patch just >> runs the paths through a beefed up version of the standard 'realpath' >> method. >> Includes some of Markus's suggested changes. >> >> Signed-off-by: Jesse Wolfe <[email protected]> >> --- >> lib/puppet/util/selinux.rb | 26 +++++++++++++++++++++----- >> spec/unit/util/selinux.rb | 36 ++++++++++++++++++++++++++++++++++++ >> 2 files changed, 57 insertions(+), 5 deletions(-) >> >> diff --git a/lib/puppet/util/selinux.rb b/lib/puppet/util/selinux.rb >> index bdf4415..a5e7423 100644 >> --- a/lib/puppet/util/selinux.rb >> +++ b/lib/puppet/util/selinux.rb >> @@ -13,6 +13,8 @@ rescue LoadError >> # Nothing >> end >> >> +require 'pathname' >> + >> module Puppet::Util::SELinux >> >> def selinux_support? >> @@ -185,9 +187,24 @@ module Puppet::Util::SELinux >> return mntpoint >> end >> >> + def realpath(path) >> + pn = Pathname.new(path) >> + rest = [] >> + while ! pn.exist? >> + rest.unshift pn.basename >> + pn = pn.dirname >> + end >> + File.join( pn.realpath.to_s, *rest ) >> + end >> + >> + def parent_directory(path) >> + pn = Pathname.new(path) >> + pn.dirname.to_s >> + end >> + >> # Internal helper function to return which type of filesystem a >> # given file path resides on >> - def find_fs(file) >> + def find_fs(path) >> unless mnts = read_mounts() >> return nil >> end >> @@ -198,13 +215,12 @@ module Puppet::Util::SELinux >> # Just in case: return something if you're down to "/" or "" >> # Remove the last slash and everything after it, >> # and repeat with that as the file for the next loop through. >> - ary = file.split('/') >> - while not ary.empty? do >> - path = ary.join('/') >> + path = realpath(path) >> + while not path.empty? do >> if mnts.has_key?(path) >> return mnts[path] >> end >> - ary.pop >> + path = parent_directory(path) >> end >> return mnts['/'] >> end >> diff --git a/spec/unit/util/selinux.rb b/spec/unit/util/selinux.rb >> index da4686e..0d1882d 100755 >> --- a/spec/unit/util/selinux.rb >> +++ b/spec/unit/util/selinux.rb >> @@ -61,6 +61,42 @@ describe Puppet::Util::SELinux do >> selinux_label_support?('/mnt/nfs/testfile').should be_false >> end >> >> + it "should follow symlinks when determining file systems" do >> + >> >> self.stubs(:realpath).with('/mnt/symlink/testfile').returns('/mnt/nfs/dest/testfile') >> + >> + selinux_label_support?('/mnt/symlink/testfile').should >> be_false >> + end >> + >> + end >> + >> + describe "realpath" do >> + it "should handle files that don't exist" do >> + >> + # Since I'm stubbing Pathname.new for this test, >> + # I need to also stub the internal calls to Pathname.new, >> + # which happen in Pathname.dirname and Parthname.basename >> + # I want those to return real Pathname objects, >> + # so I'm creating them before the stub is in place. >> + realpaths = Hash.new {|hash, path| hash[path] = >> Pathname.new(path) } >> + paths = ['symlink', '/mnt'] >> + paths.each { |path| realpaths[path] } >> + >> + realpaths['/mnt/symlink'] = stubs "Pathname" >> + >> >> realpaths['/mnt/symlink'].stubs(:realpath).returns(realpaths['/mnt/nfs/dest']) >> + realpaths['/mnt/symlink'].stubs(:exist?).returns(true) >> + >> + realpaths['/mnt/symlink/nonexistant'] = stubs "Pathname" >> + >> realpaths['/mnt/symlink/nonexistant'].stubs(:realpath).raises(Errno::ENOENT) >> + >> realpaths['/mnt/symlink/nonexistant'].stubs(:exist?).returns(false) >> + >> >> realpaths['/mnt/symlink/nonexistant'].stubs(:dirname).returns(realpaths['/mnt/symlink']) >> + >> >> realpaths['/mnt/symlink/nonexistant'].stubs(:basename).returns(realpaths['nonexistant']) >> + >> + realpaths.each do |path, value| >> + Pathname.stubs(:new).with(path).returns(value) >> + end >> + >> + realpath('/mnt/symlink/nonexistant').should == >> '/mnt/nfs/dest/nonexistant' >> + end >> end >> >> describe "get_selinux_current_context" do >> -- >> 1.6.3.3 >> >> -- >> >> 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]<puppet-dev%[email protected]> >> . >> For more options, visit this group at >> http://groups.google.com/group/puppet-dev?hl=en. >> >> >> > -- > 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]<puppet-dev%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/puppet-dev?hl=en. > -- 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.
