nxt_heroku_database_backup 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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