pg_export 1.0.0.rc3 → 1.0.0.rc4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -0
  3. data/README.md +1 -1
  4. data/bin/pg_export +39 -30
  5. data/lib/pg_export.rb +5 -13
  6. data/lib/pg_export/configuration.rb +14 -10
  7. data/lib/pg_export/container.rb +4 -38
  8. data/lib/pg_export/lib/pg_export/factories/cipher_factory.rb +7 -10
  9. data/lib/pg_export/lib/pg_export/gateways/ssh.rb +6 -5
  10. data/lib/pg_export/lib/pg_export/listeners/interactive/{download_dump_from_ftp.rb → download_dump.rb} +1 -1
  11. data/lib/pg_export/lib/pg_export/listeners/interactive/{fetch_dumps_from_ftp.rb → fetch_dumps.rb} +1 -1
  12. data/lib/pg_export/lib/pg_export/listeners/interactive/open_connection.rb +1 -1
  13. data/lib/pg_export/lib/pg_export/listeners/interactive/{remove_old_dumps_from_ftp.rb → remove_old_dumps.rb} +1 -1
  14. data/lib/pg_export/lib/pg_export/listeners/interactive/{upload_dump_to_ftp.rb → upload_dump.rb} +1 -1
  15. data/lib/pg_export/lib/pg_export/listeners/plain/{download_dump_from_ftp.rb → download_dump.rb} +1 -1
  16. data/lib/pg_export/lib/pg_export/listeners/plain/{fetch_dumps_from_ftp.rb → fetch_dumps.rb} +1 -1
  17. data/lib/pg_export/lib/pg_export/listeners/plain/{remove_old_dumps_from_ftp.rb → remove_old_dumps.rb} +1 -1
  18. data/lib/pg_export/lib/pg_export/listeners/plain/{upload_dump_to_ftp.rb → upload_dump.rb} +1 -1
  19. data/lib/pg_export/lib/pg_export/operations/{remove_old_dumps_from_ftp.rb → remove_old_dumps.rb} +1 -1
  20. data/lib/pg_export/lib/pg_export/transactions/export_dump.rb +3 -3
  21. data/lib/pg_export/lib/pg_export/transactions/import_dump_interactively.rb +4 -4
  22. data/lib/pg_export/system/boot/config.rb +17 -1
  23. data/lib/pg_export/system/boot/ftp.rb +11 -0
  24. data/lib/pg_export/system/boot/interactive.rb +3 -9
  25. data/lib/pg_export/system/boot/operations.rb +17 -0
  26. data/lib/pg_export/system/boot/plain.rb +3 -9
  27. data/lib/pg_export/system/boot/ssh.rb +11 -0
  28. data/lib/pg_export/version.rb +1 -1
  29. data/pg_export.gemspec +3 -3
  30. metadata +28 -27
  31. data/lib/pg_export/build_logger.rb +0 -21
  32. data/lib/pg_export/system/boot/logger.rb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 97c43da7e8d06b79d2a09c0d4f41f7a9ffcb7766ec3129f8fa7323147af23b28
4
- data.tar.gz: 4bcf143f440f6ffbcce3b456d6afa9e4d84f05d545aaa2199706931c757068c8
3
+ metadata.gz: d0f62f09db68ae3716d4ae83fea7780240cc66af83d7cbe813cd5d2e7bfae3e7
4
+ data.tar.gz: 0f80f6ad47217232ec83877f4bfc1b15c62a248e214229a9a6444bdecee61f44
5
5
  SHA512:
6
- metadata.gz: 39acecf631b54e5216e65b3d8db6f13fbd0dc3042bf1a86ecc85d3edfd774a83fed62784d99f85859436661763ffab59ab1b94072fb51bad35a47ea581b77840
7
- data.tar.gz: f7d2bce1bdc045fad6841806c195ff1c7385f5fc516a9af3933e2260f62f6cc4efbbeca1321ac1a75b794ed45e57dc900a0967897672e5e00ec602705c5f39cb
6
+ metadata.gz: ecb017891a15fd94e15eef06972066655f13aeff22a4030ea840dc1ff2df6dd00451b2c7eb2e1dad248f95bc27b63d56cfe6275f675c0f2a2be6ab6f0ad7bdcd
7
+ data.tar.gz: e89de78f4a3a3d804f3ee82573fd97d03154a8f792f3e1a63a52f475798a091e96d0fc556e4dabbe8aa3c37497a7ae69c743a232e7bdd8a3a19d70547468df69
data/CHANGELOG.md CHANGED
@@ -7,6 +7,7 @@
7
7
  - DUMP_ENCRYPTION_KEY -> PG_EXPORT_ENCRYPTION_KEY
8
8
  - Drop Ruby 2.3 support
9
9
  - Add SSH option
10
+ - Add +encryption_algorith+ moption to interface
10
11
 
11
12
  ### 0.7.7 - 2020.09.07
12
13
 
data/README.md CHANGED
@@ -87,7 +87,7 @@ Note, that variables cannot include `#` sign, [more info](http://serverfault.com
87
87
  __Step 2.__ Print the configuration to verify if env variables has been loaded properly.
88
88
 
89
89
  $ pg_export --configuration
90
- => {:dump_encryption_key=>"k4***", :gateway_host=>"yourftp.example.com", :gateway_user=>"your_gateway_user",
90
+ => {:encryption_key=>"k4***", :gateway_host=>"yourftp.example.com", :gateway_user=>"your_gateway_user",
91
91
  :gateway_password=>"pass***", :logger_format=>"plain", :keep_dumps=>2}
92
92
 
93
93
  __Step 3.__ Try connecting to FTP to verify the connection.
data/bin/pg_export CHANGED
@@ -7,30 +7,33 @@ require 'pg_export'
7
7
 
8
8
  ENV['KEEP_DUMPS'] = ENV['KEEP_DUMPS'] || '10'
9
9
  ENV['GATEWAY'] = 'ftp'
10
+ ENV['PG_EXPORT_MODE'] = 'plain'
11
+ ENV['PG_EXPORT_ENCRYPTION_ALGORITHM'] = 'AES-128-CBC'
10
12
 
11
- interactive = false
12
13
  database = nil
13
14
 
14
-
15
15
  option_parser = OptionParser.new do |opts|
16
16
  opts.banner = <<~TXT
17
- NAME
18
- pg_export - CLI for exporting/importing PostgreSQL dumps via FTP/SSH
17
+ NAME
18
+ pg_export - CLI for exporting/importing PostgreSQL dumps via FTP/SSH
19
19
 
20
- SYNOPSIS (default mode)
21
- pg_export DATABASE [options]
20
+ SYNOPSIS (default mode)
21
+ pg_export DATABASE [options]
22
22
 
23
- SYNOPSIS (interactive mode)
24
- pg_export --interactive [DATABASE] [options]
23
+ SYNOPSIS (interactive mode)
24
+ pg_export --interactive [DATABASE] [options]
25
25
 
26
- ARGUMENTS
27
- DATABASE - database name to export (when default mode)
28
- - phrase to filter database dumps by (when interactive mode)
26
+ ARGUMENTS
27
+ DATABASE - database name to export (when default mode)
28
+ - phrase to filter database dumps by (when interactive mode)
29
29
 
30
- OPTIONS
30
+ OPTIONS
31
31
  TXT
32
32
 
33
- opts.on('-g', '--gateway GATEWAY', String, 'ssh or ftp (default: ftp) - credentials need to be set via ENVs') do |g|
33
+ opts.program_name = 'pg_export'
34
+ opts.version = PgExport::VERSION
35
+
36
+ opts.on('-g', '--gateway GATEWAY', %w[ftp ssh], 'Allowed values: ftp, ssh. Default: ftp. Credentials need to be set via ENVs') do |g|
34
37
  ENV['GATEWAY'] = g
35
38
  end
36
39
 
@@ -46,11 +49,15 @@ OPTIONS
46
49
  database = d
47
50
  end
48
51
 
49
- opts.on('-e', '--encryption_key KEY', String, 'Dumps will be SSL(AES-128-CBC) encrypted using this key. Should have exactly 16 characters. Overwrites PG_EXPORT_ENCRYPTION_KEY env') do |key|
52
+ opts.on('-e', '--encryption_key KEY', String, 'Dumps will be SSL encrypted using this key. Should have exactly 16 characters. Overwrites PG_EXPORT_ENCRYPTION_KEY env') do |key|
50
53
  ENV['PG_EXPORT_ENCRYPTION_KEY'] = key
51
54
  end
52
55
 
53
- opts.on('-k', '--keep KEEP', String, "Number of dump files to keep on FTP (default: 10). Overwrites KEEP_DUMPS env") do |keep|
56
+ opts.on('-a', '--algorithm ALGORITHM', String, 'Encryption cipher algorithm (default: AES-128-CBC). Overwrites PG_EXPORT_ENCRYPTION_ALGORITHM env. For available option see `$ openssl list -cipher-algorithms`') do |key|
57
+ ENV['PG_EXPORT_ENCRYPTION_KEY'] = key
58
+ end
59
+
60
+ opts.on('-k', '--keep KEEP', String, 'Number of dump files to keep on FTP (default: 10). Overwrites KEEP_DUMPS env') do |keep|
54
61
  ENV['KEEP_DUMPS'] = keep
55
62
  end
56
63
 
@@ -63,7 +70,7 @@ OPTIONS
63
70
  end
64
71
 
65
72
  opts.on('-i', '--interactive', 'Interactive mode, for importing dumps') do
66
- interactive = true
73
+ ENV['PG_EXPORT_MODE'] = 'interactive'
67
74
  end
68
75
 
69
76
  opts.on('-v', '--version', 'Show version') do
@@ -78,11 +85,12 @@ OPTIONS
78
85
 
79
86
  opts.separator <<~TXT
80
87
 
81
- ENV
82
- PG_EXPORT_GATEWAY_HOST required
83
- PG_EXPORT_GATEWAY_USER required
84
- PG_EXPORT_GATEWAY_PASSWORD optional when eg. authorized key is added
85
- PG_EXPORT_ENCRYPTION_KEY required or set by --encryption_key)
88
+ ENV
89
+ PG_EXPORT_GATEWAY_HOST required
90
+ PG_EXPORT_GATEWAY_USER required
91
+ PG_EXPORT_GATEWAY_PASSWORD optional when eg. authorized key is added
92
+ PG_EXPORT_ENCRYPTION_KEY required or set by --encryption_key)
93
+ PG_EXPORT_ENCRYPTION_ALGORITHM required or set by --algorithm)
86
94
  TXT
87
95
 
88
96
  opts.separator "\nTEST RUN"
@@ -113,6 +121,8 @@ begin
113
121
  database = ARGV.first unless ARGV.empty?
114
122
  rescue OptionParser::ParseError => e
115
123
  warn e.message.capitalize
124
+ warn 'Details:'
125
+ warn option_parser.to_s.split("\n").grep(/ #{e.args.first}/).join("\n")
116
126
  warn 'Type "pg_export" for available options'
117
127
  exit
118
128
  end
@@ -120,19 +130,18 @@ end
120
130
  require 'pg_export/container'
121
131
 
122
132
  begin
123
- pg_export =
124
- if interactive
125
- PgExport.interactive
126
- else
127
- PgExport.plain
128
- end
133
+ pg_export = PgExport.boot
129
134
  rescue PgExport::InitializationError => e
130
135
  warn 'Unable to initialize PgExport due to invalid configuration. Check you ENVs.'
131
136
  warn "Detailed message: #{e.message}"
132
137
  exit
133
138
  end
134
139
 
135
- pg_export.call(database) do |result|
136
- result.success { puts 'Success' }
137
- result.failure { |outcome| warn outcome[:message] }
140
+ begin
141
+ pg_export.call(database) do |result|
142
+ result.success { puts 'Success' }
143
+ result.failure { |outcome| warn outcome[:message] }
144
+ end
145
+ rescue Interrupt
146
+ puts
138
147
  end
data/lib/pg_export.rb CHANGED
@@ -1,24 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'pg_export/container'
4
+ require 'pg_export/import'
4
5
 
5
6
  class PgExport
6
7
  class InitializationError < StandardError; end
7
8
 
8
- class << self
9
- def interactive
10
- PgExport::Container.start(:interactive)
11
- new(transaction: PgExport::Container['transactions.import_dump_interactively'])
12
- end
9
+ include Import['transaction']
13
10
 
14
- def plain
15
- PgExport::Container.start(:plain)
16
- new(transaction: PgExport::Container['transactions.export_dump'])
17
- end
18
- end
19
-
20
- def initialize(transaction:)
21
- @transaction = transaction
11
+ def self.boot
12
+ PgExport::Container.start(:main)
13
+ new
22
14
  end
23
15
 
24
16
  def call(database_name, &block)
@@ -1,22 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry-types'
3
+ require 'pg_export/lib/pg_export/types'
4
4
  require 'dry-struct'
5
5
 
6
6
  class PgExport
7
7
  class Configuration < Dry::Struct
8
- include Dry::Types()
9
-
10
- attribute :dump_encryption_key, Strict::String.constrained(size: 16)
11
- attribute :gateway_host, Strict::String
12
- attribute :gateway_user, Strict::String
13
- attribute :gateway_password, Strict::String.optional
14
- attribute :logger_format, Coercible::String.enum('plain', 'timestamped', 'muted')
15
- attribute :keep_dumps, Coercible::Integer.constrained(gteq: 0)
8
+ attribute :encryption_key, PgExport::Types::Strict::String.constrained(size: 16)
9
+ attribute :encryption_algorithm, PgExport::Types::Strict::String
10
+ attribute :gateway_host, PgExport::Types::Strict::String
11
+ attribute :gateway_user, PgExport::Types::Strict::String
12
+ attribute :gateway_password, PgExport::Types::Strict::String.optional
13
+ attribute :logger_format, PgExport::Types::Coercible::String.enum('plain', 'timestamped', 'muted')
14
+ attribute :keep_dumps, PgExport::Types::Coercible::Integer.constrained(gteq: 0)
16
15
 
17
16
  def self.build(env)
18
17
  new(
19
- dump_encryption_key: env['PG_EXPORT_ENCRYPTION_KEY'],
18
+ encryption_key: env['PG_EXPORT_ENCRYPTION_KEY'],
19
+ encryption_algorithm: env['PG_EXPORT_ENCRYPTION_ALGORITHM'],
20
20
  gateway_host: env['PG_EXPORT_GATEWAY_HOST'],
21
21
  gateway_user: env['PG_EXPORT_GATEWAY_USER'],
22
22
  gateway_password: env['PG_EXPORT_GATEWAY_PASSWORD'] == '' ? nil : env['PG_EXPORT_GATEWAY_PASSWORD'],
@@ -31,6 +31,10 @@ class PgExport
31
31
  ENV['GATEWAY'].to_sym
32
32
  end
33
33
 
34
+ def mode
35
+ ENV['PG_EXPORT_MODE'].to_sym
36
+ end
37
+
34
38
  def logger_muted?
35
39
  logger_format == 'muted'
36
40
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'dry/system/container'
4
- require 'pg_export/lib/pg_export/types'
5
4
 
6
5
  class PgExport
7
6
  class Container < Dry::System::Container
@@ -14,44 +13,11 @@ class PgExport
14
13
 
15
14
  load_paths!('lib')
16
15
 
17
- boot(:ftp) do
18
- init do
19
- require 'pg_export/lib/pg_export/factories/ftp_gateway_factory'
20
- end
21
-
22
- start do
23
- use :config
24
- register('factories.gateway_factory') { ::PgExport::Factories::FtpGatewayFactory.new }
25
- end
26
- end
27
-
28
- boot(:ssh) do
29
- init do
30
- require 'pg_export/lib/pg_export/factories/ssh_gateway_factory'
31
- end
32
-
33
- start do
34
- use :config
35
- register('factories.gateway_factory') { ::PgExport::Factories::SshGatewayFactory.new }
36
- end
37
- end
38
-
39
16
  boot(:main) do |system|
40
- init do
41
- require 'pg_export/lib/pg_export/operations/encrypt_dump'
42
- require 'pg_export/lib/pg_export/operations/decrypt_dump'
43
- require 'pg_export/lib/pg_export/operations/remove_old_dumps_from_ftp'
44
- require 'pg_export/lib/pg_export/operations/open_connection'
45
- end
46
-
47
- start do
48
- use(system[:config].gateway)
49
-
50
- register('operations.encrypt_dump') { ::PgExport::Operations::EncryptDump.new }
51
- register('operations.decrypt_dump') { ::PgExport::Operations::DecryptDump.new }
52
- register('operations.remove_old_dumps_from_ftp') { ::PgExport::Operations::RemoveOldDumpsFromFtp.new }
53
- register('operations.open_connection') { ::PgExport::Operations::OpenConnection.new }
54
- end
17
+ use(:config)
18
+ use(system[:config].gateway) # ftp/ssh
19
+ use(:operations)
20
+ use(system[:config].mode) # plain/interactive
55
21
  end
56
22
  end
57
23
  end
@@ -9,23 +9,20 @@ class PgExport
9
9
  include Import['config']
10
10
 
11
11
  def encryptor
12
- cipher(:encrypt)
12
+ build_cipher(:encrypt)
13
13
  end
14
14
 
15
15
  def decryptor
16
- cipher(:decrypt)
16
+ build_cipher(:decrypt)
17
17
  end
18
18
 
19
19
  private
20
20
 
21
- ALGORITHM = 'AES-128-CBC'
22
- private_constant :ALGORITHM
23
-
24
- def cipher(type)
25
- OpenSSL::Cipher.new(ALGORITHM).tap do |cipher|
26
- cipher.public_send(type)
27
- cipher.key = config.dump_encryption_key
28
- end
21
+ def build_cipher(type)
22
+ cipher = OpenSSL::Cipher.new(config.encryption_algorithm)
23
+ cipher.public_send(type)
24
+ cipher.key = config.encryption_key
25
+ cipher
29
26
  end
30
27
  end
31
28
  end
@@ -16,11 +16,12 @@ class PgExport
16
16
  end
17
17
 
18
18
  def open
19
- if password.nil?
20
- @ssh = Net::SSH.start(host, user)
21
- else
22
- @ssh = Net::SSH.start(host, user, password)
23
- end
19
+ @ssh =
20
+ if password.nil?
21
+ Net::SSH.start(host, user)
22
+ else
23
+ Net::SSH.start(host, user, password)
24
+ end
24
25
  end
25
26
 
26
27
  def welcome
@@ -5,7 +5,7 @@ require_relative '../interactive_listener'
5
5
  class PgExport
6
6
  module Listeners
7
7
  class Interactive
8
- class DownloadDumpFromFtp < InteractiveListener
8
+ class DownloadDump < InteractiveListener
9
9
  def on_step(*)
10
10
  @spinner = build_spinner('Downloading')
11
11
  end
@@ -5,7 +5,7 @@ require_relative '../interactive_listener'
5
5
  class PgExport
6
6
  module Listeners
7
7
  class Interactive
8
- class FetchDumpsFromFtp < InteractiveListener
8
+ class FetchDumps < InteractiveListener
9
9
  def on_step(*)
10
10
  @spinner = build_spinner('Fetching dumps')
11
11
  end
@@ -7,7 +7,7 @@ class PgExport
7
7
  class Interactive
8
8
  class OpenConnection < InteractiveListener
9
9
  def on_step(*)
10
- @spinner = build_spinner('Opening ftp connection')
10
+ @spinner = build_spinner('Opening connection')
11
11
  end
12
12
 
13
13
  def on_step_succeeded(*)
@@ -5,7 +5,7 @@ require_relative '../interactive_listener'
5
5
  class PgExport
6
6
  module Listeners
7
7
  class Interactive
8
- class RemoveOldDumpsFromFtp < InteractiveListener
8
+ class RemoveOldDumps < InteractiveListener
9
9
  def on_step(event)
10
10
  @spinner = build_spinner("Checking for old dumps on #{event[:args].first[:gateway]}")
11
11
  end
@@ -5,7 +5,7 @@ require_relative '../interactive_listener'
5
5
  class PgExport
6
6
  module Listeners
7
7
  class Interactive
8
- class UploadDumpToFtp < InteractiveListener
8
+ class UploadDump < InteractiveListener
9
9
  def on_step(event)
10
10
  @spinner = build_spinner("Uploading #{event[:args].first[:dump]} to #{event[:args].first[:gateway]}")
11
11
  end
@@ -5,7 +5,7 @@ require_relative '../plain_listener'
5
5
  class PgExport
6
6
  module Listeners
7
7
  class Plain
8
- class DownloadDumpFromFtp < PlainListener
8
+ class DownloadDump < PlainListener
9
9
  def on_step_succeeded(event)
10
10
  logger.info("Download #{event[:value][:dump]}")
11
11
  end
@@ -5,7 +5,7 @@ require_relative '../plain_listener'
5
5
  class PgExport
6
6
  module Listeners
7
7
  class Plain
8
- class FetchDumpsFromFtp < PlainListener
8
+ class FetchDumps < PlainListener
9
9
  def on_step_succeeded(event)
10
10
  logger.info("Fetch dumps (#{event[:value][:dumps].count} items)")
11
11
  end
@@ -5,7 +5,7 @@ require_relative '../plain_listener'
5
5
  class PgExport
6
6
  module Listeners
7
7
  class Plain
8
- class RemoveOldDumpsFromFtp < PlainListener
8
+ class RemoveOldDumps < PlainListener
9
9
  def on_step_succeeded(event)
10
10
  event[:value][:removed_dumps].each do |filename|
11
11
  logger.info("Remove #{filename} from #{event[:value][:gateway]}")
@@ -5,7 +5,7 @@ require_relative '../plain_listener'
5
5
  class PgExport
6
6
  module Listeners
7
7
  class Plain
8
- class UploadDumpToFtp < PlainListener
8
+ class UploadDump < PlainListener
9
9
  def on_step_succeeded(event)
10
10
  logger.info("Upload #{event[:value][:dump]} to #{event[:value][:gateway]}")
11
11
  end
@@ -5,7 +5,7 @@ require 'pg_export/import'
5
5
 
6
6
  class PgExport
7
7
  module Operations
8
- class RemoveOldDumpsFromFtp
8
+ class RemoveOldDumps
9
9
  include Dry::Transaction::Operation
10
10
  include Import['repositories.gateway_dump_repository', 'config']
11
11
 
@@ -18,8 +18,8 @@ class PgExport
18
18
  step :build_dump
19
19
  step :encrypt_dump, with: 'operations.encrypt_dump'
20
20
  step :open_connection, with: 'operations.open_connection'
21
- step :upload_dump_to_ftp
22
- step :remove_old_dumps_from_ftp, with: 'operations.remove_old_dumps_from_ftp'
21
+ step :upload_dump
22
+ step :remove_old_dumps, with: 'operations.remove_old_dumps'
23
23
  step :close_connection
24
24
 
25
25
  private
@@ -42,7 +42,7 @@ class PgExport
42
42
  Failure(message: 'Unable to dump database: ' + e.to_s)
43
43
  end
44
44
 
45
- def upload_dump_to_ftp(dump:, gateway:)
45
+ def upload_dump(dump:, gateway:)
46
46
  gateway.persist(dump.file, dump.name)
47
47
  Success(dump: dump, gateway: gateway)
48
48
  end
@@ -19,9 +19,9 @@ class PgExport
19
19
  ]
20
20
 
21
21
  step :open_connection, with: 'operations.open_connection'
22
- step :fetch_dumps_from_ftp
22
+ step :fetch_dumps
23
23
  step :select_dump
24
- step :download_dump_from_ftp
24
+ step :download_dump
25
25
  step :close_connection
26
26
  step :decrypt_dump, with: 'operations.decrypt_dump'
27
27
  step :select_database
@@ -29,7 +29,7 @@ class PgExport
29
29
 
30
30
  private
31
31
 
32
- def fetch_dumps_from_ftp(database_name:, gateway:)
32
+ def fetch_dumps(database_name:, gateway:)
33
33
  dumps = gateway_dump_repository.all(database_name: database_name, gateway: gateway)
34
34
  return Failure(message: 'No dumps') if dumps.none?
35
35
 
@@ -41,7 +41,7 @@ class PgExport
41
41
  Success(dump: dump, gateway: gateway)
42
42
  end
43
43
 
44
- def download_dump_from_ftp(dump:, gateway:)
44
+ def download_dump(dump:, gateway:)
45
45
  dump.file = gateway_dump_file_repository.by_name(name: dump.name, gateway: gateway)
46
46
  Success(dump: dump, gateway: gateway)
47
47
  end
@@ -2,10 +2,26 @@
2
2
 
3
3
  PgExport::Container.boot :config do
4
4
  init do
5
+ require 'logger'
6
+ require 'pg_export/lib/pg_export/types'
5
7
  require 'pg_export/configuration'
6
8
  end
7
9
 
8
10
  start do
9
- register(:config, memoize: true) { PgExport::Configuration.build(ENV) }
11
+ config = PgExport::Configuration.build(ENV)
12
+
13
+ formatters = {
14
+ plain: ->(_, _, _, message) { "#{message}\n" },
15
+ muted: ->(*) { raise 'Do not initialize logger when it is muted' },
16
+ timestamped: lambda do |severity, datetime, progname, message|
17
+ "#{datetime} #{Process.pid} TID-#{Thread.current.object_id.to_s(36)}#{progname} #{severity}: #{message}\n"
18
+ end
19
+ }
20
+
21
+ register(:logger, memoize: true) do
22
+ Logger.new($stdout, formatter: formatters.fetch(config.logger_format.to_sym))
23
+ end
24
+
25
+ register(:config, memoize: true) { config }
10
26
  end
11
27
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ PgExport::Container.boot(:ftp) do
4
+ init do
5
+ require 'pg_export/lib/pg_export/factories/ftp_gateway_factory'
6
+ end
7
+
8
+ start do
9
+ register('factories.gateway_factory') { ::PgExport::Factories::FtpGatewayFactory.new }
10
+ end
11
+ end
@@ -6,20 +6,14 @@ PgExport::Container.boot(:interactive) do
6
6
  end
7
7
 
8
8
  start do
9
- use :main
10
-
11
- # type = 'plain'
12
9
  type = 'interactive'
13
-
14
10
  transaction = PgExport::Transactions::ImportDumpInteractively.new(ui_input: target["ui.#{type}.input"])
15
11
 
16
12
  unless target[:config].logger_muted?
17
- use :logger
18
-
19
13
  %i[
20
14
  open_connection
21
- fetch_dumps_from_ftp
22
- download_dump_from_ftp
15
+ fetch_dumps
16
+ download_dump
23
17
  decrypt_dump
24
18
  restore
25
19
  ].each do |step|
@@ -27,6 +21,6 @@ PgExport::Container.boot(:interactive) do
27
21
  end
28
22
  end
29
23
 
30
- register('transactions.import_dump_interactively', memoize: true) { transaction }
24
+ register('transaction', memoize: true) { transaction }
31
25
  end
32
26
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ PgExport::Container.boot(:operations) do
4
+ init do
5
+ require 'pg_export/lib/pg_export/operations/encrypt_dump'
6
+ require 'pg_export/lib/pg_export/operations/decrypt_dump'
7
+ require 'pg_export/lib/pg_export/operations/remove_old_dumps'
8
+ require 'pg_export/lib/pg_export/operations/open_connection'
9
+ end
10
+
11
+ start do
12
+ register('operations.encrypt_dump') { ::PgExport::Operations::EncryptDump.new }
13
+ register('operations.decrypt_dump') { ::PgExport::Operations::DecryptDump.new }
14
+ register('operations.remove_old_dumps') { ::PgExport::Operations::RemoveOldDumps.new }
15
+ register('operations.open_connection') { ::PgExport::Operations::OpenConnection.new }
16
+ end
17
+ end
@@ -6,28 +6,22 @@ PgExport::Container.boot(:plain) do
6
6
  end
7
7
 
8
8
  start do
9
- use :main
10
-
11
9
  transaction = PgExport::Transactions::ExportDump.new
12
10
 
13
11
  unless target[:config].logger_muted?
14
- use :logger
15
-
16
12
  type = 'plain'
17
- # type = 'interactive'
18
-
19
13
  %i[
20
14
  build_dump
21
15
  encrypt_dump
22
16
  open_connection
23
- upload_dump_to_ftp
24
- remove_old_dumps_from_ftp
17
+ upload_dump
18
+ remove_old_dumps
25
19
  close_connection
26
20
  ].each do |step|
27
21
  transaction.subscribe(step => target["listeners.#{type}.#{step}"])
28
22
  end
29
23
  end
30
24
 
31
- register('transactions.export_dump', memoize: true) { transaction }
25
+ register('transaction', memoize: true) { transaction }
32
26
  end
33
27
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ PgExport::Container.boot(:ssh) do
4
+ init do
5
+ require 'pg_export/lib/pg_export/factories/ssh_gateway_factory'
6
+ end
7
+
8
+ start do
9
+ register('factories.gateway_factory') { ::PgExport::Factories::SshGatewayFactory.new }
10
+ end
11
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class PgExport
4
- VERSION = '1.0.0.rc3'
4
+ VERSION = '1.0.0.rc4'
5
5
  end
data/pg_export.gemspec CHANGED
@@ -21,15 +21,15 @@ Gem::Specification.new do |spec|
21
21
  spec.require_paths = ['lib']
22
22
  spec.required_ruby_version = '>= 2.3.0'
23
23
 
24
+ spec.add_dependency 'bcrypt_pbkdf'
24
25
  spec.add_dependency 'dry-initializer', '~> 3.0'
25
- spec.add_dependency 'dry-types', '~> 1.0'
26
26
  spec.add_dependency 'dry-struct', '~> 1.0'
27
27
  spec.add_dependency 'dry-system', '~> 0.18'
28
28
  spec.add_dependency 'dry-transaction', '~> 0.13'
29
- spec.add_dependency 'bcrypt_pbkdf'
29
+ spec.add_dependency 'dry-types', '~> 1.0'
30
30
  spec.add_dependency 'ed25519'
31
- spec.add_dependency 'net-ssh'
32
31
  spec.add_dependency 'net-scp'
32
+ spec.add_dependency 'net-ssh'
33
33
  spec.add_dependency 'tty-prompt'
34
34
  spec.add_dependency 'tty-spinner'
35
35
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_export
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc3
4
+ version: 1.0.0.rc4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Krzysztof Maicher
@@ -11,33 +11,33 @@ cert_chain: []
11
11
  date: 2021-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: dry-initializer
14
+ name: bcrypt_pbkdf
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '3.0'
19
+ version: '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: '3.0'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: dry-types
28
+ name: dry-initializer
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.0'
33
+ version: '3.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: '1.0'
40
+ version: '3.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: dry-struct
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -81,19 +81,19 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0.13'
83
83
  - !ruby/object:Gem::Dependency
84
- name: bcrypt_pbkdf
84
+ name: dry-types
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: '1.0'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: '1.0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: ed25519
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -109,7 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: net-ssh
112
+ name: net-scp
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -123,7 +123,7 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
- name: net-scp
126
+ name: net-ssh
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - ">="
@@ -273,7 +273,6 @@ files:
273
273
  - bin/pg_export
274
274
  - bin/setup
275
275
  - lib/pg_export.rb
276
- - lib/pg_export/build_logger.rb
277
276
  - lib/pg_export/configuration.rb
278
277
  - lib/pg_export/container.rb
279
278
  - lib/pg_export/import.rb
@@ -288,29 +287,29 @@ files:
288
287
  - lib/pg_export/lib/pg_export/listeners/interactive/build_dump.rb
289
288
  - lib/pg_export/lib/pg_export/listeners/interactive/close_connection.rb
290
289
  - lib/pg_export/lib/pg_export/listeners/interactive/decrypt_dump.rb
291
- - lib/pg_export/lib/pg_export/listeners/interactive/download_dump_from_ftp.rb
290
+ - lib/pg_export/lib/pg_export/listeners/interactive/download_dump.rb
292
291
  - lib/pg_export/lib/pg_export/listeners/interactive/encrypt_dump.rb
293
- - lib/pg_export/lib/pg_export/listeners/interactive/fetch_dumps_from_ftp.rb
292
+ - lib/pg_export/lib/pg_export/listeners/interactive/fetch_dumps.rb
294
293
  - lib/pg_export/lib/pg_export/listeners/interactive/open_connection.rb
295
- - lib/pg_export/lib/pg_export/listeners/interactive/remove_old_dumps_from_ftp.rb
294
+ - lib/pg_export/lib/pg_export/listeners/interactive/remove_old_dumps.rb
296
295
  - lib/pg_export/lib/pg_export/listeners/interactive/restore.rb
297
- - lib/pg_export/lib/pg_export/listeners/interactive/upload_dump_to_ftp.rb
296
+ - lib/pg_export/lib/pg_export/listeners/interactive/upload_dump.rb
298
297
  - lib/pg_export/lib/pg_export/listeners/interactive_listener.rb
299
298
  - lib/pg_export/lib/pg_export/listeners/plain/build_dump.rb
300
299
  - lib/pg_export/lib/pg_export/listeners/plain/close_connection.rb
301
300
  - lib/pg_export/lib/pg_export/listeners/plain/decrypt_dump.rb
302
- - lib/pg_export/lib/pg_export/listeners/plain/download_dump_from_ftp.rb
301
+ - lib/pg_export/lib/pg_export/listeners/plain/download_dump.rb
303
302
  - lib/pg_export/lib/pg_export/listeners/plain/encrypt_dump.rb
304
- - lib/pg_export/lib/pg_export/listeners/plain/fetch_dumps_from_ftp.rb
303
+ - lib/pg_export/lib/pg_export/listeners/plain/fetch_dumps.rb
305
304
  - lib/pg_export/lib/pg_export/listeners/plain/open_connection.rb
306
- - lib/pg_export/lib/pg_export/listeners/plain/remove_old_dumps_from_ftp.rb
305
+ - lib/pg_export/lib/pg_export/listeners/plain/remove_old_dumps.rb
307
306
  - lib/pg_export/lib/pg_export/listeners/plain/restore.rb
308
- - lib/pg_export/lib/pg_export/listeners/plain/upload_dump_to_ftp.rb
307
+ - lib/pg_export/lib/pg_export/listeners/plain/upload_dump.rb
309
308
  - lib/pg_export/lib/pg_export/listeners/plain_listener.rb
310
309
  - lib/pg_export/lib/pg_export/operations/decrypt_dump.rb
311
310
  - lib/pg_export/lib/pg_export/operations/encrypt_dump.rb
312
311
  - lib/pg_export/lib/pg_export/operations/open_connection.rb
313
- - lib/pg_export/lib/pg_export/operations/remove_old_dumps_from_ftp.rb
312
+ - lib/pg_export/lib/pg_export/operations/remove_old_dumps.rb
314
313
  - lib/pg_export/lib/pg_export/repositories/gateway_dump_file_repository.rb
315
314
  - lib/pg_export/lib/pg_export/repositories/gateway_dump_repository.rb
316
315
  - lib/pg_export/lib/pg_export/transactions/export_dump.rb
@@ -320,9 +319,11 @@ files:
320
319
  - lib/pg_export/lib/pg_export/ui/plain/input.rb
321
320
  - lib/pg_export/lib/pg_export/value_objects/dump_file.rb
322
321
  - lib/pg_export/system/boot/config.rb
322
+ - lib/pg_export/system/boot/ftp.rb
323
323
  - lib/pg_export/system/boot/interactive.rb
324
- - lib/pg_export/system/boot/logger.rb
324
+ - lib/pg_export/system/boot/operations.rb
325
325
  - lib/pg_export/system/boot/plain.rb
326
+ - lib/pg_export/system/boot/ssh.rb
326
327
  - lib/pg_export/version.rb
327
328
  - pg_export.gemspec
328
329
  homepage: https://github.com/maicher/pg_export
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'logger'
4
-
5
- class PgExport
6
- class BuildLogger
7
- FORMATS = {
8
- plain: ->(_, _, _, message) { "#{message}\n" },
9
- muted: ->(*) { raise 'Do not initialize logger when it is muted' },
10
- timestamped: lambda do |severity, datetime, progname, message|
11
- "#{datetime} #{Process.pid} TID-#{Thread.current.object_id.to_s(36)}#{progname} #{severity}: #{message}\n"
12
- end
13
- }.freeze
14
-
15
- def self.call(stream:, format:)
16
- Logger.new(stream).tap do |logger|
17
- logger.formatter = FORMATS.fetch(format.to_sym)
18
- end
19
- end
20
- end
21
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- PgExport::Container.boot :logger do
4
- init do
5
- require 'pg_export/build_logger'
6
- end
7
-
8
- start do
9
- use :config
10
-
11
- register(:logger, memoize: true) do
12
- PgExport::BuildLogger.call(stream: $stdout, format: target[:config].logger_format)
13
- end
14
- end
15
- end