pg_export 0.6.1 → 0.7.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.
Files changed (79) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +9 -13
  3. data/.travis.yml +2 -2
  4. data/CHANGELOG.md +9 -0
  5. data/Gemfile +2 -0
  6. data/README.md +28 -29
  7. data/Rakefile +2 -0
  8. data/bin/console +2 -8
  9. data/bin/pg_export +44 -45
  10. data/lib/pg_export/build_logger.rb +4 -2
  11. data/lib/pg_export/configuration.rb +22 -2
  12. data/lib/pg_export/container.rb +48 -0
  13. data/lib/pg_export/import.rb +7 -0
  14. data/lib/pg_export/lib/pg_export/adapters/bash_adapter.rb +37 -0
  15. data/lib/pg_export/lib/pg_export/adapters/ftp_adapter.rb +67 -0
  16. data/lib/pg_export/lib/pg_export/entities/dump.rb +45 -0
  17. data/lib/pg_export/lib/pg_export/factories/cipher_factory.rb +32 -0
  18. data/lib/pg_export/lib/pg_export/factories/dump_factory.rb +31 -0
  19. data/lib/pg_export/lib/pg_export/factories/ftp_adapter_factory.rb +22 -0
  20. data/lib/pg_export/lib/pg_export/listeners/interactive/build_dump.rb +19 -0
  21. data/lib/pg_export/lib/pg_export/listeners/interactive/close_ftp_connection.rb +19 -0
  22. data/lib/pg_export/lib/pg_export/listeners/interactive/decrypt_dump.rb +19 -0
  23. data/lib/pg_export/lib/pg_export/listeners/interactive/download_dump_from_ftp.rb +19 -0
  24. data/lib/pg_export/lib/pg_export/listeners/interactive/encrypt_dump.rb +19 -0
  25. data/lib/pg_export/lib/pg_export/listeners/interactive/fetch_dumps_from_ftp.rb +19 -0
  26. data/lib/pg_export/lib/pg_export/listeners/interactive/open_ftp_connection.rb +19 -0
  27. data/lib/pg_export/lib/pg_export/listeners/interactive/remove_old_dumps_from_ftp.rb +23 -0
  28. data/lib/pg_export/lib/pg_export/listeners/interactive/restore.rb +19 -0
  29. data/lib/pg_export/lib/pg_export/listeners/interactive/upload_dump_to_ftp.rb +19 -0
  30. data/lib/pg_export/lib/pg_export/listeners/interactive_listener.rb +49 -0
  31. data/lib/pg_export/lib/pg_export/listeners/plain/build_dump.rb +15 -0
  32. data/lib/pg_export/lib/pg_export/listeners/plain/close_ftp_connection.rb +15 -0
  33. data/lib/pg_export/lib/pg_export/listeners/plain/decrypt_dump.rb +15 -0
  34. data/lib/pg_export/lib/pg_export/listeners/plain/download_dump_from_ftp.rb +15 -0
  35. data/lib/pg_export/lib/pg_export/listeners/plain/encrypt_dump.rb +15 -0
  36. data/lib/pg_export/lib/pg_export/listeners/plain/fetch_dumps_from_ftp.rb +15 -0
  37. data/lib/pg_export/lib/pg_export/listeners/plain/open_ftp_connection.rb +15 -0
  38. data/lib/pg_export/lib/pg_export/listeners/plain/remove_old_dumps_from_ftp.rb +17 -0
  39. data/lib/pg_export/lib/pg_export/listeners/plain/restore.rb +15 -0
  40. data/lib/pg_export/lib/pg_export/listeners/plain/upload_dump_to_ftp.rb +15 -0
  41. data/lib/pg_export/lib/pg_export/listeners/plain_listener.rb +17 -0
  42. data/lib/pg_export/lib/pg_export/operations/decrypt_dump.rb +20 -0
  43. data/lib/pg_export/lib/pg_export/operations/encrypt_dump.rb +18 -0
  44. data/lib/pg_export/lib/pg_export/operations/open_ftp_connection.rb +19 -0
  45. data/lib/pg_export/lib/pg_export/operations/remove_old_dumps_from_ftp.rb +22 -0
  46. data/lib/pg_export/lib/pg_export/repositories/ftp_dump_file_repository.rb +19 -0
  47. data/lib/pg_export/lib/pg_export/repositories/ftp_dump_repository.rb +36 -0
  48. data/lib/pg_export/lib/pg_export/transactions/export_dump.rb +56 -0
  49. data/lib/pg_export/lib/pg_export/transactions/import_dump_interactively.rb +67 -0
  50. data/lib/pg_export/lib/pg_export/types.rb +14 -0
  51. data/lib/pg_export/lib/pg_export/ui/interactive/input.rb +36 -0
  52. data/lib/pg_export/lib/pg_export/ui/plain/input.rb +17 -0
  53. data/lib/pg_export/lib/pg_export/value_objects/dump_file.rb +70 -0
  54. data/lib/pg_export/system/boot/config.rb +11 -0
  55. data/lib/pg_export/system/boot/interactive.rb +32 -0
  56. data/lib/pg_export/system/boot/logger.rb +15 -0
  57. data/lib/pg_export/system/boot/plain.rb +33 -0
  58. data/lib/pg_export/version.rb +3 -1
  59. data/lib/pg_export.rb +23 -20
  60. data/pg_export.gemspec +13 -10
  61. metadata +108 -52
  62. data/lib/pg_export/aes/base.rb +0 -47
  63. data/lib/pg_export/aes/decryptor.rb +0 -13
  64. data/lib/pg_export/aes/encryptor.rb +0 -13
  65. data/lib/pg_export/aes.rb +0 -3
  66. data/lib/pg_export/bash/adapter.rb +0 -31
  67. data/lib/pg_export/bash/factory.rb +0 -23
  68. data/lib/pg_export/bash/repository.rb +0 -18
  69. data/lib/pg_export/boot_container.rb +0 -69
  70. data/lib/pg_export/dump.rb +0 -62
  71. data/lib/pg_export/errors.rb +0 -5
  72. data/lib/pg_export/ftp/adapter.rb +0 -41
  73. data/lib/pg_export/ftp/connection.rb +0 -40
  74. data/lib/pg_export/ftp/repository.rb +0 -40
  75. data/lib/pg_export/roles/colourable_string.rb +0 -19
  76. data/lib/pg_export/roles/human_readable.rb +0 -17
  77. data/lib/pg_export/roles/interactive.rb +0 -98
  78. data/lib/pg_export/roles/validatable.rb +0 -24
  79. data/lib/pg_export/services/create_and_export_dump.rb +0 -20
metadata CHANGED
@@ -1,141 +1,169 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_export
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Krzysztof Maicher
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-21 00:00:00.000000000 Z
11
+ date: 2018-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: cli_spinnable
14
+ name: dry-initializer
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.2'
19
+ version: 2.5.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.2'
26
+ version: 2.5.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: dry-types
28
+ name: dry-system
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.11.1
33
+ version: 0.10.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.11.1
40
+ version: 0.10.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: dry-struct
42
+ name: dry-transaction
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.3.1
47
+ version: 0.13.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.3.1
54
+ version: 0.13.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: tty-prompt
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: tty-spinner
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: bundler
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
87
  - - "~>"
60
88
  - !ruby/object:Gem::Version
61
- version: '1.10'
89
+ version: '1.16'
62
90
  type: :development
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
66
94
  - - "~>"
67
95
  - !ruby/object:Gem::Version
68
- version: '1.10'
96
+ version: '1.16'
69
97
  - !ruby/object:Gem::Dependency
70
- name: rubocop
98
+ name: pg
71
99
  requirement: !ruby/object:Gem::Requirement
72
100
  requirements:
73
101
  - - "~>"
74
102
  - !ruby/object:Gem::Version
75
- version: '0.44'
103
+ version: '0.21'
76
104
  type: :development
77
105
  prerelease: false
78
106
  version_requirements: !ruby/object:Gem::Requirement
79
107
  requirements:
80
108
  - - "~>"
81
109
  - !ruby/object:Gem::Version
82
- version: '0.44'
110
+ version: '0.21'
83
111
  - !ruby/object:Gem::Dependency
84
- name: rake
112
+ name: pry
85
113
  requirement: !ruby/object:Gem::Requirement
86
114
  requirements:
87
- - - "~>"
115
+ - - ">="
88
116
  - !ruby/object:Gem::Version
89
- version: '10.0'
117
+ version: '0'
90
118
  type: :development
91
119
  prerelease: false
92
120
  version_requirements: !ruby/object:Gem::Requirement
93
121
  requirements:
94
- - - "~>"
122
+ - - ">="
95
123
  - !ruby/object:Gem::Version
96
- version: '10.0'
124
+ version: '0'
97
125
  - !ruby/object:Gem::Dependency
98
- name: rspec
126
+ name: rake
99
127
  requirement: !ruby/object:Gem::Requirement
100
128
  requirements:
101
129
  - - "~>"
102
130
  - !ruby/object:Gem::Version
103
- version: '3.4'
131
+ version: '10.0'
104
132
  type: :development
105
133
  prerelease: false
106
134
  version_requirements: !ruby/object:Gem::Requirement
107
135
  requirements:
108
136
  - - "~>"
109
137
  - !ruby/object:Gem::Version
110
- version: '3.4'
138
+ version: '10.0'
111
139
  - !ruby/object:Gem::Dependency
112
- name: pg
140
+ name: rspec
113
141
  requirement: !ruby/object:Gem::Requirement
114
142
  requirements:
115
143
  - - "~>"
116
144
  - !ruby/object:Gem::Version
117
- version: '0.19'
145
+ version: '3.4'
118
146
  type: :development
119
147
  prerelease: false
120
148
  version_requirements: !ruby/object:Gem::Requirement
121
149
  requirements:
122
150
  - - "~>"
123
151
  - !ruby/object:Gem::Version
124
- version: '0.19'
152
+ version: '3.4'
125
153
  - !ruby/object:Gem::Dependency
126
- name: pry
154
+ name: rubocop
127
155
  requirement: !ruby/object:Gem::Requirement
128
156
  requirements:
129
- - - ">="
157
+ - - "~>"
130
158
  - !ruby/object:Gem::Version
131
- version: '0'
159
+ version: 0.59.2
132
160
  type: :development
133
161
  prerelease: false
134
162
  version_requirements: !ruby/object:Gem::Requirement
135
163
  requirements:
136
- - - ">="
164
+ - - "~>"
137
165
  - !ruby/object:Gem::Version
138
- version: '0'
166
+ version: 0.59.2
139
167
  description: CLI for creating and exporting PostgreSQL dumps to FTP. Can
140
168
  be used for backups or synchronizing databases between production and development
141
169
  environments.
@@ -161,26 +189,54 @@ files:
161
189
  - bin/pg_export
162
190
  - bin/setup
163
191
  - lib/pg_export.rb
164
- - lib/pg_export/aes.rb
165
- - lib/pg_export/aes/base.rb
166
- - lib/pg_export/aes/decryptor.rb
167
- - lib/pg_export/aes/encryptor.rb
168
- - lib/pg_export/bash/adapter.rb
169
- - lib/pg_export/bash/factory.rb
170
- - lib/pg_export/bash/repository.rb
171
- - lib/pg_export/boot_container.rb
172
192
  - lib/pg_export/build_logger.rb
173
193
  - lib/pg_export/configuration.rb
174
- - lib/pg_export/dump.rb
175
- - lib/pg_export/errors.rb
176
- - lib/pg_export/ftp/adapter.rb
177
- - lib/pg_export/ftp/connection.rb
178
- - lib/pg_export/ftp/repository.rb
179
- - lib/pg_export/roles/colourable_string.rb
180
- - lib/pg_export/roles/human_readable.rb
181
- - lib/pg_export/roles/interactive.rb
182
- - lib/pg_export/roles/validatable.rb
183
- - lib/pg_export/services/create_and_export_dump.rb
194
+ - lib/pg_export/container.rb
195
+ - lib/pg_export/import.rb
196
+ - lib/pg_export/lib/pg_export/adapters/bash_adapter.rb
197
+ - lib/pg_export/lib/pg_export/adapters/ftp_adapter.rb
198
+ - lib/pg_export/lib/pg_export/entities/dump.rb
199
+ - lib/pg_export/lib/pg_export/factories/cipher_factory.rb
200
+ - lib/pg_export/lib/pg_export/factories/dump_factory.rb
201
+ - lib/pg_export/lib/pg_export/factories/ftp_adapter_factory.rb
202
+ - lib/pg_export/lib/pg_export/listeners/interactive/build_dump.rb
203
+ - lib/pg_export/lib/pg_export/listeners/interactive/close_ftp_connection.rb
204
+ - lib/pg_export/lib/pg_export/listeners/interactive/decrypt_dump.rb
205
+ - lib/pg_export/lib/pg_export/listeners/interactive/download_dump_from_ftp.rb
206
+ - lib/pg_export/lib/pg_export/listeners/interactive/encrypt_dump.rb
207
+ - lib/pg_export/lib/pg_export/listeners/interactive/fetch_dumps_from_ftp.rb
208
+ - lib/pg_export/lib/pg_export/listeners/interactive/open_ftp_connection.rb
209
+ - lib/pg_export/lib/pg_export/listeners/interactive/remove_old_dumps_from_ftp.rb
210
+ - lib/pg_export/lib/pg_export/listeners/interactive/restore.rb
211
+ - lib/pg_export/lib/pg_export/listeners/interactive/upload_dump_to_ftp.rb
212
+ - lib/pg_export/lib/pg_export/listeners/interactive_listener.rb
213
+ - lib/pg_export/lib/pg_export/listeners/plain/build_dump.rb
214
+ - lib/pg_export/lib/pg_export/listeners/plain/close_ftp_connection.rb
215
+ - lib/pg_export/lib/pg_export/listeners/plain/decrypt_dump.rb
216
+ - lib/pg_export/lib/pg_export/listeners/plain/download_dump_from_ftp.rb
217
+ - lib/pg_export/lib/pg_export/listeners/plain/encrypt_dump.rb
218
+ - lib/pg_export/lib/pg_export/listeners/plain/fetch_dumps_from_ftp.rb
219
+ - lib/pg_export/lib/pg_export/listeners/plain/open_ftp_connection.rb
220
+ - lib/pg_export/lib/pg_export/listeners/plain/remove_old_dumps_from_ftp.rb
221
+ - lib/pg_export/lib/pg_export/listeners/plain/restore.rb
222
+ - lib/pg_export/lib/pg_export/listeners/plain/upload_dump_to_ftp.rb
223
+ - lib/pg_export/lib/pg_export/listeners/plain_listener.rb
224
+ - lib/pg_export/lib/pg_export/operations/decrypt_dump.rb
225
+ - lib/pg_export/lib/pg_export/operations/encrypt_dump.rb
226
+ - lib/pg_export/lib/pg_export/operations/open_ftp_connection.rb
227
+ - lib/pg_export/lib/pg_export/operations/remove_old_dumps_from_ftp.rb
228
+ - lib/pg_export/lib/pg_export/repositories/ftp_dump_file_repository.rb
229
+ - lib/pg_export/lib/pg_export/repositories/ftp_dump_repository.rb
230
+ - lib/pg_export/lib/pg_export/transactions/export_dump.rb
231
+ - lib/pg_export/lib/pg_export/transactions/import_dump_interactively.rb
232
+ - lib/pg_export/lib/pg_export/types.rb
233
+ - lib/pg_export/lib/pg_export/ui/interactive/input.rb
234
+ - lib/pg_export/lib/pg_export/ui/plain/input.rb
235
+ - lib/pg_export/lib/pg_export/value_objects/dump_file.rb
236
+ - lib/pg_export/system/boot/config.rb
237
+ - lib/pg_export/system/boot/interactive.rb
238
+ - lib/pg_export/system/boot/logger.rb
239
+ - lib/pg_export/system/boot/plain.rb
184
240
  - lib/pg_export/version.rb
185
241
  - pg_export.gemspec
186
242
  homepage: https://github.com/maicher/pg_export
@@ -195,7 +251,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
195
251
  requirements:
196
252
  - - ">="
197
253
  - !ruby/object:Gem::Version
198
- version: 2.2.0
254
+ version: 2.3.0
199
255
  required_rubygems_version: !ruby/object:Gem::Requirement
200
256
  requirements:
201
257
  - - ">="
@@ -203,7 +259,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
203
259
  version: '0'
204
260
  requirements: []
205
261
  rubyforge_project:
206
- rubygems_version: 2.4.8
262
+ rubygems_version: 2.7.3
207
263
  signing_key:
208
264
  specification_version: 4
209
265
  summary: CLI for creating and exporting PostgreSQL dumps to FTP.
@@ -1,47 +0,0 @@
1
- require 'openssl'
2
- require 'pg_export/dump'
3
-
4
- class PgExport
5
- module Aes
6
- class Base
7
- ALGORITHM = 'AES-128-CBC'.freeze
8
-
9
- def initialize(key:, logger:)
10
- @key, @logger = key, logger
11
- end
12
-
13
- def call(source_dump)
14
- target_dump = Dump.new(name: target_dump_name, db_name: source_dump.db_name)
15
- copy(from: source_dump, to: target_dump)
16
- logger.info "Create #{target_dump}"
17
- target_dump
18
- end
19
-
20
- private
21
-
22
- attr_reader :key, :logger
23
-
24
- def copy(from:, to:)
25
- cipher.reset
26
- to.open(:write) do |f|
27
- from.each_chunk do |chunk|
28
- f << cipher.update(chunk)
29
- end
30
- f << cipher.final
31
- end
32
- self
33
- end
34
-
35
- def cipher
36
- @cipher ||= build_cipher
37
- end
38
-
39
- def build_cipher
40
- OpenSSL::Cipher.new(ALGORITHM).tap do |cipher|
41
- cipher.public_send(cipher_type)
42
- cipher.key = key
43
- end
44
- end
45
- end
46
- end
47
- end
@@ -1,13 +0,0 @@
1
- class PgExport
2
- module Aes
3
- class Decryptor < Base
4
- def target_dump_name
5
- 'Dump'.freeze
6
- end
7
-
8
- def cipher_type
9
- :decrypt
10
- end
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- class PgExport
2
- module Aes
3
- class Encryptor < Base
4
- def target_dump_name
5
- 'Encrypted Dump'.freeze
6
- end
7
-
8
- def cipher_type
9
- :encrypt
10
- end
11
- end
12
- end
13
- end
data/lib/pg_export/aes.rb DELETED
@@ -1,3 +0,0 @@
1
- require_relative 'aes/base'
2
- require_relative 'aes/encryptor'
3
- require_relative 'aes/decryptor'
@@ -1,31 +0,0 @@
1
- require 'open3'
2
- require 'pg_export/errors'
3
-
4
- class PgExport
5
- module Bash
6
- class Adapter
7
- def get(path, db_name)
8
- popen("pg_dump -Fc --file #{path} #{db_name}") do |errors|
9
- raise PgDumpError, errors unless errors.empty?
10
- end
11
- end
12
-
13
- def persist(path, db_name)
14
- popen("pg_restore -c -d #{db_name} #{path}") do |errors|
15
- raise PgRestoreError, errors if /FATAL/ =~ errors
16
- end
17
- end
18
-
19
- private
20
-
21
- def popen(command)
22
- Open3.popen3(command) do |_, _, err|
23
- errors = err.read
24
- yield errors
25
- end
26
-
27
- self
28
- end
29
- end
30
- end
31
- end
@@ -1,23 +0,0 @@
1
- require 'open3'
2
- require 'pg_export/dump'
3
-
4
- class PgExport
5
- module Bash
6
- class Factory
7
- def initialize(adapter:, logger:)
8
- @adapter, @logger = adapter, logger
9
- end
10
-
11
- def build_dump(db_name)
12
- dump = Dump.new(name: 'Dump', db_name: db_name)
13
- adapter.get(dump.path, dump.db_name)
14
- logger.info "Create #{dump}"
15
- dump
16
- end
17
-
18
- private
19
-
20
- attr_reader :adapter, :logger
21
- end
22
- end
23
- end
@@ -1,18 +0,0 @@
1
- class PgExport
2
- module Bash
3
- class Repository
4
- def initialize(adapter:, logger:)
5
- @adapter, @logger = adapter, logger
6
- end
7
-
8
- def persist(dump, db_name)
9
- adapter.persist(dump.path, db_name)
10
- logger.info "Persist #{dump} #{db_name} to #{adapter}"
11
- end
12
-
13
- private
14
-
15
- attr_reader :adapter, :logger
16
- end
17
- end
18
- end
@@ -1,69 +0,0 @@
1
- require_relative 'build_logger'
2
- require_relative 'ftp/adapter'
3
- require_relative 'ftp/connection'
4
- require_relative 'ftp/repository'
5
- require_relative 'bash/adapter'
6
- require_relative 'bash/repository'
7
- require_relative 'bash/factory'
8
- require_relative 'aes'
9
- require_relative 'services/create_and_export_dump'
10
-
11
- class PgExport
12
- class BootContainer
13
- class << self
14
- def call(config)
15
- container = {}
16
-
17
- boot_logger(container, config)
18
- boot_aes(container, config)
19
- boot_ftp(container, config)
20
- boot_bash(container)
21
- boot_services(container)
22
-
23
- container
24
- end
25
-
26
- private
27
-
28
- def boot_logger(container, config)
29
- container[:logger] = BuildLogger.call(stream: $stdout, format: config[:logger_format])
30
- end
31
-
32
- def boot_aes(container, config)
33
- container[:encryptor] = Aes::Encryptor.new(key: config[:dump_encryption_key], logger: container[:logger])
34
- container[:decryptor] = Aes::Decryptor.new(key: config[:dump_encryption_key], logger: container[:logger])
35
- end
36
-
37
- def boot_ftp(container, config)
38
- container[:ftp_connection] = Ftp::Connection.new(
39
- host: config[:ftp_host],
40
- user: config[:ftp_user],
41
- password: config[:ftp_password],
42
- logger: container[:logger]
43
- )
44
- container[:ftp_adapter] = Ftp::Adapter.new(connection: container[:ftp_connection])
45
- container[:ftp_repository] = Ftp::Repository.new(adapter: container[:ftp_adapter], logger: container[:logger])
46
- end
47
-
48
- def boot_bash(container)
49
- container[:bash_adapter] = Bash::Adapter.new
50
- container[:bash_repository] = Bash::Repository.new(
51
- adapter: container[:bash_adapter],
52
- logger: container[:logger]
53
- )
54
- container[:bash_factory] = Bash::Factory.new(
55
- adapter: container[:bash_adapter],
56
- logger: container[:logger]
57
- )
58
- end
59
-
60
- def boot_services(container)
61
- container[:create_and_export_dump] = Services::CreateAndExportDump.new(
62
- bash_factory: container[:bash_factory],
63
- encryptor: container[:encryptor],
64
- ftp_repository: container[:ftp_repository]
65
- )
66
- end
67
- end
68
- end
69
- end
@@ -1,62 +0,0 @@
1
- require 'forwardable'
2
- require 'tempfile'
3
-
4
- require_relative 'roles/human_readable'
5
-
6
- class PgExport
7
- class Dump
8
- TIMESTAMP = '_%Y%m%d_%H%M%S'.freeze
9
-
10
- extend Forwardable
11
- include Roles::HumanReadable
12
-
13
- CHUNK_SIZE = (2**16).freeze
14
-
15
- def_delegators :file, :path, :read, :write, :<<, :rewind, :close, :size, :eof?
16
-
17
- attr_reader :name, :db_name
18
-
19
- def initialize(name:, db_name:)
20
- @name, @db_name = name, db_name
21
- @timestamp = Time.now.strftime(TIMESTAMP)
22
- end
23
-
24
- def ext
25
- ''
26
- end
27
-
28
- def open(operation_type, &block)
29
- case operation_type.to_sym
30
- when :read then File.open(path, 'r', &block)
31
- when :write then File.open(path, 'w', &block)
32
- else raise ArgumentError, 'Operation type can be only :read or :write'
33
- end
34
- end
35
-
36
- def each_chunk
37
- open(:read) do |file|
38
- yield file.read(CHUNK_SIZE) until file.eof?
39
- end
40
- end
41
-
42
- def timestamped_name
43
- db_name + timestamp + ext
44
- end
45
-
46
- def to_s
47
- "#{name} (#{size_human})"
48
- end
49
-
50
- private
51
-
52
- attr_reader :timestamp
53
-
54
- def file
55
- @file ||= Tempfile.new(file_name)
56
- end
57
-
58
- def file_name
59
- name.downcase.gsub(/[^0-9a-z]/, '_')
60
- end
61
- end
62
- end
@@ -1,5 +0,0 @@
1
- class PgExport
2
- class PgExportError < StandardError; end
3
- class PgRestoreError < PgExportError; end
4
- class PgDumpError < PgExportError; end
5
- end
@@ -1,41 +0,0 @@
1
- class PgExport
2
- module Ftp
3
- class Adapter
4
- CHUNK_SIZE = (2**16).freeze
5
-
6
- def initialize(connection:)
7
- @connection = connection
8
- @host = connection.host
9
- ObjectSpace.define_finalizer(self, proc { connection.close })
10
- end
11
-
12
- def list(regex_string)
13
- ftp.list(regex_string).map { |item| item.split(' ').last }.sort.reverse
14
- end
15
-
16
- def delete(filename)
17
- ftp.delete(filename)
18
- end
19
-
20
- def persist(path, timestamped_name)
21
- ftp.putbinaryfile(path, timestamped_name, CHUNK_SIZE)
22
- end
23
-
24
- def get(path, timestamped_name)
25
- ftp.getbinaryfile(timestamped_name, path, CHUNK_SIZE)
26
- end
27
-
28
- def ftp
29
- connection.ftp
30
- end
31
-
32
- def to_s
33
- host
34
- end
35
-
36
- private
37
-
38
- attr_reader :connection, :host
39
- end
40
- end
41
- end
@@ -1,40 +0,0 @@
1
- require 'net/ftp'
2
-
3
- class PgExport
4
- module Ftp
5
- class Connection
6
- attr_reader :host
7
-
8
- def initialize(host:, user:, password:, logger:)
9
- @host, @user, @password, @logger = host, user, password, logger
10
- open_ftp_thread
11
- end
12
-
13
- def ftp
14
- open_ftp_thread.join
15
- @ftp
16
- end
17
-
18
- def close
19
- ftp.close
20
- logger.info 'Close FTP'
21
- self
22
- end
23
-
24
- private
25
-
26
- attr_reader :user, :password, :logger
27
-
28
- def open
29
- @ftp = Net::FTP.new(host, user, password)
30
- @ftp.passive = true
31
- logger.info "Connect to #{host}"
32
- self
33
- end
34
-
35
- def open_ftp_thread
36
- @open_ftp_thread ||= Thread.new { open }
37
- end
38
- end
39
- end
40
- end