sshd: reduce tokio usage
This commit is contained in:
+14
-10
@@ -1,6 +1,8 @@
|
||||
use log::{info, warn};
|
||||
use std::{fs, io::Write, os::unix::fs::PermissionsExt, process::Stdio};
|
||||
use tokio::{net, process::Command};
|
||||
use std::{
|
||||
fs, io::Write, os::unix::fs::PermissionsExt, process::Command, process::Stdio, sync::Arc,
|
||||
thread,
|
||||
};
|
||||
|
||||
use super::retry_or_ignore;
|
||||
use dkl::bootstrap::{Config, SSHServer};
|
||||
@@ -29,22 +31,24 @@ pub async fn start(cfg: &Config) {
|
||||
})
|
||||
.await;
|
||||
|
||||
let cfg = cfg.ssh.clone();
|
||||
let cfg = Arc::new(cfg.ssh.clone());
|
||||
retry_or_ignore(async move || {
|
||||
// don't pre-start sshd as it should rarely be useful at this stage, use inetd-style.
|
||||
let listen_addr = cfg.listen.clone();
|
||||
info!("ssh: starting listener on {listen_addr}");
|
||||
|
||||
let listener = net::TcpListener::bind(listen_addr).await?;
|
||||
let listener = tokio::net::TcpListener::bind(listen_addr).await?;
|
||||
|
||||
tokio::spawn(handle_ssh_connections(listener, cfg.clone()));
|
||||
let cfg = cfg.clone();
|
||||
let listener = listener.into_std().unwrap();
|
||||
thread::spawn(move || handle_ssh_connections(listener, &cfg));
|
||||
|
||||
Ok(())
|
||||
})
|
||||
.await;
|
||||
}
|
||||
|
||||
async fn handle_ssh_connections(listener: net::TcpListener, cfg: SSHServer) {
|
||||
fn handle_ssh_connections(listener: std::net::TcpListener, cfg: &SSHServer) {
|
||||
let mut sshd_args = Vec::new();
|
||||
|
||||
sshd_args.extend(["-i", "-E", "/var/log/sshd.log"]);
|
||||
@@ -62,7 +66,7 @@ async fn handle_ssh_connections(listener: net::TcpListener, cfg: SSHServer) {
|
||||
let mut keygen_done = false;
|
||||
|
||||
loop {
|
||||
let (stream, remote) = match listener.accept().await {
|
||||
let (stream, remote) = match listener.accept() {
|
||||
Ok(v) => v,
|
||||
Err(e) => {
|
||||
warn!("ssh: listener stopped: {e}");
|
||||
@@ -72,7 +76,7 @@ async fn handle_ssh_connections(listener: net::TcpListener, cfg: SSHServer) {
|
||||
|
||||
if !keygen_done {
|
||||
// make sure we have ssh host keys even if not provided
|
||||
if (Command::new("ssh-keygen").arg("-A").status().await)
|
||||
if (Command::new("ssh-keygen").arg("-A").status())
|
||||
.inspect_err(|e| warn!("ssh-keygen failed: {e}"))
|
||||
.is_ok_and(|s| s.success())
|
||||
{
|
||||
@@ -96,11 +100,11 @@ async fn handle_ssh_connections(listener: net::TcpListener, cfg: SSHServer) {
|
||||
continue;
|
||||
};
|
||||
|
||||
let pid = child.id().unwrap();
|
||||
let pid = child.id();
|
||||
info!("ssh: new connection from {remote}, sshd PID {pid}");
|
||||
|
||||
tokio::spawn(async move {
|
||||
let _ = child.wait().await;
|
||||
let _ = child.wait();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user