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