Skip to content

Commit bdb4160

Browse files
inkblothunner
authored andcommitted
Use root's credentials when executing mysql.
This is necessary when running puppet as root using sudo because mysql will still look in the user's home directory in that case unless told otherwise.
1 parent c84ffde commit bdb4160

File tree

4 files changed

+46
-37
lines changed

4 files changed

+46
-37
lines changed

lib/puppet/provider/database/mysql.rb

+6-6
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,30 @@
88
optional_commands :mysqladmin => 'mysqladmin'
99

1010
def self.instances
11-
mysql('-NBe', "show databases").split("\n").collect do |name|
11+
mysql("--defaults-file=#{Facter.value(:root_home)}/.my.cnf", '-NBe', "show databases").split("\n").collect do |name|
1212
new(:name => name)
1313
end
1414
end
1515

1616
def create
17-
mysql('-NBe', "create database `#{@resource[:name]}` character set #{resource[:charset]}")
17+
mysql("--defaults-file=#{Facter.value(:root_home)}/.my.cnf", '-NBe', "create database `#{@resource[:name]}` character set #{resource[:charset]}")
1818
end
1919

2020
def destroy
21-
mysqladmin('-f', 'drop', @resource[:name])
21+
mysqladmin("--defaults-file=#{Facter.value(:root_home)}/.my.cnf", '-f', 'drop', @resource[:name])
2222
end
2323

2424
def charset
25-
mysql('-NBe', "show create database `#{resource[:name]}`").match(/.*?(\S+)\s\*\//)[1]
25+
mysql("--defaults-file=#{Facter.value(:root_home)}/.my.cnf", '-NBe', "show create database `#{resource[:name]}`").match(/.*?(\S+)\s\*\//)[1]
2626
end
2727

2828
def charset=(value)
29-
mysql('-NBe', "alter database `#{resource[:name]}` CHARACTER SET #{value}")
29+
mysql("--defaults-file=#{Facter.value(:root_home)}/.my.cnf", '-NBe', "alter database `#{resource[:name]}` CHARACTER SET #{value}")
3030
end
3131

3232
def exists?
3333
begin
34-
mysql('-NBe', "show databases").match(/^#{@resource[:name]}$/)
34+
mysql("--defaults-file=#{Facter.value(:root_home)}/.my.cnf", '-NBe', "show databases").match(/^#{@resource[:name]}$/)
3535
rescue => e
3636
debug(e.message)
3737
return nil

lib/puppet/provider/database_grant/mysql.rb

+10-10
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,19 @@ def db_privs
3434
end
3535

3636
def self.query_user_privs
37-
results = mysql("mysql", "-Be", "describe user")
37+
results = mysql("--defaults-file=#{Facter.value(:root_home)}/.my.cnf", "mysql", "-Be", "describe user")
3838
column_names = results.split(/\n/).map { |l| l.chomp.split(/\t/)[0] }
3939
@user_privs = column_names.delete_if { |e| !( e =~/_priv$/) }
4040
end
4141

4242
def self.query_db_privs
43-
results = mysql("mysql", "-Be", "describe db")
43+
results = mysql("--defaults-file=#{Facter.value(:root_home)}/.my.cnf", "mysql", "-Be", "describe db")
4444
column_names = results.split(/\n/).map { |l| l.chomp.split(/\t/)[0] }
4545
@db_privs = column_names.delete_if { |e| !(e =~/_priv$/) }
4646
end
4747

4848
def mysql_flush
49-
mysqladmin "flush-privileges"
49+
mysqladmin "--defaults-file=#{Facter.value(:root_home)}/.my.cnf", "flush-privileges"
5050
end
5151

5252
# this parses the
@@ -74,11 +74,11 @@ def create_row
7474
name = split_name(@resource[:name])
7575
case name[:type]
7676
when :user
77-
mysql "mysql", "-e", "INSERT INTO user (host, user) VALUES ('%s', '%s')" % [
77+
mysql "--defaults-file=#{Facter.value(:root_home)}/.my.cnf", "mysql", "-e", "INSERT INTO user (host, user) VALUES ('%s', '%s')" % [
7878
name[:host], name[:user],
7979
]
8080
when :db
81-
mysql "mysql", "-e", "INSERT INTO db (host, user, db) VALUES ('%s', '%s', '%s')" % [
81+
mysql "--defaults-file=#{Facter.value(:root_home)}/.my.cnf", "mysql", "-e", "INSERT INTO db (host, user, db) VALUES ('%s', '%s', '%s')" % [
8282
name[:host], name[:user], name[:db],
8383
]
8484
end
@@ -87,7 +87,7 @@ def create_row
8787
end
8888

8989
def destroy
90-
mysql "mysql", "-e", "REVOKE ALL ON '%s'.* FROM '%s@%s'" % [ @resource[:privileges], @resource[:database], @resource[:name], @resource[:host] ]
90+
mysql "--defaults-file=#{Facter.value(:root_home)}/.my.cnf", "-e", "REVOKE ALL ON '%s'.* FROM '%s@%s'" % [ @resource[:privileges], @resource[:database], @resource[:name], @resource[:host] ]
9191
end
9292

9393
def row_exists?
@@ -96,7 +96,7 @@ def row_exists?
9696
if name[:type] == :db
9797
fields << :db
9898
end
99-
not mysql( "mysql", "-NBe", 'SELECT "1" FROM %s WHERE %s' % [ name[:type], fields.map do |f| "%s = '%s'" % [f, name[f]] end.join(' AND ')]).empty?
99+
not mysql("--defaults-file=#{Facter.value(:root_home)}/.my.cnf", 'mysql', '-NBe', 'SELECT "1" FROM %s WHERE %s' % [ name[:type], fields.map do |f| "%s=\"%s\"" % [f, name[f]] end.join(' AND ')]).empty?
100100
end
101101

102102
def all_privs_set?
@@ -118,9 +118,9 @@ def privileges
118118

119119
case name[:type]
120120
when :user
121-
privs = mysql "mysql", "-Be", 'select * from user where user="%s" and host="%s"' % [ name[:user], name[:host] ]
121+
privs = mysql "--defaults-file=#{Facter.value(:root_home)}/.my.cnf", "-Be", 'select * from mysql.user where user="%s" and host="%s"' % [ name[:user], name[:host] ]
122122
when :db
123-
privs = mysql "mysql", "-Be", 'select * from db where user="%s" and host="%s" and db="%s"' % [ name[:user], name[:host], name[:db] ]
123+
privs = mysql "--defaults-file=#{Facter.value(:root_home)}/.my.cnf", "-Be", 'select * from mysql.db where user="%s" and host="%s" and db="%s"' % [ name[:user], name[:host], name[:db] ]
124124
end
125125

126126
if privs.match(/^$/)
@@ -172,7 +172,7 @@ def privileges=(privs)
172172
stmt = stmt << set << where
173173

174174
validate_privs privs, all_privs
175-
mysql "mysql", "-Be", stmt
175+
mysql "--defaults-file=#{Facter.value(:root_home)}/.my.cnf", "mysql", "-Be", stmt
176176
mysql_flush
177177
end
178178

lib/puppet/provider/database_user/mysql.rb

+7-7
Original file line numberDiff line numberDiff line change
@@ -8,35 +8,35 @@
88
optional_commands :mysqladmin => 'mysqladmin'
99

1010
def self.instances
11-
users = mysql("mysql", '-BNe' "select concat(User, '@',Host) as User from mysql.user").split("\n")
11+
users = mysql("--defaults-file=#{Facter.value(:root_home)}/.my.cnf", '-BNe' "select concat(User, '@',Host) as User from mysql.user").split("\n")
1212
users.select{ |user| user =~ /.+@/ }.collect do |name|
1313
new(:name => name)
1414
end
1515
end
1616

1717
def create
18-
mysql("mysql", "-e", "create user '%s' identified by PASSWORD '%s'" % [ @resource[:name].sub("@", "'@'"), @resource.value(:password_hash) ])
18+
mysql("--defaults-file=#{Facter.value(:root_home)}/.my.cnf", "-e", "create user '%s' identified by PASSWORD '%s'" % [ @resource[:name].sub("@", "'@'"), @resource.value(:password_hash) ])
1919
end
2020

2121
def destroy
22-
mysql("mysql", "-e", "drop user '%s'" % @resource.value(:name).sub("@", "'@'") )
22+
mysql("--defaults-file=#{Facter.value(:root_home)}/.my.cnf", "-e", "drop user '%s'" % @resource.value(:name).sub("@", "'@'") )
2323
end
2424

2525
def password_hash
26-
mysql("mysql", "-NBe", "select password from user where CONCAT(user, '@', host) = '%s'" % @resource.value(:name)).chomp
26+
mysql("--defaults-file=#{Facter.value(:root_home)}/.my.cnf", "-NBe", "select password from mysql.user where CONCAT(user, '@', host) = '%s'" % @resource.value(:name)).chomp
2727
end
2828

2929
def password_hash=(string)
30-
mysql("mysql", "-e", "SET PASSWORD FOR '%s' = '%s'" % [ @resource[:name].sub("@", "'@'"), string ] )
30+
mysql("--defaults-file=#{Facter.value(:root_home)}/.my.cnf", "-e", "SET PASSWORD FOR '%s' = '%s'" % [ @resource[:name].sub("@", "'@'"), string ] )
3131
end
3232

3333
def exists?
34-
not mysql("mysql", "-NBe", "select '1' from user where CONCAT(user, '@', host) = '%s'" % @resource.value(:name)).empty?
34+
not mysql("--defaults-file=#{Facter.value(:root_home)}/.my.cnf", "-NBe", "select '1' from mysql.user where CONCAT(user, '@', host) = '%s'" % @resource.value(:name)).empty?
3535
end
3636

3737
def flush
3838
@property_hash.clear
39-
mysqladmin "flush-privileges"
39+
mysqladmin "--defaults-file=#{Facter.value(:root_home)}/.my.cnf", "flush-privileges"
4040
end
4141

4242
end
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
11
require 'puppet'
22
require 'mocha'
3+
require 'spec_helper'
34
RSpec.configure do |config|
45
config.mock_with :mocha
56
end
67
provider_class = Puppet::Type.type(:database_grant).provider(:mysql)
78
describe provider_class do
9+
root_home = '/some/root/home'
10+
#root_home = ''
11+
12+
let :facts do
13+
{ :root_home => root_home }
14+
end
15+
816
before :each do
917
@resource = Puppet::Type::Database_grant.new(
1018
{ :privileges => 'all', :provider => 'mysql', :name => 'user@host'}
1119
)
1220
@provider = provider_class.new(@resource)
1321
end
22+
1423
it 'should query privilegess from the database' do
15-
provider_class.expects(:mysql) .with('mysql', '-Be', 'describe user').returns <<-EOT
24+
provider_class.expects(:mysql) .with("--defaults-file=#{root_home}/.my.cnf", 'mysql', '-Be', 'describe user').returns <<-EOT
1625
Field Type Null Key Default Extra
1726
Host char(60) NO PRI
1827
User char(16) NO PRI
@@ -21,7 +30,7 @@
2130
Insert_priv enum('N','Y') NO N
2231
Update_priv enum('N','Y') NO N
2332
EOT
24-
provider_class.expects(:mysql).with('mysql', '-Be', 'describe db').returns <<-EOT
33+
provider_class.expects(:mysql).with("--defaults-file=#{root_home}/.my.cnf", 'mysql', '-Be', 'describe db').returns <<-EOT
2534
Field Type Null Key Default Extra
2635
Host char(60) NO PRI
2736
Db char(64) NO PRI
@@ -35,47 +44,47 @@
3544
end
3645

3746
it 'should query set priviliges' do
38-
provider_class.expects(:mysql).with('mysql', '-Be', 'select * from user where user="user" and host="host"').returns <<-EOT
47+
provider_class.expects(:mysql).with("--defaults-file=#{root_home}/.my.cnf", '-Be', 'select * from mysql.user where user="user" and host="host"').returns <<-EOT
3948
Host User Password Select_priv Insert_priv Update_priv
4049
host user Y N Y
4150
EOT
4251
@provider.privileges.should == [ 'Select_priv', 'Update_priv' ]
4352
end
4453

4554
it 'should recognize when all priviliges are set' do
46-
provider_class.expects(:mysql).with('mysql', '-Be', 'select * from user where user="user" and host="host"').returns <<-EOT
55+
provider_class.expects(:mysql).with("--defaults-file=#{root_home}/.my.cnf", '-Be', 'select * from mysql.user where user="user" and host="host"').returns <<-EOT
4756
Host User Password Select_priv Insert_priv Update_priv
4857
host user Y Y Y
4958
EOT
5059
@provider.all_privs_set?.should == true
5160
end
5261

5362
it 'should recognize when all privileges are not set' do
54-
provider_class.expects(:mysql).with('mysql', '-Be', 'select * from user where user="user" and host="host"').returns <<-EOT
63+
provider_class.expects(:mysql).with("--defaults-file=#{root_home}/.my.cnf", '-Be', 'select * from mysql.user where user="user" and host="host"').returns <<-EOT
5564
Host User Password Select_priv Insert_priv Update_priv
5665
host user Y N Y
5766
EOT
5867
@provider.all_privs_set?.should == false
5968
end
6069

6170
it 'should be able to set all privileges' do
62-
provider_class.expects(:mysql).with('mysql', '-NBe', 'SELECT "1" FROM user WHERE user = \'user\' AND host = \'host\'').returns "1\n"
63-
provider_class.expects(:mysql).with('mysql', '-Be', "update user set Select_priv = 'Y', Insert_priv = 'Y', Update_priv = 'Y' where user=\"user\" and host=\"host\"")
64-
provider_class.expects(:mysqladmin).with("flush-privileges")
71+
provider_class.expects(:mysql).with("--defaults-file=#{root_home}/.my.cnf", 'mysql', '-NBe', 'SELECT "1" FROM user WHERE user="user" AND host="host"').returns "1\n"
72+
provider_class.expects(:mysql).with("--defaults-file=#{root_home}/.my.cnf", 'mysql', '-Be', "update user set Select_priv = 'Y', Insert_priv = 'Y', Update_priv = 'Y' where user=\"user\" and host=\"host\"")
73+
provider_class.expects(:mysqladmin).with("--defaults-file=#{root_home}/.my.cnf", "flush-privileges")
6574
@provider.privileges=(['all'])
6675
end
6776

6877
it 'should be able to set partial privileges' do
69-
provider_class.expects(:mysql).with('mysql', '-NBe', 'SELECT "1" FROM user WHERE user = \'user\' AND host = \'host\'').returns "1\n"
70-
provider_class.expects(:mysql).with('mysql', '-Be', "update user set Select_priv = 'Y', Insert_priv = 'N', Update_priv = 'Y' where user=\"user\" and host=\"host\"")
71-
provider_class.expects(:mysqladmin).with("flush-privileges")
78+
provider_class.expects(:mysql).with("--defaults-file=#{root_home}/.my.cnf", 'mysql', '-NBe', 'SELECT "1" FROM user WHERE user="user" AND host="host"').returns "1\n"
79+
provider_class.expects(:mysql).with("--defaults-file=#{root_home}/.my.cnf", 'mysql', '-Be', "update user set Select_priv = 'Y', Insert_priv = 'N', Update_priv = 'Y' where user=\"user\" and host=\"host\"")
80+
provider_class.expects(:mysqladmin).with("--defaults-file=#{root_home}/.my.cnf", "flush-privileges")
7281
@provider.privileges=(['Select_priv', 'Update_priv'])
7382
end
7483

7584
it 'should be case insensitive' do
76-
provider_class.expects(:mysql).with('mysql', '-NBe', 'SELECT "1" FROM user WHERE user = \'user\' AND host = \'host\'').returns "1\n"
77-
provider_class.expects(:mysql).with('mysql', '-Be', "update user set Select_priv = 'Y', Insert_priv = 'Y', Update_priv = 'Y' where user=\"user\" and host=\"host\"")
78-
provider_class.expects(:mysqladmin).with('flush-privileges')
85+
provider_class.expects(:mysql).with("--defaults-file=#{root_home}/.my.cnf", 'mysql', '-NBe', 'SELECT "1" FROM user WHERE user="user" AND host="host"').returns "1\n"
86+
provider_class.expects(:mysql).with("--defaults-file=#{root_home}/.my.cnf", 'mysql', '-Be', "update user set Select_priv = 'Y', Insert_priv = 'Y', Update_priv = 'Y' where user=\"user\" and host=\"host\"")
87+
provider_class.expects(:mysqladmin).with("--defaults-file=#{root_home}/.my.cnf", 'flush-privileges')
7988
@provider.privileges=(['SELECT_PRIV', 'insert_priv', 'UpDaTe_pRiV'])
8089
end
8190
end

0 commit comments

Comments
 (0)