freighthop 0.0.6 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Puppetfile +1 -0
- data/Puppetfile.lock +3 -0
- data/Vagrantfile +1 -1
- data/bin/fh +2 -78
- data/lib/freighthop/cli/help.rb +69 -0
- data/lib/freighthop/cli/ssh.rb +46 -0
- data/lib/freighthop/cli/vagrant.rb +26 -0
- data/lib/freighthop/cli.rb +40 -0
- data/lib/freighthop/config.rb +4 -0
- data/lib/freighthop/vagrant_env.rb +24 -0
- data/lib/freighthop/version.rb +1 -1
- data/lib/freighthop.rb +7 -4
- data/local_modules/freighthop/manifests/database/mysql.pp +20 -0
- data/local_modules/freighthop/manifests/database/postgres.pp +6 -6
- data/local_modules/freighthop/manifests/database.pp +6 -8
- data/local_modules/freighthop/manifests/init.pp +1 -8
- data/local_modules/freighthop/manifests/params.pp +0 -3
- data/modules/apt/CHANGELOG +12 -2
- data/modules/apt/Gemfile +6 -5
- data/modules/apt/Gemfile.lock +40 -5
- data/modules/apt/Modulefile +1 -1
- data/modules/apt/README.md +2 -1
- data/modules/apt/Rakefile +1 -0
- data/modules/apt/manifests/init.pp +4 -1
- data/modules/apt/manifests/ppa.pp +1 -1
- data/modules/apt/manifests/update.pp +1 -0
- data/modules/apt/metadata.json +21 -13
- data/modules/apt/spec/defines/ppa_spec.rb +3 -3
- data/modules/apt/spec/defines/source_spec.rb +2 -2
- data/modules/apt/spec/spec_helper_system.rb +30 -0
- data/modules/apt/spec/system/apt_builddep_spec.rb +38 -0
- data/modules/apt/spec/system/apt_key_spec.rb +53 -0
- data/modules/apt/spec/system/apt_ppa_spec.rb +59 -0
- data/modules/apt/spec/system/apt_source_spec.rb +51 -0
- data/modules/apt/spec/system/basic_spec.rb +10 -0
- data/modules/apt/spec/system/class_spec.rb +20 -0
- data/modules/apt/templates/source.list.erb +2 -2
- data/modules/freighthop/manifests/database/mysql.pp +20 -0
- data/modules/freighthop/manifests/database/postgres.pp +6 -6
- data/modules/freighthop/manifests/database.pp +6 -8
- data/modules/freighthop/manifests/init.pp +1 -8
- data/modules/freighthop/manifests/params.pp +0 -3
- data/modules/mysql/CHANGELOG +403 -0
- data/modules/mysql/Gemfile +24 -0
- data/modules/mysql/Gemfile.lock +129 -0
- data/modules/mysql/LICENSE +201 -0
- data/modules/mysql/Modulefile +9 -0
- data/modules/mysql/README.md +492 -0
- data/modules/mysql/Rakefile +2 -0
- data/modules/mysql/TODO +8 -0
- data/modules/mysql/files/mysqltuner.pl +966 -0
- data/modules/mysql/lib/puppet/parser/functions/mysql_deepmerge.rb +52 -0
- data/modules/mysql/lib/puppet/parser/functions/mysql_password.rb +15 -0
- data/modules/mysql/lib/puppet/parser/functions/mysql_strip_hash.rb +21 -0
- data/modules/mysql/lib/puppet/provider/database/mysql.rb +52 -0
- data/modules/mysql/lib/puppet/provider/database_grant/mysql.rb +210 -0
- data/modules/mysql/lib/puppet/provider/database_user/mysql.rb +76 -0
- data/modules/mysql/lib/puppet/provider/mysql.rb +67 -0
- data/modules/mysql/lib/puppet/provider/mysql_database/mysql.rb +68 -0
- data/modules/mysql/lib/puppet/provider/mysql_grant/mysql.rb +115 -0
- data/modules/mysql/lib/puppet/provider/mysql_user/mysql.rb +115 -0
- data/modules/mysql/lib/puppet/type/database.rb +21 -0
- data/modules/mysql/lib/puppet/type/database_grant.rb +79 -0
- data/modules/mysql/lib/puppet/type/database_user.rb +31 -0
- data/modules/mysql/lib/puppet/type/mysql_database.rb +22 -0
- data/modules/mysql/lib/puppet/type/mysql_grant.rb +72 -0
- data/modules/mysql/lib/puppet/type/mysql_user.rb +45 -0
- data/modules/mysql/manifests/backup.pp +31 -0
- data/modules/mysql/manifests/bindings/java.pp +10 -0
- data/modules/mysql/manifests/bindings/perl.pp +10 -0
- data/modules/mysql/manifests/bindings/php.pp +10 -0
- data/modules/mysql/manifests/bindings/python.pp +10 -0
- data/modules/mysql/manifests/bindings/ruby.pp +10 -0
- data/modules/mysql/manifests/bindings.pp +33 -0
- data/modules/mysql/manifests/client/install.pp +8 -0
- data/modules/mysql/manifests/client.pp +27 -0
- data/modules/mysql/manifests/db.pp +59 -0
- data/modules/mysql/manifests/init.pp +100 -0
- data/modules/mysql/manifests/params.pp +230 -0
- data/modules/mysql/manifests/server/account_security.pp +22 -0
- data/modules/mysql/manifests/server/backup.pp +56 -0
- data/modules/mysql/manifests/server/config.pp +31 -0
- data/modules/mysql/manifests/server/install.pp +9 -0
- data/modules/mysql/manifests/server/monitor.pp +24 -0
- data/modules/mysql/manifests/server/mysqltuner.pp +9 -0
- data/modules/mysql/manifests/server/providers.pp +8 -0
- data/modules/mysql/manifests/server/root_password.pp +21 -0
- data/modules/mysql/manifests/server/service.pp +19 -0
- data/modules/mysql/manifests/server.pp +69 -0
- data/modules/mysql/metadata.json +289 -0
- data/modules/mysql/spec/classes/mysql_bindings_spec.rb +58 -0
- data/modules/mysql/spec/classes/mysql_client_spec.rb +16 -0
- data/modules/mysql/spec/classes/mysql_server_account_security_spec.rb +41 -0
- data/modules/mysql/spec/classes/mysql_server_backup_spec.rb +112 -0
- data/modules/mysql/spec/classes/mysql_server_monitor_spec.rb +31 -0
- data/modules/mysql/spec/classes/mysql_server_mysqltuner_spec.rb +5 -0
- data/modules/mysql/spec/classes/mysql_server_spec.rb +162 -0
- data/modules/mysql/spec/defines/mysql_db_spec.rb +51 -0
- data/modules/mysql/spec/spec.opts +6 -0
- data/modules/mysql/spec/spec_helper.rb +5 -0
- data/modules/mysql/spec/spec_helper_system.rb +28 -0
- data/modules/mysql/spec/system/mysql_account_delete_spec.rb +35 -0
- data/modules/mysql/spec/system/mysql_backup_spec.rb +77 -0
- data/modules/mysql/spec/system/mysql_bindings_spec.rb +90 -0
- data/modules/mysql/spec/system/mysql_db_spec.rb +61 -0
- data/modules/mysql/spec/system/mysql_server_monitor_spec.rb +30 -0
- data/modules/mysql/spec/system/mysql_server_root_password_spec.rb +71 -0
- data/modules/mysql/spec/system/mysql_server_spec.rb +85 -0
- data/modules/mysql/spec/system/types/mysql_grant_spec.rb +314 -0
- data/modules/mysql/spec/system/types/mysql_user_spec.rb +35 -0
- data/modules/mysql/spec/unit/mysql_password_spec.rb +27 -0
- data/modules/mysql/spec/unit/puppet/functions/mysql_deepmerge_spec.rb +77 -0
- data/modules/mysql/spec/unit/puppet/provider/database/mysql_spec.rb +86 -0
- data/modules/mysql/spec/unit/puppet/provider/database_grant/mysql_spec.rb +95 -0
- data/modules/mysql/spec/unit/puppet/provider/database_user/mysql_spec.rb +119 -0
- data/modules/mysql/spec/unit/puppet/provider/mysql_database/mysql_spec.rb +118 -0
- data/modules/mysql/spec/unit/puppet/provider/mysql_user/mysql_spec.rb +130 -0
- data/modules/mysql/spec/unit/puppet/type/mysql_database_spec.rb +29 -0
- data/modules/mysql/spec/unit/puppet/type/mysql_user_spec.rb +30 -0
- data/modules/mysql/templates/my.cnf.erb +17 -0
- data/modules/mysql/templates/my.cnf.pass.erb +7 -0
- data/modules/mysql/templates/my.conf.cnf.erb +17 -0
- data/modules/mysql/templates/mysqlbackup.sh.erb +57 -0
- data/modules/mysql/tests/backup.pp +8 -0
- data/modules/mysql/tests/bindings.pp +3 -0
- data/modules/mysql/tests/init.pp +1 -0
- data/modules/mysql/tests/java.pp +1 -0
- data/modules/mysql/tests/mysql_database.pp +12 -0
- data/modules/mysql/tests/mysql_grant.pp +5 -0
- data/modules/mysql/tests/mysql_user.pp +23 -0
- data/modules/mysql/tests/perl.pp +1 -0
- data/modules/mysql/tests/python.pp +1 -0
- data/modules/mysql/tests/ruby.pp +1 -0
- data/modules/mysql/tests/server/account_security.pp +4 -0
- data/modules/mysql/tests/server/config.pp +11 -0
- data/modules/mysql/tests/server.pp +3 -0
- data/modules/postgresql/Changelog +191 -0
- data/modules/postgresql/Gemfile +1 -0
- data/modules/postgresql/Gemfile.lock +9 -0
- data/modules/postgresql/LICENSE +198 -12
- data/modules/postgresql/Modulefile +2 -2
- data/modules/postgresql/NOTICE +14 -0
- data/modules/postgresql/README.md +435 -184
- data/modules/postgresql/files/validate_postgresql_connection.sh +31 -0
- data/modules/postgresql/lib/puppet/provider/postgresql_conf/parsed.rb +37 -0
- data/modules/postgresql/lib/puppet/provider/postgresql_psql/ruby.rb +4 -0
- data/modules/postgresql/lib/puppet/type/postgresql_conf.rb +31 -0
- data/modules/postgresql/lib/puppet/type/postgresql_psql.rb +4 -0
- data/modules/postgresql/manifests/client.pp +17 -16
- data/modules/postgresql/manifests/globals.pp +95 -0
- data/modules/postgresql/manifests/lib/devel.pp +15 -0
- data/modules/postgresql/manifests/lib/java.pp +15 -0
- data/modules/postgresql/manifests/lib/python.pp +13 -0
- data/modules/postgresql/manifests/params.pp +127 -222
- data/modules/postgresql/manifests/repo/apt_postgresql_org.pp +30 -0
- data/modules/postgresql/manifests/repo/yum_postgresql_org.pp +38 -0
- data/modules/postgresql/manifests/repo.pp +22 -0
- data/modules/postgresql/manifests/server/config.pp +113 -0
- data/modules/postgresql/manifests/server/config_entry.pp +43 -0
- data/modules/postgresql/manifests/server/contrib.pp +27 -0
- data/modules/postgresql/manifests/server/database.pp +75 -0
- data/modules/postgresql/manifests/server/database_grant.pp +18 -0
- data/modules/postgresql/manifests/server/db.pp +36 -0
- data/modules/postgresql/manifests/server/firewall.pp +21 -0
- data/modules/postgresql/manifests/server/grant.pp +81 -0
- data/modules/postgresql/manifests/server/initdb.pp +52 -0
- data/modules/postgresql/manifests/server/install.pp +49 -0
- data/modules/postgresql/manifests/server/passwd.pp +34 -0
- data/modules/postgresql/manifests/server/pg_hba_rule.pp +54 -0
- data/modules/postgresql/manifests/server/plperl.pp +27 -0
- data/modules/postgresql/manifests/server/reload.pp +15 -0
- data/modules/postgresql/manifests/{role.pp → server/role.pp} +19 -33
- data/modules/postgresql/manifests/server/service.pp +40 -0
- data/modules/postgresql/manifests/{table_grant.pp → server/table_grant.pp} +4 -4
- data/modules/postgresql/manifests/server/tablespace.pp +42 -0
- data/modules/postgresql/manifests/server.pp +61 -83
- data/modules/postgresql/manifests/validate_db_connection.pp +49 -50
- data/modules/postgresql/metadata.json +123 -73
- data/modules/postgresql/spec/spec_helper_system.rb +13 -1
- data/modules/postgresql/spec/system/client_spec.rb +22 -0
- data/modules/postgresql/spec/system/common_patterns_spec.rb +53 -0
- data/modules/postgresql/spec/system/contrib_spec.rb +33 -0
- data/modules/postgresql/spec/system/lib/devel_spec.rb +22 -0
- data/modules/postgresql/spec/system/lib/java_spec.rb +25 -0
- data/modules/postgresql/spec/system/lib/python_spec.rb +24 -0
- data/modules/postgresql/spec/system/postgresql_psql_spec.rb +51 -0
- data/modules/postgresql/spec/system/server/config_entry_spec.rb +32 -0
- data/modules/postgresql/spec/system/server/database_grant_spec.rb +54 -0
- data/modules/postgresql/spec/system/server/database_spec.rb +35 -0
- data/modules/postgresql/spec/system/server/db_spec.rb +143 -0
- data/modules/postgresql/spec/system/server/grant_spec.rb +55 -0
- data/modules/postgresql/spec/system/server/pg_hba_rule_spec.rb +85 -0
- data/modules/postgresql/spec/system/server/plperl_spec.rb +29 -0
- data/modules/postgresql/spec/system/server/role_spec.rb +103 -0
- data/modules/postgresql/spec/system/server/table_grant_spec.rb +72 -0
- data/modules/postgresql/spec/system/server/tablespace_spec.rb +74 -0
- data/modules/postgresql/spec/system/server_spec.rb +217 -0
- data/modules/postgresql/spec/system/validate_db_connection_spec.rb +91 -0
- data/modules/postgresql/spec/unit/classes/client_spec.rb +27 -2
- data/modules/postgresql/spec/unit/classes/globals_spec.rb +28 -0
- data/modules/postgresql/spec/unit/classes/lib/devel_spec.rb +12 -0
- data/modules/postgresql/spec/unit/classes/{postgresql_java_spec.rb → lib/java_spec.rb} +9 -19
- data/modules/postgresql/spec/unit/classes/lib/python_spec.rb +31 -0
- data/modules/postgresql/spec/unit/classes/params_spec.rb +2 -1
- data/modules/postgresql/spec/unit/classes/repo_spec.rb +17 -0
- data/modules/postgresql/spec/unit/classes/server/contrib_spec.rb +42 -0
- data/modules/postgresql/spec/unit/classes/server/initdb_spec.rb +28 -0
- data/modules/postgresql/spec/unit/classes/server/plperl_spec.rb +45 -0
- data/modules/postgresql/spec/unit/classes/server_spec.rb +83 -2
- data/modules/postgresql/spec/unit/defines/server/config_entry_spec.rb +23 -0
- data/modules/postgresql/spec/unit/defines/server/database_grant_spec.rb +26 -0
- data/modules/postgresql/spec/unit/defines/server/database_spec.rb +16 -0
- data/modules/postgresql/spec/unit/defines/server/db_spec.rb +28 -0
- data/modules/postgresql/spec/unit/defines/{database_grant_spec.rb → server/grant_spec.rb} +7 -4
- data/modules/postgresql/spec/unit/defines/{pg_hba_rule_spec.rb → server/pg_hba_rule_spec.rb} +59 -2
- data/modules/postgresql/spec/unit/defines/server/role_spec.rb +23 -0
- data/modules/postgresql/spec/unit/defines/server/table_grant_spec.rb +27 -0
- data/modules/postgresql/spec/unit/defines/server/tablespace_spec.rb +23 -0
- data/modules/postgresql/spec/unit/defines/validate_db_connection_spec.rb +22 -9
- data/modules/postgresql/spec/unit/provider/postgresql_conf/parsed_spec.rb +112 -0
- data/modules/postgresql/spec/unit/puppet/provider/postgresql_psql/ruby_spec.rb +29 -0
- data/modules/postgresql/spec/unit/puppet/type/postgresql_psql_spec.rb +1 -0
- data/modules/postgresql/spec/unit/type/postgresql_conf_spec.rb +50 -0
- metadata +177 -53
- data/modules/postgresql/examples/init.pp +0 -1
- data/modules/postgresql/examples/official-postgresql-repos.pp +0 -19
- data/modules/postgresql/examples/postgresql_database.pp +0 -22
- data/modules/postgresql/examples/postgresql_db.pp +0 -30
- data/modules/postgresql/examples/postgresql_grant.pp +0 -14
- data/modules/postgresql/examples/postgresql_pg_hba_rule.pp +0 -18
- data/modules/postgresql/examples/postgresql_pgconf_extras.pp +0 -19
- data/modules/postgresql/examples/postgresql_tablespace.pp +0 -73
- data/modules/postgresql/examples/postgresql_user.pp +0 -28
- data/modules/postgresql/examples/server.pp +0 -10
- data/modules/postgresql/lib/facter/postgres_default_version.rb +0 -69
- data/modules/postgresql/manifests/config/afterservice.pp +0 -47
- data/modules/postgresql/manifests/config/beforeservice.pp +0 -171
- data/modules/postgresql/manifests/config.pp +0 -74
- data/modules/postgresql/manifests/contrib.pp +0 -29
- data/modules/postgresql/manifests/database.pp +0 -85
- data/modules/postgresql/manifests/database_grant.pp +0 -35
- data/modules/postgresql/manifests/database_user.pp +0 -60
- data/modules/postgresql/manifests/db.pp +0 -77
- data/modules/postgresql/manifests/devel.pp +0 -27
- data/modules/postgresql/manifests/grant.pp +0 -77
- data/modules/postgresql/manifests/init.pp +0 -145
- data/modules/postgresql/manifests/initdb.pp +0 -52
- data/modules/postgresql/manifests/java.pp +0 -29
- data/modules/postgresql/manifests/package_source/apt_postgresql_org.pp +0 -21
- data/modules/postgresql/manifests/package_source/yum_postgresql_org.pp +0 -30
- data/modules/postgresql/manifests/pg_hba.pp +0 -19
- data/modules/postgresql/manifests/pg_hba_rule.pp +0 -41
- data/modules/postgresql/manifests/plperl.pp +0 -24
- data/modules/postgresql/manifests/psql.pp +0 -56
- data/modules/postgresql/manifests/python.pp +0 -18
- data/modules/postgresql/manifests/tablespace.pp +0 -59
- data/modules/postgresql/spec/system/install_spec.rb +0 -707
- data/modules/postgresql/spec/system/non_defaults_spec.rb +0 -114
- data/modules/postgresql/spec/unit/classes/contrib_spec.rb +0 -11
- data/modules/postgresql/spec/unit/classes/devel_spec.rb +0 -11
- data/modules/postgresql/spec/unit/classes/init_spec.rb +0 -71
- data/modules/postgresql/spec/unit/classes/postgresql_python_spec.rb +0 -53
- data/modules/postgresql/spec/unit/defines/database_spec.rb +0 -14
- data/modules/postgresql/spec/unit/defines/database_user_spec.rb +0 -19
- data/modules/postgresql/spec/unit/defines/db_spec.rb +0 -20
- data/modules/postgresql/spec/unit/defines/pg_hba_spec.rb +0 -20
- data/modules/postgresql/spec/unit/defines/psql_spec.rb +0 -20
- data/modules/postgresql/spec/unit/defines/role_spec.rb +0 -14
- data/modules/postgresql/spec/unit/defines/tablespace_spec.rb +0 -19
- data/modules/postgresql/spec/unit/facts/postgres_default_version_spec.rb +0 -14
@@ -0,0 +1,52 @@
|
|
1
|
+
module Puppet::Parser::Functions
|
2
|
+
newfunction(:mysql_deepmerge, :type => :rvalue, :doc => <<-'ENDHEREDOC') do |args|
|
3
|
+
Recursively merges two or more hashes together and returns the resulting hash.
|
4
|
+
|
5
|
+
For example:
|
6
|
+
|
7
|
+
$hash1 = {'one' => 1, 'two' => 2, 'three' => { 'four' => 4 } }
|
8
|
+
$hash2 = {'two' => 'dos', 'three' => { 'five' => 5 } }
|
9
|
+
$merged_hash = mysql_deepmerge($hash1, $hash2)
|
10
|
+
# The resulting hash is equivalent to:
|
11
|
+
# $merged_hash = { 'one' => 1, 'two' => 'dos', 'three' => { 'four' => 4, 'five' => 5 } }
|
12
|
+
|
13
|
+
When there is a duplicate key that is a hash, they are recursively merged.
|
14
|
+
When there is a duplicate key that is not a hash, the key in the rightmost hash will "win."
|
15
|
+
|
16
|
+
ENDHEREDOC
|
17
|
+
|
18
|
+
if args.length < 2
|
19
|
+
raise Puppet::ParseError, ("mysql_deepmerge(): wrong number of arguments (#{args.length}; must be at least 2)")
|
20
|
+
end
|
21
|
+
|
22
|
+
result = Hash.new
|
23
|
+
args.each do |arg|
|
24
|
+
next if arg.is_a? String and arg.empty? # empty string is synonym for puppet's undef
|
25
|
+
# If the argument was not a hash, skip it.
|
26
|
+
unless arg.is_a?(Hash)
|
27
|
+
raise Puppet::ParseError, "mysql_deepmerge: unexpected argument type #{arg.class}, only expects hash arguments"
|
28
|
+
end
|
29
|
+
|
30
|
+
# Now we have to traverse our hash assigning our non-hash values
|
31
|
+
# to the matching keys in our result while following our hash values
|
32
|
+
# and repeating the process.
|
33
|
+
overlay( result, arg )
|
34
|
+
end
|
35
|
+
return( result )
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def overlay( hash1, hash2 )
|
40
|
+
hash2.each do |key, value|
|
41
|
+
if( value.is_a?(Hash) )
|
42
|
+
if( ! hash1.has_key?( key ) or ! hash1[key].is_a?(Hash))
|
43
|
+
hash1[key] = value
|
44
|
+
else
|
45
|
+
overlay( hash1[key], value )
|
46
|
+
end
|
47
|
+
else
|
48
|
+
hash1[key] = value
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# hash a string as mysql's "PASSWORD()" function would do it
|
2
|
+
require 'digest/sha1'
|
3
|
+
|
4
|
+
module Puppet::Parser::Functions
|
5
|
+
newfunction(:mysql_password, :type => :rvalue, :doc => <<-EOS
|
6
|
+
Returns the mysql password hash from the clear text password.
|
7
|
+
EOS
|
8
|
+
) do |args|
|
9
|
+
|
10
|
+
raise(Puppet::ParseError, 'mysql_password(): Wrong number of arguments ' +
|
11
|
+
"given (#{args.size} for 1)") if args.size != 1
|
12
|
+
|
13
|
+
'*' + Digest::SHA1.hexdigest(Digest::SHA1.digest(args[0])).upcase
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Puppet::Parser::Functions
|
2
|
+
newfunction(:mysql_strip_hash, :type => :rvalue, :arity => 1, :doc => <<-EOS
|
3
|
+
TEMPORARY FUNCTION: EXPIRES 2014-03-10
|
4
|
+
When given a hash this function strips out all blank entries.
|
5
|
+
EOS
|
6
|
+
) do |args|
|
7
|
+
|
8
|
+
hash = args[0]
|
9
|
+
unless hash.is_a?(Hash)
|
10
|
+
raise(Puppet::ParseError, 'mysql_strip_hash(): Requires hash to work with')
|
11
|
+
end
|
12
|
+
|
13
|
+
# Filter out all the top level blanks.
|
14
|
+
hash.reject{|k,v| v == ''}.each do |k,v|
|
15
|
+
if v.is_a?(Hash)
|
16
|
+
v.reject!{|ki,vi| vi == '' }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
Puppet::Type.type(:database).provide(:mysql) do
|
2
|
+
desc 'Manages MySQL database.'
|
3
|
+
|
4
|
+
defaultfor :kernel => 'Linux'
|
5
|
+
|
6
|
+
optional_commands :mysql => 'mysql'
|
7
|
+
optional_commands :mysqladmin => 'mysqladmin'
|
8
|
+
|
9
|
+
def self.defaults_file
|
10
|
+
if File.file?("#{Facter.value(:root_home)}/.my.cnf")
|
11
|
+
"--defaults-extra-file=#{Facter.value(:root_home)}/.my.cnf"
|
12
|
+
else
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def defaults_file
|
18
|
+
self.class.defaults_file
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.instances
|
22
|
+
mysql([defaults_file, '-NBe', 'show databases'].compact).split("\n").collect do |name|
|
23
|
+
new(:name => name)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def create
|
28
|
+
mysql([defaults_file, '-NBe', "create database `#{@resource[:name]}` character set #{resource[:charset]}"].compact)
|
29
|
+
end
|
30
|
+
|
31
|
+
def destroy
|
32
|
+
mysqladmin([defaults_file, '-f', 'drop', @resource[:name]].compact)
|
33
|
+
end
|
34
|
+
|
35
|
+
def charset
|
36
|
+
mysql([defaults_file, '-NBe', "show create database `#{resource[:name]}`"].compact).match(/.*?(\S+)\s(?:COLLATE.*)?\*\//)[1]
|
37
|
+
end
|
38
|
+
|
39
|
+
def charset=(value)
|
40
|
+
mysql([defaults_file, '-NBe', "alter database `#{resource[:name]}` CHARACTER SET #{value}"].compact)
|
41
|
+
end
|
42
|
+
|
43
|
+
def exists?
|
44
|
+
begin
|
45
|
+
mysql([defaults_file, '-NBe', 'show databases'].compact).match(/^#{@resource[:name]}$/)
|
46
|
+
rescue => e
|
47
|
+
debug(e.message)
|
48
|
+
return nil
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,210 @@
|
|
1
|
+
# A grant is either global or per-db. This can be distinguished by the syntax
|
2
|
+
# of the name:
|
3
|
+
# user@host => global
|
4
|
+
# user@host/db => per-db
|
5
|
+
|
6
|
+
Puppet::Type.type(:database_grant).provide(:mysql) do
|
7
|
+
|
8
|
+
desc 'Uses mysql as database.'
|
9
|
+
|
10
|
+
defaultfor :kernel => 'Linux'
|
11
|
+
|
12
|
+
optional_commands :mysql => 'mysql'
|
13
|
+
optional_commands :mysqladmin => 'mysqladmin'
|
14
|
+
|
15
|
+
def self.prefetch(resources)
|
16
|
+
@user_privs = query_user_privs
|
17
|
+
@db_privs = query_db_privs
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.user_privs
|
21
|
+
@user_privs || query_user_privs
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.db_privs
|
25
|
+
@db_privs || query_db_privs
|
26
|
+
end
|
27
|
+
|
28
|
+
def user_privs
|
29
|
+
self.class.user_privs
|
30
|
+
end
|
31
|
+
|
32
|
+
def db_privs
|
33
|
+
self.class.db_privs
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.query_user_privs
|
37
|
+
results = mysql([defaults_file, 'mysql', '-Be', 'describe user'].compact)
|
38
|
+
column_names = results.split(/\n/).map { |l| l.chomp.split(/\t/)[0] }
|
39
|
+
@user_privs = column_names.delete_if { |e| !( e =~/_priv$/) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.query_db_privs
|
43
|
+
results = mysql([defaults_file, 'mysql', '-Be', 'describe db'].compact)
|
44
|
+
column_names = results.split(/\n/).map { |l| l.chomp.split(/\t/)[0] }
|
45
|
+
@db_privs = column_names.delete_if { |e| !(e =~/_priv$/) }
|
46
|
+
end
|
47
|
+
|
48
|
+
def mysql_flush
|
49
|
+
mysqladmin([defaults_file, 'flush-privileges'].compact)
|
50
|
+
end
|
51
|
+
|
52
|
+
# this parses the
|
53
|
+
def split_name(string)
|
54
|
+
matches = /^([^@]*)@([^\/]*)(\/(.*))?$/.match(string).captures.compact
|
55
|
+
case matches.length
|
56
|
+
when 2
|
57
|
+
{
|
58
|
+
:type => :user,
|
59
|
+
:user => matches[0],
|
60
|
+
:host => matches[1]
|
61
|
+
}
|
62
|
+
when 4
|
63
|
+
{
|
64
|
+
:type => :db,
|
65
|
+
:user => matches[0],
|
66
|
+
:host => matches[1],
|
67
|
+
:db => matches[3]
|
68
|
+
}
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def create_row
|
73
|
+
unless @resource.should(:privileges).empty?
|
74
|
+
name = split_name(@resource[:name])
|
75
|
+
case name[:type]
|
76
|
+
when :user
|
77
|
+
mysql([defaults_file, 'mysql', '-e', "INSERT INTO user (host, user) VALUES ('%s', '%s')" % [
|
78
|
+
name[:host], name[:user],
|
79
|
+
]].compact)
|
80
|
+
when :db
|
81
|
+
mysql([defaults_file, 'mysql', '-e', "INSERT INTO db (host, user, db) VALUES ('%s', '%s', '%s')" % [
|
82
|
+
name[:host], name[:user], name[:db],
|
83
|
+
]].compact)
|
84
|
+
end
|
85
|
+
mysql_flush
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def destroy
|
90
|
+
mysql([defaults_file, 'mysql', '-e', "REVOKE ALL ON '%s'.* FROM '%s@%s'" % [ @resource[:privileges], @resource[:database], @resource[:name], @resource[:host] ]].compact)
|
91
|
+
end
|
92
|
+
|
93
|
+
def row_exists?
|
94
|
+
name = split_name(@resource[:name])
|
95
|
+
fields = [:user, :host]
|
96
|
+
if name[:type] == :db
|
97
|
+
fields << :db
|
98
|
+
end
|
99
|
+
not mysql([defaults_file, 'mysql', '-NBe', "SELECT '1' FROM %s WHERE %s" % [ name[:type], fields.map do |f| "%s='%s'" % [f, name[f]] end.join(' AND ')]].compact).empty?
|
100
|
+
end
|
101
|
+
|
102
|
+
def all_privs_set?
|
103
|
+
all_privs = case split_name(@resource[:name])[:type]
|
104
|
+
when :user
|
105
|
+
user_privs
|
106
|
+
when :db
|
107
|
+
db_privs
|
108
|
+
end
|
109
|
+
all_privs = all_privs.collect do |p| p.downcase end.sort.join('|')
|
110
|
+
privs = privileges.collect do |p| p.downcase end.sort.join('|')
|
111
|
+
|
112
|
+
all_privs == privs
|
113
|
+
end
|
114
|
+
|
115
|
+
def privileges
|
116
|
+
name = split_name(@resource[:name])
|
117
|
+
privs = ''
|
118
|
+
|
119
|
+
case name[:type]
|
120
|
+
when :user
|
121
|
+
privs = mysql([defaults_file, 'mysql', '-Be', "select * from mysql.user where user='%s' and host='%s'" % [ name[:user], name[:host] ]].compact)
|
122
|
+
when :db
|
123
|
+
privs = mysql([defaults_file, 'mysql', '-Be', "select * from mysql.db where user='%s' and host='%s' and db='%s'" % [ name[:user], name[:host], name[:db] ]].compact)
|
124
|
+
end
|
125
|
+
|
126
|
+
if privs.match(/^$/)
|
127
|
+
privs = [] # no result, no privs
|
128
|
+
else
|
129
|
+
# returns a line with field names and a line with values, each tab-separated
|
130
|
+
privs = privs.split(/\n/).map! do |l| l.chomp.split(/\t/) end
|
131
|
+
# transpose the lines, so we have key/value pairs
|
132
|
+
privs = privs[0].zip(privs[1])
|
133
|
+
privs = privs.select do |p| p[0].match(/_priv$/) and p[1] == 'Y' end
|
134
|
+
end
|
135
|
+
|
136
|
+
privs.collect do |p| p[0] end
|
137
|
+
end
|
138
|
+
|
139
|
+
def privileges=(privs)
|
140
|
+
unless row_exists?
|
141
|
+
create_row
|
142
|
+
end
|
143
|
+
|
144
|
+
# puts "Setting privs: ", privs.join(", ")
|
145
|
+
name = split_name(@resource[:name])
|
146
|
+
stmt = ''
|
147
|
+
where = ''
|
148
|
+
all_privs = []
|
149
|
+
case name[:type]
|
150
|
+
when :user
|
151
|
+
stmt = 'update user set '
|
152
|
+
where = " where user='%s' and host='%s'" % [ name[:user], name[:host] ]
|
153
|
+
all_privs = user_privs
|
154
|
+
when :db
|
155
|
+
stmt = 'update db set '
|
156
|
+
where = " where user='%s' and host='%s' and db='%s'" % [ name[:user], name[:host], name[:db] ]
|
157
|
+
all_privs = db_privs
|
158
|
+
end
|
159
|
+
|
160
|
+
if privs[0].downcase == 'all'
|
161
|
+
privs = all_privs
|
162
|
+
end
|
163
|
+
|
164
|
+
# Downcase the requested priviliges for case-insensitive selection
|
165
|
+
# we don't map! here because the all_privs object has to remain in
|
166
|
+
# the same case the DB gave it to us in
|
167
|
+
privs = privs.map { |p| p.downcase }
|
168
|
+
|
169
|
+
# puts "stmt:", stmt
|
170
|
+
set = all_privs.collect do |p| "%s = '%s'" % [p, privs.include?(p.downcase) ? 'Y' : 'N'] end.join(', ')
|
171
|
+
# puts "set:", set
|
172
|
+
stmt = stmt << set << where
|
173
|
+
|
174
|
+
validate_privs privs, all_privs
|
175
|
+
mysql([defaults_file, 'mysql', '-Be', stmt].compact)
|
176
|
+
mysql_flush
|
177
|
+
end
|
178
|
+
|
179
|
+
def validate_privs(set_privs, all_privs)
|
180
|
+
all_privs = all_privs.collect { |p| p.downcase }
|
181
|
+
set_privs = set_privs.collect { |p| p.downcase }
|
182
|
+
invalid_privs = Array.new
|
183
|
+
hints = Array.new
|
184
|
+
# Test each of the user provided privs to see if they exist in all_privs
|
185
|
+
set_privs.each do |priv|
|
186
|
+
invalid_privs << priv unless all_privs.include?(priv)
|
187
|
+
hints << "#{priv}_priv" if all_privs.include?("#{priv}_priv")
|
188
|
+
end
|
189
|
+
unless invalid_privs.empty?
|
190
|
+
# Print a decently helpful and gramatically correct error message
|
191
|
+
hints = "Did you mean '#{hints.join(',')}'?" unless hints.empty?
|
192
|
+
p = invalid_privs.size > 1 ? ['s', 'are not valid'] : ['', 'is not valid']
|
193
|
+
detail = ["The privilege#{p[0]} '#{invalid_privs.join(',')}' #{p[1]}."]
|
194
|
+
fail [detail, hints].join(' ')
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
# Optional defaults file
|
199
|
+
def self.defaults_file
|
200
|
+
if File.file?("#{Facter.value(:root_home)}/.my.cnf")
|
201
|
+
"--defaults-extra-file=#{Facter.value(:root_home)}/.my.cnf"
|
202
|
+
else
|
203
|
+
nil
|
204
|
+
end
|
205
|
+
end
|
206
|
+
def defaults_file
|
207
|
+
self.class.defaults_file
|
208
|
+
end
|
209
|
+
|
210
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
Puppet::Type.type(:database_user).provide(:mysql) do
|
2
|
+
|
3
|
+
desc 'manage users for a mysql database.'
|
4
|
+
|
5
|
+
defaultfor :kernel => 'Linux'
|
6
|
+
|
7
|
+
commands :mysql => 'mysql'
|
8
|
+
commands :mysqladmin => 'mysqladmin'
|
9
|
+
|
10
|
+
def self.instances
|
11
|
+
users = mysql([defaults_file, 'mysql', '-BNe' "select concat(User, '@',Host) as User from mysql.user"].compact).split("\n")
|
12
|
+
users.select{ |user| user =~ /.+@/ }.collect do |name|
|
13
|
+
new(:name => name)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def create
|
18
|
+
merged_name = @resource[:name].sub('@', "'@'")
|
19
|
+
password_hash = @resource.value(:password_hash)
|
20
|
+
max_user_connections = @resource.value(:max_user_connections) || 0
|
21
|
+
|
22
|
+
mysql([defaults_file, 'mysql', '-e', "grant usage on *.* to '#{merged_name}' identified by PASSWORD
|
23
|
+
'#{password_hash}' with max_user_connections #{max_user_connections}"].compact)
|
24
|
+
|
25
|
+
exists? ? (return true) : (return false)
|
26
|
+
end
|
27
|
+
|
28
|
+
def destroy
|
29
|
+
merged_name = @resource[:name].sub('@', "'@'")
|
30
|
+
mysql([defaults_file, 'mysql', '-e', "drop user '#{merged_name}'"].compact)
|
31
|
+
|
32
|
+
exists? ? (return false) : (return true)
|
33
|
+
end
|
34
|
+
|
35
|
+
def password_hash
|
36
|
+
mysql([defaults_file, 'mysql', '-NBe', "select password from mysql.user where CONCAT(user, '@', host) = '#{@resource[:name]}'"].compact).chomp
|
37
|
+
end
|
38
|
+
|
39
|
+
def password_hash=(string)
|
40
|
+
mysql([defaults_file, 'mysql', '-e', "SET PASSWORD FOR '%s' = '%s'" % [ @resource[:name].sub('@', "'@'"), string ] ].compact)
|
41
|
+
|
42
|
+
password_hash == string ? (return true) : (return false)
|
43
|
+
end
|
44
|
+
|
45
|
+
def max_user_connections
|
46
|
+
mysql([defaults_file, "mysql", "-NBe", "select max_user_connections from mysql.user where CONCAT(user, '@', host) = '#{@resource[:name]}'"].compact).chomp
|
47
|
+
end
|
48
|
+
|
49
|
+
def max_user_connections=(int)
|
50
|
+
mysql([defaults_file, "mysql", "-e", "grant usage on *.* to '%s' with max_user_connections #{int}" % [ @resource[:name].sub("@", "'@'")] ].compact).chomp
|
51
|
+
|
52
|
+
max_user_connections == int ? (return true) : (return false)
|
53
|
+
end
|
54
|
+
|
55
|
+
def exists?
|
56
|
+
not mysql([defaults_file, 'mysql', '-NBe', "select '1' from mysql.user where CONCAT(user, '@', host) = '%s'" % @resource.value(:name)].compact).empty?
|
57
|
+
end
|
58
|
+
|
59
|
+
def flush
|
60
|
+
@property_hash.clear
|
61
|
+
mysqladmin([defaults_file, 'flush-privileges'].compact)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Optional defaults file
|
65
|
+
def self.defaults_file
|
66
|
+
if File.file?("#{Facter.value(:root_home)}/.my.cnf")
|
67
|
+
"--defaults-extra-file=#{Facter.value(:root_home)}/.my.cnf"
|
68
|
+
else
|
69
|
+
nil
|
70
|
+
end
|
71
|
+
end
|
72
|
+
def defaults_file
|
73
|
+
self.class.defaults_file
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
class Puppet::Provider::Mysql < Puppet::Provider
|
2
|
+
|
3
|
+
# Without initvars commands won't work.
|
4
|
+
initvars
|
5
|
+
commands :mysql => 'mysql'
|
6
|
+
commands :mysqladmin => 'mysqladmin'
|
7
|
+
|
8
|
+
# Optional defaults file
|
9
|
+
def self.defaults_file
|
10
|
+
if File.file?("#{Facter.value(:root_home)}/.my.cnf")
|
11
|
+
"--defaults-extra-file=#{Facter.value(:root_home)}/.my.cnf"
|
12
|
+
else
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def defaults_file
|
18
|
+
self.class.defaults_file
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.users
|
22
|
+
mysql([defaults_file, '-NBe', "SELECT CONCAT(User, '@',Host) AS User FROM mysql.user"].compact).split("\n")
|
23
|
+
end
|
24
|
+
|
25
|
+
# Take root@localhost and munge it to 'root'@'localhost'
|
26
|
+
def self.cmd_user(user)
|
27
|
+
"'#{user.sub('@', "'@'")}'"
|
28
|
+
end
|
29
|
+
|
30
|
+
# Take root.* and return ON `root`.*
|
31
|
+
def self.cmd_table(table)
|
32
|
+
table_string = ''
|
33
|
+
|
34
|
+
# We can't escape *.* so special case this.
|
35
|
+
if table == '*.*'
|
36
|
+
table_string << '*.*'
|
37
|
+
else
|
38
|
+
table_string << table.sub(/^(.*)(\..*)/, '`\1`\2')
|
39
|
+
end
|
40
|
+
table_string
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.cmd_privs(privileges)
|
44
|
+
if privileges.include?('ALL')
|
45
|
+
return 'ALL PRIVILEGES'
|
46
|
+
else
|
47
|
+
priv_string = ''
|
48
|
+
privileges.each do |priv|
|
49
|
+
priv_string << "#{priv}, "
|
50
|
+
end
|
51
|
+
end
|
52
|
+
# Remove trailing , from the last element.
|
53
|
+
priv_string.sub(/, $/, '')
|
54
|
+
end
|
55
|
+
|
56
|
+
# Take in potential options and build up a query string with them.
|
57
|
+
def self.cmd_options(options)
|
58
|
+
option_string = ''
|
59
|
+
options.each do |opt|
|
60
|
+
if opt == 'GRANT'
|
61
|
+
option_string << ' WITH GRANT OPTION'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
option_string
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'mysql'))
|
2
|
+
Puppet::Type.type(:mysql_database).provide(:mysql, :parent => Puppet::Provider::Mysql) do
|
3
|
+
desc 'Manages MySQL databases.'
|
4
|
+
|
5
|
+
commands :mysql => 'mysql'
|
6
|
+
|
7
|
+
def self.instances
|
8
|
+
mysql([defaults_file, '-NBe', 'show databases'].compact).split("\n").collect do |name|
|
9
|
+
attributes = {}
|
10
|
+
mysql([defaults_file, '-NBe', 'show variables like "%_database"', name].compact).split("\n").each do |line|
|
11
|
+
k,v = line.split(/\s/)
|
12
|
+
attributes[k] = v
|
13
|
+
end
|
14
|
+
new(:name => name,
|
15
|
+
:ensure => :present,
|
16
|
+
:charset => attributes['character_set_database'],
|
17
|
+
:collate => attributes['collation_database']
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# We iterate over each mysql_database entry in the catalog and compare it against
|
23
|
+
# the contents of the property_hash generated by self.instances
|
24
|
+
def self.prefetch(resources)
|
25
|
+
databases = instances
|
26
|
+
resources.keys.each do |database|
|
27
|
+
if provider = databases.find { |db| db.name == database }
|
28
|
+
resources[database].provider = provider
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def create
|
34
|
+
mysql([defaults_file, '-NBe', "create database `#{@resource[:name]}` character set #{@resource[:charset]} collate #{@resource[:collate]}"].compact)
|
35
|
+
|
36
|
+
@property_hash[:ensure] = :present
|
37
|
+
@property_hash[:charset] = @resource[:charset]
|
38
|
+
@property_hash[:collate] = @resource[:collate]
|
39
|
+
|
40
|
+
exists? ? (return true) : (return false)
|
41
|
+
end
|
42
|
+
|
43
|
+
def destroy
|
44
|
+
mysql([defaults_file, '-NBe', "drop database `#{@resource[:name]}`"].compact)
|
45
|
+
|
46
|
+
@property_hash.clear
|
47
|
+
exists? ? (return false) : (return true)
|
48
|
+
end
|
49
|
+
|
50
|
+
def exists?
|
51
|
+
@property_hash[:ensure] == :present || false
|
52
|
+
end
|
53
|
+
|
54
|
+
mk_resource_methods
|
55
|
+
|
56
|
+
def charset=(value)
|
57
|
+
mysql([defaults_file, '-NBe', "alter database `#{resource[:name]}` CHARACTER SET #{value}"].compact)
|
58
|
+
@property_hash[:charset] = value
|
59
|
+
charset == value ? (return true) : (return false)
|
60
|
+
end
|
61
|
+
|
62
|
+
def collate=(value)
|
63
|
+
mysql([defaults_file, '-NBe', "alter database `#{resource[:name]}` COLLATE #{value}"].compact)
|
64
|
+
@property_hash[:collate] = value
|
65
|
+
collate == value ? (return true) : (return false)
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'mysql'))
|
2
|
+
Puppet::Type.type(:mysql_grant).provide(:mysql, :parent => Puppet::Provider::Mysql) do
|
3
|
+
|
4
|
+
desc 'Set grants for users in MySQL.'
|
5
|
+
|
6
|
+
def self.instances
|
7
|
+
instances = []
|
8
|
+
users.select{ |user| user =~ /.+@/ }.collect do |user|
|
9
|
+
user_string = self.cmd_user(user)
|
10
|
+
query = "SHOW GRANTS FOR #{user_string};"
|
11
|
+
grants = mysql([defaults_file, "-NBe", query].compact)
|
12
|
+
# Once we have the list of grants generate entries for each.
|
13
|
+
grants.each_line do |grant|
|
14
|
+
# Match the munges we do in the type.
|
15
|
+
munged_grant = grant.delete("'").delete("`")
|
16
|
+
# Matching: GRANT (SELECT, UPDATE) PRIVILEGES ON (*.*) TO ('root')@('127.0.0.1') (WITH GRANT OPTION)
|
17
|
+
if match = munged_grant.match(/^GRANT\s(.+)\sON\s(.+)\sTO\s(.*)@(.*?)(\s.*)$/)
|
18
|
+
privileges, table, user, host, rest = match.captures
|
19
|
+
# Once we split privileges up on the , we need to make sure we
|
20
|
+
# shortern ALL PRIVILEGES to just all.
|
21
|
+
stripped_privileges = privileges.split(',').map do |priv|
|
22
|
+
priv == 'ALL PRIVILEGES' ? 'ALL' : priv.lstrip.rstrip
|
23
|
+
end
|
24
|
+
# Same here, but to remove OPTION leaving just GRANT.
|
25
|
+
options = rest.match(/WITH\s(.*)\sOPTION$/).captures if rest.include?('WITH')
|
26
|
+
# We need to return an array of instances so capture these
|
27
|
+
instances << new(
|
28
|
+
:name => "#{user}@#{host}/#{table}",
|
29
|
+
:ensure => :present,
|
30
|
+
:privileges => stripped_privileges.sort,
|
31
|
+
:table => table,
|
32
|
+
:user => "#{user}@#{host}",
|
33
|
+
:options => options
|
34
|
+
)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
return instances
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.prefetch(resources)
|
42
|
+
users = instances
|
43
|
+
resources.keys.each do |name|
|
44
|
+
if provider = users.find { |user| user.name == name }
|
45
|
+
resources[name].provider = provider
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def grant(user, table, privileges, options)
|
51
|
+
user_string = self.class.cmd_user(user)
|
52
|
+
priv_string = self.class.cmd_privs(privileges)
|
53
|
+
table_string = self.class.cmd_table(table)
|
54
|
+
query = "GRANT #{priv_string}"
|
55
|
+
query << " ON #{table_string}"
|
56
|
+
query << " TO #{user_string}"
|
57
|
+
query << self.class.cmd_options(options) unless options.nil?
|
58
|
+
mysql([defaults_file, '-e', query].compact)
|
59
|
+
end
|
60
|
+
|
61
|
+
def create
|
62
|
+
grant(@resource[:user], @resource[:table], @resource[:privileges], @resource[:options])
|
63
|
+
|
64
|
+
@property_hash[:ensure] = :present
|
65
|
+
@property_hash[:table] = @resource[:table]
|
66
|
+
@property_hash[:user] = @resource[:user]
|
67
|
+
@property_hash[:options] = @resource[:options] if @resource[:options]
|
68
|
+
@property_hash[:privileges] = @resource[:privileges]
|
69
|
+
|
70
|
+
exists? ? (return true) : (return false)
|
71
|
+
end
|
72
|
+
|
73
|
+
def revoke(user, table)
|
74
|
+
user_string = self.class.cmd_user(user)
|
75
|
+
table_string = self.class.cmd_table(table)
|
76
|
+
|
77
|
+
query = "REVOKE ALL ON #{table_string} FROM #{user_string}"
|
78
|
+
mysql([defaults_file, '-e', query].compact)
|
79
|
+
end
|
80
|
+
|
81
|
+
def destroy
|
82
|
+
revoke(@property_hash[:user], @property_hash[:table])
|
83
|
+
@property_hash.clear
|
84
|
+
|
85
|
+
exists? ? (return false) : (return true)
|
86
|
+
end
|
87
|
+
|
88
|
+
def exists?
|
89
|
+
@property_hash[:ensure] == :present || false
|
90
|
+
end
|
91
|
+
|
92
|
+
def flush
|
93
|
+
@property_hash.clear
|
94
|
+
mysql([defaults_file, '-NBe', 'FLUSH PRIVILEGES'].compact)
|
95
|
+
end
|
96
|
+
|
97
|
+
mk_resource_methods
|
98
|
+
|
99
|
+
def privileges=(privileges)
|
100
|
+
revoke(@property_hash[:user], @property_hash[:table])
|
101
|
+
grant(@property_hash[:user], @property_hash[:table], privileges, @property_hash[:options])
|
102
|
+
@property_hash[:privileges] = privileges
|
103
|
+
|
104
|
+
self.privileges
|
105
|
+
end
|
106
|
+
|
107
|
+
def options=(options)
|
108
|
+
revoke(@property_hash[:user], @property_hash[:table])
|
109
|
+
grant(@property_hash[:user], @property_hash[:table], @property_hash[:privileges], options)
|
110
|
+
@property_hash[:options] = options
|
111
|
+
|
112
|
+
self.options
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|