Commit b4ca6a52 authored by nanamicat's avatar nanamicat

clean

parent 5c51e2b7
{
"id": 99,
"server": "43.142.53.161:500",
"port": 495,
"timeout": 10,
"history": 100,
"interval": 1000,
"table": 2000,
"proto": 250
}
max_width = 180
\ No newline at end of file
...@@ -2,12 +2,12 @@ use serde_derive::Deserialize; ...@@ -2,12 +2,12 @@ use serde_derive::Deserialize;
#[derive(Deserialize)] #[derive(Deserialize)]
pub(crate) struct Connection { pub(crate) struct Connection {
pub metric: u32, // pub metric: u32,
pub protocol: Schema, // pub protocol: Schema,
}
#[derive(Deserialize)]
pub(crate) enum Schema {
IP,
UDP,
TCP,
} }
// #[derive(Deserialize)]
// pub(crate) enum Schema {
// IP,
// UDP,
// TCP,
// }
use serde::Deserialize; use serde::Deserialize;
use std::collections::HashSet;
#[derive(Deserialize)] #[derive(Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct Router { pub struct Router {
pub id: u8, pub id: u8,
pub name: String, // pub name: String,
pub address: String, // pub address: String,
pub location: String, // pub location: String,
pub user: String, // pub user: String,
pub host: String, // pub host: String,
pub ssh_port: u16, // pub ssh_port: u16,
pub ssh_system: Option<u16>, // pub ssh_system: Option<u16>,
pub next_mark: u16, // pub next_mark: u16,
pub dest_mark: u16, // pub dest_mark: u16,
pub port: u16, // pub port: u16,
pub port2: u16, // pub port2: u16,
pub wg_private_key: Option<String>, // pub wg_private_key: Option<String>,
pub masq_interfaces: Vec<String>, // pub masq_interfaces: Vec<String>,
pub os: String, // pub os: String,
pub arch: String, // pub arch: String,
pub ocserv_port: u16, // pub ocserv_port: u16,
pub offset: u16, // pub offset: u16,
pub offset2: u16, // pub offset2: u16,
} }
#[derive(Deserialize)] // #[derive(Deserialize)]
#[serde(rename_all = "camelCase")] // #[serde(rename_all = "camelCase")]
pub struct GatewayGroup { // pub struct GatewayGroup {
pub id: u16, // pub id: u16,
pub name: String, // pub name: String,
pub description: String, // pub description: String,
pub children: HashSet<String>, // pub children: HashSet<String>,
pub dest_mark: u16, // pub dest_mark: u16,
pub location_prefix: Vec<String>, // pub location_prefix: Vec<String>,
pub include_routers: HashSet<String>, // pub include_routers: HashSet<String>,
pub exclude_routers: HashSet<String>, // pub exclude_routers: HashSet<String>,
} // }
use std::collections::{HashMap, HashSet}; // use std::collections::HashSet;
//
use crate::data::{GatewayGroup, Router}; // use crate::data::{GatewayGroup, Router};
//
impl GatewayGroup { // impl GatewayGroup {
pub fn routers(&self, groups: &[GatewayGroup], routers: &[Router]) -> HashSet<u8> { // pub fn routers(&self, groups: &[GatewayGroup], routers: &[Router]) -> HashSet<u8> {
routers // routers
.iter() // .iter()
.filter(|r| self.include_routers.contains(&r.name)) // .filter(|r| self.include_routers.contains(&r.name))
.chain( // .chain(
self.location_prefix // self.location_prefix
.iter() // .iter()
.flat_map(|p| routers.iter().filter(move |r| r.location.starts_with(p))), // .flat_map(|p| routers.iter().filter(move |r| r.location.starts_with(p))),
) // )
.filter(|r| !self.exclude_routers.contains(&r.name)) // .filter(|r| !self.exclude_routers.contains(&r.name))
.map(|r| r.id) // .map(|r| r.id)
.chain( // .chain(
groups // groups
.iter() // .iter()
.filter(|g| self.children.contains(&g.name)) // .filter(|g| self.children.contains(&g.name))
.flat_map(|g1| g1.routers(groups, routers)), // .flat_map(|g1| g1.routers(groups, routers)),
) // )
.collect() // .collect()
} // }
} // }
...@@ -7,7 +7,6 @@ use crate::settings::{Settings, INTERVAL}; ...@@ -7,7 +7,6 @@ use crate::settings::{Settings, INTERVAL};
use config::Config; use config::Config;
use std::collections::HashMap; use std::collections::HashMap;
use std::fs; use std::fs;
use std::net::{IpAddr, Ipv6Addr, SocketAddr};
use std::time::SystemTime; use std::time::SystemTime;
use tokio::net::UdpSocket; use tokio::net::UdpSocket;
use tokio::time; use tokio::time;
...@@ -23,20 +22,10 @@ mod settings; ...@@ -23,20 +22,10 @@ mod settings;
#[tokio::main] #[tokio::main]
async fn main() -> anyhow::Result<()> { async fn main() -> anyhow::Result<()> {
let config: Settings = Config::builder() let config: Settings = Config::builder().add_source(config::Environment::default()).build()?.try_deserialize()?;
.add_source(config::File::with_name("config/config.json"))
.add_source(config::Environment::with_prefix("RAILGUN"))
.build()?
.try_deserialize()?;
let routers_data = serde_json::from_slice::<Vec<RouterData>>(&fs::read("import/Router.json")?)?; let routers_data = serde_json::from_slice::<Vec<RouterData>>(&fs::read("import/Router.json")?)?;
let mut routers: HashMap<u8, Router> = routers_data let mut routers: HashMap<u8, Router> = routers_data.iter().map(|r| (r.id, Router::new(r, &config))).collect();
.iter() let connections = serde_json::from_slice::<HashMap<u8, HashMap<u8, Connection>>>(&fs::read("import/connections.json")?)?;
.map(|r| (r.id, Router::new(r, &config)))
.collect();
let connections = serde_json::from_slice::<HashMap<u8, HashMap<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(
...@@ -49,31 +38,32 @@ async fn main() -> anyhow::Result<()> { ...@@ -49,31 +38,32 @@ async fn main() -> anyhow::Result<()> {
let mut hello = Hello { time: 0 }; let mut hello = Hello { time: 0 };
let socket = UdpSocket::bind(SocketAddr::new( let socket = UdpSocket::bind(config.bind).await?;
IpAddr::V6(Ipv6Addr::UNSPECIFIED),
config.port,
))
.await?;
let mut timer = time::interval(INTERVAL); let mut timer = time::interval(INTERVAL);
let mut buf = [0; 1500]; let mut buf = [0; 1500];
let mut syn: bool = true;
loop { loop {
tokio::select! { tokio::select! {
biased; // 优先处理上面的 biased; // 优先处理上面的
Ok((len, src)) = socket.recv_from(&mut buf) => { result = socket.recv_from(&mut buf) => {
let (len, src) = result?;
if src == config.server { if src == config.server {
// from server // from server
let (message, _): (Change, usize) = bincode::decode_from_slice(&buf[..len], bincode::config::standard())?; let (message, _): (Change, usize) = bincode::decode_from_slice(&buf[..len], bincode::config::standard())?;
server.on_message(&socket, &message, &mut routers, &hello); server.on_message(&message);
let report = Report { let report = Report {
id: config.id, id: config.id,
syn: message.rst,
ack: server.ack, ack: server.ack,
peers: Vec::new() peers: Vec::new()
}; };
let message = bincode::encode_to_vec(&report, bincode::config::standard())?; let message = bincode::encode_to_vec(&report, bincode::config::standard())?;
let _ = socket.send_to(message.as_slice(), config.server); let _ = socket.send_to(message.as_slice(), config.server).await;
syn = false;
} else if let Some(peer) = Router::get(&mut routers, src){ } else if let Some(peer) = Router::get(&mut routers, src){
// from client // from client
let (message, _): (Hello, usize) = bincode::decode_from_slice(&buf[..len], bincode::config::standard())?; let (message, _): (Hello, usize) = bincode::decode_from_slice(&buf[..len], bincode::config::standard())?;
...@@ -87,12 +77,13 @@ async fn main() -> anyhow::Result<()> { ...@@ -87,12 +77,13 @@ async fn main() -> anyhow::Result<()> {
let message = bincode::encode_to_vec(&hello, bincode::config::standard())?; let message = bincode::encode_to_vec(&hello, bincode::config::standard())?;
for id in connections[&config.id].keys() { for id in connections[&config.id].keys() {
let router = &routers[id]; let router = &routers[id];
let _ = socket.send_to(message.as_slice(), router.link_address); let _ = socket.send_to(message.as_slice(), router.link_address).await;
} }
// to server // to server
let report = Report { let report = Report {
id: config.id, id: config.id,
syn,
ack: server.ack, ack: server.ack,
peers: connections peers: connections
.iter() .iter()
...@@ -101,7 +92,7 @@ async fn main() -> anyhow::Result<()> { ...@@ -101,7 +92,7 @@ async fn main() -> anyhow::Result<()> {
.collect(), .collect(),
}; };
let message = bincode::encode_to_vec(&report, bincode::config::standard())?; let message = bincode::encode_to_vec(&report, bincode::config::standard())?;
let _ = socket.send_to(message.as_slice(), config.server); let _ = socket.send_to(message.as_slice(), config.server).await;
} }
} }
} }
......
use std::collections::BTreeMap;
use bincode::{Decode, Encode}; use bincode::{Decode, Encode};
#[derive(Encode, Decode)] #[derive(Encode, Decode)]
...@@ -9,6 +10,7 @@ pub struct Hello { ...@@ -9,6 +10,7 @@ pub struct Hello {
pub struct Report { pub struct Report {
pub id: u8, pub id: u8,
pub ack: u8, pub ack: u8,
pub syn: bool,
pub peers: Vec<PeerQuality>, pub peers: Vec<PeerQuality>,
} }
...@@ -22,6 +24,7 @@ pub struct PeerQuality { ...@@ -22,6 +24,7 @@ pub struct PeerQuality {
#[derive(Encode, Decode)] #[derive(Encode, Decode)]
pub struct Change { pub struct Change {
pub seq: u8, pub seq: u8,
pub via: Vec<(u8, u8)>, pub rst: bool,
pub plan: Vec<(u8, u8)>, pub via: BTreeMap<u8, u8>,
pub plan: BTreeMap<u8, BTreeMap<u8, u8>>,
} }
use rtnetlink::{new_connection, Error, Handle}; // use rtnetlink::{new_connection, Error, Handle};
use std::collections::HashMap; // use std::collections::HashMap;
//
// struct RouteWriter { // struct RouteWriter {
// via: HashMap<u8, u8>, // via: HashMap<u8, u8>,
// plan: HashMap<u16, u8>, // plan: HashMap<u16, u8>,
......
...@@ -27,8 +27,8 @@ impl Router { ...@@ -27,8 +27,8 @@ impl Router {
pub fn new(data: &RouterData, config: &Settings) -> Router { pub fn new(data: &RouterData, config: &Settings) -> Router {
Router { Router {
link_address: SocketAddr::new( link_address: SocketAddr::new(
IpAddr::from([169, 254, data.id, config.id]), IpAddr::from([10, 200, data.id, config.id]),
config.port, config.bind.port(),
), ),
quality: PeerQuality { quality: PeerQuality {
reliability: 0, reliability: 0,
...@@ -79,7 +79,7 @@ impl Router { ...@@ -79,7 +79,7 @@ impl Router {
self.history.push(Some(delay)); self.history.push(Some(delay));
if (self.history.len() > HISTORY as usize) { if self.history.len() > HISTORY as usize {
self.history.drain(0..self.history.len() - HISTORY as usize); self.history.drain(0..self.history.len() - HISTORY as usize);
} }
......
use std::collections::{HashMap, HashSet}; use crate::protocol::Change;
use tokio::net::UdpSocket;
use crate::protocol::{Change, Hello, Report};
use crate::router::Router;
pub struct Server { pub struct Server {
pub(crate) ack: u8, pub(crate) ack: u8,
...@@ -16,45 +11,35 @@ impl Server { ...@@ -16,45 +11,35 @@ impl Server {
pub fn on_message( pub fn on_message(
&mut self, &mut self,
socket: &UdpSocket,
message: &Change, message: &Change,
routers: &mut HashMap<u8, Router>, // routers: &mut HashMap<u8, Router>,
self_peer: &Hello, // self_peer: &Hello,
) { ) {
if message.seq == 0 { if message.rst {
self.ack = 0; self.ack = message.seq;
// RouteWriter::reset(); // RouteWriter::reset();
} }
if self.ack != message.seq { if self.ack != message.seq {
println!( println!("server seq={}, local ack={}", message.seq, self.ack);
"seq mismatch rejected, server seq={}, local ack={}",
message.seq, self.ack
);
return; return;
} }
for (to, via) in message.via.iter() { // for (to, via) in message.via.iter() {
// RouteWriter::set_via(*to, *via); // RouteWriter::set_via(*to, *via);
} // }
// if let Some(plan) = message.plan.as_ref() { // if let Some(plan) = message.plan.as_ref() {
for (group_id, to) in message.plan.iter() { // for (group_id, to) in message.plan.iter() {
// RouteWriter::set_plan(&GatewayGroup::all()[*group_id], *to); // RouteWriter::set_plan(&GatewayGroup::all()[*group_id], *to);
} // }
// } // }
// RouteWriter::commit(); // RouteWriter::commit();
self.ack += 1; self.ack += 1;
self.update(socket, routers, self_peer); // self.update(socket, routers, self_peer);
} }
pub fn update( // pub fn update(&mut self, socket: &UdpSocket, routers: &mut HashMap<u8, Router>, hello: &Hello) {
&mut self, // }
socket: &UdpSocket,
routers: &mut HashMap<u8, Router>,
hello: &Hello,
) {
}
} }
use serde::Deserialize;
use std::net::SocketAddr; use std::net::SocketAddr;
use std::time::Duration; use std::time::Duration;
use config::Config;
use serde::Deserialize;
use tokio::time;
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct Settings { pub struct Settings {
pub id: u8, pub id: u8,
pub server: SocketAddr, pub server: SocketAddr,
pub port: u16, pub bind: SocketAddr,
// pub TIMEOUT: u32, // pub TIMEOUT: u32,
// pub history: usize, // pub history: usize,
// pub INTERVAL: u64, // pub INTERVAL: u64,
......
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