Add locopy
This commit is contained in:
8
locopy/Gemfile
Normal file
8
locopy/Gemfile
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
||||||
|
|
||||||
|
gem 'mysql2', '~> 0.5'
|
||||||
|
gem 'optparse', '~> 0.8.0'
|
||||||
18
locopy/Gemfile.lock
Normal file
18
locopy/Gemfile.lock
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
GEM
|
||||||
|
remote: https://rubygems.org/
|
||||||
|
specs:
|
||||||
|
bigdecimal (3.3.1)
|
||||||
|
mysql2 (0.5.7)
|
||||||
|
bigdecimal
|
||||||
|
optparse (0.8.0)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
arm64-darwin-24
|
||||||
|
x86_64-linux
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
mysql2 (~> 0.5)
|
||||||
|
optparse (~> 0.8.0)
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
2.6.9
|
||||||
102
locopy/bin/locopy.rb
Executable file
102
locopy/bin/locopy.rb
Executable file
@@ -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
|
||||||
12
locopy/wp-settings.php
Normal file
12
locopy/wp-settings.php
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
define('ABSPATH', __DIR__ . '/');
|
||||||
|
|
||||||
|
require_once 'wp-config.php';
|
||||||
|
|
||||||
|
echo json_encode([
|
||||||
|
'DB_NAME' => DB_NAME,
|
||||||
|
'DB_USER' => DB_USER,
|
||||||
|
'DB_PASSWORD' => DB_PASSWORD,
|
||||||
|
'DB_HOST' => DB_HOST,
|
||||||
|
'table_prefix' => $table_prefix
|
||||||
|
]);
|
||||||
Reference in New Issue
Block a user