source: src-qt4/pc-updategui/mainWin.cpp @ 1620346

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

Initial import of PC-BSD /current/ SVN repo

  • Property mode set to 100644
File size: 23.5 KB
Line 
1/****************************************************************************
2** ui.h extension file, included from the uic-generated form implementation.
3**
4** If you want to add, delete, or rename functions or slots, use
5** Qt Designer to update this file, preserving your code.
6**
7** You should not define a constructor or destructor in this file.
8** Instead, write your code in functions called init() and destroy().
9** These will automatically be called by the form's constructor and
10** destructor.
11*****************************************************************************/
12#include <fcntl.h>
13#include <QDateTime>
14#include <QDebug>
15#include <QDir>
16#include <QProcess>
17#include <QProgressDialog>
18#include <QSocketNotifier>
19#include <QString>
20#include <QTextStream>
21#include <pcbsd-utils.h>
22#include "mainWin.h"
23#include "../config.h"
24
25void mainWin::ProgramInit(QString ch, QString ip)
26{
27  // Set any warden directories
28  doingUpdate=false;
29  lastError="";
30  wDir = ch;
31  wIP = ip;
32  if ( ! wDir.isEmpty() )
33     setWindowTitle(tr("Updates for Jail:") + " " + wIP );
34
35  //Grab the username
36  //username = QString::fromLocal8Bit(getenv("LOGNAME"));
37  connect(buttonRescan, SIGNAL(clicked()), this, SLOT(slotRescanUpdates()));
38  connect(pushInstallUpdates, SIGNAL(clicked()), this, SLOT(slotInstallClicked()));
39  connect(pushUpdatePkgs, SIGNAL(clicked()), this, SLOT(slotUpdatePkgsClicked()));
40  connect(pushClose, SIGNAL(clicked()), this, SLOT(slotCloseClicked()));
41  connect(buttonRescanPkgs, SIGNAL(clicked()), this, SLOT(slotRescanPkgsClicked()));
42  connect(checkAll, SIGNAL(clicked()), this, SLOT(slotSelectAllClicked()));
43  connect(listViewUpdates, SIGNAL(itemClicked(QListWidgetItem *)),this,SLOT(slotListClicked()));
44  connect(listViewUpdates, SIGNAL(itemActivated(QListWidgetItem *)),this,SLOT(slotListClicked()));
45  connect(listViewUpdates, SIGNAL(itemChanged(QListWidgetItem *)),this,SLOT(slotListClicked()));
46  connect(listViewUpdates, SIGNAL(itemPressed(QListWidgetItem *)),this,SLOT(slotListClicked()));
47  connect(listViewUpdates, SIGNAL(itemDoubleClicked(QListWidgetItem *)),this,SLOT(slotListDoubleClicked(QListWidgetItem *)));
48  progressUpdate->setHidden(true);
49
50  QTimer::singleShot(100, this, SLOT(slotRescanUpdates() ) );
51  QTimer::singleShot(200, this, SLOT(slotRescanPkgsClicked() ) );
52}
53
54void mainWin::slotListDoubleClicked(QListWidgetItem *cItem)
55{
56  if ( listUpdates.at(listViewUpdates->row(cItem)).at(7).isEmpty() )
57     return;
58
59  QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
60  QString username = env.value( "LOGNAME" );
61
62
63  QString url = listUpdates.at(listViewUpdates->row(cItem)).at(7);
64  qDebug() << url;
65  system("su -m " + username.toLatin1() + " -c 'openwith " + url.toLatin1() + "' &"); 
66}
67
68//Check whether an update was selected to enable the button
69void mainWin::slotListClicked(){
70  bool found = false;
71
72  // Get the total number of updates
73  for (int z=0; z < listViewUpdates->count(); ++z)
74    if ( listViewUpdates->item(z)->checkState() == Qt::Checked )
75      found = true;
76
77  if(!found)
78    pushInstallUpdates->setEnabled(false);
79  else
80    pushInstallUpdates->setEnabled(true);
81}
82
83bool mainWin::sanityCheck()
84{
85  bool haveUP, haveMU;
86  int sa = 0;
87  haveUP = false;
88  haveMU = false;
89
90  for (int z=0; z < listViewUpdates->count(); ++z) {
91    if ( listViewUpdates->item(z)->checkState() == Qt::Checked ) {
92      if ( listUpdates.at(z).at(1) == "PACKAGE") {
93        haveUP = true;
94      }
95      if ( listUpdates.at(z).at(1) == "PATCH") {
96        haveUP = true;
97        if ( listUpdates.at(z).at(5) == "YES" ) 
98          sa++;
99      }
100      if ( listUpdates.at(z).at(1) == "SYSUPDATE") {
101        haveMU = true;
102      }
103    }
104  }
105
106  if ( (haveMU && haveUP ) || sa > 1 ) {
107    QMessageBox::warning(this, tr("Update Conflict"), tr("More than one stand-alone update has been selected! Please unselect all other updates and try again."));
108    return false;
109  }
110
111  return true;
112}
113
114void mainWin::doUpdates()
115{
116  // Set our UI elements
117  progressUpdate->setHidden(false);
118  tabUpdates->setEnabled(false);
119
120  curUpdate = -1;
121  curUpdateIndex = 0;
122  totUpdate = 0;
123
124  // Get the total number of updates
125  for (int z=0; z < listViewUpdates->count(); ++z)
126    if ( listViewUpdates->item(z)->checkState() == Qt::Checked )
127      totUpdate++;
128
129  // Start our loop processing updates
130  slotUpdateLoop();
131}
132
133void mainWin::slotUpdateLoop()
134{
135  QString tmp, tmp2, mUrl, PkgSet, Version, Arch;
136
137  // Check if the last update process finished
138  if ( curUpdate != -1 ) {
139    qDebug() << "Finished Update";
140    if ( uProc->exitStatus() != QProcess::NormalExit || uProc->exitCode() != 0)
141    {
142      // Read any remaining buffers
143      slotReadUpdateOutput();
144
145      // Warn user that this update failed
146      if ( lastError.isEmpty() )
147         QMessageBox::critical(this, tr("Update Failed!"), tr("Failed to install:") + listUpdates.at(curUpdate).at(0) + " " + tr("An unknown error occured!")); 
148      else
149         QMessageBox::critical(this, tr("Update Failed!"), tr("Failed to install:") + listUpdates.at(curUpdate).at(0) + " " + lastError); 
150    } else {
151      // If successfull system update download
152      if ( listUpdates.at(curUpdate).at(1) == "SYSUPDATE" )
153        QMessageBox::information(this, tr("Update Ready"), tr("Please reboot to start the update to PC-BSD version \"") + listUpdates.at(curUpdate).at(0) + "\". " + tr("This process may take a while, please do NOT interrupt the process.")); 
154    }
155
156    listViewUpdates->item(curUpdate)->setIcon(QIcon());
157    setWindowTitle(tr("Update Manager"));
158  }
159
160  // Start looking for the next update
161  for (int z=0; z < listViewUpdates->count(); ++z) {
162    if ( listViewUpdates->item(z)->checkState() == Qt::Checked && curUpdate < z ) 
163    {
164      dPackages = false;
165      uPackages = false;
166      curUpdate = z;
167      curUpdateIndex++;
168      progressUpdate->setHidden(false);
169      progressUpdate->setRange(0, 0);
170      tmp.setNum(curUpdateIndex);
171      tmp2.setNum(totUpdate);
172      setWindowTitle(tr("Updating:") + " " + listUpdates.at(z).at(0));
173
174      textLabel->setText(tr("Starting Update: %1 (%2 of %3)")
175                         .arg(listUpdates.at(z).at(0))
176                         .arg(tmp)
177                         .arg(tmp2));
178
179      // Get the icon
180      listViewUpdates->item(z)->setIcon(QIcon(":images/current-item.png"));
181
182      // Get the install tag
183      QString tag;
184      if ( listUpdates.at(z).at(1) == "SYSUPDATE" )
185        tag = listUpdates.at(z).at(4);
186      if ( listUpdates.at(z).at(1) == "PATCH" )
187        tag = listUpdates.at(z).at(3);
188
189      // Show tray that we are doing a download
190      QFile sysTrig( SYSTRIGGER );
191      if ( sysTrig.open( QIODevice::WriteOnly ) ) {
192        QTextStream streamTrig( &sysTrig );
193        streamTrig << "DOWNLOADING: ";
194      }
195
196      // Setup the upgrade process
197      uProc = new QProcess();
198      QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
199      env.insert("PCFETCHGUI", "YES");
200      uProc->setProcessEnvironment(env);
201      uProc->setProcessChannelMode(QProcess::MergedChannels);
202
203      // Connect the slots
204      connect( uProc, SIGNAL(readyReadStandardOutput()), this, SLOT(slotReadUpdateOutput()) );
205      connect( uProc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotUpdateLoop()) );
206
207      // If doing FreeBSD Update run freebsd-update cmd
208      if ( wDir.isEmpty() ) {
209         if ( listUpdates.at(z).at(1) == "FBSDUPDATE" ) {
210           uProc->start("freebsd-update", QStringList() << "install"); 
211         } else {
212           uProc->start("pc-updatemanager", QStringList() << "install" << tag ); 
213         }
214      } else {
215         // Doing a warden update in a chroot environment
216         if ( listUpdates.at(z).at(1) == "FBSDUPDATE" ) {
217           uProc->start("chroot", QStringList() << wDir << "freebsd-update" << "install"); 
218         } 
219      }
220      qDebug() << "Update started";
221      return;
222    }
223
224  }
225
226  // If we get here, no more updates to do
227  slotUpdateFinished();
228}
229
230void mainWin::slotReadUpdateOutput()
231{
232  QString line, cI, tI, tmp;
233  bool ok, ok2;
234  cI.setNum(curUpdateIndex);
235  tI.setNum(totUpdate);
236
237
238  while (uProc->canReadLine()) {
239    line = uProc->readLine().simplified();
240
241    if ( line.indexOf("FETCH:") == 0 ) {
242      tmp = line;
243      tmp = tmp.remove(0, tmp.lastIndexOf("/") + 1);
244      textLabel->setText(tr("Downloading: %1 (Update %2 of %3)")
245                         .arg(tmp)
246                         .arg(cI)
247                         .arg(tI));
248      continue;
249    }
250   
251    if ( line.indexOf("SIZE:") == 0 ) {
252      line.section(" ", 1,1).toInt(&ok);
253      line.section(" ", 3,3).toInt(&ok2);
254      if ( ok && ok2 ) {
255        progressUpdate->setRange(0, line.section(" ", 1,1).toInt(&ok));
256        progressUpdate->setValue(line.section(" ", 3,3).toInt(&ok));
257      }
258      continue;
259    }
260    if ( line.indexOf("FETCHDONE") == 0 ) {
261      progressUpdate->setRange(0, 0);
262      textLabel->setText(tr("Updating: %1 (%2 of %3)")
263                         .arg(listUpdates.at(curUpdate).at(0))
264                         .arg(cI)
265                         .arg(tI));
266      continue;
267    }
268
269    if ( line.indexOf("TOTALSTEPS:") == 0 ) {
270      line.section(" ", 1,1).toInt(&ok);
271      if ( ok )
272        progressUpdate->setRange(0, line.section(" ", 1, 1).toInt(&ok));
273      continue;
274    }
275    if ( line.indexOf("SETSTEPS:") == 0 ) {
276      line.section(" ", 1,1).toInt(&ok);
277      if ( ok )
278        progressUpdate->setValue(line.section(" ", 1, 1).toInt(&ok));
279      continue;
280    }
281    if ( line.indexOf("ERROR:") == 0 ) {
282       lastError = line;
283       continue; 
284    }
285    qDebug() << line;
286  }
287}
288
289void mainWin::slotUpdateFinished()
290{
291  qDebug() << "Updates all Finished";
292  QFile sysTrig( SYSTRIGGER );
293  if ( sysTrig.open( QIODevice::WriteOnly ) ) {
294    QTextStream streamTrig( &sysTrig );
295     streamTrig << "INSTALLFINISHED: ";
296  }
297  sysTrig.close();
298
299  progressUpdate->setHidden(true);
300  slotRescanUpdates();
301}
302
303void mainWin::slotInstallClicked()
304{
305  // Sanity check our install choices
306  if (!sanityCheck())
307    return;
308
309  // Start the installation
310  doUpdates();
311}
312
313void mainWin::slotSelectAllClicked()
314{
315  for (int z=0; z < listViewUpdates->count(); ++z) {
316    listViewUpdates->item(z)->setCheckState(checkAll->checkState());   
317  }
318
319  slotListClicked();
320}
321
322void mainWin::slotRescanUpdates()
323{
324  if ( doingUpdate )
325     return;
326  groupUpdates->setEnabled(false);
327  listUpdates.clear();
328  textLabel->setText(tr("Checking for updates... Please Wait..."));
329  slotReadUpdateData();
330  slotDisplayUpdates();
331  qDebug() << listUpdates;
332  //disable the "select all" checkbox if no updates available
333  if(listUpdates.isEmpty() ){
334    checkAll->setEnabled(false);
335  }
336  pushInstallUpdates->setEnabled(false); //disable the button until an update is selected
337  if ( ! doingUpdate )
338    groupUpdates->setEnabled(true);
339}
340
341void mainWin::slotDisplayUpdates()
342{
343  if ( ! doingUpdate )
344    tabUpdates->setEnabled(true);
345  listViewUpdates->clear();
346
347  // Check if the system has an upgrade available
348  if ( QFile::exists("/usr/local/tmp/update-stagedir/doupdate.sh") ) {
349    textLabel->setText(tr("A system upgrade is waiting to be installed. Please reboot to begin!"));
350    return;
351  }
352
353
354  // Any system updates?
355  if ( listUpdates.isEmpty() ) {
356    if ( ! pushUpdatePkgs->isEnabled() ) {
357      textLabel->setText(tr("Your system is fully updated!"));
358      tabUpdates->setTabText(0, tr("System Updates"));
359    } else {
360      textLabel->setText(tr("Package updates available!"));
361    }
362    groupUpdates->setTitle("");
363    return;
364  }
365
366  textLabel->setText(tr("System updates available!"));
367  groupUpdates->setTitle(tr("Available Updates"));
368  tabUpdates->setCurrentIndex(0);
369  tabUpdates->setTabText(0, tr("System Updates (%1)").arg(listUpdates.count()));
370
371  // Start parsing the updates and list whats available
372  for (int z=0; z < listUpdates.count(); ++z) {
373    if ( listUpdates.at(z).at(1) == "SYSUPDATE" ) {
374      QListWidgetItem *item = new QListWidgetItem(tr("System Upgrade: %1 (%2)")
375                                                  .arg(listUpdates.at(z).at(2))
376                                                  .arg(listUpdates.at(z).at(3)));
377      item->setToolTip(tr("PC-BSD Version:") + "<br>" + listUpdates.at(z).at(2) + "<hr>" + tr("This update must be installed by itself.") + "<br>" + tr("Creating a backup of your data first is recommended."));
378      item->setCheckState(Qt::Unchecked);
379      listViewUpdates->addItem(item);
380    }
381    if ( listUpdates.at(z).at(1) == "PATCH" ) {
382      QListWidgetItem *item = new QListWidgetItem(tr("Patch: %1 (%2)")
383                                                  .arg(listUpdates.at(z).at(0))
384                                                  .arg(listUpdates.at(z).at(2)));
385      item->setCheckState(Qt::Unchecked);
386      item->setToolTip(tr("This is a patch for your version of PC-BSD") + "<hr>" + tr("Patch Size:") + " " + listUpdates.at(z).at(4) + "MB<br>");
387      listViewUpdates->addItem(item);
388    }
389
390    if ( listUpdates.at(z).at(1) == "FBSDUPDATE" ) {
391      QString fileNameList;
392      for (int p=2; p < listUpdates.at(z).count(); p++)
393        fileNameList += listUpdates.at(z).at(p) + "<br>";
394
395      QListWidgetItem *item = new QListWidgetItem(tr("FreeBSD Security Update"));
396      item->setCheckState(Qt::Unchecked);
397      item->setToolTip(tr("The following files need updating:") + "<hr>" + fileNameList);
398     
399      listViewUpdates->addItem(item);
400    }
401
402    if ( listUpdates.at(z).at(1) == "PACKAGE" ) {
403      QString pkgNameList;
404      for (int p=2; p < listUpdates.at(z).count(); p=p+5) {
405        if ( listUpdates.at(z).count() < p + 4 ) 
406          break;
407
408        pkgNameList += listUpdates.at(z).at((p)) + " " + listUpdates.at(z).at((p+1)) + " -> " + listUpdates.at(z).at((p+2)) + "<br>";
409      }
410      QListWidgetItem *item = new QListWidgetItem(tr("System Package Updates"));
411      item->setCheckState(Qt::Unchecked);
412      item->setToolTip(tr("The following package updates are available:") + "<hr>" + pkgNameList);
413     
414      listViewUpdates->addItem(item);
415    }
416  }
417}
418
419void mainWin::slotRescanPkgsClicked()
420{
421  // Check for pkg updates
422  checkMPKGUpdates();
423}
424
425void mainWin::slotReadUpdateData()
426{
427  // If on the base system, check for PC-BSD updates
428  if ( wDir.isEmpty() )
429    checkPCUpdates();
430
431  // Check for FreeBSD Updates now
432  checkFBSDUpdates();
433
434}
435
436void mainWin::checkPCUpdates() {
437
438  QString line, tmp, name, type, version, date, tag, url, size, sa, rr;
439  QStringList up, listPkgs;
440
441  QProcess p;
442  p.start(QString("pc-updatemanager"), QStringList() << "check");
443  while(p.state() == QProcess::Starting || p.state() == QProcess::Running)
444     QCoreApplication::processEvents();
445
446  while (p.canReadLine()) {
447    line = p.readLine().simplified();
448    if ( line.indexOf("NAME: ") == 0) {
449       name = line.replace("NAME: ", "");
450       continue;
451    }
452    if ( line.indexOf("TYPE: ") == 0) {
453       type = line.replace("TYPE: ", "");
454       continue;
455    }
456
457    if ( type == "SYSUPDATE" ) {
458      if ( line.indexOf("VERSION: ") == 0) {
459         version = line.replace("VERSION: ", "");
460         continue;
461      }
462      if ( line.indexOf("DATE: ") == 0) {
463         date = line.replace("DATE: ", "");
464         continue;
465      }
466      if ( line.indexOf("TAG: ") == 0) {
467         tag = line.replace("TAG: ", "");
468         continue;
469      }
470      if ( line.indexOf("DETAILS: ") == 0) {
471         url = line.replace("DETAILS: ", "");
472         continue;
473      }
474
475      if ( line.indexOf("To install:") == 0) {
476         up.clear();
477         up << name << type << version << date << tag << url;
478         listUpdates.append(up);
479         type=""; name="", version="", date="", tag="", url="";
480         continue;
481      }
482
483    }
484    if ( type == "PATCH" ) {
485      if ( line.indexOf("DATE: ") == 0) {
486         date = line.replace("DATE: ", "");
487         continue;
488      }
489      if ( line.indexOf("TAG: ") == 0) {
490         tag = line.replace("TAG: ", "");
491         continue;
492      }
493      if ( line.indexOf("SIZE: ") == 0) {
494         size = line.replace("SIZE: ", "");
495         continue;
496      }
497      if ( line.indexOf("STANDALONE: ") == 0) {
498         sa = line.replace("STANDALONE: ", "");
499         continue;
500      }
501      if ( line.indexOf("REQUIRESREBOOT: ") == 0) {
502         rr = line.replace("REQUIRESREBOOT: ", "");
503         continue;
504      }
505      if ( line.indexOf("DETAILS: ") == 0) {
506         url = line.replace("DETAILS: ", "");
507         continue;
508      }
509      if ( line.indexOf("To install:") == 0) {
510         // TODO add this update to list
511         up.clear();
512         up << name << type << date << tag << size << sa << rr << url;
513         listUpdates.append(up);
514         type=""; name="", date="", tag="", size="", sa="", rr="", url="";
515         continue;
516      }
517    }
518
519  }
520
521
522}
523
524void mainWin::checkMPKGUpdates() {
525  if ( doingUpdate )
526     return;
527
528  QString line, tmp, name, pkgname, pkgover, pkgnver;
529  QStringList up, listPkgs;
530  bool haveUpdates = false;
531  int totPkgs=0;
532  buttonRescanPkgs->setEnabled(false);
533  pushUpdatePkgs->setEnabled(false);
534  listViewUpdatesPkgs->clear();
535  groupUpdatesPkgs->setTitle(tr("Checking for updates"));
536
537  QProcess p;
538  if ( wDir.isEmpty() )
539     p.start(QString("pc-updatemanager"), QStringList() << "pkgcheck");
540  else
541     p.start(QString("chroot"), QStringList() << wDir << "pc-updatemanager" << "pkgcheck");
542  while(p.state() == QProcess::Starting || p.state() == QProcess::Running)
543     QCoreApplication::processEvents();
544
545  while (p.canReadLine()) {
546    line = p.readLine().simplified();
547    qDebug() << line;
548    if ( line.indexOf("Upgrading") != 0) {
549       continue;
550    }
551    tmp = line;
552    pkgname = tmp.section(" ", 1, 1);
553    pkgname.replace(":", "");
554    pkgover = tmp.section(" ", 2, 2);
555    pkgnver = tmp.section(" ", 4, 4);
556    QTreeWidgetItem *myItem = new QTreeWidgetItem(QStringList() << pkgname << pkgover << pkgnver);
557    listViewUpdatesPkgs->addTopLevelItem(myItem);
558    haveUpdates = true;
559    totPkgs++;
560  }
561
562  buttonRescanPkgs->setEnabled(true);
563  pushUpdatePkgs->setEnabled(haveUpdates);
564  if ( totPkgs > 0 ) {
565    if ( listUpdates.isEmpty() )
566      tabUpdates->setCurrentIndex(1);
567    tabUpdates->setTabText(1, tr("Package Updates (%1)").arg(totPkgs));
568    groupUpdatesPkgs->setTitle(tr("Available updates"));
569  } else {
570    tabUpdates->setTabText(1, tr("Package Updates"));
571    groupUpdatesPkgs->setTitle(tr("No available updates"));
572  }
573 
574  slotDisplayUpdates();
575}
576
577
578void mainWin::checkFBSDUpdates() {
579  QString line;
580  QStringList up, listPkgs;
581
582  // Now check if there are freebsd-updates to install
583  QProcess f;
584  if ( wDir.isEmpty() )
585     f.start(QString("pc-fbsdupdatecheck"), QStringList());
586  else {
587     QProcess::execute("cp /usr/local/bin/pc-fbsdupdatecheck " + wDir + "/tmp/.fbupdatechk");
588     QProcess::execute("chmod 755 " + wDir + "/tmp/.fbupdatechk");
589     f.start(QString("chroot"), QStringList() << wDir << "/tmp/.fbupdatechk" << "fetch" );
590  }
591  while(f.state() == QProcess::Starting || f.state() == QProcess::Running)
592     QCoreApplication::processEvents();
593
594  bool fUp = false;
595 
596  while (f.canReadLine()) {
597    line = f.readLine().simplified();
598    qDebug() << line;
599    if ( line.indexOf("The following files will be updated ") == 0) {
600       fUp = true;
601       listPkgs.clear();
602       continue;
603    }
604
605    if ( fUp )
606       listPkgs << line;
607  }
608
609  if ( ! wDir.isEmpty() )
610     QProcess::execute("rm " + wDir + "/tmp/.fbupdatechk");
611
612  // Are there freebsd updates to install?
613  if ( fUp ) {
614    up.clear();
615    up << "FreeBSD Security Updates" << "FBSDUPDATE";
616    up.append(listPkgs);
617    listUpdates.append(up);
618  }
619
620}
621
622void mainWin::slotSingleInstance() {
623   this->hide();
624   this->showNormal();
625   this->activateWindow();
626   this->raise();
627}
628
629void mainWin::slotCloseClicked() {
630   close();
631}
632
633void mainWin::slotUpdatePkgsClicked() {
634  // Set our UI elements
635  progressUpdate->setHidden(false);
636  tabUpdates->setEnabled(false);
637
638  dPackages = false;
639  uPackages = false;
640  doingUpdate=true;
641  curUpdate = 0;
642
643  // Setup the upgrade process
644  uProc = new QProcess();
645  QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
646  env.insert("PCFETCHGUI", "YES");
647  uProc->setProcessEnvironment(env);
648  uProc->setProcessChannelMode(QProcess::MergedChannels);
649
650  // Connect the slots
651  connect( uProc, SIGNAL(readyReadStandardOutput()), this, SLOT(slotReadPkgUpdateOutput()) );
652  connect( uProc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotUpdatePkgDone()) );
653
654  if ( wDir.isEmpty() )
655    uProc->start("pc-updatemanager", QStringList() << "pkgupdate");
656  else
657    uProc->start("chroot", QStringList() << wDir << "pc-updatemanager" << "pkgupdate");
658
659  textLabel->setText(tr("Starting package updates..."));
660
661  progressUpdate->setRange(0, listViewUpdatesPkgs->topLevelItemCount() );
662  progressUpdate->setValue(0);
663}
664
665void mainWin::slotReadPkgUpdateOutput() {
666   QString line, tmp, cur, tot, fname;
667
668   while (uProc->canReadLine()) {
669     line = uProc->readLine().simplified();
670     qDebug() << "Normal Line:" << line;
671     tmp = line;
672     tmp.truncate(50);
673     if ( line.indexOf("to be downloaded") != -1 ) {
674       textLabel->setText(tr("Downloading packages..."));
675       curUpdate = 0;
676       progressUpdate->setValue(0);
677       continue;
678     }
679     if ( line.indexOf("Checking integrity") == 0 ) {
680       textLabel->setText(line);
681       uPackages = true;
682       dPackages = false;
683       curUpdate = 0;
684       progressUpdate->setValue(0);
685     }
686     if ( line.indexOf("FETCH: ") == 0 ) { 
687        progressUpdate->setValue(progressUpdate->value() + 1); 
688        tmp = line; 
689        tmp = tmp.remove(0, tmp.lastIndexOf("/") + 1); 
690        textLabel->setText(tr("Downloading: %1").arg(tmp)); 
691        continue;
692     } 
693     
694     if ( line.indexOf("SIZE: ") == 0 ) {
695          bool ok, ok2;
696          line.replace("SIZE: ", "");
697          line.replace("DOWNLOADED: ", "");
698          line.replace("SPEED: ", "");
699          line.section(" ", 0, 0).toInt(&ok);
700          line.section(" ", 1, 1).toInt(&ok2);
701   
702          if ( ok && ok2 ) {
703            QString unit;
704            int tot = line.section(" ", 0, 0).toInt(&ok);
705            int cur = line.section(" ", 1, 1).toInt(&ok2);
706            QString percent = QString::number( (float)(cur * 100)/tot );
707            QString speed = line.section(" ", 2, 3);
708
709            // Get the MB downloaded / total
710            if ( tot > 2048 ) {
711              unit="MB";
712              tot = tot / 1024;
713              cur = cur / 1024;
714            } else {
715              unit="KB";
716            }
717
718            QString ProgressString=QString("%1" + unit + " of %2" + unit + " at %3").arg(cur).arg(tot).arg(speed);
719            progressUpdate->setRange(0, tot);
720            progressUpdate->setValue(cur);
721         }
722     }
723
724     if ( uPackages ) {
725       if ( line.indexOf("Upgrading") == 0 ) {
726         textLabel->setText(line);
727         curUpdate++;
728         progressUpdate->setValue(curUpdate);
729       }
730       continue;
731     }
732
733   } // end of while
734}
735
736// Function to read output of pipefile
737void mainWin::slotReadEventPipe(int fd) {
738  QString tmp, fname, cur, tot;
739  bool ok, ok2;
740  char buff[4028];
741  int totread = read(fd, buff, 4020);
742  buff[totread]='\0';
743  QString line = buff;
744  line = line.simplified();
745  //qDebug() << "Found line:" << line;
746 
747  if ( line.indexOf("INFO_FETCH") != -1  && dPackages ) {
748     tmp = line;
749     fname = tmp.section(":", 4, 4);
750     fname.remove(0, fname.lastIndexOf('/') + 1);
751     fname  = fname.section('"', 0, 0);
752     cur = tmp.section(":", 5, 5);
753     cur = cur.remove(',');
754     cur = cur.section(" ", 1, 1);
755     cur = cur.simplified();
756     tot = tmp.section(":", 6, 6);
757     tot = tot.simplified();
758     tot = tot.remove(',');
759     tot = tot.section("}", 0, 0);
760
761     textLabel->setText(tr("Downloading %1").arg(fname));
762     tot.toInt(&ok);
763     cur.toInt(&ok2);
764     if ( ok && ok2 )
765     { 
766       progressUpdate->setRange(0, tot.toInt(&ok2));
767       progressUpdate->setValue(cur.toInt(&ok2));
768     }
769     
770     //qDebug() << "File:" << fname << "cur" << cur << "tot" << tot;
771  }
772}
773
774void mainWin::slotUpdatePkgDone() {
775  progressUpdate->setHidden(true);
776  QFile sysTrig( SYSTRIGGER );
777  if ( sysTrig.open( QIODevice::WriteOnly ) ) {
778    QTextStream streamTrig( &sysTrig );
779     streamTrig << "INSTALLFINISHED: ";
780  }
781
782  if ( uProc->exitCode() != 0 )
783    QMessageBox::warning(this, tr("Failed package update"), tr("The package update failed! If this persists, you may need to manually run: pc-updatemanager pkgupdate"));
784
785  doingUpdate=false;
786  checkMPKGUpdates();
787}
Note: See TracBrowser for help on using the repository browser.