3 require File.expand_path(File.join(File.dirname(__FILE__), '..', 'rabbitmqctl'))
4 Puppet::Type.type(:rabbitmq_user).provide(:rabbitmqctl, :parent => Puppet::Provider::Rabbitmqctl) do
6 if Puppet::PUPPETVERSION.to_f < 3
7 commands :rabbitmqctl => 'rabbitmqctl'
9 has_command(:rabbitmqctl, 'rabbitmqctl') do
10 environment :HOME => "/tmp"
14 defaultfor :feature => :posix
17 self.run_with_retries {
18 rabbitmqctl('-q', 'list_users')
19 }.split(/\n/).collect do |line|
20 if line =~ /^(\S+)(\s+\[.*?\]|)$/
23 raise Puppet::Error, "Cannot parse invalid user line: #{line}"
29 rabbitmqctl('add_user', resource[:name], resource[:password])
30 if resource[:admin] == :true
33 if ! resource[:tags].empty?
34 set_user_tags(resource[:tags])
39 rabbitmqctl('change_password', resource[:name], resource[:password])
48 response = rabbitmqctl('eval', 'rabbit_access_control:check_user_pass_login(list_to_binary("' + resource[:name] + '"), list_to_binary("' + resource[:password] +'")).')
49 if response.include? 'refused'
57 rabbitmqctl('delete_user', resource[:name])
61 self.class.run_with_retries {
62 rabbitmqctl('-q', 'list_users')
63 }.split(/\n/).detect do |line|
64 line.match(/^#{Regexp.escape(resource[:name])}(\s+(\[.*?\]|\S+)|)$/)
71 # do not expose the administrator tag for admins
72 if resource[:admin] == :true
73 tags.delete('administrator')
86 if usertags = get_user_tags
87 (:true if usertags.include?('administrator')) || :false
89 raise Puppet::Error, "Could not match line '#{resource[:name]} (true|false)' from list_users (perhaps you are running on an older version of rabbitmq that does not support admin users?)"
97 usertags = get_user_tags
98 usertags.delete('administrator')
99 rabbitmqctl('set_user_tags', resource[:name], usertags.entries.sort)
103 def set_user_tags(tags)
104 is_admin = get_user_tags().member?("administrator") \
105 || resource[:admin] == :true
106 usertags = Set.new(tags)
108 usertags.add("administrator")
110 rabbitmqctl('set_user_tags', resource[:name], usertags.entries.sort)
114 usertags = get_user_tags
115 usertags.add('administrator')
116 rabbitmqctl('set_user_tags', resource[:name], usertags.entries.sort)
121 match = rabbitmqctl('-q', 'list_users').split(/\n/).collect do |line|
122 line.match(/^#{Regexp.escape(resource[:name])}\s+\[(.*?)\]/)
124 Set.new(match[1].split(' ').map{|x| x.gsub(/,$/, '')}) if match