cloner 0.5.7 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 16802f5e33d2ec7ee1125de6181c768acf050e05
4
- data.tar.gz: 102b5732b777d4aa5c2a36d9cfed1be97dcf4be6
3
+ metadata.gz: dedfd02ba4a012b43cb0775bd2ec3cd563691415
4
+ data.tar.gz: 0607bccaae03a55e6fe60fa80e0fedc2883606ed
5
5
  SHA512:
6
- metadata.gz: ed39fa7e86356730b021924cda9e07f040e9e1108bfa57b32aa78eb9e26d6da82b65a99a6504c29a04ba53b198497bb2e48ccc4aa89e7c1356c4f5c438ebc13b
7
- data.tar.gz: 999f75fb8d067c7470ccb1d7f35a5a6511b1058bafa0c9d6d6b83bbe7357766af7b1a5f7f8c5a6944d59b12319283ee1cf6ae80c390e49a076089b753d3fbc24
6
+ metadata.gz: 4beb6a1618af270122ea5205029b49ad4ebe632f7451d7bfba0c280601cf39c96b26d32aa8a7f170fac0f49928766248d37185ae34aa53ffb8a52f1a813d1eab
7
+ data.tar.gz: 6ea9aaa455d224a9e82ba80bf2a2cfd19e21f4483c12eedd9b58cda2652af71c48e4f913d27c7d0121930ac80e332c832bcb3ddd79acc1f44b987cc5066fbe27
data/HISTORY.md ADDED
@@ -0,0 +1,3 @@
1
+ ### 0.6.0
2
+
3
+ Support MySQL
data/lib/cloner.rb CHANGED
@@ -1,10 +1,14 @@
1
1
  require "cloner/version"
2
2
  require 'thor'
3
3
  require 'active_support/concern'
4
- require "cloner/mongodb"
5
- require "cloner/postgres"
6
- require "cloner/ssh"
7
- require "cloner/rsync"
8
- require "cloner/internal"
9
- require "cloner/base"
4
+ module Cloner
5
+ autoload :Base, "cloner/base"
6
+ autoload :Internal, "cloner/internal"
7
+ autoload :Ar, "cloner/ar"
8
+ autoload :MongoDB, "cloner/mongodb"
9
+ autoload :Postgres, "cloner/postgres"
10
+ autoload :MySQL, "cloner/mysql"
11
+ autoload :SSH, "cloner/ssh"
12
+ autoload :RSync, "cloner/rsync"
13
+ end
10
14
 
data/lib/cloner/ar.rb ADDED
@@ -0,0 +1,50 @@
1
+ module Cloner::Ar
2
+ def ar_conf
3
+ @conf ||= begin
4
+ YAML.load_file(Rails.root.join('config', 'database.yml'))[Rails.env]
5
+ end
6
+ end
7
+
8
+ def ar_to
9
+ ar_conf['database']
10
+ end
11
+
12
+ def ar_r_conf
13
+ @ar_r_conf ||= begin
14
+ do_ssh do |ssh|
15
+ ret = ssh_exec!(ssh, "cat #{e(remote_app_path + '/config/database.yml')}")
16
+ check_ssh_err(ret)
17
+ begin
18
+ res = YAML.load(ret[0])[env_from]
19
+ raise 'no data' if res.blank?
20
+ #res['host'] ||= '127.0.0.1'
21
+ rescue Exception => e
22
+ puts "unable to read remote database.yml for env #{env_from}."
23
+ puts "Remote file contents:"
24
+ puts ret[0]
25
+ end
26
+ res
27
+ end
28
+ end
29
+ end
30
+
31
+ def clone_ar
32
+ if ar_conf["adapter"] != ar_r_conf["adapter"]
33
+ puts "Error: ActiveRecord adapter mismatch: local #{ar_conf["adapter"]}, remote #{ar_r_conf["adapter"]}"
34
+ puts "it is not possible to convert from one database to another via this tool."
35
+ exit
36
+ end
37
+
38
+ case ar_conf["adapter"]
39
+ when 'postgresql'
40
+ clone_pg
41
+ when 'mysql2'
42
+ clone_my
43
+ else
44
+ puts "unknown activerecord adapter: #{ar_conf["adapter"]}"
45
+ puts "currently supported adapters: mysql2, postgresql"
46
+ exit
47
+ end
48
+ end
49
+ end
50
+
@@ -1,7 +1,9 @@
1
1
  module Cloner::Internal
2
2
  extend ActiveSupport::Concern
3
3
  include Cloner::MongoDB
4
+ include Cloner::Ar
4
5
  include Cloner::Postgres
6
+ include Cloner::MySQL
5
7
  include Cloner::SSH
6
8
  include Cloner::RSync
7
9
 
@@ -27,7 +29,7 @@ module Cloner::Internal
27
29
  if defined?(Mongoid)
28
30
  clone_mongodb
29
31
  else
30
- clone_pg
32
+ clone_ar
31
33
  end
32
34
  end
33
35
  end
@@ -0,0 +1,77 @@
1
+ module Cloner::MySQL
2
+ def my_local_auth
3
+ if ar_conf['password'].blank?
4
+ ""
5
+ else
6
+ "--password='#{ar_conf['password']}'"
7
+ end
8
+ end
9
+
10
+ def my_remote_auth
11
+ if ar_r_conf['password'].blank?
12
+ ""
13
+ else
14
+ "--password='#{ar_r_conf['password']}'"
15
+ end
16
+ end
17
+
18
+ def my_dump_param
19
+ "--add-drop-table"
20
+ end
21
+
22
+ def my_restore_param
23
+ ""
24
+ end
25
+
26
+ def my_bin_path(util)
27
+ util
28
+ end
29
+
30
+ def my_dump_remote
31
+ puts "backup remote DB via ssh"
32
+ do_ssh do |ssh|
33
+ ssh.exec!("rm -R #{e remote_dump_path}")
34
+ ret = ssh_exec!(ssh, "mkdir -p #{e remote_dump_path}")
35
+ check_ssh_err(ret)
36
+ host = ar_r_conf['host'].present? ? " --host #{e ar_r_conf['host']}" : ""
37
+ port = ar_r_conf['port'].present? ? " --port #{e ar_r_conf['port']}" : ""
38
+ dump = "#{my_bin_path 'mysqldump'} #{my_dump_param} --user #{e ar_r_conf['username']} #{my_remote_auth}#{host}#{port} #{e ar_r_conf['database']} > #{e(remote_dump_path + '/cloner.sql')}"
39
+ puts dump if verbose?
40
+ ret = ssh_exec!(ssh, dump)
41
+ check_ssh_err(ret)
42
+ end
43
+ end
44
+
45
+ def my_dump_restore
46
+ puts "restoring DB"
47
+ host = ar_conf['host'].present? ? " -h #{e ar_conf['host']}" : ""
48
+ port = ar_conf['port'].present? ? " -p #{e ar_conf['port']}" : ""
49
+ restore = "#{my_bin_path 'mysql'} #{my_restore_param} --user #{e ar_conf['username']} #{my_local_auth}#{host}#{port} #{e ar_to} < #{e(my_path + '/cloner.sql')}"
50
+ puts restore if verbose?
51
+ pipe = IO.popen(restore)
52
+ while (line = pipe.gets)
53
+ print line if verbose?
54
+ end
55
+ ret = $?.to_i
56
+ if ret != 0
57
+ puts "Error: local command exited with #{ret}"
58
+ end
59
+ end
60
+
61
+ def my_path
62
+ Rails.root.join("tmp", "dump").to_s
63
+ end
64
+
65
+ def my_dump_copy
66
+ FileUtils.mkdir_p(my_path)
67
+ `mkdir -p #{e my_path}`
68
+ rsync(remote_dump_path + '/', my_path)
69
+ end
70
+
71
+ def clone_my
72
+ my_dump_remote()
73
+ my_dump_copy()
74
+ my_dump_restore()
75
+ end
76
+ end
77
+
@@ -1,37 +1,8 @@
1
1
  module Cloner::Postgres
2
2
  extend ActiveSupport::Concern
3
3
 
4
- def ar_conf
5
- @conf ||= begin
6
- YAML.load_file(Rails.root.join('config', 'database.yml'))[Rails.env]
7
- end
8
- end
9
-
10
- def ar_to
11
- ar_conf['database']
12
- end
13
-
14
- def ar_r_conf
15
- @ar_r_conf ||= begin
16
- do_ssh do |ssh|
17
- ret = ssh_exec!(ssh, "cat #{e(remote_app_path + '/config/database.yml')}")
18
- check_ssh_err(ret)
19
- begin
20
- res = YAML.load(ret[0])[env_from]
21
- raise 'no data' if res.blank?
22
- #res['host'] ||= '127.0.0.1'
23
- rescue Exception => e
24
- puts "unable to read remote database.yml for env #{env_from}."
25
- puts "Remote file contents:"
26
- puts ret[0]
27
- end
28
- res
29
- end
30
- end
31
- end
32
-
33
4
  def pg_local_auth
34
- if ar_conf['password'].nil?
5
+ if ar_conf['password'].blank?
35
6
  ""
36
7
  else
37
8
  "PGPASSWORD='#{ar_conf['password']}' "
@@ -39,7 +10,7 @@ module Cloner::Postgres
39
10
  end
40
11
 
41
12
  def pg_remote_auth
42
- if ar_r_conf['password'].nil?
13
+ if ar_r_conf['password'].blank?
43
14
  ""
44
15
  else
45
16
  "PGPASSWORD='#{ar_r_conf['password']}' "
@@ -50,6 +21,17 @@ module Cloner::Postgres
50
21
  ""
51
22
  end
52
23
 
24
+ def pg_dump_param
25
+ if pg_dump_extra != ""
26
+ puts "WARN pg_dump_extra is deprecated, use def pg_dump_param; super + ' extra'"
27
+ end
28
+ "-Fc #{pg_dump_extra}"
29
+ end
30
+
31
+ def pg_restore_param
32
+ "--no-owner -Fc -c"
33
+ end
34
+
53
35
  def pg_bin_path(util)
54
36
  util
55
37
  end
@@ -62,7 +44,7 @@ module Cloner::Postgres
62
44
  check_ssh_err(ret)
63
45
  host = ar_r_conf['host'].present? ? " -h #{e ar_r_conf['host']}" : ""
64
46
  port = ar_r_conf['port'].present? ? " -p #{e ar_r_conf['port']}" : ""
65
- dump = pg_remote_auth + "#{pg_bin_path 'pg_dump'} -Fc #{pg_dump_extra} -U #{e ar_r_conf['username']}#{host}#{port} #{e ar_r_conf['database']} > #{e(remote_dump_path + '/tmp.bak')}"
47
+ dump = pg_remote_auth + "#{pg_bin_path 'pg_dump'} #{pg_dump_param} -U #{e ar_r_conf['username']}#{host}#{port} #{e ar_r_conf['database']} > #{e(remote_dump_path + '/tmp.bak')}"
66
48
  puts dump if verbose?
67
49
  ret = ssh_exec!(ssh, dump)
68
50
  check_ssh_err(ret)
@@ -73,14 +55,14 @@ module Cloner::Postgres
73
55
  puts "restoring DB"
74
56
  host = ar_conf['host'].present? ? " -h #{e ar_conf['host']}" : ""
75
57
  port = ar_conf['port'].present? ? " -p #{e ar_conf['port']}" : ""
76
- restore = pg_local_auth + "#{pg_bin_path 'pg_restore'} --no-owner -Fc -c -U #{e ar_conf['username']}#{host}#{port} -d #{e ar_to} #{e(pg_path + '/tmp.bak')}"
58
+ restore = pg_local_auth + "#{pg_bin_path 'pg_restore'} #{pg_restore_param} -U #{e ar_conf['username']}#{host}#{port} -d #{e ar_to} #{e(pg_path + '/tmp.bak')}"
77
59
  puts restore if verbose?
78
60
  pipe = IO.popen(restore)
79
61
  while (line = pipe.gets)
80
62
  print line if verbose?
81
63
  end
82
64
  ret = $?.to_i
83
- if ret != 0
65
+ if ret != 0
84
66
  puts "Error: local command exited with #{ret}"
85
67
  end
86
68
  end
data/lib/cloner/rsync.rb CHANGED
@@ -10,7 +10,7 @@ module Cloner::RSync
10
10
  end
11
11
  pipe.close
12
12
  ret = $?.to_i
13
- if ret != 0
13
+ if ret != 0
14
14
  puts "Error: local command exited with #{ret}"
15
15
  end
16
16
  end
@@ -1,4 +1,4 @@
1
1
  module Cloner
2
- VERSION = "0.5.7"
2
+ VERSION = "0.6.0"
3
3
  end
4
4
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.7
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - glebtv
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-20 00:00:00.000000000 Z
11
+ date: 2017-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -91,14 +91,17 @@ files:
91
91
  - ".ruby-gemset"
92
92
  - ".ruby-version"
93
93
  - Gemfile
94
+ - HISTORY.md
94
95
  - LICENSE.txt
95
96
  - README.md
96
97
  - Rakefile
97
98
  - cloner.gemspec
98
99
  - lib/cloner.rb
100
+ - lib/cloner/ar.rb
99
101
  - lib/cloner/base.rb
100
102
  - lib/cloner/internal.rb
101
103
  - lib/cloner/mongodb.rb
104
+ - lib/cloner/mysql.rb
102
105
  - lib/cloner/postgres.rb
103
106
  - lib/cloner/rsync.rb
104
107
  - lib/cloner/ssh.rb
@@ -123,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
126
  version: '0'
124
127
  requirements: []
125
128
  rubyforge_project:
126
- rubygems_version: 2.5.2
129
+ rubygems_version: 2.6.8
127
130
  signing_key:
128
131
  specification_version: 4
129
132
  summary: Easily clone your production Mongoid database and files for local development