forked from qt-creator/qt-creator
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:
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user