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
4 if Puppet::PUPPETVERSION.to_f < 3
5 commands :rabbitmqctl => 'rabbitmqctl'
7 has_command(:rabbitmqctl, 'rabbitmqctl') do
8 environment :HOME => "/tmp"
12 defaultfor :feature=> :posix
14 # cache users permissions
15 def self.users(name, vhost)
16 @users = {} unless @users
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*)$/
25 {:configure => $2, :read => $4, :write => $3}
27 raise Puppet::Error, "cannot parse line from list_user_permissions:#{line}"
34 def users(name, vhost)
35 self.class.users(name, vhost)
42 @should_user = resource[:name].split('@')[0]
50 @should_vhost = resource[:name].split('@')[1]
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])
62 rabbitmqctl('clear_permissions', '-p', should_vhost, should_user)
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.
68 users(should_user, should_vhost)
71 def configure_permission
72 users(should_user, should_vhost)[:configure]
75 def configure_permission=(perm)
80 users(should_user, should_vhost)[:read]
83 def read_permission=(perm)
88 users(should_user, should_vhost)[:write]
91 def write_permission=(perm)
95 # implement memoization so that we only call set_permissions once
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]
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(/\\\\/, '\\')