diff --git a/CHANGELOG.md b/CHANGELOG.md index 9efc2e0..dab0ab9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,21 +1,4 @@ # v1.1.2 -## Updates -* - -## Fixes -* - -## Bundled Versions -* [`P2Pool v3.0`](https://github.com/SChernykh/p2pool/releases/tag/v3.0) -* [`XMRig v6.18.1`](https://github.com/xmrig/xmrig/releases/tag/v6.18.1) - ---- - - -# v1.2.0 -## Updates -* - ## Fixes * diff --git a/Cargo.lock b/Cargo.lock index a40f2b3..bf95ca4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -91,9 +91,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" +checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" [[package]] name = "arboard" @@ -1271,9 +1271,9 @@ dependencies = [ [[package]] name = "exr" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb5f255b5980bb0c8cf676b675d1a99be40f316881444f44e0462eaf5df5ded" +checksum = "e8af5ef47e2ed89d23d0ecbc1b681b30390069de70260937877514377fc24feb" dependencies = [ "bit_field", "flume", @@ -1282,6 +1282,7 @@ dependencies = [ "miniz_oxide", "smallvec", "threadpool", + "zune-inflate", ] [[package]] @@ -1798,7 +1799,7 @@ dependencies = [ [[package]] name = "gupax" -version = "1.1.1" +version = "1.1.2" dependencies = [ "anyhow", "arti-client", @@ -1823,6 +1824,7 @@ dependencies = [ "regex", "rfd", "serde", + "serde-xml-rs", "serde_json", "static_vcruntime", "sudo", @@ -3026,9 +3028,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.50" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" +checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" dependencies = [ "unicode-ident", ] @@ -3434,6 +3436,18 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-xml-rs" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb3aa78ecda1ebc9ec9847d5d3aba7d618823446a049ba2491940506da6e2782" +dependencies = [ + "log", + "serde", + "thiserror", + "xml-rs", +] + [[package]] name = "serde_derive" version = "1.0.152" @@ -3456,9 +3470,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.91" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" +checksum = "7434af0dc1cbd59268aa98b4c22c131c0584d2232f6fb166efb993e2832e896a" dependencies = [ "itoa", "ryu", @@ -3646,6 +3660,12 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +[[package]] +name = "simd-adler32" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14a5df39617d7c8558154693a1bb8157a4aab8179209540cc0b10e5dc24e0b18" + [[package]] name = "simple_asn1" version = "0.6.2" @@ -5474,3 +5494,12 @@ dependencies = [ "libc", "pkg-config", ] + +[[package]] +name = "zune-inflate" +version = "0.2.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c473377c11c4a3ac6a2758f944cd336678e9c977aa0abf54f6450cf77e902d6d" +dependencies = [ + "simd-adler32", +] diff --git a/Cargo.toml b/Cargo.toml index 7648ace..18c5652 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gupax" -version = "1.2.0" +version = "1.1.2" authors = ["hinto-janaiyo <hinto.janaiyo@protonmail.com>"] description = "GUI for P2Pool+XMRig" documentation = "https://github.com/hinto-janaiyo/gupax" @@ -58,6 +58,7 @@ toml = { version = "0.5.9", features = ["preserve_order"] } tor-rtcompat = "0.7.0" walkdir = "2.3.2" zeroize = "1.5.7" +serde-xml-rs = "0.6.0" # Unix dependencies [target.'cfg(unix)'.dependencies] diff --git a/src/README.md b/src/README.md index bff647f..032d426 100644 --- a/src/README.md +++ b/src/README.md @@ -18,6 +18,7 @@ ## Structure | File/Folder | Purpose | |--------------|---------| +| benchmark.rs | Code for handling [XMRig's benchmark data](https://xmrig.com/docs/api/1/benchmark) | constants.rs | General constants used in Gupax | disk.rs | Code for writing to disk: `state.toml/node.toml/pool.toml`; This holds the structs for the [State] struct | ferris.rs | Cute crab bytes diff --git a/src/benchmark.rs b/src/benchmark.rs new file mode 100644 index 0000000..2bd3977 --- /dev/null +++ b/src/benchmark.rs @@ -0,0 +1,87 @@ +// Gupax - GUI Uniting P2Pool And XMRig +// +// Copyright (c) 2022 hinto-janaiyo +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <https://www.gnu.org/licenses/>. + +// This file contains backend code for handling XMRig's benchmark data: +// - HTTP(s) fetchs to [https://xmrig.com] +// - (De)serialization of JSON data +// - (De)serialization of CPU topology XML (./xmrig --export topology) + +use serde::{Serialize, Deserialize}; +use std::fmt::Write; + +// Input: Full [&str] of XMRig's [topology.xml] file +// Output: The CPU name formatted so it's usable as the endpoint, e.g: [AMD+Ryzen+9+5950X+16-Core+Processor] +fn cpu_name_from_xml(xml: &str) -> Option<String> { + // A minimal matching struct for the [CPUModel] <info> field in the XML file + #[derive(Debug, Serialize, Deserialize, PartialEq)] + struct Info { // <info [...] /> + name: String, // name="CPUModel" + value: String, // value="Ryzen ..." + } + + // Regex to find matching field + let regex = regex::Regex::new("\"CPUModel\"").unwrap(); + + for line in xml.lines() { + if !regex.is_match(&line) { continue } + + // If found, attempt to serialize XML proper + if let Ok(info) = serde_xml_rs::from_str::<Info>(&line) { + // Return early if empty + if info.value.is_empty() { + return None + } + // If serialized, turn whitespaces into '+' + let words: Vec<&str> = info.value.split_whitespace().collect(); + let last_word = words.len(); + let mut result = String::new(); + let mut n = 1; + for word in words.iter() { + match n == last_word { + false => write!(result, "{}+", word), + true => write!(result, "{}", word), + }; + n += 1; + } + return Some(result) + } + } + + // If loop didn't return early, return none + None +} + +//---------------------------------------------------------------------------------------------------- TESTS +#[cfg(test)] +mod test { + #[test] + fn get_cpu_from_xml() { + let string = +r#"<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE topology SYSTEM "hwloc2.dtd"> +<topology version="2.0"> + <object type="Machine" os_index="0" cpuset="0xffffffff" complete_cpuset="0xffffffff" allowed_cpuset="0xffffffff" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x00000001" gp_index="1"> + <info name="DMIBIOSVendor" value="American Megatrends International, LLC."/> + <info name="Backend" value="Linux"/> + <info name="LinuxCgroup" value="/"/> + <info name="OSName" value="Linux"/> + <info name="CPUModel" value="AMD Ryzen 9 5950X 16-Core Processor "/> + <info name="CPUStepping" value="0"/> +"#; + assert_eq!(crate::benchmark::cpu_name_from_xml(&string).unwrap(), "AMD+Ryzen+9+5950X+16-Core+Processor"); + } +} diff --git a/src/helper.rs b/src/helper.rs index 5dac7e5..d3e8f73 100644 --- a/src/helper.rs +++ b/src/helper.rs @@ -417,14 +417,15 @@ impl Helper { _ => (), } if !mini { p2pool_image.mini = "P2Pool Main".to_string(); } + let arg = if arg == "localhost" { "127.0.0.1" } else { arg }; args.push(arg.to_string()); last = arg; } // Else, build the argument } else { - let ip = if state.selected_ip == "localhost" { "127.0.0.1".to_string() } else { state.selected_ip.to_string() }; + let ip = if state.selected_ip == "localhost" { "127.0.0.1" } else { &state.selected_ip }; args.push("--wallet".to_string()); args.push(state.address.clone()); // Wallet - args.push("--host".to_string()); args.push(ip); // IP + args.push("--host".to_string()); args.push(ip.to_string()); // IP args.push("--rpc-port".to_string()); args.push(state.selected_rpc.to_string()); // RPC args.push("--zmq-port".to_string()); args.push(state.selected_zmq.to_string()); // ZMQ args.push("--loglevel".to_string()); args.push(state.log_level.to_string()); // Log Level @@ -799,9 +800,10 @@ impl Helper { // Else, build the argument } else { // XMRig doesn't understand [localhost] + let ip = if state.selected_ip == "localhost" || state.selected_ip.is_empty() { "127.0.0.1" } else { &state.selected_ip }; api_ip = if state.api_ip == "localhost" || state.api_ip.is_empty() { "127.0.0.1".to_string() } else { state.api_ip.to_string() }; api_port = if state.api_port.is_empty() { "18088".to_string() } else { state.api_port.to_string() }; - let url = format!("{}:{}", state.selected_ip, state.selected_port); // Combine IP:Port into one string + let url = format!("{}:{}", ip, state.selected_port); // Combine IP:Port into one string args.push("--user".to_string()); args.push(state.address.clone()); // Wallet args.push("--threads".to_string()); args.push(state.current_threads.to_string()); // Threads args.push("--rig-id".to_string()); args.push(state.selected_rig.to_string()); // Rig ID diff --git a/src/main.rs b/src/main.rs index 9e93a18..fc1b395 100644 --- a/src/main.rs +++ b/src/main.rs @@ -52,6 +52,7 @@ use std::{ // Sysinfo use sysinfo::SystemExt; // Modules +//mod benchmark; mod ferris; mod constants; mod node;