source: src-qt4/pc-firstbootgui/backend.cpp @ 5a1d1a0

9.2-releasereleng/10.0releng/10.0.1
Last change on this file since 5a1d1a0 was 5a1d1a0, checked in by Kris Moore <kris@…>, 6 months ago

On first-boot wizard, add ability to detect users timezone if internet
is connected

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