pg_export 1.0.0.rc3 → 1.0.0.rc4

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 (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