From e7960474d4cbe6fa1cd5004845d369628e3ba4da Mon Sep 17 00:00:00 2001 From: bill-auger Date: Fri, 28 Jun 2019 12:16:13 -0400 Subject: [PATCH 1/3] implement post log to paste server --- src/libcalamaresui/ViewManager.cpp | 105 ++++++++++++++++++++++++++--- 1 file changed, 96 insertions(+), 9 deletions(-) diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 16c38b1bc..18c0cbfb8 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -32,8 +32,10 @@ #include #include +#include #include #include +#include namespace Calamares { @@ -133,6 +135,8 @@ ViewManager::ViewManager( QObject* parent ) if (Calamares::Settings::instance()->disableCancel()) m_quit->setVisible( false ); + +onInstallationFailed("amessage","somedetails"); // TODO: remove this } @@ -189,6 +193,10 @@ ViewManager::insertViewStep( int before, ViewStep* step ) void ViewManager::onInstallationFailed( const QString& message, const QString& details ) { +bool shouldOfferWebPaste = true; // TODO: config var +QString ficheHost = "termbin.com"; // TODO: config var +quint16 fichePort = 9999; // TODO: config var + cError() << "Installation failed:"; cDebug() << "- message:" << message; cDebug() << "- details:" << details; @@ -196,21 +204,100 @@ ViewManager::onInstallationFailed( const QString& message, const QString& detail QString heading = Calamares::Settings::instance()->isSetupMode() ? tr( "Setup Failed" ) : tr( "Installation Failed" ); + QString pasteMsg = tr( "Would you like to paste the install log to the web?" ); + QString pasteUrlFmt = tr( "Install log posted to:\n%1" ); + QString pasteUrlTitle = tr( "Install Log Paste URL" ); + QString text = "

" + message + "

"; + if ( !details.isEmpty() ) + text += "

" + details + "

"; + if ( shouldOfferWebPaste ) + text += "

" + pasteMsg + "

"; + QMessageBox* msgBox = new QMessageBox(); msgBox->setIcon( QMessageBox::Critical ); msgBox->setWindowTitle( tr( "Error" ) ); msgBox->setText( "" + heading + "" ); - msgBox->setStandardButtons( QMessageBox::Close ); - msgBox->button( QMessageBox::Close )->setText( tr( "&Close" ) ); - - QString text = "

" + message + "

"; - if ( !details.isEmpty() ) - text += "

" + details + "

"; msgBox->setInformativeText( text ); - - connect( msgBox, &QMessageBox::buttonClicked, qApp, &QApplication::quit ); - cDebug() << "Calamares will quit when the dialog closes."; + if ( shouldOfferWebPaste ) + { + msgBox->setStandardButtons( QMessageBox::Yes | QMessageBox::No ); + msgBox->setDefaultButton( QMessageBox::No ); + msgBox->button( QMessageBox::Yes )->setText( tr( "&Yes" ) ); + msgBox->button( QMessageBox::No )->setText( tr( "&No" ) ); + } + else + { + msgBox->setStandardButtons( QMessageBox::Close ); + msgBox->setDefaultButton( QMessageBox::Close ); + msgBox->button( QMessageBox::Close )->setText( tr( "&Close" ) ); + } msgBox->show(); + + cDebug() << "Calamares will quit when the dialog closes."; + connect( msgBox, &QMessageBox::buttonClicked, + [msgBox, ficheHost, fichePort, pasteUrlFmt, pasteUrlTitle] ( QAbstractButton* button ) + { + if ( button->text() != tr( "&Yes" ) ) + QApplication::quit(); + else + { + QFile pasteSourceFile( Logger::logFile() ); + if ( !pasteSourceFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) + cError() << "Could not open log file"; + else + { + QByteArray pasteData; + while ( !pasteSourceFile.atEnd() ) + { + pasteData += pasteSourceFile.readLine(); + } + + QTcpSocket* socket = new QTcpSocket(msgBox); + socket->connectToHost( ficheHost, fichePort ); + + if ( !socket->waitForConnected() ) + cError() << "Could not connect to paste server"; + else + { + cDebug() << "Connected to paste server"; + + socket->write( pasteData ); + + if ( !socket->waitForBytesWritten() ) + cError() << "Could not write to paste server"; + else + { + cDebug() << "Paste data written to paste server"; + + if ( !socket->waitForReadyRead() ) + cError() << "No data from paste server"; + else + { + cDebug() << "Reading response from paste server"; + + char resp[1024]; + socket->readLine(resp, 1024); + socket->close(); + + QString pasteUrl = QString( resp ) ; + QString pasteUrlMsg = QString( pasteUrlFmt ).arg( pasteUrl ); + + cDebug() << pasteUrlMsg; + + QMessageBox* pasteUrlMsgBox = new QMessageBox(); + pasteUrlMsgBox->setIcon( QMessageBox::Critical ); + pasteUrlMsgBox->setWindowTitle( tr( pasteUrlTitle ) ); + pasteUrlMsgBox->setStandardButtons( QMessageBox::Close ); + pasteUrlMsgBox->setText( pasteUrlMsg ); + pasteUrlMsgBox->show(); + + connect( pasteUrlMsgBox, &QMessageBox::buttonClicked, qApp, &QApplication::quit ); + } + } + } + } + } + }); } From e096631c5436301270f0b7f19eefe0392b217772 Mon Sep 17 00:00:00 2001 From: bill-auger Date: Sun, 30 Jun 2019 06:13:22 -0400 Subject: [PATCH 2/3] squashme WIP upload log to paste server - refactor error checking --- src/libcalamaresui/ViewManager.cpp | 122 +++++++++++++++-------------- 1 file changed, 65 insertions(+), 57 deletions(-) diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 18c0cbfb8..0efc7080d 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -238,65 +238,73 @@ quint16 fichePort = 9999; // TODO: config var [msgBox, ficheHost, fichePort, pasteUrlFmt, pasteUrlTitle] ( QAbstractButton* button ) { if ( button->text() != tr( "&Yes" ) ) - QApplication::quit(); - else { - QFile pasteSourceFile( Logger::logFile() ); - if ( !pasteSourceFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) - cError() << "Could not open log file"; - else - { - QByteArray pasteData; - while ( !pasteSourceFile.atEnd() ) - { - pasteData += pasteSourceFile.readLine(); - } - - QTcpSocket* socket = new QTcpSocket(msgBox); - socket->connectToHost( ficheHost, fichePort ); - - if ( !socket->waitForConnected() ) - cError() << "Could not connect to paste server"; - else - { - cDebug() << "Connected to paste server"; - - socket->write( pasteData ); - - if ( !socket->waitForBytesWritten() ) - cError() << "Could not write to paste server"; - else - { - cDebug() << "Paste data written to paste server"; - - if ( !socket->waitForReadyRead() ) - cError() << "No data from paste server"; - else - { - cDebug() << "Reading response from paste server"; - - char resp[1024]; - socket->readLine(resp, 1024); - socket->close(); - - QString pasteUrl = QString( resp ) ; - QString pasteUrlMsg = QString( pasteUrlFmt ).arg( pasteUrl ); - - cDebug() << pasteUrlMsg; - - QMessageBox* pasteUrlMsgBox = new QMessageBox(); - pasteUrlMsgBox->setIcon( QMessageBox::Critical ); - pasteUrlMsgBox->setWindowTitle( tr( pasteUrlTitle ) ); - pasteUrlMsgBox->setStandardButtons( QMessageBox::Close ); - pasteUrlMsgBox->setText( pasteUrlMsg ); - pasteUrlMsgBox->show(); - - connect( pasteUrlMsgBox, &QMessageBox::buttonClicked, qApp, &QApplication::quit ); - } - } - } - } + QApplication::quit(); + return; } + + QFile pasteSourceFile( Logger::logFile() ); + if ( !pasteSourceFile.open( QIODevice::ReadOnly | QIODevice::Text ) ) + { + cError() << "Could not open log file"; + return; + } + + QByteArray pasteData; + while ( !pasteSourceFile.atEnd() ) + { + pasteData += pasteSourceFile.readLine(); + } + + QTcpSocket* socket = new QTcpSocket(msgBox); + socket->connectToHost( ficheHost, fichePort ); + + if ( !socket->waitForConnected() ) + { + cError() << "Could not connect to paste server"; + socket->close(); + return; + } + + cDebug() << "Connected to paste server"; + + socket->write( pasteData ); + + if ( !socket->waitForBytesWritten() ) + { + cError() << "Could not write to paste server"; + socket->close(); + return; + } + + cDebug() << "Paste data written to paste server"; + + if ( !socket->waitForReadyRead() ) + { + cError() << "No data from paste server"; + socket->close(); + return; + } + + cDebug() << "Reading response from paste server"; + + char resp[1024]; + socket->readLine(resp, 1024); + socket->close(); + + QString pasteUrl = QString( resp ) ; + QString pasteUrlMsg = QString( pasteUrlFmt ).arg( pasteUrl ); + + cDebug() << pasteUrlMsg; + + QMessageBox* pasteUrlMsgBox = new QMessageBox(); + pasteUrlMsgBox->setIcon( QMessageBox::Critical ); + pasteUrlMsgBox->setWindowTitle( pasteUrlTitle ); + pasteUrlMsgBox->setStandardButtons( QMessageBox::Close ); + pasteUrlMsgBox->setText( pasteUrlMsg ); + pasteUrlMsgBox->show(); + + connect( pasteUrlMsgBox, &QMessageBox::buttonClicked, qApp, &QApplication::quit ); }); } From c90d3b201690d5bb33b7dc842fcfaeb0fc122451 Mon Sep 17 00:00:00 2001 From: bill-auger Date: Sun, 30 Jun 2019 05:58:35 -0400 Subject: [PATCH 3/3] squashme WIP upload log to paste server - more error checks and validations --- src/libcalamaresui/ViewManager.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/libcalamaresui/ViewManager.cpp b/src/libcalamaresui/ViewManager.cpp index 0efc7080d..b0f2b00a8 100644 --- a/src/libcalamaresui/ViewManager.cpp +++ b/src/libcalamaresui/ViewManager.cpp @@ -35,7 +35,9 @@ #include #include #include +#include #include +#include namespace Calamares { @@ -288,12 +290,21 @@ quint16 fichePort = 9999; // TODO: config var cDebug() << "Reading response from paste server"; - char resp[1024]; - socket->readLine(resp, 1024); + char resp[1024]; resp[0] = '\0'; + qint64 nBytesRead = socket->readLine(resp, 1024); socket->close(); - QString pasteUrl = QString( resp ) ; - QString pasteUrlMsg = QString( pasteUrlFmt ).arg( pasteUrl ); + QUrl pasteUrl = QUrl( QString( resp ).trimmed(), QUrl::StrictMode ); + QString pasteUrlStr = pasteUrl.toString() ; + QRegularExpression pasteUrlRegex( "^http[s]?://" + ficheHost ); + QString pasteUrlMsg = QString( pasteUrlFmt ).arg( pasteUrlStr ); + + if ( nBytesRead < 8 || !pasteUrl.isValid() || + !pasteUrlRegex.match( pasteUrlStr ).hasMatch() ) + { + cError() << "No data from paste server"; + return; + } cDebug() << pasteUrlMsg;