source: src-qt4/pc-installgui/backend.cpp @ 8d3682c

9.2-releasereleng/10.0releng/10.0.1releng/10.0.2releng/10.0.3releng/10.1
Last change on this file since 8d3682c was 8d3682c, checked in by Kris Moore <kris@…>, 13 months ago

Add the ability for the GUI installer to detect your country and try to
set the default language based upon it. This will work ONLY if the
installer was able to connect to the internet.

  • Property mode set to 100644
File size: 14.5 KB
Line 
1#include <QApplication>
2#include <QFile>
3
4#include "backend.h"
5
6using namespace Scripts;
7
8void Backend::createErrorReport()
9{
10  QString line;
11
12  QProcess p;
13  QString prog = "xterm";
14  QStringList args;
15  args << "-e" << "/root/save-logs.sh";
16  p.start(prog, args);
17  if (p.waitForFinished()) {
18  }
19}
20
21int Backend::deleteMBRPart(QString Slice, QString &output)
22{
23  QStringList list;
24  QString line;
25
26  Process p(QStringList() << "delete-part" << Slice);
27  if(p.waitForFinished()) {
28    while (p.canReadLine()) {
29      line = line + p.readLine().simplified() + "\n";
30    }
31  }
32  output = line;
33  return p.exitCode();
34}
35
36int Backend::addMBRPart(QString Disk, int size, QString &output)
37{
38  QStringList list;
39  QString tmp;
40
41  Process p(QStringList() << "create-part" << Disk << tmp.setNum(size));
42  if(p.waitForFinished()) {
43    while (p.canReadLine()) {
44      output = output + p.readLine().simplified() + "\n";
45    }
46  }
47  return p.exitCode();
48}
49
50void Backend::setupSSHKeys(QString Host, QString User, QString Port)
51{
52  QString line;
53  QString PCSYSINSTALL;
54  if ( QFile::exists("/root/pc-sysinstall/pc-sysinstall") ) 
55     PCSYSINSTALL = "/root/pc-sysinstall/pc-sysinstall";
56  else 
57     PCSYSINSTALL = "/usr/local/sbin/pc-sysinstall";
58
59  QProcess p;
60  QString prog = "xterm";
61  QStringList args;
62  args << "-e" << PCSYSINSTALL << "setup-ssh-keys" << User << Host << Port;
63  p.start(prog, args);
64  if (p.waitForFinished()) {
65  }
66}
67
68void Backend::enableNic(QString Nic, QString IP, QString NetMask, QString DNS, QString Gate, bool fetchMirrors, QString IPv6, QString IPv6Gate, QString IPv6DNS)
69{
70    QString line;
71    QString Mirrors;
72    if ( fetchMirrors )
73      Mirrors = "ON";
74    else
75      Mirrors = "OFF";
76
77    Process p(QStringList() << "enable-net" << Nic << IP << NetMask << DNS << Gate << Mirrors << IPv6 << IPv6Gate << IPv6DNS);
78    while(p.state() == QProcess::Starting || p.state() == QProcess::Running)
79        QCoreApplication::processEvents();
80
81    while (p.canReadLine()) {
82      qDebug() << "Enable Nic: " << p.readLine().simplified();
83    }
84}
85
86QStringList Backend::timezones()
87{
88    QStringList _zones;
89    QString line;
90
91    Process p(QStringList() << "list-tzones");
92
93    if (p.waitForFinished()) {
94        while (p.canReadLine()) {
95            line = p.readLine();
96            line = line.simplified();
97            line.truncate(65);
98            _zones.append(line);
99        }
100    }
101    return _zones;
102}
103
104QStringList Backend::languages()
105{
106    QStringList _languages;
107    QString code, desc, line;
108
109    QFile mFile;
110    mFile.setFileName("/usr/local/share/pc-sysinstall/conf/avail-langs");
111    if ( ! mFile.open(QIODevice::ReadOnly | QIODevice::Text))
112       return QStringList();
113
114    // Read in the meta-file for categories
115    QTextStream in(&mFile);
116    in.setCodec("UTF-8");
117    while ( !in.atEnd() ) {
118       line = in.readLine();
119       code = line;
120       code.truncate(line.indexOf(" "));
121       desc = line.remove(0, line.indexOf(" "));
122        _languages.append(desc.simplified() + " - (" + code.simplified() + ")");
123    }
124    mFile.close();
125    return _languages;
126}
127
128QStringList Backend::keyModels()
129{
130    QStringList _models;
131    QString code, desc, line;
132
133    Process p(QStringList() << "xkeyboard-models");
134
135    if (p.waitForFinished()) {
136        while (p.canReadLine()) {
137            line = p.readLine();
138            code = line;
139            code.truncate(line.indexOf(" "));
140            desc = line.remove(0, line.indexOf(" "));
141            _models.append(desc.simplified() + " - (" + code.simplified() + ")");
142        }
143    }
144    return _models;
145}
146
147QStringList Backend::keyLayouts()
148{
149    QStringList _layouts;
150    QString code, desc, line;
151
152    Process p(QStringList() << "xkeyboard-layouts");
153
154    if (p.waitForFinished()) {
155        while (p.canReadLine()) {
156            line = p.readLine();
157            code = line;
158            code.truncate(line.indexOf(" "));
159            desc = line.remove(0, line.indexOf(" "));
160            desc.replace("(", "'");
161            desc.replace(")", "'");
162            _layouts.append(desc.simplified() + " - (" + code.simplified() + ")");
163        }
164    }
165    return _layouts;
166}
167
168// Function which gets the key Variants for the target layout
169QStringList Backend::keyVariants(const QString &layout, QStringList &savedKeyVariants)
170{
171    QStringList _variants;
172    QString code, desc, line;
173
174    if ( savedKeyVariants.empty() )
175    {
176      Process p(QStringList() << "xkeyboard-variants");
177      while(p.state() == QProcess::Starting || p.state() == QProcess::Running)
178        QCoreApplication::processEvents();
179
180      while (p.canReadLine()) {
181          line = p.readLine().simplified();
182          savedKeyVariants << line;
183      }
184    }
185
186    for (int i = 0; i < savedKeyVariants.size(); ++i) {
187       // Look for variants for this particular layout
188       line = savedKeyVariants.at(i);
189       if ( line.indexOf(" " + layout + ":") != -1 )
190       {
191         code = line.simplified();
192         code.truncate(code.indexOf(" "));
193         desc = line.remove(0, line.indexOf(": ") + 1);
194         _variants.append(desc.simplified() + " - (" + code.simplified() + ")");
195       }
196    }
197
198    return _variants;
199}
200
201QStringList Backend::bootableMedia()
202{
203    QStringList media;
204
205    Process p(QStringList() << "");
206
207    if (p.waitForFinished()) {
208        while (p.canReadLine()) {
209            //
210        }
211    }
212    return media;
213}
214
215
216int Backend::systemMemory()
217{
218  int mem;
219  QString tmp;
220  bool ok;
221
222  Process p(QStringList() << "sys-mem");
223
224  if (p.waitForFinished()) {
225      while (p.canReadLine()) {
226          tmp = p.readLine().simplified();
227      }
228  }
229  mem = tmp.toInt(&ok);
230  qDebug() << "System Mem:" << mem;
231  if ( ok )
232    return mem;
233  else
234    return -1;
235}
236
237QString Backend::detectCountryCode()
238{
239    QString code;
240
241    Process p(QStringList() << "detect-country");
242
243    if (p.waitForFinished()) {
244       code = p.readLine().simplified();
245    }
246    qDebug() << "Found Country Code:" << code;
247    return code;
248}
249
250
251QStringList Backend::networkDevices()
252{
253    QStringList nics;
254
255    Process p(QStringList() << "detect-nics");
256
257    if (p.waitForFinished()) {
258        while (p.canReadLine()) {
259            nics.append(p.readLine().simplified());
260        }
261    }
262    qDebug() << "Found Nics:" << nics;
263    return nics;
264}
265
266// Function which lets us run setxkbmap
267void Backend::changeKbMap(QString model, QString layout, QString variant)
268{
269   QProcess kbp;
270   QStringList args;
271   QString prog;
272   prog = "setxkbmap"; 
273   args << "-model" << model << "-layout" << layout << "-variant" << variant;
274   qDebug() << "setxkbmap:" << args;
275   kbp.start(prog, args);
276   kbp.waitForFinished();
277}
278
279QList<QStringList> Backend::availComponents()
280{
281   QList<QStringList> components;
282   QStringList singleComponent;
283
284   QString tmp, name, desc, icon, type, line;
285   QString selected = "off";
286
287   Process p(QStringList() << "list-components");
288
289   if (p.waitForFinished()) {
290       while (p.canReadLine()) {
291          line = p.readLine();
292          line = line.simplified();
293          if ( line.indexOf("name:") != -1 )
294            name = line.remove(0, line.indexOf(": ") + 2); 
295          if ( line.indexOf("desc:") != -1 )
296            desc = line.remove(0, line.indexOf(": ") + 2); 
297          if ( line.indexOf("type:") != -1 )
298            type = line.remove(0, line.indexOf(": ") + 2); 
299          if ( line.indexOf("icon:") != -1 ) {
300            icon = line.remove(0, line.indexOf(": ") + 2); 
301            singleComponent << name << desc << icon << type << selected;
302            components << singleComponent;
303            qDebug() << "Found Component:" << singleComponent;
304            singleComponent.clear();
305          }
306       }
307   }
308
309   return components;
310}
311
312QList<QStringList> Backend::hardDrives()
313{
314    QList<QStringList> drives;
315    QStringList drive; //its a "list" so as to also append drive information
316    QStringList partition; //its a "list" so as to also append drive information
317
318    QString size, devinfo, type;
319    QString line, info;
320    QString tmp, dev, lastslice, slice, slabel, ssize;
321    bool ok;
322
323    Process p(QStringList() << "disk-list");
324
325    if (p.waitForFinished()) {
326        while (p.canReadLine()) {
327            line = p.readLine();
328            if ( line.isEmpty() ) 
329               continue;
330            dev = line.simplified();
331            dev.truncate(line.indexOf(":"));
332
333            tmp = line.simplified().remove(0, line.indexOf(":") + 1);
334            devinfo = tmp;
335
336            // Get the disk information for this dev
337            Process pp(QStringList() << "disk-info" << dev);
338            if (pp.waitForFinished()) {
339                while (pp.canReadLine()) {
340                    info = pp.readLine().simplified();
341                    if (info.indexOf("size=") == 0) size = info.replace("size=", "");
342                    if (info.indexOf("type=") == 0) type = info.replace("type=", "");
343                }
344            }
345
346            // Pad the disk size a bit
347            size.toInt(&ok);
348            if ( !ok)
349                continue;
350            //size.setNum(size.toInt(&ok) - 100);
351
352            // Add this info to our list
353            qDebug() << "Found Drive:" << dev << size << devinfo << type;
354            drive.clear();
355            drive << "DRIVE" << dev << size << devinfo << type;
356            drives.append(drive);
357
358            // Init lastslize in case this disk is completely empty
359            lastslice = "s0";
360
361            // Get the slice information for this disk
362            Process ppp(QStringList() << "disk-part" << dev);
363            if (ppp.waitForFinished()) {
364                while (ppp.canReadLine()) {
365                    info = ppp.readLine().simplified();
366                    // Get the slice we are working on
367                    if ( info.indexOf(dev + "s") == 0 || info.indexOf(dev + "p") == 0 ) {
368                      slice = info;
369                      slice.truncate(slice.indexOf("-"));
370                    } else {
371                      slice = "";
372                    }
373                     
374                    if (info.indexOf(slice + "-label: ") == 0) slabel = info.replace(slice + "-label: ", "");
375
376                    // Check if we've found the format flag
377                    if (info.indexOf(dev + "-format: ") == 0) {
378                      QString format = info.replace(dev + "-format: ", "");
379                      qDebug() << "Found Disk Format: " <<  dev << " - " << format;
380                      partition.clear();
381                      partition << "FORMAT" << dev << format;
382                      drives.append(partition);
383                    }
384
385                    // Check if we've found the new slice
386                    if (info.indexOf(slice + "-sizemb: ") == 0) {
387                      ssize = info.replace(slice + "-sizemb: ", "");
388                      // Make sure we have a number
389                      ssize.toInt(&ok);
390                      if (!ok)
391                        continue;
392
393                      // Pad the slice by 5MB
394                      //ssize.setNum(ssize.toInt(&ok) - 5);
395                       
396                      qDebug() << "Found Slice:" << dev << slice << slabel << ssize;
397                      partition.clear();
398                      partition << "SLICE" << dev << slice << ssize << slabel;   
399                      drives.append(partition);
400                      lastslice = slice;
401                    }
402
403                    // Check if we've found some free disk space
404                    if (info.indexOf(dev + "-freemb: ") == 0) {
405                      bool ok;
406                      int checkSize;
407                      ssize = info.replace(dev + "-freemb: ", "");
408                      checkSize = ssize.toInt(&ok); 
409                      if ( ok && checkSize > 100 )
410                      {
411                        // Figure out the next slice number, if its less than 4
412                        QString freeslice;
413                        tmp = lastslice;
414                        tmp = tmp.remove(0, tmp.size() - 1);
415                        int nextslicenum = tmp.toInt(&ok);
416                        if ( ok ) {
417                           if ( nextslicenum < 4) {
418                            nextslicenum++;
419                            slice = dev + "s" + tmp.setNum(nextslicenum);
420                            slabel = "Unused Space";
421                            qDebug() << "Found Slice:" << dev << slice << slabel << ssize;
422                            partition.clear();
423                            partition << "SLICE" << dev << slice << ssize << slabel;   
424                            drives.append(partition);
425                           }
426                        }
427                      }
428                    } // End of Free Space Check
429                }
430            }
431
432        }
433    }
434    return drives;
435}
436
437// Function which checks for our GUI package schema data, and sets found if its located
438QList<QStringList> Backend::getPackageData(bool &found, QString pkgset)
439{
440  if ( pkgset.isEmpty() )
441     pkgset="pcbsd";
442  QList<QStringList> metaPkgs;
443  found=false;
444  bool onDisk;
445  onDisk=true; 
446  QString tmp, mName, mDesc, mIcon, mParent, mDesktop, mPkgFileList;
447  QStringList package;
448
449  QProcess pcmp;
450  qDebug() << "Searching for meta-pkgs...";
451  pcmp.start(QString("pc-metapkgmanager"), QStringList() << "--pkgset" << pkgset << "list");
452  if (pcmp.waitForFinished()) {
453    while (pcmp.canReadLine()) {
454        tmp = pcmp.readLine().simplified();
455        if ( tmp.indexOf("Meta Package: ") == 0) {
456                mName = tmp.replace("Meta Package: ", "");
457                continue;
458        }
459        if ( tmp.indexOf("Description: ") == 0) {
460                mDesc = tmp.replace("Description: ", "");
461                continue;
462        }
463        if ( tmp.indexOf("Icon: ") == 0) {
464                mIcon = tmp.replace("Icon: ", "");
465                mPkgFileList = mIcon;
466                mPkgFileList.replace("pkg-icon.png", "ports-list");
467                continue;
468        }
469        if ( tmp.indexOf("Parent: ") == 0) {
470                mParent = tmp.replace("Parent: ", "");
471                continue;
472        }
473        if ( tmp.indexOf("Desktop: ") == 0) {
474                mDesktop = tmp.replace("Desktop: ", "");
475                continue;
476        }
477        if ( tmp.indexOf("Category Entry") == 0) {
478                // Now add this category to the string list
479                package.clear();
480                //qDebug() << "Found Category" << mName << mDesc << mIcon << mParent<< mDesktop << "CATEGORY";
481                package << mName << mDesc << mIcon << mParent << mDesktop << "CATEGORY";
482                metaPkgs.append(package);
483                mName=""; mDesc=""; mIcon=""; mParent=""; mDesktop=""; mPkgFileList="";
484        }
485
486        if ( tmp.indexOf("Required Packages:") == 0) {
487                // Now add this meta-pkg to the string list
488                package.clear();
489
490                // If this package is marked "dl-only" we won't show it
491                if ( ! QFile::exists("/usr/local/share/pcbsd/metaset/" + pkgset + "/" + mName + "/dl-only" ) ) {
492                  //qDebug() << "Found Package" << mName << mDesc << mIcon << mParent << mDesktop << "NO" << mPkgFileList;
493                  package << mName << mDesc << mIcon << mParent << mDesktop << "NO" << mPkgFileList;
494                  metaPkgs.append(package);
495                }
496                found = true;
497                mName=""; mDesc=""; mIcon=""; mParent=""; mDesktop=""; mPkgFileList="";
498        }
499    }
500  }
501
502  return metaPkgs;
503}
504
Note: See TracBrowser for help on using the repository browser.