增加ssh
增加deploy下细分的tcp、tls、ssh
This commit is contained in:
@@ -13,6 +13,7 @@ use crate::rtr::cache::SharedRtrCache;
|
||||
use crate::rtr::server::config::RtrServiceConfig;
|
||||
use crate::rtr::server::listener::RtrServer;
|
||||
use crate::rtr::server::notifier::RtrNotifier;
|
||||
use crate::rtr::server::ssh::load_rtr_ssh_runtime_config;
|
||||
|
||||
pub struct RtrService {
|
||||
cache: SharedRtrCache,
|
||||
@@ -86,6 +87,18 @@ impl RtrService {
|
||||
)
|
||||
}
|
||||
|
||||
pub fn ssh_server(&self, bind_addr: SocketAddr) -> RtrServer {
|
||||
RtrServer::new(
|
||||
bind_addr,
|
||||
self.cache.clone(),
|
||||
self.notify_tx.clone(),
|
||||
self.shutdown_tx.clone(),
|
||||
self.connection_limiter.clone(),
|
||||
self.active_connections.clone(),
|
||||
self.config.clone(),
|
||||
)
|
||||
}
|
||||
|
||||
pub fn spawn_tcp(&self, bind_addr: SocketAddr) -> JoinHandle<()> {
|
||||
if self.config.warn_insecure_tcp {
|
||||
warn!(
|
||||
@@ -141,6 +154,111 @@ impl RtrService {
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub fn spawn_ssh_from_openssh(
|
||||
&self,
|
||||
bind_addr: SocketAddr,
|
||||
host_key_path: impl AsRef<Path>,
|
||||
authorized_keys_path: impl AsRef<Path>,
|
||||
username: &str,
|
||||
subsystem_name: &str,
|
||||
password: Option<&str>,
|
||||
) -> JoinHandle<()> {
|
||||
let host_key_path = host_key_path.as_ref().to_path_buf();
|
||||
let authorized_keys_path = authorized_keys_path.as_ref().to_path_buf();
|
||||
let username = username.to_string();
|
||||
let subsystem_name = subsystem_name.to_string();
|
||||
let password = password.map(ToString::to_string);
|
||||
let inactivity_timeout = Some(std::time::Duration::from_secs(3600));
|
||||
let keepalive_interval = self.config.tcp_keepalive;
|
||||
let server = self.ssh_server(bind_addr);
|
||||
|
||||
tokio::spawn(async move {
|
||||
let runtime_config = match load_rtr_ssh_runtime_config(
|
||||
&host_key_path,
|
||||
&authorized_keys_path,
|
||||
&username,
|
||||
&subsystem_name,
|
||||
password.as_deref(),
|
||||
inactivity_timeout,
|
||||
keepalive_interval,
|
||||
) {
|
||||
Ok(cfg) => Arc::new(cfg),
|
||||
Err(err) => {
|
||||
error!(
|
||||
"RTR SSH server {} failed to load configuration: {:?}",
|
||||
bind_addr, err
|
||||
);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
if let Err(err) = server.run_ssh(runtime_config).await {
|
||||
error!("RTR SSH server {} exited with error: {:?}", bind_addr, err);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub fn spawn_tcp_and_ssh_from_openssh(
|
||||
&self,
|
||||
tcp_bind_addr: SocketAddr,
|
||||
ssh_bind_addr: SocketAddr,
|
||||
host_key_path: impl AsRef<Path>,
|
||||
authorized_keys_path: impl AsRef<Path>,
|
||||
username: &str,
|
||||
subsystem_name: &str,
|
||||
password: Option<&str>,
|
||||
) -> RunningRtrService {
|
||||
let tcp_handle = self.spawn_tcp(tcp_bind_addr);
|
||||
let ssh_handle = self.spawn_ssh_from_openssh(
|
||||
ssh_bind_addr,
|
||||
host_key_path,
|
||||
authorized_keys_path,
|
||||
username,
|
||||
subsystem_name,
|
||||
password,
|
||||
);
|
||||
|
||||
RunningRtrService {
|
||||
shutdown_tx: self.shutdown_tx.clone(),
|
||||
handles: vec![tcp_handle, ssh_handle],
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub fn spawn_tcp_tls_and_ssh_from_pem_and_openssh(
|
||||
&self,
|
||||
tcp_bind_addr: SocketAddr,
|
||||
tls_bind_addr: SocketAddr,
|
||||
ssh_bind_addr: SocketAddr,
|
||||
cert_path: impl AsRef<Path>,
|
||||
key_path: impl AsRef<Path>,
|
||||
client_ca_path: impl AsRef<Path>,
|
||||
host_key_path: impl AsRef<Path>,
|
||||
authorized_keys_path: impl AsRef<Path>,
|
||||
username: &str,
|
||||
subsystem_name: &str,
|
||||
password: Option<&str>,
|
||||
) -> RunningRtrService {
|
||||
let tcp_handle = self.spawn_tcp(tcp_bind_addr);
|
||||
let tls_handle =
|
||||
self.spawn_tls_from_pem(tls_bind_addr, cert_path, key_path, client_ca_path);
|
||||
let ssh_handle = self.spawn_ssh_from_openssh(
|
||||
ssh_bind_addr,
|
||||
host_key_path,
|
||||
authorized_keys_path,
|
||||
username,
|
||||
subsystem_name,
|
||||
password,
|
||||
);
|
||||
|
||||
RunningRtrService {
|
||||
shutdown_tx: self.shutdown_tx.clone(),
|
||||
handles: vec![tcp_handle, tls_handle, ssh_handle],
|
||||
}
|
||||
}
|
||||
|
||||
pub fn spawn_tcp_only(&self, tcp_bind_addr: SocketAddr) -> RunningRtrService {
|
||||
let tcp_handle = self.spawn_tcp(tcp_bind_addr);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user