LinuxDevice: Fix error reporting from shared connection

If the master ssh connection can't start, e.g. because
no public key was uploaded to the remote device, report the
standard error of master process as error string.

Fix the "if" condition in handleDisconnected().

Change-Id: I9ba821136a1755d3460e47ce6f25d3684445890f
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Jarek Kobus
2022-05-03 23:38:14 +02:00
parent 4a3c4dec09
commit 70e8e1b530

View File

@@ -116,7 +116,7 @@ private:
void emitConnected(); void emitConnected();
void emitError(QProcess::ProcessError processError, const QString &errorString); void emitError(QProcess::ProcessError processError, const QString &errorString);
void emitDisconnected(); void emitDisconnected();
QString fullProcessError(const QString &sshErrorPrefix); QString fullProcessError() const;
QStringList connectionArgs(const FilePath &binary) const QStringList connectionArgs(const FilePath &binary) const
{ return connectionOptions(binary) << m_sshParameters.host(); } { return connectionOptions(binary) << m_sshParameters.host(); }
@@ -199,16 +199,17 @@ void SshSharedConnection::connectToHost()
// TODO: in case of refused connection we are getting the following on stdErr: // TODO: in case of refused connection we are getting the following on stdErr:
// ssh: connect to host 127.0.0.1 port 22: Connection refused\r\n // ssh: connect to host 127.0.0.1 port 22: Connection refused\r\n
connect(m_masterProcess.get(), &QtcProcess::done, [this] { connect(m_masterProcess.get(), &QtcProcess::done, [this] {
const QProcess::ProcessError error = m_masterProcess->error(); const ProcessResult result = m_masterProcess->result();
if (error == QProcess::FailedToStart) { const ProcessResultData resultData = m_masterProcess->resultData();
emitError(error, fullProcessError(tr("Cannot establish SSH connection. " if (result == ProcessResult::StartFailed) {
"Control process failed to start:"))); emitError(QProcess::FailedToStart, tr("Cannot establish SSH connection.\n"
"Control process failed to start."));
return; return;
} else if (error != QProcess::UnknownError) { } else if (result == ProcessResult::FinishedWithError) {
emitError(error, fullProcessError(tr("SSH connection failure:"))); emitError(resultData.m_error, fullProcessError());
return; return;
} }
emit disconnected(m_masterProcess->resultData()); emit disconnected(resultData);
}); });
QStringList args = QStringList{"-M", "-N", "-o", "ControlPersist=no", QStringList args = QStringList{"-M", "-N", "-o", "ControlPersist=no",
@@ -247,7 +248,10 @@ void SshSharedConnection::emitConnected()
void SshSharedConnection::emitError(QProcess::ProcessError error, const QString &errorString) void SshSharedConnection::emitError(QProcess::ProcessError error, const QString &errorString)
{ {
m_state = QProcess::NotRunning; m_state = QProcess::NotRunning;
emit disconnected({ 0, QProcess::NormalExit, error, errorString }); ProcessResultData resultData = m_masterProcess->resultData();
resultData.m_error = error;
resultData.m_errorString = errorString;
emit disconnected(resultData);
} }
void SshSharedConnection::emitDisconnected() void SshSharedConnection::emitDisconnected()
@@ -256,23 +260,16 @@ void SshSharedConnection::emitDisconnected()
emit disconnected(m_masterProcess->resultData()); emit disconnected(m_masterProcess->resultData());
} }
QString SshSharedConnection::fullProcessError(const QString &sshErrorPrefix) QString SshSharedConnection::fullProcessError() const
{ {
QString error; const QString errorString = m_masterProcess->exitStatus() == QProcess::CrashExit
if (m_masterProcess->exitStatus() != QProcess::NormalExit) ? m_masterProcess->errorString() : QString();
error = m_masterProcess->errorString(); const QString standardError = m_masterProcess->stdErr();
const QByteArray stdErr = m_masterProcess->readAllStandardError(); const QString errorPrefix = errorString.isEmpty() && standardError.isEmpty()
if (!stdErr.isEmpty()) { ? tr("SSH connection failure.") : tr("SSH connection failure:");
if (!error.isEmpty()) QStringList allErrors {errorPrefix, errorString, standardError};
error.append('\n'); allErrors.removeAll({});
error.append(QString::fromLocal8Bit(stdErr)); return allErrors.join('\n');
}
QString fullError = sshErrorPrefix;
if (!error.isEmpty())
fullError.append('\n').append(error);
return fullError;
} }
// SshConnectionHandle // SshConnectionHandle
@@ -717,7 +714,7 @@ void SshProcessInterfacePrivate::handleDisconnected(const ProcessResultData &res
if (m_connectionHandle) // TODO: should it disconnect from signals first? if (m_connectionHandle) // TODO: should it disconnect from signals first?
m_connectionHandle.release()->deleteLater(); m_connectionHandle.release()->deleteLater();
if (resultData.m_error != QProcess::UnknownError && m_process.state() != QProcess::NotRunning) if (resultData.m_error != QProcess::UnknownError || m_process.state() != QProcess::NotRunning)
emit q->done(resultData); // TODO: don't emit done() on process finished afterwards emit q->done(resultData); // TODO: don't emit done() on process finished afterwards
} }