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

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

Initial import of PC-BSD /current/ SVN repo

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