Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 17b35bc339 | |||
| ace0da9253 |
+5
-5
@@ -1,4 +1,4 @@
|
|||||||
from rust:1.96.0-alpine as rust
|
from rust:1.97.0-alpine as rust
|
||||||
|
|
||||||
run apk add --no-cache git musl-dev libudev-zero-dev openssl-dev cryptsetup-dev lvm2-dev clang-libs clang-dev
|
run apk add --no-cache git musl-dev libudev-zero-dev openssl-dev cryptsetup-dev lvm2-dev clang-libs clang-dev
|
||||||
|
|
||||||
@@ -9,7 +9,7 @@ run --mount=type=cache,id=novit-rs,target=/usr/local/cargo/registry \
|
|||||||
RUSTFLAGS="-C target-feature=-crt-static" cargo install --path . --root /dist
|
RUSTFLAGS="-C target-feature=-crt-static" cargo install --path . --root /dist
|
||||||
|
|
||||||
# ------------------------------------------------------------------------
|
# ------------------------------------------------------------------------
|
||||||
from alpine:3.23.4 as system
|
from alpine:3.24.1 as system
|
||||||
|
|
||||||
workdir /system
|
workdir /system
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ run . /etc/os-release \
|
|||||||
&& wget -O- https://dl-cdn.alpinelinux.org/alpine/v${VERSION_ID%.*}/releases/x86_64/alpine-minirootfs-${VERSION_ID}-x86_64.tar.gz |tar zxv
|
&& wget -O- https://dl-cdn.alpinelinux.org/alpine/v${VERSION_ID%.*}/releases/x86_64/alpine-minirootfs-${VERSION_ID}-x86_64.tar.gz |tar zxv
|
||||||
|
|
||||||
run apk add --no-cache --update -p . musl libgcc coreutils \
|
run apk add --no-cache --update -p . musl libgcc coreutils \
|
||||||
ethtool iproute2 lvm2 lvm2-extra lvm2-dmeventd udev cryptsetup \
|
ethtool iproute2 lvm2 lvm2-extra device-mapper-dmeventd udev cryptsetup \
|
||||||
e2fsprogs lsblk openssl openssh-server wireguard-tools-wg-quick \
|
e2fsprogs lsblk openssl openssh-server wireguard-tools-wg-quick \
|
||||||
&& rm -rf usr/share/apk var/cache/apk etc/motd dev/*
|
&& rm -rf usr/share/apk var/cache/apk etc/motd dev/*
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ run mkdir -p bin run var/log; cd bin && for cmd in init-version init-connect boo
|
|||||||
run chroot . init-version
|
run chroot . init-version
|
||||||
|
|
||||||
# ------------------------------------------------------------------------
|
# ------------------------------------------------------------------------
|
||||||
from alpine:3.23.4 as initrd
|
from alpine:3.24.1 as initrd
|
||||||
|
|
||||||
copy --from=system /system /system
|
copy --from=system /system /system
|
||||||
run cd /system && find * |cpio -H newc -oF /initrd
|
run cd /system && find * |cpio -H newc -oF /initrd
|
||||||
@@ -47,7 +47,7 @@ run mkfs.erofs \
|
|||||||
/initramfs /system
|
/initramfs /system
|
||||||
|
|
||||||
# ------------------------------------------------------------------------
|
# ------------------------------------------------------------------------
|
||||||
from alpine:3.23.4
|
from alpine:3.24.1
|
||||||
copy --from=initrd /initrd /initrd
|
copy --from=initrd /initrd /initrd
|
||||||
entrypoint ["base64","/initrd"]
|
entrypoint ["base64","/initrd"]
|
||||||
|
|
||||||
|
|||||||
+14
-10
@@ -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();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user