pg_export 1.0.0.rc4 → 1.0.0.rc8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +42 -6
  3. data/CHANGELOG.md +10 -5
  4. data/README.md +63 -32
  5. data/bin/pg_export +15 -134
  6. data/lib/pg_export/{lib/pg_export/adapters/bash_adapter.rb → adapters/shell_adapter.rb} +1 -1
  7. data/lib/pg_export/commands_factory.rb +158 -0
  8. data/lib/pg_export/configuration.rb +74 -31
  9. data/lib/pg_export/configuration_parser.rb +126 -0
  10. data/lib/pg_export/entities/dump.rb +57 -0
  11. data/lib/pg_export/{lib/pg_export/factories → factories}/cipher_factory.rb +8 -4
  12. data/lib/pg_export/{lib/pg_export/factories → factories}/dump_factory.rb +1 -2
  13. data/lib/pg_export/{lib/pg_export/factories → factories}/ftp_gateway_factory.rb +8 -5
  14. data/lib/pg_export/{lib/pg_export/repositories/gateway_dump_file_repository.rb → factories/gateway_dump_file_factory.rb} +4 -5
  15. data/lib/pg_export/{lib/pg_export/factories → factories}/ssh_gateway_factory.rb +8 -5
  16. data/lib/pg_export/{lib/pg_export/gateways → gateways}/ftp.rb +1 -3
  17. data/lib/pg_export/{lib/pg_export/gateways → gateways}/ssh.rb +2 -6
  18. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/build_dump.rb +1 -1
  19. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/close_connection.rb +1 -1
  20. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/decrypt_dump.rb +0 -0
  21. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/download_dump.rb +0 -0
  22. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/encrypt_dump.rb +0 -0
  23. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/fetch_dumps.rb +0 -0
  24. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/open_connection.rb +0 -0
  25. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/remove_old_dumps.rb +1 -1
  26. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/restore.rb +1 -1
  27. data/lib/pg_export/listeners/interactive/select_database.rb +12 -0
  28. data/lib/pg_export/listeners/interactive/select_dump.rb +12 -0
  29. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive/upload_dump.rb +1 -1
  30. data/lib/pg_export/{lib/pg_export/listeners → listeners}/interactive_listener.rb +4 -3
  31. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/build_dump.rb +0 -0
  32. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/close_connection.rb +0 -0
  33. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/decrypt_dump.rb +0 -0
  34. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/download_dump.rb +0 -0
  35. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/encrypt_dump.rb +0 -0
  36. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/fetch_dumps.rb +0 -0
  37. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/open_connection.rb +0 -0
  38. data/lib/pg_export/listeners/plain/prepare_params.rb +15 -0
  39. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/remove_old_dumps.rb +0 -0
  40. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/restore.rb +0 -0
  41. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain/upload_dump.rb +0 -0
  42. data/lib/pg_export/{lib/pg_export/listeners → listeners}/plain_listener.rb +11 -5
  43. data/lib/pg_export/operations/decrypt_dump.rb +30 -0
  44. data/lib/pg_export/operations/encrypt_dump.rb +27 -0
  45. data/lib/pg_export/operations/open_connection.rb +28 -0
  46. data/lib/pg_export/operations/remove_old_dumps.rb +34 -0
  47. data/lib/pg_export/{lib/pg_export/repositories → repositories}/gateway_dump_repository.rb +4 -9
  48. data/lib/pg_export/transactions/evaluator.rb +59 -0
  49. data/lib/pg_export/transactions/export_dump.rb +62 -0
  50. data/lib/pg_export/transactions/import_dump_interactively.rb +78 -0
  51. data/lib/pg_export/{lib/pg_export/ui → ui}/interactive/input.rb +0 -0
  52. data/lib/pg_export/{lib/pg_export/ui → ui}/plain/input.rb +0 -0
  53. data/lib/pg_export/{lib/pg_export/value_objects → value_objects}/dump_file.rb +2 -2
  54. data/lib/pg_export/value_objects/result.rb +49 -0
  55. data/lib/pg_export/version.rb +1 -1
  56. data/lib/pg_export.rb +14 -11
  57. data/pg_export.gemspec +2 -9
  58. metadata +57 -129
  59. data/lib/pg_export/container.rb +0 -23
  60. data/lib/pg_export/import.rb +0 -7
  61. data/lib/pg_export/lib/pg_export/entities/dump.rb +0 -45
  62. data/lib/pg_export/lib/pg_export/operations/decrypt_dump.rb +0 -20
  63. data/lib/pg_export/lib/pg_export/operations/encrypt_dump.rb +0 -18
  64. data/lib/pg_export/lib/pg_export/operations/open_connection.rb +0 -19
  65. data/lib/pg_export/lib/pg_export/operations/remove_old_dumps.rb +0 -26
  66. data/lib/pg_export/lib/pg_export/transactions/export_dump.rb +0 -56
  67. data/lib/pg_export/lib/pg_export/transactions/import_dump_interactively.rb +0 -67
  68. data/lib/pg_export/lib/pg_export/types.rb +0 -14
  69. data/lib/pg_export/system/boot/config.rb +0 -27
  70. data/lib/pg_export/system/boot/ftp.rb +0 -11
  71. data/lib/pg_export/system/boot/interactive.rb +0 -26
  72. data/lib/pg_export/system/boot/operations.rb +0 -17
  73. data/lib/pg_export/system/boot/plain.rb +0 -27
  74. data/lib/pg_export/system/boot/ssh.rb +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d0f62f09db68ae3716d4ae83fea7780240cc66af83d7cbe813cd5d2e7bfae3e7
4
- data.tar.gz: 0f80f6ad47217232ec83877f4bfc1b15c62a248e214229a9a6444bdecee61f44
3
+ metadata.gz: 653b33873daaa6f1c9c23e494f140980d8618d811b4cbff5e7209cd20d854b23
4
+ data.tar.gz: 4aeedec88429805b47e15fd389c02a2a870ec7aeb1b81b7d1e782c57536bce90
5
5
  SHA512:
6
- metadata.gz: ecb017891a15fd94e15eef06972066655f13aeff22a4030ea840dc1ff2df6dd00451b2c7eb2e1dad248f95bc27b63d56cfe6275f675c0f2a2be6ab6f0ad7bdcd
7
- data.tar.gz: e89de78f4a3a3d804f3ee82573fd97d03154a8f792f3e1a63a52f475798a091e96d0fc556e4dabbe8aa3c37497a7ae69c743a232e7bdd8a3a19d70547468df69
6
+ metadata.gz: 43af8e5f80571fb4de1e361097719e89732c99d0e85c4c488d3644a76d31eafd44cc12b0e82258a1d849d393c4324f03e29385dcda725d0606379ee3a9e38a58
7
+ data.tar.gz: 284bb265abde342da455849a18e4a27af9e20d2ae4fe38960b7b3b118f20154828348b9cb2f33b4c9e6c81fdd19a7f0b68a0e8f290a261f193bf1e100ac322fa
data/.rubocop.yml CHANGED
@@ -2,21 +2,57 @@ 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
- Metrics/LineLength:
10
- Max: 200
7
+ Layout/LineLength:
8
+ Max: 140
11
9
 
12
10
  Style/ParallelAssignment:
13
11
  Enabled: false
14
12
 
15
- Naming/UncommunicativeMethodParamName:
13
+ Naming/MethodParameterName:
16
14
  Enabled: false
17
15
 
18
- Documentation:
16
+ Style/Documentation:
19
17
  Enabled: false
20
18
 
21
19
  Lint/UnusedMethodArgument:
22
20
  Enabled: false
21
+
22
+ Metrics/MethodLength:
23
+ Max: 50
24
+
25
+ Metrics/CyclomaticComplexity:
26
+ Max: 30
27
+
28
+ Style/TrailingCommaInHashLiteral:
29
+ Enabled: false
30
+
31
+ Metrics/AbcSize:
32
+ Max: 30
33
+ Exclude:
34
+ - 'lib/pg_export/configuration_parser.rb'
35
+ - 'lib/pg_export/configuration.rb'
36
+
37
+ Metrics/PerceivedComplexity:
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 - 2021.03.20
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,15 +7,20 @@
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
+ - Add `encryption_algorithm` option
11
+ - All command line options has now their equivalents in ENVs (and vice-versa)
12
+ - Remove dry libraries dependencies
13
+ - In case of failure bin/pg_export now returns exit value 1
14
+ - Improve performance
15
+ - Improve error handling
11
16
 
12
17
  ### 0.7.7 - 2020.09.07
13
18
 
14
- - Upgrade dry-initializer
19
+ - Upgrade dry-initializer
15
20
 
16
21
  ### 0.7.6 - 2020.09.05
17
22
 
18
- - Upgrade dry-types, dry-struct dry-system
23
+ - Upgrade dry-types, dry-struct dry-system
19
24
 
20
25
  ### 0.7.0 - 2018.10.18
21
26
 
@@ -41,7 +46,7 @@
41
46
 
42
47
  ### 0.5.0 - 2017.03.11
43
48
 
44
- - Add restriction on DUMP_ENCRYPTION_KEY, to be exactly 16 characters length
49
+ - Add restriction on DUMP_ENCRYPTION_KEY, to be exactly 16 characters length
45
50
  - Make interactive mode more verbose by adding more messages
46
51
  - Fix concurrently opening ftp connection
47
52
  - Add closing ftp connection while importing dump in interactive mode
data/README.md CHANGED
@@ -11,7 +11,7 @@ Can be used for backups or synchronizing databases between production and develo
11
11
  Example:
12
12
 
13
13
  pg_export --database database_name --keep 5
14
-
14
+
15
15
  Above command will perform database dump, encrypt it, upload it to FTP and remove old dumps from FTP, keeping newest 5.
16
16
 
17
17
  FTP connection params and encryption key are configured by env variables.
@@ -50,20 +50,52 @@ Or install it yourself as:
50
50
 
51
51
  $ pg_export -h
52
52
 
53
- Usage: pg_export [options]
54
- -g, --gateway GATEWAY [Optional] ssh or ftp (default: ftp)
55
- -d, --database DATABASE [Required] Name of the database to export
56
- -k, --keep [KEEP] [Optional] Number of dump files to keep on FTP (default: 10)
57
- -t, --timestamped [Optional] Enables log messages with timestamps
58
- -m, --muted [Optional] Mutes log messages (overrides -t option)
59
- -i, --interactive [Optional] Interactive command line mode - for restoring dumps into databases
60
- -v, --version Show version
61
- -h, --help Show this message
62
-
63
- Setting can be verified by running following commands:
64
- -c, --configuration Prints the configuration
65
- -w, --welcome Tries connecting to the gateway (FTP or SSH) to verify the connection
66
-
53
+ SYNOPSIS
54
+ pg_export DATABASE [OPTION..]
55
+ pg_export --interactive DATABASE [OPTION..]
56
+
57
+ EXIT VALUES
58
+ 0 - Success
59
+ 1 - Error
60
+
61
+ ARGUMENTS
62
+ DATABASE - database name to export (when default mode)
63
+ - phrase to filter database dumps by (when interactive mode)
64
+
65
+ OPTIONS
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
85
+
86
+ ENV
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
93
+
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
67
99
 
68
100
  ## How to start
69
101
 
@@ -73,42 +105,41 @@ __Step 1.__ Prepare ENV variables.
73
105
  PG_EXPORT_GATEWAY_HOST=yourftp.example.com
74
106
  PG_EXPORT_GATEWAY_USER=user
75
107
  PG_EXPORT_GATEWAY_PASSWORD=password
76
-
108
+
77
109
  /* Encryption key should have exactly 16 characters. */
78
110
  /* Dumps will be SSL(AES-128-CBC) encrypted using this key. */
79
111
  PG_EXPORT_ENCRYPTION_KEY=1234567890abcdef
80
-
81
- /* Dumps to be kept on FTP */
82
- /* Optional, defaults to 10 */
83
- KEEP_DUMPS=5
84
-
85
- 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).
86
112
 
87
113
  __Step 2.__ Print the configuration to verify if env variables has been loaded properly.
88
114
 
89
115
  $ pg_export --configuration
90
- => {:encryption_key=>"k4***", :gateway_host=>"yourftp.example.com", :gateway_user=>"your_gateway_user",
91
- :gateway_password=>"pass***", :logger_format=>"plain", :keep_dumps=>2}
92
-
116
+ => encryption_key k4***
117
+ gateway_host yourftp.example.com
118
+ gateway_user your_gateway_user
119
+ gateway_password
120
+ logger_format plain
121
+ keep_dumps 10
122
+ ....
123
+
93
124
  __Step 3.__ Try connecting to FTP to verify the connection.
94
125
 
95
126
  $ pg_export --gateway ftp --welcome
96
127
  => 230 User your_ftp_user logged in
97
-
128
+
98
129
  __Step 4.__ Perform database export.
99
130
 
100
- $ pg_export -d your_database [-k 5]
101
- => Dump database your_database to your_database_20181016_121314 (1.36MB)
102
- Encrypt your_database_20181016_121314 (1.34MB)
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)
103
134
  Connect to yourftp.example.com
104
- Upload your_database_20181016_121314 (1.34MB) to yourftp.example.com
135
+ Upload database_name_20181016_121314 (1.34MB) to yourftp.example.com
105
136
  Close FTP
106
-
137
+
107
138
  ## How to restore a dump?
108
139
 
109
140
  Run interactive mode and follow the instructions:
110
141
 
111
- pg_export [-d your_database] -i
142
+ pg_export [-d database_name] -i
112
143
 
113
144
  ## Development
114
145
 
data/bin/pg_export CHANGED
@@ -1,147 +1,28 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'optparse'
4
+ lib = File.expand_path('../lib', __dir__)
5
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
6
 
6
7
  require 'pg_export'
7
8
 
8
- ENV['KEEP_DUMPS'] = ENV['KEEP_DUMPS'] || '10'
9
- ENV['GATEWAY'] = 'ftp'
10
- ENV['PG_EXPORT_MODE'] = 'plain'
11
- ENV['PG_EXPORT_ENCRYPTION_ALGORITHM'] = 'AES-128-CBC'
12
-
13
- database = nil
14
-
15
- option_parser = OptionParser.new do |opts|
16
- opts.banner = <<~TXT
17
- NAME
18
- pg_export - CLI for exporting/importing PostgreSQL dumps via FTP/SSH
19
-
20
- SYNOPSIS (default mode)
21
- pg_export DATABASE [options]
22
-
23
- SYNOPSIS (interactive mode)
24
- pg_export --interactive [DATABASE] [options]
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
- require 'pg_export/container'
100
- PgExport::Container.start(:config)
101
- puts PgExport::Container['config'].to_h
102
- exit
103
- end
104
-
105
- opts.on('-w', '--welcome', 'Try connecting to the gateway (FTP or SSH) to verify the connection') do
106
- require 'pg_export/container'
107
- PgExport::Container.start(ENV['GATEWAY'].to_sym)
108
- gateway = PgExport::Container['factories.gateway_factory'].gateway
109
- puts gateway.welcome
110
- exit
111
- end
112
-
113
- if ARGV.empty?
114
- puts opts
115
- exit
116
- end
117
- end
118
-
119
9
  begin
120
- option_parser.parse!
121
- database = ARGV.first unless ARGV.empty?
122
- rescue OptionParser::ParseError => e
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
123
17
  warn e.message.capitalize
124
- warn 'Details:'
125
- warn option_parser.to_s.split("\n").grep(/ #{e.args.first}/).join("\n")
126
- warn 'Type "pg_export" for available options'
127
- exit
128
- end
129
18
 
130
- require 'pg_export/container'
131
-
132
- begin
133
- pg_export = PgExport.boot
134
- rescue PgExport::InitializationError => e
135
- warn 'Unable to initialize PgExport due to invalid configuration. Check you ENVs.'
136
- warn "Detailed message: #{e.message}"
137
- exit
138
- end
139
-
140
- begin
141
- pg_export.call(database) do |result|
142
- result.success { puts 'Success' }
143
- result.failure { |outcome| warn outcome[:message] }
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")
144
22
  end
23
+
24
+ warn 'Type "pg_export -h" to print options.'
25
+ exit 1
145
26
  rescue Interrupt
146
27
  puts
147
28
  end
@@ -4,7 +4,7 @@ require 'open3'
4
4
 
5
5
  class PgExport
6
6
  module Adapters
7
- class BashAdapter
7
+ class ShellAdapter
8
8
  class PgRestoreError < StandardError; end
9
9
  class PgDumpError < StandardError; end
10
10
 
@@ -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