From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 919ED91C4A for ; Wed, 4 Oct 2023 18:04:01 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 741DB10903 for ; Wed, 4 Oct 2023 18:03:31 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for ; Wed, 4 Oct 2023 18:03:30 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 64B2C44880 for ; Wed, 4 Oct 2023 18:03:30 +0200 (CEST) From: Christoph Heiss To: pve-devel@lists.proxmox.com Date: Wed, 4 Oct 2023 18:00:55 +0200 Message-ID: <20231004160325.704249-2-c.heiss@proxmox.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231004160325.704249-1-c.heiss@proxmox.com> References: <20231004160325.704249-1-c.heiss@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.026 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH installer 1/3] tui: refactor `NetworkOptions` to have a `defaults_from()` function X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 04 Oct 2023 16:04:01 -0000 This aligns it with the other constructors for options struct by introducing a `::defaults_from()` function. No functional changes. Signed-off-by: Christoph Heiss --- proxmox-tui-installer/src/main.rs | 15 ++++++------ proxmox-tui-installer/src/options.rs | 36 ++++++++++------------------ proxmox-tui-installer/src/setup.rs | 10 ++++---- 3 files changed, 24 insertions(+), 37 deletions(-) diff --git a/proxmox-tui-installer/src/main.rs b/proxmox-tui-installer/src/main.rs index 3f01713..ea8c8d9 100644 --- a/proxmox-tui-installer/src/main.rs +++ b/proxmox-tui-installer/src/main.rs @@ -166,7 +166,6 @@ enum InstallerStep { #[derive(Clone)] struct InstallerState { options: InstallerOptions, - /// FIXME: Remove: setup_info: SetupInfo, runtime_info: RuntimeInfo, locales: LocaleInfo, @@ -184,7 +183,7 @@ fn main() { _ => cfg!(debug_assertions), }; - let (locales, runtime_info) = match installer_setup(in_test_mode) { + let (setup_info, locales, runtime_info) = match installer_setup(in_test_mode) { Ok(result) => result, Err(err) => initial_setup_error(&mut siv, &err), }; @@ -197,10 +196,10 @@ fn main() { bootdisk: BootdiskOptions::defaults_from(&runtime_info.disks[0]), timezone: TimezoneOptions::defaults_from(&runtime_info, &locales), password: Default::default(), - network: NetworkOptions::from(&runtime_info.network), + network: NetworkOptions::defaults_from(&setup_info, &runtime_info.network), autoreboot: false, }, - setup_info: setup_info().clone(), // FIXME: REMOVE + setup_info, runtime_info, locales, steps: HashMap::new(), @@ -211,20 +210,20 @@ fn main() { siv.run(); } -fn installer_setup(in_test_mode: bool) -> Result<(LocaleInfo, RuntimeInfo), String> { +fn installer_setup(in_test_mode: bool) -> Result<(SetupInfo, LocaleInfo, RuntimeInfo), String> { let base_path = if in_test_mode { "./testdir" } else { "/" }; let mut path = PathBuf::from(base_path); path.push("run"); path.push("proxmox-installer"); - let installer_info = { + let installer_info: SetupInfo = { let mut path = path.clone(); path.push("iso-info.json"); setup::read_json(&path).map_err(|err| format!("Failed to retrieve setup info: {err}"))? }; - init_setup_info(installer_info); + init_setup_info(installer_info.clone()); let locale_info = { let mut path = path.clone(); @@ -245,7 +244,7 @@ fn installer_setup(in_test_mode: bool) -> Result<(LocaleInfo, RuntimeInfo), Stri if runtime_info.disks.is_empty() { Err("The installer could not find any supported hard disks.".to_owned()) } else { - Ok((locale_info, runtime_info)) + Ok((installer_info, locale_info, runtime_info)) } } diff --git a/proxmox-tui-installer/src/options.rs b/proxmox-tui-installer/src/options.rs index a0a81c9..56ad7f2 100644 --- a/proxmox-tui-installer/src/options.rs +++ b/proxmox-tui-installer/src/options.rs @@ -1,7 +1,7 @@ use std::net::{IpAddr, Ipv4Addr}; use std::{cmp, fmt}; -use crate::setup::{LocaleInfo, NetworkInfo, RuntimeInfo}; +use crate::setup::{LocaleInfo, NetworkInfo, RuntimeInfo, SetupInfo}; use crate::utils::{CidrAddress, Fqdn}; use crate::SummaryOption; @@ -337,43 +337,33 @@ pub struct NetworkOptions { pub dns_server: IpAddr, } -impl Default for NetworkOptions { - fn default() -> Self { - let fqdn = format!( - "{}.example.invalid", - crate::current_product().default_hostname() - ); - // TODO: Retrieve automatically - Self { +impl NetworkOptions { + pub fn defaults_from(setup: &SetupInfo, network: &NetworkInfo) -> Self { + let hostname = setup.config.product.default_hostname(); + + let mut this = Self { ifname: String::new(), - fqdn: fqdn.parse().unwrap(), + fqdn: Fqdn::from(&format!("{hostname}.example.invalid")).unwrap(), // Safety: The provided mask will always be valid. address: CidrAddress::new(Ipv4Addr::UNSPECIFIED, 0).unwrap(), gateway: Ipv4Addr::UNSPECIFIED.into(), dns_server: Ipv4Addr::UNSPECIFIED.into(), - } - } -} - -impl From<&NetworkInfo> for NetworkOptions { - fn from(info: &NetworkInfo) -> Self { - let mut this = Self::default(); + }; - if let Some(ip) = info.dns.dns.first() { + if let Some(ip) = network.dns.dns.first() { this.dns_server = *ip; } - if let Some(domain) = &info.dns.domain { - let hostname = crate::current_product().default_hostname(); + if let Some(domain) = &network.dns.domain { if let Ok(fqdn) = Fqdn::from(&format!("{hostname}.{domain}")) { this.fqdn = fqdn; } } - if let Some(routes) = &info.routes { + if let Some(routes) = &network.routes { let mut filled = false; if let Some(gw) = &routes.gateway4 { - if let Some(iface) = info.interfaces.get(&gw.dev) { + if let Some(iface) = network.interfaces.get(&gw.dev) { this.ifname = iface.name.clone(); if let Some(addresses) = &iface.addresses { if let Some(addr) = addresses.iter().find(|addr| addr.is_ipv4()) { @@ -386,7 +376,7 @@ impl From<&NetworkInfo> for NetworkOptions { } if !filled { if let Some(gw) = &routes.gateway6 { - if let Some(iface) = info.interfaces.get(&gw.dev) { + if let Some(iface) = network.interfaces.get(&gw.dev) { if let Some(addresses) = &iface.addresses { if let Some(addr) = addresses.iter().find(|addr| addr.is_ipv6()) { this.ifname = iface.name.clone(); diff --git a/proxmox-tui-installer/src/setup.rs b/proxmox-tui-installer/src/setup.rs index 942e319..493bfaf 100644 --- a/proxmox-tui-installer/src/setup.rs +++ b/proxmox-tui-installer/src/setup.rs @@ -196,12 +196,10 @@ impl From for InstallConfig { mngmt_nic: options.network.ifname, - hostname: options - .network - .fqdn - .host() - .unwrap_or_else(|| crate::current_product().default_hostname()) - .to_owned(), + // Safety: At this point, it is know that we have a valid FQDN, as + // this is set by the TUI network panel, which only lets the user + // continue if a valid FQDN is provided. + hostname: options.network.fqdn.host().expect("valid FQDN").to_owned(), domain: options.network.fqdn.domain(), cidr: options.network.address, gateway: options.network.gateway, -- 2.42.0