X-Git-Url: https://git.openstreetmap.org/chef.git/blobdiff_plain/57997055a817d2104f605a56141ae26515aabbd2..8df838bf09d95282ba29ddde8b504e0affc5f06e:/cookbooks/mysql/libraries/mysql.rb diff --git a/cookbooks/mysql/libraries/mysql.rb b/cookbooks/mysql/libraries/mysql.rb index 2b2bca67d..7c45022fd 100644 --- a/cookbooks/mysql/libraries/mysql.rb +++ b/cookbooks/mysql/libraries/mysql.rb @@ -1,9 +1,9 @@ -require "chef/mixin/command" +require "chef/mixin/shell_out" require "rexml/document" class Chef class MySQL - include Chef::Mixin::Command + include Chef::Mixin::ShellOut USER_PRIVILEGES = [ :select, :insert, :update, :delete, :create, :drop, :reload, @@ -11,14 +11,14 @@ class Chef :show_db, :super, :create_tmp_table, :lock_tables, :execute, :repl_slave, :repl_client, :create_view, :show_view, :create_routine, :alter_routine, :create_user, :event, :trigger, :create_tablespace - ] + ].freeze DATABASE_PRIVILEGES = [ :select, :insert, :update, :delete, :create, :drop, :grant, :references, :index, :alter, :create_tmp_table, :lock_tables, :create_view, :show_view, :create_routine, :alter_routine, :execute, :event, :trigger - ] + ].freeze def execute(options) # Create argument array @@ -26,41 +26,39 @@ class Chef # Work out how to authenticate if options[:user] - args.push("--username=#{options[:user]}") - args.push("--password=#{options[:password]}") if options[:password] + args.push("--username") + args.push(options[:user]) + + if options[:password] + args.push("--password") + args.push(options[:password]) + end else args.push("--defaults-file=/etc/mysql/debian.cnf") end - # Build the other arguments - args.push("--execute=\"#{options[:command]}\"") if options[:command] + # Set output format + args.push("--xml") if options[:xml] - # Get the database to use - database = options[:database] || "mysql" - - # Build the command to run - command = "/usr/bin/mysql #{args.join(' ')} #{database}" + # Add any SQL command to execute + if options[:command] + args.push("--execute") + args.push(options[:command]) + end - # Escape backticks in the command - command.gsub!(/`/, "\\\\`") + # Add the database name + args.push(options[:database] || "mysql") # Run the command - run_command(:command => command, :user => "root", :group => "root") + shell_out!("/usr/bin/mysql", *args, :user => "root", :group => "root") end def query(sql, options = {}) - # Get the database to use - database = options[:database] || "mysql" - - # Construct the command string - command = "/usr/bin/mysql --defaults-file=/etc/mysql/debian.cnf --xml --execute='#{sql}' #{database}" - # Run the query - status, stdout, stderr = output_of_command(command, :user => "root", :group => "root") - handle_command_failures(status, "STDOUT: #{stdout}\nSTDERR: #{stderr}", :output_on_failure => true) + result = execute(options.merge(:command => sql, :xml => true)) # Parse the output - document = REXML::Document.new(stdout) + document = REXML::Document.new(result.stdout) # Create records = [] @@ -104,12 +102,14 @@ class Chef end query("SELECT * FROM db").each do |record| - if database = @databases[record[:db]] - user = "'#{record[:user]}'@'#{record[:host]}'" + database = @databases[record[:db]] + + next unless database + + user = "'#{record[:user]}'@'#{record[:host]}'" - database[:permissions][user] = DATABASE_PRIVILEGES.each_with_object([]) do |privilege, privileges| - privileges << privilege if record["#{privilege}_priv".to_sym] == "Y" - end + database[:permissions][user] = DATABASE_PRIVILEGES.each_with_object([]) do |privilege, privileges| + privileges << privilege if record["#{privilege}_priv".to_sym] == "Y" end end @@ -119,7 +119,7 @@ class Chef def canonicalise_user(user) local, host = user.split("@") - host = "%" unless host + host ||= "%" local = "'#{local}'" unless local =~ /^'.*'$/ host = "'#{host}'" unless host =~ /^'.*'$/