Projects/ds4clonerestore/ds4clonerestore/src/clone.cpp

00001 /******************************************************
00002 * DS4 Clone-Restore
00003 *
00004 * DS4 Laser Technology srl
00005 *
00006 * author: Carsana Francesco <francescocarsana@ds4.it>
00007 *******************************************************/
00008 
00009 
00010 #include "clone.h"
00011 
00012 
00013 Clone::Clone(QWidget* parent, const char* name, WFlags fl)
00014         : cloneDlg(parent,name,fl)
00015 {
00016     mainWin = parent;
00017 
00018     proc = new QProcess(); // oggetto per lanciare un comando esterno
00019     
00020     strcpy(pathRev,RevPathMount().ascii()); // leggo il percorso di mount del Rev
00021     strcpy(deviceHDSource,HDDevice().ascii()); // leggo il device dell'hard disk sorgente
00022 
00023     // ***********************************************************************
00024     // *** Nella fase di clone l'output di dd e sfdisk non viene visualizzato
00025     // *** diversamente a quanto succede nella fase di restore
00026     // *** Per abilitare l'output decommantare le linee seguenti, implementare
00027     // *** readFromStdout(), readFromStderr() e creare la classe CloneOutput
00028     // *** (simile a RestoreOutput) che gestisce il widget per la visualizzazione
00029     //
00030     // collegamento per gestire l'output
00031     //connect( proc, SIGNAL(readyReadStdout()), this, SLOT(readFromStdout()) );
00032     //connect( proc, SIGNAL(readyReadStderr()), this, SLOT(readFromStderr()) );
00033     // ***********************************************************************
00034 }
00035 
00036 Clone::~Clone()
00037 {
00038     delete proc;
00039     proc = NULL;
00040 }
00041 
00042 void Clone::Init(bool *mounted)
00043 {
00044     QDate date;
00045 
00046     date = QDate::currentDate(); // ricavo la data odierna
00047     edtDate->setText(date.toString("yyyyMMdd")); // inizializzo loggetto edtDate con la data odierna
00048 
00049     revMounted = mounted;
00050     if (*revMounted == TRUE) // se il Rev è montato
00051     {
00052         ledRevStatus->setColor(Qt::green); // led verde
00053     }
00054     else // se il Rev è smontato
00055     {
00056         ledRevStatus->setColor(Qt::red); // led rosso
00057     }
00058 }
00059 
00060 void Clone::btnCancel_clicked()
00061 {
00062     this->Close(); // chiudo la finestra di Clone
00063 }
00064 
00065 void Clone::closeEvent (QCloseEvent *e)
00066 {
00067     e->accept(); // accetto l'evento di chiusura
00068     this->Close(); // chiudo la finestra di Clone
00069 }
00070 
00071 void Clone::Close()
00072 {    
00073     this->hide(); // nascondo la finestra di Clone
00074     mainWin->setEnabled(TRUE); // abilito la finestra principale
00075 }
00076 
00077 void Clone::btnClone_clicked()
00078 {
00079     if (*revMounted == TRUE) // se il Rev è montato
00080     {
00081         if (edtSerial->text() == "") // se il campo seriale è vuoto
00082         {
00083             // Dialog di errore
00084             QMessageBox::critical(this,"Error","Machine serial number cannot be empty!",
00085                                   QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
00086         }
00087         else if (edtSerial->text() != edtSerialAgain->text()) // se i seriali sono diversi
00088         {
00089             // Dialog di errore
00090             QMessageBox::critical(this,"Error","Machine serial numbers are not equal!",
00091                                   QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
00092         }
00093         else // se è stato inserito un numero seriale
00094         {
00095             QString s;
00096             QStringList listPartitions; // lista partizioni da clonare
00097             QFile partitionTableFile; // puntatore all'oggetto che gestisce il file della tabella delle partizioni
00098 
00099             this->setEnabled(FALSE); // disabilito la finestra di clone
00100             this->hide(); // nascondo la finestra di clone
00101 
00102             proc->clearArguments(); // cancello il comando precedente
00103 
00104             // creo la directory relativa al seriale
00105             proc->addArgument("mkdir"); // comando
00106             proc->addArgument("-p"); // primo parametro
00107             proc->addArgument( + edtSerial->text()); // secondo parametro
00108 
00109             proc->start(); // eseguo il comando
00110 
00111             while (proc->isRunning()) // aspetto la terminazione del comando
00112             {
00113                 qApp->processEvents();
00114             }
00115 
00116             proc->clearArguments(); // cancello il comando precedente
00117 
00118             // creo la directory relativa alla data
00119             proc->addArgument("mkdir"); // comando
00120             proc->addArgument("-p"); // primo parametro
00121             proc->addArgument(pathRev + edtSerial->text() + "/" + edtDate->text()); // secondo parametro
00122 
00123             proc->start(); // eseguo il comando
00124 
00125             while (proc->isRunning()) // aspetto la terminazione del comando
00126             {
00127                 qApp->processEvents();
00128             }
00129 
00130             proc->clearArguments(); // cancello il comando precedente
00131 
00132             // salvo l'MBR
00133             proc->addArgument("dd"); // comando
00134             s = "if=/dev/";
00135             s += deviceHDSource;
00136             proc->addArgument(s); // primo parametro
00137             s = "of=";
00138             s += pathRev + edtSerial->text() + "/" + edtDate->text() + "/" + edtSerial->text() + "_" +
00139                  edtDate->text() + "_";
00140             s += deviceHDSource;
00141             s += ".mbr";
00142             proc->addArgument(s); // secondo parametro
00143             proc->addArgument("count=1"); // terzo parametro
00144             proc->addArgument("bs=512"); // quarto parametro
00145 
00146             proc->start(); // eseguo il comando
00147 
00148             while (proc->isRunning()) // aspetto la terminazione del comando
00149             {
00150                 qApp->processEvents();
00151             }
00152 
00153             proc->clearArguments(); // cancello il comando precedente
00154 
00155             // salvo la tabella delle partizioni estese
00156             // (la ridirezione non funziona con QProcess e quindi lancio uno script che la esegue)
00157             proc->addArgument("ds4ClonePT"); // script
00158             proc->addArgument(deviceHDSource); // primo parametro
00159             s = pathRev + edtSerial->text() + "/" + edtDate->text() + "/" + edtSerial->text() + "_" +
00160                 edtDate->text() + "_";
00161             s += deviceHDSource;
00162             s += ".sf";
00163             proc->addArgument(s); // secondo parametro
00164 
00165             proc->start(); // eseguo lo script
00166 
00167             while (proc->isRunning()) // aspetto la terminazione del comando
00168             {
00169                 qApp->processEvents();
00170             }
00171 
00172             // cerco nel file delle partizioni estese il nome delle partizioni da clonare
00173             s = pathRev + edtSerial->text() + "/" + edtDate->text() + "/" + edtSerial->text() + "_" +
00174                 edtDate->text() + "_";
00175             s += deviceHDSource;
00176             s += ".sf";
00177             partitionTableFile.setName(s);
00178 
00179             if (partitionTableFile.open(IO_ReadOnly)) // se il file viene aperto correttamente
00180             {
00181                 QTextStream stream(&partitionTableFile); // stream di testo per accedere al file
00182 
00183                 listPartitions.clear(); // svuoto la lista
00184 
00185                 // creo la lista delle partizioni da clonare
00186                 while (!stream.atEnd())
00187                 {
00188                     ParsePartitionLine(stream.readLine(),listPartitions); // parsing di una linea del file
00189                 }
00190 
00191                 partitionTableFile.close(); // chiudo il file
00192             }
00193 
00194             // eseguo il clone delle partizioni
00195             for ( QStringList::Iterator it = listPartitions.begin(); it != listPartitions.end(); it++ )
00196             {
00197                 proc->clearArguments(); // cancello il comando precedente
00198 
00199                 // eseguo lo script che lancia partimage per il clone della partizione
00200                 proc->addArgument("ds4PartimageClone"); // script
00201                 proc->addArgument(pathRev + edtSerial->text() + "/" + edtDate->text()); // primo parametro
00202                 proc->addArgument(*it); // secondo parametro
00203                 proc->addArgument(edtSerial->text() + "_" + edtDate->text() + "_" + *it + ".bz2"); // terzo parametro
00204 
00205                 proc->start(); // eseguo lo script
00206 
00207                 while (proc->isRunning()) // aspetto la terminazione del comando
00208                 {
00209                     qApp->processEvents();
00210                 }
00211             }
00212 
00213             this->setEnabled(TRUE); // abilito la finestra di clone
00214 
00215             QMessageBox::information(this,"Finish","Clone finished successfully!",
00216                                      QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
00217 
00218             this->Close(); // torno al main
00219         }
00220     }
00221     else // se il Rev non è montato
00222     {
00223         // dialog di errore
00224         QMessageBox::critical(this,"Error","Rev is not mounted!",
00225                               QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
00226     }
00227 }
00228 
00229 void Clone::ParsePartitionLine(QString line, QStringList& l)
00230 {
00231     if (line.at(0) == '/' ) // le linee che descrivono una partizione cominciano per '/'
00232     {
00233         QString s,name,id;
00234 
00235         // ricavo il nome della partizione
00236         s = line.section(" : ",0,0);
00237         name = s.remove(0,5); // elimino "/dev/" prima del nome della partizione
00238 
00239         line = line.section(" : ",1,1); // elimino il nome della partizione dalla linea
00240 
00241         // ricavo il tipo di partizione
00242         s = line.section(",",2,2);
00243         id = s.section("=",1,1);
00244 
00245         if (id != "82") // se la partizione non è di swap
00246         {
00247             l += name; // aggiungo la partizione alla lista di quelle da clonare
00248         }
00249     }
00250 }
00251 
00252 void Clone::btnMount_clicked()
00253 {
00254     if (*revMounted == TRUE) // se il Rev è montato
00255     {
00256         if (UmountRev() == TRUE) // smonto il Rev
00257         {
00258             EjectRev();
00259             *revMounted = FALSE;
00260             ledRevStatus->setColor(Qt::red); // led rosso
00261         }
00262         else
00263         {
00264             // dialog di errore
00265             QMessageBox::critical(this,"Error","Unable to umount Rev!",
00266                                   QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
00267         }
00268     }
00269     else // se il Rev è smontato
00270     {
00271         if (MountRev() == TRUE) // monto il Rev
00272         {
00273             *revMounted = TRUE;
00274             ledRevStatus->setColor(Qt::green); // led verde
00275         }
00276         else
00277         {
00278             // dialog di errore
00279             QMessageBox::critical(this,"Error","Unable to mount Rev!",
00280                                   QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
00281         }
00282     }
00283 }
00284 
00285 
00286 #include "clone.moc"
00287 

Generato il Wed Jun 13 18:59:37 2007 per DS4CloneRestore da  doxygen 1.5.2