diff --git a/Cargo.lock b/Cargo.lock index edab9d8..c4e24c4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -901,9 +901,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" dependencies = [ "android-tzdata", "iana-time-zone", @@ -2373,6 +2373,7 @@ dependencies = [ "arti-hyper", "benri", "bytes", + "chrono", "derive_more", "dirs", "eframe", diff --git a/Cargo.toml b/Cargo.toml index 1c359a4..7abdb0c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -77,6 +77,7 @@ strip-ansi-escapes = "0.2.0" derive_more = {version="0.99.17", default-features=false, features=["display"]} serde-this-or-that = "0.4.2" readable = "0.16" +chrono = {version="0.4.35", default-features=false, features=["clock", "std"]} # Unix dependencies [target.'cfg(unix)'.dependencies] tar = "0.4.40" diff --git a/TODO_XMRvsBeast.md b/TODO_XMRvsBeast.md index 89fb238..1777ea8 100644 --- a/TODO_XMRvsBeast.md +++ b/TODO_XMRvsBeast.md @@ -16,6 +16,7 @@ - [x] state of XvB process - [x] selected XvB node - [x] algorithm decisions info + - [x] timestamp - [x] private stats - [x] from XvB API (fails, average 1h and 24h) - [x] round type in diff --git a/src/helper/xvb.rs b/src/helper/xvb.rs index 6a46c3c..0a39efd 100644 --- a/src/helper/xvb.rs +++ b/src/helper/xvb.rs @@ -146,28 +146,17 @@ impl Helper { { // send to console: token non existent for address on XvB server warn!("Xvb | Start ... Partially failed because token and associated address are not existent on XvB server: {}\n", err); - // output the error to console - if let Err(e) = writeln!( - lock!(gui_api).output, - "Token and associated address are not valid on XvB API.\nCheck if you are registered.\nError: {}\n", - err, - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console(&gui_api, &format!("Token and associated address are not valid on XvB API.\nCheck if you are registered.\nError: {}", err)); lock!(process).state = ProcessState::NotMining; } info!("XvB | verify p2pool node"); if !lock!(process_p2pool).is_alive() { // send to console: p2pool process is not running warn!("Xvb | Start ... Partially failed because P2pool instance is not running."); - // output the error to console - if let Err(e) = writeln!( - lock!(gui_api).output, - "P2pool process is not running.\nCheck the P2pool Tab\n", - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } - + output_console( + &gui_api, + "P2pool process is not running.\nCheck the P2pool Tab", + ); lock!(process).state = ProcessState::Syncing; } @@ -175,24 +164,18 @@ impl Helper { // send to console: p2pool process is not running warn!("Xvb | Start ... Partially failed because Xmrig instance is not running."); // output the error to console - if let Err(e) = writeln!( - lock!(gui_api).output, - "XMRig process is not running.\nCheck the Xmrig Tab.\n", - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } - + output_console( + &gui_api, + "XMRig process is not running.\nCheck the Xmrig Tab.", + ); lock!(process).state = ProcessState::Syncing; } info!("XvB | print to console state"); if lock!(process).state != ProcessState::Middle { - if let Err(e) = writeln!( - lock!(gui_api).output, - "XvB partially started.\n{}\n", - XVB_PUBLIC_ONLY, - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console( + &gui_api, + &["XvB partially started.\n", XVB_PUBLIC_ONLY].concat(), + ); } else { info!("XvB Fully started"); lock!(process).state = ProcessState::Alive; @@ -206,12 +189,10 @@ impl Helper { XvbNode::update_fastest_node(&client_http_c, &pub_api_c, &gui_api_c, &process_c) .await; }); - if let Err(e) = writeln!( - lock!(gui_api).output, - "Algorithm of distribution of HR will wait 15 minutes for Xmrig average HR data.\n" - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console( + &gui_api, + "Algorithm of distribution of HR will wait 15 minutes for Xmrig average HR data.", + ); } // see how many shares are found at p2pool node only if XvB is started successfully. If it wasn't, maybe P2pool is node not running. let mut old_shares = if lock!(process).state == ProcessState::Alive { @@ -243,12 +224,10 @@ impl Helper { *lock!(pub_api) = PubXvbApi::new(); *lock!(gui_api) = PubXvbApi::new(); lock!(process).state = ProcessState::Alive; - if let Err(e) = writeln!( - lock!(gui_api).output, - "XvB is now started because p2pool and xmrig came online.\n", - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console( + &gui_api, + "XvB is now started because p2pool and xmrig came online.", + ); } } else { // verify if the state is changing because p2pool is not alive anymore. @@ -257,12 +236,10 @@ impl Helper { *lock!(pub_api) = PubXvbApi::new(); *lock!(gui_api) = PubXvbApi::new(); lock!(process).state = ProcessState::Syncing; - if let Err(e) = writeln!( - lock!(gui_api).output, + output_console( + &gui_api, "XvB is now partially stopped because p2pool node or xmrig came offline.\nCheck P2pool and Xmrig Tabs", - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + ); } } } @@ -300,13 +277,13 @@ impl Helper { XVB_URL_PUBLIC_API, err ); // output the error to console - if let Err(e) = writeln!( - lock!(gui_api).output, - "Failure to retrieve public stats from {}", - XVB_URL_PUBLIC_API - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console( + &gui_api, + &format!( + "Failure to retrieve public stats from {}", + XVB_URL_PUBLIC_API + ), + ); lock!(process).state = ProcessState::Failed; break; } @@ -328,13 +305,7 @@ impl Helper { Ok(data) => data, Err(e) => { warn!("XvB Watchdog | Data provided from private API is not deserializ-able.Error: {}", e); - // output the error to console - if let Err(e) = writeln!( - lock!(gui_api).output, - "XvB Watchdog | Data provided from private API is not deserializ-able.Error: {}", e - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console(&gui_api, &format!("XvB Watchdog | Data provided from private API is not deserializ-able.Error: {}", e)); break; } }; @@ -345,14 +316,10 @@ impl Helper { "XvB Watchdog | Could not send HTTP private API request to: {}\n:{}", XVB_URL, err ); - // output the error to console - if let Err(e) = writeln!( - lock!(gui_api).output, - "Failure to retrieve private stats from {}", - XVB_URL - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console( + &gui_api, + &format!("Failure to retrieve private stats from {}", XVB_URL), + ); lock!(process).state = ProcessState::Failed; break; } @@ -436,21 +403,15 @@ impl Helper { ) .await { - // show to console error about updating xmrig config - if let Err(e) = writeln!( - lock!(gui_api_c).output, - "Failure to update xmrig config with HTTP API.\nError: {}", - err - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console( + &gui_api_c, + &format!( + "Failure to update xmrig config with HTTP API.\nError: {}", + err + ), + ); } else { - if let Err(e) = writeln!( - lock!(gui_api_c).output, - "Algorithm of distribution HR started for the next ten minutes.\nMining on local p2pool node.", - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console(&gui_api_c, "Algorithm of distribution HR started for the next ten minutes.\nMining on local p2pool node."); } }); @@ -459,24 +420,20 @@ impl Helper { info!("Xvb Process | Algorithm share is in current window"); // calcul minimum HR - if let Err(e) = writeln!( - lock!(gui_api).output, + output_console( + &gui_api, "At least one share is in current PPLNS window.", - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + ); let hr = lock!(gui_api_xmrig).hashrate_raw_15m; let min_hr = Helper::minimum_hashrate_share( lock!(gui_api_p2pool).p2pool_difficulty_u64, state_p2pool.mini, ); info!("Xvb Process | hr {}, min_hr: {} ", hr, min_hr); - if let Err(e) = writeln!( - lock!(gui_api).output, - "You'r HR from Xmrig is {}, minimum required HR to keep a share in PPLNS window is {}", hr, min_hr - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console( + &gui_api, + &format!("You'r HR from Xmrig is {}, minimum required HR to keep a share in PPLNS window is {}", hr, min_hr), + ); // calculate how much time can be spared let mut spared_time = Helper::time_that_could_be_spared(hr, min_hr); @@ -490,13 +447,13 @@ impl Helper { ); } info!("Xvb Process | spared time {} ", spared_time); - if let Err(e) = writeln!( - lock!(gui_api).output, - "{} seconds of HR will be donated to the raffle.", - spared_time - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console( + &gui_api, + &format!( + " {} seconds of HR will be donated to the raffle.", + spared_time + ), + ); // sleep 10m less spared time then request XMrig to mine on XvB let was_instant = start_algorithm; let gui_api_c = gui_api.clone(); @@ -517,12 +474,7 @@ impl Helper { }); } } else { - if let Err(e) = writeln!( - lock!(gui_api).output, - "No share in the current PPLNS Window !", - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console(&gui_api, "No share in the current PPLNS Window !"); } } // instant saved for next check @@ -588,13 +540,13 @@ impl Helper { let node = lock!(gui_api_xvb).stats_priv.node.clone(); info!("Xvb Process | for now mine on p2pol "); info!("Xvb Process | spared time {} ", spared_time); - if let Err(e) = writeln!( - lock!(gui_api_xvb).output, - "Still mining on P2pool node for {} seconds", - XVB_TIME_ALGO - spared_time - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console( + &gui_api_xvb, + &format!( + "Still mining on P2pool node for {} seconds", + XVB_TIME_ALGO - spared_time + ), + ); sleep_until(*was_instant + Duration::from_secs((XVB_TIME_ALGO - spared_time) as u64)).await; if let Err(err) = PrivXmrigApi::update_xmrig_config( client, @@ -607,22 +559,22 @@ impl Helper { .await { // show to console error about updating xmrig config - if let Err(e) = writeln!( - lock!(gui_api_xvb).output, - "Failure to update xmrig config with HTTP API.\nError: {}", - err - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console( + &gui_api_xvb, + &format!( + "Failure to update xmrig config with HTTP API.\nError: {}", + err + ), + ); } else { info!("Xvb Process | mining on XvB pool"); - if let Err(e) = writeln!( - lock!(gui_api_xvb).output, - "Now donating to the XvB raffle for the rest of the {} minutes.", - XVB_TIME_ALGO / 60 - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console( + &gui_api_xvb, + &format!( + "Now donating to the XvB raffle for the rest of the {} minutes.", + XVB_TIME_ALGO / 60 + ), + ); } } } @@ -833,23 +785,18 @@ impl XvbNode { if node == XvbNode::P2pool { // if both nodes are dead, then the state of the process must be NodesOffline info!("XvB node ping, all offline or ping failed, switching back to local p2pool",); - if let Err(e) = writeln!( - lock!(&gui_api_xvb).output, + output_console( + &gui_api_xvb, "XvB node ping, all offline or ping failed, switching back to local p2pool", - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + ); lock!(process_xvb).state = ProcessState::OfflineNodesAll; } else { // if node is up and because update_fastest is used only if token/address is valid, it means XvB process is Alive. info!("XvB node ping, both online and best is {}", node.url()); - if let Err(e) = writeln!( - lock!(&gui_api_xvb).output, - "XvB node ping, {} is selected as the fastest.", - node - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console( + &gui_api_xvb, + &format!("XvB node ping, {} is selected as the fastest.", node), + ); lock!(process_xvb).state = ProcessState::Alive; } lock!(pub_api_xvb).stats_priv.node = node; @@ -939,15 +886,10 @@ fn signal_interrupt( ); // insert the signal into output of XvB // This is written directly into the GUI API, because sometimes the 900ms event loop can't catch it. - if let Err(e) = writeln!( - lock!(gui_api).output, - "{}Xvb stopped | Uptime: [{}] | \n{}\n\n\n\n", - HORI_CONSOLE, - Uptime::from(uptime), - HORI_CONSOLE - ) { - error!("XvB Watchdog | GUI Uptime/Exit status write failed: {}", e); - } + output_console( + &gui_api, + &format!("{}XvB stopped\n{}\n", HORI_CONSOLE, HORI_CONSOLE), + ); debug!("XvB Watchdog | Stop SIGNAL done, breaking"); lock!(process).signal = ProcessSignal::None; lock!(process).state = ProcessState::Dead; @@ -991,21 +933,18 @@ fn signal_interrupt( .await { // show to console error about updating xmrig config - if let Err(e) = writeln!( - lock!(&gui_api_c).output, - "Failure to update xmrig config with HTTP API.\nError: {}", - err - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console( + &gui_api_c, + &format!( + "Failure to update xmrig config with HTTP API.\nError: {}", + err + ), + ); } else { - if let Err(e) = writeln!( - lock!(&gui_api_c).output, - "XvB node failed, falling back to {}", - node - ) { - error!("XvB Watchdog | GUI status write failed: {}", e); - } + output_console( + &gui_api_c, + &format!("XvB node failed, falling back to {}", node), + ); } }); lock!(process).signal = ProcessSignal::None; @@ -1013,6 +952,17 @@ fn signal_interrupt( } false } + +// print date time to console output in same format than xmrig +use chrono::Local; +fn datetime_console() -> String { + format!("[{}] ", Local::now().format("%Y-%m-%d %H:%M:%S%.3f")) +} +pub fn output_console(gui_api: &Arc>, msg: &str) { + if let Err(e) = writeln!(lock!(gui_api).output, "{}{msg}", datetime_console()) { + error!("XvB Watchdog | GUI status write failed: {}", e); + } +} //---------------------------------------------------------------------------------------------------- TEST #[cfg(test)] mod test {