From de33c7d521adbbdf7e10125f4cb87c264f002ee0 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Mon, 26 May 2025 19:21:40 +0200 Subject: [PATCH] Check if qemu-img is present before startup --- virtweb_backend/src/constants.rs | 3 +++ virtweb_backend/src/main.rs | 8 +++++++- virtweb_backend/src/utils/exec_utils.rs | 10 ++++++++++ virtweb_backend/src/utils/file_disks_utils.rs | 7 ++++--- virtweb_backend/src/utils/mod.rs | 1 + 5 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 virtweb_backend/src/utils/exec_utils.rs diff --git a/virtweb_backend/src/constants.rs b/virtweb_backend/src/constants.rs index 56d998f..b19b740 100644 --- a/virtweb_backend/src/constants.rs +++ b/virtweb_backend/src/constants.rs @@ -108,3 +108,6 @@ pub const API_TOKEN_DESCRIPTION_MAX_LENGTH: usize = 30; /// API token right path max length pub const API_TOKEN_RIGHT_PATH_MAX_LENGTH: usize = 255; + +/// Qemu image program path +pub const QEMU_IMAGE_PROGRAM: &str = "/usr/bin/qemu-img"; diff --git a/virtweb_backend/src/main.rs b/virtweb_backend/src/main.rs index e3d1bbf..955b62c 100644 --- a/virtweb_backend/src/main.rs +++ b/virtweb_backend/src/main.rs @@ -28,7 +28,7 @@ use virtweb_backend::controllers::{ use virtweb_backend::libvirt_client::LibVirtClient; use virtweb_backend::middlewares::auth_middleware::AuthChecker; use virtweb_backend::nat::nat_conf_mode; -use virtweb_backend::utils::files_utils; +use virtweb_backend::utils::{exec_utils, files_utils}; #[actix_web::main] async fn main() -> std::io::Result<()> { @@ -43,6 +43,12 @@ async fn main() -> std::io::Result<()> { // Load additional config from file, if requested AppConfig::parse_env_file().unwrap(); + log::debug!("Checking for required programs"); + exec_utils::check_program( + constants::QEMU_IMAGE_PROGRAM, + "QEMU disk image utility is required to manipulate QCow2 files!", + ); + log::debug!("Create required directory, if missing"); files_utils::create_directory_if_missing(AppConfig::get().iso_storage_path()).unwrap(); files_utils::create_directory_if_missing(AppConfig::get().vnc_sockets_path()).unwrap(); diff --git a/virtweb_backend/src/utils/exec_utils.rs b/virtweb_backend/src/utils/exec_utils.rs new file mode 100644 index 0000000..479cf2d --- /dev/null +++ b/virtweb_backend/src/utils/exec_utils.rs @@ -0,0 +1,10 @@ +use std::path::Path; + +/// Check the existence of a required program +pub fn check_program(name: &str, description: &str) { + let path = Path::new(name); + + if !path.exists() { + panic!("{name} does not exist! {description}"); + } +} diff --git a/virtweb_backend/src/utils/file_disks_utils.rs b/virtweb_backend/src/utils/file_disks_utils.rs index 0487801..6cfdbcb 100644 --- a/virtweb_backend/src/utils/file_disks_utils.rs +++ b/virtweb_backend/src/utils/file_disks_utils.rs @@ -155,7 +155,7 @@ impl FileDisk { } DiskFormat::QCow2 => { - let mut cmd = Command::new("/usr/bin/qemu-img"); + let mut cmd = Command::new(constants::QEMU_IMAGE_PROGRAM); cmd.arg("create") .arg("-f") .arg("qcow2") @@ -189,12 +189,13 @@ struct QCowInfoOutput { /// Get QCow2 virtual size fn qcow_virt_size(path: &str) -> anyhow::Result { // Run qemu-img - let mut cmd = Command::new("qemu-img"); + let mut cmd = Command::new(constants::QEMU_IMAGE_PROGRAM); cmd.args(["info", path, "--output", "json", "--force-share"]); let output = cmd.output()?; if !output.status.success() { anyhow::bail!( - "qemu-img info failed, status: {}, stderr: {}", + "{} info failed, status: {}, stderr: {}", + constants::QEMU_IMAGE_PROGRAM, output.status, String::from_utf8_lossy(&output.stderr) ); diff --git a/virtweb_backend/src/utils/mod.rs b/virtweb_backend/src/utils/mod.rs index 991bedf..3bdd6bf 100644 --- a/virtweb_backend/src/utils/mod.rs +++ b/virtweb_backend/src/utils/mod.rs @@ -1,3 +1,4 @@ +pub mod exec_utils; pub mod file_disks_utils; pub mod files_utils; pub mod net_utils;