source: MondoRescue/trunk/mondo/mondo/xmondo/xmondo.cpp@ 94

Last change on this file since 94 was 94, checked in by bcornec, 18 years ago

x86_64 support (begining)
find_and_store_mondoarchives_home interface change
libmondo-tools.c modified with asprintf

  • Property svn:keywords set to Id
File size: 42.3 KB
Line 
1/***************************************************************************
2 xmondo.cpp - description
3 -------------------
4 begin : Thu Apr 24 19:44:32 PDT 2003
5 copyright : (C) 2003 by Joshua Oreman
6 email : oremanj@get-linux.org
7 cvsid : $Id: xmondo.cpp 94 2005-10-28 23:08:39Z bcornec $
8 ***************************************************************************/
9
10/***************************************************************************
11 * *
12 * This program is free software; you can redistribute it and/or modify *
13 * it under the terms of the GNU General Public License as published by *
14 * the Free Software Foundation; either version 2 of the License, or *
15 * (at your option) any later version. *
16 * *
17 ***************************************************************************/
18
19#include "xmondo.h"
20#include "xmondobackup.h"
21#include "xmondorestore.h"
22#include <config.h>
23#include <qwidgetstack.h>
24#include <qpushbutton.h>
25#include <qsize.h>
26#include <qgrid.h>
27#include <qlayout.h>
28#include <qbuttongroup.h>
29#include <qvbuttongroup.h>
30#include <qhbuttongroup.h>
31#include <qradiobutton.h>
32#include <qlabel.h>
33#include <qthread.h>
34#include <qlineedit.h>
35#include <qlistview.h>
36#include <qmessagebox.h>
37#include <qcheckbox.h>
38#include <qsizepolicy.h>
39#include <qstringlist.h>
40#include <qregexp.h>
41#include <qfile.h>
42#include <qtextstream.h>
43#include <kaboutdialog.h>
44#include <kapp.h>
45
46#include "X-specific.h"
47extern "C" {
48#define bool int
49#include "libmondo-files-EXT.h"
50#include "libmondo-fork-EXT.h"
51#include "libmondo-devices-EXT.h"
52#include "libmondo-string-EXT.h"
53#include "libmondo-tools-EXT.h"
54#undef bool
55}
56
57int g_operation_in_progress = 0;
58
59static char cvsid[] = "$Id: xmondo.cpp 94 2005-10-28 23:08:39Z bcornec $";
60
61QProgressBar *XMondoProgress;
62QLabel *XMondoProgressWhat, *XMondoProgressWhat2, *XMondoProgressWhat3;
63QCheckBox *XMondoVerbose;
64QMultiLineEdit *XMondoLog;
65QLabel *XMondoStatus;
66QLabel *XMondoTimeTaken, *XMondoTimeToGo, *XMondoProgressPercent;
67QPushButton *XMondoCancel;
68XMEventHolder events;
69
70/* log to both the X window and the logfile */
71void xlog_debug_msg (int debug_level, const char *szFile,
72 const char *szFunction, int nLine, const char *fmt, ...)
73{
74 char buf[MAX_STR_LEN];
75
76 va_list ap;
77 va_start (ap, fmt);
78 vsprintf (buf, fmt, ap);
79 va_end (ap);
80
81 log_to_screen (buf);
82 standard_log_debug_msg (debug_level, szFile, szFunction, nLine, buf);
83}
84
85XMondo::XMondo(QWidget *parent, const char *name) : KMainWindow(parent, name)
86{
87 if (does_file_exist (MONDO_LOGFILE)) {
88 unlink (MONDO_LOGFILE);
89 }
90 log_it ("+----------------- XMondo v%-8s -----------+", VERSION);
91 log_it ("| DON'T PANIC! Mondo logs almost everything, so|");
92 log_it ("| don't start worrying just because you see a |");
93 log_it ("| few error messages in the log. Mondo will |");
94 log_it ("| tell you if something really has gone wrong, |");
95 log_it ("| so if it says everything is all right, it |");
96 log_it ("| probably is. But remember to compare your |");
97 log_it ("| backups before trusting them. -- Josh |");
98 log_it ("+----------------------------------------------+");
99
100 QBoxLayout *mainHBox = new QHBoxLayout (this, 5, 5, "mainHBox");
101 buttons = new QVButtonGroup (this, "buttons");
102 QPushButton *bBackup, *bCompare, *bRestore, *bAbout, *bQuit;
103 bBackup = new QPushButton ("Backup", buttons, "bBackup");
104 bCompare = new QPushButton ("Compare", buttons, "bCompare");
105 bRestore = new QPushButton ("Restore", buttons, "bRestore");
106 bAbout = new QPushButton ("About", buttons, "bAbout");
107 bQuit = new QPushButton ("Quit", buttons, "bQuit");
108 mainButtons = buttons;
109 connect (buttons, SIGNAL(clicked(int)), this, SLOT(slotMode(int)));
110 buttons->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Expanding));
111 mainHBox->addWidget (buttons);
112
113 stack = new QWidgetStack (this, "stack");
114 mainHBox->addWidget (stack);
115
116 QWidget *backupPane = new QWidget (stack, "backupPane");
117 QBoxLayout *backupVBox = new QVBoxLayout (backupPane, 5, 5, "backupVBox");
118 backup = new QTabWidget (backupPane, "backup");
119 backupVBox->addWidget (backup);
120 bStartBackup = new QPushButton ("START", backupPane, "startBackup");
121 connect (bStartBackup, SIGNAL(clicked()), this, SLOT(slotStartBackup()));
122 backupVBox->addWidget (bStartBackup);
123 QWidget *bBkpinfoTab, *bOptionsTab, *bAdvancedTab;
124
125 initBackupTab (bBkpinfoTab);
126 tabHardware = bBkpinfoTab;
127 initOptionsTab (bOptionsTab);
128 tabOptions = bOptionsTab;
129 initAdvancedTab (bAdvancedTab);
130 tabAdvanced = bAdvancedTab;
131
132 backup->addTab (bBkpinfoTab, "Hardware");
133 backup->addTab (bOptionsTab, "Options");
134 backup->addTab (bAdvancedTab, "Advanced");
135 connect (backup, SIGNAL(currentChanged(QWidget*)), this, SLOT(slotTabChange(QWidget*)));
136 stack->addWidget (backupPane, 0);
137
138 compare = new QWidget (stack, "compare");
139 initCompareTab (compare);
140 stack->addWidget (compare, 1);
141
142 restore = new QWidget (stack, "restore");
143 QBoxLayout *restoreBox = new QVBoxLayout (restore, 0, 0, "restoreBox");
144 restoreStack = new QWidgetStack (restore, "restoreStack");
145 restoreInfo = new QWidget (restoreStack, "restoreInfo");
146 initRestoreTab (restoreInfo);
147 QWidget *restoreButtonsWidget = new QWidget (restore, "restoreButtonsWidget");
148 restoreButtonsWidget->setSizePolicy (QSizePolicy (QSizePolicy::Expanding, QSizePolicy::Fixed));
149 QBoxLayout *restoreButtons = new QHBoxLayout (restoreButtonsWidget, 5, 5, "restoreButtons");
150 rPrev = new QPushButton ("<- Prev", restoreButtonsWidget, "rPrev");
151 rNext = new QPushButton ("Next ->", restoreButtonsWidget, "rNext");
152 rPrev->hide();
153 rNext->show();
154 connect (rPrev, SIGNAL(clicked()), this, SLOT(slotPrevRestore()));
155 connect (rNext, SIGNAL(clicked()), this, SLOT(slotNextRestore()));
156 restoreButtons->addWidget (rPrev);
157 restoreButtons->addWidget (rNext);
158 restoreBox->addWidget (restoreStack);
159 restoreBox->addWidget (restoreButtonsWidget);
160 restoreStack->addWidget (restoreInfo, 0);
161 restoreStack->raiseWidget (0);
162
163 stack->addWidget (restore, 2);
164
165 QWidget *progress = new QWidget (stack, "progress");
166 QGridLayout *grid = new QGridLayout (progress, 9, 2, 5, 5);
167 XMondoProgress = new QProgressBar (progress);
168 XMondoProgressWhat = new QLabel (progress);
169 XMondoProgressWhat2 = new QLabel (progress);
170 XMondoProgressWhat3 = new QLabel (progress);
171 XMondoVerbose = new QCheckBox ("Verbose", progress);
172 XMondoLog = new QMultiLineEdit (progress);
173 XMondoStatus = new QLabel (progress);
174 XMondoTimeTaken = new QLabel (progress);
175 XMondoTimeToGo = new QLabel (progress);
176 XMondoCancel = new QPushButton ("Cancel", progress, "bCancel");
177 grid->addMultiCellWidget (XMondoStatus, 0, 0, 0, 1);
178 grid->addMultiCellWidget (XMondoVerbose, 1, 1, 0, 1, AlignRight);
179 grid->addMultiCellWidget (XMondoLog, 2, 2, 0, 1);
180 grid->addMultiCellWidget (XMondoProgressWhat, 3, 3, 0, 1);
181 grid->addMultiCellWidget (XMondoProgressWhat2, 4, 4, 0, 1);
182 grid->addMultiCellWidget (XMondoProgressWhat3, 5, 5, 0, 1);
183 grid->addMultiCellWidget (XMondoProgress, 6, 6, 0, 1);
184 grid->addWidget (XMondoTimeTaken, 7, 0);
185 grid->addWidget (XMondoTimeToGo, 7, 1);
186 grid->addMultiCellWidget (XMondoCancel, 8, 8, 0, 1);
187
188 connect (XMondoVerbose, SIGNAL(toggled(bool)), this, SLOT(slotVerboseChange(bool)));
189 slotVerboseChange (false);
190
191 stack->addWidget (progress, 3);
192 stack->raiseWidget (0);
193}
194
195XMondo::~XMondo()
196{
197 if (rstr) delete rstr;
198}
199
200void XMondo::slotVerboseChange (bool on)
201{
202 if (on) {
203 log_debug_msg = xlog_debug_msg;
204 } else {
205 log_debug_msg = standard_log_debug_msg;
206 }
207}
208
209void XMondo::slotMode (int x)
210{
211 if (x < 3) {
212 stack->raiseWidget (x);
213 return;
214 }
215
216 if (x >= 4) {
217 kapp->quit();
218 return;
219 }
220
221 KAboutDialog *about;
222
223 about = new KAboutDialog (0, "about");
224 about->setCaption ("About XMondo");
225 about->setVersion ("Version 0.1");
226 QPixmap logo;
227 if (logo.load ("mondo.png")) {
228 about->setLogo (logo);
229 } else {
230 char logo_location[MAX_STR_LEN];
231
232 if ((logo_location = find_and_store_mondoarchives_home()) != NULL) {
233 strcat (logo_location, "/mondo.png");
234 if (logo.load (logo_location)) {
235 about->setLogo (logo);
236 } else {
237 qDebug ("Warning - logo not found in Mondo's home directory");
238 }
239 } else {
240 qDebug ("Warning - can't find & store Mondo's home directory");
241 }
242 }
243
244 about->setMaintainer ("Joshua Oreman", "oremanj@get-linux.org", "", "Author of XMondo");
245 about->setAuthor ("Hugo Rabson", "hugo.rabson@mondorescue.org", "http://www.mondorescue.org/", "Author of Mondo and Mindi");
246 about->addContributor ("Stan Benoit", "troff@nakedsoul.org", "http://www.nakedsoul.org/~troff/", "Beta testing & bugfixes");
247 about->addContributor ("Jesse Keating", "hosting@j2solutions.net", "http://geek.j2solutions.net/", "Package maintainer");
248 about->addContributor ("Hector Alvarez", "hector@debian.org", "", "Debian package maintainer");
249 about->exec();
250}
251
252void doMediaType (int x, QLabel *lDOption, QLineEdit *editDOption, QLineEdit *editMediaSize,
253 QLabel *nfsRemoteDir, QLineEdit *editNFSRemoteDir)
254{
255 char cdrw_dev [100], cdrom_dev [100];
256 if (find_cdrw_device (cdrw_dev)) strcpy (cdrw_dev, "0,0,0");
257 if (find_cdrom_device (cdrom_dev, 0)) strcpy (cdrom_dev, "");
258
259 switch (x) {
260 case 0:
261 lDOption->setText ("CD-R node:");
262 editDOption->setText (cdrw_dev);
263 if (editMediaSize) {
264 editMediaSize->setText ("650");
265 editMediaSize->setEnabled (true);
266 }
267 nfsRemoteDir->setEnabled (false);
268 editNFSRemoteDir->setEnabled (false);
269 break;
270 case 1:
271 lDOption->setText ("CD-RW node:");
272 editDOption->setText (cdrw_dev);
273 if (editMediaSize) {
274 editMediaSize->setText ("650");
275 editMediaSize->setEnabled (true);
276 }
277 nfsRemoteDir->setEnabled (false);
278 editNFSRemoteDir->setEnabled (false);
279 break;
280 case 2:
281 lDOption->setText ("CD streamer node:");
282 editDOption->setText (cdrw_dev);
283 if (editMediaSize) {
284 editMediaSize->setText ("650");
285 editMediaSize->setEnabled (true);
286 }
287 nfsRemoteDir->setEnabled (false);
288 editNFSRemoteDir->setEnabled (false);
289 break;
290 case 3:
291 lDOption->setText ("DVD /dev entry:");
292 editDOption->setText (cdrom_dev);
293 if (editMediaSize) {
294 editMediaSize->setText ("4480");
295 editMediaSize->setEnabled (true);
296 }
297 nfsRemoteDir->setEnabled (false);
298 editNFSRemoteDir->setEnabled (false);
299 break;
300 case 4:
301 lDOption->setText ("Directory for ISOs:");
302 editDOption->setText ("/root/images/mondo");
303 if (editMediaSize) {
304 editMediaSize->setText ("650");
305 editMediaSize->setEnabled (true);
306 }
307 nfsRemoteDir->setEnabled (false);
308 editNFSRemoteDir->setEnabled (false);
309 break;
310 case 5:
311 lDOption->setText ("NFS share:");
312 editDOption->setText ("");
313 if (editMediaSize) {
314 editMediaSize->setText ("4600");
315 editMediaSize->setEnabled (true);
316 }
317 nfsRemoteDir->setEnabled (true);
318 editNFSRemoteDir->setEnabled (true);
319 editNFSRemoteDir->setText ("");
320 break;
321 case 6:
322 lDOption->setText ("Tape /dev entry:");
323#if __FreeBSD__
324 editDOption->setText ("/dev/sa0");
325#elif linux
326 editDOption->setText ("/dev/st0");
327#else
328 editDOption->setText ("");
329#endif
330 if (editMediaSize) {
331 editMediaSize->setText ("n/a");
332 editMediaSize->setEnabled (false);
333 }
334 nfsRemoteDir->setEnabled (false);
335 editNFSRemoteDir->setEnabled (false);
336 break;
337 case 7:
338 lDOption->setText ("Device/file to use:");
339 editDOption->setText ("");
340 if (editMediaSize) {
341 editMediaSize->setText ("n/a");
342 editMediaSize->setEnabled (false);
343 }
344 nfsRemoteDir->setEnabled (false);
345 editNFSRemoteDir->setEnabled (false);
346 break;
347 }
348}
349
350void XMondo::slotMediaType (int x)
351{
352 doMediaType (x, lDOption, editDOption, editMediaSize, nfsRemoteDir, editNFSRemoteDir);
353}
354
355void XMondo::slotCompareMediaType (int x)
356{
357 doMediaType (x, compareLDOption, compareEditDOption, 0, compareNFSRemoteDir, compareEditNFSRemoteDir);
358}
359
360void XMondo::slotRestoreMediaType (int x)
361{
362 char cdrom_device[256];
363 if (does_file_exist ("/dev/cdroms/cdrom0")) {
364 strcpy (cdrom_device, "/dev/cdroms/cdrom0");
365 } else if (does_file_exist ("/dev/cdrom")) {
366 strcpy (cdrom_device, "/dev/cdrom");
367 } else {
368 find_cdrom_device (cdrom_device, false);
369 }
370
371 switch (x) {
372 case 0:
373 restoreLDOption->setText ("CD device:");
374 restoreEditDOption->setText (cdrom_device);
375 restoreNFSRemoteDir->setEnabled (false);
376 restoreEditNFSRemoteDir->setEnabled (false);
377 break;
378 case 1:
379 restoreLDOption->setText ("CD device:");
380 restoreEditDOption->setText (cdrom_device);
381 restoreNFSRemoteDir->setEnabled (false);
382 restoreEditNFSRemoteDir->setEnabled (false);
383 break;
384 case 2:
385 restoreLDOption->setText ("CD device:");
386 restoreEditDOption->setText (cdrom_device);
387 restoreNFSRemoteDir->setEnabled (false);
388 restoreEditNFSRemoteDir->setEnabled (false);
389 break;
390 case 3:
391 restoreLDOption->setText ("DVD device:");
392 restoreEditDOption->setText (cdrom_device);
393 restoreNFSRemoteDir->setEnabled (false);
394 restoreEditNFSRemoteDir->setEnabled (false);
395 break;
396 case 4:
397 restoreLDOption->setText ("Directory for ISOs:");
398 restoreEditDOption->setText ("/root/images/mondo");
399 restoreNFSRemoteDir->setEnabled (false);
400 restoreEditNFSRemoteDir->setEnabled (false);
401 break;
402 case 5:
403 restoreLDOption->setText ("NFS share:");
404 restoreEditDOption->setText ("");
405 restoreNFSRemoteDir->setEnabled (true);
406 restoreEditNFSRemoteDir->setEnabled (true);
407 restoreEditNFSRemoteDir->setText ("");
408 break;
409 case 6:
410 restoreLDOption->setText ("Tape /dev entry:");
411#if __FreeBSD__
412 restoreEditDOption->setText ("/dev/sa0");
413#elif linux
414 restoreEditDOption->setText ("/dev/st0");
415#else
416 restoreEditDOption->setText ("");
417#endif
418 restoreNFSRemoteDir->setEnabled (false);
419 restoreEditNFSRemoteDir->setEnabled (false);
420 break;
421 case 7:
422 restoreLDOption->setText ("Device/file to use:");
423 restoreEditDOption->setText ("");
424 restoreNFSRemoteDir->setEnabled (false);
425 restoreEditNFSRemoteDir->setEnabled (false);
426 break;
427 }
428}
429
430void XMondo::initBackupTab (QWidget *& bBkpinfoTab)
431{
432 QGridLayout *bBkpinfoGrid;
433 QVButtonGroup *mediaType, *compression;
434 QLabel *dOption, *mediaSize;
435 QRadioButton *mTape, *mUdev, *mISO, *mNFS, *mCDR, *mCDRW, *mCDStream, *mDVD;
436 QRadioButton *cMax, *cAvg, *cMin, *cNone;
437 char *cdrwDev = new char [100];
438 if (find_cdrw_device (cdrwDev)) strcpy (cdrwDev, "0,0,0");
439 bBkpinfoTab = new QWidget (backup, "bBkpinfoTab");
440 mediaType = new QVButtonGroup ("&Media Type:", bBkpinfoTab, "mediaType");
441 mCDR = new QRadioButton ("CD-R discs", mediaType);
442 mCDRW = new QRadioButton ("CD-RW discs", mediaType);
443 mCDStream = new QRadioButton ("CD streamer", mediaType);
444 mDVD = new QRadioButton ("DVD discs", mediaType);
445 mISO = new QRadioButton ("ISOs in dir.", mediaType);
446 mNFS = new QRadioButton ("NFS (network)", mediaType);
447 mTape = new QRadioButton ("Tape streamer", mediaType);
448 mUdev = new QRadioButton ("Universal device", mediaType);
449 compression = new QVButtonGroup ("&Compression", bBkpinfoTab, "compression");
450 cMax = new QRadioButton ("Maximum (very slow)", compression);
451 cAvg = new QRadioButton ("Average compression", compression);
452 cMin = new QRadioButton ("Minimum (very fast)", compression);
453 cNone = new QRadioButton ("No software compression", compression);
454 dOption = new QLabel ("CD-R node:", bBkpinfoTab, "dOption");
455 nfsRemoteDir = new QLabel ("NFS remote directory:", bBkpinfoTab, "nfsRemoteDir");
456 mediaSize = new QLabel ("Media size (MB):", bBkpinfoTab, "mediaSize");
457 editDOption = new QLineEdit (bBkpinfoTab, "editDOption");
458 editNFSRemoteDir=new QLineEdit(bBkpinfoTab, "editNFSRemoteDir");
459 editMediaSize = new QLineEdit (bBkpinfoTab, "editMediaSize");
460 mCDR->setChecked (true);
461 cAvg->setChecked (true);
462 editDOption->setText (cdrwDev);
463 nfsRemoteDir->setEnabled (false);
464 editNFSRemoteDir->setEnabled (false);
465 editMediaSize->setText ("650");
466 bBkpinfoGrid = new QGridLayout (bBkpinfoTab, 5, 2, 5, 5, "bBkpinfoGrid");
467 bBkpinfoGrid->addMultiCellWidget (mediaType, 0, 1, 0, 0);
468 bBkpinfoGrid->addMultiCellWidget (compression, 0, 1, 1, 1);
469 bBkpinfoGrid->addWidget (dOption, 2, 0, AlignRight);
470 bBkpinfoGrid->addWidget (mediaSize, 3, 0, AlignRight);
471 bBkpinfoGrid->addWidget (nfsRemoteDir, 4, 0, AlignRight);
472 bBkpinfoGrid->addWidget (editDOption, 2, 1);
473 bBkpinfoGrid->addWidget (editMediaSize, 3, 1);
474 bBkpinfoGrid->addWidget (editNFSRemoteDir, 4, 1);
475 connect (mediaType, SIGNAL(clicked(int)), this, SLOT(slotMediaType(int)));
476 lDOption = dOption;
477 bgMediaType = mediaType; bgCompression = compression;
478}
479
480void XMondo::initCompareTab (QWidget *& bBkpinfoTab)
481{
482 QGridLayout *bBkpinfoGrid;
483 QVButtonGroup *mediaType;
484 QLabel *dOption, *mediaSize;
485 QRadioButton *mTape, *mUdev, *mISO, *mNFS, *mCDR, *mCDRW, *mCDStream, *mDVD;
486 char *cdrwDev = new char [100];
487 if (find_cdrw_device (cdrwDev)) strcpy (cdrwDev, "0,0,0");
488 bBkpinfoTab = new QWidget (backup, "bBkpinfoTab");
489 mediaType = new QVButtonGroup ("&Media type to compare:", bBkpinfoTab, "compareMediaType");
490 mCDR = new QRadioButton ("CD-R discs", mediaType);
491 mCDRW = new QRadioButton ("CD-RW discs", mediaType);
492 mCDStream = new QRadioButton ("CD streamer", mediaType);
493 mDVD = new QRadioButton ("DVD discs", mediaType);
494 mISO = new QRadioButton ("ISOs in dir.", mediaType);
495 mNFS = new QRadioButton ("NFS (network)", mediaType);
496 mTape = new QRadioButton ("Tape streamer", mediaType);
497 mUdev = new QRadioButton ("Universal device", mediaType);
498 dOption = new QLabel ("CD-R node:", bBkpinfoTab, "compareDOption");
499 compareNFSRemoteDir = new QLabel ("NFS remote directory:", bBkpinfoTab, "compareNFSRemoteDir");
500 compareEditDOption = new QLineEdit (bBkpinfoTab, "compareEditDOption");
501 compareEditNFSRemoteDir=new QLineEdit(bBkpinfoTab, "compareEditNFSRemoteDir");
502 mCDR->setChecked (true);
503 compareEditDOption->setText (cdrwDev);
504 compareNFSRemoteDir->setEnabled (false);
505 compareEditNFSRemoteDir->setEnabled (false);
506 bBkpinfoGrid = new QGridLayout (bBkpinfoTab, 4, 2, 5, 5, "bBkpinfoGrid");
507 bBkpinfoGrid->addMultiCellWidget (mediaType, 0, 1, 0, 1);
508 bBkpinfoGrid->addWidget (dOption, 2, 0, AlignRight);
509 bBkpinfoGrid->addWidget (compareNFSRemoteDir, 3, 0, AlignRight);
510 bBkpinfoGrid->addWidget (compareEditDOption, 2, 1);
511 bBkpinfoGrid->addWidget (compareEditNFSRemoteDir, 3, 1);
512 bStartCompare = new QPushButton ("START", bBkpinfoTab, "startCompare");
513 connect (bStartCompare, SIGNAL(clicked()), this, SLOT(slotStartCompare()));
514 bBkpinfoGrid->addMultiCellWidget (bStartCompare, 4, 4, 0, 3);
515 connect (mediaType, SIGNAL(clicked(int)), this, SLOT(slotCompareMediaType(int)));
516 compareLDOption = dOption;
517 bgCompareMediaType = mediaType;
518}
519
520void XMondo::initRestoreTab (QWidget *& bRestoreTab)
521{
522 QGridLayout *bRestoreGrid;
523 QVButtonGroup *mediaType;
524 QLabel *dOption, *mediaSize, *filter;
525 QRadioButton *mTape, *mUdev, *mISO, *mNFS, *mCDR, *mCDRW, *mCDStream, *mDVD;
526 char *cdrom_device = new char [100];
527 if (does_file_exist ("/dev/cdroms/cdrom0")) {
528 strcpy (cdrom_device, "/dev/cdroms/cdrom0");
529 } else if (does_file_exist ("/dev/cdrom")) {
530 strcpy (cdrom_device, "/dev/cdrom");
531 } else {
532 find_cdrom_device (cdrom_device, false);
533 }
534 bRestoreTab = new QWidget (backup, "bRestoreTab");
535 mediaType = new QVButtonGroup ("&Media type to restore from:", bRestoreTab, "restoreMediaType");
536 mCDR = new QRadioButton ("CD-R discs", mediaType);
537 mCDRW = new QRadioButton ("CD-RW discs", mediaType);
538 mCDStream = new QRadioButton ("CD streamer", mediaType);
539 mDVD = new QRadioButton ("DVD discs", mediaType);
540 mISO = new QRadioButton ("ISOs in dir.", mediaType);
541 mNFS = new QRadioButton ("NFS (network)", mediaType);
542 mTape = new QRadioButton ("Tape streamer", mediaType);
543 mUdev = new QRadioButton ("Universal device", mediaType);
544 dOption = new QLabel ("CD-R node:", bRestoreTab, "restoreDOption");
545 restoreNFSRemoteDir = new QLabel ("NFS remote directory:", bRestoreTab, "restoreNFSRemoteDir");
546 restoreEditDOption = new QLineEdit (bRestoreTab, "restoreEditDOption");
547 restoreEditNFSRemoteDir=new QLineEdit(bRestoreTab, "restoreEditNFSRemoteDir");
548 filter = new QLabel ("Filelist filter (regexp):", bRestoreTab);
549 restoreFilter = new QLineEdit (bRestoreTab, "restoreFilter");
550 mCDR->setChecked (true);
551 restoreEditDOption->setText (cdrom_device);
552 restoreNFSRemoteDir->setEnabled (false);
553 restoreEditNFSRemoteDir->setEnabled (false);
554 bRestoreGrid = new QGridLayout (bRestoreTab, 5, 2, 5, 5, "bRestoreGrid");
555 bRestoreGrid->addMultiCellWidget (mediaType, 0, 1, 0, 1);
556 bRestoreGrid->addWidget (dOption, 2, 0, AlignRight);
557 bRestoreGrid->addWidget (restoreNFSRemoteDir, 3, 0, AlignRight);
558 bRestoreGrid->addWidget (filter, 4, 0, AlignRight);
559 bRestoreGrid->addWidget (restoreEditDOption, 2, 1);
560 bRestoreGrid->addWidget (restoreEditNFSRemoteDir, 3, 1);
561 bRestoreGrid->addWidget (restoreFilter, 4, 1);
562 connect (mediaType, SIGNAL(clicked(int)), this, SLOT(slotRestoreMediaType(int)));
563 restoreLDOption = dOption;
564 bgRestoreMediaType = mediaType;
565}
566
567void XMondo::initOptionsTab (QWidget *& bOptionsTab)
568{
569 QGridLayout *bOptionsGrid;
570 QListView *imageDevs, *exclude, *include;
571 QPushButton *incAdd, *incDel, *exAdd, *exDel;
572 QLineEdit *incPending, *exPending;
573 QCheckBox *compare, *bnfs, *diff;
574
575 bOptionsTab = new QWidget (backup, "bOptionsTab");
576 bOptionsGrid = new QGridLayout (bOptionsTab, 19, 5, 5, 5, "bOptionsGrid");
577 imageDevs = new QListView (bOptionsTab, "imageDevs");
578 exclude = new QListView (bOptionsTab, "exclude");
579 include = new QListView (bOptionsTab, "include");
580 incAdd = new QPushButton ("Add", bOptionsTab);
581 incDel = new QPushButton ("Delete", bOptionsTab);
582 exAdd = new QPushButton ("Add", bOptionsTab);
583 exDel = new QPushButton ("Delete", bOptionsTab);
584 incPending = new QLineEdit (bOptionsTab);
585 exPending = new QLineEdit (bOptionsTab);
586 compare = new QCheckBox ("Compare after backup", bOptionsTab);
587 bnfs = new QCheckBox ("Backup NFS mounts", bOptionsTab);
588 diff = new QCheckBox ("Differential backup", bOptionsTab);
589
590 imageDevs->addColumn ("Devices to back up as images:");
591 exclude->addColumn ("Exclude paths:");
592 include->addColumn ("Include paths:");
593 (void) new QListViewItem (include, "/");
594
595 connect (incAdd, SIGNAL(clicked()), this, SLOT(slotAddInclude()));
596 connect (incDel, SIGNAL(clicked()), this, SLOT(slotDelInclude()));
597 connect (exAdd, SIGNAL(clicked()), this, SLOT(slotAddExclude()));
598 connect (exDel, SIGNAL(clicked()), this, SLOT(slotDelExclude()));
599
600 bOptionsGrid->addMultiCellWidget (imageDevs, 0, 5, 0, 4);
601 bOptionsGrid->addRowSpacing (6, 10);
602 bOptionsGrid->addRowSpacing (2, 90);
603 bOptionsGrid->addMultiCellWidget (exclude, 7, 12, 3, 4);
604 bOptionsGrid->addMultiCellWidget (include, 7, 12, 0, 1);
605 bOptionsGrid->addRowSpacing (10, 90);
606 bOptionsGrid->addWidget (incAdd, 13, 0);
607 bOptionsGrid->addWidget (incDel, 13, 1);
608 bOptionsGrid->addWidget (exAdd, 13, 3);
609 bOptionsGrid->addWidget (exDel, 13, 4);
610 bOptionsGrid->addMultiCellWidget (incPending, 14, 14, 0, 1);
611 bOptionsGrid->addMultiCellWidget (exPending, 14, 14, 3, 4);
612 bOptionsGrid->addRowSpacing (15, 10);
613 bOptionsGrid->addMultiCellWidget (compare, 16, 16, 0, 4);
614 bOptionsGrid->addMultiCellWidget (bnfs, 17, 17, 0, 4);
615 bOptionsGrid->addMultiCellWidget (diff, 18, 18, 0, 4);
616
617 listImageDevs = imageDevs;
618 listInclude = include;
619 listExclude = exclude;
620 checkBackupNFS = bnfs;
621 checkCompare = compare;
622 checkDifferential = diff;
623 pendingInclude = incPending;
624 pendingExclude = exPending;
625}
626
627void XMondo::initAdvancedTab (QWidget *&bAdvancedTab)
628{
629 QGridLayout *bAdvancedGrid;
630 QListView *excludeDevs;
631 QCheckBox *useLilo, *makeBootFloppies;
632#ifndef __FreeBSD__
633 QLabel *kernel;
634#endif
635 QLabel *bootDevice, *bootLoader;
636 QRadioButton *grub, *lilo, *boot0, *raw, *autodetect;
637 QHButtonGroup *radioBootLoader;
638 int rowAdd = 0;
639
640 bAdvancedTab = new QWidget (backup, "bAdvancedTab");
641#ifndef __FreeBSD__
642 bAdvancedGrid = new QGridLayout (bAdvancedTab, 11, 2, 5, 5, "bAdvancedGrid");
643 kernel = new QLabel ("Kernel path:", bAdvancedTab, "kernel");
644 editKernel = new QLineEdit (bAdvancedTab, "editKernel");
645 useLilo = new QCheckBox ("Use LILO (instead of syslinux) for boot disk", bAdvancedTab, "useLilo");
646#else
647 bAdvancedGrid = new QGridLayout (bAdvancedTab, 9, 2, 5, 5, "bAdvancedGrid");
648 useLilo = 0;
649#endif
650 excludeDevs = new QListView (bAdvancedTab, "excludeDevs");
651 makeBootFloppies = new QCheckBox ("Make boot floppies after backup", bAdvancedTab, "makeFloppies");
652 makeBootFloppies -> setChecked (true);
653 bootDevice = new QLabel ("Boot device:", bAdvancedTab, "bootDevice");
654 bootLoader = new QLabel ("Boot loader:", bAdvancedTab, "bootLoader");
655 editBootDevice = new QLineEdit (bAdvancedTab, "editBootDevice");
656 radioBootLoader = new QHButtonGroup (bAdvancedTab, "radioBootLoader");
657 grub = new QRadioButton ("GRUB", radioBootLoader);
658#ifdef __IA64
659 lilo = new QRadioButton ("ELILO", radioBootLoader);
660#else
661 lilo = new QRadioButton ("LILO", radioBootLoader);
662#endif
663#ifdef __FreeBSD__
664 boot0 = new QRadioButton ("boot0", radioBootLoader);
665#endif
666 raw = new QRadioButton ("Raw", radioBootLoader);
667 autodetect = new QRadioButton ("Auto", radioBootLoader);
668 autodetect -> setChecked (true);
669
670 excludeDevs->addColumn ("Devices to exclude from backup:");
671 bAdvancedGrid->addMultiCellWidget (excludeDevs, 0, 5, 0, 1);
672#ifndef __FreeBSD__
673 bAdvancedGrid->addWidget (kernel, 6, 0, AlignRight);
674 bAdvancedGrid->addWidget (editKernel, 6, 1);
675 rowAdd = 1;
676#endif
677 bAdvancedGrid->addWidget (bootDevice, 6 + rowAdd, 0, AlignRight);
678 bAdvancedGrid->addWidget (editBootDevice, 6 + rowAdd, 1);
679 bAdvancedGrid->addWidget (bootLoader, 7 + rowAdd, 0, AlignRight);
680 bAdvancedGrid->addWidget (radioBootLoader, 7 + rowAdd, 1);
681 bAdvancedGrid->addMultiCellWidget (makeBootFloppies, 8 + rowAdd, 8 + rowAdd, 0, 1);
682#ifndef __FreeBSD__
683 // We know rowAdd = 1 so we can just use 10 instead of 9+rowAdd...
684 bAdvancedGrid->addMultiCellWidget (useLilo, 10, 10, 0, 1);
685#endif
686
687 listExcludeDevs = excludeDevs;
688 bgBootLoader = radioBootLoader;
689 checkUseLilo = useLilo;
690 checkMakeBootFloppies = makeBootFloppies;
691}
692
693void XMondo::fillBkpinfo (struct s_bkpinfo *bkpinfo)
694{
695 reset_bkpinfo (bkpinfo);
696
697 switch (bgMediaType->id (bgMediaType->selected())) {
698 case 0:
699 bkpinfo->backup_media_type = cdr;
700 break;
701 case 1:
702 bkpinfo->backup_media_type = cdrw;
703 bkpinfo->wipe_media_first = 1;
704 break;
705 case 2:
706 bkpinfo->backup_media_type = cdstream;
707 break;
708 case 3:
709 bkpinfo->backup_media_type = dvd;
710 break;
711 case 4:
712 bkpinfo->backup_media_type = iso;
713 strcpy (bkpinfo->isodir, editDOption->text());
714 break;
715 case 5:
716 bkpinfo->backup_media_type = nfs;
717 strcpy (bkpinfo->nfs_mount, editDOption->text());
718 while (system (QString ("mount | grep -qx '%1 .*'").arg (bkpinfo->nfs_mount))) {
719 if (QMessageBox::warning (this, "XMondo", QString ("%1 must be mounted. Please mount it and press Retry, or press Cancel to abort..").arg (bkpinfo->nfs_mount), "&Retry", "&Cancel")) {
720 return;
721 }
722 }
723 strcpy (bkpinfo->nfs_remote_dir, editNFSRemoteDir->text());
724 break;
725 case 6:
726 bkpinfo->backup_media_type = tape;
727 break;
728 case 7:
729 bkpinfo->backup_media_type = udev;
730 break;
731 }
732 switch (bgCompression->id (bgCompression->selected())) {
733 case 0:
734 bkpinfo->compression_level = 9;
735 break;
736 case 1:
737 bkpinfo->compression_level = 6;
738 break;
739 case 2:
740 bkpinfo->compression_level = 1;
741 break;
742 case 3:
743 bkpinfo->compression_level = 0;
744 break;
745 }
746 bkpinfo->cdrw_speed = (bkpinfo->backup_media_type == cdstream) ? 2 : 4;
747 bkpinfo->use_lzo = (bkpinfo->backup_media_type == cdstream) ? 1 : 0;
748 bkpinfo->nonbootable_backup = 0;
749 strcpy (bkpinfo->media_device, editDOption->text());
750 for (int i = 0; i <= MAX_NOOF_MEDIA; ++i) {
751 if (bkpinfo->backup_media_type != udev && bkpinfo->backup_media_type != tape) {
752 bkpinfo->media_size[i] = editMediaSize->text().toInt();
753 } else {
754 bkpinfo->media_size[i] = 0;
755 }
756 }
757 strcpy (bkpinfo->boot_device, editBootDevice->text());
758 switch (bgBootLoader->id (bgBootLoader->selected())) {
759 case 0:
760 bkpinfo->boot_loader = 'G';
761 break;
762 case 1:
763 bkpinfo->boot_loader = 'L';
764 break;
765#ifdef __FreeBSD__
766 case 2:
767 bkpinfo->boot_loader = 'B';
768 break;
769 case 3:
770 bkpinfo->boot_loader = 'R';
771 break;
772#else
773 case 2:
774 bkpinfo->boot_loader = 'R';
775 break;
776#endif
777 default:
778 bkpinfo->boot_loader = which_boot_loader (bkpinfo->boot_device);
779 break;
780 }
781#ifndef __FreeBSD__
782 bkpinfo->make_cd_use_lilo = checkUseLilo->isChecked();
783#endif
784 bkpinfo->backup_data = 1;
785 bkpinfo->verify_data = checkCompare->isChecked();
786 bkpinfo->differential = checkDifferential->isChecked();
787#ifndef __FreeBSD__
788 strcpy (bkpinfo->kernel_path, editKernel->text());
789 if (!bkpinfo->kernel_path[0]) {
790 strcpy (bkpinfo->kernel_path, call_program_and_get_last_line_of_output ("mindi --findkernel"));
791 if (!bkpinfo->kernel_path[0]) {
792 popup_and_OK_sub ("You left the kernel blank and I couldn't find one for you. Using my failsafe kernel.");
793 strcpy (bkpinfo->kernel_path, "FAILSAFE");
794 }
795 }
796 else if (!strcasecmp (bkpinfo->kernel_path, "FAILSAFE") ||
797 !strcasecmp (bkpinfo->kernel_path, "SUCKS")) {
798 for (char *p = bkpinfo->kernel_path; *p; ++p) {
799 *p = toupper (*p);
800 }
801 }
802 else if (!does_file_exist (bkpinfo->kernel_path)) {
803 strcpy (bkpinfo->kernel_path, call_program_and_get_last_line_of_output ("mindi --findkernel"));
804 if (!bkpinfo->kernel_path[0]) {
805 popup_and_OK_sub ("You specified a nonexistent kernel and I couldn't find one. Please correct the kernel location on the \"Advanced\" tab.");
806 return;
807 }
808 }
809#endif
810
811 for (QListViewItem *li = listImageDevs->firstChild(); li; li = li->itemBelow()) {
812 QCheckListItem *cli;
813 if ((cli = dynamic_cast <QCheckListItem*> (li)) && cli->isOn()) {
814 if (bkpinfo->image_devs[0])
815 strcat (bkpinfo->image_devs, " ");
816 strcat (bkpinfo->image_devs, li->text (0));
817 }
818 }
819 bkpinfo->include_paths[0] = '\0';
820 for (QListViewItem *li = listInclude->firstChild(); li; li = li->itemBelow()) {
821 if (bkpinfo->include_paths[0])
822 strcat (bkpinfo->include_paths, " ");
823 strcat (bkpinfo->include_paths, li->text (0));
824 }
825 for (QListViewItem *li = listExclude->firstChild(); li; li = li->itemBelow()) {
826 if (bkpinfo->exclude_paths[0])
827 strcat (bkpinfo->exclude_paths, " ");
828 strcat (bkpinfo->exclude_paths, li->text (0));
829 }
830 for (QListViewItem *li = listExcludeDevs->firstChild(); li; li = li->itemBelow()) {
831 QCheckListItem *cli;
832 if ((cli = dynamic_cast <QCheckListItem*> (li)) && cli->isOn()) {
833 if (bkpinfo->exclude_paths[0])
834 strcat (bkpinfo->exclude_paths, " ");
835 strcat (bkpinfo->exclude_paths, li->text (0));
836 }
837 }
838
839 if (!checkBackupNFS->isChecked()) {
840 char tmp[MAX_STR_LEN];
841 strncpy(tmp, list_of_NFS_devices_and_mounts(), MAX_STR_LEN);
842 if (bkpinfo->exclude_paths[0]) { strcat(bkpinfo->exclude_paths, " "); }
843 strcat(bkpinfo->exclude_paths, tmp);
844 }
845 sensibly_set_tmpdir_and_scratchdir (bkpinfo);
846}
847
848void XMondo::slotStartBackup()
849{
850 unlink(MONDO_LOGFILE);
851
852 if (geteuid()) {
853 fatal_error_sub ("Please run as root.");
854 exit (1);
855 }
856
857 struct s_bkpinfo *bkpinfo = new s_bkpinfo;
858 reset_bkpinfo (bkpinfo);
859
860 bStartBackup->setEnabled (false);
861 bStartBackup->setText ("Initializing...");
862
863 if (pre_param_configuration (bkpinfo)) {
864 fatal_error_sub ("Failed to pre-param initialize.");
865 exit (1);
866 }
867
868 fillBkpinfo (bkpinfo);
869
870 if (post_param_configuration (bkpinfo)) {
871 fatal_error_sub ("Failed to post-param initialize.");
872 exit (1);
873 }
874
875 XMondoBackup *backup = new XMondoBackup;
876 system (QString ("mkdir -p %1 %2").arg (bkpinfo->tmpdir).arg (bkpinfo->scratchdir).ascii());
877 g_operation_in_progress = 1;
878
879 stack->raiseWidget (3);
880 buttons->setEnabled (false);
881 bStartBackup->setEnabled (true);
882 bStartBackup->setText ("START");
883
884 int res;
885 if ((res = backup->run (bkpinfo)) > 0) {
886 popup_and_OK_sub ("Backup completed. However, there were some errors. Please check /var/log/mondo-archive.log for details.");
887 } else if (res == 0) {
888 popup_and_OK_sub ("Backup completed with no errors.");
889 }
890
891 buttons->setEnabled (true);
892 stack->raiseWidget (0); // backup widget
893 g_operation_in_progress = 0;
894}
895
896
897
898class XMondoDiffList : public QDialog
899{
900public:
901 XMondoDiffList (QWidget *parent, const char *name = 0, bool modal = TRUE, WFlags f = 0)
902 : QDialog (parent, name, modal, f)
903 {
904 QVBoxLayout *box = new QVBoxLayout (this, 5, 5, "xmondoDiffListBox");
905 QLabel *infoText = new QLabel ("<b>The following files were found to contain differences:</b>", this);
906 QListView *diffs = new QListView (this);
907 QPushButton *bOK = new QPushButton ("OK", this);
908
909 diffs->addColumn ("File");
910 diffs->addColumn ("Severity (1 to 3, 1 is low)");
911 diffs->setSelectionMode (QListView::NoSelection);
912 bOK->setDefault (true);
913 connect (bOK, SIGNAL(clicked()), this, SLOT(accept()));
914
915 box->addWidget (infoText);
916 box->addWidget (diffs);
917 box->addWidget (bOK);
918
919 QFile file ("/tmp/changed.files");
920 if (file.open (IO_ReadOnly)) {
921 QTextStream stream (&file);
922 QString line;
923 int i = 1;
924 while (!stream.atEnd()) {
925 line = stream.readLine();
926 (void) new QListViewItem (diffs, line, QString::number
927 (severity_of_difference (const_cast<char*> (line.ascii()), 0)));
928 }
929 file.close();
930 } else {
931 popup_and_OK_sub ("Compare completed with errors.");
932 }
933 }
934
935 virtual ~XMondoDiffList() {}
936};
937
938void XMondo::slotStartCompare()
939{
940 struct s_bkpinfo bi;
941 struct s_bkpinfo *bkpinfo = &bi;
942 reset_bkpinfo (bkpinfo);
943
944 if (geteuid()) {
945 fatal_error_sub ("Please run as root.");
946 }
947
948 bStartCompare->setEnabled (false);
949 bStartCompare->setText ("Initializing...");
950
951 if (pre_param_configuration (bkpinfo)) {
952 fatal_error_sub ("Failed to pre-param initialize.");
953 exit (1);
954 }
955 switch (bgCompareMediaType->id (bgCompareMediaType->selected())) {
956 case 0:
957 bkpinfo->backup_media_type = cdr;
958 break;
959 case 1:
960 bkpinfo->backup_media_type = cdrw;
961 bkpinfo->wipe_media_first = 1;
962 break;
963 case 2:
964 bkpinfo->backup_media_type = cdstream;
965 break;
966 case 3:
967 bkpinfo->backup_media_type = dvd;
968 break;
969 case 4:
970 bkpinfo->backup_media_type = iso;
971 strcpy (bkpinfo->isodir, compareEditDOption->text());
972 break;
973 case 5:
974 bkpinfo->backup_media_type = nfs;
975 strcpy (bkpinfo->nfs_mount, compareEditDOption->text());
976 while (system (QString ("mount | grep -qx '%1 .*'").arg (bkpinfo->nfs_mount))) {
977 if (QMessageBox::warning (this, "XMondo", QString ("%1 must be mounted. Please mount it and press Retry, or press Quit to abort..").arg (bkpinfo->nfs_mount), "&Retry", "&Quit")) {
978 return;
979 }
980 }
981 strcpy (bkpinfo->nfs_remote_dir, compareEditNFSRemoteDir->text());
982 break;
983 case 6:
984 bkpinfo->backup_media_type = tape;
985 break;
986 case 7:
987 bkpinfo->backup_media_type = udev;
988 break;
989 }
990
991 strcpy (bkpinfo->media_device, compareEditDOption->text());
992 bkpinfo->verify_data = 1;
993 bkpinfo->backup_data = 0;
994
995 sensibly_set_tmpdir_and_scratchdir (bkpinfo);
996 if (post_param_configuration (bkpinfo)) {
997 fatal_error_sub ("Failed to post-param initialize.");
998 exit (1);
999 }
1000
1001 XMondoBackup *backup = new XMondoBackup;
1002 system (QString ("mkdir -p %1 %2").arg (bkpinfo->tmpdir).arg (bkpinfo->scratchdir).ascii());
1003 g_operation_in_progress = 1;
1004
1005 stack->raiseWidget (3);
1006 buttons->setEnabled (false);
1007 bStartCompare->setEnabled (true);
1008 bStartCompare->setText ("START");
1009
1010 if (backup->compare (bkpinfo)) {
1011 if (does_file_exist ("/tmp/changed.files")) {
1012 XMondoDiffList *xmdl = new XMondoDiffList (this);
1013 xmdl->exec();
1014 unlink ("/tmp/changed.txt");
1015 unlink ("/tmp/changed.files");
1016 } else
1017 popup_and_OK_sub ("Compare completed with errors.");
1018 } else {
1019 popup_and_OK_sub ("Compare completed with no differences. Your backup is perfect.");
1020 }
1021
1022 buttons->setEnabled (true);
1023 stack->raiseWidget (1); // compare widget
1024 g_operation_in_progress = 0;
1025}
1026
1027void XMondo::slotPrevRestore()
1028{
1029 rPrev->hide();
1030 rNext->setText ("Next ->");
1031 rNext->setEnabled (true);
1032 rNext->show();
1033 delete rstr; rstr = 0;
1034 restoreStack->raiseWidget (0);
1035 delete restoreFiles;
1036}
1037
1038void XMondo::slotNextRestore()
1039{
1040 if (rNext->text() == "Next ->") {
1041 rNext->setEnabled (false);
1042 rNext->setText ("Finish");
1043 rPrev->show();
1044
1045 restoreFiles = new QWidget (restoreStack);
1046 restoreStack->addWidget (restoreFiles, 1);
1047
1048 rstr = new XMondoRestore (restoreFiles, bgRestoreMediaType, restoreEditDOption, restoreEditNFSRemoteDir, restoreFilter);
1049 if (!rstr->good()) {
1050 slotPrevRestore();
1051 return;
1052 }
1053 restoreStack->raiseWidget (1);
1054 while (rstr && !rstr->isSetupDone() && rstr->good()) {
1055 kapp->processEvents();
1056 usleep (50000);
1057 }
1058 if (!rstr) return;
1059 if (rstr->isSetupDone() && rstr->good()) {
1060 rNext->setEnabled (true);
1061 }
1062 } else {
1063 stack->raiseWidget (3);
1064 buttons->setEnabled (false);
1065 rstr->go();
1066 if (!rstr->good()) {
1067 return;
1068 }
1069 delete rstr; rstr = 0;
1070 stack->raiseWidget (2);
1071 buttons->setEnabled (true);
1072
1073 rNext->setText ("Next ->");
1074 rNext->setEnabled (true);
1075 rPrev->hide();
1076 restoreStack->raiseWidget (0);
1077 delete restoreFiles;
1078 }
1079 rNext->show();
1080}
1081
1082void XMondo::slotAddInclude()
1083{
1084 if (!(pendingInclude->text().isEmpty()) && pendingInclude->text().at(0) == '/') {
1085 (void) new QListViewItem (listInclude, pendingInclude->text());
1086 pendingInclude->setText ("");
1087 }
1088}
1089
1090void XMondo::slotDelInclude()
1091{
1092 QListViewItem *selection = listInclude->selectedItem();
1093 if (!selection) return;
1094 QString txt = selection->text (0);
1095 listInclude->takeItem (selection);
1096 delete selection;
1097 pendingInclude->setText (txt);
1098}
1099
1100void XMondo::slotAddExclude()
1101{
1102 if (!(pendingExclude->text().isEmpty()) && pendingExclude->text().at(0) == '/') {
1103 (void) new QListViewItem (listExclude, pendingExclude->text());
1104 pendingExclude->setText ("");
1105 }
1106}
1107
1108void XMondo::slotDelExclude()
1109{
1110 QListViewItem *selection = listExclude->selectedItem();
1111 if (!selection) return;
1112 QString txt = selection->text (0);
1113 listExclude->takeItem (selection);
1114 delete selection;
1115 pendingExclude->setText (txt);
1116}
1117
1118void XMondo::slotTabChange (QWidget *newtab)
1119{
1120 if (newtab == tabOptions) {
1121 QStringList result;
1122 QListViewItem *item, *itembelow;
1123 QCheckListItem *checkitem, *below;
1124 QStringList checkedBoxes;
1125#ifdef __FreeBSD__
1126 result = QStringList::split (" ", call_program_and_get_last_line_of_output ("ls -1 /dev/ad??* /dev/da??* 2>/dev/null | tr '\n' ' ' | tr -s ' '; echo"));
1127#else
1128 result = QStringList::split (" ", call_program_and_get_last_line_of_output ("ls -1 /dev/ide/host?/bus?/target?/lun?/part? /dev/hd??* /dev/scsi/host?/bus?/target?/lun?/part? /dev/sd??* 2>/dev/null | tr '\n' ' ' | tr -s ' '; echo"));
1129#endif
1130 for (item = listImageDevs->firstChild(); item; item = itembelow) {
1131 if ((checkitem = dynamic_cast <QCheckListItem*> (item))) {
1132 if (checkitem->isOn()) {
1133 if (checkedBoxes.grep (checkitem->text()).empty()) {
1134 checkedBoxes += checkitem->text();
1135 }
1136 }
1137 }
1138 itembelow = item->itemBelow();
1139 listImageDevs->takeItem (item);
1140 delete item;
1141 }
1142 for (QStringList::iterator it = result.begin(); it != result.end(); ++it) {
1143 if (is_this_device_mounted (const_cast <char*> ((*it).ascii()))) continue;
1144 checkitem = new QCheckListItem (listImageDevs, *it, QCheckListItem::CheckBox);
1145 for (itembelow = listExcludeDevs->firstChild(); itembelow; itembelow = itembelow->itemBelow()) {
1146 if (itembelow->text (0) == checkitem->text (0) && (below = dynamic_cast <QCheckListItem*> (itembelow)) && below->isOn()) {
1147 delete checkitem;
1148 checkitem = 0;
1149 (void) new QListViewItem (listImageDevs, QString ("%1 is excluded (can't be both)").arg (*it));
1150 break;
1151 }
1152 }
1153 if (checkedBoxes.grep (QRegExp (*it + "$")).count() && checkitem) {
1154 checkitem->setOn (true);
1155 }
1156 }
1157 }
1158 if (newtab == tabAdvanced) {
1159 QStringList result;
1160 QListViewItem *item, *itembelow;
1161 QCheckListItem *checkitem, *below;
1162 QStringList checkedBoxes;
1163 result = QStringList::split (" ", call_program_and_get_last_line_of_output ("mount | grep '^/dev/' | cut -d' ' -f1 | tr '\n' ' '; echo"));
1164 for (item = listExcludeDevs->firstChild(); item; item = itembelow) {
1165 if ((checkitem = dynamic_cast <QCheckListItem*> (item))) {
1166 if (checkitem->isOn()) {
1167 if (checkedBoxes.grep (checkitem->text()).empty()) {
1168 checkedBoxes += checkitem->text();
1169 }
1170 }
1171 }
1172 itembelow = item->itemBelow();
1173 listExcludeDevs->takeItem (item);
1174 delete item;
1175 }
1176 for (QStringList::iterator it = result.begin(); it != result.end(); ++it) {
1177 checkitem = new QCheckListItem (listExcludeDevs, *it, QCheckListItem::CheckBox);
1178 for (itembelow = listImageDevs->firstChild(); itembelow; itembelow = itembelow->itemBelow()) {
1179 if (itembelow->text (0) == checkitem->text (0) && (below = dynamic_cast <QCheckListItem*> (itembelow)) && below->isOn()) {
1180 delete checkitem;
1181 checkitem = 0;
1182 (void) new QListViewItem (listExcludeDevs, QString ("%1 is imaged (can't be both)").arg (*it));
1183 break;
1184 }
1185 }
1186 if (checkedBoxes.grep (QRegExp (*it + "$")).count() && checkitem) {
1187 checkitem->setOn (true);
1188 }
1189 }
1190 }
1191
1192}
Note: See TracBrowser for help on using the repository browser.