From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id B663F1FF164 for ; Fri, 8 Nov 2024 14:05:50 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id E1EB4DE1C; Fri, 8 Nov 2024 14:05:49 +0100 (CET) From: Christoph Heiss To: pve-devel@lists.proxmox.com Date: Fri, 8 Nov 2024 14:05:36 +0100 Message-ID: <20241108130537.1266472-5-c.heiss@proxmox.com> X-Mailer: git-send-email 2.47.0 In-Reply-To: <20241108130537.1266472-1-c.heiss@proxmox.com> References: <20241108130537.1266472-1-c.heiss@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.030 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 v2 4/4] fetch-answer: use partition label from fetch config instead of hardcoded 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: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" This has been requested by at least one user one user [0] and definitely makes sense, esp. for BMCs/IPMIs where one might not be able to control the partition label. [0] https://forum.proxmox.com/threads/proxmox-ais-question-request.153043/post-695689 Tested-By: Aaron Lauterer Reviewed-By: Aaron Lauterer Signed-off-by: Christoph Heiss --- Changes v1 -> v2: * addressed suggestions made by Aaron proxmox-auto-install-assistant/src/main.rs | 2 ++ .../src/fetch_plugins/partition.rs | 16 ++++++------- proxmox-fetch-answer/src/main.rs | 23 +++++++++++++------ 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/proxmox-auto-install-assistant/src/main.rs b/proxmox-auto-install-assistant/src/main.rs index 5d11882..9f0fbec 100644 --- a/proxmox-auto-install-assistant/src/main.rs +++ b/proxmox-auto-install-assistant/src/main.rs @@ -146,6 +146,8 @@ struct CommandPrepareISO { /// Can be used in combination with `--fetch-from partition` to set the partition label /// the auto-installer will search for. + // FAT can only handle 11 characters (per specification at least, drivers might allow more), + // so shorten "Automated Installer Source" to "AIS" to be safe. #[arg(long, default_value_t = { "proxmox-ais".to_owned() } )] partition_label: String, } diff --git a/proxmox-fetch-answer/src/fetch_plugins/partition.rs b/proxmox-fetch-answer/src/fetch_plugins/partition.rs index cbfe2d5..f4f8bcc 100644 --- a/proxmox-fetch-answer/src/fetch_plugins/partition.rs +++ b/proxmox-fetch-answer/src/fetch_plugins/partition.rs @@ -8,18 +8,16 @@ use std::{ static ANSWER_FILE: &str = "answer.toml"; static ANSWER_MP: &str = "/mnt/answer"; -// FAT can only handle 11 characters, so shorten Automated Installer Source to AIS -static PARTLABEL: &str = "proxmox-ais"; static DISK_BY_ID_PATH: &str = "/dev/disk/by-label"; pub struct FetchFromPartition; impl FetchFromPartition { /// Returns the contents of the answer file - pub fn get_answer() -> Result { + pub fn get_answer(part_label: &str) -> Result { info!("Checking for answer file on partition."); - let mut mount_path = PathBuf::from(mount_proxmoxinst_part()?); + let mut mount_path = PathBuf::from(mount_proxmoxinst_part(part_label)?); mount_path.push(ANSWER_FILE); let answer = fs::read_to_string(mount_path) .map_err(|err| format_err!("failed to read answer file - {err}"))?; @@ -74,14 +72,16 @@ fn scan_partlabels(partlabel: &str, search_path: &str) -> Result { bail!("Could not find partition for label '{partlabel}'"); } -/// Will search and mount a partition/FS labeled PARTLABEL (proxmox-ais) in lower or uppercase -/// to ANSWER_MP -fn mount_proxmoxinst_part() -> Result { +/// Searches for a partition/filesystem labeled `part_label` mounts it to `ANSWER_MP`, if found. +/// +/// # Arguments +/// * `partlabel` - Partition Label, used for matching, in the exact, upper and lower case +fn mount_proxmoxinst_part(part_label: &str) -> Result { if let Ok(true) = check_if_mounted(ANSWER_MP) { info!("Skipping: '{ANSWER_MP}' is already mounted."); return Ok(ANSWER_MP.into()); } - let part_path = scan_partlabels(PARTLABEL, DISK_BY_ID_PATH)?; + let part_path = scan_partlabels(part_label, DISK_BY_ID_PATH)?; info!("Mounting partition at {ANSWER_MP}"); // create dir for mountpoint create_dir_all(ANSWER_MP)?; diff --git a/proxmox-fetch-answer/src/main.rs b/proxmox-fetch-answer/src/main.rs index 753ab29..d56f8b9 100644 --- a/proxmox-fetch-answer/src/main.rs +++ b/proxmox-fetch-answer/src/main.rs @@ -26,6 +26,7 @@ Commands: http Fetch the answer file via HTTP(S) Additional parameters: [] [] partition Fetch the answer file from a mountable partition + Additional parameters: [] Options: -h, --help Print this help menu @@ -49,10 +50,12 @@ fn fetch_answer(install_settings: &AutoInstSettings) -> Result { Err(err) => info!("Fetching answer file from ISO failed: {err}"), } } - FetchAnswerFrom::Partition => match FetchFromPartition::get_answer() { - Ok(answer) => return Ok(answer), - Err(err) => info!("Fetching answer file from partition failed: {err}"), - }, + FetchAnswerFrom::Partition => { + match FetchFromPartition::get_answer(&install_settings.partition_label) { + Ok(answer) => return Ok(answer), + Err(err) => info!("Fetching answer file from partition failed: {err}"), + } + } FetchAnswerFrom::Http => match FetchFromHTTP::get_answer(&install_settings.http) { Ok(answer) => return Ok(answer), Err(err) => info!("Fetching answer file via HTTP failed: {err}"), @@ -74,18 +77,24 @@ fn settings_from_cli_args(args: &[String]) -> Result { }; match mode { - FetchAnswerFrom::Iso | FetchAnswerFrom::Partition if args.len() > 2 => { - bail!("'iso' and 'partition' modes do not take any additional arguments") + FetchAnswerFrom::Iso if args.len() > 2 => { + bail!("'iso' mode does not take any additional arguments") } FetchAnswerFrom::Http if args.len() > 4 => { bail!("'http' mode takes at most 2 additional arguments") } + FetchAnswerFrom::Partition if args.len() > 3 => { + bail!("'partition' mode takes at most 1 additional argument") + } _ => {} }; Ok(AutoInstSettings { mode, - partition_label: "proxmox-ais".to_owned(), + partition_label: args + .get(2) + .ok_or(format_err!("partition label expected")) + .cloned()?, http: HttpOptions { url: args.get(2).cloned(), cert_fingerprint: args.get(3).cloned(), -- 2.47.0 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel