source: src-qt4/pc-installgui/backend.cpp @ 688b57d

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

Add support to detect users time-zone as well as location

  • Property mode set to 100644
File size: 14.6 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    code = code.section(" ", 0, 0);
247    qDebug() << "Found Country Code:" << code;
248    return code;
249}
250
251
252QStringList Backend::networkDevices()
253{
254    QStringList nics;
255
256    Process p(QStringList() << "detect-nics");
257
258    if (p.waitForFinished()) {
259        while (p.canReadLine()) {
260            nics.append(p.readLine().simplified());
261        }
262    }
263    qDebug() << "Found Nics:" << nics;
264    return nics;
265}
266
267// Function which lets us run setxkbmap
268void Backend::changeKbMap(QString model, QString layout, QString variant)
269{
270   QProcess kbp;
271   QStringList args;
272   QString prog;
273   prog = "setxkbmap"; 
274   args << "-model" << model << "-layout" << layout << "-variant" << variant;
275   qDebug() << "setxkbmap:" << args;
276   kbp.start(prog, args);
277   kbp.waitForFinished();
278}
279
280QList<QStringList> Backend::availComponents()
281{
282   QList<QStringList> components;
283   QStringList singleComponent;
284
285   QString tmp, name, desc, icon, type, line;
286   QString selected = "off";
287
288   Process p(QStringList() << "list-components");
289
290   if (p.waitForFinished()) {
291       while (p.canReadLine()) {
292          line = p.readLine();
293          line = line.simplified();
294          if ( line.indexOf("name:") != -1 )
295            name = line.remove(0, line.indexOf(": ") + 2); 
296          if ( line.indexOf("desc:") != -1 )
297            desc = line.remove(0, line.indexOf(": ") + 2); 
298          if ( line.indexOf("type:") != -1 )
299            type = line.remove(0, line.indexOf(": ") + 2); 
300          if ( line.indexOf("icon:") != -1 ) {
301            icon = line.remove(0, line.indexOf(": ") + 2); 
302            singleComponent << name << desc << icon << type << selected;
303            components << singleComponent;
304            qDebug() << "Found Component:" << singleComponent;
305            singleComponent.clear();
306          }
307       }
308   }
309
310   return components;
311}
312
313QList<QStringList> Backend::hardDrives()
314{
315    QList<QStringList> drives;
316    QStringList drive; //its a "list" so as to also append drive information
317    QStringList partition; //its a "list" so as to also append drive information
318
319    QString size, devinfo, type;
320    QString line, info;
321    QString tmp, dev, lastslice, slice, slabel, ssize;
322    bool ok;
323
324    Process p(QStringList() << "disk-list");
325
326    if (p.waitForFinished()) {
327        while (p.canReadLine()) {
328            line = p.readLine();
329            if ( line.isEmpty() ) 
330               continue;
331            dev = line.simplified();
332            dev.truncate(line.indexOf(":"));
333
334            tmp = line.simplified().remove(0, line.indexOf(":") + 1);
335            devinfo = tmp;
336
337            // Get the disk information for this dev
338            Process pp(QStringList() << "disk-info" << dev);
339            if (pp.waitForFinished()) {
340                while (pp.canReadLine()) {
341                    info = pp.readLine().simplified();
342                    if (info.indexOf("size=") == 0) size = info.replace("size=", "");
343                    if (info.indexOf("type=") == 0) type = info.replace("type=", "");
344                }
345            }
346
347            // Pad the disk size a bit
348            size.toInt(&ok);
349            if ( !ok)
350                continue;
351            //size.setNum(size.toInt(&ok) - 100);
352
353            // Add this info to our list
354            qDebug() << "Found Drive:" << dev << size << devinfo << type;
355            drive.clear();
356            drive << "DRIVE" << dev << size << devinfo << type;
357            drives.append(drive);
358
359            // Init lastslize in case this disk is completely empty
360            lastslice = "s0";
361
362            // Get the slice information for this disk
363            Process ppp(QStringList() << "disk-part" << dev);
364            if (ppp.waitForFinished()) {
365                while (ppp.canReadLine()) {
366                    info = ppp.readLine().simplified();
367                    // Get the slice we are working on
368                    if ( info.indexOf(dev + "s") == 0 || info.indexOf(dev + "p") == 0 ) {
369                      slice = info;
370                      slice.truncate(slice.indexOf("-"));
371                    } else {
372                      slice = "";
373                    }
374                     
375                    if (info.indexOf(slice + "-label: ") == 0) slabel = info.replace(slice + "-label: ", "");
376
377                    // Check if we've found the format flag
378                    if (info.indexOf(dev + "-format: ") == 0) {
379                      QString format = info.replace(dev + "-format: ", "");
380                      qDebug() << "Found Disk Format: " <<  dev << " - " << format;
381                      partition.clear();
382                      partition << "FORMAT" << dev << format;
383                      drives.append(partition);
384                    }
385
386                    // Check if we've found the new slice
387                    if (info.indexOf(slice + "-sizemb: ") == 0) {
388                      ssize = info.replace(slice + "-sizemb: ", "");
389                      // Make sure we have a number
390                      ssize.toInt(&ok);
391                      if (!ok)
392                        continue;
393
394                      // Pad the slice by 5MB
395                      //ssize.setNum(ssize.toInt(&ok) - 5);
396                       
397                      qDebug() << "Found Slice:" << dev << slice << slabel << ssize;
398                      partition.clear();
399                      partition << "SLICE" << dev << slice << ssize << slabel;   
400                      drives.append(partition);
401                      lastslice = slice;
402                    }
403
404                    // Check if we've found some free disk space
405                    if (info.indexOf(dev + "-freemb: ") == 0) {
406                      bool ok;
407                      int checkSize;
408                      ssize = info.replace(dev + "-freemb: ", "");
409                      checkSize = ssize.toInt(&ok); 
410                      if ( ok && checkSize > 100 )
411                      {
412                        // Figure out the next slice number, if its less than 4
413                        QString freeslice;
414                        tmp = lastslice;
415                        tmp = tmp.remove(0, tmp.size() - 1);
416                        int nextslicenum = tmp.toInt(&ok);
417                        if ( ok ) {
418                           if ( nextslicenum < 4) {
419                            nextslicenum++;
420                            slice = dev + "s" + tmp.setNum(nextslicenum);
421                            slabel = "Unused Space";
422                            qDebug() << "Found Slice:" << dev << slice << slabel << ssize;
423                            partition.clear();
424                            partition << "SLICE" << dev << slice << ssize << slabel;   
425                            drives.append(partition);
426                           }
427                        }
428                      }
429                    } // End of Free Space Check
430                }
431            }
432
433        }
434    }
435    return drives;
436}
437
438// Function which checks for our GUI package schema data, and sets found if its located
439QList<QStringList> Backend::getPackageData(bool &found, QString pkgset)
440{
441  if ( pkgset.isEmpty() )
442     pkgset="pcbsd";
443  QList<QStringList> metaPkgs;
444  found=false;
445  bool onDisk;
446  onDisk=true; 
447  QString tmp, mName, mDesc, mIcon, mParent, mDesktop, mPkgFileList;
448  QStringList package;
449
450  QProcess pcmp;
451  qDebug() << "Searching for meta-pkgs...";
452  pcmp.start(QString("pc-metapkgmanager"), QStringList() << "--pkgset" << pkgset << "list");
453  if (pcmp.waitForFinished()) {
454    while (pcmp.canReadLine()) {
455        tmp = pcmp.readLine().simplified();
456        if ( tmp.indexOf("Meta Package: ") == 0) {
457                mName = tmp.replace("Meta Package: ", "");
458                continue;
459        }
460        if ( tmp.indexOf("Description: ") == 0) {
461                mDesc = tmp.replace("Description: ", "");
462                continue;
463        }
464        if ( tmp.indexOf("Icon: ") == 0) {
465                mIcon = tmp.replace("Icon: ", "");
466                mPkgFileList = mIcon;
467                mPkgFileList.replace("pkg-icon.png", "ports-list");
468                continue;
469        }
470        if ( tmp.indexOf("Parent: ") == 0) {
471                mParent = tmp.replace("Parent: ", "");
472                continue;
473        }
474        if ( tmp.indexOf("Desktop: ") == 0) {
475                mDesktop = tmp.replace("Desktop: ", "");
476                continue;
477        }
478        if ( tmp.indexOf("Category Entry") == 0) {
479                // Now add this category to the string list
480                package.clear();
481                //qDebug() << "Found Category" << mName << mDesc << mIcon << mParent<< mDesktop << "CATEGORY";
482                package << mName << mDesc << mIcon << mParent << mDesktop << "CATEGORY";
483                metaPkgs.append(package);
484                mName=""; mDesc=""; mIcon=""; mParent=""; mDesktop=""; mPkgFileList="";
485        }
486
487        if ( tmp.indexOf("Required Packages:") == 0) {
488                // Now add this meta-pkg to the string list
489                package.clear();
490
491                // If this package is marked "dl-only" we won't show it
492                if ( ! QFile::exists("/usr/local/share/pcbsd/metaset/" + pkgset + "/" + mName + "/dl-only" ) ) {
493                  //qDebug() << "Found Package" << mName << mDesc << mIcon << mParent << mDesktop << "NO" << mPkgFileList;
494                  package << mName << mDesc << mIcon << mParent << mDesktop << "NO" << mPkgFileList;
495                  metaPkgs.append(package);
496                }
497                found = true;
498                mName=""; mDesc=""; mIcon=""; mParent=""; mDesktop=""; mPkgFileList="";
499        }
500    }
501  }
502
503  return metaPkgs;
504}
505
Note: See TracBrowser for help on using the repository browser.