source: src-qt4/pc-installgui/backend.cpp @ 027bbae

9.2-releasereleng/10.0releng/10.0.1releng/10.0.2
Last change on this file since 027bbae was 027bbae, checked in by Kris Moore <kris@…>, 15 months ago

Setup pc-installgui to switch between the default pc-sysinstall and a debug copy, if it exists

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