124 lines
2.9 KiB
Ruby
Executable File
124 lines
2.9 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
# This Source Code Form is subject to the terms of the Mozilla Public License,
|
|
# v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
|
# obtain one at https://mozilla.org/MPL/2.0/.
|
|
|
|
# frozen_string_literal: true
|
|
|
|
require 'pathname'
|
|
require 'mysql2'
|
|
require 'optparse'
|
|
require 'json'
|
|
require 'term/ansicolor'
|
|
|
|
# Tool for easy updating a local copy of a website
|
|
|
|
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
|
|
|
|
def copy_db(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
|
|
|
|
class CommandOptions
|
|
attr_reader :root, :dump
|
|
|
|
def []=(key, value)
|
|
case key
|
|
when :root
|
|
@root = Pathname.new value
|
|
when :dump
|
|
@dump = Pathname.new value
|
|
end
|
|
end
|
|
|
|
def valid?
|
|
!@root.nil? && !@dump.nil?
|
|
end
|
|
end
|
|
|
|
def wordpress
|
|
arguments = CommandOptions.new
|
|
option_parser = OptionParser.new do |options|
|
|
options.banner = "Usage: #{File.basename $0} [OPTIONS] (wordpress)"
|
|
|
|
options.on '--root=ROOT', 'Website configuration directory'
|
|
options.on '--dump=DUMP', 'Database file'
|
|
end
|
|
|
|
option_parser.parse!(into: arguments)
|
|
unless arguments.valid?
|
|
$stderr.puts option_parser.help
|
|
exit 2
|
|
end
|
|
|
|
wp_settings = Pathname.new('locopy/wp-settings.php').realpath
|
|
wp_config = nil
|
|
|
|
Dir.chdir arguments.root do
|
|
wp_config = JSON.parse `php #{wp_settings}`
|
|
end
|
|
|
|
copy_db wp_config
|
|
end
|
|
|
|
# Check for supported command.
|
|
command = ARGV.shift
|
|
case command
|
|
when 'wordpress'
|
|
wordpress
|
|
when nil
|
|
Kernel.abort Term::ANSIColor.red "No command given at the command line."
|
|
else
|
|
Kernel.abort Term::ANSIColor.red %Q(Unsupported command "#{command}".)
|
|
end
|