1 Puppet::Type.type(:rabbitmq_user_permissions).provide(:rabbitmqctl) do
3 commands :rabbitmqctl => 'rabbitmqctl'
4 defaultfor :feature=> :posix
10 # cache users permissions
11 def self.users(name, vhost)
12 @users = {} unless @users
15 out = rabbitmqctl('list_user_permissions', name).split(/\n/)[1..-2].each do |line|
16 if line =~ /^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$/
18 {:configure => $2, :read => $3, :write => $4}
20 raise Puppet::Error, "cannot parse line from list_user_permissions:#{line}"
27 def users(name, vhost)
28 self.class.users(name, vhost)
35 @should_user = resource[:name].split('@')[0]
43 @should_vhost = resource[:name].split('@')[1]
48 resource[:configure_permission] ||= "'^$'"
49 resource[:read_permission] ||= "'^$'"
50 resource[:write_permission] ||= "'^$'"
51 rabbitmqctl('set_permissions', '-p', should_vhost, should_user, resource[:configure_permission], resource[:read_permission], resource[:write_permission])
55 rabbitmqctl('clear_permissions', '-p', should_vhost, should_user)
58 # I am implementing prefetching in exists b/c I need to be sure
59 # that the rabbitmq package is installed before I make this call.
61 users(should_user, should_vhost)
64 def configure_permission
65 users(should_user, should_vhost)[:configure]
68 def configure_permission=(perm)
73 users(should_user, should_vhost)[:read]
76 def read_permission=(perm)
81 users(should_user, should_vhost)[:write]
84 def write_permission=(perm)
88 # implement memoization so that we only call set_permissions once
90 unless @permissions_set
91 @permissions_set = true
92 resource[:configure_permission] ||= configure_permission
93 resource[:read_permission] ||= read_permission
94 resource[:write_permission] ||= write_permission
95 rabbitmqctl('set_permissions', '-p', should_vhost, should_user,
96 resource[:configure_permission], resource[:read_permission],
97 resource[:write_permission]