diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 14db4d6..c788043 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -22,6 +22,13 @@ jobs: name: coman-Linux-x86_64-musl.tar.gz cargo_command: cargo + - os_name: Linux-aarch64 + os: ubuntu-24.04-arm + target: aarch64-unknown-linux-musl + bin: coman + name: coman-Linux-aarch64-musl.tar.gz + cargo_command: cargo + - os_name: Windows-aarch64 os: windows-latest target: aarch64-pc-windows-msvc @@ -47,7 +54,7 @@ jobs: - name: Install oas3-gen run: cargo install oas3-gen@0.21.1 - name: Install build dependencies on Linux - run: sudo apt-get update --yes && sudo apt-get install --yes musl-tools openssl libssl-dev + run: sudo apt-get update --yes && sudo apt-get install --yes musl-tools openssl libssl-dev squashfs-tools if: contains(matrix.platform.os, 'ubuntu') - name: Build binary (*nix) shell: bash @@ -76,6 +83,9 @@ jobs: else tar czvf ../../../${{ matrix.platform.name }} ${{ matrix.platform.bin }} fi + if [[ "${{ matrix.platform.os }}" == "ubuntu-latest" ]]; then + mksquashfs coman coman_${{matrix.platform.os_name}}.sqsh + fi cd - - name: Publish GitHub release uses: softprops/action-gh-release@v1 diff --git a/Cargo.lock b/Cargo.lock index bc17fe7..99c26a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,17 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aead" +version = "0.6.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac8202ab55fcbf46ca829833f347a82a2a4ce0596f0304ac322c2d100030cd56" +dependencies = [ + "bytes", + "crypto-common 0.2.0-rc.4", + "inout 0.2.1", +] + [[package]] name = "aes" version = "0.8.4" @@ -24,7 +35,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", - "cipher", + "cipher 0.4.4", "cpufeatures", ] @@ -119,6 +130,9 @@ name = "anyhow" version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +dependencies = [ + "backtrace", +] [[package]] name = "arc-swap" @@ -132,6 +146,18 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + [[package]] name = "async-broadcast" version = "0.7.2" @@ -156,6 +182,19 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-compat" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ba85bc55464dcbf728b56d97e119d673f4cf9062be330a9a26f3acf504a590" +dependencies = [ + "futures-core", + "futures-io", + "once_cell", + "pin-project-lite", + "tokio", +] + [[package]] name = "async-executor" version = "1.13.3" @@ -274,12 +313,44 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version", +] + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + [[package]] name = "atomic-waker" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "attohttpc" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e2cdb6d5ed835199484bb92bb8b3edd526effe995c61732580439c1a67e2e9" +dependencies = [ + "base64 0.22.1", + "http 1.4.0", + "log", + "url", +] + [[package]] name = "autocfg" version = "1.0.1" @@ -371,10 +442,10 @@ dependencies = [ "http 0.2.12", "http 1.4.0", "http-body 0.4.6", - "lru", + "lru 0.12.5", "percent-encoding", "regex-lite", - "sha2", + "sha2 0.10.9", "tracing", "url", ] @@ -400,7 +471,7 @@ dependencies = [ "p256 0.11.1", "percent-encoding", "ring", - "sha2", + "sha2 0.10.9", "subtle", "time", "tracing", @@ -433,8 +504,8 @@ dependencies = [ "http-body 0.4.6", "md-5", "pin-project-lite", - "sha1", - "sha2", + "sha1 0.10.6", + "sha2 0.10.9", "tracing", ] @@ -492,7 +563,7 @@ dependencies = [ "hyper-util", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.32", + "rustls 0.23.35", "rustls-native-certs 0.8.2", "rustls-pki-types", "tokio", @@ -609,6 +680,17 @@ dependencies = [ "tracing", ] +[[package]] +name = "backon" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cffb0e931875b666fc4fcb20fee52e9bbd1ef836fd9e9e04ec21555f9f85f7ef" +dependencies = [ + "fastrand", + "gloo-timers", + "tokio", +] + [[package]] name = "backtrace" version = "0.3.76" @@ -621,7 +703,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -636,6 +718,18 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +[[package]] +name = "base16ct" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b59d472eab27ade8d770dcb11da7201c11234bef9f82ce7aa517be028d462b" + +[[package]] +name = "base32" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "022dfe9eb35f19ebbcb51e0b40a5ab759f46ad60cadf7297e0bd085afb50e076" + [[package]] name = "base64" version = "0.13.1" @@ -700,6 +794,19 @@ dependencies = [ "serde", ] +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -709,6 +816,16 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96eb4cdd6cf1b31d671e9efe75c5d1ec614776856cefbe109ca373554a6d514f" +dependencies = [ + "hybrid-array", + "zeroize", +] + [[package]] name = "block-padding" version = "0.3.3" @@ -742,6 +859,12 @@ dependencies = [ "serde", ] +[[package]] +name = "btparse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387e80962b798815a2b5c4bcfdb6bf626fa922ffe9f74e373103b858738e9f31" + [[package]] name = "bumpalo" version = "3.19.0" @@ -829,7 +952,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" dependencies = [ - "cipher", + "cipher 0.4.4", ] [[package]] @@ -844,6 +967,12 @@ dependencies = [ "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cfg-if" version = "1.0.3" @@ -856,6 +985,18 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd162f2b8af3e0639d83f28a637e4e55657b7a74508dba5a9bf4da523d5c9e9" +dependencies = [ + "cfg-if", + "cipher 0.5.0-rc.1", + "cpufeatures", + "zeroize", +] + [[package]] name = "chrono" version = "0.4.42" @@ -867,7 +1008,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -898,8 +1039,20 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "crypto-common", - "inout", + "crypto-common 0.1.6", + "inout 0.1.4", +] + +[[package]] +name = "cipher" +version = "0.5.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e12a13eb01ded5d32ee9658d94f553a19e804204f2dc811df69ab4d9e0cb8c7" +dependencies = [ + "block-buffer 0.11.0", + "crypto-common 0.2.0-rc.4", + "inout 0.2.1", + "zeroize", ] [[package]] @@ -990,6 +1143,26 @@ dependencies = [ "cc", ] +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.17", +] + +[[package]] +name = "color-backtrace" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308329d5d62e877ba02943db3a8e8c052de9fde7ab48283395ba0e6494efbabd" +dependencies = [ + "backtrace", + "btparse", + "termcolor", +] + [[package]] name = "color-eyre" version = "0.6.5" @@ -1025,10 +1198,11 @@ checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "coman" -version = "0.4.0" +version = "0.5.0" dependencies = [ "anyhow", "aws-sdk-s3", + "base64 0.22.1", "better-panic", "chrono", "claim", @@ -1040,6 +1214,7 @@ dependencies = [ "crossterm 0.29.0", "derive_deref", "directories", + "dirs", "docker_credential", "eyre", "firecrest_client", @@ -1047,6 +1222,8 @@ dependencies = [ "human-panic", "injectorpp", "inquire", + "iroh 0.95.1", + "iroh-ssh", "itertools 0.14.0", "json5", "keyring-lib", @@ -1057,15 +1234,19 @@ dependencies = [ "open", "openidconnect", "openssl", + "pid1", "pretty_assertions", + "rand 0.9.2", "ratatui", + "regex", "reqwest", "rstest", + "rust_supervisor", "serde", "serde_json", "signal-hook", "strip-ansi-escapes", - "strum", + "strum 0.26.3", "strum_macros 0.27.2", "tabled", "tera", @@ -1080,6 +1261,17 @@ dependencies = [ "tui-realm-treeview", "tuirealm", "vergen-gix", + "whoami", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", ] [[package]] @@ -1143,6 +1335,12 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const-oid" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dabb6555f92fb9ee4140454eb5dcd14c7960e1225c6d1a6cc361f032947713e" + [[package]] name = "const-random" version = "0.1.18" @@ -1163,6 +1361,12 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + [[package]] name = "convert_case" version = "0.6.0" @@ -1181,6 +1385,16 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "cordyceps" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" +dependencies = [ + "loom", + "tracing", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1238,7 +1452,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ddc2d09feefeee8bd78101665bd8645637828fa9317f9f292496dbbd8c65ff3" dependencies = [ "crc", - "digest", + "digest 0.10.7", "rand 0.9.2", "regex", "rustversion", @@ -1253,6 +1467,21 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-deque" version = "0.8.6" @@ -1302,7 +1531,7 @@ checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ "bitflags", "crossterm_winapi", - "derive_more", + "derive_more 2.0.1", "document-features", "futures-core", "mio", @@ -1363,6 +1592,48 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8235645834fbc6832939736ce2f2d08192652269e11010a6240f61b908a1c6" +dependencies = [ + "hybrid-array", + "rand_core 0.9.3", +] + +[[package]] +name = "crypto_box" +version = "0.10.0-pre.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bda4de3e070830cf3a27a394de135b6709aefcc54d1e16f2f029271254a6ed9" +dependencies = [ + "aead", + "chacha20", + "crypto_secretbox", + "curve25519-dalek 5.0.0-pre.1", + "salsa20", + "serdect", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto_secretbox" +version = "0.2.0-pre.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54532aae6546084a52cef855593daf9555945719eeeda9974150e0def854873e" +dependencies = [ + "aead", + "chacha20", + "cipher 0.5.0-rc.1", + "hybrid-array", + "poly1305", + "salsa20", + "subtle", + "zeroize", +] + [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -1372,9 +1643,27 @@ dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", - "digest", - "fiat-crypto", + "digest 0.10.7", + "fiat-crypto 0.2.9", + "rustc_version", + "subtle", + "zeroize", +] + +[[package]] +name = "curve25519-dalek" +version = "5.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f9200d1d13637f15a6acb71e758f64624048d85b31a5fdbfd8eca1e2687d0b7" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.11.0-rc.3", + "fiat-crypto 0.3.0", + "rand_core 0.9.3", "rustc_version", + "serde", "subtle", "zeroize", ] @@ -1474,6 +1763,12 @@ dependencies = [ "parking_lot_core", ] +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + [[package]] name = "dbus" version = "0.9.9" @@ -1500,7 +1795,7 @@ dependencies = [ "num", "once_cell", "openssl", - "sha2", + "sha2 0.10.9", "zeroize", ] @@ -1510,7 +1805,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" dependencies = [ - "const-oid", + "const-oid 0.9.6", "zeroize", ] @@ -1520,8 +1815,19 @@ version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ - "const-oid", - "pem-rfc7468", + "const-oid 0.9.6", + "pem-rfc7468 0.7.0", + "zeroize", +] + +[[package]] +name = "der" +version = "0.8.0-rc.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02c1d73e9668ea6b6a28172aa55f3ebec38507131ce179051c8033b5c6037653" +dependencies = [ + "const-oid 0.10.1", + "pem-rfc7468 1.0.0", "zeroize", ] @@ -1577,13 +1883,34 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl 1.0.0", +] + [[package]] name = "derive_more" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl", + "derive_more-impl 2.0.1", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", + "unicode-xid", ] [[package]] @@ -1605,6 +1932,12 @@ version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abd57806937c9cc163efc8ea3910e00a62e2aeb0b8119f1793a978088f8f6b04" +[[package]] +name = "diatomic-waker" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" + [[package]] name = "diff" version = "0.1.13" @@ -1617,19 +1950,39 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", + "block-buffer 0.10.4", + "const-oid 0.9.6", + "crypto-common 0.1.6", "subtle", ] +[[package]] +name = "digest" +version = "0.11.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac89f8a64533a9b0eaa73a68e424db0fb1fd6271c74cc0125336a05f090568d" +dependencies = [ + "block-buffer 0.11.0", + "const-oid 0.10.1", + "crypto-common 0.2.0-rc.4", +] + [[package]] name = "directories" version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" dependencies = [ - "dirs-sys", + "dirs-sys 0.4.1", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys 0.5.0", ] [[package]] @@ -1640,10 +1993,22 @@ checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" dependencies = [ "libc", "option-ext", - "redox_users", + "redox_users 0.4.6", "windows-sys 0.48.0", ] +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users 0.5.2", + "windows-sys 0.61.1", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -1655,6 +2020,17 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "dlopen2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" +dependencies = [ + "libc", + "once_cell", + "winapi", +] + [[package]] name = "dlv-list" version = "0.5.2" @@ -1715,7 +2091,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der 0.7.10", - "digest", + "digest 0.10.7", "elliptic-curve 0.13.8", "rfc6979 0.4.0", "signature 2.2.0", @@ -1733,15 +2109,43 @@ dependencies = [ ] [[package]] -name = "ed25519-dalek" +name = "ed25519" +version = "3.0.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "594435fe09e345ee388e4e8422072ff7dfeca8729389fbd997b3f5504c44cd47" +dependencies = [ + "pkcs8 0.11.0-rc.8", + "serde", + "signature 3.0.0-rc.5", +] + +[[package]] +name = "ed25519-dalek" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ - "curve25519-dalek", - "ed25519", + "curve25519-dalek 4.1.3", + "ed25519 2.2.3", + "rand_core 0.6.4", + "serde", + "sha2 0.10.9", + "subtle", + "zeroize", +] + +[[package]] +name = "ed25519-dalek" +version = "3.0.0-pre.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad207ed88a133091f83224265eac21109930db09bedcad05d5252f2af2de20a1" +dependencies = [ + "curve25519-dalek 5.0.0-pre.1", + "ed25519 3.0.0-rc.2", + "rand_core 0.9.3", "serde", - "sha2", + "sha2 0.11.0-rc.2", + "signature 3.0.0-rc.5", "subtle", "zeroize", ] @@ -1761,7 +2165,7 @@ dependencies = [ "base16ct 0.1.1", "crypto-bigint 0.4.9", "der 0.6.1", - "digest", + "digest 0.10.7", "ff 0.12.1", "generic-array", "group 0.12.1", @@ -1780,12 +2184,12 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct 0.2.0", "crypto-bigint 0.5.5", - "digest", + "digest 0.10.7", "ff 0.13.1", "generic-array", "group 0.13.0", "hkdf", - "pem-rfc7468", + "pem-rfc7468 0.7.0", "pkcs8 0.10.2", "rand_core 0.6.4", "sec1 0.7.3", @@ -1793,6 +2197,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "encode_unicode" version = "1.0.0" @@ -1814,6 +2230,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "enumflags2" version = "0.7.12" @@ -1897,7 +2325,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7223ae2d2f179b803433d9c830478527e92b8117eab39460edae7f1614d9fb73" dependencies = [ - "heapless", + "heapless 0.8.0", "serde", ] @@ -1933,6 +2361,12 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +[[package]] +name = "fiat-crypto" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" + [[package]] name = "file-size" version = "1.0.3" @@ -1999,6 +2433,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "foreign-types" version = "0.3.2" @@ -2044,6 +2484,19 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-buffered" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8e0e1f38ec07ba4abbde21eed377082f17ccb988be9d988a5adbf4bafc118fd" +dependencies = [ + "cordyceps", + "diatomic-waker", + "futures-core", + "pin-project-lite", + "spin 0.10.0", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -2146,6 +2599,21 @@ dependencies = [ "thread_local", ] +[[package]] +name = "generator" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows-link 0.2.1", + "windows-result 0.4.1", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -3033,6 +3501,18 @@ dependencies = [ "walkdir", ] +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "group" version = "0.12.1" @@ -3093,6 +3573,15 @@ dependencies = [ "tracing", ] +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + [[package]] name = "hash32" version = "0.3.1" @@ -3126,7 +3615,7 @@ checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", - "foldhash", + "foldhash 0.1.5", ] [[package]] @@ -3134,6 +3623,11 @@ name = "hashbrown" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash 0.2.0", +] [[package]] name = "hashlink" @@ -3144,13 +3638,27 @@ dependencies = [ "hashbrown 0.14.5", ] +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32 0.2.1", + "rustc_version", + "serde", + "spin 0.9.8", + "stable_deref_trait", +] + [[package]] name = "heapless" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" dependencies = [ - "hash32", + "hash32 0.3.1", "stable_deref_trait", ] @@ -3172,6 +3680,59 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hickory-proto" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" +dependencies = [ + "async-trait", + "bytes", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "h2 0.4.12", + "http 1.4.0", + "idna", + "ipnet", + "once_cell", + "rand 0.9.2", + "ring", + "rustls 0.23.35", + "thiserror 2.0.17", + "tinyvec", + "tokio", + "tokio-rustls 0.26.4", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "moka", + "once_cell", + "parking_lot", + "rand 0.9.2", + "resolv-conf", + "rustls 0.23.35", + "smallvec", + "thiserror 2.0.17", + "tokio", + "tokio-rustls 0.26.4", + "tracing", +] + [[package]] name = "hkdf" version = "0.12.4" @@ -3187,7 +3748,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -3199,6 +3760,18 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "homedir" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68df315d2857b2d8d2898be54a85e1d001bbbe0dbb5f8ef847b48dd3a23c4527" +dependencies = [ + "cfg-if", + "nix 0.30.1", + "widestring", + "windows 0.61.3", +] + [[package]] name = "http" version = "0.2.12" @@ -3300,6 +3873,16 @@ dependencies = [ "libm", ] +[[package]] +name = "hybrid-array" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f471e0a81b2f90ffc0cb2f951ae04da57de8baa46fa99112b062a5173a5088d0" +dependencies = [ + "typenum", + "zeroize", +] + [[package]] name = "hyper" version = "0.14.32" @@ -3338,6 +3921,7 @@ dependencies = [ "http 1.4.0", "http-body 1.0.1", "httparse", + "httpdate", "itoa", "pin-project-lite", "pin-utils", @@ -3371,7 +3955,7 @@ dependencies = [ "http 1.4.0", "hyper 1.7.0", "hyper-util", - "rustls 0.23.32", + "rustls 0.23.35", "rustls-native-certs 0.8.2", "rustls-pki-types", "tokio", @@ -3434,7 +4018,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core", + "windows-core 0.62.2", ] [[package]] @@ -3559,6 +4143,27 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "igd-next" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516893339c97f6011282d5825ac94fc1c7aad5cad26bdc2d0cee068c0bf97f97" +dependencies = [ + "async-trait", + "attohttpc", + "bytes", + "futures", + "http 1.4.0", + "http-body-util", + "hyper 1.7.0", + "hyper-util", + "log", + "rand 0.9.2", + "tokio", + "url", + "xmltree", +] + [[package]] name = "ignore" version = "0.4.25" @@ -3638,6 +4243,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "inout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7357b6e7aa75618c7864ebd0634b115a7218b0615f4cb1df33ac3eca23943d4" +dependencies = [ + "hybrid-array", +] + [[package]] name = "inquire" version = "0.9.1" @@ -3665,6 +4279,30 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2 0.5.10", + "widestring", + "windows-sys 0.48.0", + "winreg", +] + [[package]] name = "ipnet" version = "2.11.0" @@ -3682,41 +4320,421 @@ dependencies = [ ] [[package]] -name = "is-docker" -version = "0.2.0" +name = "iroh" +version = "0.94.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +checksum = "b9428cef1eafd2eac584269986d1949e693877ac12065b401dfde69f664b07ac" dependencies = [ - "once_cell", + "aead", + "backon", + "bytes", + "cfg_aliases", + "crypto_box", + "data-encoding", + "derive_more 2.0.1", + "ed25519-dalek 3.0.0-pre.1", + "futures-util", + "getrandom 0.3.3", + "hickory-resolver", + "http 1.4.0", + "igd-next", + "instant", + "iroh-base 0.94.1", + "iroh-metrics 0.36.2", + "iroh-quinn", + "iroh-quinn-proto", + "iroh-quinn-udp", + "iroh-relay 0.94.0", + "n0-future", + "n0-snafu", + "n0-watcher 0.4.0", + "nested_enum_utils", + "netdev", + "netwatch 0.11.0", + "pin-project", + "pkarr", + "pkcs8 0.11.0-rc.8", + "portmapper 0.11.0", + "rand 0.9.2", + "reqwest", + "rustls 0.23.35", + "rustls-pki-types", + "rustls-platform-verifier", + "rustls-webpki 0.103.7", + "serde", + "smallvec", + "snafu", + "strum 0.27.2", + "time", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "url", + "wasm-bindgen-futures", + "webpki-roots", + "z32", ] [[package]] -name = "is-wsl" -version = "0.4.0" +name = "iroh" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +checksum = "2374ba3cdaac152dc6ada92d971f7328e6408286faab3b7350842b2ebbed4789" dependencies = [ - "is-docker", - "once_cell", + "aead", + "backon", + "bytes", + "cfg_aliases", + "crypto_box", + "data-encoding", + "derive_more 2.0.1", + "ed25519-dalek 3.0.0-pre.1", + "futures-util", + "getrandom 0.3.3", + "hickory-resolver", + "http 1.4.0", + "igd-next", + "instant", + "iroh-base 0.95.1", + "iroh-metrics 0.37.0", + "iroh-quinn", + "iroh-quinn-proto", + "iroh-quinn-udp", + "iroh-relay 0.95.1", + "n0-error", + "n0-future", + "n0-watcher 0.5.0", + "netdev", + "netwatch 0.12.0", + "pin-project", + "pkarr", + "pkcs8 0.11.0-rc.8", + "portmapper 0.12.0", + "rand 0.9.2", + "reqwest", + "rustls 0.23.35", + "rustls-pki-types", + "rustls-platform-verifier", + "rustls-webpki 0.103.7", + "serde", + "smallvec", + "strum 0.27.2", + "time", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "url", + "wasm-bindgen-futures", + "webpki-roots", + "z32", ] [[package]] -name = "is_terminal_polyfill" -version = "1.70.1" +name = "iroh-base" +version = "0.94.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "7db6dfffe81a58daae02b72c7784c20feef5b5d3849b190ed1c96a8fa0b3cae8" +dependencies = [ + "curve25519-dalek 5.0.0-pre.1", + "data-encoding", + "derive_more 2.0.1", + "ed25519-dalek 3.0.0-pre.1", + "n0-snafu", + "nested_enum_utils", + "rand_core 0.9.3", + "serde", + "snafu", + "url", + "zeroize", + "zeroize_derive", +] [[package]] -name = "itertools" -version = "0.10.5" +name = "iroh-base" +version = "0.95.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "25a8c5fb1cc65589f0d7ab44269a76f615a8c4458356952c9b0ef1c93ea45ff8" dependencies = [ - "either", + "curve25519-dalek 5.0.0-pre.1", + "data-encoding", + "derive_more 2.0.1", + "ed25519-dalek 3.0.0-pre.1", + "n0-error", + "rand_core 0.9.3", + "serde", + "url", + "zeroize", + "zeroize_derive", ] [[package]] -name = "itertools" +name = "iroh-metrics" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c84c167b59ae22f940e78eb347ca5f02aa25608e994cb5a7cc016ac2d5eada18" +dependencies = [ + "iroh-metrics-derive 0.3.1", + "itoa", + "postcard", + "ryu", + "serde", + "snafu", + "tracing", +] + +[[package]] +name = "iroh-metrics" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79e3381da7c93c12d353230c74bba26131d1c8bf3a4d8af0fec041546454582e" +dependencies = [ + "iroh-metrics-derive 0.4.0", + "itoa", + "n0-error", + "postcard", + "ryu", + "serde", + "tracing", +] + +[[package]] +name = "iroh-metrics-derive" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "748d380f26f7c25307c0a7acd181b84b977ddc2a1b7beece1e5998623c323aa1" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "iroh-metrics-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e12bd0763fd16062f5cc5e8db15dd52d26e75a8af4c7fb57ccee3589b344b8" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "iroh-quinn" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde160ebee7aabede6ae887460cd303c8b809054224815addf1469d54a6fcf7" +dependencies = [ + "bytes", + "cfg_aliases", + "iroh-quinn-proto", + "iroh-quinn-udp", + "pin-project-lite", + "rustc-hash", + "rustls 0.23.35", + "socket2 0.5.10", + "thiserror 2.0.17", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "iroh-quinn-proto" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "929d5d8fa77d5c304d3ee7cae9aede31f13908bd049f9de8c7c0094ad6f7c535" +dependencies = [ + "bytes", + "getrandom 0.2.16", + "rand 0.8.5", + "ring", + "rustc-hash", + "rustls 0.23.35", + "rustls-pki-types", + "slab", + "thiserror 2.0.17", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "iroh-quinn-udp" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c53afaa1049f7c83ea1331f5ebb9e6ebc5fdd69c468b7a22dd598b02c9bcc973" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.5.10", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "iroh-relay" +version = "0.94.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360e201ab1803201de9a125dd838f7a4d13e6ba3a79aeb46c7fbf023266c062e" +dependencies = [ + "blake3", + "bytes", + "cfg_aliases", + "data-encoding", + "derive_more 2.0.1", + "getrandom 0.3.3", + "hickory-resolver", + "http 1.4.0", + "http-body-util", + "hyper 1.7.0", + "hyper-util", + "iroh-base 0.94.1", + "iroh-metrics 0.36.2", + "iroh-quinn", + "iroh-quinn-proto", + "lru 0.16.2", + "n0-future", + "n0-snafu", + "nested_enum_utils", + "num_enum", + "pin-project", + "pkarr", + "postcard", + "rand 0.9.2", + "reqwest", + "rustls 0.23.35", + "rustls-pki-types", + "serde", + "serde_bytes", + "sha1 0.11.0-rc.2", + "snafu", + "strum 0.27.2", + "tokio", + "tokio-rustls 0.26.4", + "tokio-util", + "tokio-websockets", + "tracing", + "url", + "webpki-roots", + "ws_stream_wasm", + "z32", +] + +[[package]] +name = "iroh-relay" +version = "0.95.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43fbdf2aeffa7d6ede1a31f6570866c2199b1cee96a0b563994623795d1bac2c" +dependencies = [ + "blake3", + "bytes", + "cfg_aliases", + "data-encoding", + "derive_more 2.0.1", + "getrandom 0.3.3", + "hickory-resolver", + "http 1.4.0", + "http-body-util", + "hyper 1.7.0", + "hyper-util", + "iroh-base 0.95.1", + "iroh-metrics 0.37.0", + "iroh-quinn", + "iroh-quinn-proto", + "lru 0.16.2", + "n0-error", + "n0-future", + "num_enum", + "pin-project", + "pkarr", + "postcard", + "rand 0.9.2", + "reqwest", + "rustls 0.23.35", + "rustls-pki-types", + "serde", + "serde_bytes", + "sha1 0.11.0-rc.2", + "strum 0.27.2", + "tokio", + "tokio-rustls 0.26.4", + "tokio-util", + "tokio-websockets", + "tracing", + "url", + "webpki-roots", + "ws_stream_wasm", + "z32", +] + +[[package]] +name = "iroh-ssh" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ecb16e4ad997c798d3ed3ad306e0fde263de5257843c65dc0379c5debe630ca" +dependencies = [ + "anyhow", + "clap", + "ed25519-dalek 2.2.0", + "homedir", + "iroh 0.94.0", + "rand 0.9.2", + "runas", + "self-runas", + "tempfile", + "tokio", + "tokio-stream", + "tracing", + "tracing-appender", + "tracing-subscriber", + "whoami", + "windows-service", + "windows-sys 0.61.1", + "z32", +] + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" @@ -3780,6 +4798,28 @@ dependencies = [ "jiff-tzdb", ] +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + [[package]] name = "jobserver" version = "0.1.34" @@ -3818,12 +4858,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6204285f77fe7d9784db3fdc449ecce1a0114927a51d5a41c4c7a292011c015f" dependencies = [ "base64 0.13.1", - "crypto-common", - "digest", + "crypto-common 0.1.6", + "digest 0.10.7", "hmac", "serde", "serde_json", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -3897,7 +4937,7 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin", + "spin 0.9.8", ] [[package]] @@ -3982,6 +5022,19 @@ version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + [[package]] name = "lru" version = "0.12.5" @@ -3991,6 +5044,21 @@ dependencies = [ "hashbrown 0.15.5", ] +[[package]] +name = "lru" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" + +[[package]] +name = "lru" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96051b46fc183dc9cd4a223960ef37b9af631b55191852a8274bfef064cda20f" +dependencies = [ + "hashbrown 0.16.0", +] + [[package]] name = "lru-slab" version = "0.1.2" @@ -4024,7 +5092,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ "cfg-if", - "digest", + "digest 0.10.7", ] [[package]] @@ -4094,6 +5162,101 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "moka" +version = "0.12.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8261cd88c312e0004c1d51baad2980c66528dfdb2bee62003e643a4d8f86b077" +dependencies = [ + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "parking_lot", + "portable-atomic", + "rustc_version", + "smallvec", + "tagptr", + "uuid", +] + +[[package]] +name = "n0-error" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7d5969a2f40e9d9ed121a789c415f4114ac2b28e5731c080bdefee217d3b3fb" +dependencies = [ + "n0-error-macros", + "spez", +] + +[[package]] +name = "n0-error-macros" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a6908df844696d9af91c7c3950d50e52d67df327d02a95367f95bbf177d6556" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "n0-future" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c0709ac8235ce13b82bc4d180ee3c42364b90c1a8a628c3422d991d75a728b5" +dependencies = [ + "cfg_aliases", + "derive_more 1.0.0", + "futures-buffered", + "futures-lite", + "futures-util", + "js-sys", + "pin-project", + "send_wrapper", + "tokio", + "tokio-util", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-time", +] + +[[package]] +name = "n0-snafu" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1815107e577a95bfccedb4cfabc73d709c0db6d12de3f14e0f284a8c5036dc4f" +dependencies = [ + "anyhow", + "btparse", + "color-backtrace", + "snafu", + "tracing-error", +] + +[[package]] +name = "n0-watcher" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34c65e127e06e5a2781b28df6a33ea474a7bddc0ac0cfea888bd20c79a1b6516" +dependencies = [ + "derive_more 2.0.1", + "n0-future", + "snafu", +] + +[[package]] +name = "n0-watcher" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38acf13c1ddafc60eb7316d52213467f8ccb70b6f02b65e7d97f7799b1f50be4" +dependencies = [ + "derive_more 2.0.1", + "n0-error", + "n0-future", +] + [[package]] name = "native-tls" version = "0.2.14" @@ -4111,6 +5274,152 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nested_enum_utils" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d5475271bdd36a4a2769eac1ef88df0f99428ea43e52dfd8b0ee5cb674695f" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.108", +] + +[[package]] +name = "netdev" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ab878b4c90faf36dab10ea51d48c69ae9019bcca47c048a7c9b273d5d7a823" +dependencies = [ + "dlopen2", + "ipnet", + "libc", + "netlink-packet-core", + "netlink-packet-route", + "netlink-sys", + "once_cell", + "system-configuration", + "windows-sys 0.59.0", +] + +[[package]] +name = "netlink-packet-core" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3463cbb78394cb0141e2c926b93fc2197e473394b761986eca3b9da2c63ae0f4" +dependencies = [ + "paste", +] + +[[package]] +name = "netlink-packet-route" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ec2f5b6839be2a19d7fa5aab5bc444380f6311c2b693551cb80f45caaa7b5ef" +dependencies = [ + "bitflags", + "libc", + "log", + "netlink-packet-core", +] + +[[package]] +name = "netlink-proto" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b65d130ee111430e47eed7896ea43ca693c387f097dd97376bffafbf25812128" +dependencies = [ + "bytes", + "futures", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror 2.0.17", +] + +[[package]] +name = "netlink-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16c903aa70590cb93691bf97a767c8d1d6122d2cc9070433deb3bbf36ce8bd23" +dependencies = [ + "bytes", + "futures", + "libc", + "log", + "tokio", +] + +[[package]] +name = "netwatch" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98d7ec7abdbfe67ee70af3f2002326491178419caea22254b9070e6ff0c83491" +dependencies = [ + "atomic-waker", + "bytes", + "cfg_aliases", + "derive_more 2.0.1", + "iroh-quinn-udp", + "js-sys", + "libc", + "n0-future", + "n0-watcher 0.4.0", + "nested_enum_utils", + "netdev", + "netlink-packet-core", + "netlink-packet-route", + "netlink-proto", + "netlink-sys", + "pin-project-lite", + "serde", + "snafu", + "socket2 0.6.0", + "time", + "tokio", + "tokio-util", + "tracing", + "web-sys", + "windows 0.62.2", + "windows-result 0.4.1", + "wmi", +] + +[[package]] +name = "netwatch" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26f2acd376ef48b6c326abf3ba23c449e0cb8aa5c2511d189dd8a8a3bfac889b" +dependencies = [ + "atomic-waker", + "bytes", + "cfg_aliases", + "derive_more 2.0.1", + "iroh-quinn-udp", + "js-sys", + "libc", + "n0-error", + "n0-future", + "n0-watcher 0.5.0", + "netdev", + "netlink-packet-core", + "netlink-packet-route", + "netlink-proto", + "netlink-sys", + "pin-project-lite", + "serde", + "socket2 0.6.0", + "time", + "tokio", + "tokio-util", + "tracing", + "web-sys", + "windows 0.62.2", + "windows-result 0.4.1", + "wmi", +] + [[package]] name = "nix" version = "0.29.0" @@ -4124,6 +5433,18 @@ dependencies = [ "memoffset", ] +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "nom" version = "7.1.3" @@ -4143,6 +5464,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "ntimestamp" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50f94c405726d3e0095e89e72f75ce7f6587b94a8bd8dc8054b73f65c0fd68c" +dependencies = [ + "base32", + "document-features", + "getrandom 0.2.16", + "httpdate", + "js-sys", + "once_cell", + "serde", +] + [[package]] name = "nu-ansi-term" version = "0.50.1" @@ -4249,6 +5585,28 @@ dependencies = [ "libm", ] +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "num_threads" version = "0.1.7" @@ -4264,7 +5622,7 @@ version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16f67c885c7b19aaf652e84102035258ecb4e0425a4f71037e187798e367bd87" dependencies = [ - "derive_more", + "derive_more 2.0.1", "http 1.4.0", "log", "once_cell", @@ -4319,7 +5677,7 @@ dependencies = [ "serde", "serde_json", "serde_path_to_error", - "sha2", + "sha2 0.10.9", "thiserror 1.0.69", "url", ] @@ -4351,7 +5709,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "thiserror 1.0.69", "tokio", "tracing", @@ -4374,6 +5732,10 @@ name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +dependencies = [ + "critical-section", + "portable-atomic", +] [[package]] name = "once_cell_polyfill" @@ -4401,7 +5763,7 @@ dependencies = [ "base64 0.21.7", "chrono", "dyn-clone", - "ed25519-dalek", + "ed25519-dalek 2.2.0", "hmac", "http 1.4.0", "itertools 0.10.5", @@ -4417,7 +5779,7 @@ dependencies = [ "serde_path_to_error", "serde_plain", "serde_with", - "sha2", + "sha2 0.10.9", "subtle", "thiserror 1.0.69", "url", @@ -4550,7 +5912,7 @@ checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" dependencies = [ "ecdsa 0.14.8", "elliptic-curve 0.12.3", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -4562,7 +5924,7 @@ dependencies = [ "ecdsa 0.16.9", "elliptic-curve 0.13.8", "primeorder", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -4574,7 +5936,7 @@ dependencies = [ "ecdsa 0.16.9", "elliptic-curve 0.13.8", "primeorder", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -4647,6 +6009,15 @@ dependencies = [ "base64ct", ] +[[package]] +name = "pem-rfc7468" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -4693,7 +6064,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f27a2cfee9f9039c4d86faa5af122a0ac3851441a34865b8a043b46be0065a" dependencies = [ "pest", - "sha2", + "sha2 0.10.9", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version", ] [[package]] @@ -4734,6 +6115,37 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pid1" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c90bbdbf4c3b7aa11a325650d0cc79da8202df68d8aa91853342faaa2cd37e13" +dependencies = [ + "nix 0.29.0", + "signal-hook", + "thiserror 1.0.69", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -4757,6 +6169,37 @@ dependencies = [ "futures-io", ] +[[package]] +name = "pkarr" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "792c1328860f6874e90e3b387b4929819cc7783a6bd5a4728e918706eb436a48" +dependencies = [ + "async-compat", + "base32", + "bytes", + "cfg_aliases", + "document-features", + "dyn-clone", + "ed25519-dalek 3.0.0-pre.1", + "futures-buffered", + "futures-lite", + "getrandom 0.3.3", + "log", + "lru 0.13.0", + "ntimestamp", + "reqwest", + "self_cell", + "serde", + "sha1_smol", + "simple-dns", + "thiserror 2.0.17", + "tokio", + "tracing", + "url", + "wasm-bindgen-futures", +] + [[package]] name = "pkcs1" version = "0.7.5" @@ -4788,6 +6231,16 @@ dependencies = [ "spki 0.7.3", ] +[[package]] +name = "pkcs8" +version = "0.11.0-rc.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77089aec8290d0b7bb01b671b091095cf1937670725af4fd73d47249f03b12c0" +dependencies = [ + "der 0.8.0-rc.10", + "spki 0.8.0-rc.4", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -4821,6 +6274,16 @@ dependencies = [ "windows-sys 0.61.1", ] +[[package]] +name = "poly1305" +version = "0.9.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb78a635f75d76d856374961deecf61031c0b6f928c83dc9c0924ab6c019c298" +dependencies = [ + "cpufeatures", + "universal-hash", +] + [[package]] name = "portable-atomic" version = "1.11.1" @@ -4836,6 +6299,92 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "portmapper" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d73aa9bd141e0ff6060fea89a5437883f3b9ceea1cda71c790b90e17d072a3b3" +dependencies = [ + "base64 0.22.1", + "bytes", + "derive_more 2.0.1", + "futures-lite", + "futures-util", + "hyper-util", + "igd-next", + "iroh-metrics 0.36.2", + "libc", + "nested_enum_utils", + "netwatch 0.11.0", + "num_enum", + "rand 0.9.2", + "serde", + "smallvec", + "snafu", + "socket2 0.6.0", + "time", + "tokio", + "tokio-util", + "tower-layer", + "tracing", + "url", +] + +[[package]] +name = "portmapper" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b575f975dcf03e258b0c7ab3f81497d7124f508884c37da66a7314aa2a8d467" +dependencies = [ + "base64 0.22.1", + "bytes", + "derive_more 2.0.1", + "futures-lite", + "futures-util", + "hyper-util", + "igd-next", + "iroh-metrics 0.37.0", + "libc", + "n0-error", + "netwatch 0.12.0", + "num_enum", + "rand 0.9.2", + "serde", + "smallvec", + "socket2 0.6.0", + "time", + "tokio", + "tokio-util", + "tower-layer", + "tracing", + "url", +] + +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless 0.7.17", + "postcard-derive", + "serde", +] + +[[package]] +name = "postcard-derive" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0232bd009a197ceec9cc881ba46f727fcd8060a2d8d6a9dde7a69030a6fe2bb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "potential_utf" version = "0.1.3" @@ -4969,7 +6518,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.32", + "rustls 0.23.35", "socket2 0.6.0", "thiserror 2.0.17", "tokio", @@ -4989,7 +6538,7 @@ dependencies = [ "rand 0.9.2", "ring", "rustc-hash", - "rustls 0.23.32", + "rustls 0.23.35", "rustls-pki-types", "slab", "thiserror 2.0.17", @@ -5099,10 +6648,10 @@ dependencies = [ "indoc", "instability", "itertools 0.13.0", - "lru", + "lru 0.12.5", "paste", "serde", - "strum", + "strum 0.26.3", "unicode-segmentation", "unicode-truncate", "unicode-width 0.2.0", @@ -5128,6 +6677,17 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 2.0.17", +] + [[package]] name = "ref-cast" version = "1.0.25" @@ -5216,7 +6776,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.32", + "rustls 0.23.35", "rustls-pki-types", "serde", "serde_json", @@ -5237,6 +6797,12 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "resolv-conf" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" + [[package]] name = "rfc6979" version = "0.3.1" @@ -5290,8 +6856,8 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" dependencies = [ - "const-oid", - "digest", + "const-oid 0.9.6", + "digest 0.10.7", "num-bigint-dig", "num-integer", "num-traits", @@ -5333,6 +6899,30 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "runas" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96d6b6c505282b007a9b009f2aa38b2fd0359b81a0430ceacc60f69ade4c6a0" +dependencies = [ + "libc", + "security-framework-sys", + "which", + "windows-sys 0.48.0", +] + +[[package]] +name = "runas-with-inherited-cmd" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8ddf59c412be7f47462d0d06aec97c54dc16933e0c8d30df3a2a7950d1f0993" +dependencies = [ + "libc", + "security-framework-sys", + "which", + "windows-sys 0.48.0", +] + [[package]] name = "rust-ini" version = "0.20.0" @@ -5343,6 +6933,16 @@ dependencies = [ "ordered-multimap", ] +[[package]] +name = "rust_supervisor" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "959b3ccacc365f507c1eb39473dce93e6e5b12e8f48e083b3e3f3978c3c06b95" +dependencies = [ + "log", + "thiserror 1.0.69", +] + [[package]] name = "rustc-demangle" version = "0.1.26" @@ -5404,11 +7004,12 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.32" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "aws-lc-rs", + "log", "once_cell", "ring", "rustls-pki-types", @@ -5460,6 +7061,33 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19787cda76408ec5404443dc8b31795c87cd8fec49762dc75fa727740d34acc1" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls 0.23.35", + "rustls-native-certs 0.8.2", + "rustls-platform-verifier-android", + "rustls-webpki 0.103.7", + "security-framework 3.5.1", + "security-framework-sys", + "webpki-root-certs 0.26.11", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -5494,6 +7122,16 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "salsa20" +version = "0.11.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3ff3b81c8a6e381bc1673768141383f9328048a60edddcfc752a8291a138443" +dependencies = [ + "cfg-if", + "cipher 0.5.0-rc.1", +] + [[package]] name = "same-file" version = "1.0.6" @@ -5536,6 +7174,12 @@ dependencies = [ "serde_json", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -5595,7 +7239,7 @@ dependencies = [ "once_cell", "rand 0.8.5", "serde", - "sha2", + "sha2 0.10.9", "zbus", ] @@ -5635,6 +7279,24 @@ dependencies = [ "libc", ] +[[package]] +name = "self-runas" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5828c770ef8dfedab7c276b9a303b816639e18f77c8e8976b844ebbbd04c75dc" +dependencies = [ + "anyhow", + "nix 0.30.1", + "runas-with-inherited-cmd", + "winapi", +] + +[[package]] +name = "self_cell" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16c2f82143577edb4921b71ede051dac62ca3c16084e918bf7b40c96ae10eb33" + [[package]] name = "semver" version = "1.0.27" @@ -5645,6 +7307,12 @@ dependencies = [ "serde_core", ] +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + [[package]] name = "serde" version = "1.0.228" @@ -5665,6 +7333,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_bytes" +version = "0.11.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +dependencies = [ + "serde", + "serde_core", +] + [[package]] name = "serde_core" version = "1.0.228" @@ -5804,6 +7482,16 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "serdect" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3ef0e35b322ddfaecbc60f34ab448e157e48531288ee49fafbb053696b8ffe2" +dependencies = [ + "base16ct 0.3.0", + "serde", +] + [[package]] name = "sha1" version = "0.10.6" @@ -5812,7 +7500,18 @@ checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "sha1" +version = "0.11.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e046edf639aa2e7afb285589e5405de2ef7e61d4b0ac1e30256e3eab911af9" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.11.0-rc.3", ] [[package]] @@ -5821,10 +7520,16 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89f599ac0c323ebb1c6082821a54962b839832b03984598375bff3975b804423" dependencies = [ - "digest", - "sha1", + "digest 0.10.7", + "sha1 0.10.6", ] +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + [[package]] name = "sha2" version = "0.10.9" @@ -5833,7 +7538,18 @@ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1e3878ab0f98e35b2df35fe53201d088299b41a6bb63e3e34dada2ac4abd924" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.11.0-rc.3", ] [[package]] @@ -5893,7 +7609,7 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" dependencies = [ - "digest", + "digest 0.10.7", "rand_core 0.6.4", ] @@ -5903,10 +7619,31 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", + "digest 0.10.7", "rand_core 0.6.4", ] +[[package]] +name = "signature" +version = "3.0.0-rc.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0251c9d6468f4ba853b6352b190fb7c1e405087779917c238445eb03993826" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "simple-dns" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee851d0e5e7af3721faea1843e8015e820a234f81fda3dea9247e15bac9a86a" +dependencies = [ + "bitflags", +] + [[package]] name = "siphasher" version = "1.0.1" @@ -5941,6 +7678,28 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" +[[package]] +name = "snafu" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e84b3f4eacbf3a1ce05eac6763b4d629d60cbc94d632e4092c54ade71f1e1a2" +dependencies = [ + "backtrace", + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1c97747dbf44bb1ca44a561ece23508e99cb592e862f22222dcf42f51d1e451" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "socket2" version = "0.5.10" @@ -5961,11 +7720,31 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "spez" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c87e960f4dca2788eeb86bbdde8dd246be8948790b7618d656e68f9b720a86e8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", +] + [[package]] name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" [[package]] name = "spki" @@ -5987,6 +7766,16 @@ dependencies = [ "der 0.7.10", ] +[[package]] +name = "spki" +version = "0.8.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8baeff88f34ed0691978ec34440140e1572b68c7dd4a495fd14a3dc1944daa80" +dependencies = [ + "base64ct", + "der 0.8.0-rc.10", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -6023,6 +7812,15 @@ dependencies = [ "strum_macros 0.26.4", ] +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros 0.27.2", +] + [[package]] name = "strum_macros" version = "0.26.4" @@ -6141,6 +7939,12 @@ dependencies = [ "syn 2.0.108", ] +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "tempfile" version = "3.23.0" @@ -6176,6 +7980,15 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "terminal_size" version = "0.4.3" @@ -6263,6 +8076,7 @@ checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", + "js-sys", "libc", "num-conv", "num_threads", @@ -6377,8 +8191,20 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.32", + "rustls 0.23.35", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", "tokio", + "tokio-util", ] [[package]] @@ -6395,6 +8221,28 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-websockets" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1b6348ebfaaecd771cecb69e832961d277f59845d4220a584701f72728152b7" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-sink", + "getrandom 0.3.3", + "http 1.4.0", + "httparse", + "rand 0.9.2", + "ring", + "rustls-pki-types", + "simdutf8", + "tokio", + "tokio-rustls 0.26.4", + "tokio-util", +] + [[package]] name = "toml" version = "0.8.23" @@ -6545,6 +8393,18 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-appender" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786d480bce6247ab75f005b14ae1624ad978d3029d9113f0a22fa1ac773faeaf" +dependencies = [ + "crossbeam-channel", + "thiserror 2.0.17", + "time", + "tracing-subscriber", +] + [[package]] name = "tracing-attributes" version = "0.1.30" @@ -6754,6 +8614,16 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "universal-hash" +version = "0.6.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a55be643b40a21558f44806b53ee9319595bc7ca6896372e4e08e5d7d83c9cd6" +dependencies = [ + "crypto-common 0.2.0-rc.4", + "subtle", +] + [[package]] name = "unsafe-libyaml" version = "0.2.11" @@ -6949,6 +8819,12 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.104" @@ -7054,15 +8930,62 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-root-certs" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" +dependencies = [ + "webpki-root-certs 1.0.4", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee3e3b5f5e80bc89f30ce8d0343bf4e5f12341c51f3e26cbeecbc7c85443e85b" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webpki-roots" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" dependencies = [ "rustls-pki-types", ] +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.44", +] + +[[package]] +name = "whoami" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" +dependencies = [ + "libredox", + "wasite", + "web-sys", +] + +[[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + [[package]] name = "winapi" version = "0.3.9" @@ -7094,24 +9017,102 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections 0.2.0", + "windows-core 0.61.2", + "windows-future 0.2.1", + "windows-link 0.1.3", + "windows-numerics 0.2.0", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections 0.3.2", + "windows-core 0.62.2", + "windows-future 0.3.2", + "windows-numerics 0.3.1", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core 0.62.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + [[package]] name = "windows-core" -version = "0.62.1" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.2.0", - "windows-result 0.4.0", - "windows-strings 0.5.0", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading 0.1.0", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", + "windows-threading 0.2.1", ] [[package]] name = "windows-implement" -version = "0.60.1" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", @@ -7120,9 +9121,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.59.2" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", @@ -7137,9 +9138,29 @@ checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", +] [[package]] name = "windows-registry" @@ -7163,11 +9184,22 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.4.0" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-service" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +checksum = "193cae8e647981c35bc947fdd57ba7928b1fa0d4a79305f6dd2dc55221ac35ac" dependencies = [ - "windows-link 0.2.0", + "bitflags", + "widestring", + "windows-sys 0.59.0", ] [[package]] @@ -7181,11 +9213,20 @@ dependencies = [ [[package]] name = "windows-strings" -version = "0.5.0" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-link 0.2.0", + "windows-targets 0.42.2", ] [[package]] @@ -7230,7 +9271,22 @@ version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" dependencies = [ - "windows-link 0.2.0", + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", ] [[package]] @@ -7270,7 +9326,7 @@ version = "0.53.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" dependencies = [ - "windows-link 0.2.0", + "windows-link 0.2.1", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -7281,6 +9337,30 @@ dependencies = [ "windows_x86_64_msvc 0.53.0", ] +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -7299,6 +9379,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -7317,6 +9403,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -7347,6 +9439,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -7365,6 +9463,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -7383,6 +9487,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -7401,6 +9511,12 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -7428,18 +9544,62 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "wit-bindgen" version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +[[package]] +name = "wmi" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120d8c2b6a7c96c27bf4a7947fd7f02d73ca7f5958b8bd72a696e46cb5521ee6" +dependencies = [ + "chrono", + "futures", + "log", + "serde", + "thiserror 2.0.17", + "windows 0.62.2", + "windows-core 0.62.2", +] + [[package]] name = "writeable" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +[[package]] +name = "ws_stream_wasm" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c173014acad22e83f16403ee360115b38846fe754e735c5d9d3803fe70c6abc" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version", + "send_wrapper", + "thiserror 2.0.17", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "xdg-home" version = "1.3.0" @@ -7450,12 +9610,27 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "xml-rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" + [[package]] name = "xmlparser" version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" +[[package]] +name = "xmltree" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" +dependencies = [ + "xml-rs", +] + [[package]] name = "yaml-rust2" version = "0.8.1" @@ -7497,6 +9672,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "z32" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2164e798d9e3d84ee2c91139ace54638059a3b23e361f5c11781c2c6459bde0f" + [[package]] name = "zbus" version = "4.4.0" @@ -7519,12 +9700,12 @@ dependencies = [ "futures-sink", "futures-util", "hex", - "nix", + "nix 0.29.0", "ordered-stream", "rand 0.8.5", "serde", "serde_repr", - "sha1", + "sha1 0.10.6", "static_assertions", "tokio", "tracing", diff --git a/Cargo.toml b/Cargo.toml index f1888b9..6789c70 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,3 +5,8 @@ resolver = "3" [workspace.dependencies] firecrest_client = { path = "./firecrest_client", version = "2.4.0" } + +[profile.release] +strip = true +opt-level = "z" +lto = true diff --git a/README.md b/README.md index 280307e..f228bb9 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Table of contents * [Logging in](#logging-in) * [CLI](#cli) * [Terminal UI](#tui) + * [SSH](#ssh) * [coman.toml config file](#comantoml-config-file) * [Editing the config](#editing-the-config) * [Development](#development) @@ -161,7 +162,8 @@ To execute a job on CSCS, run a command like coman cscs job submit -i ubuntu:latest -- echo test ``` This will run the command `echo test` using the `ubuntu:latest` docker image and default settings. -See `coman cscs job submit -h` for more options. +See `coman cscs job submit -h` for more options. This will also automatically set up an ssh connection for +the job (use `--no-ssh` to prevent this), see the [SSH](#ssh) section for more details. You can list your jobs using @@ -270,7 +272,7 @@ name = "myproject" # the name of the project, used to generate job names current_system = "daint" # what system/cluster to execute commands on current_platform = "HPC" # what platform to execute commands on (valid: HPC, ML or CW) account = "..." # the project/group account to use on cscs - +ssh_key = "path/to/ssh/public/key.pub" # To use a different public key for SSH connections, other than the default auto-detected id_dsa, id_rsa or id_ecdsa image = "ubuntu" # default docker image to use @@ -302,6 +304,7 @@ srun {% if environment_file %}--environment={{environment_file}}{% endif %} {{co # container_workdir: the working directory to use within the container # env: a dictionary of key/value pairs for environment variables to set in the container # mount: a dictionary of key/value pairs for folders to mount to the container, with key being the path in the cluster and value being the path in the container +# ssh_public_key: path to the ssh public key on the remote edf_file_template = """ {% if edf_image %}image = "{{edf_image}}"{% endif %} mounts = [{% for source, target in mount %}"{{source}}:{{target}}",{% endfor %}] @@ -311,6 +314,12 @@ workdir = "{{container_workdir}}" {% for key, value in env %} {{key}} = "{{value}}" {% endfor %} + +[annotations] +{% if ssh_public_key %} +com.hooks.ssh.enabled = "true" +com.hooks.ssh.authorize_ssh_key = "{{ ssh_public_key }}" +com.hooks.ssh.port = 15263 """ # set environment variables that should be passed to a job @@ -329,6 +338,27 @@ coman config get cscs.current_system coman config set cscs.current_system "daint" ``` +### SSH + +`coman cscs job submit` will automatically create an SSH connection for the job. It will search for an +`id_dsa.pub`, `id_rsa.pub` or `id_ecdsa.pub` file in your `.ssh` folder and use that for the connection, +unless you specify another key using the `--ssh-key` argument or the `cscs.ssh_key` setting in the config file. + +Creating the ssh connection involves several steps, all handled by coman: + +- Uploading your ssh public key into the remote coman project folder +- Setting the public key in the [CSCS SSH hook](https://docs.cscs.ch/software/container-engine/resource-hook/#ssh-hook) +- Uploading a squash file containing the coman executable to the remote coman project folder +- Mounting the coman squash file into the container so the coman executable is available in the container +- Creating an [iroh](https://github.com/n0-computer/iroh) secret key to use for the [QUIC tunnel](https://en.wikipedia.org/wiki/QUIC) +- Using the coman executable as the entrypoint of the container (wrapping the original command), which + allows coman to create an iroh/QUIC tunnel for remote connections, as well as properly handling pid1 + process signals in the container +- Creating a local SSH config in the coman data dir (`~/.local/share/coman` by default) containing connection + information and the correct iroh proxy command +- Including the SSH config in `.ssh/config` so it's accessible in other tools +- Garbage collecting old SSH connections for jobs that are not running anymore + ## Development ### Prerequisites diff --git a/coman/.config/config.toml b/coman/.config/config.toml index 49f4537..8825a19 100644 --- a/coman/.config/config.toml +++ b/coman/.config/config.toml @@ -6,7 +6,10 @@ current_platform = "HPC" # what platform to execute commands on (valid: HPC, ML image = "ubuntu" # default docker image to use -command = ["sleep", "1"] # command to execute within the container, i.e. the job you want to run +command = [ + "sleep", + "1", +] # command to execute within the container, i.e. the job you want to run # the sbatch script you want to execute # this gets templated with values specified in the {{}} and {% %} expressions (see https://keats.github.io/tera/docs/#templates for @@ -21,7 +24,7 @@ sbatch_script_template = """ #SBATCH --job-name={{name}} #SBATCH --ntasks=1 #SBATCH --time=1:00:00 -srun {% if environment_file %}--environment={{environment_file}}{% endif %} {{command}} +srun {% if environment_file %}--environment={{environment_file}}{% endif %} {% if coman_squash %}/coman/coman exec {% endif %}{{command}} """ # the edf environment toml file template @@ -34,13 +37,26 @@ srun {% if environment_file %}--environment={{environment_file}}{% endif %} {{co # mount: a dictionary of key/value pairs for folders to mount to the container, with key being the path in the cluster and value being the path in the container edf_file_template = """ {% if edf_image %}image = "{{edf_image}}"{% endif %} -mounts = [{% for source, target in mount %}"{{source}}:{{target}}",{% endfor %}] +mounts = [ + {% for source, target in mount %}"{{source}}:{{target}}",{% endfor %} + {% if coman_squash %}"{{coman_squash}}:/coman:sqsh"{% endif%} +] workdir = "{{container_workdir}}" [env] {% for key, value in env %} {{key}} = "{{value}}" {% endfor %} +{% if iroh_secret%} +COMAN_IROH_SECRET="{{iroh_secret}}" +{% endif %} + +[annotations] +{% if ssh_public_key %} +com.hooks.ssh.enabled = "true" +com.hooks.ssh.authorize_ssh_key = "{{ ssh_public_key }}" +com.hooks.ssh.port = "15263" +{% endif %} """ # set environment variables that should be passed to a job diff --git a/coman/Cargo.toml b/coman/Cargo.toml index cd446ef..343919a 100644 --- a/coman/Cargo.toml +++ b/coman/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "coman" -version = "0.4.0" +version = "0.5.0" edition = "2024" description = "Compute Manager for managing HPC compute" authors = ["Ralf Grubenmann "] @@ -74,10 +74,18 @@ tui-realm-treeview = "3.0.0" aws-sdk-s3 = "1.115.0" toml_edit = "0.23.9" clap_complete = "4.5.61" +pid1 = "0.1.5" +rust_supervisor = "0.2.0" +iroh-ssh = "0.2.7" +whoami = "1.6.1" +base64 = "0.22.1" +dirs = "6.0.0" +iroh = "0.95.1" +rand = "0.9.2" +regex = "1.12.2" [build-dependencies] anyhow = "1.0.90" - vergen-gix = { version = "1.0.2", features = ["build", "cargo"] } [dev-dependencies] diff --git a/coman/src/cli.rs b/coman/src/cli.rs index 6382741..31f52fb 100644 --- a/coman/src/cli.rs +++ b/coman/src/cli.rs @@ -1,8 +1,12 @@ -use std::{error::Error, path::PathBuf}; +use std::{error::Error, path::PathBuf, thread, time::Duration}; +use base64::prelude::*; use clap::{Args, Command, Parser, Subcommand, ValueHint, builder::TypedValueParser}; use clap_complete::{Generator, Shell, generate}; -use color_eyre::Result; +use color_eyre::{Result, eyre::eyre}; +use iroh_ssh::IrohSsh; +use pid1::Pid1Settings; +use rust_supervisor::{ChildType, Supervisor, SupervisorConfig}; use strum::VariantNames; use crate::{ @@ -63,6 +67,13 @@ pub enum CliCommands { #[clap(value_enum)] generator: Shell, }, + #[clap(about = "Execute a process/command through coman, with additional monitoring and side processes")] + Exec { + #[clap(trailing_var_arg = true, help = "The command to run", value_hint=ValueHint::Other)] + command: Vec, + }, + #[clap(hide = true)] + Proxy { system: String, job_id: i64 }, } #[derive(Subcommand, Debug)] @@ -234,6 +245,12 @@ pub enum CscsJobCommands { edf_spec: Option, #[command(flatten)] script_spec: Option, + #[clap(long, action, help = "don't set up ssh integration")] + no_ssh: bool, + #[clap(short, long, help="ssh public key to use", value_hint=ValueHint::FilePath)] + ssh_key: Option, + #[clap(long, action, help = "don't upload and inject coman into the container")] + no_coman: bool, #[clap(trailing_var_arg = true, help = "The command to run in the container", value_hint=ValueHint::Other)] command: Option>, }, @@ -372,3 +389,71 @@ fn is_bare_string(value_str: &str) -> bool { pub fn print_completions(generator: G, cmd: &mut Command) { generate(generator, cmd, cmd.get_name().to_string(), &mut std::io::stdout()); } + +/// Runs a wrapped command in a container-safe way and potentially runs background processes like iroh-ssh +pub(crate) async fn cli_exec_command(command: Vec) -> Result<()> { + // Pid1 takes care of proper terminating of processes and signal handling when running in a container + Pid1Settings::new() + .enable_log(true) + .timeout(Duration::from_secs(2)) + .launch() + .expect("Launch failed"); + + let mut supervisor = Supervisor::new(SupervisorConfig::default()); + supervisor.add_process("iroh-ssh", ChildType::Permanent, || { + thread::spawn(|| { + let rt = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .expect("couldn't start tokio"); + + // Call the asynchronous connect method using the runtime. + rt.block_on(async move { + let mut builder = IrohSsh::builder().accept_incoming(true).accept_port(15263); + if let Ok(secret) = std::env::var("COMAN_IROH_SECRET") { + let secret_key = BASE64_STANDARD.decode(secret).unwrap(); + let secret_key: &[u8; 32] = secret_key[0..32].try_into().unwrap(); + builder = builder.secret_key(secret_key); + } + + let server = builder.build().await.expect("couldn't create iroh server"); + println!("{}@{}", whoami::username(), server.node_id()); + loop { + tokio::time::sleep(Duration::from_secs(60)).await; + } + }); + }) + }); + supervisor.add_process("main-process", ChildType::Temporary, move || { + let command = command.clone(); + thread::spawn(move || { + let mut child = std::process::Command::new(command[0].clone()) + .args(&command[1..]) + .spawn() + .expect("Failed to start compute job"); + child.wait().expect("Failed to wait on compute job"); + }) + }); + + let supervisor = supervisor.start_monitoring(); + loop { + thread::sleep(Duration::from_secs(1)); + + if let Some(rust_supervisor::ProcessState::Failed | rust_supervisor::ProcessState::Stopped) = + supervisor.get_process_state("main-process") + { + break; + } + } + Ok(()) +} + +/// Thin wrapper around iroh proxy +pub(crate) async fn cli_proxy_command(system: String, job_id: i64) -> Result<()> { + let data_dir = get_data_dir(); + let endpoint_id = std::fs::read_to_string(data_dir.join(format!("{}_{}.endpoint", system, job_id)))?; + println!("{}", endpoint_id); + iroh_ssh::api::proxy_mode(iroh_ssh::ProxyArgs { node_id: endpoint_id }) + .await + .map_err(|e| eyre!("couldn't proxy ssh connection: {:?}", e)) +} diff --git a/coman/src/config.rs b/coman/src/config.rs index 1b90182..e5d3461 100644 --- a/coman/src/config.rs +++ b/coman/src/config.rs @@ -62,6 +62,8 @@ pub struct CscsConfig { #[serde(default)] pub edf_file_template: String, #[serde(default)] + pub ssh_key: Option, + #[serde(default)] pub command: Vec, #[serde(default)] @@ -73,6 +75,8 @@ pub struct ComanConfig { #[serde(default)] pub name: Option, #[serde(default)] + pub coman_squash_path: Option, + #[serde(default)] pub cscs: CscsConfig, } @@ -109,9 +113,8 @@ impl Layer { let root = self.data.as_item(); let item = lookup_entry(key_path_parsed, root)?; let item = item - .map(|i| i.clone().into_value()) + .map(|i| i.clone().into_value().map_err(|e| eyre!("{:?}", e))) .transpose() - .map_err(|e| eyre!(format!("{:?}", e))) .wrap_err("couldn't convert config item to value")?; Ok(item.map(|val| match val { diff --git a/coman/src/cscs/api_client/client.rs b/coman/src/cscs/api_client/client.rs index 2e4fda1..028b4fe 100644 --- a/coman/src/cscs/api_client/client.rs +++ b/coman/src/cscs/api_client/client.rs @@ -50,6 +50,9 @@ pub struct JobStartOptions { pub mount: Vec<(String, String)>, pub edf_spec: EdfSpec, pub script_spec: ScriptSpec, + pub no_ssh: bool, + pub ssh_key: Option, + pub no_coman: bool, } pub struct CscsApi { @@ -75,10 +78,10 @@ impl CscsApi { script_path: PathBuf, envvars: HashMap, options: JobStartOptions, - ) -> Result<()> { + ) -> Result> { let workingdir = script_path.clone(); let workingdir = workingdir.parent(); - let _result = post_compute_system_job( + let result = post_compute_system_job( &self.client, system_name, account, @@ -94,7 +97,7 @@ impl CscsApi { ) .await?; - Ok(()) + Ok(result.job_id) } pub async fn get_system(&self, system: &str) -> Result> { let systems = self.list_systems().await?; @@ -158,8 +161,8 @@ impl CscsApi { .wrap_err("couldn't change directory permission")?; Ok(()) } - pub async fn upload(&self, system_name: &str, path: PathBuf, file: Vec) -> Result<()> { - post_filesystem_ops_upload(&self.client, system_name, path, file) + pub async fn upload(&self, system_name: &str, target: PathBuf, file: Vec) -> Result<()> { + post_filesystem_ops_upload(&self.client, system_name, target, file) .await .wrap_err("couldn't upload file")?; Ok(()) @@ -168,10 +171,10 @@ impl CscsApi { &self, system_name: &str, account: Option, - path: PathBuf, + target: PathBuf, size: i64, ) -> Result<(i64, S3Upload)> { - let job = post_filesystem_transfer_upload(&self.client, system_name, account, path, size) + let job = post_filesystem_transfer_upload(&self.client, system_name, account, target, size) .await .wrap_err("couldn't upload file")?; if let DownloadFileResponseTransferDirectives::S3(directives) = job.transfer_directives { diff --git a/coman/src/cscs/cli.rs b/coman/src/cscs/cli.rs index d31feec..8e00179 100644 --- a/coman/src/cscs/cli.rs +++ b/coman/src/cscs/cli.rs @@ -272,7 +272,7 @@ pub(crate) async fn cli_cscs_file_upload( } } -async fn upload_chunk(path: PathBuf, offset: u64, size: u64, url: Url) -> Result { +pub(crate) async fn upload_chunk(path: PathBuf, offset: u64, size: u64, url: Url) -> Result { let client = reqwest::Client::new(); let source_file = File::open(path).await?; diff --git a/coman/src/cscs/handlers.rs b/coman/src/cscs/handlers.rs index 7fc060b..ffc4d35 100644 --- a/coman/src/cscs/handlers.rs +++ b/coman/src/cscs/handlers.rs @@ -3,21 +3,32 @@ use std::os::unix::fs::MetadataExt; #[cfg(target_family = "windows")] use std::os::windows::fs::MetadataExt; use std::{ - collections::HashMap, + collections::{HashMap, HashSet}, + io::{BufWriter, Read, Write}, path::{Path, PathBuf}, }; +use base64::prelude::*; use color_eyre::{Result, eyre::eyre}; +use eyre::Context; +use futures::StreamExt; +use iroh::SecretKey; +use itertools::Itertools; +use regex::Regex; use reqwest::Url; +use tokio::{fs::File, io::AsyncWriteExt}; use super::api_client::client::{EdfSpec, ScriptSpec}; use crate::{ - config::{ComputePlatform, Config}, + config::{ComputePlatform, Config, get_data_dir}, cscs::{ api_client::{ client::{CscsApi, JobStartOptions}, - types::{FileStat, FileSystemType, Job, JobDetail, PathEntry, PathType, S3Upload, System, UserInfo}, + types::{ + FileStat, FileSystemType, Job, JobDetail, JobStatus, PathEntry, PathType, S3Upload, System, UserInfo, + }, }, + cli::upload_chunk, oauth2::{ CLIENT_ID_SECRET_NAME, CLIENT_SECRET_SECRET_NAME, client_credentials_login, finish_cscs_device_login, start_cscs_device_login, @@ -159,11 +170,273 @@ pub async fn cscs_job_cancel(job_id: i64, system: Option, platform: Opti } } +async fn setup_ssh( + api_client: &CscsApi, + base_path: &Path, + current_system: &str, + options: &JobStartOptions, + config: &Config, +) -> Result> { + if options.no_ssh { + return Ok(None); + } + let secret = SecretKey::generate(&mut rand::rng()); + + let ssh_key = if let Some(path) = options.ssh_key.clone().or(config.values.cscs.ssh_key.clone()) { + path.canonicalize().map(Some).wrap_err("couldn't get ssh key path")? + } else { + // try to figure our ssh key + let ssh_dir = dirs::home_dir().ok_or(eyre!("couldn't find home dir"))?.join(".ssh"); + let mut ssh_path = None; + for file in ["id_dsa.pub", "id_ecdsa.pub", "id_rsa.pub"] { + let path = ssh_dir.join(file); + if path.exists() { + ssh_path = Some(path); + break; + } + } + ssh_path + }; + + match ssh_key { + Some(path) => { + let filename = path.file_name().ok_or(eyre!("couldn't get filename of ssh key"))?; + let remote_path = base_path.join(filename); + let public_key = std::fs::read_to_string(path.clone())?; + + api_client + .upload(current_system, remote_path.clone(), public_key.into_bytes()) + .await + .wrap_err(eyre!("couldn't upload ssh public key"))?; + Ok(Some((remote_path, secret))) + } + None => Err(eyre!("couldn't find ssh public key, use `--ssh_key` to specify it")), + } +} + +async fn garbage_collect_ssh(api_client: &CscsApi, current_system: &str) -> Result<()> { + let data_dir = get_data_dir(); + if !data_dir.exists() { + return Ok(()); + } + let jobs = api_client.list_jobs(current_system, None).await?; + let job_entries: HashSet<_> = jobs + .iter() + .filter(|j| j.status == JobStatus::Pending || j.status == JobStatus::Running) + .map(|j| format!("{}_{}", current_system, j.id)) + .collect(); + let outdated_endpoints: Vec<_> = std::fs::read_dir(&data_dir)? + .filter(|d| { + d.as_ref().is_ok_and(|e| { + e.path().is_file() + && e.file_name().to_string_lossy().ends_with(".endpoint") + && e.file_name().to_string_lossy().starts_with(current_system) + && !job_entries.contains(e.file_name().to_string_lossy().split_once('.').unwrap().0) + }) + }) + .map(|d| d.unwrap()) + .collect(); + + // delete connection files + for d in outdated_endpoints.iter() { + std::fs::remove_file(d.path())?; + } + + // cleanup ssh config + let coman_ssh_config_path = data_dir.join("ssh_config"); + if !coman_ssh_config_path.exists() { + return Ok(()); + } + let mut ssh_content = std::fs::read_to_string(&coman_ssh_config_path)?; + for d in outdated_endpoints { + let re = Regex::new( + format!( + r"(?ms)#Start {0}_[^\s]_{1}.*?#End {0}_[^\s]_{1}\n", + current_system, + d.file_name() + .to_string_lossy() + .split_once('.') + .unwrap() + .0 + .rsplit('_') + .next() + .unwrap() + ) + .as_str(), + )?; + ssh_content = re.replace(&ssh_content, "").to_string(); + } + + std::fs::write(coman_ssh_config_path, ssh_content)?; + + Ok(()) +} + +async fn store_ssh_information( + current_system: &str, + user_info: &UserInfo, + job_id: &i64, + job_name: &str, + secret_key: &SecretKey, +) -> Result { + let data_dir = get_data_dir(); + std::fs::write( + data_dir.join(format!("{}_{}.endpoint", current_system, job_id)), + format!("{}", secret_key.public()), + )?; + let coman_ssh_config_path = data_dir.join("ssh_config"); + let coman_ssh_config = std::fs::OpenOptions::new() + .create(true) + .append(true) + .open(coman_ssh_config_path.clone())?; + let connection_name = format!("{}-{}-{}", current_system, job_name, job_id); + let mut writer = BufWriter::new(coman_ssh_config); + write!( + writer, + "\n#Start {0}\nHost {0}\n Hostname {1}\n User {2}\n ProxyCommand coman proxy {3}{4}\n#End {0}", + connection_name, + secret_key.public(), + user_info.name, + current_system, + job_id + )?; + let ssh_dir = dirs::home_dir().ok_or(eyre!("couldn't find home dir"))?.join(".ssh"); + let ssh_config_path = ssh_dir.join("config"); + let mut ssh_config = std::fs::OpenOptions::new() + .read(true) + .append(true) + .open(ssh_config_path)?; + let mut content = String::new(); + ssh_config.read_to_string(&mut content)?; + if !content.contains(&format!("Include {}", coman_ssh_config_path.clone().display())) { + let mut writer = BufWriter::new(ssh_config); + write!( + writer, + "\n\n#coman include\nMatch all\nInclude {}", + coman_ssh_config_path.display() + )?; + } + Ok(connection_name) +} + +async fn inject_coman_squash( + api_client: &CscsApi, + base_path: &Path, + current_system: &str, + options: &JobStartOptions, +) -> Result> { + if options.no_coman { + return Ok(None); + } + let config = Config::new().unwrap(); + let local_squash_path = match config.values.coman_squash_path.clone() { + Some(path) => path, + None => { + //download from github for architecture + let system = config + .values + .cscs + .systems + .get(current_system) + .ok_or(eyre!("couldn't find architecture for system {}", current_system))?; + let architecture = system + .architecture + .first() + .ok_or(eyre!("no architecture set for {}", current_system))?; + let target_path = get_data_dir().join(format!("coman_{}.sqsh", architecture)); + if !target_path.exists() { + let url = match architecture.as_str() { + "arm64" => { + "https://github.com/SwissDataScienceCenter/coman/releases/latest/download/coman_Linux-aarch64.sqsh" + } + "amd64" => { + "https://github.com/SwissDataScienceCenter/coman/releases/latest/download/coman_Linux-x86_64.sqsh" + } + _ => { + return Err(eyre!("unsupported architecture {}", architecture)); + } + }; + let mut out = File::create(target_path.clone()).await?; + let resp = reqwest::get(url).await?; + match resp.error_for_status() { + Ok(resp) => { + let mut stream = resp.bytes_stream(); + while let Some(chunk_result) = stream.next().await { + let chunk = chunk_result?; + out.write_all(&chunk).await?; + } + out.flush().await?; + } + Err(e) => return Err(eyre!("couldn't download coman squash file: {}", e)), + } + } + target_path + } + }; + let target = base_path.join("coman.sqsh"); + let file_meta = std::fs::metadata(local_squash_path.clone())?; + + #[cfg(target_family = "unix")] + let size = file_meta.size() as usize; + + #[cfg(target_family = "windows")] + let size = file_meta.file_size() as usize; + + let existing = api_client.list_path(current_system, target.clone()).await?; + if !existing.is_empty() { + //squash file already present on remote, don't upload if it's the same + let entry = existing.first().unwrap(); + if entry.size.unwrap_or_default() == size { + return Ok(Some(target)); + } + } + //upload squash file + let transfer_data = api_client + .transfer_upload(current_system, config.values.cscs.account, target.clone(), size as i64) + .await + .wrap_err(eyre!("couldn't upload coman squash file"))?; + let mut etags: Vec = Vec::new(); + let client = reqwest::Client::new(); + let num_parts = transfer_data.1.num_parts; + for (chunk_id, transfer_url) in transfer_data.1.parts_upload_urls.into_iter().enumerate() { + println!( + "Uploading part {}/{} ({}Mb)", + chunk_id + 1, + num_parts, + transfer_data.1.part_size / 1024 / 1024 + ); + let etag = upload_chunk( + local_squash_path.clone(), + (chunk_id as u64) * transfer_data.1.part_size, + transfer_data.1.part_size, + transfer_url, + ) + .await?; + etags.push(etag); + } + + let body = etags + .into_iter() + .enumerate() + .map(|(i, etag)| (i + 1, etag)) + .map(|(i, etag)| format!("{}{}", i, etag)) + .join(""); + let body = format!("{}", body); + let req = client.post(transfer_data.1.complete_upload_url).body(body).build()?; + let resp = client.execute(req).await?; + resp.error_for_status()?; + Ok(Some(target)) +} + +#[allow(clippy::too_many_arguments)] async fn handle_edf( api_client: &CscsApi, base_path: &Path, current_system: &str, envvars: &HashMap, + coman_squash: &Option, + ssh_public_key_path: &Option, + iroh_secret: &Option, workdir: &str, options: &JobStartOptions, ) -> Result { @@ -210,6 +483,13 @@ async fn handle_edf( context.insert("container_workdir", &workdir); context.insert("env", &envvars); context.insert("mount", &mount); + context.insert("ssh_public_key", &ssh_public_key_path); + context.insert("coman_squash", &coman_squash); + if let Some(iroh_secret) = iroh_secret { + // set iroh secret key + let encoded_secret = BASE64_STANDARD.encode(iroh_secret.to_bytes()); + context.insert("iroh_secret", &encoded_secret); + } let environment_file = tera.render("environment.toml", &context)?; api_client.mkdir(current_system, base_path.to_path_buf()).await?; @@ -231,12 +511,15 @@ async fn handle_edf( EdfSpec::Remote(path) => Ok(path), } } + +#[allow(clippy::too_many_arguments)] async fn handle_script( api_client: &CscsApi, job_name: &str, base_path: &Path, current_system: &str, environment_path: &Path, + coman_squash: Option, workdir: &str, options: &JobStartOptions, ) -> Result { @@ -255,6 +538,9 @@ async fn handle_script( ); context.insert("environment_file", &environment_path.to_path_buf()); context.insert("container_workdir", &workdir); + if let Some(path) = coman_squash { + context.insert("coman_squash", &path); + } let script = tera.render("script.sh", &context)?; api_client .upload(current_system, script_path.clone(), script.into_bytes()) @@ -284,12 +570,12 @@ pub async fn cscs_job_start( match get_access_token().await { Ok(access_token) => { let api_client = CscsApi::new(access_token.0, platform).unwrap(); - let config = Config::new().unwrap(); - let current_system = &system.unwrap_or(config.values.cscs.current_system); - let account = account.or(config.values.cscs.account); + let config = Config::new()?; + let current_system = &system.unwrap_or(config.values.cscs.current_system.clone()); + let account = account.or(config.values.cscs.account.clone()); let user_info = api_client.get_userinfo(current_system).await?; let job_name = name - .or(config.values.name) + .or(config.values.name.clone()) .unwrap_or(format!("{}-coman", user_info.name)); let current_system_info = api_client.get_system(current_system).await?; let scratch = match current_system_info { @@ -309,17 +595,26 @@ pub async fn cscs_job_start( let container_workdir = options .container_workdir .clone() - .unwrap_or(config.values.cscs.workdir.unwrap_or("/scratch".to_owned())); + .unwrap_or(config.values.cscs.workdir.clone().unwrap_or("/scratch".to_owned())); let base_path = scratch.join(user_info.name.clone()).join(&job_name); let mut envvars = config.values.cscs.env.clone(); envvars.extend(options.env.clone()); + let (ssh_public_key_path, secret_key) = + setup_ssh(&api_client, &base_path, current_system, &options, &config) + .await? + .unzip(); + let coman_squash = inject_coman_squash(&api_client, &base_path, current_system, &options).await?; + let environment_path = handle_edf( &api_client, &base_path, current_system, &envvars, + &coman_squash, + &ssh_public_key_path, + &secret_key, &container_workdir, &options, ) @@ -331,15 +626,26 @@ pub async fn cscs_job_start( &base_path, current_system, &environment_path, + coman_squash, &container_workdir, &options, ) .await?; // start job - api_client + let job_id = api_client .start_job(current_system, account, &job_name, script_path, envvars, options) - .await?; + .await? + .ok_or(eyre!("didn't get job id for created job"))?; + + if let Some(secret_key) = secret_key { + // store connection information in data dir and set up ssh connection + garbage_collect_ssh(&api_client, current_system).await?; + let connection_name = + store_ssh_information(current_system, &user_info, &job_id, &job_name, &secret_key).await?; + println!("Use ssh {}@{} to connect to the job", user_info.name, connection_name); + } + Ok(()) } Err(e) => Err(e), diff --git a/coman/src/main.rs b/coman/src/main.rs index 722eccf..429de7e 100644 --- a/coman/src/main.rs +++ b/coman/src/main.rs @@ -17,7 +17,7 @@ use crate::{ model::Model, user_events::{CscsEvent, FileEvent, StatusEvent, UserEvent}, }, - cli::{Cli, get_config, print_completions, set_config, version}, + cli::{Cli, cli_exec_command, cli_proxy_command, get_config, print_completions, set_config, version}, components::{ file_tree::FileTree, global_listener::GlobalListener, status_bar::StatusBar, toolbar::Toolbar, workload_list::WorkloadList, @@ -96,6 +96,9 @@ async fn main() -> Result<()> { stderr, edf_spec, script_spec, + no_ssh, + ssh_key, + no_coman, } => { cli_cscs_job_start( name, @@ -109,6 +112,9 @@ async fn main() -> Result<()> { stderr, edf_spec: edf_spec.unwrap_or_default().into(), script_spec: script_spec.unwrap_or_default().into(), + no_ssh, + ssh_key, + no_coman, }, system, platform, @@ -135,6 +141,8 @@ async fn main() -> Result<()> { }, }, cli::CliCommands::Init { destination, name } => Config::create_project_config(destination, name)?, + cli::CliCommands::Exec { command } => cli_exec_command(command).await?, + cli::CliCommands::Proxy { system, job_id } => cli_proxy_command(system, job_id).await?, }, None => run_tui(args.tick_rate)?, }