alg-backup 3.0.10

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.
Files changed (137) hide show
  1. data/.gitignore +2 -0
  2. data/.infinity_test +7 -0
  3. data/.rspec +3 -0
  4. data/Gemfile +25 -0
  5. data/Gemfile.lock +101 -0
  6. data/LICENSE.md +24 -0
  7. data/README.md +276 -0
  8. data/backup.gemspec +39 -0
  9. data/bin/backup +260 -0
  10. data/lib/backup.rb +168 -0
  11. data/lib/backup/archive.rb +73 -0
  12. data/lib/backup/cli.rb +50 -0
  13. data/lib/backup/compressor/base.rb +17 -0
  14. data/lib/backup/compressor/gzip.rb +61 -0
  15. data/lib/backup/configuration/base.rb +15 -0
  16. data/lib/backup/configuration/compressor/base.rb +10 -0
  17. data/lib/backup/configuration/compressor/gzip.rb +23 -0
  18. data/lib/backup/configuration/database/base.rb +18 -0
  19. data/lib/backup/configuration/database/mongodb.rb +37 -0
  20. data/lib/backup/configuration/database/mysql.rb +37 -0
  21. data/lib/backup/configuration/database/postgresql.rb +37 -0
  22. data/lib/backup/configuration/database/redis.rb +35 -0
  23. data/lib/backup/configuration/encryptor/base.rb +10 -0
  24. data/lib/backup/configuration/encryptor/gpg.rb +17 -0
  25. data/lib/backup/configuration/encryptor/open_ssl.rb +26 -0
  26. data/lib/backup/configuration/helpers.rb +54 -0
  27. data/lib/backup/configuration/notifier/base.rb +39 -0
  28. data/lib/backup/configuration/notifier/mail.rb +52 -0
  29. data/lib/backup/configuration/notifier/twitter.rb +21 -0
  30. data/lib/backup/configuration/storage/base.rb +18 -0
  31. data/lib/backup/configuration/storage/cloudfiles.rb +21 -0
  32. data/lib/backup/configuration/storage/dropbox.rb +29 -0
  33. data/lib/backup/configuration/storage/ftp.rb +25 -0
  34. data/lib/backup/configuration/storage/rsync.rb +25 -0
  35. data/lib/backup/configuration/storage/s3.rb +25 -0
  36. data/lib/backup/configuration/storage/scp.rb +25 -0
  37. data/lib/backup/configuration/storage/sftp.rb +25 -0
  38. data/lib/backup/configuration/syncer/rsync.rb +45 -0
  39. data/lib/backup/configuration/syncer/s3.rb +33 -0
  40. data/lib/backup/database/base.rb +33 -0
  41. data/lib/backup/database/mongodb.rb +137 -0
  42. data/lib/backup/database/mysql.rb +104 -0
  43. data/lib/backup/database/postgresql.rb +111 -0
  44. data/lib/backup/database/redis.rb +105 -0
  45. data/lib/backup/dependency.rb +84 -0
  46. data/lib/backup/encryptor/base.rb +17 -0
  47. data/lib/backup/encryptor/gpg.rb +78 -0
  48. data/lib/backup/encryptor/open_ssl.rb +67 -0
  49. data/lib/backup/finder.rb +39 -0
  50. data/lib/backup/logger.rb +86 -0
  51. data/lib/backup/model.rb +272 -0
  52. data/lib/backup/notifier/base.rb +29 -0
  53. data/lib/backup/notifier/binder.rb +32 -0
  54. data/lib/backup/notifier/mail.rb +141 -0
  55. data/lib/backup/notifier/templates/notify_failure.erb +31 -0
  56. data/lib/backup/notifier/templates/notify_success.erb +16 -0
  57. data/lib/backup/notifier/twitter.rb +87 -0
  58. data/lib/backup/storage/base.rb +67 -0
  59. data/lib/backup/storage/cloudfiles.rb +95 -0
  60. data/lib/backup/storage/dropbox.rb +87 -0
  61. data/lib/backup/storage/ftp.rb +114 -0
  62. data/lib/backup/storage/object.rb +45 -0
  63. data/lib/backup/storage/rsync.rb +99 -0
  64. data/lib/backup/storage/s3.rb +108 -0
  65. data/lib/backup/storage/scp.rb +106 -0
  66. data/lib/backup/storage/sftp.rb +106 -0
  67. data/lib/backup/syncer/base.rb +10 -0
  68. data/lib/backup/syncer/rsync.rb +117 -0
  69. data/lib/backup/syncer/s3.rb +116 -0
  70. data/lib/backup/version.rb +43 -0
  71. data/lib/templates/archive +4 -0
  72. data/lib/templates/compressor/gzip +4 -0
  73. data/lib/templates/database/mongodb +10 -0
  74. data/lib/templates/database/mysql +11 -0
  75. data/lib/templates/database/postgresql +11 -0
  76. data/lib/templates/database/redis +10 -0
  77. data/lib/templates/encryptor/gpg +9 -0
  78. data/lib/templates/encryptor/openssl +5 -0
  79. data/lib/templates/notifier/mail +14 -0
  80. data/lib/templates/notifier/twitter +9 -0
  81. data/lib/templates/readme +15 -0
  82. data/lib/templates/storage/cloudfiles +7 -0
  83. data/lib/templates/storage/dropbox +9 -0
  84. data/lib/templates/storage/ftp +8 -0
  85. data/lib/templates/storage/rsync +7 -0
  86. data/lib/templates/storage/s3 +8 -0
  87. data/lib/templates/storage/scp +8 -0
  88. data/lib/templates/storage/sftp +8 -0
  89. data/lib/templates/syncer/rsync +14 -0
  90. data/lib/templates/syncer/s3 +12 -0
  91. data/spec/archive_spec.rb +90 -0
  92. data/spec/backup_spec.rb +11 -0
  93. data/spec/compressor/gzip_spec.rb +59 -0
  94. data/spec/configuration/base_spec.rb +35 -0
  95. data/spec/configuration/compressor/gzip_spec.rb +28 -0
  96. data/spec/configuration/database/base_spec.rb +16 -0
  97. data/spec/configuration/database/mongodb_spec.rb +30 -0
  98. data/spec/configuration/database/mysql_spec.rb +32 -0
  99. data/spec/configuration/database/postgresql_spec.rb +32 -0
  100. data/spec/configuration/database/redis_spec.rb +30 -0
  101. data/spec/configuration/encryptor/gpg_spec.rb +25 -0
  102. data/spec/configuration/encryptor/open_ssl_spec.rb +31 -0
  103. data/spec/configuration/notifier/mail_spec.rb +32 -0
  104. data/spec/configuration/storage/cloudfiles_spec.rb +34 -0
  105. data/spec/configuration/storage/dropbox_spec.rb +43 -0
  106. data/spec/configuration/storage/ftp_spec.rb +40 -0
  107. data/spec/configuration/storage/rsync_spec.rb +37 -0
  108. data/spec/configuration/storage/s3_spec.rb +37 -0
  109. data/spec/configuration/storage/scp_spec.rb +40 -0
  110. data/spec/configuration/storage/sftp_spec.rb +40 -0
  111. data/spec/configuration/syncer/rsync_spec.rb +46 -0
  112. data/spec/configuration/syncer/s3_spec.rb +43 -0
  113. data/spec/database/base_spec.rb +30 -0
  114. data/spec/database/mongodb_spec.rb +144 -0
  115. data/spec/database/mysql_spec.rb +150 -0
  116. data/spec/database/postgresql_spec.rb +164 -0
  117. data/spec/database/redis_spec.rb +122 -0
  118. data/spec/encryptor/gpg_spec.rb +57 -0
  119. data/spec/encryptor/open_ssl_spec.rb +102 -0
  120. data/spec/logger_spec.rb +46 -0
  121. data/spec/model_spec.rb +236 -0
  122. data/spec/notifier/mail_spec.rb +97 -0
  123. data/spec/notifier/twitter_spec.rb +86 -0
  124. data/spec/spec_helper.rb +21 -0
  125. data/spec/storage/base_spec.rb +33 -0
  126. data/spec/storage/cloudfiles_spec.rb +102 -0
  127. data/spec/storage/dropbox_spec.rb +105 -0
  128. data/spec/storage/ftp_spec.rb +133 -0
  129. data/spec/storage/object_spec.rb +74 -0
  130. data/spec/storage/rsync_spec.rb +115 -0
  131. data/spec/storage/s3_spec.rb +110 -0
  132. data/spec/storage/scp_spec.rb +129 -0
  133. data/spec/storage/sftp_spec.rb +125 -0
  134. data/spec/syncer/rsync_spec.rb +156 -0
  135. data/spec/syncer/s3_spec.rb +139 -0
  136. data/spec/version_spec.rb +21 -0
  137. metadata +217 -0
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Notifier
6
+ class Base < Backup::Configuration::Base
7
+ class << self
8
+
9
+ ##
10
+ # When set to true, the user will be notified by email
11
+ # when a backup process ends without raising any exceptions
12
+ attr_writer :on_success
13
+
14
+ ##
15
+ # When set to true, the user will be notified by email
16
+ # when a backup process raises an exception before finishing
17
+ attr_writer :on_failure
18
+
19
+ end
20
+
21
+ ##
22
+ # When @on_success is nil it means it hasn't been defined
23
+ # and will then default to true
24
+ def self.on_success
25
+ return true if @on_success.nil?
26
+ @on_success
27
+ end
28
+
29
+ ##
30
+ # When @on_failure is nil it means it hasn't been defined
31
+ # and will then default to true
32
+ def self.on_failure
33
+ return true if @on_failure.nil?
34
+ @on_failure
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Notifier
6
+ class Mail < Base
7
+ class << self
8
+
9
+ ##
10
+ # Sender and Receiver email addresses
11
+ # Examples:
12
+ # sender - my.email.address@gmail.com
13
+ # receiver - your.email.address@gmail.com
14
+ attr_accessor :from, :to
15
+
16
+ ##
17
+ # The address to use
18
+ # Example: smtp.gmail.com
19
+ attr_accessor :address
20
+
21
+ ##
22
+ # The port to connect to
23
+ # Example: 587
24
+ attr_accessor :port
25
+
26
+ ##
27
+ # Your domain (if applicable)
28
+ # Example: mydomain.com
29
+ attr_accessor :domain
30
+
31
+ ##
32
+ # Username and Password (sender email's credentials)
33
+ # Examples:
34
+ # user_name - meskyanichi
35
+ # password - my_secret_password
36
+ attr_accessor :user_name, :password
37
+
38
+ ##
39
+ # Authentication type
40
+ # Example: plain
41
+ attr_accessor :authentication
42
+
43
+ ##
44
+ # Automatically set TLS
45
+ # Example: true
46
+ attr_accessor :enable_starttls_auto
47
+
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Notifier
6
+ class Twitter < Base
7
+ class << self
8
+
9
+ ##
10
+ # Twitter consumer key credentials
11
+ attr_accessor :consumer_key, :consumer_secret
12
+
13
+ ##
14
+ # OAuth credentials
15
+ attr_accessor :oauth_token, :oauth_token_secret
16
+
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Storage
6
+ class Base < Backup::Configuration::Base
7
+ class << self
8
+
9
+ ##
10
+ # Sets the limit to how many backups to keep in the remote location.
11
+ # If the limit exceeds it will remove the oldest backup to make room for the newest
12
+ attr_accessor :keep
13
+
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Storage
6
+ class CloudFiles < Base
7
+ class << self
8
+
9
+ ##
10
+ # Rackspace Cloud Files Credentials
11
+ attr_accessor :api_key, :username
12
+
13
+ ##
14
+ # Rackspace Cloud Files container name and path
15
+ attr_accessor :container, :path
16
+
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Storage
6
+ class Dropbox < Base
7
+ class << self
8
+
9
+ ##
10
+ # Dropbox user credentials
11
+ attr_accessor :email, :password
12
+
13
+ ##
14
+ # Dropbox API credentials
15
+ attr_accessor :api_key, :api_secret
16
+
17
+ ##
18
+ # Path to where the backups will be stored
19
+ attr_accessor :path
20
+
21
+ ##
22
+ # Dropbox connection timeout
23
+ attr_accessor :timeout
24
+
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Storage
6
+ class FTP < Base
7
+ class << self
8
+
9
+ ##
10
+ # Server credentials
11
+ attr_accessor :username, :password
12
+
13
+ ##
14
+ # Server IP Address and FTP port
15
+ attr_accessor :ip, :port
16
+
17
+ ##
18
+ # Path to store backups to
19
+ attr_accessor :path
20
+
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Storage
6
+ class RSync < Base
7
+ class << self
8
+
9
+ ##
10
+ # Server credentials
11
+ attr_accessor :username, :password
12
+
13
+ ##
14
+ # Server IP Address and SSH port
15
+ attr_accessor :ip, :port
16
+
17
+ ##
18
+ # Path to store backups to
19
+ attr_accessor :path
20
+
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Storage
6
+ class S3 < Base
7
+ class << self
8
+
9
+ ##
10
+ # Amazon Simple Storage Service (S3) Credentials
11
+ attr_accessor :access_key_id, :secret_access_key
12
+
13
+ ##
14
+ # Amazon S3 bucket name and path
15
+ attr_accessor :bucket, :path
16
+
17
+ ##
18
+ # Region of the specified S3 bucket
19
+ attr_accessor :region
20
+
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Storage
6
+ class SCP < Base
7
+ class << self
8
+
9
+ ##
10
+ # Server credentials
11
+ attr_accessor :username, :password
12
+
13
+ ##
14
+ # Server IP Address and SCP port
15
+ attr_accessor :ip, :port
16
+
17
+ ##
18
+ # Path to store backups to
19
+ attr_accessor :path
20
+
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Storage
6
+ class SFTP < Base
7
+ class << self
8
+
9
+ ##
10
+ # Server credentials
11
+ attr_accessor :username, :password
12
+
13
+ ##
14
+ # Server IP Address and SFTP port
15
+ attr_accessor :ip, :port
16
+
17
+ ##
18
+ # Path to store backups to
19
+ attr_accessor :path
20
+
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,45 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Syncer
6
+ class RSync < Base
7
+ class << self
8
+
9
+ ##
10
+ # Server credentials
11
+ attr_accessor :username, :password
12
+
13
+ ##
14
+ # Server IP Address and SSH port
15
+ attr_accessor :ip
16
+
17
+ ##
18
+ # The SSH port to connect to
19
+ attr_accessor :port
20
+
21
+ ##
22
+ # Directories to sync
23
+ attr_accessor :directories
24
+
25
+ ##
26
+ # Path to store the synced files/directories to
27
+ attr_accessor :path
28
+
29
+ ##
30
+ # Flag for mirroring the files/directories
31
+ attr_accessor :mirror
32
+
33
+ ##
34
+ # Flag for compressing (only compresses for the transfer)
35
+ attr_accessor :compress
36
+
37
+ ##
38
+ # Additional options for the rsync cli
39
+ attr_accessor :additional_options
40
+
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Configuration
5
+ module Syncer
6
+ class S3 < Base
7
+ class << self
8
+
9
+ ##
10
+ # Amazon Simple Storage Service (S3) Credentials
11
+ attr_accessor :access_key_id, :secret_access_key
12
+
13
+ ##
14
+ # Amazon S3 bucket name and path to sync to
15
+ attr_accessor :bucket, :path
16
+
17
+ ##
18
+ # Directories to sync
19
+ attr_accessor :directories
20
+
21
+ ##
22
+ # Flag to enable mirroring
23
+ attr_accessor :mirror
24
+
25
+ ##
26
+ # Additional options for the s3sync cli
27
+ attr_accessor :additional_options
28
+
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Database
5
+ class Base
6
+ include Backup::CLI
7
+ include Backup::Configuration::Helpers
8
+
9
+ ##
10
+ # Contains the path to where the database should be dumped
11
+ attr_accessor :dump_path
12
+
13
+ ##
14
+ # Allows the user to specify the path to a "dump" utility
15
+ # in case it cannot be auto-detected by Backup
16
+ attr_accessor :utility_path
17
+
18
+ ##
19
+ # Defines the @dump_path and ensures it exists by creating it
20
+ def prepare!
21
+ @dump_path = File.join(TMP_PATH, TRIGGER, self.class.name.split('::').last)
22
+ mkdir(dump_path)
23
+ end
24
+
25
+ ##
26
+ # Logs a message to the console and log file to inform
27
+ # the client that Backup is dumping the database
28
+ def log!
29
+ Logger.message("#{ self.class } started dumping and archiving \"#{ name }\".")
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,137 @@
1
+ # encoding: utf-8
2
+
3
+ module Backup
4
+ module Database
5
+ class MongoDB < Base
6
+
7
+ ##
8
+ # Name of the database that needs to get dumped
9
+ attr_accessor :name
10
+
11
+ ##
12
+ # Credentials for the specified database
13
+ attr_accessor :username, :password
14
+
15
+ ##
16
+ # Connectivity options
17
+ attr_accessor :host, :port
18
+
19
+ ##
20
+ # IPv6 support (disabled by default)
21
+ attr_accessor :ipv6
22
+
23
+ ##
24
+ # Collections to dump, collections that aren't specified won't get dumped
25
+ attr_accessor :only_collections
26
+
27
+ ##
28
+ # Additional "mongodump" options
29
+ attr_accessor :additional_options
30
+
31
+ ##
32
+ # Creates a new instance of the MongoDB database object
33
+ def initialize(&block)
34
+ load_defaults!
35
+
36
+ @only_collections ||= Array.new
37
+ @additional_options ||= Array.new
38
+ @ipv6 ||= false
39
+
40
+ instance_eval(&block)
41
+ prepare!
42
+ end
43
+
44
+ ##
45
+ # Builds the MongoDB credentials syntax to authenticate the user
46
+ # to perform the database dumping process
47
+ def credential_options
48
+ %w[username password].map do |option|
49
+ next if send(option).nil? or send(option).empty?
50
+ "--#{option}='#{send(option)}'"
51
+ end.compact.join("\s")
52
+ end
53
+
54
+ ##
55
+ # Builds the MongoDB connectivity options syntax to connect the user
56
+ # to perform the database dumping process
57
+ def connectivity_options
58
+ %w[host port].map do |option|
59
+ next if send(option).nil? or (send(option).respond_to?(:empty?) and send(option).empty?)
60
+ "--#{option}='#{send(option)}'"
61
+ end.compact.join("\s")
62
+ end
63
+
64
+ ##
65
+ # Builds a MongoDB compatible string for the
66
+ # additional options specified by the user
67
+ def additional_options
68
+ @additional_options.join("\s")
69
+ end
70
+
71
+ ##
72
+ # Returns an array of collections to dump
73
+ def collections_to_dump
74
+ @only_collections
75
+ end
76
+
77
+ ##
78
+ # Returns the MongoDB database selector syntax
79
+ def database
80
+ "--db='#{ name }'"
81
+ end
82
+
83
+ ##
84
+ # Returns the mongodump syntax for enabling ipv6
85
+ def ipv6
86
+ @ipv6.eql?(true) ? '--ipv6' : ''
87
+ end
88
+
89
+ ##
90
+ # Returns the MongoDB syntax for determining where to output all the database dumps,
91
+ # e.g. ~/Backup/.tmp/MongoDB/<databases here>/<database collections>
92
+ def dump_directory
93
+ "--out='#{ dump_path }'"
94
+ end
95
+
96
+ ##
97
+ # Builds the full mongodump string based on all attributes
98
+ def mongodump
99
+ "#{ utility(:mongodump) } #{ database } #{ credential_options } " +
100
+ "#{ connectivity_options } #{ ipv6 } #{ additional_options } #{ dump_directory }"
101
+ end
102
+
103
+ ##
104
+ # Performs the mongodump command and outputs the data to the
105
+ # specified path based on the 'trigger'. If the user hasn't specified any
106
+ # specific collections to dump, it'll dump everything. If the user has specified
107
+ # collections to dump, it'll loop through the array of collections and invoke the
108
+ # 'mongodump' command once per collection
109
+ def perform!
110
+ log!
111
+
112
+ if collections_to_dump.is_a?(Array) and not collections_to_dump.empty?
113
+ specific_collection_dump!
114
+ else
115
+ dump!
116
+ end
117
+ end
118
+
119
+ ##
120
+ # Builds and runs the mongodump command
121
+ def dump!
122
+ run(mongodump)
123
+ end
124
+
125
+ ##
126
+ # For each collection in the @only_collections array, it'll
127
+ # build the whole 'mongodump' command, append the '--collection' option,
128
+ # and run the command built command
129
+ def specific_collection_dump!
130
+ collections_to_dump.each do |collection|
131
+ run("#{mongodump} --collection='#{collection}'")
132
+ end
133
+ end
134
+
135
+ end
136
+ end
137
+ end