source: src-qt4/warden-gui/wizardNewJail.cpp @ ed41975

9.2-releasereleng/10.0releng/10.0.1releng/10.0.2releng/10.0.3
Last change on this file since ed41975 was 5dbb9c2, checked in by Kris Moore <kris@…>, 17 months ago

Add new template combobox to warden GUI, which will allow users to pick from other FreeBSD version/arch templates

  • Property mode set to 100644
File size: 7.1 KB
Line 
1/****************************************************************************
2** ui.h extension file, included from the uic-generated form implementation.
3**
4** If you want to add, delete, or rename functions or slots, use
5** Qt Designer to update this file, preserving your code.
6**
7** You should not define a constructor or destructor in this file.
8** Instead, write your code in functions called init() and destroy().
9** These will automatically be called by the form's constructor and
10** destructor.
11*****************************************************************************/
12#include "wizardNewJail.h"
13#include "pcbsd-utils.h"
14#include <QDebug>
15#include <QProcess>
16#include <QFileDialog>
17
18
19void wizardNewJail::programInit()
20{
21    // Connect our checks
22    connect(lineRoot, SIGNAL(textChanged ( const QString & )), this, SLOT(slotCheckComplete() ) );
23    connect(lineRoot2, SIGNAL(textChanged ( const QString & )), this, SLOT(slotCheckComplete() ) );
24    connect(lineIP, SIGNAL(textChanged ( const QString & )), this, SLOT(slotCheckComplete() ) );
25    connect(lineIP6, SIGNAL(textChanged ( const QString & )), this, SLOT(slotCheckComplete() ) );
26    connect(checkIPv4, SIGNAL(clicked()), this, SLOT(slotCheckChecks()));
27    connect(checkIPv6, SIGNAL(clicked()), this, SLOT(slotCheckChecks()));
28    connect(lineHost, SIGNAL(textChanged ( const QString & )), this, SLOT(slotCheckComplete() ) );
29    connect(lineLinuxScript, SIGNAL(textChanged ( const QString & )), this, SLOT(slotCheckComplete() ) );
30    connect(pushLinuxScript, SIGNAL(clicked()), this, SLOT(slotSelectLinuxScript()) );
31    connect(this, SIGNAL(currentIdChanged(int)), this, SLOT(slotCheckComplete()) );
32    loadTemplates();
33}
34
35void wizardNewJail::loadTemplates()
36{
37   comboTemplate->clear();
38   comboTemplate->addItem(tr("Use host Version + Architecture (default)"));
39   // Load any available templates
40   QProcess m;
41   m.start(QString("warden"), QStringList() << "template" << "list");
42   while(m.state() == QProcess::Starting || m.state() == QProcess::Running) {
43      m.waitForFinished(200);
44      QCoreApplication::processEvents();
45   }
46   // Get output of mount now
47   int i = 0;
48   QString tmp;
49   while (m.canReadLine()) {
50     i++;
51     tmp = m.readLine().simplified();
52     // Skip first two header lines
53     if ( i > 2)
54       comboTemplate->addItem(tmp);
55   }
56}
57
58void wizardNewJail::slotCheckChecks()
59{
60   if ( checkIPv4->isChecked() )
61      lineIP->setEnabled(true);
62   else
63      lineIP->setEnabled(false);
64
65   if ( checkIPv6->isChecked() )
66      lineIP6->setEnabled(true);
67   else
68      lineIP6->setEnabled(false);
69
70   slotCheckComplete();
71}
72
73void wizardNewJail::setHostIPUsed(QStringList uH, QStringList uIP)
74{
75   usedHosts = uH;
76   usedIP = uIP;
77}
78
79void wizardNewJail::accept()
80{
81    QString ip4, ip6, tplate;
82    if ( checkIPv4->isChecked() )
83       ip4 = lineIP->text();
84    if ( checkIPv6->isChecked() )
85       ip6 = lineIP6->text();
86
87    if ( comboTemplate->currentIndex() != 0 )
88    tplate = comboTemplate->currentText().section(" ", 0, 0);
89   
90    emit create(ip4, ip6, lineHost->text(), radioTraditionalJail->isChecked(), checkPCBSDUtils->isChecked(),
91                lineRoot->text(), checkSystemSource->isChecked(), checkPortsTree->isChecked(),
92                checkAutostart->isChecked(), radioLinuxJail->isChecked(), lineLinuxScript->text(), tplate);
93    close();
94   
95}
96
97void wizardNewJail::slotClose()
98{
99  close();
100}
101
102// Logic checks to see if we are ready to move onto next page
103bool wizardNewJail::validatePage()
104{
105  QColor red = QColor(255, 78, 78);
106  QColor white = QColor(255, 255, 255);
107  QPalette badPal(red);
108  badPal.setColor(QPalette::Window,red);
109  badPal.setColor(QPalette::WindowText,red);
110  QPalette goodPal(white);
111  goodPal.setColor(QPalette::Window,white);
112  goodPal.setColor(QPalette::WindowText,white);
113  labelMessage->setText(QString());
114
115
116  switch (currentId()) {
117     case Page_IP:
118         // Make sure items are not empty
119         if ( checkIPv4->isChecked() && lineIP->text().isEmpty() ) {
120            button(QWizard::NextButton)->setEnabled(false);
121            return false;
122         }
123         if ( checkIPv6->isChecked() && lineIP6->text().isEmpty() ) {
124            button(QWizard::NextButton)->setEnabled(false);
125            return false;
126         }
127         if ( lineHost->text().isEmpty() ) {
128            button(QWizard::NextButton)->setEnabled(false);
129            return false;
130         }
131
132         // Check if this IP / Host is already used
133         for (int i = 0; i < usedHosts.size(); ++i)
134            if ( usedHosts.at(i) == lineHost->text() ) {
135               button(QWizard::NextButton)->setEnabled(false);
136               lineHost->setPalette(badPal);
137               labelMessage->setText(tr("Hostname already used!"));
138               return false;
139            }
140         for (int i = 0; i < usedIP.size(); ++i)
141            if ( usedIP.at(i) == lineIP->text() ) {
142               button(QWizard::NextButton)->setEnabled(false);
143               lineIP->setPalette(badPal);
144               labelMessage->setText(tr("IP already used!"));
145               return false;
146            }
147
148         // Check if we have a good IPV4 or IPV6 address
149         if ( ! pcbsd::Utils::validateIPV4(lineIP->text()) && ! pcbsd::Utils::validateIPV6(lineIP->text()) ) {
150           button(QWizard::NextButton)->setEnabled(false);
151           lineIP->setPalette(badPal);
152           labelMessage->setText(tr("Invalid IP address!"));
153           return false;
154         }
155
156         // Got to the end, must be good!
157         lineIP->setPalette(goodPal);
158         lineHost->setPalette(goodPal);
159         button(QWizard::NextButton)->setEnabled(true);
160         return true;
161     case Page_Root:
162         if ( lineRoot->text() != lineRoot2->text() ) {
163           button(QWizard::NextButton)->setEnabled(false);
164           return false;
165         } else {
166           button(QWizard::NextButton)->setEnabled(true);
167         }
168         return true;
169     case Page_Linux:
170          if ( lineLinuxScript->text().isEmpty() ) {
171            button(QWizard::NextButton)->setEnabled(false);
172            return false;
173          }
174     default:
175         button(QWizard::NextButton)->setEnabled(true);
176         return true;
177  }
178
179  return true;
180}
181
182int wizardNewJail::nextId() const
183{
184  switch (currentId()) {
185     case Page_Type:
186         if (radioPortsJail->isChecked())
187           return Page_Opts;
188       break;
189       case Page_Root:
190         checkSystemSource->setHidden(false); 
191         checkPortsTree->setHidden(false); 
192         if (radioLinuxJail->isChecked()) {
193           labelConfirm->setText(tr("Please take a moment and set any other options for this jail."));
194           return Page_Linux;
195         } else {
196           return Page_Opts;
197         }
198       break;
199       case Page_Linux:
200           checkSystemSource->setHidden(true); 
201           checkPortsTree->setHidden(true); 
202           return Page_Opts;
203       break;
204       case Page_Opts:
205         return -1;
206       break;
207     default:
208        return currentId() + 1;
209  }
210  return currentId() + 1;
211}
212
213void wizardNewJail::slotCheckComplete()
214{
215   // Validate this page
216   validatePage();
217}
218
219void wizardNewJail::slotSelectLinuxScript()
220{
221   lineLinuxScript->setText(QFileDialog::getOpenFileName(this,
222   tr("Select Script"), "/usr/local/share/warden/linux-installs", tr("Linux install files (*)")));
223}
224
225
Note: See TracBrowser for help on using the repository browser.