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" | ||||
| 
 | ||||
| [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" | ||||
| 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" | ||||
| 
 | ||||
| [build-dependencies] | ||||
|  | ||||
| @ -1,51 +1,68 @@ | ||||
| #![allow(dead_code)] | ||||
| use ed25519_dalek::{SigningKey, VerifyingKey}; | ||||
| use once_cell::sync::Lazy; | ||||
| use std::collections::HashMap; | ||||
| use std::sync::Mutex; | ||||
| use ed25519_dalek::{VerifyingKey, SigningKey}; | ||||
| use once_cell::sync::Lazy; | ||||
| use std::time::SystemTime; | ||||
| use tabled::{Table, Tabled}; | ||||
| 
 | ||||
| #[derive(Clone)] | ||||
| pub struct NodeInfo { | ||||
|     pubkey: VerifyingKey, | ||||
|     updated_at:  SystemTime, | ||||
|     pub pubkey: VerifyingKey, | ||||
|     pub updated_at: SystemTime, | ||||
| } | ||||
| 
 | ||||
| static NODES: Lazy<Mutex<HashMap<String, NodeInfo>>> = Lazy::new(|| { | ||||
|     Mutex::new(HashMap::new()) | ||||
| }); | ||||
| static NODES: Lazy<Mutex<HashMap<String, NodeInfo>>> = Lazy::new(|| Mutex::new(HashMap::new())); | ||||
| 
 | ||||
| static KEYS: Lazy<Mutex<HashMap<VerifyingKey, SigningKey>>> = Lazy::new(|| { | ||||
|     Mutex::new(HashMap::new()) | ||||
| }); | ||||
| static KEYS: Lazy<Mutex<HashMap<VerifyingKey, SigningKey>>> = | ||||
|     Lazy::new(|| Mutex::new(HashMap::new())); | ||||
| 
 | ||||
| pub fn add_key(pubkey: VerifyingKey, privkey: SigningKey) { | ||||
|     let mut map = KEYS.lock().unwrap(); | ||||
|     map.insert(pubkey, privkey); | ||||
|     let mut keys = KEYS.lock().unwrap(); | ||||
|     keys.insert(pubkey, privkey); | ||||
| } | ||||
| 
 | ||||
| pub fn remove_key(pubkey: &VerifyingKey) { | ||||
|     let mut map = KEYS.lock().unwrap(); | ||||
|     map.remove(pubkey); | ||||
|     let mut keys = KEYS.lock().unwrap(); | ||||
|     keys.remove(pubkey); | ||||
| } | ||||
| 
 | ||||
| pub fn get_privkey(pubkey: &VerifyingKey) -> Option<SigningKey> { | ||||
|     let map = KEYS.lock().unwrap(); | ||||
|     map.get(pubkey).cloned() | ||||
|     let keys = KEYS.lock().unwrap(); | ||||
|     keys.get(pubkey).cloned() | ||||
| } | ||||
| 
 | ||||
| pub fn add_node(ip: String, info: NodeInfo) { | ||||
|     let mut map = NODES.lock().unwrap(); | ||||
|     map.insert(ip, info); | ||||
|     let mut nodes = NODES.lock().unwrap(); | ||||
|     nodes.insert(ip, info); | ||||
| } | ||||
| 
 | ||||
| pub fn remove_node(ip: &str) { | ||||
|     let mut map = NODES.lock().unwrap(); | ||||
|     map.remove(ip); | ||||
|     let mut nodes = NODES.lock().unwrap(); | ||||
|     nodes.remove(ip); | ||||
| } | ||||
| 
 | ||||
| pub fn get_pubkey(ip: &str) -> Option<NodeInfo> { | ||||
|     let map = NODES.lock().unwrap(); | ||||
|     map.get(ip).cloned() | ||||
|     let nodes = NODES.lock().unwrap(); | ||||
|     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; | ||||
| 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