use std::net::Ipv4Addr; use async_trait::async_trait; use super::{cidr_to_subnet_mask, run_shell_cmd, Error, IfConfiguerTrait}; pub struct MacIfConfiger {} #[async_trait] impl IfConfiguerTrait for MacIfConfiger { async fn add_ipv4_route( &self, name: &str, address: Ipv4Addr, cidr_prefix: u8, ) -> Result<(), Error> { run_shell_cmd( format!( "route -n add {} -netmask {} -interface {} -hopcount 7", address, cidr_to_subnet_mask(cidr_prefix), name ) .as_str(), ) .await } async fn remove_ipv4_route( &self, name: &str, address: Ipv4Addr, cidr_prefix: u8, ) -> Result<(), Error> { run_shell_cmd( format!( "route -n delete {} -netmask {} -interface {}", address, cidr_to_subnet_mask(cidr_prefix), name ) .as_str(), ) .await } async fn add_ipv4_ip( &self, name: &str, address: Ipv4Addr, cidr_prefix: u8, ) -> Result<(), Error> { run_shell_cmd( format!( "ifconfig {} {:?}/{:?} 10.8.8.8 up", name, address, cidr_prefix, ) .as_str(), ) .await } async fn set_link_status(&self, name: &str, up: bool) -> Result<(), Error> { run_shell_cmd(format!("ifconfig {} {}", name, if up { "up" } else { "down" }).as_str()) .await } async fn remove_ip(&self, name: &str, ip: Option) -> Result<(), Error> { if ip.is_none() { run_shell_cmd(format!("ifconfig {} inet delete", name).as_str()).await } else { run_shell_cmd( format!("ifconfig {} inet {} delete", name, ip.unwrap().to_string()).as_str(), ) .await } } async fn set_mtu(&self, name: &str, mtu: u32) -> Result<(), Error> { run_shell_cmd(format!("ifconfig {} mtu {}", name, mtu).as_str()).await } }