add monero to installation manager

This commit is contained in:
creating2morrow 2023-05-04 09:31:21 -04:00
parent 3ba866277c
commit 4f5ad19c7b
6 changed files with 131 additions and 5 deletions

3
.gitignore vendored
View file

@ -8,4 +8,5 @@ genkey-batch
monero-wallet-rpc.log
notes.txt
.vscode/settings.json
.bz2
*.bz2
*/monero-x86_64-linux-gnu-v0.18.2.2/**

View file

@ -15,4 +15,7 @@ pub mod user; // user rep/service layer
pub const NEVMES_JWP_SECRET_KEY: &str = "NEVMES_JWP_SECRET_KEY";
pub const NEVMES_JWT_SECRET_KEY: &str = "NEVMES_JWT_SECRET_KEY";
// set the latest monero release download here
pub const MONERO_RELEASE_VERSION: &str = "monero-linux-x64-v0.18.2.2.tar.bz2";
// DO NOT EDIT BELOW THIS LINE

View file

@ -238,7 +238,7 @@ pub async fn retry_fts() {
let list_key = format!("fts");
let r = db::Interface::read(&s.env, &s.handle, &String::from(list_key));
if r == utils::empty_string() {
error!("fts message index not found");
info!("fts message index not found");
}
let v_mid = r.split(",");
let v: Vec<String> = v_mid.map(|s| String::from(s)).collect();

View file

@ -1,10 +1,27 @@
use rand_core::RngCore;
use clap::Parser;
use rocket::serde::json::Json;
use crate::{args, db, i2p, message, models, monero, gpg, utils, reqres};
use crate::{args, db, i2p, message, models, monero, gpg, utils, reqres, MONERO_RELEASE_VERSION };
use log::{info, debug, error, warn};
use std::time::Duration;
/// Handles the state for the installation manager popup
pub struct Installations {
pub xmr: bool,
pub i2p: bool,
pub i2p_zero: bool,
}
impl Default for Installations {
fn default() -> Self {
Installations {
xmr: false,
i2p: false,
i2p_zero: false,
}
}
}
/// Handles the state for the connection manager popup
pub struct Connections {
pub blockchain_dir: String,
@ -378,3 +395,38 @@ pub fn stage_cleanup(f: String) {
.expect("cleanup staging failed");
debug!("{:?}", output.stdout);
}
/// Handle the request from user to additional software
///
/// from gui startup. Power users will most like install
///
/// software on their own. Note that software pull is over
///
/// clearnet. TODO(c2m): trusted download locations over i2p.
pub async fn install_software(installations: Installations) {
if installations.i2p {
info!("installing i2p");
}
if installations.i2p_zero {
info!("installing i2p-zero");
}
if installations.xmr {
info!("installing monero");
let link = format!("https://downloads.getmonero.org/cli/{}", crate::MONERO_RELEASE_VERSION);
let curl = std::process::Command::new("curl")
.args(["-O#", &link])
.status();
match curl {
Ok(curl_output) => {
debug!("{:?}", curl_output);
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
let tar_output = std::process::Command::new("tar")
.args(["-xvf", MONERO_RELEASE_VERSION])
.spawn()
.expect("monero tar extraction failed");
debug!("{:?}", tar_output.stdout);
},
_=> error!("monero download failed")
}
}
}

View file

@ -12,9 +12,13 @@ pub struct HomeApp {
connections: utils::Connections,
core_timeout_tx: Sender<bool>,
core_timeout_rx: Receiver<bool>,
installations: utils::Installations,
installation_tx: Sender<bool>,
installation_rx: Receiver<bool>,
is_core_running: bool,
is_editing_connections: bool,
is_init: bool,
is_installing: bool,
is_loading: bool,
is_timeout: bool,
is_updated: bool,
@ -46,9 +50,11 @@ pub struct HomeApp {
impl Default for HomeApp {
fn default() -> Self {
let connections = Default::default();
let installations = Default::default();
let is_core_running = false;
let is_editing_connections = false;
let is_init = true;
let is_installing = false;
let is_loading = false;
let is_timeout = false;
let is_updated = false;
@ -59,6 +65,7 @@ impl Default for HomeApp {
let (xmr_balance_tx, xmr_balance_rx) = std::sync::mpsc::channel();
let (can_refresh_tx, can_refresh_rx) = std::sync::mpsc::channel();
let (i2p_status_tx, i2p_status_rx) = std::sync::mpsc::channel();
let (installation_tx, installation_rx) = std::sync::mpsc::channel();
let s_xmr_rpc_ver = Default::default();
let s_xmr_address = Default::default();
let s_xmr_balance = Default::default();
@ -73,9 +80,13 @@ impl Default for HomeApp {
connections,
core_timeout_rx,
core_timeout_tx,
installations,
installation_rx,
installation_tx,
is_core_running,
is_editing_connections,
is_init,
is_installing,
is_loading,
is_timeout,
is_updated,
@ -126,11 +137,16 @@ impl eframe::App for HomeApp {
if let Ok(info) = self.xmrd_get_info_rx.try_recv() {
self.s_xmrd_get_info = info;
}
if let Ok(install) = self.installation_rx.try_recv() {
self.is_installing = !install;
self.is_loading = false;
}
if let Ok(timeout) = self.core_timeout_rx.try_recv() {
self.is_timeout = true;
if timeout {
self.is_loading = false;
self.is_core_running = false;
self.is_installing = false;
}
}
@ -194,6 +210,38 @@ impl eframe::App for HomeApp {
}
});
// Installation Manager window
//-----------------------------------------------------------------------------------
let mut is_installing = self.is_installing;
egui::Window::new("Installation Manager")
.open(&mut is_installing)
.vscroll(true)
.show(&ctx, |ui| {
// let mut wants_i2p = self.installations.i2p;
// let mut wants_i2p_zero = self.installations.i2p_zero;
let mut wants_xmr = self.installations.xmr;
// if ui.checkbox(&mut wants_i2p, "i2p").changed() {
// self.installations.i2p = !self.installations.i2p;
// }
// if ui.checkbox(&mut wants_i2p_zero, "i2p-zero").changed() {
// self.installations.i2p_zero = !self.installations.i2p_zero;
// }
if ui.checkbox(&mut wants_xmr, "xmr").changed() {
self.installations.xmr = !self.installations.xmr;
}
let install = &self.installations;
if install.i2p || install.i2p_zero || install.xmr {
if ui.button("Install").clicked() {
self.is_loading = true;
install_software_req(self.installation_tx.clone(), ctx.clone(), &self.installations);
}
}
if ui.button("Exit").clicked() {
self.is_installing = false;
self.is_loading = false;
}
});
//----------------------------------------------------------------------------------------------
egui::CentralPanel::default().show(ctx, |ui| {
if !self.is_updated {
@ -245,8 +293,9 @@ impl eframe::App for HomeApp {
ui.label("____________________________________________________________________\n");
ui.label("\n");
if self.is_loading {
let label = if self.is_installing { "installing software" } else { "starting nevmes-core..." };
ui.add(egui::Spinner::new());
ui.label("starting nevmes-core...");
ui.label(label);
}
if !self.is_core_running && self.s_xmr_rpc_ver.result.version == 0 {
if !self.is_loading {
@ -255,6 +304,14 @@ impl eframe::App for HomeApp {
}
}
}
if !self.is_core_running && !self.is_installing
&& (self.s_xmr_rpc_ver.result.version == 0 || self.s_i2p_status) {
if !self.is_loading {
if ui.button("Install Software").clicked() {
self.is_installing = true;
}
}
}
});
}
}
@ -322,3 +379,17 @@ fn start_core_timeout
ctx.request_repaint();
});
}
fn install_software_req
(tx: Sender<bool>, ctx: egui::Context, installations: &utils::Installations) {
let req_install: utils::Installations = utils::Installations {
i2p: installations.i2p,
i2p_zero: installations.i2p_zero,
xmr: installations.xmr,
};
tokio::spawn(async move {
utils::install_software(req_install).await;
let _ = tx.send(true);
ctx.request_repaint();
});
}

View file

@ -3,7 +3,6 @@ use sha2::{Digest, Sha512};
use crate::CREDENTIAL_KEY;
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub struct SettingsApp {
credential: String,