From 4749d0903b3aa8d8e5f3c3a4f570339321882a3d Mon Sep 17 00:00:00 2001 From: tobtoht Date: Fri, 16 May 2025 11:58:42 +0200 Subject: [PATCH] plugins: remove mining --- CMakeLists.txt | 1 - RELEASE.md | 1 - src/MainWindow.ui | 5 - src/WindowManager.cpp | 10 - src/assets.qrc | 1 - src/assets/images/xmrig.svg | 1 - src/plugins/xmrig/XMRigPlugin.cpp | 62 ---- src/plugins/xmrig/XMRigPlugin.h | 36 -- src/plugins/xmrig/XMRigWidget.cpp | 417 ----------------------- src/plugins/xmrig/XMRigWidget.h | 77 ----- src/plugins/xmrig/XMRigWidget.ui | 533 ------------------------------ src/plugins/xmrig/xmrig.cpp | 129 -------- src/plugins/xmrig/xmrig.h | 36 -- src/utils/config.cpp | 13 +- src/utils/config.h | 11 - 15 files changed, 1 insertion(+), 1332 deletions(-) delete mode 100644 src/assets/images/xmrig.svg delete mode 100644 src/plugins/xmrig/XMRigPlugin.cpp delete mode 100644 src/plugins/xmrig/XMRigPlugin.h delete mode 100644 src/plugins/xmrig/XMRigWidget.cpp delete mode 100644 src/plugins/xmrig/XMRigWidget.h delete mode 100644 src/plugins/xmrig/XMRigWidget.ui delete mode 100644 src/plugins/xmrig/xmrig.cpp delete mode 100644 src/plugins/xmrig/xmrig.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b004afa7..fb53063e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,7 +38,6 @@ option(WITH_PLUGIN_CROWDFUNDING "Include Crowdfunding Home plugin" ON) option(WITH_PLUGIN_BOUNTIES "Include Bounties Home plugin" ON) option(WITH_PLUGIN_REVUO "Include Revuo Home plugin" ON) option(WITH_PLUGIN_CALC "Include Calc tab plugin" ON) -option(WITH_PLUGIN_XMRIG "Include XMRig plugin" ON) list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/cmake") include(CheckCCompilerFlag) diff --git a/RELEASE.md b/RELEASE.md index eba243ce..5d8777f5 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -3,7 +3,6 @@ - Before a minor release: - Update `src/assets/restore_heights_monero_{mainnet,stagenet}.txt` - To obtain values, run `contrib/generate-restore-heights/heights.py` - - Update `m_defaultPools` in `src/widgets/XMRigWidget.h` - Update default node lists in `src/assets/nodes.json` - Bump `openssl`, `qt`, `tor_*` packages in `contrib/depends/packages` - Update or patch any statically linked dependencies that have known vulnerabilities diff --git a/src/MainWindow.ui b/src/MainWindow.ui index eced3c55..753e8503 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -809,11 +809,6 @@ Outputs - - - Show Mining - - Transaction diff --git a/src/WindowManager.cpp b/src/WindowManager.cpp index 4c0ff302..5d6696e9 100644 --- a/src/WindowManager.cpp +++ b/src/WindowManager.cpp @@ -315,16 +315,6 @@ void WindowManager::onWalletOpened(Wallet *wallet) { this->onInitialNetworkConfigured(); -// if (!wallet->cacheAttributeExists("feather.xmrig_password") && !wallet->cacheAttributeExists("feather.created")) { -// auto result = QMessageBox::question(nullptr, "Foreign wallet", -// "This wallet file was not created with Feather. This may cause unexpected behavior. Please restore your wallet from seed.\n\nOpen this wallet anyway?"); -// if (result == QMessageBox::No) { -// wallet->deleteLater(); -// this->initWizard(); -// return; -// } -// } - // Create new mainwindow with wallet m_splashDialog->hide(); diff --git a/src/assets.qrc b/src/assets.qrc index b69574ca..de87ab63 100644 --- a/src/assets.qrc +++ b/src/assets.qrc @@ -106,7 +106,6 @@ assets/images/update.png assets/images/warning.png assets/images/vrdp_32px.png - assets/images/xmrig.svg assets/images/zoom.png assets/restore_heights_monero_mainnet.txt assets/restore_heights_monero_stagenet.txt diff --git a/src/assets/images/xmrig.svg b/src/assets/images/xmrig.svg deleted file mode 100644 index c029755f..00000000 --- a/src/assets/images/xmrig.svg +++ /dev/null @@ -1 +0,0 @@ -XMRigXr_icon \ No newline at end of file diff --git a/src/plugins/xmrig/XMRigPlugin.cpp b/src/plugins/xmrig/XMRigPlugin.cpp deleted file mode 100644 index afdac604..00000000 --- a/src/plugins/xmrig/XMRigPlugin.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: BSD-3-Clause -// SPDX-FileCopyrightText: The Monero Project - -#include "XMRigPlugin.h" - -#include "plugins/PluginRegistry.h" - -XMRigPlugin::XMRigPlugin() -{ -} - - -void XMRigPlugin::initialize(Wallet *wallet, QObject *parent) { - this->setParent(parent); - m_tab = new XMRigWidget(wallet, nullptr); -} - -QString XMRigPlugin::id() { - return "xmrig"; -} - -int XMRigPlugin::idx() const { - return 70; -} - -QString XMRigPlugin::parent() { - return {}; -} - -QString XMRigPlugin::displayName() { - return "Mining"; -} - -QString XMRigPlugin::description() { - return {}; -} - -QString XMRigPlugin::icon() { - return "mining.png"; -} - -QStringList XMRigPlugin::socketData() { - return {"xmrig"}; -} - -Plugin::PluginType XMRigPlugin::type() { - return Plugin::PluginType::TAB; -} - -QWidget* XMRigPlugin::tab() { - return m_tab; -} - -bool XMRigPlugin::requiresWebsocket() { - return false; -} - -const bool XMRigPlugin::registered = [] { - PluginRegistry::registerPlugin(XMRigPlugin::create()); - PluginRegistry::getInstance().registerPluginCreator(&XMRigPlugin::create); - return true; -}(); diff --git a/src/plugins/xmrig/XMRigPlugin.h b/src/plugins/xmrig/XMRigPlugin.h deleted file mode 100644 index a31632a4..00000000 --- a/src/plugins/xmrig/XMRigPlugin.h +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: BSD-3-Clause -// SPDX-FileCopyrightText: The Monero Project - -#ifndef XMRIGPLUGIN_H -#define XMRIGPLUGIN_H - -#include "plugins/Plugin.h" -#include "XMRigWidget.h" - -class XMRigPlugin : public Plugin { - Q_OBJECT - -public: - explicit XMRigPlugin(); - - QString id() override; - int idx() const override; - QString parent() override; - QString displayName() override; - QString description() override; - QString icon() override; - QStringList socketData() override; - PluginType type() override; - QWidget* tab() override; - bool requiresWebsocket() override; - - void initialize(Wallet *wallet, QObject *parent) override; - - static XMRigPlugin* create() { return new XMRigPlugin(); } - -private: - XMRigWidget* m_tab = nullptr; - static const bool registered; -}; - -#endif //XMRIGPLUGIN_H diff --git a/src/plugins/xmrig/XMRigWidget.cpp b/src/plugins/xmrig/XMRigWidget.cpp deleted file mode 100644 index a4a2e3b4..00000000 --- a/src/plugins/xmrig/XMRigWidget.cpp +++ /dev/null @@ -1,417 +0,0 @@ -// SPDX-License-Identifier: BSD-3-Clause -// SPDX-FileCopyrightText: The Monero Project - -#include "XMRigWidget.h" -#include "ui_XMRigWidget.h" - -#include -#include -#include -#include -#include -#include - -#include "WebsocketNotifier.h" -#include "utils/Icons.h" -#include "utils/Utils.h" -#include "WindowManager.h" - -XMRigWidget::XMRigWidget(Wallet *wallet, QWidget *parent) - : QWidget(parent) - , ui(new Ui::XMRigWidget) - , m_wallet(wallet) - , m_XMRig(new XmRig(Config::defaultConfigDir().path(), this)) - , m_model(new QStandardItemModel(this)) - , m_contextMenu(new QMenu(this)) -{ - ui->setupUi(this); - - connect(m_XMRig, &XmRig::stateChanged, this, &XMRigWidget::onXMRigStateChanged); - connect(m_XMRig, &XmRig::output, this, &XMRigWidget::onProcessOutput); - connect(m_XMRig, &XmRig::error, this, &XMRigWidget::onProcessError); - connect(m_XMRig, &XmRig::hashrate, this, &XMRigWidget::onHashrate); - - ui->deprecationFrame->setInfo(icons()->icon("warning.png"), "This feature is deprecated and will be removed in an upcoming version."); - - // [Downloads] tab - ui->tableView->setModel(m_model); - m_contextMenu->addAction(icons()->icon("network.png"), "Download file", this, &XMRigWidget::linkClicked); - connect(ui->tableView, &QHeaderView::customContextMenuRequested, this, &XMRigWidget::showContextMenu); - connect(ui->tableView, &QTableView::doubleClicked, this, &XMRigWidget::linkClicked); - - // [Settings] tab - ui->poolFrame->show(); - ui->soloFrame->hide(); - - // XMRig executable - connect(ui->btn_browse, &QPushButton::clicked, this, &XMRigWidget::onBrowseClicked); - ui->lineEdit_path->setText(conf()->get(Config::xmrigPath).toString()); - - // Run as admin/root - bool elevated = conf()->get(Config::xmrigElevated).toBool(); - if (elevated) { - ui->radio_elevateYes->setChecked(true); - } else { - ui->radio_elevateNo->setChecked(true); - } - connect(ui->radio_elevateYes, &QRadioButton::toggled, this, &XMRigWidget::onXMRigElevationChanged); -#if defined(Q_OS_WIN) - ui->radio_elevateYes->setToolTip("Not supported on Windows, yet."); - ui->radio_elevateYes->setEnabled(false); - ui->radio_elevateNo->setChecked(true); -#endif - - // CPU threads - ui->threadSlider->setMinimum(1); - ui->threadSlider->setMaximum(QThread::idealThreadCount()); - - int threads = conf()->get(Config::xmrigThreads).toInt(); - ui->threadSlider->setValue(threads); - ui->label_threads->setText(QString("CPU threads: %1").arg(threads)); - - connect(ui->threadSlider, &QSlider::valueChanged, this, &XMRigWidget::onThreadsValueChanged); - - // Mining mode - connect(ui->combo_miningMode, QOverload::of(&QComboBox::currentIndexChanged), this, &XMRigWidget::onMiningModeChanged); - ui->combo_miningMode->setCurrentIndex(conf()->get(Config::miningMode).toInt()); - - // Pool/node address - this->updatePools(); - connect(ui->combo_pools, &QComboBox::currentTextChanged, this, &XMRigWidget::onPoolChanged); - - connect(ui->btn_poolConfig, &QPushButton::clicked, [this]{ - QStringList pools = conf()->get(Config::pools).toStringList(); - bool ok; - QString poolStr = QInputDialog::getMultiLineText(this, "Pool addresses", "Set pool addresses (one per line):", pools.join("\n"), &ok); - if (!ok) { - return; - } - QStringList newPools = poolStr.split("\n"); - newPools.removeAll(""); - newPools.removeDuplicates(); - conf()->set(Config::pools, newPools); - this->updatePools(); - }); - - ui->lineEdit_solo->setText(conf()->get(Config::xmrigDaemon).toString()); - connect(ui->lineEdit_solo, &QLineEdit::textChanged, [this](){ - conf()->set(Config::xmrigDaemon, ui->lineEdit_solo->text()); - }); - - // Network settings - connect(ui->check_tls, &QCheckBox::toggled, this, &XMRigWidget::onNetworkTLSToggled); - connect(ui->relayTor, &QCheckBox::toggled, this, &XMRigWidget::onNetworkTorToggled); - ui->check_tls->setChecked(conf()->get(Config::xmrigNetworkTLS).toBool()); - ui->relayTor->setChecked(conf()->get(Config::xmrigNetworkTor).toBool()); - - // Receiving address - auto username = m_wallet->getCacheAttribute("feather.xmrig_username"); - if (!username.isEmpty()) { - ui->lineEdit_address->setText(username); - } - connect(ui->lineEdit_address, &QLineEdit::textChanged, [=]() { - m_wallet->setCacheAttribute("feather.xmrig_username", ui->lineEdit_address->text()); - }); - connect(ui->btn_fillPrimaryAddress, &QPushButton::clicked, this, &XMRigWidget::onUsePrimaryAddressClicked); - - // Password - auto password = m_wallet->getCacheAttribute("feather.xmrig_password"); - ui->lineEdit_password->setText(password); - connect(ui->lineEdit_password, &QLineEdit::textChanged, [=]() { - m_wallet->setCacheAttribute("feather.xmrig_password", ui->lineEdit_password->text()); - }); - - // [Status] tab - connect(ui->btn_start, &QPushButton::clicked, this, &XMRigWidget::onStartClicked); - connect(ui->btn_stop, &QPushButton::clicked, this, &XMRigWidget::onStopClicked); - connect(ui->btn_clear, &QPushButton::clicked, this, &XMRigWidget::onClearClicked); - - ui->btn_stop->setEnabled(false); - ui->check_autoscroll->setChecked(true); - ui->label_status->setTextInteractionFlags(Qt::TextSelectableByMouse); - ui->label_status->hide(); - - this->printConsoleInfo(); - - connect(windowManager(), &WindowManager::websocketStatusChanged, this, &XMRigWidget::setDownloadsTabEnabled); - connect(websocketNotifier(), &WebsocketNotifier::dataReceived, this, [this](const QString &type, const QJsonValue &json) { - if (type == "xmrig") { - QJsonObject xmrig_data = json.toObject(); - this->onDownloads(xmrig_data); - } - }); -} - -bool XMRigWidget::isMining() { - return m_isMining; -} - -void XMRigWidget::setDownloadsTabEnabled(bool enabled) { - ui->tabWidget->setTabVisible(2, enabled); -} - -void XMRigWidget::onWalletClosed() { - this->onStopClicked(); -} - -void XMRigWidget::onThreadsValueChanged(int threads) { - conf()->set(Config::xmrigThreads, threads); - ui->label_threads->setText(QString("CPU threads: %1").arg(threads)); -} - -void XMRigWidget::onPoolChanged(const QString &pool) { - if (!pool.isEmpty()) { - conf()->set(Config::xmrigPool, pool); - } -} - -void XMRigWidget::onXMRigElevationChanged(bool elevated) { - conf()->set(Config::xmrigElevated, elevated); -} - -void XMRigWidget::onBrowseClicked() { - QString fileName = QFileDialog::getOpenFileName(this, "Path to XMRig executable", QDir::homePath()); - if (fileName.isEmpty()) { - return; - } - conf()->set(Config::xmrigPath, fileName); - ui->lineEdit_path->setText(fileName); -} - -void XMRigWidget::onClearClicked() { - ui->console->clear(); -} - -void XMRigWidget::onUsePrimaryAddressClicked() { - ui->lineEdit_address->setText(m_wallet->address(0, 0)); -} - -void XMRigWidget::onStartClicked() { - QString xmrigPath = conf()->get(Config::xmrigPath).toString(); - if (!this->checkXMRigPath()) { - return; - } - - QString address = [this](){ - if (ui->combo_miningMode->currentIndex() == Config::MiningMode::Pool) { - return conf()->get(Config::xmrigPool).toString(); - } else { - return ui->lineEdit_solo->text().trimmed(); - } - }(); - if (address.isEmpty()) { - ui->console->appendPlainText("No pool or node address set. Please configure on the Settings tab."); - return; - } - - // username is receiving address usually - auto username = m_wallet->getCacheAttribute("feather.xmrig_username"); - auto password = m_wallet->getCacheAttribute("feather.xmrig_password"); - - if (username.isEmpty()) { - ui->console->appendPlainText("Please specify a receiving address on the Settings screen."); - return; - } - - int threads = ui->threadSlider->value(); - bool solo = (ui->combo_miningMode->currentIndex() == Config::MiningMode::Solo); - QStringList extraOptions = ui->lineEdit_extraOptions->text().split(" "); - - m_XMRig->start(xmrigPath, threads, address, username, password, ui->relayTor->isChecked(), ui->check_tls->isChecked(), - ui->radio_elevateYes->isChecked(), solo, extraOptions); -} - -void XMRigWidget::onStopClicked() { - m_XMRig->stop(); -} - -void XMRigWidget::onProcessOutput(const QByteArray &data) { - auto output = Utils::barrayToString(data); - if(output.endsWith("\n")) - output = output.trimmed(); - - ui->console->appendPlainText(output); - - if(ui->check_autoscroll->isChecked()) - ui->console->verticalScrollBar()->setValue(ui->console->verticalScrollBar()->maximum()); -} - -void XMRigWidget::onProcessError(const QString &msg) { - ui->console->appendPlainText("\n" + msg); - ui->btn_start->setEnabled(true); - ui->btn_stop->setEnabled(false); - this->setMiningStopped(); -} - -void XMRigWidget::onHashrate(const QString &hashrate) { - ui->label_status->show(); - ui->label_status->setText(QString("Mining at %1").arg(hashrate)); -} - -void XMRigWidget::onDownloads(const QJsonObject &data) { - // For the downloads table we'll manually update the table - // with items once, as opposed to creating a class in - // src/models/. Saves effort; full-blown model - // is unnecessary in this case. - - m_model->clear(); - m_urls.clear(); - - auto version = data.value("version").toString(); - ui->label_latest_version->setText(QString("Latest version: %1").arg(version)); - QJsonObject assets = data.value("assets").toObject(); - - const auto _linux = assets.value("linux").toArray(); - const auto macos = assets.value("macos").toArray(); - const auto windows = assets.value("windows").toArray(); - - auto info = QSysInfo::productType(); - QJsonArray *os_assets; - if(info == "osx") { - os_assets = const_cast(&macos); - } else if (info == "windows") { - os_assets = const_cast(&windows); - } else { - // assume linux - os_assets = const_cast(&_linux); - } - - int i = 0; - for(const auto &entry: *os_assets) { - auto _obj = entry.toObject(); - auto _name = _obj.value("name").toString(); - auto _url = _obj.value("url").toString(); - auto _created_at = _obj.value("created_at").toString(); - - m_urls.append(_url); - auto download_count = _obj.value("download_count").toInt(); - - m_model->setItem(i, 0, Utils::qStandardItem(_name)); - m_model->setItem(i, 1, Utils::qStandardItem(_created_at)); - m_model->setItem(i, 2, Utils::qStandardItem(QString::number(download_count))); - i++; - } - - m_model->setHeaderData(0, Qt::Horizontal, tr("Filename"), Qt::DisplayRole); - m_model->setHeaderData(1, Qt::Horizontal, tr("Date"), Qt::DisplayRole); - m_model->setHeaderData(2, Qt::Horizontal, tr("Downloads"), Qt::DisplayRole); - - ui->tableView->verticalHeader()->setVisible(false); - ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); - ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); - ui->tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); - ui->tableView->setColumnWidth(2, 100); -} - -void XMRigWidget::showContextMenu(const QPoint &pos) { - QModelIndex index = ui->tableView->indexAt(pos); - if (!index.isValid()) { - return; - } - m_contextMenu->exec(ui->tableView->viewport()->mapToGlobal(pos)); -} - -void XMRigWidget::updatePools() { - QStringList pools = conf()->get(Config::pools).toStringList(); - if (pools.isEmpty()) { - pools = m_defaultPools; - conf()->set(Config::pools, pools); - } - ui->combo_pools->clear(); - ui->combo_pools->insertItems(0, pools); - - QString preferredPool = conf()->get(Config::xmrigPool).toString(); - if (pools.contains(preferredPool)) { - ui->combo_pools->setCurrentIndex(pools.indexOf(preferredPool)); - } else { - preferredPool = pools.at(0); - conf()->set(Config::xmrigPool, preferredPool); - } -} - -void XMRigWidget::printConsoleInfo() { - ui->console->appendPlainText(QString("Detected %1 CPU threads.").arg(QThread::idealThreadCount())); - if (this->checkXMRigPath()) { - QString path = conf()->get(Config::xmrigPath).toString(); - ui->console->appendPlainText(QString("XMRig path set to %1").arg(path)); - } -} - -void XMRigWidget::onMiningModeChanged(int mode) { - conf()->set(Config::miningMode, mode); - - if (mode == Config::MiningMode::Pool) { - ui->poolFrame->show(); - ui->soloFrame->hide(); - ui->label_poolNodeAddress->setText("Pool address:"); - ui->check_tls->setChecked(true); - } else { // Solo mining - ui->poolFrame->hide(); - ui->soloFrame->show(); - ui->label_poolNodeAddress->setText("Node address:"); - ui->check_tls->setChecked(false); - } -} - -void XMRigWidget::onNetworkTLSToggled(bool checked) { - conf()->set(Config::xmrigNetworkTLS, checked); -} - -void XMRigWidget::onNetworkTorToggled(bool checked) { - conf()->set(Config::xmrigNetworkTor, checked); -} - -void XMRigWidget::onXMRigStateChanged(QProcess::ProcessState state) { - if (state == QProcess::ProcessState::Starting) { - ui->btn_start->setEnabled(false); - ui->btn_stop->setEnabled(false); - this->setMiningStarted(); - } - else if (state == QProcess::ProcessState::Running) { - ui->btn_start->setEnabled(false); - ui->btn_stop->setEnabled(true); - this->setMiningStarted(); - } - else if (state == QProcess::ProcessState::NotRunning) { - ui->btn_start->setEnabled(true); // todo - ui->btn_stop->setEnabled(false); - ui->label_status->hide(); - this->setMiningStopped(); - } -} - -void XMRigWidget::setMiningStopped() { - m_isMining = false; - emit miningEnded(); -} - -void XMRigWidget::setMiningStarted() { - m_isMining = true; - emit miningStarted(); -} - -bool XMRigWidget::checkXMRigPath() { - QString path = conf()->get(Config::xmrigPath).toString(); - - if (path.isEmpty()) { - ui->console->appendPlainText("No XMRig executable is set. Please configure on the Settings tab."); - return false; - } else if (!Utils::fileExists(path)) { - ui->console->appendPlainText("Invalid path to XMRig executable detected. Please reconfigure on the Settings tab."); - return false; - } else { - return true; - } -} - -void XMRigWidget::linkClicked() { - QModelIndex index = ui->tableView->currentIndex(); - auto download_link = m_urls.at(index.row()); - Utils::externalLinkWarning(this, download_link); -} - -QStandardItemModel *XMRigWidget::model() { - return m_model; -} - -XMRigWidget::~XMRigWidget() = default; \ No newline at end of file diff --git a/src/plugins/xmrig/XMRigWidget.h b/src/plugins/xmrig/XMRigWidget.h deleted file mode 100644 index 3e5ed5c8..00000000 --- a/src/plugins/xmrig/XMRigWidget.h +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: BSD-3-Clause -// SPDX-FileCopyrightText: The Monero Project - -#ifndef FEATHER_XMRIGWIDGET_H -#define FEATHER_XMRIGWIDGET_H - -#include -#include -#include -#include - -#include "xmrig.h" -#include "utils/config.h" -#include "libwalletqt/Wallet.h" - -namespace Ui { - class XMRigWidget; -} - -class XMRigWidget : public QWidget -{ - Q_OBJECT - -public: - explicit XMRigWidget(Wallet *wallet, QWidget *parent = nullptr); - ~XMRigWidget() override; - QStandardItemModel *model(); - - bool isMining(); - void setDownloadsTabEnabled(bool enabled); - -public slots: - void onWalletClosed(); - void onStartClicked(); - void onStopClicked(); - void onClearClicked(); - void onUsePrimaryAddressClicked(); - void onDownloads(const QJsonObject &data); - void linkClicked(); - void onProcessError(const QString &msg); - void onProcessOutput(const QByteArray &msg); - void onHashrate(const QString &hashrate); - void onMiningModeChanged(int mode); - void onNetworkTLSToggled(bool checked); - void onNetworkTorToggled(bool checked); - void onXMRigStateChanged(QProcess::ProcessState state); - -private slots: - void onBrowseClicked(); - void onThreadsValueChanged(int date); - void onPoolChanged(const QString &pool); - void onXMRigElevationChanged(bool elevated); - -signals: - void miningStarted(); - void miningEnded(); - -private: - void showContextMenu(const QPoint &pos); - void updatePools(); - void printConsoleInfo(); - void setMiningStopped(); - void setMiningStarted(); - bool checkXMRigPath(); - - QScopedPointer ui; - Wallet *m_wallet; - XmRig *m_XMRig; - QStandardItemModel *m_model; - QMenu *m_contextMenu; - - bool m_isMining = false; - QStringList m_urls; - QStringList m_defaultPools{"pool.xmr.pt:9000", "pool.supportxmr.com:9000", "mine.xmrpool.net:443", "xmrpool.eu:9999", "xmr-eu1.nanopool.org:14433","monerohash.com:9999"}; -}; - -#endif // FEATHER_XMRWIDGET_H diff --git a/src/plugins/xmrig/XMRigWidget.ui b/src/plugins/xmrig/XMRigWidget.ui deleted file mode 100644 index 9acf10b0..00000000 --- a/src/plugins/xmrig/XMRigWidget.ui +++ /dev/null @@ -1,533 +0,0 @@ - - - XMRigWidget - - - - 0 - 0 - 1329 - 540 - - - - Form - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 1 - - - - Status - - - - - - QFrame::Shape::NoFrame - - - QFrame::Shadow::Plain - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - true - - - - - - - - - Clear - - - - - - - auto-scroll - - - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - Mining at - - - - - - - Stop - - - - - - - Start mining - - - - - - - - - - - - - Settings - - - - - - QFrame::Shape::StyledPanel - - - QFrame::Shadow::Raised - - - - - - - - - - - - - XMRig executable: - - - - - - - - - /path/to/xmrig - - - - - - - Browse - - - - - - - - - Run as admin/root: - - - - - - - - - Yes - - - - - - - No - - - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - - - CPU threads: - - - - - - - Qt::Orientation::Horizontal - - - - - - - Mining mode: - - - - - - - - - - Pool mining - - - - - Solo mining - - - - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - - - Pool/node address: - - - - - - - - - QFrame::Shape::NoFrame - - - QFrame::Shadow::Plain - - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - - - - Configure - - - - - - - Qt::Orientation::Horizontal - - - - 414 - 20 - - - - - - - - - - - QFrame::Shape::NoFrame - - - QFrame::Shadow::Plain - - - - 0 - - - 0 - - - 0 - - - - - 127.0.0.1:18081 - - - - - - - Qt::Orientation::Horizontal - - - - 173 - 20 - - - - - - - - - - - - - Network settings: - - - - - - - - - Secure connection (TLS) - - - - - - - Connect via Tor - - - - - - - Qt::Orientation::Horizontal - - - - 40 - 20 - - - - - - - - - - Receiving address: - - - - - - - - - - - - Use primary address - - - - - - - - - Password (optional): - - - - - - - - - - Extra command-line options: - - - - - - - - - - - - - - - - Qt::Orientation::Vertical - - - - 20 - 0 - - - - - - - - - Downloads - - - - - - - - Latest version: - - - - - - - false - - - (right-click to download) - - - Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter - - - - - - - - - Qt::ContextMenuPolicy::CustomContextMenu - - - QAbstractItemView::EditTrigger::NoEditTriggers - - - QAbstractItemView::SelectionMode::SingleSelection - - - QAbstractItemView::SelectionBehavior::SelectRows - - - false - - - false - - - - - - - - - - - - InfoFrame - QFrame -
components.h
- 1 -
-
- - - - linkClicked() - -
diff --git a/src/plugins/xmrig/xmrig.cpp b/src/plugins/xmrig/xmrig.cpp deleted file mode 100644 index 7070c4b5..00000000 --- a/src/plugins/xmrig/xmrig.cpp +++ /dev/null @@ -1,129 +0,0 @@ -// SPDX-License-Identifier: BSD-3-Clause -// SPDX-FileCopyrightText: The Monero Project - -#include -#include - -#include "utils/config.h" -#include "utils/Utils.h" -#include "xmrig.h" -#include "utils/TorManager.h" - -XmRig::XmRig(const QString &configDir, QObject *parent) - : QObject(parent) - , m_process(new QProcess(this)) -{ - m_process->setProcessChannelMode(QProcess::MergedChannels); - connect(m_process, &QProcess::readyReadStandardOutput, this, &XmRig::handleProcessOutput); - connect(m_process, &QProcess::errorOccurred, this, &XmRig::handleProcessError); - connect(m_process, &QProcess::stateChanged, this, &XmRig::onStateChanged); -} - -void XmRig::stop() { - qDebug() << m_process->processId(); - if (m_process->state() == QProcess::Running) { -#if defined(Q_OS_WIN) - m_process->kill(); // https://doc.qt.io/qt-5/qprocess.html#terminate -#elif defined(Q_OS_LINUX) - if (m_elevated) { - m_killProcess.start("pkexec", QStringList() << "kill" << QString::number(m_process->processId())); - return; - } -#endif - m_process->terminate(); - } -} - -void XmRig::start(const QString &path, int threads, const QString &address, const QString &username, - const QString &password, bool tor, bool tls, bool elevated, bool solo, const QStringList &extraOptions) -{ - m_elevated = elevated; - - auto state = m_process->state(); - if (state == QProcess::ProcessState::Running || state == QProcess::ProcessState::Starting) { - emit error("Can't start XMRig, already running or starting"); - return; - } - - if (path.isEmpty()) { - emit error("XmRig->Start path parameter missing."); - return; - } - - if (!Utils::fileExists(path)) { - emit error(QString("Path to XMRig binary invalid; file does not exist: %1").arg(path)); - return; - } - - QStringList arguments; - if (m_elevated) { - arguments << path; - } - arguments << "-o" << address; - arguments << "-u" << username; - if (!password.isEmpty()) { - arguments << "-p" << password; - } - arguments << "--no-color"; - arguments << "-t" << QString::number(threads); - if (tor) { - QString host = conf()->get(Config::socks5Host).toString(); - QString port = conf()->get(Config::socks5Port).toString(); - if (!torManager()->isLocalTor()) { - host = torManager()->featherTorHost; - port = QString::number(torManager()->featherTorPort); - } - arguments << "-x" << QString("%1:%2").arg(host, port); - } - if (tls) { - arguments << "--tls"; - } - if (solo) { - arguments << "--daemon"; - } - arguments += extraOptions; - - QString cmd = QString("%1 %2").arg(path, arguments.join(" ")); - emit output(cmd.toUtf8()); - - if (m_elevated) { - m_process->start("pkexec", arguments); - } else { - m_process->start(path, arguments); - } -} - -void XmRig::onStateChanged(QProcess::ProcessState state) { - emit stateChanged(state); - - if (state == QProcess::ProcessState::Running) { - emit output("XMRig started"); - } - - else if (state == QProcess::ProcessState::NotRunning) { - emit output("XMRig stopped"); - } -} - -void XmRig::handleProcessOutput() { - QByteArray _output = m_process->readAllStandardOutput(); - if(_output.contains("miner") && _output.contains("speed")) { - // detect hashrate - auto str = Utils::barrayToString(_output); - auto spl = str.mid(str.indexOf("speed")).split(" "); - auto rate = spl.at(2) + "H/s"; - qDebug() << "mining hashrate: " << rate; - emit hashrate(rate); - } - - emit output(_output); -} - -void XmRig::handleProcessError(QProcess::ProcessError err) { - if (err == QProcess::ProcessError::Crashed) - emit error("XMRig crashed or killed"); - else if (err == QProcess::ProcessError::FailedToStart) { - auto path = conf()->get(Config::xmrigPath).toString(); - emit error(QString("XMRig binary failed to start: %1").arg(path)); - } -} diff --git a/src/plugins/xmrig/xmrig.h b/src/plugins/xmrig/xmrig.h deleted file mode 100644 index 244f0d3c..00000000 --- a/src/plugins/xmrig/xmrig.h +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: BSD-3-Clause -// SPDX-FileCopyrightText: The Monero Project - -#ifndef FEATHER_XMRIG_H -#define FEATHER_XMRIG_H - -#include - -class XmRig : public QObject -{ -Q_OBJECT - -public: - explicit XmRig(const QString &configDir, QObject *parent = nullptr); - - void start(const QString &path, int threads, const QString &address, const QString &username, const QString &password, bool tor = false, bool tls = true, bool elevated = false, bool solo = false, const QStringList &extraOptions = {}); - void stop(); - -signals: - void error(const QString &msg); - void output(const QByteArray &data); - void hashrate(const QString &rate); - void stateChanged(QProcess::ProcessState state); - -private slots: - void onStateChanged(QProcess::ProcessState); - void handleProcessOutput(); - void handleProcessError(QProcess::ProcessError error); - -private: - QProcess *m_process; - QProcess m_killProcess; - bool m_elevated; -}; - -#endif //FEATHER_XMRIG_H diff --git a/src/utils/config.cpp b/src/utils/config.cpp index 433891ab..77eec2be 100644 --- a/src/utils/config.cpp +++ b/src/utils/config.cpp @@ -60,17 +60,6 @@ static const QHash configStrings = { {Config::showChangeAddresses,{QS("showChangeAddresses"), false}}, {Config::showAddressIndex,{QS("showAddressIndex"), true}}, {Config::showAddressLabels,{QS("showAddressLabels"), true}}, - - // Mining - {Config::miningMode,{QS("miningMode"), Config::MiningMode::Pool}}, - {Config::xmrigPath,{QS("xmrigPath"), ""}}, - {Config::xmrigElevated,{QS("xmrigElevated"), false}}, - {Config::xmrigThreads,{QS("xmrigThreads"), 1}}, - {Config::xmrigPool,{QS("xmrigPool"), "pool.xmr.pt:9000"}}, - {Config::xmrigDaemon,{QS("xmrigDaemon"), "127.0.0.1:18081"}}, - {Config::xmrigNetworkTLS,{QS("xmrigNetworkTLS"), true}}, - {Config::xmrigNetworkTor,{QS("xmrigNetworkTor"), false}}, - {Config::pools,{QS("pools"), {}}}, // Settings {Config::lastSettingsPage, {QS("lastSettingsPage"), 0}}, @@ -135,7 +124,7 @@ static const QHash configStrings = { {Config::useLocalTor, {QS("useLocalTor"), false}}, {Config::initSyncThreshold, {QS("initSyncThreshold"), 360}}, - {Config::enabledPlugins, {QS("enabledPlugins"), QStringList{"tickers", "crowdfunding", "bounties", "revuo", "calc", "xmrig"}}}, + {Config::enabledPlugins, {QS("enabledPlugins"), QStringList{"tickers", "crowdfunding", "bounties", "revuo", "calc"}}}, {Config::restartRequired, {QS("restartRequired"), false}}, {Config::tickers, {QS("tickers"), QStringList{"XMR", "BTC", "XMR/BTC"}}}, diff --git a/src/utils/config.h b/src/utils/config.h index a4fc86c7..998254b5 100644 --- a/src/utils/config.h +++ b/src/utils/config.h @@ -60,17 +60,6 @@ public: showAddressIndex, showAddressLabels, - // Mining - miningMode, - xmrigPath, - xmrigElevated, - xmrigThreads, - xmrigPool, - xmrigDaemon, - xmrigNetworkTLS, - xmrigNetworkTor, - pools, - // Settings lastSettingsPage, -- 2.52.0