[workspace] resolver = "2" members = [ "crates/core", "crates/dhcp-proxy", "crates/tftp", "crates/http-api", "crates/iso-store", "crates/ipxe-assets", "crates/webui", "crates/openpxe", ] [workspace.package] version = "0.5.5" edition = "2021" rust-version = "1.95" license = "MIT OR Apache-2.0" repository = "https://gitea.milesward.dev/mward4/OpenPXE" authors = ["OpenPXE contributors"] [workspace.dependencies] tokio = { version = "1.40", features = ["full"] } tokio-util = { version = "0.7", features = ["io"] } tokio-stream = { version = "0.1", features = ["sync"] } futures = "0.3" async-trait = "0.1" dhcproto = "0.12" socket2 = { version = "0.5", features = ["all"] } bytes = "1.7" nom = "7.1" axum = { version = "0.7", features = ["macros", "multipart", "http2"] } tower = "0.5" tower-http = { version = "0.6", features = ["fs", "trace", "cors", "limit"] } hyper = "1.4" reqwest = { version = "0.12", default-features = false, features = ["rustls-tls", "stream", "json"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" toml = "0.8" # v0.5.4: layered config (TOML file + env). Pure-Rust, no C deps; keeps the # static-musl build OpenSSL-free. Replaces the hand-rolled apply_env mapping. figment = { version = "0.10", features = ["toml", "env"] } tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } anyhow = "1.0" thiserror = "2.0" clap = { version = "4.5", features = ["derive", "env"] } uuid = { version = "1.10", features = ["v4", "serde"] } time = { version = "0.3", features = ["serde", "serde-human-readable", "formatting", "macros"] } sha2 = "0.10" hex = "0.4" bcrypt = "0.15" parking_lot = "0.12" rust-embed = { version = "8.5", features = ["include-exclude"] } # v0.4.67: pure-Rust NFSv3 client. Replaces the (deleted-in-v0.4.65) # kernel-mount NFS path with an in-process implementation that works # in any container — no kernel modules, no CAP_SYS_ADMIN, no # subprocess. Ships alongside the userspace SMB consumer; operators # pick whichever protocol their NAS prefers. nfs3_client = { version = "0.9", features = ["tokio"] } nfs3_types = "0.5" # v0.5.0: SMTP for webhook notifications (Slack/Teams/Discord go over # plain HTTP via reqwest; email needs a real SMTP client). rustls TLS # to match reqwest and stay musl-static-friendly — no OpenSSL. lettre = { version = "0.11", default-features = false, features = ["smtp-transport", "tokio1-rustls-tls", "builder", "hostname"] } # v0.5.1: pure-Rust SAML 2.0 Service Provider. bergshamra does XML-DSig # verification + exclusive c14n with RustCrypto (no OpenSSL/xmlsec/libxml2 # C deps), so the static musl binary stays OpenSSL-free — samael was # rejected precisely because it hard-requires OpenSSL. We build the thin # SP layer (AuthnRequest, metadata parse, SAMLResponse semantics) on top. bergshamra = "0.4" roxmltree = "0.21" quick-xml = "0.40" x509-parser = "0.18" # flate2 default backend is miniz_oxide (pure Rust) — do NOT enable the # zlib/zlib-ng C backends, which would break the musl-static build. flate2 = "1.1" base64 = "0.22" # v0.5.5: pure-Rust SSH/SFTP client for reading remote ISO libraries # over SFTP without a kernel mount. # # CRITICAL #1 — crypto backend: `default-features = false` + # `features = ["ring"]`. russh's *default* backend is `aws-lc-rs`, which # pulls `aws-lc-sys` (C code, fiddly under musl); the `ring` feature # instead reuses `ring 0.17` — the exact crate+version already in the # binary via rustls + bergshamra — so SFTP adds ZERO new C/crypto deps # and the static-musl build stays OpenSSL-free. # # CRITICAL #2 — pinned to EXACTLY 0.55.0, the newest russh that # coexists with bergshamra-crypto (our SAML core). The RustCrypto # ecosystem is mid-transition: bergshamra-crypto pins a constellation of # release-CANDIDATE crates (`pkcs8 =0.11.0-rc.11` and its matching # pkcs5/spki RCs) that are API-incompatible with the STABLE versions of # the same crates in the same semver bucket. russh 0.56+ pulls those # stable crates (`pkcs5 0.8`), which silently replaces bergshamra's RC # copies and breaks compilation. russh ≤0.55 stays on the previous stable # generation (`pkcs5 0.7`, `ssh-key 0.6`), which unifies with bergshamra's # *stable* deps and leaves the RC bucket untouched — verified to compile. # 0.55 still has the merged `russh::keys` API (keys merged at 0.50). # IMPORTANT: do NOT bump russh past 0.55 until bergshamra-crypto adopts # the stable RustCrypto generation; 0.56+ will not compile in this tree. # # SCP was deliberately rejected: the protocol is sequential-only (no # random access → no HTTP Range, unlike SFTP/NFS) and the mature SCP # crates wrap libssh2 (C + OpenSSL), which would break this build. russh = { version = "=0.55.0", default-features = false, features = ["ring"] } russh-sftp = "2.3" openpxe-core = { path = "crates/core" } openpxe-dhcp-proxy = { path = "crates/dhcp-proxy" } openpxe-tftp = { path = "crates/tftp" } openpxe-http-api = { path = "crates/http-api" } openpxe-iso-store = { path = "crates/iso-store" } openpxe-ipxe-assets = { path = "crates/ipxe-assets" } openpxe-webui = { path = "crates/webui" } [workspace.lints.rust] unsafe_code = "deny" rust_2018_idioms = { level = "warn", priority = -1 } [workspace.lints.clippy] pedantic = { level = "warn", priority = -1 } module_name_repetitions = "allow" missing_errors_doc = "allow" missing_panics_doc = "allow" must_use_candidate = "allow" doc_markdown = "allow" items_after_statements = "allow" cast_possible_truncation = "allow" cast_lossless = "allow" cast_sign_loss = "allow" similar_names = "allow" too_many_lines = "allow" [profile.release] lto = "thin" codegen-units = 1 strip = "symbols" opt-level = 3