backup_paradise 1.2.13

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of backup_paradise might be problematic. Click here for more details.

Files changed (37) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +231 -0
  3. data/backup_paradise.gemspec +51 -0
  4. data/bin/backup_paradise +7 -0
  5. data/doc/README.gen +214 -0
  6. data/doc/TODO.md +221 -0
  7. data/lib/backup_paradise.rb +5 -0
  8. data/lib/backup_paradise/advanced_backup/advanced_backup.rb +53 -0
  9. data/lib/backup_paradise/advanced_backup/audio.rb +124 -0
  10. data/lib/backup_paradise/advanced_backup/constants.rb +34 -0
  11. data/lib/backup_paradise/advanced_backup/data_directory.rb +50 -0
  12. data/lib/backup_paradise/advanced_backup/do_perform_the_backup_tasks.rb +95 -0
  13. data/lib/backup_paradise/advanced_backup/initialize.rb +38 -0
  14. data/lib/backup_paradise/advanced_backup/menu.rb +280 -0
  15. data/lib/backup_paradise/advanced_backup/misc.rb +836 -0
  16. data/lib/backup_paradise/advanced_backup/reset.rb +56 -0
  17. data/lib/backup_paradise/advanced_backup/run.rb +26 -0
  18. data/lib/backup_paradise/advanced_backup/system_directory.rb +35 -0
  19. data/lib/backup_paradise/base/base.rb +440 -0
  20. data/lib/backup_paradise/base/colours.rb +123 -0
  21. data/lib/backup_paradise/base/constants.rb +16 -0
  22. data/lib/backup_paradise/constants/constants.rb +192 -0
  23. data/lib/backup_paradise/gui/gtk2/backup.rb +345 -0
  24. data/lib/backup_paradise/gui/gtk3/backup.rb +383 -0
  25. data/lib/backup_paradise/project/project_base_directory.rb +22 -0
  26. data/lib/backup_paradise/requires/require_the_backup_paradise_project.rb +14 -0
  27. data/lib/backup_paradise/tab/tab.rb +84 -0
  28. data/lib/backup_paradise/toplevel_methods/cliner.rb +16 -0
  29. data/lib/backup_paradise/toplevel_methods/colours.rb +80 -0
  30. data/lib/backup_paradise/toplevel_methods/e.rb +16 -0
  31. data/lib/backup_paradise/toplevel_methods/help.rb +88 -0
  32. data/lib/backup_paradise/toplevel_methods/misc.rb +343 -0
  33. data/lib/backup_paradise/toplevel_methods/mountpoint.rb +80 -0
  34. data/lib/backup_paradise/toplevel_methods/opnn.rb +21 -0
  35. data/lib/backup_paradise/version/version.rb +19 -0
  36. data/lib/backup_paradise/yaml/config.yml +22 -0
  37. metadata +178 -0
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'backup_paradise/toplevel_methods/cliner.rb'
6
+ # =========================================================================== #
7
+ module BackupParadise
8
+
9
+ # ========================================================================= #
10
+ # === BackupParadise.cliner
11
+ # ========================================================================= #
12
+ def self.cliner
13
+ puts '=' * 80
14
+ end
15
+
16
+ end
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'backup_paradise/toplevel_methods/colours.rb'
6
+ # =========================================================================== #
7
+ module BackupParadise
8
+
9
+ begin
10
+ require 'colours'
11
+ rescue LoadError; end
12
+
13
+ # ========================================================================= #
14
+ # === use_colours
15
+ # ========================================================================= #
16
+ @use_colours = true
17
+
18
+ # ========================================================================= #
19
+ # === BackupParadise.use_colours?
20
+ # ========================================================================= #
21
+ def self.use_colours?
22
+ @use_colours
23
+ end
24
+
25
+ # ========================================================================= #
26
+ # === BackupParadise.use_colours=
27
+ # ========================================================================= #
28
+ def self.use_colours=(i)
29
+ @use_colours = i
30
+ end
31
+
32
+ # ========================================================================= #
33
+ # === BackupParadise.sfancy
34
+ # ========================================================================= #
35
+ def self.sfancy(i)
36
+ return Colours.sfancy(i) if @use_colours
37
+ i
38
+ end
39
+
40
+ # ========================================================================= #
41
+ # === BackupParadise.sdir
42
+ # ========================================================================= #
43
+ def self.sdir(i)
44
+ return Colours.sdir(i) if @use_colours
45
+ i
46
+ end
47
+
48
+ # ========================================================================= #
49
+ # === BackupParadise.sfile
50
+ # ========================================================================= #
51
+ def self.sfile(i)
52
+ return Colours.sfile(i) if @use_colours
53
+ i
54
+ end
55
+
56
+ # ========================================================================= #
57
+ # === BackupParadise.simp
58
+ # ========================================================================= #
59
+ def self.simp(i)
60
+ return Colours.simp(i) if @use_colours
61
+ i
62
+ end
63
+
64
+ # ========================================================================= #
65
+ # === BackupParadise.royalblue
66
+ # ========================================================================= #
67
+ def self.royalblue(i)
68
+ return Colours.royalblue(i) if @use_colours
69
+ i
70
+ end
71
+
72
+ # ========================================================================= #
73
+ # === BackupParadise.tomato
74
+ # ========================================================================= #
75
+ def self.tomato(i)
76
+ return Colours.tomato(i) if @use_colours
77
+ i
78
+ end
79
+
80
+ end
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'backup_paradise/toplevel_methods/e.rb'
6
+ # =========================================================================== #
7
+ module BackupParadise
8
+
9
+ # ========================================================================= #
10
+ # === BackupParadise.e
11
+ # ========================================================================= #
12
+ def self.e(i = '')
13
+ puts i
14
+ end
15
+
16
+ end
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'backup_paradise/toplevel_methods/help.rb'
6
+ # =========================================================================== #
7
+ require 'backup_paradise/toplevel_methods/cliner.rb'
8
+ require 'backup_paradise/toplevel_methods/colours.rb'
9
+
10
+ module BackupParadise
11
+
12
+ # ========================================================================= #
13
+ # === BackupParadise.show_help (help tag)
14
+ #
15
+ # Here we register all help-related methods.
16
+ #
17
+ # Two hints are registered, "tohdd", and "no-gtk".
18
+ # To use this, do: Help.show_help
19
+ #
20
+ # Or, from the commandline:
21
+ #
22
+ # rbackup --help
23
+ #
24
+ # ========================================================================= #
25
+ def self.show_help
26
+ e
27
+ cliner
28
+ e ' - Please note that you can use any order for the arguments.'
29
+ e
30
+ e 'Documented help options are:'
31
+ e
32
+ e ' rbackup --programs-dir # Back up the /Programs/ directory quickly'
33
+ e ' rbackup --backup-to=/PATH # Back up into the PATH directory.'
34
+ e
35
+ e 'The following options are NOT yet tested!'
36
+ e
37
+ e " - Pass #{sfancy('tohdd')} to backup to the hdd (usually "\
38
+ "this is the second harddisc)."
39
+ e
40
+ e ' - Pass '+sfancy('tousb ')+'to backup to the (first) usb media.'
41
+ e ' (Aliases exist, such as '+sfancy('usb1')+sfancy(' usb2')+
42
+ sfancy(' usb3')+' and so forth)'
43
+ e
44
+ e ' - Pass '+sfancy('data_only ')+'to backup only the '+
45
+ sdir(HOME_DIRECTORY_OF_THE_USER_X+'DATA/')+' directory.'
46
+ e
47
+ e ' - In general you can backup individual dir as wells.'
48
+ e
49
+ e ' Examples for this:'
50
+ e
51
+ e sfancy(' rbackup audio')
52
+ e sfancy(' rbackup data')
53
+ e
54
+ e ' - You can also chain together commands.'
55
+ e ' Example for chaining together commands:'
56
+ e sfancy(' rbackup data_only usb1')
57
+ e sfancy(' rbackup audio_only usb1')
58
+ e
59
+ e ' - You can backup the /Programs directory.'
60
+ e ' Issue the following command here:'
61
+ e sfancy(' rbackup usb1 programs')
62
+ e sfancy(' rbackup usb1 /Programs')
63
+ e
64
+ e ' - If you do the following.'
65
+ e ' Examples:'
66
+ e sfancy(' rbackup no-mount1')
67
+ e ' Then we wont try to (re)mount the device again.'
68
+ e
69
+ e 'If you want to show the time it took to backup the last some'
70
+ e 'backup-jobs, use this commandline flag:'
71
+ e
72
+ e sfancy(' rbackup --logfile')
73
+ e
74
+ e 'To simply backup into the current working '\
75
+ 'directory (cwd, pwd)'
76
+ e 'use:'
77
+ e
78
+ e sfancy(' rbackup --pwd')
79
+ e
80
+ e 'To use the GTK3 GUI, you could try:'
81
+ e
82
+ e sfancy(' rbackup --gui')
83
+ e
84
+ cliner
85
+ e
86
+ end
87
+
88
+ end
@@ -0,0 +1,343 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'backup_paradise/toplevel_methods/misc.rb'
6
+ # =========================================================================== #
7
+ require 'fileutils'
8
+ require 'backup_paradise/constants/constants.rb'
9
+ require 'backup_paradise/project/project_base_directory.rb'
10
+ require 'backup_paradise/toplevel_methods/colours.rb'
11
+ require 'backup_paradise/toplevel_methods/e.rb'
12
+ require 'backup_paradise/toplevel_methods/opnn.rb'
13
+ require 'backup_paradise/version/version.rb'
14
+
15
+ module BackupParadise
16
+
17
+ _ = "#{BackupParadise::PROJECT_BASE_DIRECTORY}yaml/config.yml" # bl $RUBY_BACKUP/YAML/config.yml
18
+
19
+ # ========================================================================= #
20
+ # === CONFIG
21
+ #
22
+ # Keep track of the configuration of the backup-paradise project.
23
+ # ========================================================================= #
24
+ if File.exist? _
25
+ CONFIG = YAML.load_file(_) # This will be a Hash.
26
+ else
27
+ CONFIG = {}
28
+ end
29
+
30
+ # ========================================================================= #
31
+ # === BackupParadise.remove
32
+ #
33
+ # Easier wrapper when we need to remove something, be it a directory
34
+ # or a file or a symlink.
35
+ # ========================================================================= #
36
+ def self.remove(i)
37
+ if i.is_a? Array
38
+ i.each {|entry| remove(entry) }
39
+ else
40
+ i = rds(i)
41
+ _ = i.dup
42
+ if File.directory? i
43
+ _ = sdir(i)
44
+ elsif File.file?(i)
45
+ _ = sfile(i)
46
+ else # else it will just be fancy.
47
+ _ = sfancy(i)
48
+ end
49
+ e "Trying to remove `#{_}` next."
50
+ if File.directory?(i)
51
+ remove_directory(i)
52
+ elsif File.file?(i)
53
+ remove_this_file(i) # Defined in this file here.
54
+ else
55
+ e 'Not found the action: "'+sfancy(i)+'"'
56
+ end
57
+ end
58
+ end
59
+
60
+ # ========================================================================= #
61
+ # === report_current_dir
62
+ #
63
+ # This method will tell us about the current directory.
64
+ # ========================================================================= #
65
+ def self.report_current_dir
66
+ e "Current location is: #{sdir(Dir.pwd)}"
67
+ end; self.instance_eval { alias report_pwd report_current_dir } # === BackupParadise.report_pwd
68
+ self.instance_eval { alias report_current_directory report_current_dir } # === BackupParadise.report_current_directory
69
+
70
+ # ========================================================================= #
71
+ # === BackupParadise.remove_this_file
72
+ #
73
+ # Use this method to remove a file.
74
+ # ========================================================================= #
75
+ def self.remove_this_file(this_file)
76
+ e "Removing the file `#{sfile(this_file)}` now."
77
+ FileUtils.rm(this_file)
78
+ end
79
+
80
+ # ========================================================================= #
81
+ # === BackupParadise.size?
82
+ #
83
+ # Gives you the size of the given subdirectory.
84
+ #
85
+ # Usage Example:
86
+ #
87
+ # BackupParadise.size?(ENV['J']) # => 1_396_436_232
88
+ # BackupParadise.size?(BackupParadise::AUDIO_DIR) # => 1_396_436_232
89
+ #
90
+ # ========================================================================= #
91
+ def self.size?(subdir_part)
92
+ size = 0 # Default.
93
+ begin
94
+ subdir_part = "#{subdir_part}/**/*"
95
+ results = Dir[subdir_part]
96
+ size = results.inject(0) { |sum, entry|
97
+ result = 0
98
+ result = sum + File.size(entry) if File.exist? entry
99
+ result
100
+ }
101
+ rescue; end # Make it failsave.
102
+ return size.to_s
103
+ end
104
+
105
+ # ========================================================================= #
106
+ # === BackupParadise.size_in_gigabytes?
107
+ #
108
+ # This method will return the size of the target directory in gigabytes.
109
+ # ========================================================================= #
110
+ def self.size_in_gigabytes?(i = BackupParadise::AUDIO_DIR)
111
+ (
112
+ BackupParadise.size?(i).to_f / 1024.0 / 1024.0 / 1000.0
113
+ ).round(1).to_f
114
+ end
115
+
116
+ # ========================================================================= #
117
+ # === BackupParadise.rds
118
+ # ========================================================================= #
119
+ def self.rds(i)
120
+ i.squeeze '/'
121
+ end
122
+
123
+ # ========================================================================= #
124
+ # === BackupParadise.copy_file
125
+ #
126
+ # Copy a file with this method.
127
+ # ========================================================================= #
128
+ def self.copy_file(file, where_to)
129
+ begin
130
+ FileUtils.cp(file, where_to)
131
+ rescue Errno::ENOSPC # Not enough space on target device.
132
+ opnn; e 'We must exit now - there is not enough space left on the '
133
+ opnn; e 'target hdd.'
134
+ rescue Errno::EINVAL # Invalid argument @ rb_sysopen
135
+ opnn; e 'The file can not be copied, possibly because it '\
136
+ 'contains a german umlaut.'
137
+ opnn; e 'We will however continue nonetheless.'
138
+ rescue Errno::EISDIR
139
+ opnn; e 'We currently do not copy directories, only files.'
140
+ rescue Errno::EILSEQ => error
141
+ opnn; e "It seems that we have an invalid or incomplete multibyte "\
142
+ "or wide-character at file `#{sfile(file.to_s)}`."
143
+ opnn; e 'We thus can not copy this file.'
144
+ pp error
145
+ rescue Exception => error # In lucky days, we will never reach this here.
146
+ pp error
147
+ opnn; e 'The above error should be intercepted - please add it,'
148
+ opnn; e 'then press the ENTER key in order to continue.'
149
+ $stdin.gets.chomp # We will remove this line here eventually.
150
+ end
151
+ end; self.instance_eval { alias copy_this_file copy_file } # === BackupParadise.copy_this_file
152
+
153
+ # ========================================================================= #
154
+ # === BackupParadise.copy_recursively
155
+ #
156
+ # Copy the source to the target in a recursive manner.
157
+ #
158
+ # The third argument to this method, `be_verbose`, will feedback
159
+ # to the user if it is set to true. Otherwise, we will just copy
160
+ # silently.
161
+ # ========================================================================= #
162
+ def self.copy_recursively(
163
+ source,
164
+ target,
165
+ be_verbose = :be_verbose
166
+ )
167
+ case be_verbose
168
+ when :be_verbose
169
+ be_verbose = true
170
+ end
171
+ hash_to_use = {
172
+ verbose: be_verbose
173
+ }
174
+ source = source.dup if source.frozen?
175
+ if source.include? '*'
176
+ require 'convert_global_env'
177
+ source = ConvertGlobalEnv[source].dup
178
+ elsif Dir.exist?(source)
179
+ source << '*'
180
+ end
181
+ source = rds(source)
182
+ target = rds(target)
183
+ begin
184
+ case BackupParadise.use_system_cp?
185
+ # ===================================================================== #
186
+ # === true
187
+ #
188
+ # In that case we will use system cp.
189
+ # ===================================================================== #
190
+ when true
191
+ system("cp -Rv #{source} #{target}")
192
+ # ===================================================================== #
193
+ # === false
194
+ # ===================================================================== #
195
+ when false, nil, '', 'default' # In this event we will use FileUtils module.
196
+ extend FileUtils::Verbose if be_verbose
197
+ # source[-1,1] = '' if source[-1,1] == '*'
198
+ FileUtils.cp_r(
199
+ source, target, hash_to_use
200
+ )
201
+ end
202
+ rescue Exception => error
203
+ opnn; e 'An error occurred in method cpr(): '+error.class.to_s
204
+ pp error
205
+ end
206
+
207
+ end; self.instance_eval { alias cpr copy_recursively } # === BackupParadise.cpr
208
+
209
+ # ========================================================================= #
210
+ # === BackupParadise.remove_directory
211
+ # ========================================================================= #
212
+ def self.remove_directory(i)
213
+ i = rds(i)
214
+ unless i == '/' # Tiny "safeguard".
215
+ FileUtils.rm_rf(i) if File.directory?(i)
216
+ end
217
+ end
218
+
219
+ # ========================================================================= #
220
+ # === BackupParadise.change_directory (cd tag, chdir tag)
221
+ #
222
+ # This should no longer be required.
223
+ # ========================================================================= #
224
+ def self.change_directory(i)
225
+ Dir.chdir(i) if File.directory?(i)
226
+ end; self.instance_eval { alias cd change_directory } # === BackupParadise.cd
227
+
228
+ # ========================================================================= #
229
+ # === BackupParadise.create_directory
230
+ #
231
+ # Dir.mkdir would be an alternative. We require DEFAULT_MODE to be set
232
+ # before we can use this method here - hence why we require the file
233
+ # constants.rb.
234
+ # ========================================================================= #
235
+ def self.create_directory(
236
+ i, mode = DEFAULT_MODE
237
+ )
238
+ mode = DEFAULT_MODE if mode.nil?
239
+ if i.count('/') > 1
240
+ # ===================================================================== #
241
+ # We delegate towards FileUtils.mkdir_p() next, but we have to be
242
+ # careful - there may be no space left on the external device, so
243
+ # we have to rescue this situation.
244
+ # ===================================================================== #
245
+ begin
246
+ FileUtils.mkdir_p(i) unless Dir.exist? i
247
+ return true
248
+ rescue Errno::ENOSPC => error
249
+ opnn; e 'It appears to be the case that there is no space left on'
250
+ opnn; e 'the target device.'
251
+ pp error # And show the exact error as well.
252
+ end
253
+ else
254
+ unless File.directory? i
255
+ Dir.mkdir(i, mode)
256
+ return true # Return true just in case we ever need this information.
257
+ end
258
+ end
259
+ false
260
+ end; self.instance_eval { alias mkdir create_directory } # === BackupParadise.mkdir (mkdir tag)
261
+
262
+ # ========================================================================= #
263
+ # === BackupParadise.use_system_cp?
264
+ # ========================================================================= #
265
+ def self.use_system_cp?
266
+ if CONFIG.has_key?('use_system_cp')
267
+ if (CONFIG['use_system_cp'] == true)
268
+ return true
269
+ else
270
+ return false
271
+ end
272
+ else
273
+ return true
274
+ end
275
+ end
276
+
277
+ # ========================================================================= #
278
+ # === debug (debug tag)
279
+ #
280
+ # This is just "quick" debug output.
281
+ # ========================================================================= #
282
+ def debug
283
+ e
284
+ e ' Data directory: '+sfancy(data_directory?)
285
+ e " Main mount point: #{sfancy(mount_point?.to_s)}"
286
+ e
287
+ end
288
+
289
+ # ========================================================================= #
290
+ # === BackupParadise.backup
291
+ #
292
+ # Use this to backup something individually.
293
+ #
294
+ # To invoke this method, do:
295
+ #
296
+ # BackupParadise.backup(:audio, '/Mount/HDD1/')
297
+ #
298
+ # ========================================================================= #
299
+ def self.backup(
300
+ this_directory_or_file = '/home/x/songs/',
301
+ target_location = '/Mount/HDD1/',
302
+ be_verbose = true
303
+ )
304
+ if this_directory_or_file.is_a? Array
305
+ this_directory_or_file.each {|entry|
306
+ Backup.backup(entry, target_location, be_verbose)
307
+ }
308
+ else
309
+ this_directory_or_file = rds(this_directory_or_file)
310
+ case this_directory_or_file
311
+ # ===================================================================== #
312
+ # === :audio
313
+ # ===================================================================== #
314
+ when :audio, :audio_dir, :songs, :songs_dir, :default
315
+ this_directory_or_file = '/home/x/songs/'
316
+ end
317
+ target_location = target_location.to_s
318
+ e "Now backing up directory `#{sdir(this_directory_or_file)}"\
319
+ "` to `#{sdir(target_location)}`."
320
+ cpr( # defined in the file base.rb, meaning "copy recursively".
321
+ this_directory_or_file,
322
+ target_location,
323
+ be_verbose
324
+ )
325
+ rename_tab 'Backing up now ...'
326
+ end
327
+ end
328
+
329
+ # ========================================================================= #
330
+ # === BackupParadise.use_this_program_to_rename_tabs?
331
+ # ========================================================================= #
332
+ def self.use_this_program_to_rename_tabs?
333
+ if CONFIG.has_key?('use_this_program_to_rename_tabs')
334
+ # ===================================================================== #
335
+ # Obtain the program that we will use for renaming the tab.
336
+ # ===================================================================== #
337
+ CONFIG['use_this_program_to_rename_tabs']
338
+ else
339
+ :konsole # Default.
340
+ end
341
+ end
342
+
343
+ end