[pve-devel] [PATCH proxmox-firewall 06/37] config: host: add helpers for host network configuration
Lukas Wagner
l.wagner at proxmox.com
Tue Apr 9 16:20:41 CEST 2024
On 2024-04-02 19:15, Stefan Hanreich wrote:
> Currently the helpers for obtaining the host network configuration
> panic on error, which could be avoided by the use of
> OnceLock::get_or_init, but this method is currently only available in
> nightly versions.
>
> Generally, if there is a problem with obtaining a hostname for the
> current node then something else is probably already quite broken, so
> I would deem it acceptable for now, same goes for obtaining the
> current network configuration.
>
> Co-authored-by: Wolfgang Bumiller <w.bumiller at proxmox.com>
> Signed-off-by: Stefan Hanreich <s.hanreich at proxmox.com>
> ---
> proxmox-ve-config/Cargo.toml | 1 +
> proxmox-ve-config/src/host/mod.rs | 1 +
> proxmox-ve-config/src/host/utils.rs | 97 +++++++++++++++++++++++++++++
> proxmox-ve-config/src/lib.rs | 1 +
> 4 files changed, 100 insertions(+)
> create mode 100644 proxmox-ve-config/src/host/mod.rs
> create mode 100644 proxmox-ve-config/src/host/utils.rs
>
> diff --git a/proxmox-ve-config/Cargo.toml b/proxmox-ve-config/Cargo.toml
> index 7bb391e..480eb58 100644
> --- a/proxmox-ve-config/Cargo.toml
> +++ b/proxmox-ve-config/Cargo.toml
> @@ -13,6 +13,7 @@ license = "AGPL-3"
> [dependencies]
> log = "0.4"
> anyhow = "1"
> +nix = "0.26"
>
> serde = { version = "1", features = [ "derive" ] }
> serde_json = "1"
> diff --git a/proxmox-ve-config/src/host/mod.rs b/proxmox-ve-config/src/host/mod.rs
> new file mode 100644
> index 0000000..b5614dd
> --- /dev/null
> +++ b/proxmox-ve-config/src/host/mod.rs
> @@ -0,0 +1 @@
> +pub mod utils;
> diff --git a/proxmox-ve-config/src/host/utils.rs b/proxmox-ve-config/src/host/utils.rs
> new file mode 100644
> index 0000000..1636f95
> --- /dev/null
> +++ b/proxmox-ve-config/src/host/utils.rs
> @@ -0,0 +1,97 @@
> +use std::net::{IpAddr, ToSocketAddrs};
> +use std::sync::OnceLock;
> +
> +use crate::firewall::types::Cidr;
> +
> +use nix::sys::socket::{AddressFamily, SockaddrLike};
> +
> +pub fn hostname() -> &'static str {
> + static HOSTNAME: OnceLock<String> = OnceLock::new();
> +
> + // We should rather use get_or_try_init to avoid needing to panic
> + // but it is currently experimental
> + HOSTNAME.get_or_init(|| {
> + use nix::libc::{c_char, gethostname, sysconf, _SC_HOST_NAME_MAX};
> + use std::ffi::CStr;
> +
> + let max_len = unsafe { sysconf(_SC_HOST_NAME_MAX) } as usize + 1;
> + let mut buffer = vec![0; max_len];
> +
> + let ret = unsafe { gethostname(buffer.as_mut_ptr() as *mut c_char, buffer.len()) };
> +
> + if ret != 0 {
> + // failing to get the hostname means something is *really* off
> + panic!("gethostname failed with returncode {ret}");
> + }
> +
> + let c_str = CStr::from_bytes_until_nul(&buffer).expect("buffer contains a NUL byte");
> +
> + String::from_utf8_lossy(c_str.to_bytes()).to_string()
> + })
> +}
^
FYI: There is proxmox_sys::nodename() already, which also does caching. Unless I'm missing something
you could just use that instead of re-implementing it?
It uses `uname` from the nix-crate, not sure if there any differences to using `gethostname` (but
I don't think so).
--
- Lukas
More information about the pve-devel
mailing list