backup_paradise 1.2.13

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.

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,123 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'backup_paradise/base/colours.rb'
6
+ # =========================================================================== #
7
+ module BackupParadise
8
+
9
+ class Base
10
+
11
+ require 'backup_paradise/toplevel_methods/colours.rb'
12
+
13
+ # ========================================================================= #
14
+ # === simp
15
+ # ========================================================================= #
16
+ def simp(i = '')
17
+ BackupParadise.simp(i)
18
+ end
19
+
20
+ # ========================================================================= #
21
+ # === sdir
22
+ # ========================================================================= #
23
+ def sdir(i = '')
24
+ BackupParadise.sdir(i)
25
+ end
26
+
27
+ # ========================================================================= #
28
+ # === sfile
29
+ # ========================================================================= #
30
+ def sfile(i = '')
31
+ BackupParadise.sfile(i)
32
+ end
33
+
34
+ # ========================================================================= #
35
+ # === sfancy
36
+ # ========================================================================= #
37
+ def sfancy(i = '')
38
+ BackupParadise.sfancy(i)
39
+ end
40
+
41
+ # ========================================================================= #
42
+ # === tomato
43
+ # ========================================================================= #
44
+ def tomato(i)
45
+ BackupParadise.tomato(i)
46
+ end
47
+
48
+ # ========================================================================= #
49
+ # === royalblue
50
+ # ========================================================================= #
51
+ def royalblue(i)
52
+ BackupParadise.royalblue(i)
53
+ end
54
+
55
+ # ========================================================================= #
56
+ # === rosybrown
57
+ # ========================================================================= #
58
+ def rosybrown(i)
59
+ if use_colours?
60
+ return ::Colours.rosybrown(i)
61
+ end
62
+ i
63
+ end
64
+
65
+ # ========================================================================= #
66
+ # === seagreen
67
+ # ========================================================================= #
68
+ def seagreen(i)
69
+ if use_colours?
70
+ return ::Colours.seagreen(i)
71
+ end
72
+ i
73
+ end
74
+
75
+ # ========================================================================= #
76
+ # === steelblue
77
+ # ========================================================================= #
78
+ def steelblue(i)
79
+ if use_colours?
80
+ return ::Colours.steelblue(i)
81
+ end
82
+ i
83
+ end
84
+
85
+ # ========================================================================= #
86
+ # === orangered
87
+ # ========================================================================= #
88
+ def orangered(i)
89
+ if use_colours?
90
+ return ::Colours.orangered(i)
91
+ end
92
+ i
93
+ end
94
+
95
+ # ========================================================================= #
96
+ # === lightcoral
97
+ # ========================================================================= #
98
+ def lightcoral(i)
99
+ if use_colours?
100
+ return ::Colours.lightcoral(i)
101
+ end
102
+ i
103
+ end
104
+
105
+ # ========================================================================= #
106
+ # === rev
107
+ # ========================================================================= #
108
+ def rev
109
+ if Object.const_defined? :Colours
110
+ Colours.rev
111
+ else
112
+ ''
113
+ end
114
+ end
115
+
116
+ # ========================================================================= #
117
+ # === cyan
118
+ # ========================================================================= #
119
+ def cyan
120
+ Colours::CYAN
121
+ end
122
+
123
+ end; end
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'backup_paradise/base/constants.rb'
6
+ # =========================================================================== #
7
+ module BackupParadise
8
+
9
+ class Base
10
+
11
+ # ========================================================================= #
12
+ # === NAMESPACE
13
+ # ========================================================================= #
14
+ NAMESPACE = inspect
15
+
16
+ end; end
@@ -0,0 +1,192 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # require 'backup_paradise/constants/constants.rb'
6
+ # =========================================================================== #
7
+ module BackupParadise
8
+
9
+ # ========================================================================= #
10
+ # === NAMESPACE
11
+ # ========================================================================= #
12
+ NAMESPACE = inspect
13
+
14
+ # ========================================================================= #
15
+ # === N
16
+ # ========================================================================= #
17
+ N = "\n"
18
+
19
+ # ========================================================================= #
20
+ # === AUTOGENERATED_DIRECTORY
21
+ # ========================================================================= #
22
+ AUTOGENERATED_DIRECTORY = '/AUTOGENERATED/'
23
+
24
+ # ========================================================================= #
25
+ # === USB1
26
+ # ========================================================================= #
27
+ USB1 = '/dev/sda1'
28
+
29
+ # ========================================================================= #
30
+ # === USB2
31
+ # ========================================================================= #
32
+ USB2 = '/dev/sdb1'
33
+
34
+ # ========================================================================= #
35
+ # === USB3
36
+ # ========================================================================= #
37
+ USB3 = '/dev/sdc1'
38
+
39
+ # ========================================================================= #
40
+ # === USB4
41
+ # ========================================================================= #
42
+ USB4 = '/dev/sdd1'
43
+
44
+ # ========================================================================= #
45
+ # === USB5
46
+ # ========================================================================= #
47
+ USB5 = '/dev/sde1'
48
+
49
+ # ========================================================================= #
50
+ # === USB6
51
+ # ========================================================================= #
52
+ USB6 = '/dev/sdf1'
53
+
54
+ # ========================================================================= #
55
+ # === USB7
56
+ # ========================================================================= #
57
+ USB7 = '/dev/sdg1'
58
+
59
+ # ========================================================================= #
60
+ # === USB8
61
+ # ========================================================================= #
62
+ USB8 = '/dev/sdh1'
63
+
64
+ # ========================================================================= #
65
+ # === DEFAULT_MODE
66
+ #
67
+ # Which mode we will use for newly-created directories and files.
68
+ # ========================================================================= #
69
+ DEFAULT_MODE = 0755
70
+
71
+ # ========================================================================= #
72
+ # === ARRAY_THE_THREE_MAIN_ENTRIES
73
+ #
74
+ # Keep the proper names here.
75
+ # ========================================================================= #
76
+ ARRAY_THE_THREE_MAIN_ENTRIES = %w(
77
+ DATA
78
+ src
79
+ studium
80
+ )
81
+
82
+ # ========================================================================= #
83
+ # === BackupParadise::ARRAY_THE_FOUR_MAIN_ENTRIES
84
+ #
85
+ # This constant has simply 'BOOKS/' appended onto the above-defined
86
+ # Array.
87
+ # ========================================================================= #
88
+ ARRAY_THE_FOUR_MAIN_ENTRIES = ARRAY_THE_THREE_MAIN_ENTRIES+['books']
89
+
90
+ # ========================================================================= #
91
+ # === HOME_DIRECTORY_OF_THE_USER_X
92
+ # ========================================================================= #
93
+ HOME_DIRECTORY_OF_THE_USER_X = '/home/x/'
94
+
95
+ # ========================================================================= #
96
+ # === STUDIUM_DIRECTORY
97
+ # ========================================================================= #
98
+ if ENV['STUDIUM_DIRECTORY']
99
+ STUDIUM_DIRECTORY = "#{ENV['STUDIUM_DIRECTORY']}/"
100
+ else # else hardcode it.
101
+ STUDIUM_DIRECTORY = "#{HOME_DIRECTORY_OF_THE_USER_X}studium/"
102
+ end; STUDIUM_DIR = STUDIUM_DIRECTORY # === STUDIUM_DIR
103
+
104
+ # ========================================================================= #
105
+ # === DATA_DIR
106
+ #
107
+ # Determine DATA_DIR constant here.
108
+ # ========================================================================= #
109
+ if ENV['MY_DATA']
110
+ DATA_DIR = "#{ENV['MY_DATA']}/"
111
+ else
112
+ DATA_DIR = "#{HOME_DIRECTORY_OF_THE_USER_X}DATA/"
113
+ end; DATA_DIRECTORY = DATA_DIR # === DATA_DIRECTORY
114
+
115
+ # ========================================================================= #
116
+ # === AUDIO_DIR
117
+ #
118
+ # Either we will simply use an environment variable; or we will use a
119
+ # hardcoded path.
120
+ # ========================================================================= #
121
+ if ENV['AUDIO_DIRECTORY'] and File.directory?(ENV['AUDIO_DIRECTORY'])
122
+ AUDIO_DIR = "#{ENV['AUDIO_DIRECTORY']}/"
123
+ else
124
+ AUDIO_DIR = "#{HOME_DIRECTORY_OF_THE_USER_X}songs/"
125
+ end; AUDIO_DIRECTORY = AUDIO_DIR # === AUDIO_DIRECTORY
126
+
127
+ # ========================================================================= #
128
+ # === VIDEO_DIRECTORY
129
+ # ========================================================================= #
130
+ VIDEO_DIRECTORY = "#{HOME_DIRECTORY_OF_THE_USER_X}VIDEO/"
131
+
132
+ # ========================================================================= #
133
+ # === SOURCE_DIRECTORY
134
+ # ========================================================================= #
135
+ if ENV.has_key? 'MY_SRC_DIR'
136
+ SOURCE_DIRECTORY = "#{ENV['MY_SRC_DIR']}/"
137
+ else
138
+ SOURCE_DIRECTORY = "#{HOME_DIRECTORY_OF_THE_USER_X}src/"
139
+ end; SRC_DIR = SOURCE_DIRECTORY # === SRC_DIR
140
+
141
+ # ========================================================================= #
142
+ # === PROGRAMS_DIRECTORY
143
+ # ========================================================================= #
144
+ if ENV.has_key? 'MY_PROGRAMS_DIR'
145
+ PROGRAMS_DIRECTORY = "#{ENV['MY_PROGRAMS_DIR']}/"
146
+ else
147
+ PROGRAMS_DIRECTORY = '/home/Programs/'
148
+ end; PROGRAMS_DIR = PROGRAMS_DIRECTORY # === PROGRAMS_DIR
149
+
150
+ # ========================================================================= #
151
+ # === SYSTEM_SETTINGS_DIRECTORY
152
+ # ========================================================================= #
153
+ SYSTEM_SETTINGS_DIRECTORY = ENV['SYS_SETTINGS'].to_s.dup
154
+ SYS_SETTINGS = SYSTEM_SETTINGS_DIRECTORY # === SYS_SETTINGS
155
+
156
+ # ========================================================================= #
157
+ # === DEPOT_DIRECTORY
158
+ #
159
+ # The Depot directory is determined here.
160
+ # ========================================================================= #
161
+ if ENV['DEPOT']
162
+ DEPOT_DIRECTORY = "#{ENV['DEPOT']}/"
163
+ else
164
+ DEPOT_DIRECTORY = '/Depot/Temp/'
165
+ end
166
+
167
+ # ========================================================================= #
168
+ # === BOOKS_DIRECTORY
169
+ # ========================================================================= #
170
+ if ENV['MY_BOOKS']
171
+ BOOKS_DIRECTORY = "#{ENV['MY_BOOKS'].dup}/"
172
+ else
173
+ BOOKS_DIRECTORY = "#{HOME_DIRECTORY_OF_THE_USER_X}books/"
174
+ end
175
+
176
+ # ========================================================================= #
177
+ # === ARRAY_THE_FIVE_MAIN_ENTRIES
178
+ #
179
+ # This constant is different in that it will list the absolute path to
180
+ # these directories.
181
+ #
182
+ # It also contains the "songs/" directory.
183
+ # ========================================================================= #
184
+ ARRAY_THE_FIVE_MAIN_ENTRIES = [
185
+ DATA_DIRECTORY,
186
+ AUDIO_DIR,
187
+ SOURCE_DIRECTORY,
188
+ STUDIUM_DIRECTORY,
189
+ BOOKS_DIRECTORY
190
+ ]
191
+
192
+ end
@@ -0,0 +1,345 @@
1
+ #!/usr/bin/ruby -w
2
+ # Encoding: UTF-8
3
+ # frozen_string_literal: true
4
+ # =========================================================================== #
5
+ # sysl
6
+ # =========================================================================== #
7
+ require 'gtk_paradise/require_gtk2'
8
+ require 'backup_paradise'
9
+
10
+ module BackupParadise
11
+
12
+ module Gtk
13
+
14
+ class Backup < ::Gtk::Frame # === BackupParadise::Gtk::Backup
15
+
16
+ require 'gtk_paradise/requires/require_the_base_module.rb'
17
+ include ::Gtk::BaseModule
18
+
19
+ begin
20
+ require 'gtk_paradise/classes/gtk2/information_about_the_harddisc.rb'
21
+ rescue LoadError; end
22
+
23
+ require 'open_in_browser'
24
+
25
+ begin
26
+ require 'colours'
27
+ include ::Colours
28
+ rescue LoadError; end
29
+ include ::Gtk::Colours
30
+
31
+ # ========================================================================= #
32
+ # === HEIGHT
33
+ # ========================================================================= #
34
+ HEIGHT = 640
35
+
36
+ # ========================================================================= #
37
+ # === HEIGHT
38
+ # ========================================================================= #
39
+ WIDTH = 1400
40
+
41
+ # ========================================================================= #
42
+ # === REQUEST_THIS_WIDTH
43
+ # ========================================================================= #
44
+ REQUEST_THIS_WIDTH = WIDTH
45
+
46
+ # ========================================================================= #
47
+ # === ARRAY_PREDEFINED_DEVICES
48
+ # ========================================================================= #
49
+ ARRAY_PREDEFINED_DEVICES = [
50
+ ENV['USB1'],
51
+ ENV['USB2'],
52
+ ENV['USB3'],
53
+ ENV['USB4'],
54
+ ENV['USB5'],
55
+ ENV['FESTPLATTE1']
56
+ ]
57
+
58
+ # ========================================================================= #
59
+ # === initialize
60
+ # ========================================================================= #
61
+ def initialize(
62
+ run_already = true
63
+ )
64
+ reset
65
+ super('')
66
+ self.label_widget.set_markup %Q(
67
+ <span size="larger" weight="bold">💾 Backup Script</span>
68
+ )
69
+ set_width_request(REQUEST_THIS_WIDTH)
70
+ shadow_type_etched_in
71
+ run if run_already # Now we can start our wrapper.
72
+ end
73
+
74
+ # ========================================================================= #
75
+ # === reset
76
+ # ========================================================================= #
77
+ def reset
78
+ @height = HEIGHT
79
+ @width = WIDTH
80
+ @title = 'GTK Backup Wrapper'
81
+ # ======================================================================= #
82
+ # === @combo_box
83
+ # ======================================================================= #
84
+ @combo_box = ''.dup
85
+ # ======================================================================= #
86
+ # === @object_rbackup
87
+ # ======================================================================= #
88
+ @object_rbackup = BackupParadise::AdvancedBackup.new(nil, :do_not_run_yet)
89
+ # ======================================================================= #
90
+ # === @object_hdd_info
91
+ # ======================================================================= #
92
+ @object_hdd_info = ::Gtk::InformationAboutTheHarddisc.new
93
+ end
94
+
95
+ # ========================================================================= #
96
+ # === scan_for_new_events
97
+ # ========================================================================= #
98
+ def scan_for_new_events(
99
+ n_seconds = 5
100
+ )
101
+ Thread.new {
102
+ e 'Scanning for new events ...'
103
+ synchronize_data
104
+ sleep n_seconds
105
+ }
106
+ end
107
+
108
+ # ========================================================================= #
109
+ # === create_fdisk_scrolled_window
110
+ #
111
+ # Will create the scrolled window which holds our fdisk information.
112
+ # ========================================================================= #
113
+ def create_fdisk_scrolled_window
114
+ @fdisk_result = update_fdisk
115
+ create_text_view
116
+ @scrolled_window = gtk_scrolled_window(@text_view)
117
+ @scrolled_window.set_policy(
118
+ ::Gtk::POLICY_ALWAYS,
119
+ ::Gtk::POLICY_NEVER
120
+ )
121
+ end
122
+
123
+ # ========================================================================= #
124
+ # === create_text_view
125
+ # ========================================================================= #
126
+ def create_text_view
127
+ @text_buffer = gtk_text_buffer
128
+ @text_buffer.insert_at_cursor(@fdisk_result)
129
+ @text_view = gtk_text_view(@text_buffer)
130
+ @text_view.set_editable(true)
131
+ # @text_view.wrap_mode=3
132
+ end
133
+
134
+ # ========================================================================= #
135
+ # === update_fdisk
136
+ #
137
+ # Use this if you wanna get new fdisk information.
138
+ #
139
+ # Or use this:
140
+ #
141
+ # `fdisk -l`.gsub!(%r[^(!?/dev).*\n], '')
142
+ #
143
+ # ========================================================================= #
144
+ def update_fdisk
145
+ return `fdisk -l`.split("\n").delete_if { |line| line !~ /^\/dev/ }.join("\n")
146
+ end
147
+
148
+ # ========================================================================= #
149
+ # === create_gtk_buttons
150
+ # ========================================================================= #
151
+ def create_gtk_buttons
152
+ # ======================================================================= #
153
+ # === The debug-button
154
+ # ======================================================================= #
155
+ @button_debug = gtk_button('_Debug')
156
+ @button_debug.modify_background(:normal, :darkkhaki)
157
+ @button_debug.modify_background(:prelight, :coral)
158
+ @button_debug.set_size_request(16, 25)
159
+ @button_debug.on_clicked {
160
+ e @combo_box.active_text
161
+ synchronize_data
162
+ }
163
+ # ======================================================================= #
164
+ # === The backup-button
165
+ # ======================================================================= #
166
+ @button_backup = gtk_button('_Backup')
167
+ @button_backup.modify_background(:normal, :darkkhaki)
168
+ @button_backup.modify_background(:prelight, :coral)
169
+ @button_backup.set_size_request(16, 25)
170
+ @button_backup.fancy_tooltips = 'Start the <b>backup-action</b> '\
171
+ 'by clicking this button.'
172
+ @button_backup.on_clicked {
173
+ efancy '#'+'='*78+'#'
174
+ efancy 'Will be doing backup now:'
175
+ efancy '#'+'='*78+'#'
176
+ @object_rbackup.set_dir_name() # first must set proper dir name.
177
+ # First one backup to hdd.
178
+ if @combo_box.active_text == ENV['FESTPLATTE1']
179
+ eimp ' => Doing Backup to '+ENV['FESTPLATTE1']
180
+ @object_rbackup.target_device = ENV['FESTPLATTE1']
181
+ @object_rbackup.backup_system(:tohdd)
182
+ else
183
+ @object_rbackup.information_startup_tasks
184
+ @object_rbackup.get_raw_info
185
+ @object_rbackup.scan_for_usb_entries
186
+ @object_rbackup.backup_system()
187
+ end
188
+ synchronize_data
189
+ }
190
+ end
191
+
192
+ # ========================================================================= #
193
+ # === init_hdd_image
194
+ #
195
+ # Init our hdd image. Copied from hdd_info.rb
196
+ # ========================================================================= #
197
+ def init_hdd_image
198
+ if @object_hdd_info.respond_to? :percentage_used
199
+ tmp = @object_hdd_info.percentage_used.to_i
200
+ else
201
+ tmp = 0
202
+ end
203
+ _tmp_path = ''
204
+ case tmp
205
+ when 0..1 then _tmp_path = 'HDD_EMPTY.png'
206
+ when 2..25 then _tmp_path = 'HDD_ONEFOURTH.png'
207
+ when 26..50 then _tmp_path = 'HDD_HALF.png'
208
+ when 51..75 then _tmp_path = 'HDD_THREEFOURTH.png'
209
+ when 76..89 then _tmp_path = 'HDD_THREEEIGHT.png'
210
+ else # else 90 oder mehr full
211
+ _tmp_path = 'HDD_FULL.png'
212
+ end
213
+ @hdd_image = gtk_image(ENV['IMG_STD']+'/'+_tmp_path)
214
+ @hdd_image.set_padding(3, 3)
215
+ @event_box = gtk_event_box(@hdd_image)
216
+ @event_box.signal_connect(:button_press_event) {
217
+ e 'Starting firefox in /'
218
+ open_in_browser('/')
219
+ }
220
+ return @event_box
221
+ end
222
+
223
+ # ========================================================================= #
224
+ # === gtk2_combo_box_choose_active
225
+ #
226
+ # Das soll eines Tages festlegen welcher Eintrag ausgewählt
227
+ # wird.
228
+ # ========================================================================= #
229
+ def gtk2_combo_box_choose_active
230
+ @combo_box.active = 0
231
+ end
232
+
233
+ # ========================================================================= #
234
+ # === synchronize_data
235
+ #
236
+ # Every button must invoke this method after doing its
237
+ # default task. Currently only updates the variable @fdisk_result
238
+ # ========================================================================= #
239
+ def synchronize_data
240
+ @fdisk_result = update_fdisk
241
+ end
242
+
243
+ # ========================================================================= #
244
+ # === padding?
245
+ # ========================================================================= #
246
+ def padding?
247
+ 8
248
+ end
249
+
250
+ # ========================================================================= #
251
+ # === create_the_buttons
252
+ # ========================================================================= #
253
+ def create_the_buttons
254
+ # ======================================================================= #
255
+ # button quit
256
+ # ======================================================================= #
257
+ @button_quit = gtk_button('_Quit')
258
+ @button_quit.modify_background(:normal, :darkkhaki)
259
+ @button_quit.modify_background(:prelight, :coral)
260
+ @button_quit.set_size_request(16, 26)
261
+ @button_quit.on_clicked {
262
+ @object_rbackup.set_konsole_tab_title
263
+ ::Gtk.main_quit
264
+ }
265
+ end
266
+
267
+ # ========================================================================= #
268
+ # === run
269
+ #
270
+ # The GTK Wrapper to it.
271
+ # ========================================================================= #
272
+ def run
273
+ signal_connect(:delete_event) { ::Gtk.main_quit }
274
+ create_fdisk_scrolled_window
275
+ @main_table = ::Gtk::Table.new(2, 3, true)
276
+ create_the_buttons
277
+ # ======================================================================= #
278
+ # Here are the different entries.
279
+ # ======================================================================= #
280
+ @combo_box = gtk_combo_box_entry
281
+ ARRAY_PREDEFINED_DEVICES.each { |val| @combo_box.append_text(val) }
282
+ gtk2_combo_box_choose_active
283
+
284
+ create_gtk_buttons
285
+ scan_for_new_events(5)
286
+ @main_table.attach_defaults(@button_backup, 0, 1, 0, 1)
287
+ @main_table.attach_defaults(@combo_box, 1, 2, 0, 1)
288
+ @main_table.attach_defaults(@button_debug, 2, 3, 0, 1)
289
+
290
+ @main_table.attach_defaults(@button_quit, 0, 1, 1, 2)
291
+ @main_table.attach_defaults(init_hdd_image, 1, 2, 1, 2)
292
+ @main_table.attach_defaults(@scrolled_window, 2, 3, 1, 2)
293
+
294
+ @main_vbox = gtk_vbox
295
+ @main_vbox.maximal(@main_table, 0)
296
+ mini_hbox = gtk_hbox
297
+ @button_run_the_mount_command = gtk_button('Run → ')
298
+ @button_run_the_mount_command.lightgreen
299
+ @button_run_the_mount_command.fancy_tooltips = 'Clicking this '\
300
+ 'button will run <b>the command on the right hand side</b>.'
301
+ mini_hbox.minimal(@button_run_the_mount_command, 2)
302
+ mini_hbox.minimal(gtk_label('mount '), 2)
303
+ @dropdown_box_holding_all_dev_entries = gtk_dropdown(
304
+ %w(
305
+ /dev/sda1
306
+ /dev/sda2
307
+ /dev/sda3
308
+ /dev/sdb1
309
+ /dev/sdb2
310
+ /dev/sdb3
311
+ /dev/sdc1
312
+ /dev/sdc2
313
+ /dev/sdc3
314
+ )
315
+ )
316
+ @dropdown_box_holding_all_dev_entries.active = 2
317
+ mini_hbox.minimal(@dropdown_box_holding_all_dev_entries, 0)
318
+ mini_hbox.minimal(gtk_label(' onto '), 2)
319
+ dropdown_box_holding_the_mount_targets = gtk_dropdown(ARRAY_PREDEFINED_DEVICES)
320
+ dropdown_box_holding_the_mount_targets.active = 0
321
+ mini_hbox.minimal(dropdown_box_holding_the_mount_targets, 2)
322
+ @button_run_the_mount_command.on_clicked {
323
+ cmd = 'mount '+
324
+ @dropdown_box_holding_all_dev_entries.active_text.to_s+
325
+ ' '+
326
+ dropdown_box_holding_the_mount_targets.active_text.to_s
327
+ e
328
+ esystem cmd
329
+ e
330
+ }
331
+ @main_vbox.minimal(mini_hbox, 0)
332
+ add(@main_vbox)
333
+ show_all
334
+ end
335
+
336
+ end; end; end
337
+
338
+ if __FILE__ == $PROGRAM_NAME
339
+ require 'gtk_paradise/run'
340
+ x = BackupParadise::Gtk::Backup.new
341
+ r = ::Gtk.run
342
+ r << x
343
+ r.position = :center2
344
+ r.top_left_then_run
345
+ end # gtkbackup