From 757bc7d7b953ca997aaa2897d79ddd4c37caa45a Mon Sep 17 00:00:00 2001 From: devhyper <57877914+devhyper@users.noreply.github.com> Date: Tue, 31 Jan 2023 18:23:20 -0800 Subject: [PATCH] p2pool: Restart monerod only when needed and with proper args --- main.qml | 6 +++ pages/Mining.qml | 47 +++++++++++++++++---- src/daemon/DaemonManager.cpp | 79 ++++++++++++++++++++++++++++++++++++ src/daemon/DaemonManager.h | 3 ++ 4 files changed, 127 insertions(+), 8 deletions(-) diff --git a/main.qml b/main.qml index b1e58663..390a9dfb 100644 --- a/main.qml +++ b/main.qml @@ -748,6 +748,12 @@ ApplicationWindow { currentWallet.startRefresh(); informationPopup.title = qsTr("Daemon failed to start") + translationManager.emptyString; informationPopup.text = error + ".\n\n" + qsTr("Please check your wallet and daemon log for errors. You can also try to start %1 manually.").arg((isWindows)? "monerod.exe" : "monerod") + if (middlePanel.advancedView.miningView.stopMiningEnabled == true) { + walletManager.stopMining() + p2poolManager.exit() + middlePanel.advancedView.miningView.update() + informationPopup.text += qsTr("\n\nExiting p2pool. Please check that port 18083 is available.") + translationManager.emptyString; + } informationPopup.icon = StandardIcon.Critical informationPopup.onCloseCallback = null informationPopup.open(); diff --git a/pages/Mining.qml b/pages/Mining.qml index e9ab1d07..01ca828d 100644 --- a/pages/Mining.qml +++ b/pages/Mining.qml @@ -41,7 +41,8 @@ Rectangle { property alias miningHeight: mainLayout.height property double currentHashRate: 0 property int threads: idealThreadCount / 2 - + property alias stopMiningEnabled: stopSoloMinerButton.enabled + property string args: "" ColumnLayout { id: mainLayout Layout.fillWidth: true @@ -293,11 +294,18 @@ Rectangle { var success; if (persistentSettings.allow_p2pool_mining) { if (p2poolManager.isInstalled()) { - if (persistentSettings.allowRemoteNodeMining) { + args = daemonManager.getArgs(persistentSettings.blockchainDataDir) //updates arguments + if (persistentSettings.allowRemoteNodeMining || (args.includes("--zmq-pub tcp://127.0.0.1:18083") || args.includes("--zmq-pub=tcp://127.0.0.1:18083")) && !args.includes("--no-zmq")) { startP2Pool() } else { - daemonManager.stopAsync(persistentSettings.nettype, persistentSettings.blockchainDataDir, startP2PoolLocal) + var underSystemd = daemonManager.checkUnderSystemd(); + if (underSystemd) { + miningError(qsTr("Monerod is managed by Systemd. Manually add --zmq-pub tcp://127.0.0.1:18083 to the unit file
") + translationManager.emptyString) + } + else { + daemonManager.stopAsync(persistentSettings.nettype, persistentSettings.blockchainDataDir, startP2PoolLocal) + } } } else { @@ -585,12 +593,35 @@ Rectangle { function startP2PoolLocal() { var noSync = false; - var customDaemonArgs = persistentSettings.daemonFlags.toLowerCase(); - var daemonArgs = "--zmq-pub " + "tcp://127.0.0.1:18083 " + "--disable-dns-checkpoints " - if (!customDaemonArgs.includes("--zmq-pub") && !customDaemonArgs.includes("--disable-dns-checkpoints") && !customDaemonArgs.includes("--no-zmq")) { - daemonArgs = daemonArgs + customDaemonArgs; + //these args will be deleted because DaemonManager::start will re-add them later. + //--no-zmq must be deleted. removing '--zmq-pub=tcp...' lets us blindly add '--zmq-pub tcp...' later without risking duplication. + var defaultArgs = ["--detach","--data-dir","--bootstrap-daemon-address","--prune-blockchain","--no-sync","--check-updates","--non-interactive","--max-concurrency","--no-zmq","--zmq-pub=tcp://127.0.0.1:18083"] + var customDaemonArgsArray = args.split(' '); + var flag = ""; + var allArgs = []; + var p2poolArgs = ["--zmq-pub tcp://127.0.0.1:18083"]; + //create an array (allArgs) of ['--arg value','--arg2','--arg3'] + for (let i = 0; i < customDaemonArgsArray.length; i++) { + if(!customDaemonArgsArray[i].startsWith("--")) { + flag += " " + customDaemonArgsArray[i] + } else { + if(flag){ + allArgs.push(flag) + } + flag = customDaemonArgsArray[i] + } } - var success = daemonManager.start(daemonArgs, persistentSettings.nettype, persistentSettings.blockchainDataDir, persistentSettings.bootstrapNodeAddress, noSync, persistentSettings.pruneBlockchain) + allArgs.push(flag) + //pop from allArgs if value is inside the deleteme array (defaultArgs) +allArgs = allArgs.filter( ( el ) => !defaultArgs.includes( el.split(" ")[0] ) ) + //append required p2pool flags + for (let i = 0; i < p2poolArgs.length; i++) { + if(!allArgs.includes(p2poolArgs[i])) { + allArgs.push(p2poolArgs[i]) + continue + } + } + var success = daemonManager.start(allArgs.join(" "), persistentSettings.nettype, persistentSettings.blockchainDataDir, persistentSettings.bootstrapNodeAddress, noSync, persistentSettings.pruneBlockchain) if (success) { startP2Pool() } diff --git a/src/daemon/DaemonManager.cpp b/src/daemon/DaemonManager.cpp index 6a5a8233..f52ab42a 100644 --- a/src/daemon/DaemonManager.cpp +++ b/src/daemon/DaemonManager.cpp @@ -342,6 +342,85 @@ bool DaemonManager::checkLmdbExists(QString datadir) { return validateDataDir(datadir).value("lmdbExists").value(); } +bool DaemonManager::checkUnderSystemd() { + #ifdef Q_OS_LINUX + QProcess p; + QStringList args; + args << "monerod"; + p.setProgram("pgrep"); + p.setArguments(args); + p.start(); + p.waitForFinished(); + QString pid = p.readAllStandardOutput().trimmed(); + if (pid.isEmpty()) { + return false; + } + args.clear(); + + args << "-c"; + args << "ps -eo pid,cgroup | grep " + pid + " | grep -q .service$"; + p.setProgram("sh"); + p.setArguments(args); + p.start(); + p.waitForFinished(); + if (p.exitCode() == 0) { + return true; + } + #endif + return false; +} + +QString DaemonManager::getArgs(const QString &dataDir) { + if (!running(NetworkType::MAINNET, dataDir)) { + return args; + } + QProcess p; + QStringList tempArgs; + #ifdef Q_OS_WIN + //powershell + tempArgs << "Get-CimInstance Win32_Process -Filter \"name = 'monerod.exe'\" | select -ExpandProperty CommandLine "; + p.setProgram("powershell"); + p.setArguments(tempArgs); + p.start(); + p.waitForFinished(); + args = p.readAllStandardOutput().simplified().trimmed(); + + #elif defined(Q_OS_UNIX) + //pgrep + tempArgs << "monerod"; + p.setProgram("pgrep"); + p.setArguments(tempArgs); + p.start(); + p.waitForFinished(); + QString pid = p.readAllStandardOutput().trimmed(); + if (pid.isEmpty()) { + return args; + } + + tempArgs.clear(); + + //ps + tempArgs << "-o"; + tempArgs << "args="; + tempArgs << "-fp"; + tempArgs << pid; + p.setProgram("ps"); + p.setArguments(tempArgs); + p.start(); + p.waitForFinished(); + args = p.readAllStandardOutput().trimmed(); + + #endif + if (args.contains("--")) { + int index = args.indexOf("--"); + args.remove(0, index); + } + else { + args = ""; + } + return args; +} + DaemonManager::DaemonManager(QObject *parent) : QObject(parent) , m_scheduler(this) diff --git a/src/daemon/DaemonManager.h b/src/daemon/DaemonManager.h index 5a48a489..6a3d0fe1 100644 --- a/src/daemon/DaemonManager.h +++ b/src/daemon/DaemonManager.h @@ -58,6 +58,8 @@ public: Q_INVOKABLE void exit(); Q_INVOKABLE QVariantMap validateDataDir(const QString &dataDir) const; Q_INVOKABLE bool checkLmdbExists(QString datadir); + Q_INVOKABLE QString getArgs(const QString &dataDir); + Q_INVOKABLE bool checkUnderSystemd(); private: @@ -82,6 +84,7 @@ private: QString m_monerod; bool m_app_exit = false; bool m_noSync = false; + QString args = ""; mutable FutureScheduler m_scheduler; };