Skip to content

Commit f0745e8

Browse files
committed
add gui to configure ssh
1 parent 8245222 commit f0745e8

12 files changed

+382
-73
lines changed

src/mainwindow.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ MainWindow::MainWindow(QWidget* parent)
128128
settings->setObjdump(m_settingsDialog->objdump());
129129
});
130130

131+
connect(m_settingsDialog, &QDialog::accepted, m_recordPage, &RecordPage::onRemoteDevicesChanged);
132+
131133
connect(settings, &Settings::sysrootChanged, m_resultsPage, &ResultsPage::setSysroot);
132134
connect(settings, &Settings::appPathChanged, m_resultsPage, &ResultsPage::setAppPath);
133135
connect(settings, &Settings::objdumpChanged, m_resultsPage, &ResultsPage::setObjdump);

src/perfrecordssh.cpp

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,11 @@
1616
#include <csignal>
1717

1818
#include "hotspot-config.h"
19-
20-
QString sshOutput(const QString& hostname, const QStringList& command)
21-
{
22-
QProcess ssh;
23-
ssh.setProgram(QStandardPaths::findExecutable(QLatin1String("ssh")));
24-
const auto arguments = QStringList({hostname}) + command;
25-
ssh.setArguments(arguments);
26-
ssh.start();
27-
ssh.waitForFinished();
28-
return QString::fromUtf8(ssh.readAll());
29-
}
30-
31-
int sshExitCode(const QString& hostname, const QStringList& command)
32-
{
33-
QProcess ssh;
34-
ssh.setProgram(QStandardPaths::findExecutable(QLatin1String("ssh")));
35-
const auto arguments = QStringList({hostname}) + command;
36-
ssh.setArguments(arguments);
37-
ssh.start();
38-
ssh.waitForFinished();
39-
return ssh.exitCode();
40-
}
19+
#include "ssh.h"
4120

4221
PerfRecordSSH::PerfRecordSSH(QObject* parent)
4322
: PerfRecord(parent)
4423
{
45-
m_hostname = QStringLiteral("user@localhost");
4624
}
4725

4826
PerfRecordSSH::~PerfRecordSSH() = default;
@@ -102,7 +80,9 @@ QString PerfRecordSSH::currentUsername()
10280

10381
bool PerfRecordSSH::canTrace(const QString& path)
10482
{
105-
if (m_hostname.isEmpty())
83+
Q_UNUSED(path);
84+
85+
if (m_deviceName.isEmpty())
10686
return false;
10787

10888
// assume best case
@@ -111,7 +91,7 @@ bool PerfRecordSSH::canTrace(const QString& path)
11191

11292
bool PerfRecordSSH::canProfileOffCpu()
11393
{
114-
if (m_hostname.isEmpty())
94+
if (m_deviceName.isEmpty())
11595
return false;
11696
return canTrace(QStringLiteral("events/sched/sched_switch"));
11797
}
@@ -142,16 +122,16 @@ QString perfBuildOptions(const QString& hostname)
142122

143123
bool PerfRecordSSH::canSampleCpu()
144124
{
145-
if (m_hostname.isEmpty())
125+
if (m_deviceName.isEmpty())
146126
return false;
147-
return perfRecordHelp(m_hostname).contains(QLatin1String("--sample-cpu"));
127+
return perfRecordHelp(m_deviceName).contains(QLatin1String("--sample-cpu"));
148128
}
149129

150130
bool PerfRecordSSH::canSwitchEvents()
151131
{
152-
if (m_hostname.isEmpty())
132+
if (m_deviceName.isEmpty())
153133
return false;
154-
return perfRecordHelp(m_hostname).contains(QLatin1String("--switch-events"));
134+
return perfRecordHelp(m_deviceName).contains(QLatin1String("--switch-events"));
155135
}
156136

157137
bool PerfRecordSSH::canUseAio()
@@ -162,16 +142,16 @@ bool PerfRecordSSH::canUseAio()
162142

163143
bool PerfRecordSSH::canCompress()
164144
{
165-
if (m_hostname.isEmpty())
145+
if (m_deviceName.isEmpty())
166146
return false;
167-
return Zstd_FOUND && perfBuildOptions(m_hostname).contains(QLatin1String("zstd: [ on ]"));
147+
return Zstd_FOUND && perfBuildOptions(m_deviceName).contains(QLatin1String("zstd: [ on ]"));
168148
}
169149

170150
bool PerfRecordSSH::isPerfInstalled()
171151
{
172-
if (m_hostname.isEmpty())
152+
if (m_deviceName.isEmpty())
173153
return false;
174-
return sshExitCode(m_hostname, {QLatin1String("command"), QLatin1String("-v"), QLatin1String("perf")}) != 0;
154+
return sshExitCode(m_deviceName, {QLatin1String("command"), QLatin1String("-v"), QLatin1String("perf")}) != 0;
175155
}
176156

177157
void PerfRecordSSH::startRecording(const QStringList& perfOptions, const QString& outputPath,
@@ -199,18 +179,15 @@ void PerfRecordSSH::startRecording(const QStringList& perfOptions, const QString
199179
return;
200180
}
201181

182+
qRegisterMetaType<QProcess::ExitStatus>("QProcess::ExitStatus");
183+
202184
QStringList perfCommand = {QStringLiteral("record"), QStringLiteral("-o"), QStringLiteral("-")};
203185
perfCommand += perfOptions;
204186
perfCommand += recordOptions;
205-
206187
m_outputFile = new QFile(outputPath);
207188
m_outputFile->open(QIODevice::WriteOnly);
208189

209-
m_recordProcess = new QProcess(this);
210-
m_recordProcess->setProgram(QStandardPaths::findExecutable(QLatin1String("ssh")));
211-
m_recordProcess->setArguments({m_hostname, QLatin1String("perf ") + perfCommand.join(QLatin1Char(' '))});
212-
m_recordProcess->start();
213-
m_recordProcess->waitForStarted();
190+
m_recordProcess = createSshProcess(m_deviceName, perfCommand);
214191

215192
emit recordingStarted(QLatin1String("perf"), perfCommand);
216193

src/perfrecordssh.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#pragma once
99

1010
#include "perfrecord.h"
11+
#include <QProcess>
1112

1213
class QFile;
1314

@@ -18,6 +19,11 @@ class PerfRecordSSH : public PerfRecord
1819
PerfRecordSSH(QObject* parent = nullptr);
1920
~PerfRecordSSH();
2021

22+
void setDeviceName(const QString& device)
23+
{
24+
m_deviceName = device;
25+
}
26+
2127
void record(const QStringList& perfOptions, const QString& outputPath, bool elevatePrivileges,
2228
const QString& exePath, const QStringList& exeOptions, const QString& workingDirectory) override;
2329
void record(const QStringList& perfOptions, const QString& outputPath, bool elevatePrivileges,
@@ -50,6 +56,6 @@ class PerfRecordSSH : public PerfRecord
5056

5157
QProcess* m_recordProcess = nullptr;
5258
QFile* m_outputFile;
53-
QString m_hostname;
59+
QString m_deviceName;
5460
bool m_userTerminated = false;
5561
};

src/recordpage.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -808,3 +808,17 @@ void RecordPage::updateOffCpuCheckboxState()
808808
ui->offCpuCheckBox->setChecked(config().readEntry(QStringLiteral("offCpuProfiling"), false));
809809
}
810810
}
811+
812+
void RecordPage::onRemoteDevicesChanged()
813+
{
814+
ui->remoteTargetComboBox->clear();
815+
ui->remoteTargetComboBox->addItem(QStringLiteral("localhost"));
816+
817+
const auto deviceConfig = KSharedConfig::openConfig()->group("devices");
818+
auto t = deviceConfig.groupList();
819+
for (const auto& device : deviceConfig.groupList()) {
820+
if (deviceConfig.hasGroup(device)) {
821+
ui->remoteTargetComboBox->addItem(device);
822+
}
823+
}
824+
}

src/recordpage.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ class RecordPage : public QWidget
5454
void homeButtonClicked();
5555
void openFile(QString filePath);
5656

57+
public slots:
58+
void onRemoteDevicesChanged();
59+
5760
private slots:
5861
void onApplicationNameChanged(const QString& filePath);
5962
void onStartRecordingButtonClicked(bool checked);

src/settings.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,4 +221,13 @@ void Settings::loadFromFile()
221221
connect(this, &Settings::lastUsedEnvironmentChanged, [sharedConfig, this](const QString& envName) {
222222
sharedConfig->group("PerfPaths").writeEntry("lastUsed", envName);
223223
});
224+
225+
const auto askpass = QStandardPaths::findExecutable(QLatin1String("ksshaskpass"));
226+
setSshaskPassPath(sharedConfig->group("SSH").readEntry("sshaskpass", askpass));
227+
}
228+
229+
void Settings::setSshaskPassPath(const QString& sshaskpath)
230+
{
231+
m_sshaskPassPath = sshaskpath;
232+
emit sshaskPassChanged(m_sshaskPassPath);
224233
}

src/settings.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,11 @@ class Settings : public QObject
139139
return m_lastUsedEnvironment;
140140
}
141141

142+
QString sshaskPassPath() const
143+
{
144+
return m_sshaskPassPath;
145+
}
146+
142147
void loadFromFile();
143148

144149
signals:
@@ -158,6 +163,7 @@ class Settings : public QObject
158163
void objdumpChanged(const QString& objdump);
159164
void callgraphChanged();
160165
void lastUsedEnvironmentChanged(const QString& envName);
166+
void sshaskPassChanged(const QString& path);
161167

162168
public slots:
163169
void setPrettifySymbols(bool prettifySymbols);
@@ -178,6 +184,7 @@ public slots:
178184
void setCallgraphColors(const QColor& active, const QColor& inactive);
179185
void setCostAggregation(CostAggregation costAggregation);
180186
void setLastUsedEnvironment(const QString& envName);
187+
void setSshaskPassPath(const QString& sshaskpath);
181188

182189
private:
183190
Settings() = default;
@@ -199,6 +206,7 @@ public slots:
199206
QString m_appPath;
200207
QString m_arch;
201208
QString m_objdump;
209+
QString m_sshaskPassPath;
202210

203211
QString m_lastUsedEnvironment;
204212

0 commit comments

Comments
 (0)