Skip to content

Commit dc95451

Browse files
authored
Merge pull request #9 from Acik-Kaynak-Gelistirme-Toplulugu/fix/backend-stubs
feat: implement remaining backend stubs (DnfManager, PolkitHelper, NvidiaUpdater)
2 parents 64421ab + ac809a2 commit dc95451

21 files changed

Lines changed: 894 additions & 555 deletions

CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ install(FILES data/ro-control.metainfo.xml
109109
DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo
110110
)
111111

112+
install(FILES data/polkit/com.github.AcikKaynakGelistirmeToplulugu.rocontrol.policy
113+
DESTINATION ${CMAKE_INSTALL_DATADIR}/polkit-1/actions
114+
)
115+
112116
# ─── Tests ───────────────────────────────────────────────────────────────────
113117
option(BUILD_TESTS "Build unit tests" OFF)
114118

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE policyconfig PUBLIC
3+
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
4+
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
5+
6+
<policyconfig>
7+
8+
<vendor>ro-Control</vendor>
9+
<vendor_url>https://github.com/Acik-Kaynak-Gelistirme-Toplulugu/ro-Control</vendor_url>
10+
11+
<action id="com.github.AcikKaynakGelistirmeToplulugu.rocontrol.manage-drivers">
12+
<description>Manage NVIDIA drivers</description>
13+
<description xml:lang="tr">NVIDIA sürücülerini yönet</description>
14+
<message>Authentication is required to manage NVIDIA drivers</message>
15+
<message xml:lang="tr">NVIDIA sürücülerini yönetmek için kimlik doğrulama gerekli</message>
16+
<icon_name>ro-control</icon_name>
17+
<defaults>
18+
<allow_any>auth_admin</allow_any>
19+
<allow_inactive>auth_admin</allow_inactive>
20+
<allow_active>auth_admin_keep</allow_active>
21+
</defaults>
22+
</action>
23+
24+
</policyconfig>

src/backend/monitor/cpumonitor.cpp

Lines changed: 63 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,87 @@
11
#include "cpumonitor.h"
22

3+
#include <QDir>
34
#include <QFile>
45
#include <QTextStream>
5-
#include <QDir>
6-
7-
CpuMonitor::CpuMonitor(QObject *parent)
8-
: QObject(parent)
9-
{
10-
connect(&m_timer, &QTimer::timeout, this, &CpuMonitor::poll);
11-
}
126

13-
void CpuMonitor::start(int intervalMs)
14-
{
15-
poll();
16-
m_timer.start(intervalMs);
7+
CpuMonitor::CpuMonitor(QObject *parent) : QObject(parent) {
8+
connect(&m_timer, &QTimer::timeout, this, &CpuMonitor::poll);
179
}
1810

19-
void CpuMonitor::stop()
20-
{
21-
m_timer.stop();
11+
void CpuMonitor::start(int intervalMs) {
12+
poll();
13+
m_timer.start(intervalMs);
2214
}
2315

24-
void CpuMonitor::poll()
25-
{
26-
// ── CPU Yükü (/proc/stat) ────────────────────────────────────────────────
27-
// /proc/stat ilk satırı: "cpu user nice system idle iowait irq softirq..."
28-
QFile statFile(QStringLiteral("/proc/stat"));
29-
if (statFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
30-
QTextStream stream(&statFile);
31-
const QString line = stream.readLine(); // "cpu ..." satırı
16+
void CpuMonitor::stop() { m_timer.stop(); }
3217

33-
const QStringList parts = line.split(QLatin1Char(' '), Qt::SkipEmptyParts);
34-
if (parts.size() >= 5) {
35-
// idle = index 4, total = tüm değerlerin toplamı
36-
long long idle = parts[4].toLongLong();
37-
long long total = 0;
38-
for (int i = 1; i < parts.size(); ++i)
39-
total += parts[i].toLongLong();
18+
void CpuMonitor::poll() {
19+
// ── CPU Yükü (/proc/stat) ────────────────────────────────────────────────
20+
// /proc/stat ilk satırı: "cpu user nice system idle iowait irq softirq..."
21+
QFile statFile(QStringLiteral("/proc/stat"));
22+
if (statFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
23+
QTextStream stream(&statFile);
24+
const QString line = stream.readLine(); // "cpu ..." satırı
4025

41-
// Delta ile yük hesapla
42-
const long long diffIdle = idle - m_prevIdle;
43-
const long long diffTotal = total - m_prevTotal;
26+
const QStringList parts = line.split(QLatin1Char(' '), Qt::SkipEmptyParts);
27+
if (parts.size() >= 5) {
28+
// idle = index 4, total = tüm değerlerin toplamı
29+
long long idle = parts[4].toLongLong();
30+
long long total = 0;
31+
for (int i = 1; i < parts.size(); ++i)
32+
total += parts[i].toLongLong();
4433

45-
if (diffTotal > 0) {
46-
const int load = static_cast<int>(100 * (1.0 - static_cast<double>(diffIdle) / diffTotal));
47-
if (load != m_load) {
48-
m_load = load;
49-
emit loadChanged();
50-
}
51-
}
34+
// Delta ile yük hesapla
35+
const long long diffIdle = idle - m_prevIdle;
36+
const long long diffTotal = total - m_prevTotal;
5237

53-
m_prevIdle = idle;
54-
m_prevTotal = total;
38+
if (diffTotal > 0) {
39+
const int load = static_cast<int>(
40+
100 * (1.0 - static_cast<double>(diffIdle) / diffTotal));
41+
if (load != m_load) {
42+
m_load = load;
43+
emit loadChanged();
5544
}
56-
}
45+
}
5746

58-
// ── CPU Sıcaklığı (hwmon) ────────────────────────────────────────────────
59-
const int temp = readCpuTemp();
60-
if (temp > 0 && temp != m_temperature) {
61-
m_temperature = temp;
62-
emit temperatureChanged();
47+
m_prevIdle = idle;
48+
m_prevTotal = total;
6349
}
50+
}
51+
52+
// ── CPU Sıcaklığı (hwmon) ────────────────────────────────────────────────
53+
const int temp = readCpuTemp();
54+
if (temp > 0 && temp != m_temperature) {
55+
m_temperature = temp;
56+
emit temperatureChanged();
57+
}
6458
}
6559

66-
int CpuMonitor::readCpuTemp() const
67-
{
68-
// /sys/class/hwmon/ altındaki sıcaklık sensörlerini tara
69-
const QDir hwmonDir(QStringLiteral("/sys/class/hwmon"));
70-
const QStringList hwmons = hwmonDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
60+
int CpuMonitor::readCpuTemp() const {
61+
// /sys/class/hwmon/ altındaki sıcaklık sensörlerini tara
62+
const QDir hwmonDir(QStringLiteral("/sys/class/hwmon"));
63+
const QStringList hwmons =
64+
hwmonDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
7165

72-
for (const QString &hwmon : hwmons) {
73-
const QString namePath = hwmonDir.filePath(hwmon + QStringLiteral("/name"));
74-
QFile nameFile(namePath);
75-
if (!nameFile.open(QIODevice::ReadOnly))
76-
continue;
66+
for (const QString &hwmon : hwmons) {
67+
const QString namePath = hwmonDir.filePath(hwmon + QStringLiteral("/name"));
68+
QFile nameFile(namePath);
69+
if (!nameFile.open(QIODevice::ReadOnly))
70+
continue;
7771

78-
const QString name = QString::fromUtf8(nameFile.readAll()).trimmed();
72+
const QString name = QString::fromUtf8(nameFile.readAll()).trimmed();
7973

80-
// k10temp (AMD) veya coretemp (Intel) sensörü
81-
if (name == QStringLiteral("k10temp") || name == QStringLiteral("coretemp")) {
82-
QFile tempFile(hwmonDir.filePath(hwmon + QStringLiteral("/temp1_input")));
83-
if (tempFile.open(QIODevice::ReadOnly)) {
84-
const int milliCelsius = QString::fromUtf8(tempFile.readAll()).trimmed().toInt();
85-
return milliCelsius / 1000; // milli-Celsius → Celsius
86-
}
87-
}
74+
// k10temp (AMD) veya coretemp (Intel) sensörü
75+
if (name == QStringLiteral("k10temp") ||
76+
name == QStringLiteral("coretemp")) {
77+
QFile tempFile(hwmonDir.filePath(hwmon + QStringLiteral("/temp1_input")));
78+
if (tempFile.open(QIODevice::ReadOnly)) {
79+
const int milliCelsius =
80+
QString::fromUtf8(tempFile.readAll()).trimmed().toInt();
81+
return milliCelsius / 1000; // milli-Celsius → Celsius
82+
}
8883
}
84+
}
8985

90-
return 0;
86+
return 0;
9187
}

src/backend/monitor/cpumonitor.h

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,36 @@
44
#include <QTimer>
55

66
// CpuMonitor: /proc/stat üzerinden gerçek zamanlı CPU istatistikleri.
7-
class CpuMonitor : public QObject
8-
{
9-
Q_OBJECT
7+
class CpuMonitor : public QObject {
8+
Q_OBJECT
109

11-
Q_PROPERTY(int load READ load NOTIFY loadChanged)
12-
Q_PROPERTY(int temperature READ temperature NOTIFY temperatureChanged)
10+
Q_PROPERTY(int load READ load NOTIFY loadChanged)
11+
Q_PROPERTY(int temperature READ temperature NOTIFY temperatureChanged)
1312

1413
public:
15-
explicit CpuMonitor(QObject *parent = nullptr);
14+
explicit CpuMonitor(QObject *parent = nullptr);
1615

17-
int load() const { return m_load; }
18-
int temperature() const { return m_temperature; }
16+
int load() const { return m_load; }
17+
int temperature() const { return m_temperature; }
1918

20-
Q_INVOKABLE void start(int intervalMs = 1000);
21-
Q_INVOKABLE void stop();
19+
Q_INVOKABLE void start(int intervalMs = 1000);
20+
Q_INVOKABLE void stop();
2221

2322
signals:
24-
void loadChanged();
25-
void temperatureChanged();
23+
void loadChanged();
24+
void temperatureChanged();
2625

2726
private slots:
28-
void poll();
27+
void poll();
2928

3029
private:
31-
int readCpuTemp() const;
30+
int readCpuTemp() const;
3231

33-
QTimer m_timer;
34-
int m_load = 0;
35-
int m_temperature = 0;
32+
QTimer m_timer;
33+
int m_load = 0;
34+
int m_temperature = 0;
3635

37-
// /proc/stat için önceki değerler (delta hesabı)
38-
long long m_prevIdle = 0;
39-
long long m_prevTotal = 0;
36+
// /proc/stat için önceki değerler (delta hesabı)
37+
long long m_prevIdle = 0;
38+
long long m_prevTotal = 0;
4039
};

src/backend/monitor/gpumonitor.cpp

Lines changed: 50 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,69 @@
11
#include "gpumonitor.h"
22
#include "system/commandrunner.h"
33

4-
GpuMonitor::GpuMonitor(QObject *parent)
5-
: QObject(parent)
6-
{
7-
connect(&m_timer, &QTimer::timeout, this, &GpuMonitor::poll);
4+
GpuMonitor::GpuMonitor(QObject *parent) : QObject(parent) {
5+
connect(&m_timer, &QTimer::timeout, this, &GpuMonitor::poll);
86
}
97

10-
void GpuMonitor::start(int intervalMs)
11-
{
12-
poll(); // İlk veriyi hemen al
13-
m_timer.start(intervalMs);
8+
void GpuMonitor::start(int intervalMs) {
9+
poll(); // İlk veriyi hemen al
10+
m_timer.start(intervalMs);
1411
}
1512

16-
void GpuMonitor::stop()
17-
{
18-
m_timer.stop();
19-
}
13+
void GpuMonitor::stop() { m_timer.stop(); }
2014

21-
void GpuMonitor::poll()
22-
{
23-
CommandRunner runner;
15+
void GpuMonitor::poll() {
16+
CommandRunner runner;
2417

25-
// nvidia-smi'den tek seferde tüm değerleri çek
26-
// Çıktı formatı: "temperature,utilization,vram_used,vram_total"
27-
const auto result = runner.run(
28-
QStringLiteral("nvidia-smi"),
29-
{
30-
QStringLiteral("--query-gpu=temperature.gpu,utilization.gpu,memory.used,memory.total"),
31-
QStringLiteral("--format=csv,noheader,nounits")
32-
}
33-
);
18+
// nvidia-smi'den tek seferde tüm değerleri çek
19+
// Çıktı formatı: "temperature,utilization,vram_used,vram_total"
20+
const auto result =
21+
runner.run(QStringLiteral("nvidia-smi"),
22+
{QStringLiteral("--query-gpu=temperature.gpu,utilization.gpu,"
23+
"memory.used,memory.total"),
24+
QStringLiteral("--format=csv,noheader,nounits")});
3425

35-
if (!result.success()) {
36-
if (m_available) {
37-
m_available = false;
38-
emit availableChanged();
39-
}
40-
return;
26+
if (!result.success()) {
27+
if (m_available) {
28+
m_available = false;
29+
emit availableChanged();
4130
}
31+
return;
32+
}
4233

43-
// "72, 45, 2048, 8192" formatını parse et
44-
const QStringList parts = result.stdout.trimmed().split(QStringLiteral(", "));
45-
if (parts.size() < 4)
46-
return;
34+
// "72, 45, 2048, 8192" formatını parse et
35+
const QStringList parts = result.stdout.trimmed().split(QStringLiteral(", "));
36+
if (parts.size() < 4)
37+
return;
4738

48-
bool ok = false;
39+
bool ok = false;
4940

50-
const int temp = parts[0].trimmed().toInt(&ok);
51-
if (ok && temp != m_temperature) {
52-
m_temperature = temp;
53-
emit temperatureChanged();
54-
}
41+
const int temp = parts[0].trimmed().toInt(&ok);
42+
if (ok && temp != m_temperature) {
43+
m_temperature = temp;
44+
emit temperatureChanged();
45+
}
5546

56-
const int load = parts[1].trimmed().toInt(&ok);
57-
if (ok && load != m_load) {
58-
m_load = load;
59-
emit loadChanged();
60-
}
47+
const int load = parts[1].trimmed().toInt(&ok);
48+
if (ok && load != m_load) {
49+
m_load = load;
50+
emit loadChanged();
51+
}
6152

62-
const int vramUsed = parts[2].trimmed().toInt(&ok);
63-
if (ok && vramUsed != m_vramUsed) {
64-
m_vramUsed = vramUsed;
65-
emit vramUsedChanged();
66-
}
53+
const int vramUsed = parts[2].trimmed().toInt(&ok);
54+
if (ok && vramUsed != m_vramUsed) {
55+
m_vramUsed = vramUsed;
56+
emit vramUsedChanged();
57+
}
6758

68-
const int vramTotal = parts[3].trimmed().toInt(&ok);
69-
if (ok && vramTotal != m_vramTotal) {
70-
m_vramTotal = vramTotal;
71-
emit vramTotalChanged();
72-
}
59+
const int vramTotal = parts[3].trimmed().toInt(&ok);
60+
if (ok && vramTotal != m_vramTotal) {
61+
m_vramTotal = vramTotal;
62+
emit vramTotalChanged();
63+
}
7364

74-
if (!m_available) {
75-
m_available = true;
76-
emit availableChanged();
77-
}
65+
if (!m_available) {
66+
m_available = true;
67+
emit availableChanged();
68+
}
7869
}

0 commit comments

Comments
 (0)