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

9.2-releasereleng/10.0releng/10.0.1
Last change on this file since cf89547 was cf89547, checked in by yurkis <yurkis@…>, 10 months ago

Ooops. Fix ugly code

  • Property mode set to 100644
File size: 17.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 <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    {
163        QString uname = GetUname->readLine().simplified();
164        labelBASEVer->setText( uname );
165        Version= uname.section(" ",0,0);
166    }
167}
168
169
170// Ask user where to save text file, then start the generation
171void PBSystemTab::startGenerateSheet()
172{
173    SheetFileName="";
174        SheetFileName = QFileDialog::getSaveFileName(
175                    this,
176                    "save file dialog",
177                    "/home/" + username + "/Desktop",
178                    "Text File (*.txt)");
179       
180      if ( ! SheetFileName.isEmpty() )
181     {
182          if ( SheetFileName.indexOf(".txt", 0) == -1)
183          {
184              SheetFileName.append(".txt");
185          }
186        if ( QFile::exists(SheetFileName ) )
187        {
188            int answer = QMessageBox::warning( this, "Overwrite File", "Overwrite " + SheetFileName + "?", "&Yes", "&No", QString::null, 1, 1 );
189                   if ( answer == 0 ) {
190              CreateSheetFile();               
191            }
192           
193        } else {
194            CreateSheetFile(); 
195               }
196     }
197       
198
199}
200
201
202void PBSystemTab::CreateSheetFile()
203{
204   
205        SheetGenScript = new QProcess( this );
206        QString prog = PREFIX + "/share/pcbsd/scripts/GenDiagSheet.sh";
207        QStringList args;
208        args << SheetFileName;
209        connect( SheetGenScript, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finishedSheet()) );
210               
211        SheetGenScript->start(prog, args);
212}
213
214
215void PBSystemTab::finishedSheet()
216{
217        ViewSheet = new QProcess( this );
218        QString prog = "kedit";
219        QStringList args;
220        args << SheetFileName;
221        ViewSheet->start(prog, args);
222}
223
224
225void PBSystemTab::saveKernScreen()
226{
227     if ( checkForceIbus->isChecked() )
228                pcbsd::Utils::setConfFileValue(PREFIX + "/share/pcbsd/xstartup/enable-ibus.sh", "FORCEIBUS", "FORCEIBUS=\"YES\"", 1);
229     else
230                pcbsd::Utils::setConfFileValue(PREFIX + "/share/pcbsd/xstartup/enable-ibus.sh", "FORCEIBUS", "FORCEIBUS=\"NO\"", 1);
231
232}
233
234
235
236void PBSystemTab::showRebootRequired()
237{
238    QMessageBox::information( this, "PC-BSD Notification",
239    "Settings Updated!\n You must reboot for changes to take effect!" );
240}
241
242
243// Read the loader.conf, and load any settings we need
244void PBSystemTab::LoadKernSettings()
245{
246    if ( checkValue("/boot/loader.conf", "splash_pcx_load=", "YES" ) ) { showBootCheck->setChecked(true); }
247    else { showBootCheck->setChecked(false); }
248}
249
250// Checks the file for a string KEY, and sees if its set to VALUE
251bool PBSystemTab::checkValue( QString File, QString Key, QString Value )
252{
253    QString theValue = pcbsd::Utils::getConfFileValue(File, Key);
254    if (theValue == Value) {
255        return TRUE;
256    }
257    return FALSE;
258   
259}
260
261void PBSystemTab::fetchSourcePressed()
262{
263    portsnapUI = new PortsnapProgress();
264    portsnapUI->init(false, Version);
265    portsnapUI->show();
266}
267
268void PBSystemTab::fetchPortsPressed()
269{
270    portsnapUI = new PortsnapProgress();
271    portsnapUI->init(true, Version);
272    portsnapUI->show();
273}
274
275void PBSystemTab::customSplashPressed()
276{
277    QString file = QFileDialog::getOpenFileName(this, tr("Select Splash"), "/home/" + username, "*.pcx");
278    if (file == "") { return; }
279   
280    QImage image(file, "PCX");
281   
282    if (image.isNull())
283    {
284        QMessageBox::warning(this, tr("Invalid Image"), tr("The file supplied does not appear to be a valid PCX image."));
285        return;
286    }
287    if ((image.width() > 1024) || (image.height() > 768) || (image.depth() > 8))
288    {
289        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."));
290        return;
291    }
292
293    system("cp '" + file.toAscii() + "' /boot/loading-screen.pcx");
294    splashSelect->clear();
295    loadBootData();
296    splashSelect->setCurrentIndex(0);
297}
298
299
300void PBSystemTab::miscSavePressed()
301{
302    //Change registry entry
303    QSettings settings;
304    QString code = codeMap[splashSelect->currentText()];
305    settings.setValue("/PCBSD/splash-screen", code);
306   
307    //Move files about
308    system("cp " + PREFIX.toAscii() + "/share/pcbsd/splash-screens/loading-screen-" + code.toAscii() + ".pcx /boot/loading-screen.pcx");
309    system("chmod 644 /boot/loading-screen.pcx");
310   
311    if ( showBootCheck->isChecked() )
312    {
313        pcbsd::Utils::setConfFileValue("/boot/loader.conf", "splash_pcx_load=", "splash_pcx_load=\"YES\"" );
314        pcbsd::Utils::setConfFileValue("/boot/loader.conf", "vesa_load=", "vesa_load=\"YES\"" );
315        pcbsd::Utils::setConfFileValue("/boot/loader.conf", "bitmap_load=", "bitmap_load=\"YES\"" );
316        pcbsd::Utils::setConfFileValue("/boot/loader.conf", "bitmap_name=", "bitmap_name=\"/boot/loading-screen.pcx\"" );
317     } else {
318        pcbsd::Utils::setConfFileValue("/boot/loader.conf", "splash_pcx_load=", "splash_pcx_load=\"NO\"" );
319        pcbsd::Utils::setConfFileValue("/boot/loader.conf", "vesa_load=", "vesa_load=\"NO\"" );
320        pcbsd::Utils::setConfFileValue("/boot/loader.conf", "bitmap_load=", "bitmap_load=\"NO\"" );
321     }
322}
323
324
325void PBSystemTab::showSplashChecked(int newState)
326{
327    if (newState == 0)
328    {
329        splashSelect->setEnabled(false);
330        customBut->setEnabled(false);
331    }
332    else
333    {
334        splashSelect->setEnabled(true);
335        customBut->setEnabled(true);
336    }
337}
338
339
340void PBSystemTab::loadBootData()
341{
342    //Trawl screens directory
343    QDir screens = QDir(PREFIX + "/share/pcbsd/splash-screens/");
344    if (! screens.exists())
345    {
346        QMessageBox::critical( 0, tr("Refresh Mirrors"), PREFIX + "/share/pcbsd/splash-screens/ " + tr("doesn't exist!"), QMessageBox::Ok );
347        return;
348    }
349    screens.setFilter(QDir::Files);
350    QStringList screensList = screens.entryList();
351   
352    QRegExp screenMatcher = QRegExp("^loading-screen-(([a-z]|[A-Z]|_)+)\\.pcx$");
353    QStringList langList = QStringList();
354    QLocale langResolver;
355    codeMap = QMap<QString, QString>();
356    bool customPresent = false;
357    for (QStringList::Iterator it = screensList.begin(); it != screensList.end(); it++)
358    {
359        int pos  = screenMatcher.indexIn(*it);
360        if (pos > -1)
361        {
362            QString code = screenMatcher.cap(1);
363            if (code == "custom") { customPresent = true; }
364            else
365            { 
366                QLocale lang(code);
367                QString langName = langResolver.languageToString(lang.language());
368                if ( langName.isEmpty() )
369                {
370                    langName = "Splash Screen: " + code;
371                }
372                langList += langName;
373                codeMap[langName] = code;
374            }
375        }
376    }
377   
378   
379    //Populate select box
380    langList.sort();
381    splashSelect->addItems(langList);
382
383    int indexMod = 0;
384   
385    if (customPresent)
386    {
387        codeMap[tr("Custom")] = "custom";
388        splashSelect->addItem(tr("Custom"), 0);
389        indexMod = 1;
390    }
391   
392    //Load current, get info from registry - /PCBSD/splash-screen
393    QSettings settings;
394    QString selectedLang = settings.value("/PCBSD/splash-screen", langResolver.language()).toString();
395   
396    if (selectedLang == "custom") { splashSelect->setCurrentIndex(0); }
397    else
398    {
399        //If we don't have a splash for the user's language, default to english
400        QLocale tlocale(selectedLang);
401        QString testLangName = langResolver.languageToString(tlocale.language());
402        if (codeMap[testLangName] == "") selectedLang = "en";
403
404        QLocale tlocale2(selectedLang);
405        selectedLang = langResolver.languageToString(tlocale2.language());
406        if ( selectedLang.isEmpty() )
407        {
408             selectedLang = "Splash Screen: " + selectedLang;
409        }
410
411        splashSelect->setCurrentIndex(langList.indexOf(selectedLang) + indexMod);
412    }
413   
414    if ( checkValue("/boot/loader.conf", "splash_pcx_load=", "YES" ) )
415                showBootCheck->setChecked(TRUE);
416
417    if ( pcbsd::Utils::getConfFileValue(QString(PREFIX + "/share/pcbsd/xstartup/enable-ibus.sh"), QString("FORCEIBUS=") ) == QString("YES"))
418                checkForceIbus->setChecked(TRUE);
419    else
420                checkForceIbus->setChecked(FALSE);
421}
422
423void PBSystemTab::slotUpdateMirrorList() {
424  // Fetch from here http://updates.pcbsd.org/mirror-list.php
425  QString URL, LFILE;
426  URL= "http://updates.pcbsd.org/mirror-list.php";
427
428  mirrorJob = new QNetworkAccessManager(this);
429  mirrorJobBuf.clear();
430
431  QNetworkRequest netRequest;
432  netRequest.setUrl(QUrl(URL));
433  mirrorReply = mirrorJob->get(netRequest);
434   
435  connect(mirrorJob, SIGNAL(finished(QNetworkReply *)), this, SLOT(slotRefreshMirrorDone() ) );
436  connect(mirrorReply, SIGNAL(readyRead()), this, SLOT(slotGetMirrorData() ) );
437}
438
439void PBSystemTab::slotGetMirrorData() {
440        //while (mirrorReply->canReadLine() )
441        //        mirrorJobBuf << mirrorReply->readLine().simplified();
442
443        mirrorJobBuf = mirrorJobBuf + mirrorReply->readAll();
444}
445
446void PBSystemTab::slotRefreshMirrorDone() {
447   QString MirrorName, MirrorURL, tmp;
448
449
450   if (mirrorReply->error() != QNetworkReply::NoError)
451   {
452      QMessageBox::critical( 0, tr("Refresh Mirrors"), tr("Error fetching mirror list! Check your internet connection, or try again later."), QMessageBox::Ok );
453        return;
454   }
455
456   QStringList mirrorList;
457   mirrorList = mirrorJobBuf.split("\n");
458   qDebug() << "Avail Mirrors:" << mirrorList;
459   // Clear the combo box 
460   comboMirrorList->clear();
461   int i = 0;
462
463   QString line;
464   for ( int z = 0; z < mirrorList.size(); z++ ) {
465     line = mirrorList.at(z);
466
467     tmp = line;
468     tmp.truncate(line.indexOf("=") -1 );
469     MirrorName = tmp;
470     MirrorURL = line.remove(0, line.indexOf("=") + 1);
471     mirrorNames[i] = MirrorName;
472     mirrorURLs[i] = MirrorURL.simplified();
473     comboMirrorList->addItem( MirrorName );
474
475     if ( currentMirror == MirrorURL )
476        comboMirrorList->setCurrentIndex(i);
477
478     i++;
479   }
480
481   // Close the array
482   mirrorNames[i] = "";
483   mirrorURLs[i] = "";
484
485   QSettings settings("PCBSD");
486   settings.beginWriteArray("/PC-BSD/SoftwareManager/mirrorList");
487   i = 0;
488   while ( !mirrorNames[i].isEmpty() )
489   {
490      settings.setArrayIndex(i);
491      settings.setValue("MirrorName", mirrorNames[i]);
492      settings.setValue("MirrorURL", mirrorURLs[i].simplified());
493      i++;
494   }
495
496   settings.endArray(); 
497}
498
499
500void PBSystemTab::slotCheckMirrorRadio() {
501
502    comboMirrorList->setEnabled(false);
503    pushRefreshList->setEnabled(false);
504    lineCustomMirror->setEnabled(false);
505    if( radioSelectMirror->isChecked() )
506    {
507      comboMirrorList->setEnabled(true);
508      pushRefreshList->setEnabled(true);
509    }
510    if( radioCustomMirror->isChecked() )
511      lineCustomMirror->setEnabled(true);
512}
513
514void PBSystemTab::slotMiscSave() {
515    miscSavePressed();
516    saveKernScreen();
517}
518
519void PBSystemTab::slotMirrorSave() {
520    saveMirrorConfig();
521}
522
523void PBSystemTab::saveMirrorConfig() {
524    if( ! sanityCheckSettings() )
525        return;
526
527
528    if ( ! radioSelectMirror->isChecked() ) {
529       pcbsd::Utils::setMasterMirror(lineCustomMirror->text());
530    } else if (radioAutoMirror->isChecked() ) {
531       pcbsd::Utils::setMasterMirror("");
532    } else {
533       // Check if we have a mirror selected and save it
534       QString curMirror;
535       int i = 0;
536       while ( !mirrorNames[i].isEmpty() )
537       {
538          if ( comboMirrorList->currentText() == mirrorNames[i]) {
539            curMirror = mirrorURLs[i];
540            break;
541          }
542          i++;
543       }
544       
545       pcbsd::Utils::setMasterMirror(curMirror);
546    }
547}
548
549void PBSystemTab::slotClose() {
550    close();
551}
552
553bool PBSystemTab::sanityCheckSettings()
554{
555  if (radioCustomMirror->isChecked() ) {
556    if( lineCustomMirror->text().indexOf("http://") != 0 && lineCustomMirror->text().indexOf("ftp://") != 0 )
557    {
558      tabWidget->setCurrentIndex(1);
559      QMessageBox::critical( 0, tr("Config Error"), tr("Error: Your custom mirror needs to begin with ftp:// or http://"), QMessageBox::Ok );
560      return false;
561    }
562  }
563
564  return true;
565}
566
567
568QString PBSystemTab::getLineFromCommandOutput( QString cmd )
569{
570        FILE *file = popen(cmd.toLatin1(),"r");
571   
572        char buffer[100];
573 
574        QString line = "";
575        char firstChar;
576
577        if ((firstChar = fgetc(file)) != -1){
578                line += firstChar;
579                line += fgets(buffer,100,file);
580        }
581        pclose(file);
582        return line.simplified();
583}
584
585void PBSystemTab::changeOpenTab(int tab)
586{
587   tabWidget->setCurrentIndex(tab);
588}
589
590void PBSystemTab::checkProxy()
591{
592  bool ok;
593  int port;
594
595  // If no proxy set
596  if ( pcbsd::Utils::getProxyURL().isEmpty() )
597    return;
598
599  QNetworkProxy proxy;
600  if ( pcbsd::Utils::getProxyType() == "SOCKS5" )
601    proxy.setType(QNetworkProxy::Socks5Proxy);
602  else
603    proxy.setType(QNetworkProxy::HttpProxy);
604
605  proxy.setHostName(pcbsd::Utils::getProxyURL());
606
607  port = pcbsd::Utils::getProxyPort().toInt(&ok);
608  if ( ! pcbsd::Utils::getProxyPort().isEmpty() && ok )
609    proxy.setPort(port);
610  if ( ! pcbsd::Utils::getProxyUser().isEmpty() )
611    proxy.setUser(pcbsd::Utils::getProxyUser());
612  if ( ! pcbsd::Utils::getProxyPass().isEmpty() )
613    proxy.setPassword(pcbsd::Utils::getProxyPass());
614
615  QNetworkProxy::setApplicationProxy(proxy);
616}
Note: See TracBrowser for help on using the repository browser.