From bc2cb96f9ddf6f36d3a89f9b4db4bccfb39227fa Mon Sep 17 00:00:00 2001 From: "irvingouj @ Devolutions" Date: Mon, 17 Jun 2024 12:13:18 -0400 Subject: [PATCH] fix(dgw): rework network interface DTO definition (#871) Issue: DGW-133 --- .../network-scanner/src/interfaces/linux.rs | 11 +++++-- crates/network-scanner/src/interfaces/mod.rs | 9 ++++-- .../network-scanner/src/interfaces/windows.rs | 10 ++++-- devolutions-gateway/src/api/net.rs | 32 +++++++++++++------ 4 files changed, 46 insertions(+), 16 deletions(-) diff --git a/crates/network-scanner/src/interfaces/linux.rs b/crates/network-scanner/src/interfaces/linux.rs index 7d8a49b42..8505e2086 100644 --- a/crates/network-scanner/src/interfaces/linux.rs +++ b/crates/network-scanner/src/interfaces/linux.rs @@ -10,6 +10,8 @@ use netlink_packet_route::link::{LinkAttribute, LinkFlag}; use netlink_packet_route::route::{RouteAddress, RouteAttribute, RouteMessage}; use rtnetlink::{new_connection, Handle}; +use super::InterfaceAddress; + pub async fn get_network_interfaces() -> anyhow::Result> { let (connection, handle, _) = new_connection()?; tokio::spawn(connection); @@ -138,8 +140,13 @@ fn convert_link_info_to_network_interface(link_info: &LinkInfo) -> anyhow::Resul name: link_info.name.clone(), description: None, mac_address: link_info.mac.as_slice().try_into().ok(), - ip_addresses, - prefixes, + addresses: prefixes + .into_iter() + .map(|(addr, prefix)| InterfaceAddress { + ip: addr, + prefixlen: prefix, + }) + .collect(), operational_status: link_info.flags.contains(&LinkFlag::Up), gateways, dns_servers: link_info.dns_servers.clone(), diff --git a/crates/network-scanner/src/interfaces/mod.rs b/crates/network-scanner/src/interfaces/mod.rs index df3819e2b..02c9eaa3e 100644 --- a/crates/network-scanner/src/interfaces/mod.rs +++ b/crates/network-scanner/src/interfaces/mod.rs @@ -64,13 +64,18 @@ impl serde::Serialize for MacAddr { } } +#[derive(Debug, Clone)] +pub struct InterfaceAddress { + pub ip: IpAddr, + pub prefixlen: u32, +} + #[derive(Debug, Clone)] pub struct NetworkInterface { pub name: String, pub description: Option, pub mac_address: Option, - pub ip_addresses: Vec, - pub prefixes: Vec<(IpAddr, u32)>, + pub addresses: Vec, pub operational_status: bool, pub gateways: Vec, pub dns_servers: Vec, diff --git a/crates/network-scanner/src/interfaces/windows.rs b/crates/network-scanner/src/interfaces/windows.rs index e294d1c98..f786148cd 100644 --- a/crates/network-scanner/src/interfaces/windows.rs +++ b/crates/network-scanner/src/interfaces/windows.rs @@ -19,8 +19,14 @@ impl From for NetworkInterface { name: adapter.adapter_name().to_string(), description: Some(adapter.description().to_string()), mac_address, - ip_addresses: adapter.ip_addresses().to_vec(), - prefixes: adapter.prefixes().to_vec(), + addresses: adapter + .prefixes() + .iter() + .map(|(ip, prefix)| super::InterfaceAddress { + ip: ip.clone(), + prefixlen: *prefix, + }) + .collect(), operational_status: adapter.oper_status() == ipconfig::OperStatus::IfOperStatusUp, gateways: adapter.gateways().to_vec(), dns_servers: adapter.dns_servers().to_vec(), diff --git a/devolutions-gateway/src/api/net.rs b/devolutions-gateway/src/api/net.rs index f7fe6e0e4..e019eb411 100644 --- a/devolutions-gateway/src/api/net.rs +++ b/devolutions-gateway/src/api/net.rs @@ -214,6 +214,13 @@ pub async fn get_net_config(_token: crate::extract::NetScanToken) -> Result))] #[serde(skip_serializing_if = "Option::is_none")] pub mac_address: Option, - #[cfg_attr(feature = "openapi", schema(value_type = Vec))] - pub ip_addresses: Vec, - #[cfg_attr(feature = "openapi", schema(value_type = Vec<(String, u32)>))] - pub prefixes: Vec<(IpAddr, u32)>, - pub operational_status: bool, + #[cfg_attr(feature = "openapi", schema(value_type = Vec))] + pub addresses: Vec, + #[cfg_attr(feature = "openapi", schema(value_type = bool))] + pub is_up: bool, #[cfg_attr(feature = "openapi", schema(value_type = Vec))] pub gateways: Vec, #[cfg_attr(feature = "openapi", schema(value_type = Vec))] - pub dns_servers: Vec, + pub nameservers: Vec, } impl From for NetworkInterface { @@ -241,11 +247,17 @@ impl From for NetworkInterface { name: iface.name, description: iface.description, mac_address: iface.mac_address, - ip_addresses: iface.ip_addresses, - prefixes: iface.prefixes, - operational_status: iface.operational_status, + addresses: iface + .addresses + .into_iter() + .map(|addr| InterfaceAddress { + ip: addr.ip, + prefixlen: addr.prefixlen, + }) + .collect(), + is_up: iface.operational_status, gateways: iface.gateways, - dns_servers: iface.dns_servers, + nameservers: iface.dns_servers, } } }