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

releng/10.0.1releng/10.0.2releng/10.0.3releng/10.1
Last change on this file since 3adfc87 was 3adfc87, checked in by Ken Moore <ken@…>, 9 months ago

Fix the logic in the Warden new jail wizard so that it will always show the last error preventing the user from continuing rather than silently preventing the user from continuing.

  • Property mode set to 100644
File size: 7.0 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 system version (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   int i = 0;
47   QString tmp;
48   while (m.canReadLine()) {
49     i++;
50     tmp = m.readLine().simplified();
51     // Skip first two header lines
52     if ( i > 2)
53       comboTemplate->addItem(tmp);
54   }
55}
56
57void wizardNewJail::slotCheckChecks()
58{
59   if ( checkIPv4->isChecked() )
60      lineIP->setEnabled(true);
61   else
62      lineIP->setEnabled(false);
63
64   if ( checkIPv6->isChecked() )
65      lineIP6->setEnabled(true);
66   else
67      lineIP6->setEnabled(false);
68
69   slotCheckComplete();
70}
71
72void wizardNewJail::setHostIPUsed(QStringList uH, QStringList uIP)
73{
74   usedHosts = uH;
75   usedIP = uIP;
76}
77
78void wizardNewJail::accept()
79{
80    QString ip4, ip6, tplate;
81    if ( checkIPv4->isChecked() )
82       ip4 = lineIP->text();
83    if ( checkIPv6->isChecked() )
84       ip6 = lineIP6->text();
85
86    if ( comboTemplate->currentIndex() != 0 )
87    tplate = comboTemplate->currentText().section(" ", 0, 0);
88   
89    emit create(ip4, ip6, lineHost->text(), radioTraditionalJail->isChecked(), checkPCBSDUtils->isChecked(),
90                lineRoot->text(), checkSystemSource->isChecked(), checkPortsTree->isChecked(),
91                checkAutostart->isChecked(), radioLinuxJail->isChecked(), lineLinuxScript->text(), tplate);
92    close();
93   
94}
95
96void wizardNewJail::slotClose()
97{
98  close();
99}
100
101// Logic checks to see if we are ready to move onto next page
102bool wizardNewJail::validatePage()
103{
104  QColor red = QColor(255, 78, 78);
105  QColor white = QColor(255, 255, 255);
106  QPalette badPal(red);
107  badPal.setColor(QPalette::Window,red);
108  badPal.setColor(QPalette::WindowText,red);
109  QPalette goodPal(white);
110  goodPal.setColor(QPalette::Window,white);
111  goodPal.setColor(QPalette::WindowText,white);
112  labelMessage->setText(QString());
113  bool ok = true;
114
115  switch (currentId()) {
116     case Page_IP:
117         // Make sure items are not empty
118         if ( checkIPv4->isChecked() && lineIP->text().isEmpty() ) {
119            ok=false;
120         }
121         if ( checkIPv6->isChecked() && lineIP6->text().isEmpty() ) {
122            ok=false;
123         }
124         if ( lineHost->text().isEmpty() ) {
125            ok=false;
126         }
127         if ( lineHost->text().contains(" ") ) {
128            labelMessage->setText(tr("Hostname cannot contain spaces!"));
129            ok=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).toLower() == lineHost->text().toLower() ) {
135               lineHost->setPalette(badPal);
136               labelMessage->setText(tr("Hostname already used!"));
137               ok=false;
138            }
139         }
140         for (int i = 0; i < usedIP.size(); ++i)
141            if ( usedIP.at(i).contains(lineIP->text() + "/24") ) {
142               lineIP->setPalette(badPal);
143               labelMessage->setText(tr("IP already used!"));
144               ok=false;
145               break;
146            }
147
148         // Check if we have a good IPV4 or IPV6 address
149         if ( checkIPv4->isChecked() && ! pcbsd::Utils::validateIPV4(lineIP->text())) {
150           lineIP->setPalette(badPal);
151           labelMessage->setText(tr("Invalid IP address!"));
152           ok=false;
153         }
154
155         if ( checkIPv6->isChecked() && ! pcbsd::Utils::validateIPV6(lineIP6->text()) ) {
156           lineIP6->setPalette(badPal);
157           labelMessage->setText(tr("Invalid IPv6 address!"));
158           ok=false;
159         }
160        if(!ok){
161           button(QWizard::NextButton)->setEnabled(false);
162        }else{
163           // Got to the end, must be good!
164           lineIP->setPalette(goodPal);
165           lineHost->setPalette(goodPal);
166           button(QWizard::NextButton)->setEnabled(true);
167        }
168     case Page_Root:
169         if ( lineRoot->text() != lineRoot2->text() ) {
170           button(QWizard::NextButton)->setEnabled(false);
171           ok = false;
172         } else {
173           button(QWizard::NextButton)->setEnabled(true);
174         }
175         return true;
176     case Page_Linux:
177          if ( lineLinuxScript->text().isEmpty() ) {
178            button(QWizard::NextButton)->setEnabled(false);
179            ok = false;
180          }
181     default:
182         button(QWizard::NextButton)->setEnabled(true);
183  }
184
185  return ok;
186}
187
188int wizardNewJail::nextId() const
189{
190  switch (currentId()) {
191     case Page_Type:
192         if (radioPortsJail->isChecked())
193           return Page_Opts;
194       break;
195       case Page_Root:
196         checkSystemSource->setHidden(false); 
197         checkPortsTree->setHidden(false); 
198         if (radioLinuxJail->isChecked()) {
199           labelConfirm->setText(tr("Please take a moment and set any other options for this jail."));
200           return Page_Linux;
201         } else {
202           return Page_Opts;
203         }
204       break;
205       case Page_Linux:
206           checkSystemSource->setHidden(true); 
207           checkPortsTree->setHidden(true); 
208           return Page_Opts;
209       break;
210       case Page_Opts:
211         return -1;
212       break;
213     default:
214        return currentId() + 1;
215  }
216  return currentId() + 1;
217}
218
219void wizardNewJail::slotCheckComplete()
220{
221   // Validate this page
222   validatePage();
223}
224
225void wizardNewJail::slotSelectLinuxScript()
226{
227   lineLinuxScript->setText(QFileDialog::getOpenFileName(this,
228   tr("Select Script"), "/usr/local/share/warden/linux-installs", tr("Linux install files (*)")));
229}
230
231
Note: See TracBrowser for help on using the repository browser.