diff options
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/Cargo.toml | 1 | ||||
-rw-r--r-- | runtime/ops/os.rs | 55 |
2 files changed, 56 insertions, 0 deletions
diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 8733e1727..fa6ed4e25 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -70,6 +70,7 @@ http = "0.2.4" hyper = { version = "0.14.12", features = ["server", "stream", "http1", "http2", "runtime"] } libc = "0.2.106" log = "0.4.14" +netif = "0.1.0" notify = "=5.0.0-pre.12" once_cell = "=1.9.0" regex = "1.5.4" 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<Arc<AtomicI32>>) -> 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<Vec<NetworkInterface>, AnyError> { + super::check_unstable(state, "Deno.networkInterfaces"); + state.borrow_mut::<Permissions>().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<u32>, + cidr: String, + mac: String, +} + +impl From<netif::Interface> 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")] |