source: src-qt4/pc-servicemanager/servicemanager.cpp @ 1f0939e

9.1-release9.2-releasereleng/10.0releng/10.0.1releng/10.0.2releng/10.0.3
Last change on this file since 1f0939e was 1f0939e, checked in by Kris Moore <kris@…>, 17 months ago
  • Initial merge of code from PC-BSD SVN repo for my private (pre-release) hacking
  • Property mode set to 100644
File size: 11.8 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 <QDebug>
13#include <QTimer>
14#include <QTreeWidgetItem>
15#include <QTextStream>
16#include <pcbsd-utils.h>
17
18#include "ui_servicemanager.h"
19#include "servicemanager.h"
20
21void ServiceManager::ProgramInit(QString chroot, QString IP)
22{
23    // Set any warden stuff
24    wDir = chroot;
25    wIP = IP;
26
27    listServices->setColumnHidden(0, true);
28    listServices->setColumnHidden(1, true);
29   
30    pushStart->setEnabled(FALSE);
31    pushStop->setEnabled(FALSE);
32    pushRestart->setEnabled(FALSE);
33    pushEnableStartup->setEnabled(FALSE);
34    pushDisableStartup->setEnabled(FALSE);
35   
36     // Connect the buttons
37    connect( pushStart, SIGNAL( clicked() ), this, SLOT( startSlot() ) );
38    connect( pushStop, SIGNAL( clicked() ), this, SLOT( stopSlot() ) );
39    connect( pushRestart, SIGNAL( clicked() ), this, SLOT( restartSlot() ) );
40    connect( pushEnableStartup, SIGNAL( clicked() ), this, SLOT( enableSlot() ) );
41    connect( pushDisableStartup, SIGNAL( clicked() ), this, SLOT( disableSlot() ) );
42   
43   
44    // Connect the list box
45    connect( listServices, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT( listSelectionChanged() ) );
46     
47    // Start loading the various service files
48    populateList();
49   
50    // Start checking the status of these services
51    currentCheckRunningItem = new QTreeWidgetItemIterator(listServices);
52    checkRunning();
53   
54    // Start checking if services are enabled
55    checkEnabled();
56
57    if ( ! wDir.isEmpty() )
58      textTopLabel->setText(tr("Managing services for Warden IP:") + " " +  wIP);
59}
60
61void ServiceManager::setButtonsAllEnabled(bool enabled)
62{
63  pushStart->setEnabled(enabled); 
64  pushStop->setEnabled(enabled); 
65  pushRestart->setEnabled(enabled); 
66  pushEnableStartup->setEnabled(enabled); 
67  pushDisableStartup->setEnabled(enabled); 
68
69}
70
71void ServiceManager::startSlot()
72{
73    QTreeWidgetItem *item = listServices->currentItem();
74      if (!item)
75        return;
76         
77    workingTreeWidgetItem = item;       
78         
79    // Disable the buttons until we are done
80    setButtonsAllEnabled(false);
81
82    // Start the process
83    QString prog;
84    QStringList args;
85
86    if ( wDir.isEmpty() ) {
87      prog = item->text(0);
88      args << "start";
89    } else {
90      prog = "warden";
91      args << "chroot" << wIP << item->text(0) + " start";
92    }
93
94
95    // Show the progress GUI
96    progressUI *servAction = new progressUI;
97    servAction->startServ(prog, args);
98    servAction->show();
99
100    // Set item staus to pending
101    item->setText(3, tr("Checking...") );
102
103    listSelectionChanged();
104
105}
106
107
108void ServiceManager::stopSlot()
109{
110    QTreeWidgetItem *item = listServices->currentItem();
111      if (!item)
112        return;
113         
114    workingTreeWidgetItem = item;       
115         
116    // Disable the buttons until we are done
117    setButtonsAllEnabled(false);
118
119    // Stop the process
120    QString prog;
121    QStringList args;
122
123    if ( wDir.isEmpty() ) {
124      prog = item->text(0);
125      args << "stop";
126    } else {
127      prog = "warden";
128      args << "chroot" << wIP << item->text(0) + " stop";
129    }
130
131    // Show the progress GUI
132    progressUI *servAction = new progressUI;
133    servAction->startServ(prog, args);
134    servAction->show();
135
136    // Set item staus to pending
137    item->setText(3, tr("Checking...") );
138
139    listSelectionChanged();
140
141}
142
143
144void ServiceManager::restartSlot()
145{
146    QTreeWidgetItem *item = listServices->currentItem();
147      if (!item)
148        return;
149         
150    workingTreeWidgetItem = item;       
151
152    // Disable the buttons until we are done
153    setButtonsAllEnabled(false);
154
155    // Restart the process
156    QString prog;
157    QStringList args;
158
159    if ( wDir.isEmpty() ) {
160      prog = item->text(0);
161      args << "start";
162    } else {
163      prog = "warden";
164      args << "chroot" << wIP << item->text(0) + " restart";
165    }
166
167
168    // Show the progress GUI
169    progressUI *servAction = new progressUI;
170    servAction->startServ(prog, args);
171    servAction->show();
172
173    // Set item staus to pending
174    item->setText(3, tr("Checking...") );
175
176    listSelectionChanged();
177
178}
179
180
181void ServiceManager::enableSlot()
182{
183    QTreeWidgetItem *item = listServices->currentItem();
184    if (!item)
185      return;
186         
187    workingTreeWidgetItem = item;       
188    QStringList rcList;
189    QString tag = item->text(1);
190
191    // Disable the buttons until we are done
192    setButtonsAllEnabled(false);
193
194    Utils::setConfFileValue( wDir + "/etc/rc.conf", tag, tag + "=\"YES\"", -1);
195
196    // Set the service as enabled
197    item->setText(4, tr("Enabled"));
198    listSelectionChanged();
199}
200
201
202void ServiceManager::disableSlot()
203{
204    QTreeWidgetItem *item = listServices->currentItem();
205      if (!item)
206        return;
207         
208    workingTreeWidgetItem = item;       
209         
210    // Disable the buttons until we are done
211    setButtonsAllEnabled(false);
212    QStringList rcList;
213    QString tag = item->text(1);
214
215    // Disable the buttons until we are done
216    setButtonsAllEnabled(false);
217
218    Utils::setConfFileValue( wDir + "/etc/rc.conf", tag, tag + "=\"NO\"", -1);
219
220    // Set the service as enabled
221    item->setText(4, tr("Disabled"));
222    listSelectionChanged();
223}
224
225
226void ServiceManager::populateList()
227{
228        QString tmp;
229        bool valid;
230        QString ServiceDir, ServiceTag, ServiceName;
231   
232        QStringList sDirs;
233        sDirs << wDir + "/etc/rc.d" << wDir + "/usr/local/etc/rc.d";
234
235        for ( int z = 0; z < sDirs.size(); ++z) {
236
237          QDir d( sDirs.at(z) );
238       
239          d.setFilter( QDir::Files );
240          d.setSorting( QDir::Name );
241
242          if ( d.count() == 0 )
243            return;
244       
245          for ( unsigned int i = 0; i < d.count(); i++ )
246          {
247              ServiceDir=""; ServiceTag=""; ServiceName="";
248
249              QFile file( sDirs.at(z) + "/" + d[i] );
250              if ( file.open( QIODevice::ReadOnly ) ) {
251                  valid=false;
252                  ServiceDir=d[i];
253                  QTextStream stream( &file );
254                  stream.setCodec("UTF-8");
255                  QString line;
256                  while ( !stream.atEnd() ) {
257                      line = stream.readLine(); // line of text excluding '\n'
258                     
259                      if ( line.indexOf("name=") == 0)
260                      {
261                        valid=true;
262                        tmp = line.replace("name=", "");
263                        ServiceName = tmp.replace('"', "");
264                      }
265                      if ( line.indexOf("rcvar=") == 0)
266                      {
267                        if ( tmp.isEmpty() )
268                          continue;
269
270                        tmp = line.replace("rcvar=", "");
271                        tmp = tmp.replace('"', "");
272                        tmp = tmp.replace("'", "");
273                        tmp = tmp.replace("`", "");
274                        tmp = tmp.replace("$(set_rcvar)", "");
275                        tmp = tmp.replace("$set_rcvar", "");
276                        tmp = tmp.replace("set_rcvar", "");
277                        tmp = tmp.replace("${name}", "");
278                        tmp = tmp.replace("_enable", "");
279                        tmp = tmp.replace(" ", "");
280
281                        if (tmp.isEmpty())
282                          ServiceTag = ServiceName + "_enable";
283                        else
284                          ServiceTag = tmp;
285
286                        if ( ServiceTag.indexOf("_enable") == -1 )
287                                ServiceTag=ServiceTag + "_enable";
288                        break;
289                      }
290                  }
291                  file.close();
292
293                  if ( !valid || ServiceTag.isEmpty() )
294                    continue;
295
296                  QStringList cols;
297                  QString cDir = sDirs.at(z);
298                  if ( ! wDir.isEmpty() )
299                    cDir.replace(wDir, "");
300                  cols << cDir + "/" + ServiceDir << ServiceTag << ServiceName << tr("Unknown") << tr("Unknown");
301                  (void) new QTreeWidgetItem(listServices, cols );
302                  qDebug() << "Added Service:" << cDir << ServiceDir << ServiceName << ServiceTag;
303              }
304          }
305        }   
306
307        listServices->sortItems(2, Qt::AscendingOrder);
308
309}
310
311
312void ServiceManager::checkRunning()
313{
314    QTreeWidgetItemIterator it(*currentCheckRunningItem);
315    if (*it)
316    {
317        if ( wDir.isEmpty() ) {
318          // Start the detection script
319          QString prog = (*it)->text(0);
320          QStringList args;
321          args << "status";
322          CheckServiceRunning= new QProcess( this );
323          connect( CheckServiceRunning, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(checkRunningFinishedSlot()) );
324          CheckServiceRunning->start(prog, args);
325        } else {
326          // Start the detection script
327          QString prog = "warden";
328          QStringList args;
329          args << "chroot" << wIP << (*it)->text(0) + " status";
330          CheckServiceRunning= new QProcess( this );
331          connect( CheckServiceRunning, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(checkRunningFinishedSlot()) );
332          CheckServiceRunning->start(prog, args);
333        }
334        return;
335    }
336   
337
338    // At the end! Restart scanning in a few seconds
339    currentCheckRunningItem = new QTreeWidgetItemIterator(listServices);
340    QTimer::singleShot(5000, this, SLOT(checkRunning()));
341
342}
343
344
345void ServiceManager::checkEnabled()
346{
347    QStringList rcList;
348    QStringList rcFiles;
349    QString tmp, tmp2;
350
351    rcFiles << wDir + "/etc/rc.conf.local" << wDir + "/etc/rc.conf" << wDir + "/etc/rc.conf.pcbsd" << wDir + "/etc/defaults/rc.conf";
352
353    // Read in the rc conf files
354    for ( int r = 0; r<rcFiles.size(); r++ ) {
355      QFile file( rcFiles.at(r) );
356      if ( file.open( QIODevice::ReadOnly ) ) {
357        QTextStream stream( &file );
358        stream.setCodec("UTF-8");
359        QString line;
360        while ( !stream.atEnd() )
361             rcList << stream.readLine(); 
362        file.close();
363      }
364    }
365
366
367
368    currentCheckEnabledItem = new QTreeWidgetItemIterator(listServices);
369    QTreeWidgetItemIterator it(*currentCheckEnabledItem);
370    while(*it)
371    {
372        (*it)->setText(4, tr("Disabled") );
373
374        for ( int i = 0; i< rcList.size(); i++) {
375          tmp = rcList.at(i).simplified();
376          tmp2 = (*it)->text(1) + "=\"YES\"";
377          if ( tmp.indexOf(tmp2) == 0 ) {
378                (*it)->setText(4, tr("Enabled") );
379                break;
380          }
381          tmp2 = (*it)->text(1) + "=\"NO\"";
382          if ( tmp.indexOf(tmp2) == 0 ) {
383                (*it)->setText(4, tr("Disabled") );
384                break;
385          }
386        }
387       it++; 
388    }
389}
390
391
392void ServiceManager::checkRunningFinishedSlot()
393{
394    QTreeWidgetItemIterator it(*currentCheckRunningItem);
395
396    if ( CheckServiceRunning->exitCode() == 0 && CheckServiceRunning->exitStatus() == QProcess::NormalExit)
397    {
398        QString tmp = CheckServiceRunning->readAll();
399        if ( tmp.indexOf("is running") != -1 )
400          (*it)->setText(3, tr("Running") );
401        else if ( tmp.indexOf("not running") != -1 )
402          (*it)->setText(3, tr("Stopped") );
403        else
404          (*it)->setText(3, "" );
405    } else {
406        (*it)->setText(3, "" );
407    }
408
409    (*currentCheckRunningItem)++; 
410
411    // Update button status if we are on currently selected item
412    QTreeWidgetItem *i = listServices->currentItem();
413    if (i) 
414      if(listServices->currentItem()->text(0) == (*it)->text(0) )
415        listSelectionChanged();
416
417    checkRunning();
418
419}
420
421void ServiceManager::listSelectionChanged()
422{
423         
424    pushStart->setEnabled(FALSE);
425    pushStop->setEnabled(FALSE);
426    pushRestart->setEnabled(FALSE);
427    pushEnableStartup->setEnabled(FALSE);
428    pushDisableStartup->setEnabled(FALSE);
429   
430    QTreeWidgetItem *i = listServices->currentItem();
431     if (!i)
432       return;
433       
434     if ( listServices->currentItem()->text(3) == tr("Running") )
435     {
436        pushStart->setEnabled(FALSE);
437        pushStop->setEnabled(TRUE);
438        pushRestart->setEnabled(TRUE);
439     }
440       
441     if ( listServices->currentItem()->text(3) == tr("Stopped")
442       || (listServices->currentItem()->text(3).isEmpty() 
443       && listServices->currentItem()->text(4) == tr("Enabled") ) )
444     {
445        pushStart->setEnabled(TRUE);
446        pushStop->setEnabled(FALSE);
447        pushRestart->setEnabled(FALSE);
448     }
449
450     if ( listServices->currentItem()->text(4) == tr("Enabled") )
451     {
452        pushEnableStartup->setEnabled(FALSE);
453        pushDisableStartup->setEnabled(TRUE);
454     }
455       
456     if ( listServices->currentItem()->text(4) == tr("Disabled") )
457     {
458        pushEnableStartup->setEnabled(TRUE);
459        pushDisableStartup->setEnabled(FALSE);
460     }
461}
Note: See TracBrowser for help on using the repository browser.