use crate::utils::ssh_deploy::{
client::SshClient, errors::DeploymentError, types::DeploymentConfig,
};
pub fn install_dependencies(
client: &mut SshClient,
deployment_config: &DeploymentConfig,
) -> Result<(), DeploymentError> {
client.execute_command("sudo apt-get update")?;
install_common_dependencies(client)?;
install_svm_specific_dependencies(client, deployment_config)?;
install_rust_if_needed(client)?;
Ok(())
}
fn install_common_dependencies(client: &mut SshClient) -> Result<(), DeploymentError> {
client.execute_command(
"sudo apt-get install -y build-essential libssl-dev pkg-config curl git",
)?;
Ok(())
}
fn install_svm_specific_dependencies(
client: &mut SshClient,
deployment_config: &DeploymentConfig,
) -> Result<(), DeploymentError> {
match deployment_config.svm_type.as_str() {
"solana" => {
if !client.is_package_installed("libudev-dev")? {
client.execute_command("sudo apt-get install -y libudev-dev")?;
}
}
"sonic" => {
if !client.is_package_installed("libclang-dev")? {
client.execute_command("sudo apt-get install -y libclang-dev")?;
}
}
"sui" => {
if !client.is_package_installed("cmake")? {
client.execute_command("sudo apt-get install -y cmake")?;
}
}
"aptos" => {
if !client.is_package_installed("libncursesw5")? {
client.execute_command("sudo apt-get install -y libncursesw5")?;
}
}
_ => {
return Err(DeploymentError::ValidationError(format!(
"Unsupported SVM type: {}",
deployment_config.svm_type
)));
}
}
Ok(())
}
fn install_rust_if_needed(client: &mut SshClient) -> Result<(), DeploymentError> {
if !client.is_package_installed("rustc")? {
client.execute_command(
"curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y",
)?;
client.execute_command("source $HOME/.cargo/env")?;
}
Ok(())
}
pub fn install_docker_if_needed(client: &mut SshClient) -> Result<(), DeploymentError> {
if !client.is_package_installed("docker-ce")? {
client.execute_command("curl -fsSL https://get.docker.com -o get-docker.sh")?;
client.execute_command("sudo sh get-docker.sh")?;
client.execute_command("sudo usermod -aG docker $(whoami)")?;
}
if !client.is_package_installed("docker-compose")? {
client.execute_command(
"sudo curl -L \"https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose"
)?;
client.execute_command("sudo chmod +x /usr/local/bin/docker-compose")?;
}
Ok(())
}
pub fn install_nodejs_if_needed(client: &mut SshClient) -> Result<(), DeploymentError> {
if !client.is_package_installed("nodejs")? {
client
.execute_command("curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -")?;
client.execute_command("sudo apt-get install -y nodejs")?;
}
Ok(())
}