summaryrefslogtreecommitdiff
path: root/lib/puppet/provider/mysql_user/mysql.rb
blob: adc46c3b20e32ed9a7fd7c2f3298186f56cd069e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
require 'puppet/provider/package'

Puppet::Type.type(:mysql_user).provide(:mysql,
		# T'is funny business, this code is quite generic
		:parent => Puppet::Provider::Package) do

	desc "Use mysql as database."
	commands :mysql => '/usr/bin/mysql'
	commands :mysqladmin => '/usr/bin/mysqladmin'

	# retrieve the current set of mysql users
	def self.instances
		users = []

		cmd = "#{command(:mysql)} mysql -NBe 'select concat(user, \"@\", host), password from user'"
		execpipe(cmd) do |process|
			process.each do |line|
				users << new( query_line_to_hash(line) )
			end
		end
		return users
	end

	def self.query_line_to_hash(line)
		fields = line.chomp.split(/\t/)
		{
			:name => fields[0],
			:password_hash => fields[1],
			:ensure => :present
		}
	end

	def mysql_flush 
		mysqladmin "flush-privileges"
	end

	def query
		result = {}

		cmd = "#{command(:mysql)} -NBe 'select concat(user, \"@\", host), password from user where concat(user, \"@\", host) = \"%s\"'" % @resource[:name]
		execpipe(cmd) do |process|
			process.each do |line|
				unless result.empty?
					raise Puppet::Error,
						"Got multiple results for user '%s'" % @resource[:name]
				end
				result = query_line_to_hash(line)
			end
		end
		result
	end

	def create
		mysql "mysql", "-e", "create user '%s' identified by PASSWORD '%s'" % [ @resource[:name].sub("@", "'@'"), @resource.should(:password_hash) ]
		mysql_flush
	end

	def destroy
		mysql "mysql", "-e", "drop user '%s'" % @resource[:name].sub("@", "'@'")
		mysql_flush
	end

	def exists?
		not mysql("mysql", "-NBe", "select '1' from user where CONCAT(user, '@', host) = '%s'" % @resource[:name]).empty?
	end

	def password_hash
		@property_hash[:password_hash]
	end

	def password_hash=(string)
		mysql "mysql", "-e", "SET PASSWORD FOR '%s' = '%s'" % [ @resource[:name].sub("@", "'@'"), string ]
		mysql_flush
	end
end