tun_route_daemon/
lib.rs

1// Re-export interface_utils module
2pub mod interface_utils;
3
4// Re-export the route_utils module
5pub mod route_utils {
6    pub mod check_tun_device;
7    pub mod get_tun_gateway;
8    pub mod monitor_tun_device;
9    pub mod remove_specific_route;
10    pub mod revert_old_route;
11    pub mod set_default_route;
12    pub mod set_specific_route;
13    pub mod store_old_route;
14    pub mod def;
15
16    use std::io::Result;
17    use std::net::IpAddr;
18
19
20    pub async fn run_daemon(tun_device_name: &str, tun_device_ip: IpAddr) -> Result<()> {
21        // Initialize Daemon
22        println!("Daemon Initialized");
23
24        // Check Tun Device Existence
25        if check_tun_device::exists(tun_device_name).await? {
26            // Store Old Default Route
27            let old_route = store_old_route::get().await?;
28
29            // Get TUN Device's Old Gateway IP
30            let tun_old_gateway_ip = get_tun_gateway::get(tun_device_name).await?;
31
32            // Set Specific Route
33            set_specific_route::set(tun_device_ip, old_route).await?;
34
35            // Set Default Route
36            if let Some(tun_old_gateway_ip_str) = &tun_old_gateway_ip {
37                set_default_route::set(tun_old_gateway_ip_str).await?;
38            } else {
39                println!("No old gateway IP found for TUN device. Skipping setting default route.");
40            }
41
42            // Monitor Tun Device
43            let should_revert = monitor_tun_device::monitor(tun_device_name).await?;
44
45            if should_revert {
46                // Revert to Old Default Route
47                revert_old_route::revert(old_route).await?;
48
49                // Remove Specific Route
50                remove_specific_route::remove(tun_device_ip).await?;
51            }
52        } else {
53            println!("Tun device does not exist. Exiting...");
54        }
55
56        // Stop
57        println!("Daemon Stopped");
58
59        Ok(())
60    }
61}
62
63pub mod nft_utils;