source: src-qt4/pc-sysmanager/pbsystemtab.cpp @ ad90f5d

9.1-release9.2-releasereleng/10.0releng/10.0.1releng/10.0.2
Last change on this file since ad90f5d was ad90f5d, checked in by Kris Moore <kris@…>, 16 months ago

Remove the meta-widget from pc-sysmanager

  • Property mode set to 100644
File size: 17.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 <qstring.h>
13#include <pcbsd-utils.h>
14#include <qfiledialog.h>
15#include <QTextStream>
16#include <QNetworkAccessManager>
17#include <QNetworkReply>
18#include <QNetworkProxy>
19#include <QProgressDialog>
20#include <QDebug>
21#include "../config.h"
22
23#include "pbsystemtab.h"
24
25void PBSystemTab::ProgramInit()
26{
27    //Grab the username
28    username = QString::fromLocal8Bit(getenv("LOGNAME"));
29   
30    // Set the Uname on the General Tab
31    CheckUname();
32    // Set the PC-BSD Version on the General Tab
33    CheckPBVer();
34
35    // See if we need to setup a proxy
36    checkProxy();
37   
38    //Get & Set CPU Type
39    labelCPU->setText(pcbsd::Utils::sysctl("hw.model").simplified());
40   
41    //Get & Set RAM
42    labelMemory->setText(pcbsd::Utils::bytesToHumanReadable(pcbsd::Utils::sysctlAsInt("hw.physmem")));
43   
44    // Read any kernel settings
45    LoadKernSettings();
46
47    // Read any rc.conf settings
48    //loadServSettings();
49
50    //Load boot screen data
51    loadBootData();
52
53    // Load the mirror configuration
54    loadMirrorConfig();
55 
56    // Connect our various buttons
57    connect(buttonGenerate, SIGNAL(clicked()), this, SLOT(startGenerateSheet()) );
58    connect(showBootCheck, SIGNAL(clicked()), this, SIGNAL(changed()));
59    connect(splashSelect, SIGNAL(activated(int)), this, SIGNAL(changed()));
60    connect(pushRefreshList, SIGNAL( clicked() ), this, SLOT( slotUpdateMirrorList() ) );
61    connect(pushMirrorSave, SIGNAL( clicked() ), this, SLOT( slotMirrorSave() ) );
62    connect(pushMiscSave, SIGNAL( clicked() ), this, SLOT( slotMiscSave() ) );
63
64    connect(fetchSourceBut, SIGNAL( clicked() ), this, SLOT( fetchSourcePressed() ) );
65    connect(fetchPortsBut, SIGNAL( clicked() ), this, SLOT( fetchPortsPressed() ) );
66
67    // Connect the mirror radio buttons, so we can enable disable objects based on status
68    connect(radioAutoMirror, SIGNAL( clicked() ), this, SLOT( slotCheckMirrorRadio() ) );
69    connect(radioSelectMirror, SIGNAL( clicked() ), this, SLOT( slotCheckMirrorRadio() ) );
70    connect(radioCustomMirror, SIGNAL( clicked() ), this, SLOT( slotCheckMirrorRadio() ) );
71
72}
73
74void PBSystemTab::loadMirrorConfig()
75{
76
77  QSettings settings("PCBSD");
78  QString tmp;
79
80  // Get the current mirror
81  currentMirror = pcbsd::Utils::getMasterMirror();
82
83  // Load our array of mirrors
84  comboMirrorList->clear();
85  bool foundMirror = false;
86  bool usingMirrorList = false;
87  QString MirrorName, MirrorURL;
88
89  int size = settings.beginReadArray("/PC-BSD/SoftwareManager/mirrorList");
90  for (int i = 0; i < size; ++i) {
91     foundMirror = true;
92     settings.setArrayIndex(i);
93     MirrorName = settings.value("MirrorName").toString();
94     MirrorURL = settings.value("MirrorURL").toString();
95     comboMirrorList->addItem( MirrorName );
96     mirrorNames[i] = MirrorName;
97     mirrorURLs[i] = MirrorURL;
98     if ( currentMirror == MirrorURL ) {
99       comboMirrorList->setCurrentIndex(i);
100       radioSelectMirror->setChecked(true);
101       usingMirrorList = true;
102     }
103  }
104               
105  settings.endArray();
106
107  // If our mirror list is empty, start a refresh of it now
108  if (!foundMirror)
109     slotUpdateMirrorList();
110 
111  // Check if we found a mirror in the PC-BSD list, otherwise default to custom mirror
112  if (!usingMirrorList) {
113      if ( currentMirror.isEmpty() )
114        radioAutoMirror->setChecked(true);
115      else
116        radioCustomMirror->setChecked(true);
117      lineCustomMirror->setText(currentMirror);
118  }
119
120  slotCheckMirrorRadio();
121}
122
123void PBSystemTab::CheckUname()
124{
125        QString prog = "uname";
126        QStringList args; 
127        args << "-rm"; 
128               
129        GetUname = new QProcess( this );
130        connect( GetUname, SIGNAL(readyReadStandardOutput()), this, SLOT(ReadUname()) );
131        GetUname->start(prog, args);
132}
133
134
135void PBSystemTab::CheckPBVer()
136{
137 
138 QString pcVer="";
139 QStringList out = pcbsd::Utils::runShellCommand(QString("pkg info -f pcbsd-base"));
140 if (out.size()) {
141   for (int i=0; i<out.size(); i++)
142   {
143     if (out[i].contains("Version"))
144     {
145         pcVer = out[i];
146         pcVer.replace("Version        : ","");
147         labelPCBSD->setText(pcVer);
148         break;
149     }
150   }
151 }
152
153
154 Arch = getLineFromCommandOutput("uname -m");
155 
156}
157
158
159void PBSystemTab::ReadUname()
160{
161    if (GetUname->canReadLine() )
162        labelBASEVer->setText( GetUname->readLine().simplified() );
163}
164
165
166// Ask user where to save text file, then start the generation
167void PBSystemTab::startGenerateSheet()
168{
169    SheetFileName="";
170        SheetFileName = QFileDialog::getSaveFileName(
171                    this,
172                    "save file dialog",
173                    "/home/" + username + "/Desktop",
174                    "Text File (*.txt)");
175       
176      if ( ! SheetFileName.isEmpty() )
177     {
178          if ( SheetFileName.indexOf(".txt", 0) == -1)
179          {
180              SheetFileName.append(".txt");
181          }
182        if ( QFile::exists(SheetFileName ) )
183        {
184            int answer = QMessageBox::warning( this, "Overwrite File", "Overwrite " + SheetFileName + "?", "&Yes", "&No", QString::null, 1, 1 );
185                   if ( answer == 0 ) {
186              CreateSheetFile();               
187            }
188           
189        } else {
190            CreateSheetFile(); 
191               }
192     }
193       
194
195}
196
197
198void PBSystemTab::CreateSheetFile()
199{
200   
201        SheetGenScript = new QProcess( this );
202        QString prog = PREFIX + "/share/pcbsd/scripts/GenDiagSheet.sh";
203        QStringList args;
204        args << SheetFileName;
205        connect( SheetGenScript, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finishedSheet()) );
206               
207        SheetGenScript->start(prog, args);
208}
209
210
211void PBSystemTab::finishedSheet()
212{
213        ViewSheet = new QProcess( this );
214        QString prog = "kedit";
215        QStringList args;
216        args << SheetFileName;
217        ViewSheet->start(prog, args);
218}
219
220
221void PBSystemTab::saveKernScreen()
222{
223     if ( checkForceIbus->isChecked() )
224                pcbsd::Utils::setConfFileValue(PREFIX + "/share/pcbsd/xstartup/enable-ibus.sh", "FORCEIBUS", "FORCEIBUS=\"YES\"", 1);
225     else
226                pcbsd::Utils::setConfFileValue(PREFIX + "/share/pcbsd/xstartup/enable-ibus.sh", "FORCEIBUS", "FORCEIBUS=\"NO\"", 1);
227
228}
229
230
231
232void PBSystemTab::showRebootRequired()
233{
234    QMessageBox::information( this, "PC-BSD Notification",
235    "Settings Updated!\n You must reboot for changes to take effect!" );
236}
237
238
239// Read the loader.conf, and load any settings we need
240void PBSystemTab::LoadKernSettings()
241{
242    if ( checkValue("/boot/loader.conf", "splash_pcx_load=", "YES" ) ) { showBootCheck->setChecked(true); }
243    else { showBootCheck->setChecked(false); }
244}
245
246// Checks the file for a string KEY, and sees if its set to VALUE
247bool PBSystemTab::checkValue( QString File, QString Key, QString Value )
248{
249    QString theValue = pcbsd::Utils::getConfFileValue(File, Key);
250    if (theValue == Value) {
251        return TRUE;
252    }
253    return FALSE;
254   
255}
256
257void PBSystemTab::fetchSourcePressed()
258{
259    portsnapUI = new PortsnapProgress();
260    portsnapUI->init(false, Version);
261    portsnapUI->show();
262}
263
264void PBSystemTab::fetchPortsPressed()
265{
266    portsnapUI = new PortsnapProgress();
267    portsnapUI->init(true, Version);
268    portsnapUI->show();
269}
270
271void PBSystemTab::customSplashPressed()
272{
273    QString file = QFileDialog::getOpenFileName(this, tr("Select Splash"), "/home/" + username, "*.pcx");
274    if (file == "") { return; }
275   
276    QImage image(file, "PCX");
277   
278    if (image.isNull())
279    {
280        QMessageBox::warning(this, tr("Invalid Image"), tr("The file supplied does not appear to be a valid PCX image."));
281        return;
282    }
283    if ((image.width() > 1024) || (image.height() > 768) || (image.depth() > 8))
284    {
285        QMessageBox::warning(this, tr("Invalid Image"), tr("The splash screen image cannot be any larger than 1024x768, or any greater than 8-bit (256 colours) depth."));
286        return;
287    }
288
289    system("cp '" + file.toAscii() + "' /boot/loading-screen.pcx");
290    splashSelect->clear();
291    loadBootData();
292    splashSelect->setCurrentIndex(0);
293}
294
295
296void PBSystemTab::miscSavePressed()
297{
298    //Change registry entry
299    QSettings settings;
300    QString code = codeMap[splashSelect->currentText()];
301    settings.setValue("/PCBSD/splash-screen", code);
302   
303    //Move files about
304    system("cp " + PREFIX.toAscii() + "/share/pcbsd/splash-screens/loading-screen-" + code.toAscii() + ".pcx /boot/loading-screen.pcx");
305    system("chmod 644 /boot/loading-screen.pcx");
306   
307    if ( showBootCheck->isChecked() )
308    {
309        pcbsd::Utils::setConfFileValue("/boot/loader.conf", "splash_pcx_load=", "splash_pcx_load=\"YES\"" );
310        pcbsd::Utils::setConfFileValue("/boot/loader.conf", "vesa_load=", "vesa_load=\"YES\"" );
311        pcbsd::Utils::setConfFileValue("/boot/loader.conf", "bitmap_load=", "bitmap_load=\"YES\"" );
312        pcbsd::Utils::setConfFileValue("/boot/loader.conf", "bitmap_name=", "bitmap_name=\"/boot/loading-screen.pcx\"" );
313     } else {
314        pcbsd::Utils::setConfFileValue("/boot/loader.conf", "splash_pcx_load=", "splash_pcx_load=\"NO\"" );
315        pcbsd::Utils::setConfFileValue("/boot/loader.conf", "vesa_load=", "vesa_load=\"NO\"" );
316        pcbsd::Utils::setConfFileValue("/boot/loader.conf", "bitmap_load=", "bitmap_load=\"NO\"" );
317     }
318}
319
320
321void PBSystemTab::showSplashChecked(int newState)
322{
323    if (newState == 0)
324    {
325        splashSelect->setEnabled(false);
326        customBut->setEnabled(false);
327    }
328    else
329    {
330        splashSelect->setEnabled(true);
331        customBut->setEnabled(true);
332    }
333}
334
335
336void PBSystemTab::loadBootData()
337{
338    //Trawl screens directory
339    QDir screens = QDir(PREFIX + "/share/pcbsd/splash-screens/");
340    if (! screens.exists())
341    {
342        QMessageBox::critical( 0, tr("Refresh Mirrors"), PREFIX + "/share/pcbsd/splash-screens/ " + tr("doesn't exist!"), QMessageBox::Ok );
343        return;
344    }
345    screens.setFilter(QDir::Files);
346    QStringList screensList = screens.entryList();
347   
348    QRegExp screenMatcher = QRegExp("^loading-screen-(([a-z]|[A-Z]|_)+)\\.pcx$");
349    QStringList langList = QStringList();
350    QLocale langResolver;
351    codeMap = QMap<QString, QString>();
352    bool customPresent = false;
353    for (QStringList::Iterator it = screensList.begin(); it != screensList.end(); it++)
354    {
355        int pos  = screenMatcher.indexIn(*it);
356        if (pos > -1)
357        {
358            QString code = screenMatcher.cap(1);
359            if (code == "custom") { customPresent = true; }
360            else
361            { 
362                QLocale lang(code);
363                QString langName = langResolver.languageToString(lang.language());
364                if ( langName.isEmpty() )
365                {
366                    langName = "Splash Screen: " + code;
367                }
368                langList += langName;
369                codeMap[langName] = code;
370            }
371        }
372    }
373   
374   
375    //Populate select box
376    langList.sort();
377    splashSelect->addItems(langList);
378
379    int indexMod = 0;
380   
381    if (customPresent)
382    {
383        codeMap[tr("Custom")] = "custom";
384        splashSelect->addItem(tr("Custom"), 0);
385        indexMod = 1;
386    }
387   
388    //Load current, get info from registry - /PCBSD/splash-screen
389    QSettings settings;
390    QString selectedLang = settings.value("/PCBSD/splash-screen", langResolver.language()).toString();
391   
392    if (selectedLang == "custom") { splashSelect->setCurrentIndex(0); }
393    else
394    {
395        //If we don't have a splash for the user's language, default to english
396        QLocale tlocale(selectedLang);
397        QString testLangName = langResolver.languageToString(tlocale.language());
398        if (codeMap[testLangName] == "") selectedLang = "en";
399
400        QLocale tlocale2(selectedLang);
401        selectedLang = langResolver.languageToString(tlocale2.language());
402        if ( selectedLang.isEmpty() )
403        {
404             selectedLang = "Splash Screen: " + selectedLang;
405        }
406
407        splashSelect->setCurrentIndex(langList.indexOf(selectedLang) + indexMod);
408    }
409   
410    if ( checkValue("/boot/loader.conf", "splash_pcx_load=", "YES" ) )
411                showBootCheck->setChecked(TRUE);
412
413    if ( pcbsd::Utils::getConfFileValue(QString(PREFIX + "/share/pcbsd/xstartup/enable-ibus.sh"), QString("FORCEIBUS=") ) == QString("YES"))
414                checkForceIbus->setChecked(TRUE);
415    else
416                checkForceIbus->setChecked(FALSE);
417}
418
419void PBSystemTab::slotUpdateMirrorList() {
420  // Fetch from here http://updates.pcbsd.org/mirror-list.php
421  QString URL, LFILE;
422  URL= "http://updates.pcbsd.org/mirror-list.php";
423
424  mirrorJob = new QNetworkAccessManager(this);
425  mirrorJobBuf.clear();
426
427  QNetworkRequest netRequest;
428  netRequest.setUrl(QUrl(URL));
429  mirrorReply = mirrorJob->get(netRequest);
430   
431  connect(mirrorJob, SIGNAL(finished(QNetworkReply *)), this, SLOT(slotRefreshMirrorDone() ) );
432  connect(mirrorReply, SIGNAL(readyRead()), this, SLOT(slotGetMirrorData() ) );
433}
434
435void PBSystemTab::slotGetMirrorData() {
436        //while (mirrorReply->canReadLine() )
437        //        mirrorJobBuf << mirrorReply->readLine().simplified();
438
439        mirrorJobBuf = mirrorJobBuf + mirrorReply->readAll();
440}
441
442void PBSystemTab::slotRefreshMirrorDone() {
443   QString MirrorName, MirrorURL, tmp;
444
445
446   if (mirrorReply->error() != QNetworkReply::NoError)
447   {
448      QMessageBox::critical( 0, tr("Refresh Mirrors"), tr("Error fetching mirror list! Check your internet connection, or try again later."), QMessageBox::Ok );
449        return;
450   }
451
452   QStringList mirrorList;
453   mirrorList = mirrorJobBuf.split("\n");
454   qDebug() << "Avail Mirrors:" << mirrorList;
455   // Clear the combo box 
456   comboMirrorList->clear();
457   int i = 0;
458
459   QString line;
460   for ( int z = 0; z < mirrorList.size(); z++ ) {
461     line = mirrorList.at(z);
462
463     tmp = line;
464     tmp.truncate(line.indexOf("=") -1 );
465     MirrorName = tmp;
466     MirrorURL = line.remove(0, line.indexOf("=") + 1);
467     mirrorNames[i] = MirrorName;
468     mirrorURLs[i] = MirrorURL.simplified();
469     comboMirrorList->addItem( MirrorName );
470
471     if ( currentMirror == MirrorURL )
472        comboMirrorList->setCurrentIndex(i);
473
474     i++;
475   }
476
477   // Close the array
478   mirrorNames[i] = "";
479   mirrorURLs[i] = "";
480
481   QSettings settings("PCBSD");
482   settings.beginWriteArray("/PC-BSD/SoftwareManager/mirrorList");
483   i = 0;
484   while ( !mirrorNames[i].isEmpty() )
485   {
486      settings.setArrayIndex(i);
487      settings.setValue("MirrorName", mirrorNames[i]);
488      settings.setValue("MirrorURL", mirrorURLs[i].simplified());
489      i++;
490   }
491
492   settings.endArray(); 
493}
494
495
496void PBSystemTab::slotCheckMirrorRadio() {
497
498    comboMirrorList->setEnabled(false);
499    pushRefreshList->setEnabled(false);
500    lineCustomMirror->setEnabled(false);
501    if( radioSelectMirror->isChecked() )
502    {
503      comboMirrorList->setEnabled(true);
504      pushRefreshList->setEnabled(true);
505    }
506    if( radioCustomMirror->isChecked() )
507      lineCustomMirror->setEnabled(true);
508}
509
510void PBSystemTab::slotMiscSave() {
511    miscSavePressed();
512    saveKernScreen();
513}
514
515void PBSystemTab::slotMirrorSave() {
516    saveMirrorConfig();
517}
518
519void PBSystemTab::saveMirrorConfig() {
520    if( ! sanityCheckSettings() )
521        return;
522
523
524    if ( ! radioSelectMirror->isChecked() ) {
525       pcbsd::Utils::setMasterMirror(lineCustomMirror->text());
526    } else if (radioAutoMirror->isChecked() ) {
527       pcbsd::Utils::setMasterMirror("");
528    } else {
529       // Check if we have a mirror selected and save it
530       QString curMirror;
531       int i = 0;
532       while ( !mirrorNames[i].isEmpty() )
533       {
534          if ( comboMirrorList->currentText() == mirrorNames[i]) {
535            curMirror = mirrorURLs[i];
536            break;
537          }
538          i++;
539       }
540       
541       pcbsd::Utils::setMasterMirror(curMirror);
542    }
543}
544
545void PBSystemTab::slotClose() {
546    close();
547}
548
549bool PBSystemTab::sanityCheckSettings()
550{
551  if (radioCustomMirror->isChecked() ) {
552    if( lineCustomMirror->text().indexOf("http://") != 0 && lineCustomMirror->text().indexOf("ftp://") != 0 )
553    {
554      tabWidget->setCurrentIndex(1);
555      QMessageBox::critical( 0, tr("Config Error"), tr("Error: Your custom mirror needs to begin with ftp:// or http://"), QMessageBox::Ok );
556      return false;
557    }
558  }
559
560  return true;
561}
562
563
564QString PBSystemTab::getLineFromCommandOutput( QString cmd )
565{
566        FILE *file = popen(cmd.toLatin1(),"r");
567   
568        char buffer[100];
569 
570        QString line = "";
571        char firstChar;
572
573        if ((firstChar = fgetc(file)) != -1){
574                line += firstChar;
575                line += fgets(buffer,100,file);
576        }
577        pclose(file);
578        return line.simplified();
579}
580
581void PBSystemTab::changeOpenTab(int tab)
582{
583   tabWidget->setCurrentIndex(tab);
584}
585
586void PBSystemTab::checkProxy()
587{
588  bool ok;
589  int port;
590
591  // If no proxy set
592  if ( pcbsd::Utils::getProxyURL().isEmpty() )
593    return;
594
595  QNetworkProxy proxy;
596  if ( pcbsd::Utils::getProxyType() == "SOCKS5" )
597    proxy.setType(QNetworkProxy::Socks5Proxy);
598  else
599    proxy.setType(QNetworkProxy::HttpProxy);
600
601  proxy.setHostName(pcbsd::Utils::getProxyURL());
602
603  port = pcbsd::Utils::getProxyPort().toInt(&ok);
604  if ( ! pcbsd::Utils::getProxyPort().isEmpty() && ok )
605    proxy.setPort(port);
606  if ( ! pcbsd::Utils::getProxyUser().isEmpty() )
607    proxy.setUser(pcbsd::Utils::getProxyUser());
608  if ( ! pcbsd::Utils::getProxyPass().isEmpty() )
609    proxy.setPassword(pcbsd::Utils::getProxyPass());
610
611  QNetworkProxy::setApplicationProxy(proxy);
612}
Note: See TracBrowser for help on using the repository browser.