From da5c6ed17282f147f0f4615866be5d0fd306230b Mon Sep 17 00:00:00 2001 From: Lucy Date: Tue, 11 Jan 2022 16:02:29 -0500 Subject: [PATCH] Work on more Rust-side bindings --- networkmanager/Cargo.toml | 2 ++ networkmanager/src/config.rs | 4 ++++ networkmanager/src/config/ip4.rs | 30 +++++++++++++++++++++++++++ networkmanager/src/config/ip6.rs | 35 ++++++++++++++++++++++++++++++++ networkmanager/src/device.rs | 33 ++++++++++++++++++++++++++++-- networkmanager/src/lib.rs | 1 + networkmanager/src/nm.rs | 13 ++++++++++++ 7 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 networkmanager/src/config.rs create mode 100644 networkmanager/src/config/ip4.rs create mode 100644 networkmanager/src/config/ip6.rs diff --git a/networkmanager/Cargo.toml b/networkmanager/Cargo.toml index 1a4e0f5..00927cc 100644 --- a/networkmanager/Cargo.toml +++ b/networkmanager/Cargo.toml @@ -6,3 +6,5 @@ license = "MPL-2.0" [dependencies] zbus = "2.0.0" + +[features] diff --git a/networkmanager/src/config.rs b/networkmanager/src/config.rs new file mode 100644 index 0000000..75eace4 --- /dev/null +++ b/networkmanager/src/config.rs @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: MPL-2.0 + +pub mod ip4; +pub mod ip6; diff --git a/networkmanager/src/config/ip4.rs b/networkmanager/src/config/ip4.rs new file mode 100644 index 0000000..adfb258 --- /dev/null +++ b/networkmanager/src/config/ip4.rs @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MPL-2.0 +use crate::interface::config::ip4::Ipv4ConfigProxy; +use std::{net::Ipv4Addr, ops::Deref}; +use zbus::Result; + +pub struct Ipv4Config<'a>(Ipv4ConfigProxy<'a>); + +impl<'a> Ipv4Config<'a> { + pub async fn addresses(&self) -> Result>> { + let addresses = self.0.addresses().await?; + Ok(addresses + .into_iter() + .map(|addresses| addresses.into_iter().map(Ipv4Addr::from).collect()) + .collect()) + } +} + +impl<'a> Deref for Ipv4Config<'a> { + type Target = Ipv4ConfigProxy<'a>; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl<'a> From> for Ipv4Config<'a> { + fn from(config: Ipv4ConfigProxy<'a>) -> Self { + Ipv4Config(config) + } +} diff --git a/networkmanager/src/config/ip6.rs b/networkmanager/src/config/ip6.rs new file mode 100644 index 0000000..10204da --- /dev/null +++ b/networkmanager/src/config/ip6.rs @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MPL-2.0 +use crate::interface::config::ip6::Ipv6ConfigProxy; +use std::{net::Ipv6Addr, ops::Deref}; +use zbus::Result; + +pub struct Ipv6Config<'a>(Ipv6ConfigProxy<'a>); + +impl<'a> Ipv6Config<'a> { + pub async fn addresses(&self) -> Result> { + let addresses = self.0.addresses().await?; + Ok(addresses + .into_iter() + .map(|(address, _, _)| { + let address_bytes: [u8; 16] = address + .try_into() + .expect("NetworkManager gave invalid IPv6 addresss"); + Ipv6Addr::from(address_bytes) + }) + .collect()) + } +} + +impl<'a> Deref for Ipv6Config<'a> { + type Target = Ipv6ConfigProxy<'a>; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl<'a> From> for Ipv6Config<'a> { + fn from(config: Ipv6ConfigProxy<'a>) -> Self { + Ipv6Config(config) + } +} diff --git a/networkmanager/src/device.rs b/networkmanager/src/device.rs index b43de6e..049cf58 100644 --- a/networkmanager/src/device.rs +++ b/networkmanager/src/device.rs @@ -4,11 +4,40 @@ pub mod bluetooth; pub mod wired; pub mod wireless; -use crate::interface::device::DeviceProxy; -use std::ops::Deref; +use crate::{ + config::{ip4::Ipv4Config, ip6::Ipv6Config}, + interface::{ + config::{ip4::Ipv4ConfigProxy, ip6::Ipv6ConfigProxy}, + device::DeviceProxy, + }, +}; +use std::{net::Ipv4Addr, ops::Deref}; +use zbus::Result; pub struct Device<'a>(DeviceProxy<'a>); +impl<'a> Device<'a> { + pub async fn ip4_address(&self) -> Result { + self.0.ip4_address().await.map(Ipv4Addr::from) + } + + pub async fn ip4_config(&self) -> Result> { + let config = Ipv4ConfigProxy::builder(self.0.connection()) + .path(self.0.ip4_config().await?)? + .build() + .await?; + Ok(Ipv4Config::from(config)) + } + + pub async fn ip6_config(&self) -> Result> { + let config = Ipv6ConfigProxy::builder(self.0.connection()) + .path(self.0.ip6_config().await?)? + .build() + .await?; + Ok(Ipv6Config::from(config)) + } +} + impl<'a> Deref for Device<'a> { type Target = DeviceProxy<'a>; diff --git a/networkmanager/src/lib.rs b/networkmanager/src/lib.rs index e287220..c1b3a5d 100644 --- a/networkmanager/src/lib.rs +++ b/networkmanager/src/lib.rs @@ -1,5 +1,6 @@ // SPDX-License-Identifier: MPL-2.0 +pub mod config; pub mod device; pub mod interface; pub mod nm; diff --git a/networkmanager/src/nm.rs b/networkmanager/src/nm.rs index 2697ecf..ad6a698 100644 --- a/networkmanager/src/nm.rs +++ b/networkmanager/src/nm.rs @@ -25,4 +25,17 @@ impl<'a> NetworkManager<'a> { } Ok(out) } + + pub async fn all_devices(&self) -> Result>> { + let devices = self.0.get_all_devices().await?; + let mut out = Vec::with_capacity(devices.len()); + for device in devices { + let device = DeviceProxy::builder(self.0.connection()) + .path(device)? + .build() + .await?; + out.push(device.into()); + } + Ok(out) + } }