Get rid of SshProcess (one process class less)

Introduce static SshRemoteProcess::setupSshEnvironment()
method instead.

Change-Id: I9a49bc68bd96ddf0f58234d28b92a721f7d4bb56
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
Jarek Kobus
2022-02-18 12:31:19 +01:00
parent 6360cffc80
commit 098e3794db
12 changed files with 48 additions and 125 deletions

View File

@@ -11,7 +11,6 @@ add_qtc_library(QtcSsh
sshconnectionmanager.cpp sshconnectionmanager.h sshconnectionmanager.cpp sshconnectionmanager.h
sshkeycreationdialog.cpp sshkeycreationdialog.h sshkeycreationdialog.ui sshkeycreationdialog.cpp sshkeycreationdialog.h sshkeycreationdialog.ui
sshlogging.cpp sshlogging_p.h sshlogging.cpp sshlogging_p.h
sshprocess.cpp sshprocess.h
sshconnection.cpp sshconnection.h sshconnection.cpp sshconnection.h
sshconnectionmanager.cpp sshconnectionmanager.h sshconnectionmanager.cpp sshconnectionmanager.h
sshkeycreationdialog.cpp sshkeycreationdialog.h sshkeycreationdialog.ui sshkeycreationdialog.cpp sshkeycreationdialog.h sshkeycreationdialog.ui

View File

@@ -26,7 +26,7 @@
#include "sftpsession.h" #include "sftpsession.h"
#include "sshlogging_p.h" #include "sshlogging_p.h"
#include "sshprocess.h" #include "sshremoteprocess.h"
#include "sshsettings.h" #include "sshsettings.h"
#include <utils/fileutils.h> #include <utils/fileutils.h>
@@ -58,7 +58,7 @@ struct Command
struct SftpSession::SftpSessionPrivate struct SftpSession::SftpSessionPrivate
{ {
SshProcess sftpProc; QtcProcess sftpProc;
QStringList connectionArgs; QStringList connectionArgs;
QByteArray output; QByteArray output;
QQueue<Command> pendingCommands; QQueue<Command> pendingCommands;
@@ -111,6 +111,7 @@ static QByteArray prompt() { return "sftp> "; }
SftpSession::SftpSession(const QStringList &connectionArgs) : d(new SftpSessionPrivate) SftpSession::SftpSession(const QStringList &connectionArgs) : d(new SftpSessionPrivate)
{ {
SshRemoteProcess::setupSshEnvironment(&d->sftpProc);
d->sftpProc.setProcessMode(ProcessMode::Writer); d->sftpProc.setProcessMode(ProcessMode::Writer);
d->connectionArgs = connectionArgs; d->connectionArgs = connectionArgs;
connect(&d->sftpProc, &QtcProcess::started, [this] { connect(&d->sftpProc, &QtcProcess::started, [this] {

View File

@@ -26,7 +26,7 @@
#include "sftptransfer.h" #include "sftptransfer.h"
#include "sshlogging_p.h" #include "sshlogging_p.h"
#include "sshprocess.h" #include "sshremoteprocess.h"
#include "sshsettings.h" #include "sshsettings.h"
#include <QDir> #include <QDir>
@@ -44,7 +44,7 @@ namespace QSsh {
struct SftpTransfer::SftpTransferPrivate struct SftpTransfer::SftpTransferPrivate
{ {
SshProcess sftpProc; QtcProcess sftpProc;
FilesToTransfer files; FilesToTransfer files;
Internal::FileTransferType transferType; Internal::FileTransferType transferType;
FileTransferErrorHandling errorHandlingMode; FileTransferErrorHandling errorHandlingMode;
@@ -109,6 +109,7 @@ SftpTransfer::SftpTransfer(const FilesToTransfer &files, Internal::FileTransferT
const QStringList &connectionArgs) const QStringList &connectionArgs)
: d(new SftpTransferPrivate) : d(new SftpTransferPrivate)
{ {
SshRemoteProcess::setupSshEnvironment(&d->sftpProc);
d->files = files; d->files = files;
d->transferType = type; d->transferType = type;
d->errorHandlingMode = errorHandlingMode; d->errorHandlingMode = errorHandlingMode;

View File

@@ -29,8 +29,6 @@ Project {
"sshkeycreationdialog.ui", "sshkeycreationdialog.ui",
"sshlogging.cpp", "sshlogging.cpp",
"sshlogging_p.h", "sshlogging_p.h",
"sshprocess.cpp",
"sshprocess.h",
"sshremoteprocess.cpp", "sshremoteprocess.cpp",
"sshremoteprocess.h", "sshremoteprocess.h",
"sshremoteprocessrunner.cpp", "sshremoteprocessrunner.cpp",

View File

@@ -28,7 +28,6 @@
#include "sftpsession.h" #include "sftpsession.h"
#include "sftptransfer.h" #include "sftptransfer.h"
#include "sshlogging_p.h" #include "sshlogging_p.h"
#include "sshprocess.h"
#include "sshremoteprocess.h" #include "sshremoteprocess.h"
#include "sshsettings.h" #include "sshsettings.h"
@@ -129,7 +128,10 @@ bool operator!=(const SshConnectionParameters &p1, const SshConnectionParameters
struct SshConnection::SshConnectionPrivate struct SshConnection::SshConnectionPrivate
{ {
SshConnectionPrivate(const SshConnectionParameters &sshParameters) SshConnectionPrivate(const SshConnectionParameters &sshParameters)
: connParams(sshParameters) {} : connParams(sshParameters)
{
SshRemoteProcess::setupSshEnvironment(&masterProcess);
}
QString fullProcessError() QString fullProcessError()
{ {
@@ -166,7 +168,7 @@ struct SshConnection::SshConnectionPrivate
const SshConnectionParameters connParams; const SshConnectionParameters connParams;
SshConnectionInfo connInfo; SshConnectionInfo connInfo;
SshProcess masterProcess; QtcProcess masterProcess;
QString errorString; QString errorString;
std::unique_ptr<QTemporaryDir> masterSocketDir; std::unique_ptr<QTemporaryDir> masterSocketDir;
State state = Unconnected; State state = Unconnected;

View File

@@ -1,50 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2018 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#include "sshprocess.h"
#include "sshsettings.h"
#include <utils/environment.h>
namespace QSsh {
SshProcess::SshProcess()
{
Utils::Environment env = Utils::Environment::systemEnvironment();
if (SshSettings::askpassFilePath().exists()) {
env.set("SSH_ASKPASS", SshSettings::askpassFilePath().toUserOutput());
// OpenSSH only uses the askpass program if DISPLAY is set, regardless of the platform.
if (!env.hasKey("DISPLAY"))
env.set("DISPLAY", ":0");
}
setEnvironment(env);
// Otherwise, ssh will ignore SSH_ASKPASS and read from /dev/tty directly.
setDisableUnixTerminal();
}
} // namespace QSsh

View File

@@ -1,40 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2018 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#pragma once
#include "ssh_global.h"
#include <utils/qtcprocess.h>
namespace QSsh {
class QSSH_EXPORT SshProcess : public Utils::QtcProcess
{
public:
SshProcess();
};
} // namespace QSsh

View File

@@ -46,12 +46,14 @@
*/ */
using namespace QSsh::Internal; using namespace QSsh::Internal;
using namespace Utils;
namespace QSsh { namespace QSsh {
SshRemoteProcess::SshRemoteProcess(const QString &command, const QStringList &connectionArgs) SshRemoteProcess::SshRemoteProcess(const QString &command, const QStringList &connectionArgs)
: SshProcess() : QtcProcess()
{ {
setupSshEnvironment(this);
m_remoteCommand = command; m_remoteCommand = command;
m_connectionArgs = connectionArgs; m_connectionArgs = connectionArgs;
@@ -70,9 +72,9 @@ SshRemoteProcess::SshRemoteProcess(const QString &command, const QStringList &co
void SshRemoteProcess::start() void SshRemoteProcess::start()
{ {
QTC_ASSERT(!isRunning(), return); QTC_ASSERT(!isRunning(), return);
const Utils::CommandLine cmd = fullLocalCommandLine(); const CommandLine cmd = fullLocalCommandLine();
if (!m_displayName.isEmpty()) { if (!m_displayName.isEmpty()) {
Utils::Environment env = environment(); Environment env = environment();
env.set("DISPLAY", m_displayName); env.set("DISPLAY", m_displayName);
setEnvironment(env); setEnvironment(env);
} }
@@ -86,9 +88,9 @@ void SshRemoteProcess::requestX11Forwarding(const QString &displayName)
m_displayName = displayName; m_displayName = displayName;
} }
Utils::CommandLine SshRemoteProcess::fullLocalCommandLine(bool inTerminal) const CommandLine SshRemoteProcess::fullLocalCommandLine(bool inTerminal) const
{ {
Utils::CommandLine cmd{SshSettings::sshFilePath()}; CommandLine cmd {SshSettings::sshFilePath()};
if (!m_displayName.isEmpty()) if (!m_displayName.isEmpty())
cmd.addArg("-X"); cmd.addArg("-X");
@@ -104,4 +106,23 @@ Utils::CommandLine SshRemoteProcess::fullLocalCommandLine(bool inTerminal) const
return cmd; return cmd;
} }
bool SshRemoteProcess::setupSshEnvironment(QtcProcess *process)
{
Environment env = process->hasEnvironment() ? process->environment()
: Environment::systemEnvironment();
const bool hasDisplay = env.hasKey("DISPLAY") && (env.value("DISPLAY") != QString(":0"));
if (SshSettings::askpassFilePath().exists()) {
env.set("SSH_ASKPASS", SshSettings::askpassFilePath().toUserOutput());
// OpenSSH only uses the askpass program if DISPLAY is set, regardless of the platform.
if (!env.hasKey("DISPLAY"))
env.set("DISPLAY", ":0");
}
process->setEnvironment(env);
// Otherwise, ssh will ignore SSH_ASKPASS and read from /dev/tty directly.
process->setDisableUnixTerminal();
return hasDisplay;
}
} // namespace QSsh } // namespace QSsh

View File

@@ -26,13 +26,14 @@
#pragma once #pragma once
#include "ssh_global.h" #include "ssh_global.h"
#include "sshprocess.h"
#include <utils/qtcprocess.h>
namespace Utils { class CommandLine; } namespace Utils { class CommandLine; }
namespace QSsh { namespace QSsh {
class QSSH_EXPORT SshRemoteProcess : public SshProcess class QSSH_EXPORT SshRemoteProcess : public Utils::QtcProcess
{ {
Q_OBJECT Q_OBJECT
@@ -44,6 +45,8 @@ public:
Utils::CommandLine fullLocalCommandLine(bool inTerminal = false) const; Utils::CommandLine fullLocalCommandLine(bool inTerminal = false) const;
static bool setupSshEnvironment(Utils::QtcProcess *process);
signals: signals:
void done(const QString &error); void done(const QString &error);

View File

@@ -466,21 +466,7 @@ void LinuxDevice::runProcess(QtcProcess &process) const
{ {
QTC_ASSERT(!process.isRunning(), return); QTC_ASSERT(!process.isRunning(), return);
Utils::Environment env = process.hasEnvironment() ? process.environment() const bool hasDisplay = SshRemoteProcess::setupSshEnvironment(&process);
: Utils::Environment::systemEnvironment();
const bool hasDisplay = env.hasKey("DISPLAY") && (env.value("DISPLAY") != QString(":0"));
if (SshSettings::askpassFilePath().exists()) {
env.set("SSH_ASKPASS", SshSettings::askpassFilePath().toUserOutput());
// OpenSSH only uses the askpass program if DISPLAY is set, regardless of the platform.
if (!env.hasKey("DISPLAY"))
env.set("DISPLAY", ":0");
}
process.setEnvironment(env);
// Otherwise, ssh will ignore SSH_ASKPASS and read from /dev/tty directly.
process.setDisableUnixTerminal();
process.setCommand(d->fullLocalCommandLine(process.commandLine(), process.terminalMode(), process.setCommand(d->fullLocalCommandLine(process.commandLine(), process.terminalMode(),
hasDisplay)); hasDisplay));
process.start(); process.start();

View File

@@ -55,7 +55,7 @@ public:
SshRemoteProcessPtr process; SshRemoteProcessPtr process;
DeviceUsedPortsGatherer portsGatherer; DeviceUsedPortsGatherer portsGatherer;
SftpTransferPtr sftpTransfer; SftpTransferPtr sftpTransfer;
SshProcess rsyncProcess; Utils::QtcProcess rsyncProcess;
State state = Inactive; State state = Inactive;
bool sftpWorks = false; bool sftpWorks = false;
}; };
@@ -67,6 +67,7 @@ using namespace Internal;
GenericLinuxDeviceTester::GenericLinuxDeviceTester(QObject *parent) GenericLinuxDeviceTester::GenericLinuxDeviceTester(QObject *parent)
: DeviceTester(parent), d(new GenericLinuxDeviceTesterPrivate) : DeviceTester(parent), d(new GenericLinuxDeviceTesterPrivate)
{ {
SshRemoteProcess::setupSshEnvironment(&d->rsyncProcess);
} }
GenericLinuxDeviceTester::~GenericLinuxDeviceTester() GenericLinuxDeviceTester::~GenericLinuxDeviceTester()

View File

@@ -48,7 +48,8 @@ class RsyncDeployService : public AbstractRemoteLinuxDeployService
{ {
Q_OBJECT Q_OBJECT
public: public:
RsyncDeployService(QObject *parent = nullptr) : AbstractRemoteLinuxDeployService(parent) {} RsyncDeployService(QObject *parent = nullptr) : AbstractRemoteLinuxDeployService(parent)
{ SshRemoteProcess::setupSshEnvironment(&m_rsync); }
void setDeployableFiles(const QList<DeployableFile> &files) { m_deployableFiles = files; } void setDeployableFiles(const QList<DeployableFile> &files) { m_deployableFiles = files; }
void setIgnoreMissingFiles(bool ignore) { m_ignoreMissingFiles = ignore; } void setIgnoreMissingFiles(bool ignore) { m_ignoreMissingFiles = ignore; }
@@ -69,7 +70,7 @@ private:
mutable QList<DeployableFile> m_deployableFiles; mutable QList<DeployableFile> m_deployableFiles;
bool m_ignoreMissingFiles = false; bool m_ignoreMissingFiles = false;
QString m_flags; QString m_flags;
SshProcess m_rsync; QtcProcess m_rsync;
SshRemoteProcessPtr m_mkdir; SshRemoteProcessPtr m_mkdir;
}; };