2024-02-05 19:10:02 +00:00
|
|
|
use std::time::Duration;
|
2024-02-12 14:24:38 +00:00
|
|
|
|
|
|
|
use anyhow::Result;
|
|
|
|
use autonet::{AutoNetworkChangeset, AutoNetworkCollector, NetworkMetadata};
|
2024-02-05 19:10:02 +00:00
|
|
|
use tokio::time::sleep;
|
2024-02-12 14:24:38 +00:00
|
|
|
use vbridge::VirtualBridge;
|
2024-02-06 14:35:55 +00:00
|
|
|
|
2024-02-09 08:04:23 +00:00
|
|
|
use crate::backend::NetworkBackend;
|
2024-02-05 12:45:45 +00:00
|
|
|
|
2024-02-12 14:24:38 +00:00
|
|
|
pub mod autonet;
|
2024-02-10 21:13:47 +00:00
|
|
|
pub mod backend;
|
|
|
|
pub mod chandev;
|
|
|
|
pub mod icmp;
|
|
|
|
pub mod nat;
|
2024-02-12 11:11:04 +00:00
|
|
|
pub mod pkt;
|
2024-02-10 21:13:47 +00:00
|
|
|
pub mod proxynat;
|
|
|
|
pub mod raw_socket;
|
2024-02-12 14:24:38 +00:00
|
|
|
pub mod vbridge;
|
2024-02-08 12:17:51 +00:00
|
|
|
|
2024-02-05 19:10:02 +00:00
|
|
|
pub struct NetworkService {
|
2024-02-12 14:24:38 +00:00
|
|
|
pub bridge: VirtualBridge,
|
2024-02-05 19:10:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl NetworkService {
|
2024-02-12 14:24:38 +00:00
|
|
|
pub fn new() -> Result<NetworkService> {
|
2024-02-11 10:07:47 +00:00
|
|
|
Ok(NetworkService {
|
2024-02-12 14:24:38 +00:00
|
|
|
bridge: VirtualBridge::new()?,
|
2024-02-11 10:07:47 +00:00
|
|
|
})
|
2024-02-05 19:10:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl NetworkService {
|
|
|
|
pub async fn watch(&mut self) -> Result<()> {
|
2024-02-12 14:24:38 +00:00
|
|
|
let mut collector = AutoNetworkCollector::new()?;
|
2024-02-05 19:10:02 +00:00
|
|
|
loop {
|
2024-02-12 14:24:38 +00:00
|
|
|
let changeset = collector.read_changes()?;
|
|
|
|
self.process_network_changeset(changeset)?;
|
2024-02-06 06:19:36 +00:00
|
|
|
sleep(Duration::from_secs(2)).await;
|
2024-02-05 19:10:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-02-12 14:24:38 +00:00
|
|
|
fn process_network_changeset(&mut self, changeset: AutoNetworkChangeset) -> Result<()> {
|
|
|
|
for metadata in &changeset.added {
|
|
|
|
futures::executor::block_on(async {
|
|
|
|
self.add_network_backend(metadata.clone()).await
|
|
|
|
})?;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn add_network_backend(&mut self, metadata: NetworkMetadata) -> Result<()> {
|
|
|
|
let mut network = NetworkBackend::new(metadata, self.bridge.clone())?;
|
2024-02-05 19:10:02 +00:00
|
|
|
network.init().await?;
|
2024-02-06 06:19:36 +00:00
|
|
|
tokio::time::sleep(Duration::from_secs(1)).await;
|
2024-02-12 14:24:38 +00:00
|
|
|
network.launch().await?;
|
2024-02-05 19:10:02 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|