backup_paradise 1.2.40

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 (54) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +390 -0
  3. data/backup_paradise.gemspec +50 -0
  4. data/bin/backup_for_ingrid +10 -0
  5. data/bin/backup_paradise +7 -0
  6. data/bin/windows_backup_paradise +9 -0
  7. data/doc/README.gen +347 -0
  8. data/doc/TODO.md +130 -0
  9. data/lib/backup_paradise/actions/README.md +2 -0
  10. data/lib/backup_paradise/actions/backup.rb +62 -0
  11. data/lib/backup_paradise/base/base.rb +493 -0
  12. data/lib/backup_paradise/base/colours.rb +137 -0
  13. data/lib/backup_paradise/base/namespace.rb +16 -0
  14. data/lib/backup_paradise/base/tab.rb +47 -0
  15. data/lib/backup_paradise/colours/colours.rb +88 -0
  16. data/lib/backup_paradise/constants/constants.rb +162 -0
  17. data/lib/backup_paradise/gui/glimmer/libui/backup_for_ingrid/backup_for_ingrid.rb +87 -0
  18. data/lib/backup_paradise/gui/gtk2/OLD_backup.rb +222 -0
  19. data/lib/backup_paradise/gui/gtk3/simple_backup_widget/create.rb +64 -0
  20. data/lib/backup_paradise/gui/gtk3/simple_backup_widget/misc.rb +34 -0
  21. data/lib/backup_paradise/gui/gtk3/simple_backup_widget/simple_backup_widget.rb +167 -0
  22. data/lib/backup_paradise/gui/libui/backup_for_ingrid/backup_for_ingrid.rb +99 -0
  23. data/lib/backup_paradise/gui/libui/simple_backup_widget/simple_backup_widget.rb +119 -0
  24. data/lib/backup_paradise/gui/shared_code/simple_backup_widget/simple_backup_widget_module.rb +595 -0
  25. data/lib/backup_paradise/gui/tk/backup.rb +108 -0
  26. data/lib/backup_paradise/images/BACKUP_IMAGE.png +0 -0
  27. data/lib/backup_paradise/images/right_arrow.png +0 -0
  28. data/lib/backup_paradise/project/project.rb +40 -0
  29. data/lib/backup_paradise/requires/require_the_backup_paradise_project.rb +18 -0
  30. data/lib/backup_paradise/requires/require_yaml.rb +7 -0
  31. data/lib/backup_paradise/tab/tab.rb +87 -0
  32. data/lib/backup_paradise/toplevel_methods/cliner.rb +16 -0
  33. data/lib/backup_paradise/toplevel_methods/config.rb +77 -0
  34. data/lib/backup_paradise/toplevel_methods/create_and_remove.rb +63 -0
  35. data/lib/backup_paradise/toplevel_methods/e.rb +16 -0
  36. data/lib/backup_paradise/toplevel_methods/esystem.rb +19 -0
  37. data/lib/backup_paradise/toplevel_methods/files_and_directories.rb +181 -0
  38. data/lib/backup_paradise/toplevel_methods/help.rb +93 -0
  39. data/lib/backup_paradise/toplevel_methods/misc.rb +153 -0
  40. data/lib/backup_paradise/toplevel_methods/mountpoint.rb +185 -0
  41. data/lib/backup_paradise/toplevel_methods/opnn.rb +25 -0
  42. data/lib/backup_paradise/utility_scripts/backup/backup.rb +1416 -0
  43. data/lib/backup_paradise/utility_scripts/backup/constants.rb +44 -0
  44. data/lib/backup_paradise/utility_scripts/backup/initialize.rb +71 -0
  45. data/lib/backup_paradise/utility_scripts/backup/menu.rb +361 -0
  46. data/lib/backup_paradise/utility_scripts/backup/run.rb +20 -0
  47. data/lib/backup_paradise/version/version.rb +19 -0
  48. data/lib/backup_paradise/windows/README.md +1 -0
  49. data/lib/backup_paradise/windows/windows.rb +101 -0
  50. data/lib/backup_paradise/www/backup.cgi +63 -0
  51. data/lib/backup_paradise/yaml/config.yml +78 -0
  52. data/lib/backup_paradise.rb +5 -0
  53. data/test/testing_toplevel_functionality.rb +11 -0
  54. metadata +198 -0
data/doc/README.gen ADDED
@@ -0,0 +1,347 @@
1
+ # Backup Paradise
2
+ ADD_RUBY_HEADER
3
+ ADD_TIME_STAMP
4
+
5
+ This project attempts to assist you - and me - in backing up data
6
+ to an **external USB** device specifically.
7
+
8
+ The project is mostly catering to my own use cases, so it may not
9
+ be very useful to other ruby users. I will try to make adjustments
10
+ so that other ruby users can use it (see the file called
11
+ **config.yml**), but this is an ongoing effort that may take
12
+ some time.
13
+
14
+ The project is primarily just a fancy **recursive copy** operation,
15
+ but it will do some minor additional notifications on the commandline,
16
+ make use of colours (if the colours gem has been installed),
17
+ automatically create some log files and even provide ruby-gtk3
18
+ bindings, as well as tk-bindings (although the latter ones are
19
+ currently incomplete).
20
+
21
+ So it is a **recursive copy** script with some add-ons really,
22
+ nothing really sophisticated aside from this on top.
23
+
24
+ The project has **one major goal** and a **few minor goals**.
25
+
26
+ The **major goal** is **to be usable as a backup-assistant**,
27
+ on both linux, but also on windows systems.
28
+
29
+ The **minor goals** include:
30
+
31
+ - **Flexibility**, to also allow us to back up only
32
+ individual files or individual directories. The user should
33
+ be able to specify **what** has to be backed up.
34
+
35
+ - Notify the user about the status of the backup-operation
36
+ and prior backup-operations.
37
+
38
+ - Provide some **simple GUI bindings** to use this project,
39
+ in particular for both ruby-gtk and ruby-tk. The latter
40
+ so that we can use this on windows.
41
+
42
+ ## General usage of the BackupParadise project - backing up data via ruby
43
+
44
+ For the time being, I have aliased the main executable at
45
+ **bin/backup_paradise** onto:
46
+
47
+ backup_paradise
48
+
49
+ To then use this, I can issue the following commands:
50
+
51
+ backup_paradise usb1
52
+ backup_paradise usb2
53
+ backup_paradise tousb1
54
+ backup_paradise tousb2
55
+ backup_paradise tousb3
56
+ backup_paradise tousb4
57
+
58
+ Depending on where the **external USB device** is mounted.
59
+
60
+ What does an argument, such as **usb1**, imply?
61
+
62
+ This used to refer to the hardcoded path at <b>/Mount/USB1/</b>
63
+ on my home system. **usb2** would then point at
64
+ <b>/Mount/USB2/</b> and so forth.
65
+
66
+ These 'main aliases' can also be accessed via some shortcuts,
67
+ such as "tousb1", without the quotes. See the examples listed
68
+ above.
69
+
70
+ I adopted this scheme after having used **GoboLinux**. Note that
71
+ this used to be valid from **December 2018** up to **May 2021**.
72
+
73
+ In **May 2021** this approach was changed. While I still use
74
+ the above instructions, such as via **backup_paradise usb1**,
75
+ a .yml file now decides the target directory. So, usb1,
76
+ usb2 and so forth, are now simply aliases to whatever the
77
+ .yml file specifies. The advantage of this approach is that
78
+ other users can re-define the targets there - simply have
79
+ a look at the **config.yml** file and change it if you
80
+ would like to. (Of course overruling this via the commandline
81
+ still works, so you don't really need to have to modify the
82
+ config.yml file.)
83
+
84
+ Other mount points can also be used, although not with a
85
+ convenience shortcut. Have a look at the option
86
+ **--backup-to=/opt/** documented elsewhere in this
87
+ file, to specify another base-directory to use.
88
+
89
+ ## The configuration file called config.yml
90
+
91
+ The **BackupParadise project** comes with a small configuration file,
92
+ called **config.yml**, in the **yaml/** subdirectory.
93
+
94
+ This is an optional file, though - if it does not exist then the
95
+ project will ignore this file completely and use internal
96
+ defaults as-is. But if it is available, and it can be found by
97
+ ruby, then it will be used as **the default configuration**.
98
+
99
+ Since as of **September 2021* the **config.yml** file
100
+ has the following **five main configuration settings**:
101
+
102
+ use_this_program_to_rename_tabs: String
103
+ show_popup_notification: Boolean
104
+ use_system_cp: Boolean
105
+ backup_these_directories: Array
106
+ local_audio_directory: String
107
+
108
+ The first three entries are not so important, but the fourth
109
+ entry is quite important, because this Array specifies which
110
+ directories we want to back up and thus copy. The fifth entry
111
+ can be used to denote your local collection of audio files,
112
+ if these are kept in a directory. I use **/home/x/songs/** for
113
+ this.
114
+
115
+ More options may be added in the future, but I will try to only
116
+ add options that make sense, rather than overwhelm users with
117
+ lots of configuration options.
118
+
119
+ The individual aliases, such as usb1, usb2, and so forth, are
120
+ also specified now:
121
+
122
+ usb1: /Mount/USB1/
123
+ usb2: /Mount/USB2/
124
+ usb3: /Mount/USB3/
125
+ usb4: /Mount/USB4/
126
+ usb5: /Mount/USB5/
127
+
128
+ The rationale for these default to my home setup, where I
129
+ mount devices to these directories (on Linux).
130
+
131
+ ## Log files
132
+
133
+ The BackupParadise project will try to log as to what has happened,
134
+ since as of **May 2018**. Several different log files may be created.
135
+
136
+ If there is more than one log file stored at the target device
137
+ then the current behaviour is to delete all but one log file.
138
+
139
+ Another log file that may commonly be used is the one
140
+ that targets the file <b>/Depot/Temp/backup.log</b>. This
141
+ will, however had, only work if the directory **/Depot/Temp/**
142
+ exists, which is the case on my home system. The whole gem here
143
+ is heavily tailored to my own needs - I can adapt it to meet
144
+ other people's wishes if necessary, of course.
145
+
146
+ The **format** of the log file going into **backup.log** is
147
+ simply how long it took to make the backup, in seconds, and
148
+ the exact date when that particular log file was created. This
149
+ is equal to when the backup-operation happened, too.
150
+
151
+ ## Backing up individual directories
152
+
153
+ If you have a directory called **FOOBAR/**, then you can back
154
+ it up simply by issuing:
155
+
156
+ backup_paradise --FOOBAR
157
+ backup_paradise FOOBAR
158
+
159
+ Whichever variant you prefer. Note that this requires that the
160
+ external device has been mounted already. You can set where
161
+ the device should reside via:
162
+
163
+ BackupParadise.set_mounted_path()
164
+
165
+ Simply pass the directory that you may wish to use for backup
166
+ purpose there.
167
+
168
+ Note that **class AdvancedBackup** will assume a certain target
169
+ device automatically, tailored to my own system. This is usually
170
+ at **/Mount/USB1** for the first mounted USB device on my
171
+ system.
172
+
173
+ If you wish to overrule that and use another target, which you
174
+ may most likely want to do, then you can use any of the
175
+ following commandline flags for this:
176
+
177
+ backup_paradise --use-this-as-target-for-backup=/opt/
178
+ backup_paradise --use-this-as-target=/opt/
179
+ backup_paradise --backup-to=/opt/
180
+
181
+ In this case **/opt/** would be the target that you use as **source
182
+ directory** for the backup-operation.
183
+
184
+ If you wish to backup the **/Programs/** hierarchy, should you
185
+ keep an **AppDir layout** on your system, then this commandline
186
+ invocation may be of help:
187
+
188
+ backup_paradise --programs-dir
189
+
190
+ To backup the **/home/x/studium/** directory, the following
191
+ commands are possible:
192
+
193
+ backup_paradise --studium-dir
194
+ backup_paradise --studium-directory
195
+ backup_paradise --studium
196
+
197
+ To backup, on my home system, the **/AUTOGENERATED/**
198
+ directory, I do:
199
+
200
+ backup_paradise --autogenerated
201
+
202
+ ## Miscellaneous comments
203
+
204
+ The **BackupParadise** project has been rewritten a few times already
205
+ over the years.
206
+
207
+ In the past there was an instance variable in class AdvancedBackup
208
+ called **@last_backup_directory**, which was pointing to an absolute
209
+ path such as **/Mount/USB1/last_backup-13.08.2018-21:11:15/**.
210
+
211
+ It is no longer in use, but I keep it as a reference hint to
212
+ myself - who knows what may be changed in the future.
213
+
214
+ ## Specific examples
215
+
216
+ This subsection details some invocation examples in a short way.
217
+
218
+ Some of these will only work on my home system for the time being,
219
+ until I have sufficiently changed the project to allow more
220
+ flexibility in this regard.
221
+
222
+ Backup all audio-files to **/opt/**:
223
+
224
+ backup_paradise --backup-to=/opt/ --audio-dir
225
+
226
+ Backup all relevant entries into the default chroot target (on
227
+ my home system):
228
+
229
+ backup_paradise --chroot
230
+
231
+ ## How do I make use of this project
232
+
233
+ I make use of the **backup_paradise** project to back up relevant
234
+ data on my home system. For example, all source-archives that
235
+ are registered within the **RBT project** I also keep available
236
+ locally. Then there is my ruby code, other files, and possibly
237
+ books, papers and tutorials stored in .pdf format.
238
+
239
+ In **September 2020**, the regular backup size was **54G** per
240
+ backup-action, mostly owing to the source archives (krita
241
+ alone occupies more than 167 MB, for example). This is way too
242
+ much, in my opinion, because it takes about **half an hour**
243
+ or so to back up on USB 2.0 already.
244
+
245
+ I will have to keep reducing file size and removing stuff that
246
+ I no longer need; aka do some clean-up. Or perhaps hope that
247
+ future USB variants will improve things here.
248
+
249
+ At any rate, this subsection shows just a bit how I may use
250
+ the project.
251
+
252
+ My usual go-to alias is:
253
+
254
+ rbackup usb1
255
+
256
+ to backup to the mount point /Mount/USB1.
257
+
258
+ This is the command invocation I tend to use most frequently
259
+ so.
260
+
261
+ ## class BackupParadise::Backup
262
+
263
+ This class is the main interface for the BackupParadise project.
264
+
265
+ For a list of documented options, pass in **--help**.
266
+
267
+ A few examples will be mentioned here as well, in a succinct
268
+ manner:
269
+
270
+ rbackup --pwd # backup into the current working directory
271
+
272
+ ## BackupParadise.simple_backup
273
+
274
+ **BackupParadise.simple_backup** can be used as a simpler alternative
275
+ to class BackupParadise::Backup. While the latter class is very
276
+ feature-rich, sometimes you may want to use
277
+ **BackupParadise.simple_backup()** instead.
278
+
279
+ Usage examples:
280
+
281
+ BackupParadise.simple_backup(:audio, '/Mount/HDD1/')
282
+ BackupParadise.simple_backup(:audio, :usb1)
283
+
284
+ ## Backup time (statistics)
285
+
286
+ This subsection is just a remainder for me how long backing up all
287
+ my dataset (which is a LOT) takes. These times are gathered on
288
+ Linux.
289
+
290
+ Ideally this time should be as small as possible, but evidently,
291
+ the more time that has to be transferred, the longer it will
292
+ take. This refers to about 100 GB or more right now. I am open
293
+ for any suggestions to cut the time down.
294
+
295
+ The measurements happen when there is a low CPU load.
296
+
297
+ 04.06.2021: 39.17 minutes
298
+
299
+ ## GUI components
300
+
301
+ Right now the **GTK3 version** (ruby-gtk3) is the most advanced GUI
302
+ component of this project - but it is still rather limited.
303
+
304
+ Additionally I am working on **ruby-tk** code as well, just so
305
+ that this project can be used on windows (addendum in August
306
+ 2021: this has been superceded by ruby-libui, which is a LOT
307
+ simpler to use on windows). The priority for ruby-tk is lower
308
+ than that of the ruby-gtk3 code. (In the future, one
309
+ day, we may try to use the same, unified code base for
310
+ GUIs, but this is a minor, additional goal.)
311
+
312
+ You can try to invoke the **GUI components** from the commandline,
313
+ possibly via any of the following flags:
314
+
315
+ backup_paradise --gui
316
+ backup_paradise --gtk # This variant now defaults to ruby-gtk3.
317
+
318
+ Or more specifically:
319
+
320
+ backup_paradise --gtk3
321
+
322
+ There used to be gtk2-bindings, but they currently (**May 2021**)
323
+ do not work very well. In **August 2021** I abandoned the ruby-gtk2
324
+ code completely - new GUI code will be written either in ruby-gtk3
325
+ and/or in ruby-libui. ruby-gtk2 is still nice, but ruby-gtk3 allows
326
+ for more flexibility, in particular in regards to **CSS**.
327
+
328
+ In **September 2021** I rewrote the old ruby-gtk3 code. The current
329
+ iteration now looks like this:
330
+
331
+ <img src="https://i.imgur.com/g1dxzAb.png" style="margin-left: 2em">
332
+
333
+ The code base for that class is now largely a module, which I use
334
+ for libui-bindings too. In the long run I would like to have
335
+ ruby-tk and fxruby support as well as for the www (via sinatra
336
+ and .cgi files). Stay tuned in this regard, but don't expect this
337
+ to come too soon.
338
+
339
+ ## Licence
340
+
341
+ Since as of **August 2021** the MIT licence is used for new releases of
342
+ this gem. While the GPL is a fine licence, I simply do not have the time
343
+ or willingness to want to enforce it for such a simple project like
344
+ **backup_paradise**. MIT is much simpler to adhere to as well, so
345
+ there we go.
346
+
347
+ ADD_CONTACT_INFORMATION
data/doc/TODO.md ADDED
@@ -0,0 +1,130 @@
1
+ ...........................................................................
2
+ (1) → Continue with the ruby-tk bindings on windows. Make this useable
3
+ one day. Improve the ruby-tk bindings. And the fxruby bindings
4
+ too.
5
+ ...........................................................................
6
+ (2) → (Of course overruling this via the commandline
7
+ still works, so you don't really need to have to modify the
8
+ config.yml file.)
9
+ ^^^ enable this
10
+ ^^^ we need a way to overrule these dirs such as:
11
+ --use-these-directories=/home/x,/home/z
12
+ ^^^ and test it. AND document it too.
13
+ ...........................................................................
14
+ (3) → target_hdd_does_not_have_enough_space_left?
15
+ ^^^ fix this. hmmm
16
+ ...........................................................................
17
+ (4) → add some functionality to mount USB devices and umount them again
18
+ # ========================================================================= #
19
+ # === mount_device
20
+ #
21
+ # Normal usage is to call this from:
22
+ #
23
+ # scan_for_usb_entries
24
+ #
25
+ # ========================================================================= #
26
+ def mount_device(which_one = ENV['USB1'])
27
+ @target_device = which_one
28
+ e "Now mounting device #{@which_device_entry} "+
29
+ "to #{@target_device}", CII
30
+ tmp = "mount #{@which_device_entry} #{@target_device}"
31
+ system(tmp)
32
+ @date # zeigt einfach nur das aktuelle datum an
33
+ end
34
+
35
+ # ========================================================================= #
36
+ # === pre_backup_process
37
+ #
38
+ #
39
+ # What is this method doing?
40
+ #
41
+ # It does these things in the following order:
42
+ ##
43
+ # (a) renames last_backup dir to backup_DAY.MONTH.YEAR
44
+ # (b) Deletes log_last_backup file (which contains time of last update)
45
+ # (c) Deletes already existing backup dirs before it continues.
46
+ # (d) Creates directories.
47
+ #
48
+ # base_dir signifies the absolute target.
49
+ # You are in /Mount/USB1 when this method is started.
50
+ # ========================================================================= #
51
+
52
+ # ========================================================================= #
53
+ # === backup_system
54
+ #
55
+ # backup_system() to backup your system. This method is the actual working
56
+ # dog of this script. It accepts one main argument, a symbol, which
57
+ # defaults to nogtk to avoid using gtk, and which also can use tohdd
58
+ # to only backup to my (2nd) harddrive.
59
+ #
60
+ # The mode argument should be either one of these:
61
+ # :nogtk
62
+ # :tohdd
63
+ # :tousb
64
+ # :data_only # this also assumes :tousb
65
+ # ========================================================================= #
66
+ def backup_system(mode = :nogtk, sleep_for_this_time = 0)
67
+ pre_backup_process() # all processes before starting backuping
68
+ # Now splitting towards mode content
69
+ case mode.to_sym
70
+ # dont use gtk
71
+ when :nogtk
72
+ report_backup_process_to('USB device')
73
+ my_sys_cmd = 'cp -vr /Users/x/* .'
74
+ sys(my_sys_cmd)
75
+ synchronize
76
+ # Because my hdd is so slow, we nice the process
77
+ # on -19. Not very important.
78
+ when :tohdd, :festplatte, :hdd
79
+ report_backup_process_to('second HDD')
80
+ backup :audio_dir, :pkg_dir, :system_dir
81
+ when :data_only, :dataonly, :data, :donly, :onlydata
82
+ report_backup_process_to('Data only (default into USB)')
83
+ my_sys_cmd='nice -19 cp -vr /Users/x/DATA/* .'
84
+ e(my_sys_cmd)
85
+ sleep(sleep_for_this_time) # sleeping so that user gets a chance to view the command.
86
+ sys(my_sys_cmd)
87
+ # tousb backup
88
+ when :tousb, :tousb1, :tousb2, :tousb3, :tousb4
89
+ report_backup_process_to('USB Removable media')
90
+ my_sys_cmd = 'nice -19 cp -vr /Users/x/* .'
91
+ e(my_sys_cmd)
92
+ sleep(sleep_for_this_time) # sleeping so that user gets a chance to view the command.
93
+ pp Dir['*']
94
+ sys(my_sys_cmd)
95
+ backup :audio_dir, :pkg_dir, :system_dir
96
+ synchronize # must sync
97
+ # else. Nah, there are no "unhandled cases".
98
+ end
99
+ end
100
+
101
+ # ========================================================================= #
102
+ # === change_to_device_and_start_backup
103
+ # ========================================================================= #
104
+ def change_to_device_and_start_backup(which_mode = @array_arg)
105
+ if Dir.pwd.include? ENV['MY_MOUNT']
106
+ # Prepend the string 'backup_'
107
+ @dir_name = 'last_backup' # name for our backup dir. Normally sets to: last_backup
108
+ # which_mode decides what to do. default is in else
109
+ # The second arg to backup_system means sleep_for_n_seconds
110
+ case which_mode.to_s
111
+ when 'no-gtk','nogtk'
112
+ backup_system()
113
+ when 'tousb3','usb3','3'
114
+ backup_system(:tousb3, 2)
115
+ when 'data_only', 'dataonly', 'data', 'donly', 'onlydata'
116
+ backup_system(:data_only, 2)
117
+ end
118
+ end
119
+ end
120
+
121
+ _ = RBackup.new
122
+ _.scan_for_usb_entries
123
+ _.change_to_device_and_start_backup # also invokes backup_system
124
+ ^^^
125
+ ...........................................................................
126
+ (5) enhance the libui interface
127
+ ideally we should use the same code base, but in September 2021
128
+ this did not work that well, so I abandoned this for now.
129
+ At a later point in time we have to re-evaluate this.
130
+ ...........................................................................
@@ -0,0 +1,2 @@
1
+ All activities that relate to moving, copying or deleting files
2
+ are called "actions". They will be stored in this directory.
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # === BackupParadise::Actions
6
+ # =========================================================================== #
7
+ # require 'backup_paradise/actions/backup.rb'
8
+ # =========================================================================== #
9
+ module BackupParadise
10
+
11
+ module Actions
12
+
13
+ require 'backup_paradise/project/project.rb'
14
+ require 'backup_paradise/requires/require_yaml.rb'
15
+ require 'backup_paradise/toplevel_methods/e.rb'
16
+
17
+ # ========================================================================= #
18
+ # === BackupParadise::Actions.e
19
+ # ========================================================================= #
20
+ def self.e(i = '')
21
+ ::BackupParadise.e(i)
22
+ end
23
+
24
+ # ========================================================================= #
25
+ # === BackupParadise::Actions.backup
26
+ #
27
+ # This method requires a Hash as input-argument. This Hash must provide
28
+ # some basic information, such as to which target we will backup onto.
29
+ # ========================================================================= #
30
+ def self.backup(
31
+ i = ARGV,
32
+ hash = {
33
+ backup_to_this_target: :usb1
34
+ }
35
+ )
36
+ if block_given?
37
+ yielded = yield
38
+ if yielded.is_a? Hash
39
+ hash.merge!(yielded)
40
+ end
41
+ end
42
+ # ======================================================================= #
43
+ # === :commandline_arguments
44
+ #
45
+ # The key :backup_to_this_target is mandatory.
46
+ # ======================================================================= #
47
+ if i.is_a?(Array) and !i.empty?
48
+ hash[:commandline_arguments] = i
49
+ end
50
+ # ======================================================================= #
51
+ # Delegate to a specialized class next.
52
+ # ======================================================================= #
53
+ require 'backup_paradise/utility_scripts/backup/backup.rb'
54
+ BackupParadise::Backup.new(hash)
55
+ end
56
+
57
+ end; end
58
+
59
+ if __FILE__ == $PROGRAM_NAME
60
+ BackupParadise::Actions.backup(ARGV)
61
+ end # actionbackup
62
+ # actionbackup --help