prosody: posix_acl is fighting with the prosody module about proper modes; remove...
[mirror/dsa-puppet.git] / 3rdparty / modules / posix_acl / lib / puppet / provider / posix_acl / posixacl.rb
1 Puppet::Type.type(:posix_acl).provide(:posixacl, parent: Puppet::Provider) do
2   desc 'Provide posix 1e acl functions using posix getfacl/setfacl commands'
3
4   commands setfacl: '/usr/bin/setfacl'
5   commands getfacl: '/usr/bin/getfacl'
6
7   confine feature: :posix
8   defaultfor operatingsystem: [:debian, :ubuntu, :redhat, :centos, :fedora, :sles]
9
10   def exists?
11     permission
12   end
13
14   def unset_perm(perm, path)
15     # Don't try to unset mode bits, it doesn't make sense!
16     return if perm =~ %r{^(((u(ser)?)|(g(roup)?)|(m(ask)?)|(o(ther)?)):):}
17
18     perm = perm.split(':')[0..-2].join(':')
19     if check_recursive
20       setfacl('-R', '-n', '-x', perm, path)
21     else
22       setfacl('-n', '-x', perm, path)
23     end
24   end
25
26   def set_perm(perm, path)
27     if check_recursive
28       setfacl('-R', '-n', '-m', perm, path)
29     else
30       setfacl('-n', '-m', perm, path)
31     end
32   end
33
34   def unset
35     @resource.value(:permission).each do |perm|
36       unset_perm(perm, @resource.value(:path))
37     end
38   end
39
40   def purge
41     if check_recursive
42       setfacl('-R', '-b', @resource.value(:path))
43     else
44       setfacl('-b', @resource.value(:path))
45     end
46   end
47
48   def permission
49     return [] unless File.exist?(@resource.value(:path))
50     value = []
51     # String#lines would be nice, but we need to support Ruby 1.8.5
52     getfacl('--absolute-names', '--no-effective', @resource.value(:path)).split("\n").each do |line|
53       # Strip comments and blank lines
54       value << line.gsub('\040', ' ') if line !~ %r{^#} && line != ''
55     end
56     value.sort
57   end
58
59   def check_recursive
60     # Changed functionality to return boolean true or false
61     @resource.value(:recursive) == :true && resource.value(:recursemode) == :lazy
62   end
63
64   def check_exact
65     @resource.value(:action) == :exact
66   end
67
68   def check_unset
69     @resource.value(:action) == :unset
70   end
71
72   def check_purge
73     @resource.value(:action) == :purge
74   end
75
76   def check_set
77     @resource.value(:action) == :set
78   end
79
80   def permission=(_value) # TODO: Investigate why we're not using this parameter
81     Puppet.debug @resource.value(:action)
82     case @resource.value(:action)
83     when :unset
84       unset
85     when :purge
86       purge
87     when :exact, :set
88       cur_perm = permission
89       perm_to_set = @resource.value(:permission) - cur_perm
90       perm_to_unset = cur_perm - @resource.value(:permission)
91       return false if perm_to_set.empty? && perm_to_unset.empty?
92       # Take supplied perms literally, unset any existing perms which
93       # are absent from ACLs given
94       if check_exact
95         perm_to_unset.each do |perm|
96           # Skip base perms in unset step
97           if perm =~ %r{^(((u(ser)?)|(g(roup)?)|(m(ask)?)|(o(ther)?)):):}
98             Puppet.debug "skipping unset of base perm: #{perm}"
99           else
100             unset_perm(perm, @resource.value(:path))
101           end
102         end
103       end
104       perm_to_set.each do |perm|
105         set_perm(perm, @resource.value(:path))
106       end
107     end
108   end
109 end