dcd 0.1.9

Docker Compose Deployment tool for remote servers
Documentation
use super::error::DockerError;
use super::types::{DockerResult, LinuxDistro};
use crate::deployer::types::ComposeExec;

pub struct DockerInstaller<'a> {
    executor: &'a mut (dyn ComposeExec + Send),
}

impl<'a> DockerInstaller<'a> {
    pub fn new(executor: &'a mut (dyn ComposeExec + Send)) -> Self {
        Self { executor }
    }

    pub async fn install_docker(&mut self, distro: &LinuxDistro) -> DockerResult<()> {
        match distro {
            LinuxDistro::Debian | LinuxDistro::Ubuntu => {
                let commands = [
                    "apt-get update",
                    "apt-get install -y ca-certificates curl gnupg",
                    "install -m 0755 -d /etc/apt/keyrings",
                    "curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg",
                    "chmod a+r /etc/apt/keyrings/docker.gpg",
                    "echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable\" | tee /etc/apt/sources.list.d/docker.list > /dev/null",
                    "apt-get update",
                    "apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin"
                ];

                for cmd in commands {
                    let result = self
                        .executor
                        .execute_command(cmd)
                        .await
                        .map_err(DockerError::from)?;

                    if !result.is_success() {
                        return Err(DockerError::InstallationError(format!(
                            "Failed to execute: {}",
                            cmd
                        )));
                    }
                }
                Ok(())
            }
            LinuxDistro::Unknown(os) => Err(DockerError::UnsupportedOS(os.clone())),
        }
    }

    pub async fn install_docker_compose(&mut self) -> DockerResult<()> {
        let commands = [
            "curl -L \"https://github.com/docker/compose/releases/download/v2.32.1/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose",
            "chmod +x /usr/local/bin/docker-compose"
        ];

        for cmd in commands {
            let result = self
                .executor
                .execute_command(cmd)
                .await
                .map_err(DockerError::from)?;

            if !result.is_success() {
                return Err(DockerError::InstallationError(format!(
                    "Failed to execute: {}",
                    cmd
                )));
            }
        }
        Ok(())
    }
}