nxt_heroku_database_backup 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f6f9bc7071511bef9e7526bd263414833ed783263451bf9cb58a266645d6f985
4
- data.tar.gz: 07f88c0d18c20745775d551da611238298adafa8d1ea1980f26a7f6b0f21e881
3
+ metadata.gz: 71e7bbf4fd7c3264955b48fb5b9a06310d77cfa23773a8e130995dd8fe3c4d81
4
+ data.tar.gz: fd9ff6113b374abad0fdb04e47873245483a6977d7e4290db17c2484979c1f84
5
5
  SHA512:
6
- metadata.gz: 60c9be3d5356e5911605a12d97ac93b9392acb6f4b5e6aa4174f3c0f01ceef8ae8cce44266ea308abe3f3aec1c78353f86cf121914060eab6031338369261a95
7
- data.tar.gz: 4138a9f8a442239ac427bba1904931b800ae97adfcdc680c03228b058e91ec6137bae65bbd48fccf6e6ca0bea453c0965067076187b06242fa3d0281c7d6ebb8
6
+ metadata.gz: feca013361b0dc1e08bdfdf9a99d86082030603dcac935b8acfa0b470459d2269e14943f1140ca587bf78d0ae1fbf990a5b88423456d91fe45fc2fa82ecb22cb
7
+ data.tar.gz: 43bbc8ff8499aeb744501fad509b8238108eb5dce0d794e75fb7d8029f53e62fabe4a85a181bb4ac362de746cb7aa7743fa4c0543bc215319f98da2a1463581e
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nxt_heroku_database_backup (0.1.0)
4
+ nxt_heroku_database_backup (0.1.1)
5
5
  aws-sdk-s3
6
6
  nxt_init
7
7
 
@@ -15,8 +15,8 @@ GEM
15
15
  tzinfo (~> 1.1)
16
16
  zeitwerk (~> 2.1, >= 2.1.8)
17
17
  aws-eventstream (1.0.3)
18
- aws-partitions (1.207.0)
19
- aws-sdk-core (3.65.1)
18
+ aws-partitions (1.219.0)
19
+ aws-sdk-core (3.68.0)
20
20
  aws-eventstream (~> 1.0, >= 1.0.2)
21
21
  aws-partitions (~> 1.0)
22
22
  aws-sigv4 (~> 1.1)
@@ -38,7 +38,7 @@ GEM
38
38
  concurrent-ruby (~> 1.0)
39
39
  jmespath (1.4.0)
40
40
  method_source (0.9.2)
41
- minitest (5.12.0)
41
+ minitest (5.12.2)
42
42
  nxt_init (0.1.5)
43
43
  activesupport
44
44
  pry (0.12.2)
data/README.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/nxt_heroku_database_backup`. To experiment with that code, run `bin/console` for an interactive prompt.
4
4
 
5
+ ## TODO
6
+
7
+ - Gzip files before uploading
8
+ - Encrypt files before upload
9
+ - Add other cloud adaptors
10
+
5
11
  ## Installation
6
12
 
7
13
  Add this line to your application's Gemfile:
@@ -0,0 +1,23 @@
1
+ module NxtHerokuDatabaseBackup
2
+ class Encrypter
3
+ include NxtInit
4
+
5
+ attr_init :pass_phrase, :salt, :data
6
+
7
+ def call
8
+ encrypted = encrypter.update(data)
9
+ encrypted << encrypter.final
10
+ end
11
+
12
+ private
13
+
14
+ def encrypter
15
+ @encrypter ||= begin
16
+ encrypter = OpenSSL::Cipher.new 'AES-128-CBC'
17
+ encrypter.encrypt
18
+ encrypter.pkcs5_keyivgen pass_phrase, salt
19
+ encrypter
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,36 +1,60 @@
1
1
  require 'open-uri'
2
2
  require 'aws-sdk-s3'
3
+ require 'openssl'
3
4
 
4
5
  module NxtHerokuDatabaseBackup
5
6
  class Manager
6
7
  include NxtInit
7
8
 
8
- attr_init success_callback: -> { -> { true } },
9
+ attr_init :pass_phrase,
10
+ :salt,
11
+ success_callback: -> { -> { true } },
9
12
  environment: -> { default_environment },
10
13
  backup_name: -> { default_backup_name },
11
- backup_tmp_path: -> { default_backup_tmp_path }
14
+ backup_tmp_path: -> { default_backup_tmp_path },
15
+ uploader: -> { Uploader::S3.new(bucket_name: upload_destination, file_path: encrypted_backup_tmp_path) }
12
16
 
13
17
 
14
18
  def backup_latest_dump
15
- database_backup = open(database_backup_url)
16
- IO.copy_stream(database_backup, backup_tmp_path)
17
- aws_object.upload_file(backup_tmp_path)
19
+ error = nil
20
+ download_backup
21
+ encrypt_backup
22
+ upload_backup
18
23
  execute_success_callback
24
+ rescue StandardError => err
25
+ error = err
19
26
  ensure
20
- File.delete(backup_tmp_path) if File.exist?(backup_tmp_path)
27
+ [backup_tmp_path, encrypted_backup_tmp_path].each do |path|
28
+ File.delete(path) if File.exist?(path)
29
+ end
30
+
31
+ raise error if error
21
32
  end
22
33
 
23
34
  private
24
35
 
25
- def execute_success_callback
26
- success_callback.call
36
+ def upload_backup
37
+ uploader.call
27
38
  end
28
39
 
29
- def aws_object
30
- @aws_object ||= begin
31
- ensure_bucket_exists
32
- Aws::S3::Resource.new(aws_credentials).bucket(bucket_name).object(backup_name)
33
- end
40
+ def encrypt_backup
41
+ NxtHerokuDatabaseBackup::Encrypter.new(
42
+ pass_phrase: pass_phrase,
43
+ salt: salt,
44
+ data: File.read(backup_tmp_path)
45
+ ).call
46
+ end
47
+
48
+ def download_backup
49
+ IO.copy_stream(open(database_backup_url), backup_tmp_path)
50
+ end
51
+
52
+ def encrypted_backup_tmp_path
53
+ "#{backup_tmp_path}.gpg"
54
+ end
55
+
56
+ def execute_success_callback
57
+ success_callback.call
34
58
  end
35
59
 
36
60
  def default_backup_name
@@ -55,30 +79,12 @@ module NxtHerokuDatabaseBackup
55
79
  @heroku_app_name ||= ENV.fetch('HEROKU_APP_NAME')
56
80
  end
57
81
 
58
- def ensure_bucket_exists
59
- s3.head_bucket(bucket: bucket_name)
60
- rescue Aws::S3::Errors::NotFound
61
- s3.create_bucket(bucket: bucket_name)
62
- end
63
-
64
- def bucket_name
65
- @bucket_name ||= "#{heroku_app_name}-db-backups"
82
+ def upload_destination
83
+ @upload_destination ||= "#{heroku_app_name}-db-backups"
66
84
  end
67
85
 
68
86
  def default_environment
69
87
  Object.const_defined?('HerokuEnv') && HerokuEnv.env || 'development'
70
88
  end
71
-
72
- def s3
73
- @s3 ||= Aws::S3::Client.new(**aws_credentials)
74
- end
75
-
76
- def aws_credentials
77
- {
78
- access_key_id: ENV.fetch('DATABASE_BACKUP_AWS_ACCESS_KEY_ID'),
79
- secret_access_key: ENV.fetch('DATABASE_BACKUP_AWS_SECRET_ACCESS_KEY'),
80
- region: ENV.fetch('DATABASE_BACKUP_AWS_REGION')
81
- }
82
- end
83
89
  end
84
90
  end
@@ -0,0 +1,42 @@
1
+ module NxtHerokuDatabaseBackup
2
+ module Uploader
3
+ class S3
4
+ include NxtInit
5
+
6
+ attr_init :bucket_name, :file_path
7
+
8
+ def call
9
+ aws_object.upload_file(file_path)
10
+ end
11
+
12
+ def aws_object
13
+ @aws_object ||= begin
14
+ ensure_bucket_exists
15
+ Aws::S3::Resource.new(aws_credentials).bucket(bucket_name).object(backup_name)
16
+ end
17
+ end
18
+
19
+ def ensure_bucket_exists
20
+ s3.head_bucket(bucket: bucket_name)
21
+ rescue Aws::S3::Errors::NotFound
22
+ s3.create_bucket(bucket: bucket_name)
23
+ end
24
+
25
+ def bucket_name
26
+ @bucket_name ||= "#{heroku_app_name}-db-backups"
27
+ end
28
+
29
+ def client
30
+ @client ||= Aws::S3::Client.new(**aws_credentials)
31
+ end
32
+
33
+ def aws_credentials
34
+ {
35
+ access_key_id: ENV.fetch('DATABASE_BACKUP_AWS_ACCESS_KEY_ID'),
36
+ secret_access_key: ENV.fetch('DATABASE_BACKUP_AWS_SECRET_ACCESS_KEY'),
37
+ region: ENV.fetch('DATABASE_BACKUP_AWS_REGION')
38
+ }
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,3 +1,3 @@
1
1
  module NxtHerokuDatabaseBackup
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -1,5 +1,7 @@
1
1
  require 'nxt_init'
2
2
  require "nxt_heroku_database_backup/version"
3
+ require "nxt_heroku_database_backup/uploader/s3"
4
+ require "nxt_heroku_database_backup/encrypter"
3
5
  require "nxt_heroku_database_backup/manager"
4
6
 
5
7
  module NxtHerokuDatabaseBackup
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nxt_heroku_database_backup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Robecke
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-26 00:00:00.000000000 Z
11
+ date: 2019-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-s3
@@ -127,7 +127,9 @@ files:
127
127
  - bin/console
128
128
  - bin/setup
129
129
  - lib/nxt_heroku_database_backup.rb
130
+ - lib/nxt_heroku_database_backup/encrypter.rb
130
131
  - lib/nxt_heroku_database_backup/manager.rb
132
+ - lib/nxt_heroku_database_backup/uploader/s3.rb
131
133
  - lib/nxt_heroku_database_backup/version.rb
132
134
  - nxt_heroku_database_backup.gemspec
133
135
  homepage: https://www.getsafe.de