sshd: reduce tokio usage

This commit is contained in:
Mikaël Cluseau
2026-07-16 10:38:26 +02:00
parent 30cdf9456b
commit ace0da9253
+14 -10
View File
@@ -1,6 +1,8 @@
use log::{info, warn}; use log::{info, warn};
use std::{fs, io::Write, os::unix::fs::PermissionsExt, process::Stdio}; use std::{
use tokio::{net, process::Command}; fs, io::Write, os::unix::fs::PermissionsExt, process::Command, process::Stdio, sync::Arc,
thread,
};
use super::retry_or_ignore; use super::retry_or_ignore;
use dkl::bootstrap::{Config, SSHServer}; use dkl::bootstrap::{Config, SSHServer};
@@ -29,22 +31,24 @@ pub async fn start(cfg: &Config) {
}) })
.await; .await;
let cfg = cfg.ssh.clone(); let cfg = Arc::new(cfg.ssh.clone());
retry_or_ignore(async move || { retry_or_ignore(async move || {
// don't pre-start sshd as it should rarely be useful at this stage, use inetd-style. // don't pre-start sshd as it should rarely be useful at this stage, use inetd-style.
let listen_addr = cfg.listen.clone(); let listen_addr = cfg.listen.clone();
info!("ssh: starting listener on {listen_addr}"); 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(()) Ok(())
}) })
.await; .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(); let mut sshd_args = Vec::new();
sshd_args.extend(["-i", "-E", "/var/log/sshd.log"]); 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; let mut keygen_done = false;
loop { loop {
let (stream, remote) = match listener.accept().await { let (stream, remote) = match listener.accept() {
Ok(v) => v, Ok(v) => v,
Err(e) => { Err(e) => {
warn!("ssh: listener stopped: {e}"); warn!("ssh: listener stopped: {e}");
@@ -72,7 +76,7 @@ async fn handle_ssh_connections(listener: net::TcpListener, cfg: SSHServer) {
if !keygen_done { if !keygen_done {
// make sure we have ssh host keys even if not provided // 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}")) .inspect_err(|e| warn!("ssh-keygen failed: {e}"))
.is_ok_and(|s| s.success()) .is_ok_and(|s| s.success())
{ {
@@ -96,11 +100,11 @@ async fn handle_ssh_connections(listener: net::TcpListener, cfg: SSHServer) {
continue; continue;
}; };
let pid = child.id().unwrap(); let pid = child.id();
info!("ssh: new connection from {remote}, sshd PID {pid}"); info!("ssh: new connection from {remote}, sshd PID {pid}");
tokio::spawn(async move { tokio::spawn(async move {
let _ = child.wait().await; let _ = child.wait();
}); });
} }
} }