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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1 -0
- data/README.md +1 -1
- data/bin/pg_export +39 -30
- data/lib/pg_export.rb +5 -13
- data/lib/pg_export/configuration.rb +14 -10
- data/lib/pg_export/container.rb +4 -38
- data/lib/pg_export/lib/pg_export/factories/cipher_factory.rb +7 -10
- data/lib/pg_export/lib/pg_export/gateways/ssh.rb +6 -5
- data/lib/pg_export/lib/pg_export/listeners/interactive/{download_dump_from_ftp.rb → download_dump.rb} +1 -1
- data/lib/pg_export/lib/pg_export/listeners/interactive/{fetch_dumps_from_ftp.rb → fetch_dumps.rb} +1 -1
- data/lib/pg_export/lib/pg_export/listeners/interactive/open_connection.rb +1 -1
- data/lib/pg_export/lib/pg_export/listeners/interactive/{remove_old_dumps_from_ftp.rb → remove_old_dumps.rb} +1 -1
- data/lib/pg_export/lib/pg_export/listeners/interactive/{upload_dump_to_ftp.rb → upload_dump.rb} +1 -1
- data/lib/pg_export/lib/pg_export/listeners/plain/{download_dump_from_ftp.rb → download_dump.rb} +1 -1
- data/lib/pg_export/lib/pg_export/listeners/plain/{fetch_dumps_from_ftp.rb → fetch_dumps.rb} +1 -1
- data/lib/pg_export/lib/pg_export/listeners/plain/{remove_old_dumps_from_ftp.rb → remove_old_dumps.rb} +1 -1
- data/lib/pg_export/lib/pg_export/listeners/plain/{upload_dump_to_ftp.rb → upload_dump.rb} +1 -1
- data/lib/pg_export/lib/pg_export/operations/{remove_old_dumps_from_ftp.rb → remove_old_dumps.rb} +1 -1
- data/lib/pg_export/lib/pg_export/transactions/export_dump.rb +3 -3
- data/lib/pg_export/lib/pg_export/transactions/import_dump_interactively.rb +4 -4
- data/lib/pg_export/system/boot/config.rb +17 -1
- data/lib/pg_export/system/boot/ftp.rb +11 -0
- data/lib/pg_export/system/boot/interactive.rb +3 -9
- data/lib/pg_export/system/boot/operations.rb +17 -0
- data/lib/pg_export/system/boot/plain.rb +3 -9
- data/lib/pg_export/system/boot/ssh.rb +11 -0
- data/lib/pg_export/version.rb +1 -1
- data/pg_export.gemspec +3 -3
- metadata +28 -27
- data/lib/pg_export/build_logger.rb +0 -21
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0f62f09db68ae3716d4ae83fea7780240cc66af83d7cbe813cd5d2e7bfae3e7
|
4
|
+
data.tar.gz: 0f80f6ad47217232ec83877f4bfc1b15c62a248e214229a9a6444bdecee61f44
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ecb017891a15fd94e15eef06972066655f13aeff22a4030ea840dc1ff2df6dd00451b2c7eb2e1dad248f95bc27b63d56cfe6275f675c0f2a2be6ab6f0ad7bdcd
|
7
|
+
data.tar.gz: e89de78f4a3a3d804f3ee82573fd97d03154a8f792f3e1a63a52f475798a091e96d0fc556e4dabbe8aa3c37497a7ae69c743a232e7bdd8a3a19d70547468df69
|
data/CHANGELOG.md
CHANGED
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
|
-
=> {:
|
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
|
-
|
17
|
+
NAME
|
18
|
+
pg_export - CLI for exporting/importing PostgreSQL dumps via FTP/SSH
|
19
19
|
|
20
|
-
SYNOPSIS (default mode)
|
21
|
-
|
20
|
+
SYNOPSIS (default mode)
|
21
|
+
pg_export DATABASE [options]
|
22
22
|
|
23
|
-
SYNOPSIS (interactive mode)
|
24
|
-
|
23
|
+
SYNOPSIS (interactive mode)
|
24
|
+
pg_export --interactive [DATABASE] [options]
|
25
25
|
|
26
|
-
ARGUMENTS
|
27
|
-
|
28
|
-
|
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.
|
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
|
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('-
|
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
|
-
|
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
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
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
|
-
|
136
|
-
|
137
|
-
|
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
|
-
|
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
|
-
|
15
|
-
|
16
|
-
|
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 '
|
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
|
-
|
9
|
-
|
10
|
-
attribute :
|
11
|
-
attribute :
|
12
|
-
attribute :
|
13
|
-
attribute :
|
14
|
-
attribute :
|
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
|
-
|
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
|
data/lib/pg_export/container.rb
CHANGED
@@ -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
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
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
|
-
|
12
|
+
build_cipher(:encrypt)
|
13
13
|
end
|
14
14
|
|
15
15
|
def decryptor
|
16
|
-
|
16
|
+
build_cipher(:decrypt)
|
17
17
|
end
|
18
18
|
|
19
19
|
private
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
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
|
data/lib/pg_export/lib/pg_export/listeners/interactive/{upload_dump_to_ftp.rb → upload_dump.rb}
RENAMED
@@ -5,7 +5,7 @@ require_relative '../interactive_listener'
|
|
5
5
|
class PgExport
|
6
6
|
module Listeners
|
7
7
|
class Interactive
|
8
|
-
class
|
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
|
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
|
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
|
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
|
@@ -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 :
|
22
|
-
step :
|
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
|
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 :
|
22
|
+
step :fetch_dumps
|
23
23
|
step :select_dump
|
24
|
-
step :
|
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
|
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
|
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
|
-
|
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
|
-
|
22
|
-
|
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('
|
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
|
-
|
24
|
-
|
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('
|
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
|
data/lib/pg_export/version.rb
CHANGED
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 '
|
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.
|
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:
|
14
|
+
name: bcrypt_pbkdf
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
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: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: dry-
|
28
|
+
name: dry-initializer
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
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: '
|
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:
|
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-
|
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-
|
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/
|
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/
|
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/
|
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/
|
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/
|
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/
|
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/
|
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/
|
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/
|
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/
|
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
|