print nodes working
This commit is contained in:
parent
68c1978742
commit
701c2c6010
1405
Cargo.lock
generated
1405
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -4,9 +4,14 @@ version = "0.1.0"
|
|||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ed25519-dalek = "2.1.1"
|
ed25519-dalek = { version = "2.1.1", features = ["rand_core", "serde"] }
|
||||||
|
hex = "0.4.3"
|
||||||
once_cell = "1.19.0"
|
once_cell = "1.19.0"
|
||||||
prost = "0.13.1"
|
prost = "0.13.1"
|
||||||
|
rand = "0.8.5"
|
||||||
|
salvo = "0.70.0"
|
||||||
|
tabled = "0.16.0"
|
||||||
|
tokio = { version = "1.39.2", features = ["macros"] }
|
||||||
tonic = "0.12.1"
|
tonic = "0.12.1"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
|
@ -1,51 +1,68 @@
|
|||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
|
use ed25519_dalek::{SigningKey, VerifyingKey};
|
||||||
|
use once_cell::sync::Lazy;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
use ed25519_dalek::{VerifyingKey, SigningKey};
|
|
||||||
use once_cell::sync::Lazy;
|
|
||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
|
use tabled::{Table, Tabled};
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct NodeInfo {
|
pub struct NodeInfo {
|
||||||
pubkey: VerifyingKey,
|
pub pubkey: VerifyingKey,
|
||||||
updated_at: SystemTime,
|
pub updated_at: SystemTime,
|
||||||
}
|
}
|
||||||
|
|
||||||
static NODES: Lazy<Mutex<HashMap<String, NodeInfo>>> = Lazy::new(|| {
|
static NODES: Lazy<Mutex<HashMap<String, NodeInfo>>> = Lazy::new(|| Mutex::new(HashMap::new()));
|
||||||
Mutex::new(HashMap::new())
|
|
||||||
});
|
|
||||||
|
|
||||||
static KEYS: Lazy<Mutex<HashMap<VerifyingKey, SigningKey>>> = Lazy::new(|| {
|
static KEYS: Lazy<Mutex<HashMap<VerifyingKey, SigningKey>>> =
|
||||||
Mutex::new(HashMap::new())
|
Lazy::new(|| Mutex::new(HashMap::new()));
|
||||||
});
|
|
||||||
|
|
||||||
pub fn add_key(pubkey: VerifyingKey, privkey: SigningKey) {
|
pub fn add_key(pubkey: VerifyingKey, privkey: SigningKey) {
|
||||||
let mut map = KEYS.lock().unwrap();
|
let mut keys = KEYS.lock().unwrap();
|
||||||
map.insert(pubkey, privkey);
|
keys.insert(pubkey, privkey);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remove_key(pubkey: &VerifyingKey) {
|
pub fn remove_key(pubkey: &VerifyingKey) {
|
||||||
let mut map = KEYS.lock().unwrap();
|
let mut keys = KEYS.lock().unwrap();
|
||||||
map.remove(pubkey);
|
keys.remove(pubkey);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_privkey(pubkey: &VerifyingKey) -> Option<SigningKey> {
|
pub fn get_privkey(pubkey: &VerifyingKey) -> Option<SigningKey> {
|
||||||
let map = KEYS.lock().unwrap();
|
let keys = KEYS.lock().unwrap();
|
||||||
map.get(pubkey).cloned()
|
keys.get(pubkey).cloned()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_node(ip: String, info: NodeInfo) {
|
pub fn add_node(ip: String, info: NodeInfo) {
|
||||||
let mut map = NODES.lock().unwrap();
|
let mut nodes = NODES.lock().unwrap();
|
||||||
map.insert(ip, info);
|
nodes.insert(ip, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remove_node(ip: &str) {
|
pub fn remove_node(ip: &str) {
|
||||||
let mut map = NODES.lock().unwrap();
|
let mut nodes = NODES.lock().unwrap();
|
||||||
map.remove(ip);
|
nodes.remove(ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_pubkey(ip: &str) -> Option<NodeInfo> {
|
pub fn get_pubkey(ip: &str) -> Option<NodeInfo> {
|
||||||
let map = NODES.lock().unwrap();
|
let nodes = NODES.lock().unwrap();
|
||||||
map.get(ip).cloned()
|
nodes.get(ip).cloned()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_nodes_as_html_tabe() -> String {
|
||||||
|
#[derive(Tabled)]
|
||||||
|
struct OutputRow {
|
||||||
|
ip: String,
|
||||||
|
pubkey: String,
|
||||||
|
age: u64,
|
||||||
|
}
|
||||||
|
let mut output = vec![];
|
||||||
|
for (ip, node_info) in NODES.lock().unwrap().iter() {
|
||||||
|
let ip = ip.clone();
|
||||||
|
let pubkey = hex::encode(node_info.pubkey.as_bytes());
|
||||||
|
let age = std::time::SystemTime::now()
|
||||||
|
.duration_since(node_info.updated_at)
|
||||||
|
.unwrap_or(std::time::Duration::ZERO)
|
||||||
|
.as_secs();
|
||||||
|
output.push(OutputRow { ip, pubkey, age });
|
||||||
|
}
|
||||||
|
Table::new(output).to_string()
|
||||||
|
}
|
||||||
|
14
src/grpc.rs
Normal file
14
src/grpc.rs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
use crate::database;
|
||||||
|
use crate::database::NodeInfo;
|
||||||
|
use rand::rngs::OsRng;
|
||||||
|
|
||||||
|
pub fn add_node(ip: String) {
|
||||||
|
let mut csprng = OsRng;
|
||||||
|
database::add_node(
|
||||||
|
ip,
|
||||||
|
NodeInfo {
|
||||||
|
pubkey: ed25519_dalek::SigningKey::generate(&mut csprng).verifying_key(),
|
||||||
|
updated_at: std::time::SystemTime::now(),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
14
src/http_server.rs
Normal file
14
src/http_server.rs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
use salvo::prelude::*;
|
||||||
|
use crate::database::get_nodes_as_html_tabe;
|
||||||
|
|
||||||
|
#[handler]
|
||||||
|
async fn homepage() -> String {
|
||||||
|
get_nodes_as_html_tabe()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn start() {
|
||||||
|
let acceptor = TcpListener::new("0.0.0.0:5800").bind().await;
|
||||||
|
let router = Router::new().get(homepage);
|
||||||
|
println!("{:?}", router);
|
||||||
|
Server::new(acceptor).serve(router).await;
|
||||||
|
}
|
11
src/main.rs
11
src/main.rs
@ -1,4 +1,11 @@
|
|||||||
|
mod grpc;
|
||||||
|
mod http_server;
|
||||||
mod database;
|
mod database;
|
||||||
fn main() {
|
|
||||||
println!("Hello, world!");
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
|
grpc::add_node("1.1.1.1".to_string());
|
||||||
|
grpc::add_node("1.2.3.4".to_string());
|
||||||
|
grpc::add_node("2.2.2.2".to_string());
|
||||||
|
crate::http_server::start().await;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user