diff options
Diffstat (limited to 'locopy/bin')
| -rwxr-xr-x | locopy/bin/locopy.rb | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/locopy/bin/locopy.rb b/locopy/bin/locopy.rb new file mode 100755 index 0000000..933789b --- /dev/null +++ b/locopy/bin/locopy.rb @@ -0,0 +1,102 @@ +#!/usr/bin/env ruby + +require 'pathname' +require 'mysql2' +require 'optparse' +require 'json' + +# Tool for easy updating a local copy of a website + +arguments = {} +option_parser = OptionParser.new do |options| + options.banner = "Usage: #{File.basename $0} [OPTIONS] (wordpress)" + + options.on '--root=ROOT', 'Website configuration directory' do |option| + arguments[:root] = Pathname.new option + end + options.on '--dump=DUMP', 'Database file' do |option| + arguments[:root] = Pathname.new option + end +end + +option_parser.parse! + +# Read arguments +while argument = ARGV.shift do + case argument + when 'wordpress' + ENV['CMD'] = argument + end +end + +class DatabaseAccess + attr_accessor :name, :user, :password + attr_reader :host, :socket, :port + + def initialize(wp_config) + @name = wp_config['DB_NAME'] + @user = wp_config['DB_USER'] + @password = wp_config['DB_PASSWORD'] + + self.host = wp_config['DB_HOST'] + end + + def host=(host) + host_part, socket_part = host.split(':') + port = socket_part.to_i + + @host = host_part + if port == 0 + @socket = socket_part + else + @port = port + end + end +end + +wp_settings = Pathname.new('wp-settings.php').realpath +wp_config = nil + +Dir.chdir arguments[:root] do + wp_config = JSON.parse `php #{wp_settings}` +end + +def copy_db(root, wp_config) + table_prefix = wp_config['table_prefix'] + php_constants = DatabaseAccess.new wp_config + keep_option_names = ['siteurl', 'home'] + + client = Mysql2::Client.new host: php_constants.host, username: php_constants.user, + password: php_constants.password, database: php_constants.name, socket: php_constants.socket + statement = client.prepare <<~SQL + SELECT option_name, option_value + FROM #{table_prefix}options + WHERE option_name LIKE ? + SQL + keep_option_values = keep_option_names.each_with_object({}) do |keep_option_name, accumulator| + accumulator[keep_option_name] = statement.execute(keep_option_name).first['option_value'] + accumulator + end + keep_option_values = { + "siteurl"=>"http://localhost:8083", + "home"=>"http://localhost:8083" + } + + statement = client.prepare <<~SQL + UPDATE #{table_prefix}options + SET option_value = ? + WHERE option_name LIKE ? + SQL + keep_option_values.each_pair do |name, value| + statement.execute(value, name) + end +end + +case ENV['CMD'] +when 'wordpress' + # Set permissions + copy_db(arguments[:root], wp_config) +else + puts option_parser.help + exit 1 +end |
