Ignore:
Timestamp:
Aug 22, 2013 8:58:18 AM (11 months ago)
Author:
Kris Moore <kris@…>
Branches:
master, 9.2-release, releng/10.0, releng/10.0.1, releng/10.0.2
Children:
5cc3d00
Parents:
bec1293
Message:

Welcome the new Life-Preserver restore ability to the Installer GUI

Now you can restore your entire system from a replicated life-preserver backup on a
remote machine

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src-qt4/pc-installgui/installer.cpp

    rea4b713 r93572be  
    349349       } 
    350350    } 
     351 
     352 
    351353 
    352354    // If after doing the mirror, our list is empty, break out 
     
    399401              } 
    400402            }  
    401             summaryList << tr("ZFS Datasets:<br>") + " " + zDS.join("<br>"); 
     403            if ( radioRestore->isChecked()) 
     404               summaryList << tr("ZFS Datasets:") + " " + tr("The original ZFS layout will be restored"); 
     405            else 
     406               summaryList << tr("ZFS Datasets:<br>") + " " + zDS.join("<br>"); 
    402407          } else { 
    403408            summaryList << tr("Mount:") + " " + copyList.at(i).at(2); 
     
    454459        summaryList << ""; 
    455460        summaryList << tr("Partition:") + " " + workingDisk + "(" + workingSlice + "):"; 
     461 
    456462        summaryList << tr("FileSystem:") + " " + copyList.at(i).at(3); 
     463 
    457464        summaryList << tr("Size:") + " " + copyList.at(i).at(4) + "MB "; 
    458465        if ( copyList.at(i).at(3) != "ZFS" ) 
     
    481488  wDisk->programInit(); 
    482489  wDisk->setWindowModality(Qt::ApplicationModal); 
     490  if ( radioRestore->isChecked() ) 
     491    wDisk->setRestoreMode(); 
    483492  connect(wDisk, SIGNAL(saved(QList<QStringList>, bool, bool, QString, bool)), this, SLOT(slotSaveDiskChanges(QList<QStringList>, bool, bool, QString, bool))); 
    484493  wDisk->show(); 
     
    537546 
    538547  selectedPkgs.clear(); 
     548  if ( radioRestore->isChecked() ) 
     549  { 
     550     pushDeskCustomize->setEnabled(false); 
     551     textDeskSummary->setText(tr("Performing a restore from a Life-Preserver backup. Click next to start the restore wizard.")); 
     552     return; 
     553  } 
     554 
     555  pushDeskCustomize->setEnabled(true); 
    539556 
    540557  // Set the default desktop meta-pkgs based upon the selection 
     
    594611    connect(radioDesktop,SIGNAL(clicked()), this, SLOT(slotChangedMetaPkgSelection())); 
    595612    connect(radioServer,SIGNAL(clicked()), this, SLOT(slotChangedMetaPkgSelection())); 
     613    connect(radioRestore,SIGNAL(clicked()), this, SLOT(slotChangedMetaPkgSelection())); 
    596614    slotChangedMetaPkgSelection(); 
    597615} 
     
    653671   } 
    654672 
     673   // Start the Restore wizard 
     674   if ( radioRestore->isChecked() && installStackWidget->currentIndex() == 1 ) {  
     675     wRestore = new wizardRestore(); 
     676     wRestore->setWindowModality(Qt::ApplicationModal); 
     677     wRestore->programInit(); 
     678     connect(wRestore, SIGNAL(saved(QStringList)), this, SLOT(slotSaveRestoreSettings(QStringList))); 
     679     wRestore->show(); 
     680     wRestore->raise(); 
     681     return ; 
     682   } 
     683 
    655684   // Start the TrueOS wizard 
    656685   if ( radioServer->isChecked() && installStackWidget->currentIndex() == 1 ) {  
     
    678707   { 
    679708      startConfigGen(); 
     709      QString msg; 
     710 
     711      if (radioRestore->isChecked() ) 
     712        msg=tr("Start the restore now?"); 
     713      else 
     714        msg=tr("Start the installation now?"); 
     715 
    680716      int ret = QMessageBox::question(this, tr("PC-BSD Installer"), 
    681                                 tr("Start the installation now?"), 
     717                                msg, 
    682718                                QMessageBox::No | QMessageBox::Yes, 
    683719                                QMessageBox::No); 
     
    764800  tmpList << "# Auto-Generated pc-sysinstall configuration"; 
    765801  tmpList << "installInteractive=no"; 
     802 
     803  // Are we doing a restore? 
     804  if ( radioRestore->isChecked() ) 
     805  { 
     806    tmpList << "installMode=zfsrestore"; 
     807    tmpList << ""; 
     808    tmpList << "sshHost=" + restOpts.at(0); 
     809    tmpList << "sshUser=" + restOpts.at(1); 
     810    tmpList << "sshPort=" + restOpts.at(2); 
     811    if ( ! restOpts.at(3).isEmpty() ) 
     812      tmpList << "sshKey=" + restOpts.at(3); 
     813    tmpList << "zfsProps=" + restOpts.at(4); 
     814    tmp = restOpts.at(4); 
     815    tmp.replace(".lp-props-", ""); 
     816    tmp.replace("#", "/"); 
     817    tmpList << "zfsRemoteDataset=" + tmp; 
     818 
     819    // Using a custom zpool name? 
     820    if ( ! zpoolName.isEmpty() ) 
     821      tmpList << "zpoolName=" + zpoolName; 
     822 
     823    // Are we force enabling ZFS 4K block sizes? 
     824    if ( force4K ) 
     825      tmpList << "zfsForce4k=YES"; 
     826 
     827    tmpList << ""; 
     828    return tmpList; 
     829  } // End of restore options 
     830 
    766831 
    767832  if ( sysFinalDiskLayout.at(0).at(0) == "MANUAL" ) 
     
    895960 
    896961  cfgList+=getDiskCfgSettings(); 
    897  
    898   cfgList+=getComponentCfgSettings(); 
    899  
    900   // Save the install config script to disk 
    901   cfgList << "runExtCommand=/root/save-config.sh"; 
    902  
    903   cfgList+= ""; 
    904  
    905   // If doing install from package disk 
    906   if ( hasPkgsOnMedia ) 
    907     cfgList+=getDeskPkgCfg(); 
    908  
    909   cfgList+= ""; 
    910  
    911   if ( radioDesktop->isChecked() ) { 
    912     // Doing PC-BSD Install 
    913  
    914     QString lang; 
    915     if ( comboLanguage->currentIndex() != 0 ) 
    916       lang = languages.at(comboLanguage->currentIndex()).section("(",1,1).section(")",0,0); 
    917     else 
    918       lang="en_US"; 
    919  
    920     // Setup the desktop 
    921     cfgList << "runCommand=sh /usr/local/share/pcbsd/scripts/sys-init.sh desktop " + lang; 
    922  
    923     // Setup for a fresh system first boot 
    924     cfgList << "# Touch flags to enable PC-BSD setup at first boot"; 
    925     cfgList << "runCommand=touch /var/.runxsetup"; 
    926     cfgList << "runCommand=touch /var/.pcbsd-firstboot"; 
    927     cfgList << "runCommand=touch /var/.pcbsd-firstgui"; 
    928  
    929   } else { 
    930     // Doing TrueOS Install 
    931     cfgList+=getUsersCfgSettings(); 
    932  
    933     // Enable SSH? 
    934     if ( fSSH ) 
    935       cfgList << "runCommand=echo 'sshd_enable=\"YES\"' >>/etc/rc.conf"; 
    936  
    937     // Setup the TrueOS server 
    938     cfgList << "runCommand=sh /usr/local/share/pcbsd/scripts/sys-init.sh server"; 
    939  
    940   }  
    941  
    942   // Run newaliases to fix mail errors 
    943   cfgList << "runCommand=newaliases"; 
     962  
     963  // We can skip these options if doing a restore 
     964  if ( ! radioRestore->isChecked() ) { 
     965 
     966    cfgList+=getComponentCfgSettings(); 
     967 
     968    // Save the install config script to disk 
     969    cfgList << "runExtCommand=/root/save-config.sh"; 
     970 
     971    cfgList+= ""; 
     972 
     973    // If doing install from package disk 
     974    if ( hasPkgsOnMedia ) 
     975      cfgList+=getDeskPkgCfg(); 
     976 
     977    cfgList+= ""; 
     978 
     979    if ( radioDesktop->isChecked() ) { 
     980      // Doing PC-BSD Install 
     981 
     982      QString lang; 
     983      if ( comboLanguage->currentIndex() != 0 ) 
     984        lang = languages.at(comboLanguage->currentIndex()).section("(",1,1).section(")",0,0); 
     985      else 
     986        lang="en_US"; 
     987 
     988      // Setup the desktop 
     989      cfgList << "runCommand=sh /usr/local/share/pcbsd/scripts/sys-init.sh desktop " + lang; 
     990 
     991      // Setup for a fresh system first boot 
     992      cfgList << "# Touch flags to enable PC-BSD setup at first boot"; 
     993      cfgList << "runCommand=touch /var/.runxsetup"; 
     994      cfgList << "runCommand=touch /var/.pcbsd-firstboot"; 
     995      cfgList << "runCommand=touch /var/.pcbsd-firstgui"; 
     996 
     997    } else { 
     998      // Doing TrueOS Install 
     999      cfgList+=getUsersCfgSettings(); 
     1000 
     1001      // Enable SSH? 
     1002      if ( fSSH ) 
     1003        cfgList << "runCommand=echo 'sshd_enable=\"YES\"' >>/etc/rc.conf"; 
     1004 
     1005      // Setup the TrueOS server 
     1006      cfgList << "runCommand=sh /usr/local/share/pcbsd/scripts/sys-init.sh server"; 
     1007 
     1008    }  
     1009 
     1010    // Run newaliases to fix mail errors 
     1011    cfgList << "runCommand=newaliases"; 
     1012 
     1013  } // End of restore check 
    9441014 
    9451015  // Now write out the cfgList to file 
     
    11511221void Installer::startInstall() 
    11521222{ 
     1223 
     1224  // Update the UI elements if doing a restore 
     1225  if ( radioRestore->isChecked() ) 
     1226  { 
     1227      labelFinished->setText(tr("Your system is now restored!\nClick Finish to reboot. After rebooting you may eject the install media.")); 
     1228      groupInstall->setTitle(tr("System Restore")); 
     1229      labelInstallHeader->setText(tr("Your system is now being restored, this may take a while depending upon the size of your backup and network conditions.")); 
     1230  } 
     1231 
    11531232  QString cfgFile; 
    11541233  if (customCfgFile.isEmpty() ) 
     
    11641243  installFoundMetaCounter = false; 
    11651244  installFoundFetchOutput = false; 
     1245  inZFSSend = false; 
    11661246 
    11671247  // Setup some defaults for the secondary progress bar 
     
    12811361     //qDebug() << tmp; 
    12821362 
    1283      // If doing a restore, don't bother checking for other values 
    1284      //if ( radioRestore->isChecked() ) { 
    1285      //   labelInstallStatus->setText(tmp); 
    1286      // continue; 
    1287      //}  
     1363     // If doing a restore we can do all parsing right here 
     1364     if ( radioRestore->isChecked() ) { 
     1365       line = tmp; 
     1366 
     1367       if ( tmp.contains("total estimated size")) 
     1368       {   
     1369          repTotalK = line.section(" ",-1).simplified(); 
     1370          double totSize = displayToDoubleK(repTotalK); 
     1371          progressBarInstall->setRange(0, totSize + 1024); 
     1372          inZFSSend = true; 
     1373          continue; 
     1374       }  
     1375       if ( tmp.contains("Moving datasets to")) 
     1376          inZFSSend=false; 
     1377 
     1378       if( line.contains("send from ") ) 
     1379         continue; 
     1380       if( line.contains("TIME ") ) 
     1381         continue; 
     1382 
     1383       labelInstallStatus->setText(tmp); 
     1384 
     1385       if ( ! inZFSSend ) 
     1386          continue; 
     1387 
     1388       // We got here, lets parse the ZFS send message 
     1389       parseStatusMessage(tmp); 
     1390 
     1391       continue; 
     1392     } // End of restore parsing 
    12881393 
    12891394     // Parse fetch output 
     
    17101815void Installer::slotStartNetworkManager()  
    17111816{ 
    1712    system("/usr/local/bin/pc-netmanager -installer &"); 
    1713 } 
     1817  system("/usr/local/bin/pc-netmanager -installer &"); 
     1818} 
     1819 
     1820void Installer::slotSaveRestoreSettings(QStringList Opts) 
     1821{ 
     1822  restOpts = Opts; 
     1823 
     1824  textEditDiskSummary->clear(); 
     1825  QStringList summary = getDiskSummary(); 
     1826  for ( int i=0; i < summary.count(); ++i) 
     1827    textEditDiskSummary->append(summary.at(i)); 
     1828                
     1829  textEditDiskSummary->moveCursor(QTextCursor::Start); 
     1830  
     1831  startConfigGen(); 
     1832  installStackWidget->setCurrentIndex(installStackWidget->currentIndex() + 1); 
     1833} 
     1834 
     1835void Installer::parseStatusMessage(QString stat){ 
     1836  //qDebug() << "msg:" << stat; 
     1837  QString dispTotal; 
     1838 
     1839  //Divide up the status message into sections 
     1840  stat.replace("\t"," "); 
     1841  QString cSize = stat.section(" ",1,1,QString::SectionSkipEmpty); 
     1842 
     1843  //Now Setup the tooltip 
     1844  if(!repTotalK.isEmpty()){ 
     1845    double c = displayToDoubleK(cSize); 
     1846    progressBarInstall->setValue(c); 
     1847    dispTotal = repTotalK; 
     1848  } else { 
     1849    dispTotal = "??"; 
     1850  } 
     1851 
     1852  //Format the tooltip String 
     1853  QString status = cSize+"/"+dispTotal; 
     1854 
     1855  QString txt = QString(tr("Restoring system: %1")).arg(status); 
     1856  labelInstallStatus->setText(txt); 
     1857 
     1858} 
     1859 
     1860double Installer::displayToDoubleK(QString displayNumber){ 
     1861  QStringList labels; 
     1862    labels << "K" << "M" << "G" << "T" << "P" << "E"; 
     1863  QString clab = displayNumber.right(1); //last character is the size label 
     1864        displayNumber.chop(1); //remove the label from the number 
     1865  double num = displayNumber.toDouble(); 
     1866  //Now format the number properly 
     1867  bool ok = false; 
     1868  for(int i=0; i<labels.length(); i++){ 
     1869    if(labels[i] == clab){ ok = true; break; } 
     1870    else{ num = num*1024; } //get ready for the next size 
     1871  } 
     1872  if(!ok){ num = -1; } //could not determine the size 
     1873  return num; 
     1874} 
     1875 
Note: See TracChangeset for help on using the changeset viewer.