Changeset aadcedc


Ignore:
Timestamp:
06/26/14 09:56:40 (8 months ago)
Author:
Kris Moore <kris@…>
Branches:
master, releng/10.0.3, releng/10.1, releng/10.1.1
Children:
9b97c0b
Parents:
4e2f3dd
Message:

Update the warden GUI to use the new warden CLI flags for snapshot management.

While here, add the ability to "clone" a jail via GUI right-click menu as well.

Other general UI cleanup.

Location:
src-qt4/warden-gui
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src-qt4/warden-gui/dialogwarden.cpp

    rba606f5 raadcedc  
    100100   connect( pushStart, SIGNAL(clicked()), this, SLOT(slotStartJail() ) ); 
    101101 
    102    // Snapshot / Clone support 
    103    connect( pushAddClone, SIGNAL(clicked()), this, SLOT(slotAddClone() ) ); 
    104    connect( pushRemoveClone, SIGNAL(clicked()), this, SLOT(slotRemoveClone() ) ); 
     102   // Snapshot support 
    105103   connect( pushCreateSnap, SIGNAL(clicked()), this, SLOT(slotCreateSnap() ) ); 
    106104   connect( pushRestoreSnap, SIGNAL(clicked()), this, SLOT(slotRestoreSnap() ) ); 
     
    603601                  pushTerminal->setEnabled(true); 
    604602                  pushStart->setEnabled(true); 
     603                  pushStart->setText(tr("&Stop Jail")); 
    605604                  pushStart->setIcon(QIcon(":stopjail.png")); 
    606605                  pushStart->setIconSize(QSize(16,16)); 
     
    609608                  pushPackageManager->setEnabled(false); 
    610609                  pushTerminal->setEnabled(false); 
     610                  pushStart->setText(tr("&Start Jail")); 
    611611                  pushStart->setEnabled(true); 
    612612                  pushStart->setIcon(QIcon(":running.png")); 
     
    646646          popup->addAction( tr("Toggle Autostart") , this, SLOT(slotToggleAutostartClicked() )  ); 
    647647          popup->addAction( tr("Export jail to .wdn file") , this, SLOT(slotExportJail() )  ); 
     648          popup->addAction( tr("Clone this Jail") , this, SLOT(slotMakeClone() )  ); 
    648649          popup->addSeparator(); 
    649650          popup->addAction( tr("Delete Jail") , this, SLOT(slotDeleteJail() )  ); 
     
    12341235   // Grab the ZFS snapshot list 
    12351236   QProcess m; 
    1236    m.start(QString("warden"), QStringList() << "zfslistsnap" << IP ); 
     1237   m.start(QString("warden"), QStringList() << "snap" << "list" << IP ); 
    12371238   while(m.state() == QProcess::Starting || m.state() == QProcess::Running) { 
    12381239      m.waitForFinished(200); 
     
    12781279     pushRestoreSnap->setEnabled(false); 
    12791280     pushRemoveSnap->setEnabled(false); 
    1280      pushAddClone->setEnabled(false); 
    1281      pushRemoveClone->setEnabled(false); 
    12821281     return; 
    12831282   } 
     
    12871286   sliderSnaps->setValue(snapshotList.count() -1 ); 
    12881287   tmp=""; 
    1289    if ( hasClone(snapshotList.at(snapshotList.count()-1)) ) 
    1290       tmp = tr("(Cloned)"); 
    12911288  
    12921289   labelSnap->setText(getSnapDateReadable(snapshotList.at(snapshotList.count()-1)) + " ("+ snapshotComments.at(snapshotList.count()-1) + ") " + tmp); 
     
    12941291   pushRestoreSnap->setEnabled(true); 
    12951292   pushRemoveSnap->setEnabled(true); 
    1296  
    1297    slotLoadClones(); 
    1298 } 
    1299  
    1300 bool dialogWarden::hasClone(QString snap) 
    1301 { 
    1302    for (int i = 0; i < cloneList.size(); ++i) 
    1303      if ( cloneList.at(i) == snap ) 
    1304         return true; 
    1305  
    1306    return false; 
    1307 } 
    1308  
    1309 void dialogWarden::slotLoadClones() 
    1310 { 
    1311    if ( ! listJails->currentItem() ) 
    1312       return; 
    1313  
    1314    labelClone->setText(tr("Loading clones...")); 
    1315  
    1316    QString IP = listJails->currentItem()->text(0); 
    1317  
    1318    // Grab the ZFS clone list 
    1319    QProcess m; 
    1320    m.start(QString("warden"), QStringList() << "zfslistclone" << IP ); 
    1321    while(m.state() == QProcess::Starting || m.state() == QProcess::Running) { 
    1322       m.waitForFinished(200); 
    1323       QCoreApplication::processEvents(); 
    1324    } 
    1325  
    1326    // Check if the user changed jails before we finished loading snaps 
    1327    if ( ! listJails->currentItem() ) 
    1328       return; 
    1329    if ( IP != listJails->currentItem()->text(0)) 
    1330      return; 
    1331  
    1332    cloneList.clear(); 
    1333    QString tmp; 
    1334    bool ok, ok2; 
    1335  
    1336    qDebug() << "Getting ZFS clones for " + IP; 
    1337  
    1338    // Get output of ZFS Clones 
    1339    while (m.canReadLine()) { 
    1340       tmp = m.readLine().simplified(); 
    1341       tmp.section("-", 0, 0).toInt(&ok); 
    1342       tmp.section("-", 1, 1).toInt(&ok2); 
    1343       if (ok && ok2) { 
    1344          cloneList << tmp; 
    1345       } 
    1346    } 
    1347  
    1348    qDebug() << "Available Clones:" << cloneList; 
    1349  
    1350    if ( snapshotList.count() <= 0 ) { 
    1351      pushRemoveClone->setEnabled(false); 
    1352      pushAddClone->setEnabled(false); 
    1353    } else 
    1354      slotSnapSliderChanged(snapshotList.count()-1); 
    1355  
    1356    // If we did something and want to show the same snapshot 
    1357    if ( currentSnapshot != -1 ) { 
    1358      sliderSnaps->setValue(currentSnapshot ); 
    1359      slotSnapSliderChanged(currentSnapshot); 
    1360    } 
    1361       
    1362  
    13631293   groupSnaps->setEnabled(true);  
     1294 
    13641295} 
    13651296 
     
    14041335     pushTerminal->setEnabled(true); 
    14051336     pushPackageManager->setEnabled(true); 
     1337     pushStart->setText(tr("&Stop Jail")); 
    14061338     pushStart->setIcon(QIcon(":stopjail.png")); 
    14071339     pushStart->setIconSize(QSize(16,16)); 
     
    14121344     pushTerminal->setEnabled(false); 
    14131345     pushPackageManager->setEnabled(false); 
     1346     pushStart->setText(tr("&Start Jail")); 
    14141347     pushStart->setIcon(QIcon(":running.png")); 
    14151348     pushStart->setIconSize(QSize(16,16)); 
     
    14881421} 
    14891422 
    1490 void dialogWarden::slotAddClone() 
     1423void dialogWarden::slotMakeClone() 
    14911424{ 
    14921425   if ( ! listJails->currentItem() ) 
    14931426      return; 
    14941427 
    1495    // Update status 
    1496    groupSnaps->setEnabled(false);  
    1497    labelSnap->setText(tr("Cloning snapshot... Please wait...")); 
     1428 
     1429   bool ok; 
     1430   QString newJail = QInputDialog::getText(this, tr("Enter hostname for cloned jail"), 
     1431                                          tr("Cloned jail hostname:"), QLineEdit::Normal, 
     1432                                          "", &ok, 0, Qt::ImhUrlCharactersOnly); 
     1433   if ( ! ok || newJail.isEmpty() ) 
     1434      return; 
     1435    
    14981436 
    14991437   QString IP = listJails->currentItem()->text(0); 
     
    15031441   QString program = "warden"; 
    15041442   QStringList args; 
    1505    args << "zfsclonesnap" << IP << snapshotList.at(sliderSnaps->value()); 
     1443   args << "clone" << IP << newJail; 
     1444 
     1445   // Connect the exited signal and start the process 
     1446   createJailProc->setProcessChannelMode(QProcess::MergedChannels); 
     1447   createJailProc->setReadChannel(QProcess::StandardOutput); 
     1448   connect( createJailProc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(refreshJails() ) ); 
     1449   createJailProc->start(program, args); 
     1450 
     1451} 
     1452 
     1453void dialogWarden::slotCreateSnap() 
     1454{ 
     1455   if ( ! listJails->currentItem() ) 
     1456      return; 
     1457 
     1458   currentSnapshot = -1; 
     1459 
     1460   // Update status 
     1461   groupSnaps->setEnabled(false);  
     1462   labelSnap->setText(tr("Creating new snapshot... Please wait...")); 
     1463 
     1464   QString IP = listJails->currentItem()->text(0); 
     1465 
     1466   // Ask user for comment to this snapshot 
     1467   bool ok; 
     1468   QString comment = QInputDialog::getText (this, tr("Snapshot comment"), tr("Snapshot comment"), QLineEdit::Normal, "GUI snapshot", &ok); 
     1469   if ( ! ok ) 
     1470      comment = "GUI snapshot"; 
     1471 
     1472   // Now start the script to stop this jail 
     1473   createJailProc = new QProcess( this );  
     1474   QString program = "warden"; 
     1475   QStringList args; 
     1476   args << "snap" << "make" << IP << comment; 
    15061477 
    15071478   // Connect the exited signal and start the process 
     
    15111482   createJailProc->start(program, args); 
    15121483 
    1513    currentSnapshot = sliderSnaps->value(); 
    1514  
    1515 } 
    1516  
    1517 void dialogWarden::slotRemoveClone() 
    1518 { 
    1519    if ( ! listJails->currentItem() ) 
    1520       return; 
    1521  
    1522    // Update status 
    1523    groupSnaps->setEnabled(false);  
    1524    labelSnap->setText(tr("Removing clone... Please wait...")); 
    1525  
    1526    QString IP = listJails->currentItem()->text(0); 
    1527  
    1528    // Now start the script to stop this jail 
    1529    createJailProc = new QProcess( this );  
    1530    QString program = "warden"; 
    1531    QStringList args; 
    1532    args << "zfsrmclone" << IP << snapshotList.at(sliderSnaps->value()); 
    1533  
    1534    // Connect the exited signal and start the process 
    1535    createJailProc->setProcessChannelMode(QProcess::MergedChannels); 
    1536    createJailProc->setReadChannel(QProcess::StandardOutput); 
    1537    connect( createJailProc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotLoadSnapshots() ) ); 
    1538    createJailProc->start(program, args); 
    1539  
    1540    currentSnapshot = sliderSnaps->value(); 
    1541 } 
    1542  
    1543  
    1544 void dialogWarden::slotCreateSnap() 
    1545 { 
    1546    if ( ! listJails->currentItem() ) 
    1547       return; 
    1548  
    1549    currentSnapshot = -1; 
    1550  
    1551    // Update status 
    1552    groupSnaps->setEnabled(false);  
    1553    labelSnap->setText(tr("Creating new snapshot... Please wait...")); 
    1554  
    1555    QString IP = listJails->currentItem()->text(0); 
    1556  
    1557    // Ask user for comment to this snapshot 
    1558    bool ok; 
    1559    QString comment = QInputDialog::getText (this, tr("Snapshot comment"), tr("Snapshot comment"), QLineEdit::Normal, "GUI snapshot", &ok); 
    1560    if ( ! ok ) 
    1561       comment = "GUI snapshot"; 
    1562  
    1563    // Now start the script to stop this jail 
    1564    createJailProc = new QProcess( this );  
    1565    QString program = "warden"; 
    1566    QStringList args; 
    1567    args << "zfsmksnap" << IP << comment; 
    1568  
    1569    // Connect the exited signal and start the process 
    1570    createJailProc->setProcessChannelMode(QProcess::MergedChannels); 
    1571    createJailProc->setReadChannel(QProcess::StandardOutput); 
    1572    connect( createJailProc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotLoadSnapshots() ) ); 
    1573    createJailProc->start(program, args); 
    1574  
    15751484} 
    15761485 
     
    15831492 
    15841493   int ret = QMessageBox::question(this, tr("Warden"), 
    1585                                 tr("Are you sure you want to revert to the snapshot:") + "\n" + getSnapDateReadable(snapshotList.at(sliderSnaps->value() ) ) + "?" + "\n" + tr("Any newer snapshots and mounted clones will be lost, and the jail will be restarted!"), 
     1494                                tr("Are you sure you want to revert to the snapshot:") + "\n" + getSnapDateReadable(snapshotList.at(sliderSnaps->value() ) ) + "?" + "\n" + tr("Any newer snapshots will be lost, and the jail will be restarted!"), 
    15861495                                QMessageBox::Yes | QMessageBox::No, 
    15871496                                QMessageBox::No); 
     
    16041513   QString program = "warden"; 
    16051514   QStringList args; 
    1606    args << "zfsrevertsnap" << IP << snapshotList.at(sliderSnaps->value()); 
     1515   args << "snap" << "revert" << IP << snapshotList.at(sliderSnaps->value()); 
    16071516 
    16081517   // Connect the exited signal and start the process 
     
    16391548   QString program = "warden"; 
    16401549   QStringList args; 
    1641    args << "zfsrmsnap" << IP << snapshotList.at(sliderSnaps->value()); 
     1550   args << "snap" << "remove" << IP << snapshotList.at(sliderSnaps->value()); 
    16421551 
    16431552   // Connect the exited signal and start the process 
     
    16541563   QString IP = listJails->currentItem()->text(0); 
    16551564   QString tmp; 
    1656    int cloneId = -1; 
    1657    if ( hasClone(snapshotList.at(newVal)) ) { 
    1658       tmp = tr("(Cloned)"); 
    1659       pushAddClone->setEnabled(false); 
    1660       pushRemoveClone->setEnabled(true); 
    1661       pushRemoveSnap->setEnabled(false); 
    1662  
    1663       for (int i = 0; i < cloneList.size(); ++i) 
    1664         if ( cloneList.at(i) == snapshotList.at(newVal) ) 
    1665            cloneId = i; 
    1666  
    1667       if ( cloneId != -1 ) 
    1668         // List the clone 
    1669         labelClone->setText(tr("Mounted on: ") + "/usr/jails/clones/" + IP + "-" + cloneList.at(cloneId) ); 
    1670  
    1671    } else { 
    1672       labelClone->setText(tr("Snapshot not mounted")); 
    1673       pushAddClone->setEnabled(true); 
    1674       pushRemoveClone->setEnabled(false); 
    1675       pushRemoveSnap->setEnabled(true); 
    1676    } 
     1565   pushRemoveSnap->setEnabled(true); 
    16771566   labelSnap->setText(getSnapDateReadable(snapshotList.at(newVal)) + " (" + snapshotComments.at(newVal) + ") " + tmp); 
    16781567} 
     
    16911580     qDebug() << "Enabling cron snapshots"; 
    16921581     QProcess m; 
    1693      m.start(QString("warden"), QStringList() << "zfscronsnap" << IP << "start" << comboSnapFrequency->currentText() << QString::number(spinSnapDays->value()) ); 
     1582     m.start(QString("warden"), QStringList() << "cronsnap" << IP << "start" << comboSnapFrequency->currentText() << QString::number(spinSnapDays->value()) ); 
    16941583     while(m.state() == QProcess::Starting || m.state() == QProcess::Running) { 
    16951584        m.waitForFinished(200); 
     
    16991588     qDebug() << "Disabling cron snapshots"; 
    17001589     QProcess m; 
    1701      m.start(QString("warden"), QStringList() << "zfscronsnap" << IP << "stop" ); 
     1590     m.start(QString("warden"), QStringList() << "cronsnap" << IP << "stop" ); 
    17021591     while(m.state() == QProcess::Starting || m.state() == QProcess::Running) { 
    17031592        m.waitForFinished(200); 
  • src-qt4/warden-gui/dialogwarden.h

    r9d5cf20 raadcedc  
    8585    void slotRestoreSnap(); 
    8686    void slotRemoveSnap(); 
    87     void slotLoadClones(); 
    88     void slotAddClone(); 
    89     void slotRemoveClone(); 
     87    void slotMakeClone(); 
    9088    void slotCronSnapshotChanged(); 
    9189 
  • src-qt4/warden-gui/dialogwarden.ui

    rba606f5 raadcedc  
    529529                   <iconset resource="warden.qrc"> 
    530530                    <normaloff>:/restoresnap.png</normaloff>:/restoresnap.png</iconset> 
    531                   </property> 
    532                  </widget> 
    533                 </item> 
    534                 <item> 
    535                  <widget class="QPushButton" name="pushAddClone"> 
    536                   <property name="minimumSize"> 
    537                    <size> 
    538                     <width>32</width> 
    539                     <height>32</height> 
    540                    </size> 
    541                   </property> 
    542                   <property name="maximumSize"> 
    543                    <size> 
    544                     <width>100</width> 
    545                     <height>32</height> 
    546                    </size> 
    547                   </property> 
    548                   <property name="toolTip"> 
    549                    <string>Mount the snapshot</string> 
    550                   </property> 
    551                   <property name="text"> 
    552                    <string>&amp;Mount</string> 
    553                   </property> 
    554                   <property name="icon"> 
    555                    <iconset resource="warden.qrc"> 
    556                     <normaloff>:/running.png</normaloff>:/running.png</iconset> 
    557                   </property> 
    558                  </widget> 
    559                 </item> 
    560                 <item> 
    561                  <widget class="QPushButton" name="pushRemoveClone"> 
    562                   <property name="minimumSize"> 
    563                    <size> 
    564                     <width>32</width> 
    565                     <height>32</height> 
    566                    </size> 
    567                   </property> 
    568                   <property name="maximumSize"> 
    569                    <size> 
    570                     <width>100</width> 
    571                     <height>32</height> 
    572                    </size> 
    573                   </property> 
    574                   <property name="toolTip"> 
    575                    <string>Unmount the snapshot</string> 
    576                   </property> 
    577                   <property name="text"> 
    578                    <string>&amp;Unmount</string> 
    579                   </property> 
    580                   <property name="icon"> 
    581                    <iconset resource="warden.qrc"> 
    582                     <normaloff>:/stopped.png</normaloff>:/stopped.png</iconset> 
    583531                  </property> 
    584532                 </widget> 
     
    858806           <property name="maximumSize"> 
    859807            <size> 
    860              <width>32</width> 
     808             <width>300</width> 
    861809             <height>32</height> 
    862810            </size> 
     
    866814           </property> 
    867815           <property name="text"> 
    868             <string/> 
     816            <string>&amp;Start Jail</string> 
    869817           </property> 
    870818           <property name="icon"> 
     
    899847           <property name="maximumSize"> 
    900848            <size> 
    901              <width>32</width> 
     849             <width>400</width> 
    902850             <height>32</height> 
    903851            </size> 
     
    907855           </property> 
    908856           <property name="text"> 
    909             <string/> 
     857            <string>J&amp;ail Configuration</string> 
    910858           </property> 
    911859           <property name="icon"> 
     
    944892           <property name="maximumSize"> 
    945893            <size> 
    946              <width>32</width> 
     894             <width>300</width> 
    947895             <height>32</height> 
    948896            </size> 
     
    952900           </property> 
    953901           <property name="text"> 
    954             <string/> 
     902            <string>&amp;New Jail</string> 
    955903           </property> 
    956904           <property name="icon"> 
     
    976924           <property name="maximumSize"> 
    977925            <size> 
    978              <width>32</width> 
     926             <width>300</width> 
    979927             <height>32</height> 
    980928            </size> 
     
    984932           </property> 
    985933           <property name="text"> 
    986             <string/> 
     934            <string>&amp;Remove Jail</string> 
    987935           </property> 
    988936           <property name="icon"> 
Note: See TracChangeset for help on using the changeset viewer.