freighthop 0.0.6 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (270) hide show
  1. data/Puppetfile +1 -0
  2. data/Puppetfile.lock +3 -0
  3. data/Vagrantfile +1 -1
  4. data/bin/fh +2 -78
  5. data/lib/freighthop/cli/help.rb +69 -0
  6. data/lib/freighthop/cli/ssh.rb +46 -0
  7. data/lib/freighthop/cli/vagrant.rb +26 -0
  8. data/lib/freighthop/cli.rb +40 -0
  9. data/lib/freighthop/config.rb +4 -0
  10. data/lib/freighthop/vagrant_env.rb +24 -0
  11. data/lib/freighthop/version.rb +1 -1
  12. data/lib/freighthop.rb +7 -4
  13. data/local_modules/freighthop/manifests/database/mysql.pp +20 -0
  14. data/local_modules/freighthop/manifests/database/postgres.pp +6 -6
  15. data/local_modules/freighthop/manifests/database.pp +6 -8
  16. data/local_modules/freighthop/manifests/init.pp +1 -8
  17. data/local_modules/freighthop/manifests/params.pp +0 -3
  18. data/modules/apt/CHANGELOG +12 -2
  19. data/modules/apt/Gemfile +6 -5
  20. data/modules/apt/Gemfile.lock +40 -5
  21. data/modules/apt/Modulefile +1 -1
  22. data/modules/apt/README.md +2 -1
  23. data/modules/apt/Rakefile +1 -0
  24. data/modules/apt/manifests/init.pp +4 -1
  25. data/modules/apt/manifests/ppa.pp +1 -1
  26. data/modules/apt/manifests/update.pp +1 -0
  27. data/modules/apt/metadata.json +21 -13
  28. data/modules/apt/spec/defines/ppa_spec.rb +3 -3
  29. data/modules/apt/spec/defines/source_spec.rb +2 -2
  30. data/modules/apt/spec/spec_helper_system.rb +30 -0
  31. data/modules/apt/spec/system/apt_builddep_spec.rb +38 -0
  32. data/modules/apt/spec/system/apt_key_spec.rb +53 -0
  33. data/modules/apt/spec/system/apt_ppa_spec.rb +59 -0
  34. data/modules/apt/spec/system/apt_source_spec.rb +51 -0
  35. data/modules/apt/spec/system/basic_spec.rb +10 -0
  36. data/modules/apt/spec/system/class_spec.rb +20 -0
  37. data/modules/apt/templates/source.list.erb +2 -2
  38. data/modules/freighthop/manifests/database/mysql.pp +20 -0
  39. data/modules/freighthop/manifests/database/postgres.pp +6 -6
  40. data/modules/freighthop/manifests/database.pp +6 -8
  41. data/modules/freighthop/manifests/init.pp +1 -8
  42. data/modules/freighthop/manifests/params.pp +0 -3
  43. data/modules/mysql/CHANGELOG +403 -0
  44. data/modules/mysql/Gemfile +24 -0
  45. data/modules/mysql/Gemfile.lock +129 -0
  46. data/modules/mysql/LICENSE +201 -0
  47. data/modules/mysql/Modulefile +9 -0
  48. data/modules/mysql/README.md +492 -0
  49. data/modules/mysql/Rakefile +2 -0
  50. data/modules/mysql/TODO +8 -0
  51. data/modules/mysql/files/mysqltuner.pl +966 -0
  52. data/modules/mysql/lib/puppet/parser/functions/mysql_deepmerge.rb +52 -0
  53. data/modules/mysql/lib/puppet/parser/functions/mysql_password.rb +15 -0
  54. data/modules/mysql/lib/puppet/parser/functions/mysql_strip_hash.rb +21 -0
  55. data/modules/mysql/lib/puppet/provider/database/mysql.rb +52 -0
  56. data/modules/mysql/lib/puppet/provider/database_grant/mysql.rb +210 -0
  57. data/modules/mysql/lib/puppet/provider/database_user/mysql.rb +76 -0
  58. data/modules/mysql/lib/puppet/provider/mysql.rb +67 -0
  59. data/modules/mysql/lib/puppet/provider/mysql_database/mysql.rb +68 -0
  60. data/modules/mysql/lib/puppet/provider/mysql_grant/mysql.rb +115 -0
  61. data/modules/mysql/lib/puppet/provider/mysql_user/mysql.rb +115 -0
  62. data/modules/mysql/lib/puppet/type/database.rb +21 -0
  63. data/modules/mysql/lib/puppet/type/database_grant.rb +79 -0
  64. data/modules/mysql/lib/puppet/type/database_user.rb +31 -0
  65. data/modules/mysql/lib/puppet/type/mysql_database.rb +22 -0
  66. data/modules/mysql/lib/puppet/type/mysql_grant.rb +72 -0
  67. data/modules/mysql/lib/puppet/type/mysql_user.rb +45 -0
  68. data/modules/mysql/manifests/backup.pp +31 -0
  69. data/modules/mysql/manifests/bindings/java.pp +10 -0
  70. data/modules/mysql/manifests/bindings/perl.pp +10 -0
  71. data/modules/mysql/manifests/bindings/php.pp +10 -0
  72. data/modules/mysql/manifests/bindings/python.pp +10 -0
  73. data/modules/mysql/manifests/bindings/ruby.pp +10 -0
  74. data/modules/mysql/manifests/bindings.pp +33 -0
  75. data/modules/mysql/manifests/client/install.pp +8 -0
  76. data/modules/mysql/manifests/client.pp +27 -0
  77. data/modules/mysql/manifests/db.pp +59 -0
  78. data/modules/mysql/manifests/init.pp +100 -0
  79. data/modules/mysql/manifests/params.pp +230 -0
  80. data/modules/mysql/manifests/server/account_security.pp +22 -0
  81. data/modules/mysql/manifests/server/backup.pp +56 -0
  82. data/modules/mysql/manifests/server/config.pp +31 -0
  83. data/modules/mysql/manifests/server/install.pp +9 -0
  84. data/modules/mysql/manifests/server/monitor.pp +24 -0
  85. data/modules/mysql/manifests/server/mysqltuner.pp +9 -0
  86. data/modules/mysql/manifests/server/providers.pp +8 -0
  87. data/modules/mysql/manifests/server/root_password.pp +21 -0
  88. data/modules/mysql/manifests/server/service.pp +19 -0
  89. data/modules/mysql/manifests/server.pp +69 -0
  90. data/modules/mysql/metadata.json +289 -0
  91. data/modules/mysql/spec/classes/mysql_bindings_spec.rb +58 -0
  92. data/modules/mysql/spec/classes/mysql_client_spec.rb +16 -0
  93. data/modules/mysql/spec/classes/mysql_server_account_security_spec.rb +41 -0
  94. data/modules/mysql/spec/classes/mysql_server_backup_spec.rb +112 -0
  95. data/modules/mysql/spec/classes/mysql_server_monitor_spec.rb +31 -0
  96. data/modules/mysql/spec/classes/mysql_server_mysqltuner_spec.rb +5 -0
  97. data/modules/mysql/spec/classes/mysql_server_spec.rb +162 -0
  98. data/modules/mysql/spec/defines/mysql_db_spec.rb +51 -0
  99. data/modules/mysql/spec/spec.opts +6 -0
  100. data/modules/mysql/spec/spec_helper.rb +5 -0
  101. data/modules/mysql/spec/spec_helper_system.rb +28 -0
  102. data/modules/mysql/spec/system/mysql_account_delete_spec.rb +35 -0
  103. data/modules/mysql/spec/system/mysql_backup_spec.rb +77 -0
  104. data/modules/mysql/spec/system/mysql_bindings_spec.rb +90 -0
  105. data/modules/mysql/spec/system/mysql_db_spec.rb +61 -0
  106. data/modules/mysql/spec/system/mysql_server_monitor_spec.rb +30 -0
  107. data/modules/mysql/spec/system/mysql_server_root_password_spec.rb +71 -0
  108. data/modules/mysql/spec/system/mysql_server_spec.rb +85 -0
  109. data/modules/mysql/spec/system/types/mysql_grant_spec.rb +314 -0
  110. data/modules/mysql/spec/system/types/mysql_user_spec.rb +35 -0
  111. data/modules/mysql/spec/unit/mysql_password_spec.rb +27 -0
  112. data/modules/mysql/spec/unit/puppet/functions/mysql_deepmerge_spec.rb +77 -0
  113. data/modules/mysql/spec/unit/puppet/provider/database/mysql_spec.rb +86 -0
  114. data/modules/mysql/spec/unit/puppet/provider/database_grant/mysql_spec.rb +95 -0
  115. data/modules/mysql/spec/unit/puppet/provider/database_user/mysql_spec.rb +119 -0
  116. data/modules/mysql/spec/unit/puppet/provider/mysql_database/mysql_spec.rb +118 -0
  117. data/modules/mysql/spec/unit/puppet/provider/mysql_user/mysql_spec.rb +130 -0
  118. data/modules/mysql/spec/unit/puppet/type/mysql_database_spec.rb +29 -0
  119. data/modules/mysql/spec/unit/puppet/type/mysql_user_spec.rb +30 -0
  120. data/modules/mysql/templates/my.cnf.erb +17 -0
  121. data/modules/mysql/templates/my.cnf.pass.erb +7 -0
  122. data/modules/mysql/templates/my.conf.cnf.erb +17 -0
  123. data/modules/mysql/templates/mysqlbackup.sh.erb +57 -0
  124. data/modules/mysql/tests/backup.pp +8 -0
  125. data/modules/mysql/tests/bindings.pp +3 -0
  126. data/modules/mysql/tests/init.pp +1 -0
  127. data/modules/mysql/tests/java.pp +1 -0
  128. data/modules/mysql/tests/mysql_database.pp +12 -0
  129. data/modules/mysql/tests/mysql_grant.pp +5 -0
  130. data/modules/mysql/tests/mysql_user.pp +23 -0
  131. data/modules/mysql/tests/perl.pp +1 -0
  132. data/modules/mysql/tests/python.pp +1 -0
  133. data/modules/mysql/tests/ruby.pp +1 -0
  134. data/modules/mysql/tests/server/account_security.pp +4 -0
  135. data/modules/mysql/tests/server/config.pp +11 -0
  136. data/modules/mysql/tests/server.pp +3 -0
  137. data/modules/postgresql/Changelog +191 -0
  138. data/modules/postgresql/Gemfile +1 -0
  139. data/modules/postgresql/Gemfile.lock +9 -0
  140. data/modules/postgresql/LICENSE +198 -12
  141. data/modules/postgresql/Modulefile +2 -2
  142. data/modules/postgresql/NOTICE +14 -0
  143. data/modules/postgresql/README.md +435 -184
  144. data/modules/postgresql/files/validate_postgresql_connection.sh +31 -0
  145. data/modules/postgresql/lib/puppet/provider/postgresql_conf/parsed.rb +37 -0
  146. data/modules/postgresql/lib/puppet/provider/postgresql_psql/ruby.rb +4 -0
  147. data/modules/postgresql/lib/puppet/type/postgresql_conf.rb +31 -0
  148. data/modules/postgresql/lib/puppet/type/postgresql_psql.rb +4 -0
  149. data/modules/postgresql/manifests/client.pp +17 -16
  150. data/modules/postgresql/manifests/globals.pp +95 -0
  151. data/modules/postgresql/manifests/lib/devel.pp +15 -0
  152. data/modules/postgresql/manifests/lib/java.pp +15 -0
  153. data/modules/postgresql/manifests/lib/python.pp +13 -0
  154. data/modules/postgresql/manifests/params.pp +127 -222
  155. data/modules/postgresql/manifests/repo/apt_postgresql_org.pp +30 -0
  156. data/modules/postgresql/manifests/repo/yum_postgresql_org.pp +38 -0
  157. data/modules/postgresql/manifests/repo.pp +22 -0
  158. data/modules/postgresql/manifests/server/config.pp +113 -0
  159. data/modules/postgresql/manifests/server/config_entry.pp +43 -0
  160. data/modules/postgresql/manifests/server/contrib.pp +27 -0
  161. data/modules/postgresql/manifests/server/database.pp +75 -0
  162. data/modules/postgresql/manifests/server/database_grant.pp +18 -0
  163. data/modules/postgresql/manifests/server/db.pp +36 -0
  164. data/modules/postgresql/manifests/server/firewall.pp +21 -0
  165. data/modules/postgresql/manifests/server/grant.pp +81 -0
  166. data/modules/postgresql/manifests/server/initdb.pp +52 -0
  167. data/modules/postgresql/manifests/server/install.pp +49 -0
  168. data/modules/postgresql/manifests/server/passwd.pp +34 -0
  169. data/modules/postgresql/manifests/server/pg_hba_rule.pp +54 -0
  170. data/modules/postgresql/manifests/server/plperl.pp +27 -0
  171. data/modules/postgresql/manifests/server/reload.pp +15 -0
  172. data/modules/postgresql/manifests/{role.pp → server/role.pp} +19 -33
  173. data/modules/postgresql/manifests/server/service.pp +40 -0
  174. data/modules/postgresql/manifests/{table_grant.pp → server/table_grant.pp} +4 -4
  175. data/modules/postgresql/manifests/server/tablespace.pp +42 -0
  176. data/modules/postgresql/manifests/server.pp +61 -83
  177. data/modules/postgresql/manifests/validate_db_connection.pp +49 -50
  178. data/modules/postgresql/metadata.json +123 -73
  179. data/modules/postgresql/spec/spec_helper_system.rb +13 -1
  180. data/modules/postgresql/spec/system/client_spec.rb +22 -0
  181. data/modules/postgresql/spec/system/common_patterns_spec.rb +53 -0
  182. data/modules/postgresql/spec/system/contrib_spec.rb +33 -0
  183. data/modules/postgresql/spec/system/lib/devel_spec.rb +22 -0
  184. data/modules/postgresql/spec/system/lib/java_spec.rb +25 -0
  185. data/modules/postgresql/spec/system/lib/python_spec.rb +24 -0
  186. data/modules/postgresql/spec/system/postgresql_psql_spec.rb +51 -0
  187. data/modules/postgresql/spec/system/server/config_entry_spec.rb +32 -0
  188. data/modules/postgresql/spec/system/server/database_grant_spec.rb +54 -0
  189. data/modules/postgresql/spec/system/server/database_spec.rb +35 -0
  190. data/modules/postgresql/spec/system/server/db_spec.rb +143 -0
  191. data/modules/postgresql/spec/system/server/grant_spec.rb +55 -0
  192. data/modules/postgresql/spec/system/server/pg_hba_rule_spec.rb +85 -0
  193. data/modules/postgresql/spec/system/server/plperl_spec.rb +29 -0
  194. data/modules/postgresql/spec/system/server/role_spec.rb +103 -0
  195. data/modules/postgresql/spec/system/server/table_grant_spec.rb +72 -0
  196. data/modules/postgresql/spec/system/server/tablespace_spec.rb +74 -0
  197. data/modules/postgresql/spec/system/server_spec.rb +217 -0
  198. data/modules/postgresql/spec/system/validate_db_connection_spec.rb +91 -0
  199. data/modules/postgresql/spec/unit/classes/client_spec.rb +27 -2
  200. data/modules/postgresql/spec/unit/classes/globals_spec.rb +28 -0
  201. data/modules/postgresql/spec/unit/classes/lib/devel_spec.rb +12 -0
  202. data/modules/postgresql/spec/unit/classes/{postgresql_java_spec.rb → lib/java_spec.rb} +9 -19
  203. data/modules/postgresql/spec/unit/classes/lib/python_spec.rb +31 -0
  204. data/modules/postgresql/spec/unit/classes/params_spec.rb +2 -1
  205. data/modules/postgresql/spec/unit/classes/repo_spec.rb +17 -0
  206. data/modules/postgresql/spec/unit/classes/server/contrib_spec.rb +42 -0
  207. data/modules/postgresql/spec/unit/classes/server/initdb_spec.rb +28 -0
  208. data/modules/postgresql/spec/unit/classes/server/plperl_spec.rb +45 -0
  209. data/modules/postgresql/spec/unit/classes/server_spec.rb +83 -2
  210. data/modules/postgresql/spec/unit/defines/server/config_entry_spec.rb +23 -0
  211. data/modules/postgresql/spec/unit/defines/server/database_grant_spec.rb +26 -0
  212. data/modules/postgresql/spec/unit/defines/server/database_spec.rb +16 -0
  213. data/modules/postgresql/spec/unit/defines/server/db_spec.rb +28 -0
  214. data/modules/postgresql/spec/unit/defines/{database_grant_spec.rb → server/grant_spec.rb} +7 -4
  215. data/modules/postgresql/spec/unit/defines/{pg_hba_rule_spec.rb → server/pg_hba_rule_spec.rb} +59 -2
  216. data/modules/postgresql/spec/unit/defines/server/role_spec.rb +23 -0
  217. data/modules/postgresql/spec/unit/defines/server/table_grant_spec.rb +27 -0
  218. data/modules/postgresql/spec/unit/defines/server/tablespace_spec.rb +23 -0
  219. data/modules/postgresql/spec/unit/defines/validate_db_connection_spec.rb +22 -9
  220. data/modules/postgresql/spec/unit/provider/postgresql_conf/parsed_spec.rb +112 -0
  221. data/modules/postgresql/spec/unit/puppet/provider/postgresql_psql/ruby_spec.rb +29 -0
  222. data/modules/postgresql/spec/unit/puppet/type/postgresql_psql_spec.rb +1 -0
  223. data/modules/postgresql/spec/unit/type/postgresql_conf_spec.rb +50 -0
  224. metadata +177 -53
  225. data/modules/postgresql/examples/init.pp +0 -1
  226. data/modules/postgresql/examples/official-postgresql-repos.pp +0 -19
  227. data/modules/postgresql/examples/postgresql_database.pp +0 -22
  228. data/modules/postgresql/examples/postgresql_db.pp +0 -30
  229. data/modules/postgresql/examples/postgresql_grant.pp +0 -14
  230. data/modules/postgresql/examples/postgresql_pg_hba_rule.pp +0 -18
  231. data/modules/postgresql/examples/postgresql_pgconf_extras.pp +0 -19
  232. data/modules/postgresql/examples/postgresql_tablespace.pp +0 -73
  233. data/modules/postgresql/examples/postgresql_user.pp +0 -28
  234. data/modules/postgresql/examples/server.pp +0 -10
  235. data/modules/postgresql/lib/facter/postgres_default_version.rb +0 -69
  236. data/modules/postgresql/manifests/config/afterservice.pp +0 -47
  237. data/modules/postgresql/manifests/config/beforeservice.pp +0 -171
  238. data/modules/postgresql/manifests/config.pp +0 -74
  239. data/modules/postgresql/manifests/contrib.pp +0 -29
  240. data/modules/postgresql/manifests/database.pp +0 -85
  241. data/modules/postgresql/manifests/database_grant.pp +0 -35
  242. data/modules/postgresql/manifests/database_user.pp +0 -60
  243. data/modules/postgresql/manifests/db.pp +0 -77
  244. data/modules/postgresql/manifests/devel.pp +0 -27
  245. data/modules/postgresql/manifests/grant.pp +0 -77
  246. data/modules/postgresql/manifests/init.pp +0 -145
  247. data/modules/postgresql/manifests/initdb.pp +0 -52
  248. data/modules/postgresql/manifests/java.pp +0 -29
  249. data/modules/postgresql/manifests/package_source/apt_postgresql_org.pp +0 -21
  250. data/modules/postgresql/manifests/package_source/yum_postgresql_org.pp +0 -30
  251. data/modules/postgresql/manifests/pg_hba.pp +0 -19
  252. data/modules/postgresql/manifests/pg_hba_rule.pp +0 -41
  253. data/modules/postgresql/manifests/plperl.pp +0 -24
  254. data/modules/postgresql/manifests/psql.pp +0 -56
  255. data/modules/postgresql/manifests/python.pp +0 -18
  256. data/modules/postgresql/manifests/tablespace.pp +0 -59
  257. data/modules/postgresql/spec/system/install_spec.rb +0 -707
  258. data/modules/postgresql/spec/system/non_defaults_spec.rb +0 -114
  259. data/modules/postgresql/spec/unit/classes/contrib_spec.rb +0 -11
  260. data/modules/postgresql/spec/unit/classes/devel_spec.rb +0 -11
  261. data/modules/postgresql/spec/unit/classes/init_spec.rb +0 -71
  262. data/modules/postgresql/spec/unit/classes/postgresql_python_spec.rb +0 -53
  263. data/modules/postgresql/spec/unit/defines/database_spec.rb +0 -14
  264. data/modules/postgresql/spec/unit/defines/database_user_spec.rb +0 -19
  265. data/modules/postgresql/spec/unit/defines/db_spec.rb +0 -20
  266. data/modules/postgresql/spec/unit/defines/pg_hba_spec.rb +0 -20
  267. data/modules/postgresql/spec/unit/defines/psql_spec.rb +0 -20
  268. data/modules/postgresql/spec/unit/defines/role_spec.rb +0 -14
  269. data/modules/postgresql/spec/unit/defines/tablespace_spec.rb +0 -19
  270. 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