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

9.2-releasereleng/10.0releng/10.0.1releng/10.0.2releng/10.0.3
Last change on this file since 56d05c5 was 56d05c5, checked in by yurkis <yurkis@…>, 15 months ago

Fix system sources fetch (for STABLE branch). Please check for other

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