pg_export 1.0.0.rc6 → 1.0.0.rc8
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/.rubocop.yml +23 -2
- data/CHANGELOG.md +6 -3
- data/README.md +43 -34
- data/bin/pg_export +13 -131
- data/lib/pg_export/{lib/pg_export/adapters → adapters}/shell_adapter.rb +0 -0
- data/lib/pg_export/commands_factory.rb +158 -0
- data/lib/pg_export/configuration.rb +15 -16
- data/lib/pg_export/configuration_parser.rb +126 -0
- data/lib/pg_export/{lib/pg_export/entities → entities}/dump.rb +0 -0
- data/lib/pg_export/{lib/pg_export/factories → factories}/cipher_factory.rb +0 -0
- data/lib/pg_export/{lib/pg_export/factories → factories}/dump_factory.rb +1 -1
- data/lib/pg_export/{lib/pg_export/factories → factories}/ftp_gateway_factory.rb +1 -1
- data/lib/pg_export/{lib/pg_export/repositories/gateway_dump_file_repository.rb → factories/gateway_dump_file_factory.rb} +4 -4
- data/lib/pg_export/{lib/pg_export/factories → factories}/ssh_gateway_factory.rb +1 -1
- data/lib/pg_export/{lib/pg_export/gateways → gateways}/ftp.rb +0 -0
- data/lib/pg_export/{lib/pg_export/gateways → gateways}/ssh.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/build_dump.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/close_connection.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/decrypt_dump.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/download_dump.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/encrypt_dump.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/fetch_dumps.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/open_connection.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/remove_old_dumps.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/restore.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/select_database.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/select_dump.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/upload_dump.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive_listener.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/build_dump.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/close_connection.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/decrypt_dump.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/download_dump.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/encrypt_dump.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/fetch_dumps.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/open_connection.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/prepare_params.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/remove_old_dumps.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/restore.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/upload_dump.rb +0 -0
- data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain_listener.rb +0 -0
- data/lib/pg_export/{lib/pg_export/operations → operations}/decrypt_dump.rb +1 -1
- data/lib/pg_export/{lib/pg_export/operations → operations}/encrypt_dump.rb +1 -1
- data/lib/pg_export/{lib/pg_export/operations → operations}/open_connection.rb +1 -1
- data/lib/pg_export/{lib/pg_export/operations → operations}/remove_old_dumps.rb +1 -1
- data/lib/pg_export/{lib/pg_export/repositories → repositories}/gateway_dump_repository.rb +2 -2
- data/lib/pg_export/{lib/pg_export/transactions → transactions}/evaluator.rb +0 -0
- data/lib/pg_export/{lib/pg_export/transactions → transactions}/export_dump.rb +10 -10
- data/lib/pg_export/{lib/pg_export/transactions → transactions}/import_dump_interactively.rb +19 -10
- data/lib/pg_export/{lib/pg_export/ui → ui}/interactive/input.rb +0 -0
- data/lib/pg_export/{lib/pg_export/ui → ui}/plain/input.rb +0 -0
- data/lib/pg_export/{lib/pg_export/value_objects → value_objects}/dump_file.rb +0 -0
- data/lib/pg_export/{lib/pg_export/value_objects → value_objects}/result.rb +1 -1
- data/lib/pg_export/version.rb +1 -1
- data/lib/pg_export.rb +12 -14
- data/pg_export.gemspec +1 -3
- metadata +50 -49
- data/lib/pg_export/factory.rb +0 -148
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 653b33873daaa6f1c9c23e494f140980d8618d811b4cbff5e7209cd20d854b23
|
4
|
+
data.tar.gz: 4aeedec88429805b47e15fd389c02a2a870ec7aeb1b81b7d1e782c57536bce90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 43af8e5f80571fb4de1e361097719e89732c99d0e85c4c488d3644a76d31eafd44cc12b0e82258a1d849d393c4324f03e29385dcda725d0606379ee3a9e38a58
|
7
|
+
data.tar.gz: 284bb265abde342da455849a18e4a27af9e20d2ae4fe38960b7b3b118f20154828348b9cb2f33b4c9e6c81fdd19a7f0b68a0e8f290a261f193bf1e100ac322fa
|
data/.rubocop.yml
CHANGED
@@ -2,8 +2,6 @@ AllCops:
|
|
2
2
|
TargetRubyVersion: 2.3
|
3
3
|
|
4
4
|
Metrics/BlockLength:
|
5
|
-
Exclude:
|
6
|
-
- 'bin/pg_export'
|
7
5
|
ExcludedMethods: ['describe', 'context']
|
8
6
|
|
9
7
|
Layout/LineLength:
|
@@ -32,6 +30,29 @@ Style/TrailingCommaInHashLiteral:
|
|
32
30
|
|
33
31
|
Metrics/AbcSize:
|
34
32
|
Max: 30
|
33
|
+
Exclude:
|
34
|
+
- 'lib/pg_export/configuration_parser.rb'
|
35
|
+
- 'lib/pg_export/configuration.rb'
|
35
36
|
|
36
37
|
Metrics/PerceivedComplexity:
|
37
38
|
Max: 30
|
39
|
+
|
40
|
+
Lint/AmbiguousOperator:
|
41
|
+
Enabled: false
|
42
|
+
|
43
|
+
Metrics/ClassLength:
|
44
|
+
Max: 200
|
45
|
+
|
46
|
+
Layout/ExtraSpacing:
|
47
|
+
Exclude:
|
48
|
+
- 'lib/pg_export/configuration_parser.rb'
|
49
|
+
|
50
|
+
Metrics/ParameterLists:
|
51
|
+
Exclude:
|
52
|
+
- 'lib/pg_export/configuration.rb'
|
53
|
+
|
54
|
+
Metrics/ParameterLists:
|
55
|
+
Enabled: false
|
56
|
+
|
57
|
+
Style/Semicolon:
|
58
|
+
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
### 1.0.0 - 2022.05.
|
1
|
+
### 1.0.0 - 2022.05.18
|
2
2
|
- Make it compatible with Ruby 3.0
|
3
3
|
- Change configuration envs:
|
4
4
|
- BACKUP_FTP_HOST -> PG_EXPORT_GATEWAY_HOST
|
@@ -7,9 +7,12 @@
|
|
7
7
|
- DUMP_ENCRYPTION_KEY -> PG_EXPORT_ENCRYPTION_KEY
|
8
8
|
- Drop Ruby 2.3 support
|
9
9
|
- Add SSH option
|
10
|
-
- Add `encryption_algorithm` option
|
10
|
+
- Add `encryption_algorithm` option
|
11
|
+
- All command line options has now their equivalents in ENVs (and vice-versa)
|
11
12
|
- Remove dry libraries dependencies
|
12
|
-
-
|
13
|
+
- In case of failure bin/pg_export now returns exit value 1
|
14
|
+
- Improve performance
|
15
|
+
- Improve error handling
|
13
16
|
|
14
17
|
### 0.7.7 - 2020.09.07
|
15
18
|
|
data/README.md
CHANGED
@@ -54,34 +54,48 @@ Or install it yourself as:
|
|
54
54
|
pg_export DATABASE [OPTION..]
|
55
55
|
pg_export --interactive DATABASE [OPTION..]
|
56
56
|
|
57
|
+
EXIT VALUES
|
58
|
+
0 - Success
|
59
|
+
1 - Error
|
60
|
+
|
57
61
|
ARGUMENTS
|
58
62
|
DATABASE - database name to export (when default mode)
|
59
|
-
|
63
|
+
- phrase to filter database dumps by (when interactive mode)
|
60
64
|
|
61
65
|
OPTIONS
|
62
|
-
-g, --gateway GATEWAY
|
63
|
-
-
|
64
|
-
-
|
65
|
-
-
|
66
|
-
-
|
67
|
-
|
68
|
-
-
|
69
|
-
-
|
70
|
-
|
71
|
-
-
|
72
|
-
-
|
73
|
-
-
|
66
|
+
-g, --gateway GATEWAY Allowed values: ftp, ssh. Default: ftp. Credentials need to be set via ENVs
|
67
|
+
-U, --user USER Gateway (ftp or ssh) user
|
68
|
+
-H, --host HOST Gateway (ftp or ssh) host
|
69
|
+
-P, --password PASSWORD Gateway (ftp or ssh) password
|
70
|
+
-d, --database DATABASE In plain mode: database name to export;
|
71
|
+
In interactive mode: phrase to filter by
|
72
|
+
-e, --encryption_key KEY Dumps will be SSL encrypted using this key. Should have exactly 16 characters
|
73
|
+
-a, --algorithm ALGORITHM Encryption cipher algorithm (default: AES-128-CBC);
|
74
|
+
For available option see `$ openssl list -cipher-algorithms`
|
75
|
+
-k, --keep KEEP Number of dump files to keep on FTP (default: 10)
|
76
|
+
-s, --ssh Same as "--gateway ssh". When set, the --gateway option is ignored
|
77
|
+
-f, --ftp Same as "--gateway ftp". When set, the --gateway option is ignored
|
78
|
+
-t, --timestamped Prepends log messages with timestamps
|
79
|
+
-m, --muted Mutes log messages. When set, the -t option is ignored. Prints message only on error
|
80
|
+
-i, --interactive Interactive mode, for importing dumps. Whan set, the -t and -m options are ignored
|
81
|
+
-w, --welcome Try connecting to the gateway (FTP or SSH) to verify the connection and exit
|
82
|
+
-c, --configuration Print the configuration and exit
|
83
|
+
-v, --version Print version
|
84
|
+
-h, --help Print this message and exit
|
74
85
|
|
75
86
|
ENV
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
87
|
+
Each of the above options can be also set using enviromental variables.
|
88
|
+
Use full option names prepending with PG_EXPORT_ phrase.
|
89
|
+
Command line options takes precedence over the ENVs.
|
90
|
+
|
91
|
+
Eg. below two commands are equivalent:
|
92
|
+
pg_export -s -U user -H host database_name -k 10
|
81
93
|
|
82
|
-
|
83
|
-
|
84
|
-
|
94
|
+
Is equivalent to:
|
95
|
+
export PG_EXPORT_GATEWAY_USER=user
|
96
|
+
export PG_EXPORT_GATEWAY_HOST=host
|
97
|
+
export PG_EXPORT_KEEP=20
|
98
|
+
pg_export -s database_name -k 10
|
85
99
|
|
86
100
|
## How to start
|
87
101
|
|
@@ -96,21 +110,16 @@ __Step 1.__ Prepare ENV variables.
|
|
96
110
|
/* Dumps will be SSL(AES-128-CBC) encrypted using this key. */
|
97
111
|
PG_EXPORT_ENCRYPTION_KEY=1234567890abcdef
|
98
112
|
|
99
|
-
/* Dumps to be kept on FTP */
|
100
|
-
/* Optional, defaults to 10 */
|
101
|
-
KEEP_DUMPS=5
|
102
|
-
|
103
|
-
Note, that variables cannot include `#` sign, [more info](http://serverfault.com/questions/539730/environment-variable-in-etc-environment-with-pound-hash-sign-in-the-value).
|
104
|
-
|
105
113
|
__Step 2.__ Print the configuration to verify if env variables has been loaded properly.
|
106
114
|
|
107
115
|
$ pg_export --configuration
|
108
116
|
=> encryption_key k4***
|
109
117
|
gateway_host yourftp.example.com
|
110
118
|
gateway_user your_gateway_user
|
111
|
-
gateway_password
|
119
|
+
gateway_password
|
112
120
|
logger_format plain
|
113
|
-
keep_dumps
|
121
|
+
keep_dumps 10
|
122
|
+
....
|
114
123
|
|
115
124
|
__Step 3.__ Try connecting to FTP to verify the connection.
|
116
125
|
|
@@ -119,18 +128,18 @@ __Step 3.__ Try connecting to FTP to verify the connection.
|
|
119
128
|
|
120
129
|
__Step 4.__ Perform database export.
|
121
130
|
|
122
|
-
$ pg_export -d your_database
|
123
|
-
=> Dump database your_database to
|
124
|
-
Encrypt
|
131
|
+
$ pg_export -d your_database -k 5
|
132
|
+
=> Dump database your_database to database_name (1.36MB)
|
133
|
+
Encrypt database_name_20181016_121314 (1.34MB)
|
125
134
|
Connect to yourftp.example.com
|
126
|
-
Upload
|
135
|
+
Upload database_name_20181016_121314 (1.34MB) to yourftp.example.com
|
127
136
|
Close FTP
|
128
137
|
|
129
138
|
## How to restore a dump?
|
130
139
|
|
131
140
|
Run interactive mode and follow the instructions:
|
132
141
|
|
133
|
-
pg_export [-d
|
142
|
+
pg_export [-d database_name] -i
|
134
143
|
|
135
144
|
## Development
|
136
145
|
|
data/bin/pg_export
CHANGED
@@ -4,143 +4,25 @@
|
|
4
4
|
lib = File.expand_path('../lib', __dir__)
|
5
5
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
6
6
|
|
7
|
-
require 'optparse'
|
8
7
|
require 'pg_export'
|
9
8
|
|
10
|
-
database = nil
|
11
|
-
x = nil
|
12
|
-
|
13
|
-
option_parser = OptionParser.new do |opts|
|
14
|
-
opts.banner = <<~TXT
|
15
|
-
NAME
|
16
|
-
pg_export - CLI for exporting/importing PostgreSQL dumps via FTP/SSH
|
17
|
-
|
18
|
-
SYNOPSIS
|
19
|
-
pg_export DATABASE [OPTION..]
|
20
|
-
pg_export --interactive DATABASE [OPTION..]
|
21
|
-
|
22
|
-
EXIT VALUES
|
23
|
-
0 - Success
|
24
|
-
1 - Error
|
25
|
-
|
26
|
-
ARGUMENTS
|
27
|
-
DATABASE - database name to export (when default mode)
|
28
|
-
- phrase to filter database dumps by (when interactive mode)
|
29
|
-
|
30
|
-
OPTIONS
|
31
|
-
TXT
|
32
|
-
|
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|
|
37
|
-
ENV['GATEWAY'] = g
|
38
|
-
end
|
39
|
-
|
40
|
-
opts.on('-s', '--ssh', 'Same as "--gateway ssh"') do
|
41
|
-
ENV['GATEWAY'] = 'ssh'
|
42
|
-
end
|
43
|
-
|
44
|
-
opts.on('-f', '--ftp', 'Same as "--gateway ftp"') do
|
45
|
-
ENV['GATEWAY'] = 'ftp'
|
46
|
-
end
|
47
|
-
|
48
|
-
opts.on('-d', '--database DATABASE', String, 'Alternative way of specifying name of the database to export or phrase to filter by') do |d|
|
49
|
-
database = d
|
50
|
-
end
|
51
|
-
|
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|
|
53
|
-
ENV['PG_EXPORT_ENCRYPTION_KEY'] = key
|
54
|
-
end
|
55
|
-
|
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|
|
61
|
-
ENV['KEEP_DUMPS'] = keep
|
62
|
-
end
|
63
|
-
|
64
|
-
opts.on('-t', '--timestamped', 'Enables log messages with timestamps') do
|
65
|
-
ENV['LOGGER_FORMAT'] = 'timestamped'
|
66
|
-
end
|
67
|
-
|
68
|
-
opts.on('-m', '--muted', 'Mutes log messages (overrides -t option)') do
|
69
|
-
ENV['LOGGER_FORMAT'] = 'muted'
|
70
|
-
end
|
71
|
-
|
72
|
-
opts.on('-i', '--interactive', 'Interactive mode, for importing dumps') do
|
73
|
-
ENV['PG_EXPORT_MODE'] = 'interactive'
|
74
|
-
end
|
75
|
-
|
76
|
-
opts.on('-v', '--version', 'Show version') do
|
77
|
-
puts PgExport::VERSION
|
78
|
-
exit
|
79
|
-
end
|
80
|
-
|
81
|
-
opts.on('-h', '--help', 'Show this message') do
|
82
|
-
puts opts
|
83
|
-
exit
|
84
|
-
end
|
85
|
-
|
86
|
-
opts.separator <<~TXT
|
87
|
-
|
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)
|
94
|
-
TXT
|
95
|
-
|
96
|
-
opts.separator "\nTEST RUN"
|
97
|
-
|
98
|
-
opts.on('-c', '--configuration', 'Print the configuration') do
|
99
|
-
x = -> { puts PgExport.new.config }
|
100
|
-
end
|
101
|
-
|
102
|
-
opts.on('-w', '--welcome', 'Try connecting to the gateway (FTP or SSH) to verify the connection') do
|
103
|
-
x = -> { puts PgExport.new.gateway_welcome }
|
104
|
-
end
|
105
|
-
|
106
|
-
if ARGV.empty?
|
107
|
-
puts opts
|
108
|
-
exit
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
9
|
begin
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
rescue
|
10
|
+
config = PgExport::ConfigurationParser.parse
|
11
|
+
pg_export = PgExport.new(config)
|
12
|
+
result = pg_export.call
|
13
|
+
result
|
14
|
+
.on_success { |outcome| puts outcome if outcome }
|
15
|
+
.on_failure { |outcome| warn outcome[:message]; exit 1 }
|
16
|
+
rescue PgExport::ConfigurationParser::Error => e
|
120
17
|
warn e.message.capitalize
|
121
|
-
warn 'Details:'
|
122
|
-
warn option_parser.to_s.split("\n").grep(/ #{e.args.first}/).join("\n")
|
123
|
-
warn 'Type "pg_export" for available options'
|
124
|
-
exit 1
|
125
|
-
end
|
126
|
-
|
127
|
-
begin
|
128
|
-
pg_export = PgExport.new
|
129
|
-
rescue PgExport::InitializationError => e
|
130
|
-
warn 'Unable to initialize PgExport due to invalid configuration. Check you ENVs.'
|
131
|
-
warn "Detailed message: #{e.message}"
|
132
|
-
exit 1
|
133
|
-
end
|
134
18
|
|
135
|
-
|
136
|
-
|
137
|
-
.
|
138
|
-
|
139
|
-
.on_failure do |outcome|
|
140
|
-
warn outcome[:message]
|
141
|
-
exit 1
|
142
|
-
end
|
19
|
+
if e.reason == 'missing argument'
|
20
|
+
warn "\nHint for the #{e.args.first} option:"
|
21
|
+
warn PgExport::ConfigurationParser.help.to_s.split("\n").grep(/ #{e.args.first}/).join("\n")
|
22
|
+
end
|
143
23
|
|
24
|
+
warn 'Type "pg_export -h" to print options.'
|
25
|
+
exit 1
|
144
26
|
rescue Interrupt
|
145
27
|
puts
|
146
28
|
end
|
File without changes
|
@@ -0,0 +1,158 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pg_export/value_objects/result'
|
4
|
+
|
5
|
+
class PgExport
|
6
|
+
class CommandsFactory
|
7
|
+
attr_reader :config
|
8
|
+
|
9
|
+
def initialize(config:)
|
10
|
+
@config = config
|
11
|
+
end
|
12
|
+
|
13
|
+
def print_configuration
|
14
|
+
->(_) { ValueObjects::Success.new(config) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def gateway_welcome
|
18
|
+
->(_) { ValueObjects::Success.new(gateway_factory.gateway.welcome) }
|
19
|
+
end
|
20
|
+
|
21
|
+
def print_version
|
22
|
+
->(_) { ValueObjects::Success.new(PgExport::VERSION) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def print_help
|
26
|
+
->(_) { ValueObjects::Success.new(PgExport::ConfigurationParser.help) }
|
27
|
+
end
|
28
|
+
|
29
|
+
def export_dump
|
30
|
+
require 'pg_export/transactions/export_dump'
|
31
|
+
require 'pg_export/factories/dump_factory'
|
32
|
+
require 'pg_export/adapters/shell_adapter'
|
33
|
+
require 'pg_export/operations/encrypt_dump'
|
34
|
+
require 'pg_export/operations/open_connection'
|
35
|
+
require 'pg_export/operations/remove_old_dumps'
|
36
|
+
require 'pg_export/repositories/gateway_dump_repository'
|
37
|
+
|
38
|
+
PgExport::Transactions::ExportDump.new(
|
39
|
+
dump_factory: Factories::DumpFactory.new,
|
40
|
+
shell_adapter: Adapters::ShellAdapter.new,
|
41
|
+
encrypt_dump: Operations::EncryptDump.new(cipher_factory: cipher_factory),
|
42
|
+
open_connection: Operations::OpenConnection.new(gateway_factory: gateway_factory),
|
43
|
+
remove_old_dumps: Operations::RemoveOldDumps.new(
|
44
|
+
gateway_dump_repository: Repositories::GatewayDumpRepository.new,
|
45
|
+
keep: config.keep_dumps
|
46
|
+
),
|
47
|
+
listeners: plain_listeners
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
def import_dump_interactively
|
52
|
+
require 'pg_export/transactions/import_dump_interactively'
|
53
|
+
require 'pg_export/ui/interactive/input'
|
54
|
+
require 'pg_export/adapters/shell_adapter'
|
55
|
+
require 'pg_export/factories/gateway_dump_file_factory'
|
56
|
+
require 'pg_export/repositories/gateway_dump_repository'
|
57
|
+
require 'pg_export/operations/open_connection'
|
58
|
+
require 'pg_export/operations/decrypt_dump'
|
59
|
+
|
60
|
+
PgExport::Transactions::ImportDumpInteractively.new(
|
61
|
+
input: Ui::Interactive::Input.new,
|
62
|
+
shell_adapter: Adapters::ShellAdapter.new,
|
63
|
+
gateway_dump_file_factory: Factories::GatewayDumpFileFactory.new,
|
64
|
+
gateway_dump_repository: Repositories::GatewayDumpRepository.new,
|
65
|
+
open_connection: Operations::OpenConnection.new(gateway_factory: gateway_factory),
|
66
|
+
decrypt_dump: Operations::DecryptDump.new(cipher_factory: cipher_factory),
|
67
|
+
listeners: interactive_listeners
|
68
|
+
)
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def gateway_factory
|
74
|
+
if config.gateway == :ftp
|
75
|
+
require 'pg_export/factories/ftp_gateway_factory'
|
76
|
+
|
77
|
+
Factories::FtpGatewayFactory.new(config: config)
|
78
|
+
elsif config.gateway == :ssh
|
79
|
+
require 'pg_export/factories/ssh_gateway_factory'
|
80
|
+
|
81
|
+
Factories::SshGatewayFactory.new(config: config)
|
82
|
+
else
|
83
|
+
raise ArgumentError, "Unknown gateway #{config.gateway}"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def cipher_factory
|
88
|
+
require 'pg_export/factories/cipher_factory'
|
89
|
+
|
90
|
+
Factories::CipherFactory.new(
|
91
|
+
encryption_algorithm: config.encryption_algorithm,
|
92
|
+
encryption_key: config.encryption_key
|
93
|
+
)
|
94
|
+
end
|
95
|
+
|
96
|
+
def plain_listeners
|
97
|
+
require 'pg_export/listeners/plain/prepare_params'
|
98
|
+
require 'pg_export/listeners/plain/build_dump'
|
99
|
+
require 'pg_export/listeners/plain/close_connection'
|
100
|
+
require 'pg_export/listeners/plain/decrypt_dump'
|
101
|
+
require 'pg_export/listeners/plain/download_dump'
|
102
|
+
require 'pg_export/listeners/plain/encrypt_dump'
|
103
|
+
require 'pg_export/listeners/plain/fetch_dumps'
|
104
|
+
require 'pg_export/listeners/plain/open_connection'
|
105
|
+
require 'pg_export/listeners/plain/remove_old_dumps'
|
106
|
+
require 'pg_export/listeners/plain/restore'
|
107
|
+
require 'pg_export/listeners/plain/upload_dump'
|
108
|
+
|
109
|
+
logger = build_logger(config.logger_format)
|
110
|
+
|
111
|
+
{
|
112
|
+
prepare_params: Listeners::Plain::PrepareParams.new(logger: logger),
|
113
|
+
build_dump: Listeners::Plain::BuildDump.new(logger: logger),
|
114
|
+
encrypt_dump: Listeners::Plain::EncryptDump.new(logger: logger),
|
115
|
+
open_connection: Listeners::Plain::OpenConnection.new(logger: logger),
|
116
|
+
upload_dump: Listeners::Plain::UploadDump.new(logger: logger),
|
117
|
+
remove_old_dumps: Listeners::Plain::RemoveOldDumps.new(logger: logger),
|
118
|
+
close_connection: Listeners::Plain::CloseConnection.new(logger: logger)
|
119
|
+
}
|
120
|
+
end
|
121
|
+
|
122
|
+
def interactive_listeners
|
123
|
+
require 'pg_export/listeners/interactive/open_connection'
|
124
|
+
require 'pg_export/listeners/interactive/fetch_dumps'
|
125
|
+
require 'pg_export/listeners/interactive/select_dump'
|
126
|
+
require 'pg_export/listeners/interactive/download_dump'
|
127
|
+
require 'pg_export/listeners/interactive/close_connection'
|
128
|
+
require 'pg_export/listeners/interactive/decrypt_dump'
|
129
|
+
require 'pg_export/listeners/interactive/select_database'
|
130
|
+
require 'pg_export/listeners/interactive/restore'
|
131
|
+
|
132
|
+
{
|
133
|
+
open_connection: Listeners::Interactive::OpenConnection.new,
|
134
|
+
fetch_dumps: Listeners::Interactive::FetchDumps.new,
|
135
|
+
select_dump: Listeners::Interactive::SelectDump.new,
|
136
|
+
download_dump: Listeners::Interactive::DownloadDump.new,
|
137
|
+
close_connection: Listeners::Interactive::CloseConnection.new,
|
138
|
+
decrypt_dump: Listeners::Interactive::DecryptDump.new,
|
139
|
+
select_database: Listeners::Interactive::SelectDatabase.new,
|
140
|
+
restore: Listeners::Interactive::Restore.new,
|
141
|
+
}
|
142
|
+
end
|
143
|
+
|
144
|
+
def build_logger(logger_format)
|
145
|
+
require 'logger'
|
146
|
+
|
147
|
+
formatters = {
|
148
|
+
plain: ->(_, _, _, message) { "#{message}\n" },
|
149
|
+
muted: ->(*) {},
|
150
|
+
timestamped: lambda do |severity, datetime, progname, message|
|
151
|
+
"#{datetime} #{Process.pid} TID-#{Thread.current.object_id.to_s(36)}#{progname} #{severity}: #{message}\n"
|
152
|
+
end
|
153
|
+
}
|
154
|
+
|
155
|
+
Logger.new($stdout, formatter: formatters.fetch(logger_format))
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'optparse'
|
4
|
+
|
3
5
|
class PgExport
|
4
6
|
class Configuration
|
5
7
|
ATTRS = %i[
|
@@ -11,24 +13,12 @@ class PgExport
|
|
11
13
|
logger_format
|
12
14
|
keep_dumps
|
13
15
|
gateway mode
|
16
|
+
database
|
17
|
+
command
|
14
18
|
].freeze
|
15
19
|
|
16
20
|
attr_reader *ATTRS
|
17
21
|
|
18
|
-
def self.build(env)
|
19
|
-
new(
|
20
|
-
encryption_key: env['PG_EXPORT_ENCRYPTION_KEY'],
|
21
|
-
encryption_algorithm: env['PG_EXPORT_ENCRYPTION_ALGORITHM'],
|
22
|
-
gateway_host: env['PG_EXPORT_GATEWAY_HOST'],
|
23
|
-
gateway_user: env['PG_EXPORT_GATEWAY_USER'],
|
24
|
-
gateway_password: env['PG_EXPORT_GATEWAY_PASSWORD'],
|
25
|
-
logger_format: env['LOGGER_FORMAT'],
|
26
|
-
keep_dumps: env['KEEP_DUMPS'],
|
27
|
-
gateway: env['GATEWAY'],
|
28
|
-
mode: env['PG_EXPORT_MODE']
|
29
|
-
)
|
30
|
-
end
|
31
|
-
|
32
22
|
def initialize(
|
33
23
|
encryption_key: nil,
|
34
24
|
encryption_algorithm: nil,
|
@@ -38,7 +28,9 @@ class PgExport
|
|
38
28
|
logger_format: nil,
|
39
29
|
keep_dumps: nil,
|
40
30
|
gateway: nil,
|
41
|
-
mode: nil
|
31
|
+
mode: nil,
|
32
|
+
database: nil,
|
33
|
+
command: nil
|
42
34
|
)
|
43
35
|
|
44
36
|
@encryption_key = String(encryption_key)
|
@@ -57,7 +49,9 @@ class PgExport
|
|
57
49
|
|
58
50
|
@logger_format = logger_format.to_s.to_sym
|
59
51
|
@logger_format = :plain if @logger_format.empty?
|
60
|
-
|
52
|
+
unless %i[plain timestamped muted].include?(@logger_format)
|
53
|
+
raise ArgumentError, 'Logger format must be one of: plain, timestamped, muted'
|
54
|
+
end
|
61
55
|
|
62
56
|
@keep_dumps = Integer(keep_dumps || 10)
|
63
57
|
raise ArgumentError, 'Keep dumps must greater or equal to 1' unless @keep_dumps >= 1
|
@@ -69,6 +63,11 @@ class PgExport
|
|
69
63
|
@mode = mode.to_s.to_sym
|
70
64
|
@mode = :plain if @mode.empty?
|
71
65
|
raise ArgumentError, 'Mode must be one of: plain, interactive' unless %i[plain interactive].include?(@mode)
|
66
|
+
|
67
|
+
@database = String(database) unless database.nil?
|
68
|
+
|
69
|
+
@command = command.to_s.to_sym
|
70
|
+
@command = :export_dump if @command.empty?
|
72
71
|
end
|
73
72
|
|
74
73
|
def to_s
|