From 1678690c362597422dad682535ee0584d78e79ee Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Thu, 23 Dec 2021 00:00:43 +0100 Subject: feat(runtime): add op_network_interfaces (#12964) Add an op to list the network interfaces on the system. Prep work for #8137 and `os.networkInterfaces()` Node compat in std. Refs denoland/deno_std#1436. --- runtime/ops/os.rs | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'runtime/ops') diff --git a/runtime/ops/os.rs b/runtime/ops/os.rs index 81f8a529e..bbc571cc6 100644 --- a/runtime/ops/os.rs +++ b/runtime/ops/os.rs @@ -25,6 +25,7 @@ pub fn init(maybe_exit_code: Option>) -> Extension { ("op_delete_env", op_sync(op_delete_env)), ("op_hostname", op_sync(op_hostname)), ("op_loadavg", op_sync(op_loadavg)), + ("op_network_interfaces", op_sync(op_network_interfaces)), ("op_os_release", op_sync(op_os_release)), ("op_set_exit_code", op_sync(op_set_exit_code)), ("op_system_memory_info", op_sync(op_system_memory_info)), @@ -149,6 +150,60 @@ fn op_os_release( Ok(release) } +fn op_network_interfaces( + state: &mut OpState, + _: (), + _: (), +) -> Result, AnyError> { + super::check_unstable(state, "Deno.networkInterfaces"); + state.borrow_mut::().env.check_all()?; + Ok(netif::up()?.map(NetworkInterface::from).collect()) +} + +#[derive(serde::Serialize)] +struct NetworkInterface { + family: &'static str, + name: String, + address: String, + netmask: String, + scopeid: Option, + cidr: String, + mac: String, +} + +impl From for NetworkInterface { + fn from(ifa: netif::Interface) -> Self { + let family = match ifa.address() { + std::net::IpAddr::V4(_) => "IPv4", + std::net::IpAddr::V6(_) => "IPv6", + }; + + let (address, range) = ifa.cidr(); + let cidr = format!("{:?}/{}", address, range); + + let name = ifa.name().to_owned(); + let address = format!("{:?}", ifa.address()); + let netmask = format!("{:?}", ifa.netmask()); + let scopeid = ifa.scope_id(); + + let [b0, b1, b2, b3, b4, b5] = ifa.mac(); + let mac = format!( + "{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}", + b0, b1, b2, b3, b4, b5 + ); + + Self { + family, + name, + address, + netmask, + scopeid, + cidr, + mac, + } + } +} + // Copied from sys-info/lib.rs (then tweaked) #[derive(Serialize)] #[serde(rename_all = "camelCase")] -- cgit v1.2.3