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,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