From 3a51f3c202277a8f723cdbf44d08b65a42ef5d61 Mon Sep 17 00:00:00 2001 From: Tsiry Sandratraina Date: Mon, 15 May 2023 00:31:13 +0300 Subject: [PATCH] fix(driver): verify if required command line tools are installed --- src/superviseur/drivers/devenv/driver.rs | 12 ++++++++++++ src/superviseur/drivers/docker/driver.rs | 11 +++++++++++ src/superviseur/drivers/nix/driver.rs | 15 +++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/src/superviseur/drivers/devenv/driver.rs b/src/superviseur/drivers/devenv/driver.rs index 802282b..ac67aca 100644 --- a/src/superviseur/drivers/devenv/driver.rs +++ b/src/superviseur/drivers/devenv/driver.rs @@ -72,6 +72,17 @@ impl Driver { } } + pub fn verify_devenv(&self) -> Result<(), Error> { + std::process::Command::new("sh") + .arg("-c") + .arg("devenv --version") + .stdout(std::process::Stdio::piped()) + .stderr(std::process::Stdio::piped()) + .spawn() + .expect("devenv is not installed, see https://devenv.sh/getting-started/"); + Ok(()) + } + pub fn write_logs(&self, stdout: ChildStdout, stderr: ChildStderr) { let cloned_service = self.service.clone(); let log_engine = self.log_engine.clone(); @@ -167,6 +178,7 @@ impl Driver { #[async_trait] impl DriverPlugin for Driver { async fn start(&self, project: String) -> Result<(), Error> { + self.verify_devenv()?; let mut sp = Spinner::new(Spinners::Line, "Setup devenv ...".into()); let envs = self.service.env.clone(); let mut envs = envs diff --git a/src/superviseur/drivers/docker/driver.rs b/src/superviseur/drivers/docker/driver.rs index a053923..4a7ab49 100644 --- a/src/superviseur/drivers/docker/driver.rs +++ b/src/superviseur/drivers/docker/driver.rs @@ -96,6 +96,16 @@ impl Driver { } } + pub fn verify_docker(&self) -> Result<(), anyhow::Error> { + let mut cmd = Command::new("docker"); + cmd.arg("--version"); + let output = cmd.output()?; + if !output.status.success() { + return Err(anyhow::anyhow!("Docker is not installed on your system")); + } + Ok(()) + } + async fn setup_container_network(&self, container_name: &str) -> anyhow::Result<()> { match &self.config { Some(cfg) => { @@ -332,6 +342,7 @@ impl Driver { #[async_trait] impl DriverPlugin for Driver { async fn start(&self, project: String) -> Result<(), anyhow::Error> { + self.verify_docker()?; let container_name = format!("{}_{}", project, self.service.name); let container = self.docker.containers().get(&container_name); match container.inspect().await { diff --git a/src/superviseur/drivers/nix/driver.rs b/src/superviseur/drivers/nix/driver.rs index 8facd97..89e7ce3 100644 --- a/src/superviseur/drivers/nix/driver.rs +++ b/src/superviseur/drivers/nix/driver.rs @@ -72,6 +72,19 @@ impl Driver { } } + pub fn verify_nix(&self) -> Result<(), Error> { + std::process::Command::new("sh") + .arg("-c") + .arg("nix --version") + .stdout(std::process::Stdio::piped()) + .stderr(std::process::Stdio::piped()) + .spawn() + .expect( + "nix is not installed, see https://github.com/DeterminateSystems/nix-installer", + ); + Ok(()) + } + pub fn write_logs(&self, stdout: ChildStdout, stderr: ChildStderr) { let cloned_service = self.service.clone(); let log_engine = self.log_engine.clone(); @@ -146,6 +159,8 @@ impl Driver { #[async_trait] impl DriverPlugin for Driver { async fn start(&self, project: String) -> Result<(), Error> { + self.verify_nix()?; + let command = format!("nix develop --command -- {}", &self.service.command); println!("command: {}", command);