use std::net::{IpAddr, SocketAddr};
use std::path::PathBuf;
use super::SshCredentials;
pub const DEFAULT_SSH_PORT: u16 = 22;
pub const DEFAULT_CONNECT_TIMEOUT_SECS: u32 = 5;
pub const DEFAULT_MAX_RETRY_ATTEMPTS: u32 = 60;
pub const DEFAULT_RETRY_INTERVAL_SECS: u32 = 5;
pub const DEFAULT_RETRY_LOG_FREQUENCY: u32 = 5;
#[derive(Clone, Debug)]
pub struct SshConnectionConfig {
pub connect_timeout_secs: u32,
pub max_retry_attempts: u32,
pub retry_interval_secs: u32,
pub retry_log_frequency: u32,
}
impl SshConnectionConfig {
#[must_use]
pub fn new(
connect_timeout_secs: u32,
max_retry_attempts: u32,
retry_interval_secs: u32,
retry_log_frequency: u32,
) -> Self {
Self {
connect_timeout_secs,
max_retry_attempts,
retry_interval_secs,
retry_log_frequency,
}
}
#[must_use]
pub fn total_timeout_secs(&self) -> u32 {
self.max_retry_attempts * self.retry_interval_secs
}
}
impl Default for SshConnectionConfig {
fn default() -> Self {
Self {
connect_timeout_secs: DEFAULT_CONNECT_TIMEOUT_SECS,
max_retry_attempts: DEFAULT_MAX_RETRY_ATTEMPTS,
retry_interval_secs: DEFAULT_RETRY_INTERVAL_SECS,
retry_log_frequency: DEFAULT_RETRY_LOG_FREQUENCY,
}
}
}
#[derive(Clone)]
pub struct SshConfig {
pub credentials: SshCredentials,
pub socket_addr: SocketAddr,
pub connection_config: SshConnectionConfig,
}
impl SshConfig {
#[must_use]
pub fn new(credentials: SshCredentials, ssh_socket_addr: SocketAddr) -> Self {
Self {
credentials,
socket_addr: ssh_socket_addr,
connection_config: SshConnectionConfig::default(),
}
}
#[must_use]
pub fn with_connection_config(
credentials: SshCredentials,
ssh_socket_addr: SocketAddr,
connection_config: SshConnectionConfig,
) -> Self {
Self {
credentials,
socket_addr: ssh_socket_addr,
connection_config,
}
}
#[must_use]
pub fn with_default_port(credentials: SshCredentials, host_ip: IpAddr) -> Self {
let socket_addr = SocketAddr::new(host_ip, DEFAULT_SSH_PORT);
Self::new(credentials, socket_addr)
}
#[must_use]
pub fn ssh_priv_key_path(&self) -> &PathBuf {
&self.credentials.ssh_priv_key_path
}
#[must_use]
pub fn ssh_pub_key_path(&self) -> &PathBuf {
&self.credentials.ssh_pub_key_path
}
#[must_use]
pub fn ssh_username(&self) -> &str {
self.credentials.ssh_username.as_str()
}
#[must_use]
pub fn ssh_port(&self) -> u16 {
self.socket_addr.port()
}
#[must_use]
pub fn host_ip(&self) -> IpAddr {
self.socket_addr.ip()
}
#[must_use]
pub fn socket_addr(&self) -> SocketAddr {
self.socket_addr
}
#[must_use]
pub fn connection_timeout_secs(&self) -> u32 {
self.connection_config.connect_timeout_secs
}
}