helper: map xmrig/p2pool JSON API key/values to structs for serde

This commit is contained in:
hinto-janaiyo 2022-12-01 23:13:53 -05:00
parent cb28d705b4
commit bfbe0ee969
No known key found for this signature in database
GPG key ID: B1C5A64B80691E45
3 changed files with 153 additions and 41 deletions

46
Cargo.lock generated
View file

@ -254,9 +254,9 @@ dependencies = [
[[package]]
name = "async-trait"
version = "0.1.58"
version = "0.1.59"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e805d94e6b5001b651426cf4cd446b1ab5f319d27bab5c644f61de0a804360c"
checksum = "31e6e93155431f3931513b243d371981bb2770112b370c82745a1d19d2f99364"
dependencies = [
"proc-macro2",
"quote",
@ -2728,9 +2728,9 @@ dependencies = [
[[package]]
name = "parking_lot_core"
version = "0.9.4"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0"
checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba"
dependencies = [
"cfg-if",
"libc",
@ -3359,18 +3359,18 @@ checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4"
[[package]]
name = "serde"
version = "1.0.147"
version = "1.0.148"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965"
checksum = "e53f64bb4ba0191d6d0676e1b141ca55047d83b74f5607e6d8eb88126c52c2dc"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.147"
version = "1.0.148"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852"
checksum = "a55492425aa53521babf6137309e7d34c20bbfbbfcfe2c7f3a047fd1f6b92c0c"
dependencies = [
"proc-macro2",
"quote",
@ -3442,9 +3442,9 @@ dependencies = [
[[package]]
name = "sha-1"
version = "0.10.0"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f"
checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c"
dependencies = [
"cfg-if",
"cpufeatures",
@ -3515,6 +3515,15 @@ dependencies = [
"dirs",
]
[[package]]
name = "signal-hook-registry"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
dependencies = [
"libc",
]
[[package]]
name = "signature"
version = "1.6.4"
@ -3675,9 +3684,9 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
[[package]]
name = "syn"
version = "1.0.103"
version = "1.0.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d"
checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908"
dependencies = [
"proc-macro2",
"quote",
@ -3930,6 +3939,7 @@ dependencies = [
"mio",
"num_cpus",
"pin-project-lite",
"signal-hook-registry",
"socket2",
"tokio-macros",
"winapi",
@ -3937,9 +3947,9 @@ dependencies = [
[[package]]
name = "tokio-macros"
version = "1.8.0"
version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484"
checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8"
dependencies = [
"proc-macro2",
"quote",
@ -5209,9 +5219,9 @@ dependencies = [
[[package]]
name = "zeroize_derive"
version = "1.3.2"
version = "1.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f8f187641dad4f680d25c4bfc4225b418165984179f26ca76ec4fb6441d3a17"
checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c"
dependencies = [
"proc-macro2",
"quote",
@ -5260,9 +5270,9 @@ dependencies = [
[[package]]
name = "zstd-sys"
version = "2.0.3+zstd.1.5.2"
version = "2.0.4+zstd.1.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44ccf97612ac95f3ccb89b2d7346b345e52f1c3019be4984f0455fb4ba991f8a"
checksum = "4fa202f2ef00074143e219d15b62ffc317d17cc33909feac471c044087cad7b0"
dependencies = [
"cc",
"libc",

View file

@ -45,7 +45,7 @@ serde = { version = "1.0.145", features = ["rc", "derive"] }
serde_json = "1.0"
tls-api = "0.9.0"
tls-api-native-tls = "0.9.0"
tokio = { version = "1.21.2", features = ["rt", "time", "macros"] }
tokio = { version = "1.21.2", features = ["rt", "time", "macros", "process"] }
toml = { version = "0.5.9", features = ["preserve_order"] }
tor-rtcompat = "0.7.0"
walkdir = "2.3.2"

View file

@ -48,14 +48,14 @@ use log::*;
//---------------------------------------------------------------------------------------------------- [Helper] Struct
// A meta struct holding all the data that gets processed in this thread
pub struct Helper {
instant: Instant, // Gupax start as an [Instant]
human_time: HumanTime, // Gupax uptime formatting for humans
p2pool: Process, // P2Pool process state
xmrig: Process, // XMRig process state
pub_api_p2pool: P2poolApi, // P2Pool API state
pub_api_xmrig: XmrigApi, // XMRig API state
// priv_api_p2pool:
// priv_api_xmrig:
pub instant: Instant, // Gupax start as an [Instant]
pub human_time: HumanTime, // Gupax uptime formatting for humans
pub p2pool: Process, // P2Pool process state
pub xmrig: Process, // XMRig process state
pub pub_api_p2pool: PubP2poolApi, // P2Pool API state (for GUI thread)
pub pub_api_xmrig: PubXmrigApi, // XMRig API state (for GUI thread)
priv_api_p2pool: PrivP2poolApi, // For "watchdog" thread
priv_api_xmrig: PrivXmrigApi, // For "watchdog" thread
}
// Impl found at the very bottom of this file.
@ -195,31 +195,131 @@ impl std::fmt::Display for HumanTime {
}
}
//---------------------------------------------------------------------------------------------------- [P2poolApi]
pub struct P2poolApi {
//---------------------------------------------------------------------------------------------------- Public P2Pool API
// GUI thread interfaces with this.
pub struct PubP2poolApi {
}
impl P2poolApi {
impl PubP2poolApi {
pub fn new() -> Self {
Self {
}
}
}
//---------------------------------------------------------------------------------------------------- [XmrigApi]
pub struct XmrigApi {
//---------------------------------------------------------------------------------------------------- Private P2Pool API
// This is the data the "watchdog" threads mutate.
// It matches directly to P2Pool's [local/stats] JSON API file (excluding a few stats).
// P2Pool seems to initialize all stats at 0 (or 0.0), so no [Option] wrapper seems needed.
#[derive(Debug, Serialize, Deserialize)]
struct PrivP2poolApi {
hashrate_15m: u128,
hashrate_1h: u128,
hashrate_24h: u128,
shares_found: u128,
average_effort: f64,
current_effort: f64,
connections: u16, // No one will have more than 65535 connections... right?
}
impl PrivP2poolApi {
fn new() -> Self {
Self {
hashrate_15m: 0,
hashrate_1h: 0,
hashrate_24h: 0,
shares_found: 0,
average_effort: 0.0,
current_effort: 0.0,
connections: 0,
}
}
}
//---------------------------------------------------------------------------------------------------- Public XMRig API
pub struct PubXmrigApi {
}
impl XmrigApi {
impl PubXmrigApi {
pub fn new() -> Self {
Self {
}
}
}
//---------------------------------------------------------------------------------------------------- Private XMRig API
// This matches to some JSON stats in the HTTP call [summary],
// e.g: [wget -qO- localhost:18085/1/summary].
// XMRig doesn't initialize stats at 0 (or 0.0) and instead opts for [null]
// which means some elements need to be wrapped in an [Option] or else serde will [panic!].
#[derive(Debug, Serialize, Deserialize)]
struct PrivXmrigApi {
worker_id: String,
resources: Resources,
connection: Connection,
hashrate: Hashrate,
}
impl PrivXmrigApi {
fn new() -> Self {
Self {
worker_id: String::new(),
resources: Resources::new(),
connection: Connection::new(),
hashrate: Hashrate::new(),
}
}
}
#[derive(Debug, Serialize, Deserialize)]
struct Resources {
load_average: [Option<f32>; 3],
}
impl Resources {
fn new() -> Self {
Self {
load_average: [Some(0.0), Some(0.0), Some(0.0)],
}
}
}
#[derive(Debug, Serialize, Deserialize)]
struct Connection {
pool: String,
ping: u32,
diff: u128,
accepted: u128,
rejected: u128,
}
impl Connection {
fn new() -> Self {
Self {
pool: String::new(),
ping: 0,
diff: 0,
accepted: 0,
rejected: 0,
}
}
}
#[derive(Debug, Serialize, Deserialize)]
struct Hashrate {
total: [Option<f32>; 3],
}
impl Hashrate {
fn new() -> Self {
Self {
total: [Some(0.0), Some(0.0), Some(0.0)],
}
}
}
//---------------------------------------------------------------------------------------------------- [Helper]
use tokio::io::{BufReader,AsyncBufReadExt};
impl Helper {
pub fn new(instant: std::time::Instant) -> Self {
Self {
@ -227,8 +327,10 @@ impl Helper {
human_time: HumanTime::into_human(instant.elapsed()),
p2pool: Process::new(ProcessName::P2pool, String::new(), PathBuf::new()),
xmrig: Process::new(ProcessName::Xmrig, String::new(), PathBuf::new()),
p2pool_api: P2poolApi::new(),
xmrig_api: XmrigApi::new(),
pub_api_p2pool: PubP2poolApi::new(),
pub_api_xmrig: PubXmrigApi::new(),
priv_api_p2pool: PrivP2poolApi::new(),
priv_api_xmrig: PrivXmrigApi::new(),
}
}
@ -264,13 +366,13 @@ impl Helper {
// [helper] = Actual Arc
// [h] = Temporary lock that gets dropped
// [jobs] = Vector of async jobs ready to go
#[tokio::main]
pub async fn helper(helper: Arc<Mutex<Self>>) {
// #[tokio::main]
pub fn helper(helper: Arc<Mutex<Self>>) {
// Begin loop
loop {
// 1. Create "jobs" vector holding async tasks
let jobs: Vec<tokio::task::JoinHandle<Result<(), anyhow::Error>>> = vec![];
// let jobs: Vec<tokio::task::JoinHandle<Result<(), anyhow::Error>>> = vec![];
// 2. Loop init timestamp
let start = Instant::now();
@ -303,9 +405,9 @@ impl Helper {
drop(h);
// 6. Execute all async tasks
for job in jobs {
job.await;
}
// for job in jobs {
// job.await;
// }
// 7. Set Gupax/P2Pool/XMRig uptime
let mut h = helper.lock().unwrap();