Adds SFTP as a third remote ISO-library protocol alongside SMB and NFS. Pure-Rust russh + russh-sftp on the ring crypto backend — no kernel mount, no subprocess, no OpenSSL, no new C deps. Like NFS (and unlike SMB), SFTP-sourced ISOs support HTTP Range requests because SFTP opens a seekable file handle. - iso-store: SftpShareManager (connect/auth/READDIR/seekable stream), IsoSource::Sftp, password OR SSH-key auth, trust-on-first-use host-key pinning, 0600 credential sidecar with a restart-safe derived path. - http-api: /api/sftp-shares routes, Range-aware ISO dispatch arm, status/metrics counts, /api/docs entry, `sftp` terminal commands. - webui: "SFTP (SSH)" protocol option with a password/key auth toggle, host-key fingerprint display, dashboard tile, updated copy. SCP was deliberately rejected: sequential-only (no Range) and its crates wrap libssh2 (C + OpenSSL), which would break the static-musl build. russh is pinned to =0.55.0: russh 0.61 needs the stable RustCrypto generation (pkcs8 0.11), which is API-incompatible with the release- candidate crates bergshamra-crypto pins (pkcs8 =0.11.0-rc.11). 0.55 is the newest russh on the prior generation (pkcs8 0.7) that coexists. Do not bump past 0.55 until bergshamra adopts stable RustCrypto. 252 tests pass, clippy clean, static musl x86_64 binary (ring already present via rustls + bergshamra, so no new crypto/C deps). Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
59 lines
2.6 KiB
Rust
59 lines
2.6 KiB
Rust
//! ISO store: uploads, listing, introspection, boot-entry generation.
|
|
//!
|
|
//! An ISO goes through three states:
|
|
//! 1. **Uploading** — bytes streaming to a `.partial` file under `iso_dir`.
|
|
//! 2. **Introspecting** — once upload completes, we probe the ISO to detect
|
|
//! the distro family and extract kernel/initrd if applicable. Metadata
|
|
//! persisted as a sibling `.meta.json` file.
|
|
//! 3. **Ready** — listed in the menu, servable over HTTP.
|
|
//!
|
|
//! Introspection is best-effort. If we can't identify the distro, the ISO is
|
|
//! still bootable via a generic `memdisk`/`sanboot` fallback path (not
|
|
//! recommended but better than nothing).
|
|
//!
|
|
//! The `smb` submodule needs exactly one `unsafe` call to `libc::kill` for
|
|
//! SIGHUP-based Samba reload — the call is documented inline and every
|
|
//! other file in this crate is `#![forbid(unsafe_code)]`-equivalent via
|
|
//! the workspace lints.
|
|
|
|
pub mod entry;
|
|
pub mod introspect;
|
|
pub mod nfs_share;
|
|
pub mod pxe_logo;
|
|
pub mod sftp_share;
|
|
pub mod smb;
|
|
pub mod smb_share;
|
|
pub mod store;
|
|
pub mod unattended;
|
|
pub mod windows;
|
|
|
|
pub use entry::{BootEntry, BootKind, KernelArgs};
|
|
pub use introspect::{DistroFamily, IntrospectionReport};
|
|
// v0.4.65: kernel-mount NFS is gone. SMB shares via Samba's userspace
|
|
// `smbclient` CLI replaced it — works in any container (no
|
|
// CAP_SYS_ADMIN, no host kernel modules), matching how Bootimus and
|
|
// every other PXE/imaging tool that supports network storage handles
|
|
// it.
|
|
pub use smb::{extract_windows_iso, SmbManager, SmbState};
|
|
pub use smb_share::{SmbAddRequest, SmbShare, SmbShareError, SmbShareManager, SmbStream};
|
|
// v0.4.67: NFS is back — this time as an in-process userspace NFSv3
|
|
// client (the `nfs3_client` crate) rather than a kernel mount. Same
|
|
// "works in any container" property as SMB, plus support for HTTP
|
|
// Range requests because NFSv3 READ3 takes an explicit offset.
|
|
pub use nfs_share::{NfsAddRequest, NfsShare, NfsShareError, NfsShareManager, NfsStream};
|
|
// v0.5.5: SFTP-over-SSH remote shares via the pure-Rust `russh` +
|
|
// `russh-sftp` crates (ring backend — no OpenSSL, no new C deps). Like
|
|
// NFS, supports HTTP Range requests because SFTP opens a seekable file
|
|
// handle. See crates/iso-store/src/sftp_share.rs.
|
|
pub use sftp_share::{
|
|
SftpAddRequest, SftpAuthKind, SftpShare, SftpShareError, SftpShareManager, SftpStream,
|
|
};
|
|
pub use store::{
|
|
generate_boot_entries_for, slugify_str, IsoCategory, IsoMeta, IsoSource, IsoStore, UploadHandle,
|
|
};
|
|
pub use unattended::{
|
|
classify as classify_unattended, render_template, UnattendedKind, UnattendedMeta,
|
|
UnattendedStore, MAX_UNATTENDED_BYTES,
|
|
};
|
|
pub use windows::{WimPatcher, WinPatchState};
|