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].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.


Reply via email to