use crate::utils::ssh_deploy::{client::SshClient, errors::DeploymentError};
pub fn setup_disk_storage(
client: &mut SshClient,
ledger_disk: &str,
accounts_disk: &str,
) -> Result<(), DeploymentError> {
create_mount_directories(client)?;
format_and_mount_disk(client, ledger_disk, "/mnt/ledger")?;
format_and_mount_disk(client, accounts_disk, "/mnt/extras")?;
client.execute_command("mkdir -p /mnt/extras/snapshot /mnt/extras/accounts")?;
client.execute_command("sudo chown -R $(whoami):$(whoami) /mnt/ledger /mnt/extras")?;
Ok(())
}
fn create_mount_directories(client: &mut SshClient) -> Result<(), DeploymentError> {
client.execute_command("sudo mkdir -p /mnt/ledger /mnt/extras")?;
Ok(())
}
fn format_and_mount_disk(
client: &mut SshClient,
disk: &str,
mount_point: &str,
) -> Result<(), DeploymentError> {
let mount_check = client.execute_command(&format!("findmnt -S {} -o TARGET -n", disk))?;
if !mount_check.trim().is_empty() {
if mount_check.trim() == mount_point {
return Ok(());
}
return Err(DeploymentError::DeploymentError(format!(
"Disk {} is already mounted at {}, cannot mount at {}",
disk,
mount_check.trim(),
mount_point
)));
}
let _confirmation =
client.execute_command(&format!("echo \"y\" | sudo mkfs -t ext4 {}", disk))?;
client.execute_command(&format!("sudo mount {} {}", disk, mount_point))?;
let fstab_entry = format!("{} {} ext4 defaults,noatime 0 2", disk, mount_point);
let _fstab_check = client.execute_command(&format!(
"grep -q '{}' /etc/fstab || echo '{}' | sudo tee -a /etc/fstab",
disk, fstab_entry
))?;
Ok(())
}
pub fn validate_disk_requirements(
client: &mut SshClient,
ledger_disk: &str,
accounts_disk: &str,
) -> Result<(), DeploymentError> {
if !disk_exists(client, ledger_disk)? {
return Err(DeploymentError::DeploymentError(format!(
"Ledger disk {} does not exist",
ledger_disk
)));
}
if !disk_exists(client, accounts_disk)? {
return Err(DeploymentError::DeploymentError(format!(
"Accounts disk {} does not exist",
accounts_disk
)));
}
let ledger_size = get_disk_size(client, ledger_disk)?;
let accounts_size = get_disk_size(client, accounts_disk)?;
const MIN_LEDGER_SIZE: u64 = 2000; const MIN_ACCOUNTS_SIZE: u64 = 2000;
if ledger_size < MIN_LEDGER_SIZE {
return Err(DeploymentError::DeploymentError(format!(
"Ledger disk size is {}GB, minimum required is {}GB",
ledger_size, MIN_LEDGER_SIZE
)));
}
if accounts_size < MIN_ACCOUNTS_SIZE {
return Err(DeploymentError::DeploymentError(format!(
"Accounts disk size is {}GB, minimum required is {}GB",
accounts_size, MIN_ACCOUNTS_SIZE
)));
}
Ok(())
}
fn disk_exists(client: &mut SshClient, disk: &str) -> Result<bool, DeploymentError> {
let result = client.execute_command(&format!("test -b {} && echo 'exists'", disk))?;
Ok(result.trim() == "exists")
}
fn get_disk_size(client: &mut SshClient, disk: &str) -> Result<u64, DeploymentError> {
let size_bytes = client.execute_command(&format!("lsblk -b -n -o SIZE {}", disk))?;
let size_bytes = size_bytes.trim().parse::<u64>().map_err(|e| {
DeploymentError::DeploymentError(format!("Failed to parse disk size: {}", e))
})?;
Ok(size_bytes / 1_000_000_000)
}