[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