]> git.donarmstrong.com Git - dsa-puppet.git/blob - 3rdparty/modules/rabbitmq/lib/puppet/provider/rabbitmq_user/rabbitmqctl.rb
move to puppetlabs rabbitmq module
[dsa-puppet.git] / 3rdparty / modules / rabbitmq / lib / puppet / provider / rabbitmq_user / rabbitmqctl.rb
1 require 'puppet'
2 require 'set'
3 require File.expand_path(File.join(File.dirname(__FILE__), '..', 'rabbitmqctl'))
4 Puppet::Type.type(:rabbitmq_user).provide(:rabbitmqctl, :parent => Puppet::Provider::Rabbitmqctl) do
5
6   if Puppet::PUPPETVERSION.to_f < 3
7     commands :rabbitmqctl => 'rabbitmqctl'
8   else
9      has_command(:rabbitmqctl, 'rabbitmqctl') do
10        environment :HOME => "/tmp"
11      end
12   end
13
14   defaultfor :feature => :posix
15
16   def self.instances
17     self.run_with_retries {
18       rabbitmqctl('-q', 'list_users')
19     }.split(/\n/).collect do |line|
20       if line =~ /^(\S+)(\s+\[.*?\]|)$/
21         new(:name => $1)
22       else
23         raise Puppet::Error, "Cannot parse invalid user line: #{line}"
24       end
25     end
26   end
27
28   def create
29     rabbitmqctl('add_user', resource[:name], resource[:password])
30     if resource[:admin] == :true
31       make_user_admin()
32     end
33     if ! resource[:tags].empty?
34       set_user_tags(resource[:tags])
35     end
36   end
37
38   def change_password
39     rabbitmqctl('change_password', resource[:name], resource[:password])
40   end
41
42   def password
43     nil
44   end
45
46
47   def check_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'
50         false
51     else
52         true
53     end
54   end
55
56   def destroy
57     rabbitmqctl('delete_user', resource[:name])
58   end
59
60   def exists?
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+)|)$/)
65     end
66   end
67
68
69   def tags
70     tags = get_user_tags
71     # do not expose the administrator tag for admins
72     if resource[:admin] == :true
73       tags.delete('administrator')
74     end
75     tags.entries.sort
76   end
77
78
79   def tags=(tags)
80     if ! tags.nil?
81       set_user_tags(tags)
82     end
83   end
84
85   def admin
86     if usertags = get_user_tags
87       (:true if usertags.include?('administrator')) || :false
88     else
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?)"
90     end
91   end
92
93   def admin=(state)
94     if state == :true
95       make_user_admin()
96     else
97       usertags = get_user_tags
98       usertags.delete('administrator')
99       rabbitmqctl('set_user_tags', resource[:name], usertags.entries.sort)
100     end
101   end
102
103   def set_user_tags(tags)
104     is_admin = get_user_tags().member?("administrator") \
105                || resource[:admin] == :true
106     usertags = Set.new(tags)
107     if is_admin
108       usertags.add("administrator")
109     end
110     rabbitmqctl('set_user_tags', resource[:name], usertags.entries.sort)
111   end
112
113   def make_user_admin
114     usertags = get_user_tags
115     usertags.add('administrator')
116     rabbitmqctl('set_user_tags', resource[:name], usertags.entries.sort)
117   end
118
119   private
120   def get_user_tags
121     match = rabbitmqctl('-q', 'list_users').split(/\n/).collect do |line|
122       line.match(/^#{Regexp.escape(resource[:name])}\s+\[(.*?)\]/)
123     end.compact.first
124     Set.new(match[1].split(' ').map{|x| x.gsub(/,$/, '')}) if match
125   end
126 end