Commit 0fbd3a9d authored by nanamicat's avatar nanamicat

fix

parent f954add0
Pipeline #42419 passed with stages
in 1 minute and 10 seconds
...@@ -23,23 +23,15 @@ use hickory_resolver::Resolver; ...@@ -23,23 +23,15 @@ use hickory_resolver::Resolver;
#[tokio::main] #[tokio::main]
async fn main() -> anyhow::Result<()> { async fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt::init(); tracing_subscriber::fmt::init();
let config: Settings = Config::builder() let config: Settings = Config::builder().add_source(config::Environment::default()).build()?.try_deserialize()?;
.add_source(config::Environment::default()) let routers_data = serde_json::from_slice::<Vec<RouterData>>(&fs::read("import/data/Router.json")?)?;
.build()? let mut routers: BTreeMap<u8, Router> = routers_data.iter().map(|r| (r.id, Router::new(r, &config))).collect();
.try_deserialize()?; let connections = serde_json::from_slice::<BTreeMap<u8, BTreeMap<u8, Connection>>>(&fs::read("import/connections.json")?)?;
let routers_data =
serde_json::from_slice::<Vec<RouterData>>(&fs::read("import/data/Router.json")?)?;
let mut routers: BTreeMap<u8, Router> = routers_data
.iter()
.map(|r| (r.id, Router::new(r, &config)))
.collect();
let connections = serde_json::from_slice::<BTreeMap<u8, BTreeMap<u8, Connection>>>(&fs::read(
"import/connections.json",
)?)?;
// let groups: Vec<GatewayGroup> = serde_json::from_slice(&fs::read("import/GatewayGroup.json")?)?; // let groups: Vec<GatewayGroup> = serde_json::from_slice(&fs::read("import/GatewayGroup.json")?)?;
let mut server = Server::new( let mut server = Server::new(
// &routers, config.id,
&routers,
// groups // groups
// .iter() // .iter()
// .map(|g| (g.id, g.routers(&groups, &routers_data))) // .map(|g| (g.id, g.routers(&groups, &routers_data)))
...@@ -69,7 +61,7 @@ async fn main() -> anyhow::Result<()> { ...@@ -69,7 +61,7 @@ async fn main() -> anyhow::Result<()> {
peer.on_message(&hello); peer.on_message(&hello);
} else if addr.port() == config.server.port } else if addr.port() == config.server.port
&& let Ok((downlink, _)) = bincode::decode_from_slice(&buf[..len], bincode::config::standard()) && let Ok((downlink, _)) = bincode::decode_from_slice(&buf[..len], bincode::config::standard())
&& let Some(uplink) = server.on_message(&downlink, &routers_data, &connections[&config.id], &config).await && let Some(uplink) = server.on_message(downlink, &routers_data, &connections[&config.id], &config).await
{ {
let len = bincode::encode_into_slice(uplink, &mut buf, bincode::config::standard())?; let len = bincode::encode_into_slice(uplink, &mut buf, bincode::config::standard())?;
let _ = socket.send_to(&buf[..len], addr).await; let _ = socket.send_to(&buf[..len], addr).await;
......
use crate::protocol::{Downlink, MessageType, Uplink}; use crate::protocol::{Downlink, MessageType, Uplink};
use crate::router::Router;
use crate::settings::Settings; use crate::settings::Settings;
use crate::{connection::Connection, data}; use crate::{connection::Connection, data};
use netlink_sys::{Socket, TokioSocket, protocols::NETLINK_ROUTE}; use netlink_sys::{protocols::NETLINK_ROUTE, Socket, TokioSocket};
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::os::unix::io::{AsRawFd, FromRawFd}; use std::os::unix::io::{AsRawFd, FromRawFd};
...@@ -14,7 +15,7 @@ pub struct Server { ...@@ -14,7 +15,7 @@ pub struct Server {
} }
impl Server { impl Server {
pub fn new() -> Self { pub fn new(id: u8, routers: &BTreeMap<u8, Router>) -> Self {
let socket = std::mem::ManuallyDrop::new(Socket::new(NETLINK_ROUTE).unwrap()); let socket = std::mem::ManuallyDrop::new(Socket::new(NETLINK_ROUTE).unwrap());
socket.set_netlink_get_strict_chk(true).unwrap(); socket.set_netlink_get_strict_chk(true).unwrap();
let socket = unsafe { TokioSocket::from_raw_fd(socket.as_raw_fd()) }; let socket = unsafe { TokioSocket::from_raw_fd(socket.as_raw_fd()) };
...@@ -23,7 +24,7 @@ impl Server { ...@@ -23,7 +24,7 @@ impl Server {
Server { Server {
online: false, online: false,
version: rand::random(), version: rand::random(),
via: Default::default(), via: routers.keys().filter(|&&i| i != id).map(|&i| (i, i)).collect(),
plan: Default::default(), plan: Default::default(),
handle, handle,
} }
...@@ -31,17 +32,13 @@ impl Server { ...@@ -31,17 +32,13 @@ impl Server {
pub async fn on_message( pub async fn on_message(
&mut self, &mut self,
message: &Downlink, mut message: Downlink,
routers: &Vec<data::Router>, routers: &Vec<data::Router>,
connections: &BTreeMap<u8, Connection>, connections: &BTreeMap<u8, Connection>,
config: &Settings, // routers: &mut HashMap<u8, Router>, config: &Settings, // routers: &mut HashMap<u8, Router>,
// self_peer: &Hello, // self_peer: &Hello,
) -> Option<Uplink> { ) -> Option<Uplink> {
tracing::info!( tracing::info!("server message {:?}, version = {}", message, message.version);
"server message {:?}, version = {}",
message,
message.version
);
if message.ack != self.version { if message.ack != self.version {
return None; return None;
} }
...@@ -51,7 +48,8 @@ impl Server { ...@@ -51,7 +48,8 @@ impl Server {
(false, MessageType::Full) => { (false, MessageType::Full) => {
self.reset(routers, connections, config).await; self.reset(routers, connections, config).await;
self.online = true; self.online = true;
// TODO: apply via and plan self.via.append(&mut message.via);
self.plan.append(&mut message.plan);
Some(Uplink { Some(Uplink {
id: config.id, id: config.id,
action: MessageType::Update, action: MessageType::Update,
...@@ -69,25 +67,23 @@ impl Server { ...@@ -69,25 +67,23 @@ impl Server {
via: self.via.clone(), via: self.via.clone(),
plan: self.plan.clone(), plan: self.plan.clone(),
}), }),
(true, MessageType::Update) => Some(Uplink { (true, MessageType::Update) => {
id: config.id, self.via.append(&mut message.via);
action: MessageType::Update, self.plan.append(&mut message.plan);
version: self.version, Some(Uplink {
peers: Default::default(), id: config.id,
via: Default::default(), action: MessageType::Update,
plan: Default::default(), version: self.version,
// TODO: apply via and plan peers: Default::default(),
}), via: Default::default(),
plan: Default::default(),
})
}
_ => None, _ => None,
} }
} }
pub async fn reset( pub async fn reset(&self, routers: &Vec<data::Router>, connections: &BTreeMap<u8, Connection>, config: &Settings) {
&self,
routers: &Vec<data::Router>,
connections: &BTreeMap<u8, Connection>,
config: &Settings,
) {
println!("reset"); println!("reset");
// let mut routes = self.handle.route().get(RouteMessageBuilder::<Ipv4Addr>::new().protocol(ROUTE_PROTOCOL).build()).execute(); // let mut routes = self.handle.route().get(RouteMessageBuilder::<Ipv4Addr>::new().protocol(ROUTE_PROTOCOL).build()).execute();
// while let Some(route) = routes.try_next().await.unwrap() { // while let Some(route) = routes.try_next().await.unwrap() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment