]> git.donarmstrong.com Git - dsa-puppet.git/blob - 3rdparty/modules/rabbitmq/lib/puppet/provider/rabbitmq_user_permissions/rabbitmqctl.rb
move to puppetlabs rabbitmq module
[dsa-puppet.git] / 3rdparty / modules / rabbitmq / lib / puppet / provider / rabbitmq_user_permissions / rabbitmqctl.rb
1 require File.expand_path(File.join(File.dirname(__FILE__), '..', 'rabbitmqctl'))
2 Puppet::Type.type(:rabbitmq_user_permissions).provide(:rabbitmqctl, :parent => Puppet::Provider::Rabbitmqctl) do
3
4   if Puppet::PUPPETVERSION.to_f < 3
5     commands :rabbitmqctl => 'rabbitmqctl'
6   else
7      has_command(:rabbitmqctl, 'rabbitmqctl') do
8        environment :HOME => "/tmp"
9      end
10   end
11
12   defaultfor :feature=> :posix
13
14   # cache users permissions
15   def self.users(name, vhost)
16     @users = {} unless @users
17     unless @users[name]
18       @users[name] = {}
19       self.run_with_retries {
20         rabbitmqctl('-q', 'list_user_permissions', name)
21       }.split(/\n/).each do |line|
22         line = self::strip_backslashes(line)
23         if line =~ /^(\S+)\s+(\S*)\s+(\S*)\s+(\S*)$/
24           @users[name][$1] =
25             {:configure => $2, :read => $4, :write => $3}
26         else
27           raise Puppet::Error, "cannot parse line from list_user_permissions:#{line}"
28         end
29       end
30     end
31     @users[name][vhost]
32   end
33
34   def users(name, vhost)
35     self.class.users(name, vhost)
36   end
37
38   def should_user
39     if @should_user
40       @should_user
41     else
42       @should_user = resource[:name].split('@')[0]
43     end
44   end
45
46   def should_vhost
47     if @should_vhost
48       @should_vhost
49     else
50       @should_vhost = resource[:name].split('@')[1]
51     end
52   end
53
54   def create
55     resource[:configure_permission] ||= "''"
56     resource[:read_permission]      ||= "''"
57     resource[:write_permission]     ||= "''"
58     rabbitmqctl('set_permissions', '-p', should_vhost, should_user, resource[:configure_permission], resource[:write_permission], resource[:read_permission])
59   end
60
61   def destroy
62     rabbitmqctl('clear_permissions', '-p', should_vhost, should_user)
63   end
64
65   # I am implementing prefetching in exists b/c I need to be sure
66   # that the rabbitmq package is installed before I make this call.
67   def exists?
68     users(should_user, should_vhost)
69   end
70
71   def configure_permission
72     users(should_user, should_vhost)[:configure]
73   end
74
75   def configure_permission=(perm)
76     set_permissions
77   end
78
79   def read_permission
80     users(should_user, should_vhost)[:read]
81   end
82
83   def read_permission=(perm)
84     set_permissions
85   end
86
87   def write_permission
88     users(should_user, should_vhost)[:write]
89   end
90
91   def write_permission=(perm)
92     set_permissions
93   end
94
95   # implement memoization so that we only call set_permissions once
96   def set_permissions
97     unless @permissions_set
98       @permissions_set = true
99       resource[:configure_permission] ||= configure_permission
100       resource[:read_permission]      ||= read_permission
101       resource[:write_permission]     ||= write_permission
102       rabbitmqctl('set_permissions', '-p', should_vhost, should_user,
103         resource[:configure_permission], resource[:write_permission],
104         resource[:read_permission]
105       )
106     end
107   end
108
109   def self.strip_backslashes(string)
110     # See: https://github.com/rabbitmq/rabbitmq-server/blob/v1_7/docs/rabbitmqctl.1.pod#output-escaping
111     string.gsub(/\\\\/, '\\')
112   end
113
114 end