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

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

Initial import of PC-BSD /current/ SVN repo

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