Implement the skeleton for the ServerManager and the spawn of the connection_ids
This commit is contained in:
@@ -7,10 +7,12 @@ edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
libbonknet = { path = "../libbonknet" }
|
||||
tokio = { version = "1", features = ["full"] }
|
||||
tokio-rustls = "0.25.0"
|
||||
tokio = { version = "1", features = ["full", "tracing"] }
|
||||
tokio-util = { version = "0.7.10", features = ["codec"] }
|
||||
futures = "0.3"
|
||||
rcgen = "0.12.0"
|
||||
tokio-rustls = "0.25.0"
|
||||
rustls-pemfile = "2.0.0"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
rmp-serde = "1.1.2"
|
||||
tracing = "0.1"
|
||||
tracing-subscriber = "0.3"
|
||||
|
||||
@@ -1,38 +1,35 @@
|
||||
use std::io::Error;
|
||||
use std::sync::Arc;
|
||||
use futures::SinkExt;
|
||||
use std::time::Duration;
|
||||
use futures::{StreamExt, SinkExt};
|
||||
use tokio::net::TcpStream;
|
||||
use tokio_rustls::rustls::{ClientConfig, RootCertStore};
|
||||
use tokio_rustls::rustls::pki_types::{ServerName};
|
||||
use tokio_rustls::rustls::pki_types::{ServerName, CertificateDer, PrivatePkcs8KeyDer};
|
||||
use tokio_rustls::TlsConnector;
|
||||
use tokio_util::bytes::BytesMut;
|
||||
use tokio_util::codec::{Framed, LengthDelimitedCodec};
|
||||
use serde::{Serialize, Deserialize};
|
||||
use libbonknet::{load_cert, load_prkey};
|
||||
use libbonknet::*;
|
||||
use tracing::{info, error};
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
enum ClientMessage {
|
||||
Response { status_code: u32, msg: Option<String> },
|
||||
Announce { name: String },
|
||||
Required { id: String },
|
||||
NotRequired { id: String },
|
||||
}
|
||||
|
||||
// TODO: This is an old examples
|
||||
#[tokio::main]
|
||||
async fn main() -> std::io::Result<()> {
|
||||
let client_name = "Polnareffland1";
|
||||
// Tracing Subscriber
|
||||
let subscriber = tracing_subscriber::FmtSubscriber::new();
|
||||
tracing::subscriber::set_global_default(subscriber).unwrap();
|
||||
// Root certs to verify the server is the right one
|
||||
let mut server_root_cert_store = RootCertStore::empty();
|
||||
let server_root_cert_der = load_cert("server_root_cert.pem").unwrap();
|
||||
server_root_cert_store.add(server_root_cert_der).unwrap();
|
||||
// Auth Cert to send the server who am I
|
||||
let root_client_cert = load_cert("client_root_cert.pem").unwrap();
|
||||
let client_cert = load_cert("client_cert.pem").unwrap();
|
||||
let client_prkey = load_prkey("client_key.pem").unwrap();
|
||||
let mut broker_root_cert_store = RootCertStore::empty();
|
||||
let broker_root_cert_der = load_cert("certs/broker_root_cert.pem").unwrap();
|
||||
broker_root_cert_store.add(broker_root_cert_der).unwrap();
|
||||
// Public CA for Clients
|
||||
let root_client_cert = load_cert("certs/client_root_cert.pem").unwrap();
|
||||
// My Client Certificate for authentication
|
||||
let client_cert = load_cert("certs/client_cert.pem").unwrap();
|
||||
let client_cert_prkey = load_prkey("certs/client_key.pem").unwrap();
|
||||
// Load TLS Config
|
||||
let tlsconfig = ClientConfig::builder()
|
||||
.with_root_certificates(server_root_cert_store)
|
||||
// .with_no_client_auth();
|
||||
.with_client_auth_cert(vec![client_cert, root_client_cert], client_prkey.into())
|
||||
.with_root_certificates(broker_root_cert_store.clone())
|
||||
.with_client_auth_cert(vec![client_cert, root_client_cert], client_cert_prkey.into())
|
||||
.unwrap();
|
||||
let connector = TlsConnector::from(Arc::new(tlsconfig));
|
||||
let dnsname = ServerName::try_from("localhost").unwrap();
|
||||
@@ -41,34 +38,46 @@ async fn main() -> std::io::Result<()> {
|
||||
let stream = connector.connect(dnsname, stream).await?;
|
||||
|
||||
let mut transport = Framed::new(stream, LengthDelimitedCodec::new());
|
||||
|
||||
let msg1 = ClientMessage::Announce { name: client_name.into() };
|
||||
transport.send(rmp_serde::to_vec(&msg1).unwrap().into()).await.unwrap();
|
||||
for i in 0..10 {
|
||||
let msg = ClientMessage::Response { status_code: 100+i, msg: Some(format!("yay {}", i)) };
|
||||
transport.send(rmp_serde::to_vec(&msg).unwrap().into()).await.unwrap();
|
||||
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
|
||||
let msg = FromClientCommand::ServerList;
|
||||
transport.send(rmp_serde::to_vec(&msg).unwrap().into()).await.unwrap();
|
||||
match transport.next().await {
|
||||
None => panic!("None in the transport"),
|
||||
Some(item) => match item {
|
||||
Ok(buf) => {
|
||||
use ToClientResponse::*;
|
||||
let msg: ToClientResponse = rmp_serde::from_slice(&buf).unwrap();
|
||||
match msg {
|
||||
OkRequest { .. } => error!("Wrong reply!"),
|
||||
OkServerList { data } => info!("{}", data.join("\n")),
|
||||
GenericError => error!("Generic Error during remote command execution"),
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
error!("Error: {:?}", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
tokio::time::sleep(Duration::from_secs(5)).await;
|
||||
let msg = FromClientCommand::RequestServer { name: "cicciopizza".into() };
|
||||
transport.send(rmp_serde::to_vec(&msg).unwrap().into()).await.unwrap();
|
||||
match transport.next().await {
|
||||
None => panic!("None in the transport"),
|
||||
Some(item) => match item {
|
||||
Ok(buf) => {
|
||||
use ToClientResponse::*;
|
||||
let msg: ToClientResponse = rmp_serde::from_slice(&buf).unwrap();
|
||||
match msg {
|
||||
OkRequest { conn_id } => {
|
||||
info!("Received Client Connection ID: {:?}", conn_id);
|
||||
}
|
||||
OkServerList { .. } => error!("Wrong reply!"),
|
||||
GenericError => error!("Generic Error during remote command execution"),
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
error!("Error: {:?}", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// transport.for_each(|item| async move {
|
||||
// let a: ClientMessage = rmp_serde::from_slice(&item.unwrap()).unwrap();
|
||||
// println!("{:?}", a);
|
||||
// }).await;
|
||||
|
||||
// let mut buf = vec![0;1024];
|
||||
// let (mut rd,mut tx) = split(stream);
|
||||
//
|
||||
//
|
||||
// tokio::spawn(async move {
|
||||
// let mut stdout = tokio::io::stdout();
|
||||
// tokio::io::copy(&mut rd, &mut stdout).await.unwrap();
|
||||
// });
|
||||
//
|
||||
// let mut reader = tokio::io::BufReader::new(tokio::io::stdin()).lines();
|
||||
//
|
||||
// while let Some(line) = reader.next_line().await.unwrap() {
|
||||
// tx.write_all(line.as_bytes()).await.unwrap();
|
||||
// }
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user