Skip to content

Commit 3e3cd55

Browse files
committed
Merge pull request #830 from fvanboven/module-2111-replication
(MODULES-2111) Add the system database to user related actions.
2 parents 13a8d80 + b8d3015 commit 3e3cd55

File tree

4 files changed

+35
-25
lines changed

4 files changed

+35
-25
lines changed

lib/puppet/provider/mysql.rb

+9
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,15 @@ def self.users
6060
mysql([defaults_file, '-NBe', "SELECT CONCAT(User, '@',Host) AS User FROM mysql.user"].compact).split("\n")
6161
end
6262

63+
# Optional parameter to run a statement on the MySQL system database.
64+
def self.system_database
65+
'--database=mysql'
66+
end
67+
68+
def system_database
69+
self.class.system_database
70+
end
71+
6372
# Take root@localhost and munge it to 'root'@'localhost'
6473
def self.cmd_user(user)
6574
"'#{user.sub('@', "'@'")}'"

lib/puppet/provider/mysql_grant/mysql.rb

+3-3
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def grant(user, table, privileges, options)
8181
query << " ON #{table_string}"
8282
query << " TO #{user_string}"
8383
query << self.class.cmd_options(options) unless options.nil?
84-
mysql([defaults_file, '-e', query].compact)
84+
mysql([defaults_file, system_database, '-e', query].compact)
8585
end
8686

8787
def create
@@ -107,10 +107,10 @@ def revoke(user, table, revoke_privileges = ['ALL'])
107107
# exist to be executed successfully
108108
if revoke_privileges.include? 'ALL'
109109
query = "REVOKE GRANT OPTION ON #{table_string} FROM #{user_string}"
110-
mysql([defaults_file, '-e', query].compact)
110+
mysql([defaults_file, system_database, '-e', query].compact)
111111
end
112112
query = "REVOKE #{priv_string} ON #{table_string} FROM #{user_string}"
113-
mysql([defaults_file, '-e', query].compact)
113+
mysql([defaults_file, system_database, '-e', query].compact)
114114
end
115115

116116
def destroy

lib/puppet/provider/mysql_user/mysql.rb

+12-12
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,18 @@ def create
6161
# This is also required if you want to specify a authentication plugin
6262
if !plugin.nil?
6363
if plugin == 'sha256_password' and !password_hash.nil?
64-
mysql([defaults_file, '-e', "CREATE USER '#{merged_name}' IDENTIFIED WITH '#{plugin}' AS '#{password_hash}'"].compact)
64+
mysql([defaults_file, system_database, '-e', "CREATE USER '#{merged_name}' IDENTIFIED WITH '#{plugin}' AS '#{password_hash}'"].compact)
6565
else
66-
mysql([defaults_file, '-e', "CREATE USER '#{merged_name}' IDENTIFIED WITH '#{plugin}'"].compact)
66+
mysql([defaults_file, system_database, '-e', "CREATE USER '#{merged_name}' IDENTIFIED WITH '#{plugin}'"].compact)
6767
end
6868
@property_hash[:ensure] = :present
6969
@property_hash[:plugin] = plugin
7070
else
71-
mysql([defaults_file, '-e', "CREATE USER '#{merged_name}' IDENTIFIED BY PASSWORD '#{password_hash}'"].compact)
71+
mysql([defaults_file, system_database, '-e', "CREATE USER '#{merged_name}' IDENTIFIED BY PASSWORD '#{password_hash}'"].compact)
7272
@property_hash[:ensure] = :present
7373
@property_hash[:password_hash] = password_hash
7474
end
75-
mysql([defaults_file, '-e', "GRANT USAGE ON *.* TO '#{merged_name}' WITH MAX_USER_CONNECTIONS #{max_user_connections} MAX_CONNECTIONS_PER_HOUR #{max_connections_per_hour} MAX_QUERIES_PER_HOUR #{max_queries_per_hour} MAX_UPDATES_PER_HOUR #{max_updates_per_hour}"].compact)
75+
mysql([defaults_file, system_database, '-e', "GRANT USAGE ON *.* TO '#{merged_name}' WITH MAX_USER_CONNECTIONS #{max_user_connections} MAX_CONNECTIONS_PER_HOUR #{max_connections_per_hour} MAX_QUERIES_PER_HOUR #{max_queries_per_hour} MAX_UPDATES_PER_HOUR #{max_updates_per_hour}"].compact)
7676
@property_hash[:max_user_connections] = max_user_connections
7777
@property_hash[:max_connections_per_hour] = max_connections_per_hour
7878
@property_hash[:max_queries_per_hour] = max_queries_per_hour
@@ -83,7 +83,7 @@ def create
8383

8484
def destroy
8585
merged_name = @resource[:name].sub('@', "'@'")
86-
mysql([defaults_file, '-e', "DROP USER '#{merged_name}'"].compact)
86+
mysql([defaults_file, system_database, '-e', "DROP USER '#{merged_name}'"].compact)
8787

8888
@property_hash.clear
8989
exists? ? (return false) : (return true)
@@ -106,18 +106,18 @@ def password_hash=(string)
106106
# We have a fact for the mysql version ...
107107
if mysqld_version.nil?
108108
# default ... if mysqld_version does not work
109-
mysql([defaults_file, '-e', "SET PASSWORD FOR #{merged_name} = '#{string}'"].compact)
109+
mysql([defaults_file, system_database, '-e', "SET PASSWORD FOR #{merged_name} = '#{string}'"].compact)
110110
else
111111
# Version >= 5.7.6 (many password related changes)
112112
if (mysqld_type == "mysql" or mysqld_type == "percona") and Puppet::Util::Package.versioncmp(mysqld_version, '5.7.6') >= 0
113113
if string.match(/^\*/)
114-
mysql([defaults_file, '-e', "ALTER USER #{merged_name} IDENTIFIED WITH mysql_native_password AS '#{string}'"].compact)
114+
mysql([defaults_file, system_database, '-e', "ALTER USER #{merged_name} IDENTIFIED WITH mysql_native_password AS '#{string}'"].compact)
115115
else
116116
raise ArgumentError, "Only mysql_native_password (*ABCD...XXX) hashes are supported"
117117
end
118118
else
119119
# older versions
120-
mysql([defaults_file, '-e', "SET PASSWORD FOR #{merged_name} = '#{string}'"].compact)
120+
mysql([defaults_file, system_database, '-e', "SET PASSWORD FOR #{merged_name} = '#{string}'"].compact)
121121
end
122122
end
123123

@@ -126,28 +126,28 @@ def password_hash=(string)
126126

127127
def max_user_connections=(int)
128128
merged_name = self.class.cmd_user(@resource[:name])
129-
mysql([defaults_file, '-e', "GRANT USAGE ON *.* TO #{merged_name} WITH MAX_USER_CONNECTIONS #{int}"].compact).chomp
129+
mysql([defaults_file, system_database, '-e', "GRANT USAGE ON *.* TO #{merged_name} WITH MAX_USER_CONNECTIONS #{int}"].compact).chomp
130130

131131
max_user_connections == int ? (return true) : (return false)
132132
end
133133

134134
def max_connections_per_hour=(int)
135135
merged_name = self.class.cmd_user(@resource[:name])
136-
mysql([defaults_file, '-e', "GRANT USAGE ON *.* TO #{merged_name} WITH MAX_CONNECTIONS_PER_HOUR #{int}"].compact).chomp
136+
mysql([defaults_file, system_database, '-e', "GRANT USAGE ON *.* TO #{merged_name} WITH MAX_CONNECTIONS_PER_HOUR #{int}"].compact).chomp
137137

138138
max_connections_per_hour == int ? (return true) : (return false)
139139
end
140140

141141
def max_queries_per_hour=(int)
142142
merged_name = self.class.cmd_user(@resource[:name])
143-
mysql([defaults_file, '-e', "GRANT USAGE ON *.* TO #{merged_name} WITH MAX_QUERIES_PER_HOUR #{int}"].compact).chomp
143+
mysql([defaults_file, system_database, '-e', "GRANT USAGE ON *.* TO #{merged_name} WITH MAX_QUERIES_PER_HOUR #{int}"].compact).chomp
144144

145145
max_queries_per_hour == int ? (return true) : (return false)
146146
end
147147

148148
def max_updates_per_hour=(int)
149149
merged_name = self.class.cmd_user(@resource[:name])
150-
mysql([defaults_file, '-e', "GRANT USAGE ON *.* TO #{merged_name} WITH MAX_UPDATES_PER_HOUR #{int}"].compact).chomp
150+
mysql([defaults_file, system_database, '-e', "GRANT USAGE ON *.* TO #{merged_name} WITH MAX_UPDATES_PER_HOUR #{int}"].compact).chomp
151151

152152
max_updates_per_hour == int ? (return true) : (return false)
153153
end

spec/unit/puppet/provider/mysql_user/mysql_spec.rb

+11-10
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
}
5050

5151
let(:defaults_file) { '--defaults-extra-file=/root/.my.cnf' }
52+
let(:system_database) { '--database=mysql' }
5253
let(:newhash) { '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5' }
5354

5455
let(:raw_users) do
@@ -177,16 +178,16 @@
177178

178179
describe 'create' do
179180
it 'makes a user' do
180-
provider.expects(:mysql).with([defaults_file, '-e', "CREATE USER 'joe'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4'"])
181-
provider.expects(:mysql).with([defaults_file, '-e', "GRANT USAGE ON *.* TO 'joe'@'localhost' WITH MAX_USER_CONNECTIONS 10 MAX_CONNECTIONS_PER_HOUR 10 MAX_QUERIES_PER_HOUR 10 MAX_UPDATES_PER_HOUR 10"])
181+
provider.expects(:mysql).with([defaults_file, system_database, '-e', "CREATE USER 'joe'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4'"])
182+
provider.expects(:mysql).with([defaults_file, system_database, '-e', "GRANT USAGE ON *.* TO 'joe'@'localhost' WITH MAX_USER_CONNECTIONS 10 MAX_CONNECTIONS_PER_HOUR 10 MAX_QUERIES_PER_HOUR 10 MAX_UPDATES_PER_HOUR 10"])
182183
provider.expects(:exists?).returns(true)
183184
expect(provider.create).to be_truthy
184185
end
185186
end
186187

187188
describe 'destroy' do
188189
it 'removes a user if present' do
189-
provider.expects(:mysql).with([defaults_file, '-e', "DROP USER 'joe'@'localhost'"])
190+
provider.expects(:mysql).with([defaults_file, system_database, '-e', "DROP USER 'joe'@'localhost'"])
190191
provider.expects(:exists?).returns(false)
191192
expect(provider.destroy).to be_truthy
192193
end
@@ -242,42 +243,42 @@
242243
describe 'password_hash=' do
243244
it 'changes the hash mysql 5.5' do
244245
provider.class.instance_variable_set(:@mysqld_version_string, mysql_version_string_hash['mysql-5.5'][:string])
245-
provider.expects(:mysql).with([defaults_file, '-e', "SET PASSWORD FOR 'joe'@'localhost' = '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5'"]).returns('0')
246+
provider.expects(:mysql).with([defaults_file, system_database, '-e', "SET PASSWORD FOR 'joe'@'localhost' = '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5'"]).returns('0')
246247

247248
provider.expects(:password_hash).returns('*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5')
248249
provider.password_hash=('*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5')
249250
end
250251
it 'changes the hash mysql 5.6' do
251252
provider.class.instance_variable_set(:@mysqld_version_string, mysql_version_string_hash['mysql-5.6'][:string])
252-
provider.expects(:mysql).with([defaults_file, '-e', "SET PASSWORD FOR 'joe'@'localhost' = '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5'"]).returns('0')
253+
provider.expects(:mysql).with([defaults_file, system_database, '-e', "SET PASSWORD FOR 'joe'@'localhost' = '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5'"]).returns('0')
253254

254255
provider.expects(:password_hash).returns('*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5')
255256
provider.password_hash=('*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5')
256257
end
257258
it 'changes the hash mysql < 5.7.6' do
258259
provider.class.instance_variable_set(:@mysqld_version_string, mysql_version_string_hash['mysql-5.7.1'][:string])
259-
provider.expects(:mysql).with([defaults_file, '-e', "SET PASSWORD FOR 'joe'@'localhost' = '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5'"]).returns('0')
260+
provider.expects(:mysql).with([defaults_file, system_database, '-e', "SET PASSWORD FOR 'joe'@'localhost' = '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5'"]).returns('0')
260261

261262
provider.expects(:password_hash).returns('*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5')
262263
provider.password_hash=('*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5')
263264
end
264265
it 'changes the hash MySQL >= 5.7.6' do
265266
provider.class.instance_variable_set(:@mysqld_version_string, mysql_version_string_hash['mysql-5.7.6'][:string])
266-
provider.expects(:mysql).with([defaults_file, '-e', "ALTER USER 'joe'@'localhost' IDENTIFIED WITH mysql_native_password AS '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5'"]).returns('0')
267+
provider.expects(:mysql).with([defaults_file, system_database, '-e', "ALTER USER 'joe'@'localhost' IDENTIFIED WITH mysql_native_password AS '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5'"]).returns('0')
267268

268269
provider.expects(:password_hash).returns('*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5')
269270
provider.password_hash=('*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5')
270271
end
271272
it 'changes the hash mariadb-10.0' do
272273
provider.class.instance_variable_set(:@mysqld_version_string, mysql_version_string_hash['mariadb-10.0'][:string])
273-
provider.expects(:mysql).with([defaults_file, '-e', "SET PASSWORD FOR 'joe'@'localhost' = '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5'"]).returns('0')
274+
provider.expects(:mysql).with([defaults_file, system_database, '-e', "SET PASSWORD FOR 'joe'@'localhost' = '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5'"]).returns('0')
274275

275276
provider.expects(:password_hash).returns('*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5')
276277
provider.password_hash=('*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5')
277278
end
278279
it 'changes the hash percona-5.5' do
279280
provider.class.instance_variable_set(:@mysqld_version_string, mysql_version_string_hash['percona-5.5'][:string])
280-
provider.expects(:mysql).with([defaults_file, '-e', "SET PASSWORD FOR 'joe'@'localhost' = '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5'"]).returns('0')
281+
provider.expects(:mysql).with([defaults_file, system_database, '-e', "SET PASSWORD FOR 'joe'@'localhost' = '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5'"]).returns('0')
281282

282283
provider.expects(:password_hash).returns('*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5')
283284
provider.password_hash=('*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF5')
@@ -295,7 +296,7 @@
295296

296297
describe "#{property}=" do
297298
it "changes #{property}" do
298-
provider.expects(:mysql).with([defaults_file, '-e', "GRANT USAGE ON *.* TO 'joe'@'localhost' WITH #{property.upcase} 42"]).returns('0')
299+
provider.expects(:mysql).with([defaults_file, system_database, '-e', "GRANT USAGE ON *.* TO 'joe'@'localhost' WITH #{property.upcase} 42"]).returns('0')
299300
provider.expects(property.to_sym).returns('42')
300301
provider.send("#{property}=".to_sym, '42')
301302
end

0 commit comments

Comments
 (0)