diff --git a/.github/ISSUE_TEMPLATE/release-checklist.md b/.github/ISSUE_TEMPLATE/release-checklist.md index 0044fda0..8662da01 100644 --- a/.github/ISSUE_TEMPLATE/release-checklist.md +++ b/.github/ISSUE_TEMPLATE/release-checklist.md @@ -103,13 +103,13 @@ Push access to the upstream repository is required in order to publish the new t - [ ] run `kinit your_fas_account@FEDORAPROJECT.ORG` - [ ] run `fedpkg new-sources $(spectool -S rust-afterburn.spec | sed 's:.*/::')` - [ ] PR the changes in [Fedora](https://src.fedoraproject.org/rpms/rust-afterburn) - - [ ] once the PR merges to rawhide, merge rawhide into the other relevant branches (e.g. f38) then push those, for example: + - [ ] once the PR merges to rawhide, merge rawhide into the other relevant branches (e.g. f40) then push those, for example: ```bash git checkout rawhide git pull --ff-only - git checkout f38 + git checkout f40 git merge --ff-only rawhide - git push origin f38 + git push origin f40 ``` - [ ] on each of those branches run `fedpkg build` - [ ] once the builds have finished, submit them to [bodhi](https://bodhi.fedoraproject.org/updates/new), filling in: diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 495635a4..4a559fb3 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -18,7 +18,7 @@ concurrency: env: CARGO_TERM_COLOR: always # Pinned toolchain for linting - ACTIONS_LINTS_TOOLCHAIN: 1.71.0 + ACTIONS_LINTS_TOOLCHAIN: 1.75.0 jobs: tests-stable: diff --git a/Cargo.lock b/Cargo.lock index 39c62321..dbcffc6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -25,10 +25,10 @@ checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" [[package]] name = "afterburn" -version = "5.5.0" +version = "5.6.0" dependencies = [ "anyhow", - "base64 0.21.5", + "base64 0.22.1", "cfg-if", "clap", "ipnetwork", @@ -37,10 +37,10 @@ dependencies = [ "mailparse", "maplit", "mockito", - "nix 0.27.1", + "nix 0.26.4", "openssh-keys", "openssl", - "pnet_base", + "pnet_base 0.34.0", "pnet_datalink", "reqwest", "serde", @@ -57,32 +57,50 @@ dependencies = [ "zbus", ] +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "arc-swap" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "assert-json-diff" @@ -106,12 +124,11 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.1.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d37875bd9915b7d67c2f117ea2c30a0989874d0b2cb694fe25403c85763c0c9e" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener 3.1.0", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -119,15 +136,14 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.7.2" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc5ea910c42e5ab19012bab31f53cb4d63d54c3a27730f9a833a88efcf4bb52d" +checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0" dependencies = [ - "async-lock 3.1.1", "async-task", "concurrent-queue", - "fastrand 2.0.1", - "futures-lite 2.0.1", + "fastrand 2.1.0", + "futures-lite 2.3.0", "slab", ] @@ -165,22 +181,21 @@ dependencies = [ [[package]] name = "async-io" -version = "2.2.0" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9d5715c2d329bf1b4da8d60455b99b187f27ba726df2883799af9af60997" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" dependencies = [ - "async-lock 3.1.1", + "async-lock 3.4.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.0.1", + "futures-lite 2.3.0", "parking", - "polling 3.3.0", - "rustix 0.38.25", + "polling 3.7.2", + "rustix 0.38.34", "slab", "tracing", - "waker-fn", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -194,11 +209,11 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.1.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655b9c7fe787d3b25cc0f804a1a8401790f0c5bc395beb5a64dc77d8de079105" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 3.1.0", + "event-listener 5.3.1", "event-listener-strategy", "pin-project-lite", ] @@ -216,54 +231,54 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.25", - "windows-sys", + "rustix 0.38.34", + "windows-sys 0.48.0", ] [[package]] name = "async-recursion" -version = "1.0.5" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.66", ] [[package]] name = "async-signal" -version = "0.2.5" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" +checksum = "794f185324c2f00e771cd9f1ae8b5ac68be2ca7abb129a87afd6e86d228bc54d" dependencies = [ - "async-io 2.2.0", - "async-lock 2.8.0", + "async-io 2.3.3", + "async-lock 3.4.0", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.25", + "rustix 0.38.34", "signal-hook-registry", "slab", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "async-task" -version = "4.5.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.66", ] [[package]] @@ -272,28 +287,17 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -312,9 +316,15 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" @@ -324,9 +334,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "block-buffer" @@ -339,25 +349,22 @@ dependencies = [ [[package]] name = "blocking" -version = "1.5.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ "async-channel", - "async-lock 3.1.1", "async-task", - "fastrand 2.0.1", "futures-io", - "futures-lite 2.0.1", + "futures-lite 2.3.0", "piper", - "tracing", ] [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "byteorder" @@ -367,18 +374,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" [[package]] name = "cfg-if" @@ -398,9 +402,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.10" +version = "4.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272" +checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" dependencies = [ "clap_builder", "clap_derive", @@ -408,9 +412,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.9" +version = "4.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1" +checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" dependencies = [ "anstyle", "clap_lex", @@ -420,47 +424,46 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.66", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "colored" -version = "2.0.4" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" dependencies = [ - "is-terminal", "lazy_static", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "concurrent-queue" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -468,46 +471,51 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "core2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crypto-common" @@ -519,17 +527,23 @@ dependencies = [ "typenum", ] +[[package]] +name = "dary_heap" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7762d17f1241643615821a8455a0b2c3e803784b058693d990b11f2dce25a0ca" + [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "deranged" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", ] @@ -577,20 +591,31 @@ dependencies = [ "winapi", ] +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if", ] [[package]] name = "enumflags2" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5998b4f30320c9d93aed72f63af821bfdac50465b75428fce77b48ec482c3939" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" dependencies = [ "enumflags2_derive", "serde", @@ -598,13 +623,13 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.66", ] [[package]] @@ -615,12 +640,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -640,13 +665,24 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + [[package]] name = "event-listener-strategy" -version = "0.3.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96b852f1345da36d551b9473fa1e2b1eb5c5195585c6c018118bc92a8d91160" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 3.1.0", + "event-listener 5.3.1", "pin-project-lite", ] @@ -661,9 +697,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "fnv" @@ -695,26 +731,11 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "futures" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -722,26 +743,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" - -[[package]] -name = "futures-executor" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" @@ -760,51 +770,37 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.0.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3831c2651acb5177cbd83943f3d9c8912c5ad03c76afcc0e9511ba568ec5ebb" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ - "fastrand 2.0.1", + "fastrand 2.1.0", "futures-core", "futures-io", - "memchr", "parking", "pin-project-lite", ] -[[package]] -name = "futures-macro" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", -] - [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ - "futures-channel", "futures-core", "futures-io", - "futures-macro", "futures-sink", "futures-task", "memchr", @@ -825,9 +821,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -836,22 +832,41 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "h2" -version = "0.3.22" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", "indexmap", "slab", "tokio", @@ -861,30 +876,31 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.1.19" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" [[package]] name = "hex" @@ -903,9 +919,20 @@ dependencies = [ [[package]] name = "http" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -914,20 +941,43 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", - "http", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -937,56 +987,235 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" dependencies = [ "bytes", "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", "tokio", "tower-service", "tracing", "want", ] +[[package]] +name = "hyper" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.5", + "http 1.1.0", + "http-body 1.0.0", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.3.1", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + [[package]] name = "hyper-tls" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", - "hyper", + "http-body-util", + "hyper 1.3.1", + "hyper-util", "native-tls", "tokio", "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.3.1", + "pin-project-lite", + "socket2 0.5.7", + "tokio", + "tower", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f8ac670d7422d7f76b32e17a5db556510825b29ec9154f235977c9caba61036" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", ] [[package]] name = "idna" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "4716a3a0933a1d01c2f72450e89596eb51dd34ef3c211ccd875acdf1f8fe47ed" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", + "smallvec", + "utf8_iter", ] [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown", @@ -994,9 +1223,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -1007,9 +1236,9 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.9", "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1029,26 +1258,26 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.3", - "rustix 0.38.25", - "windows-sys", + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", ] [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -1061,39 +1290,42 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libflate" -version = "1.4.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ff4ae71b685bbad2f2f391fe74f6b7659a34871c08b210fdc039e43bee07d18" +checksum = "45d9dfdc14ea4ef0900c1cddbc8dcd553fbaacd8a4a282cf4018ae9dd04fb21e" dependencies = [ "adler32", + "core2", "crc32fast", + "dary_heap", "libflate_lz77", ] [[package]] name = "libflate_lz77" -version = "1.2.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a52d3a8bfc85f250440e4424db7d857e241a3aebbbe301f3eb606ab15c39acbf" +checksum = "e6e0d73b369f386f1c44abd9c570d5318f55ccde816ff4b562fa452e5182863d" dependencies = [ + "core2", + "hashbrown", "rle-decode-fast", ] [[package]] name = "libredox" -version = "0.0.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.5.0", "libc", - "redox_syscall", ] [[package]] @@ -1122,15 +1354,21 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.11" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -1138,15 +1376,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "mailparse" -version = "0.14.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b56570f5f8c0047260d1c8b5b331f62eb9c660b9dd4071a8c46f8c7d3f280aa" +checksum = "3da03d5980411a724e8aaf7b61a7b5e386ec55a7fb49ee3d0ff79efc7e5e7c7e" dependencies = [ "charset", "data-encoding", @@ -1171,9 +1409,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memoffset" @@ -1186,9 +1424,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -1207,34 +1445,34 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.9" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "mockito" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8d3038e23466858569c2d30a537f691fa0d53b51626630ae08262943e3bbb8b" +checksum = "d2f6e023aa5bdf392aa06c78e4a4e6d498baab5138d0c993503350ebbc37bf1e" dependencies = [ "assert-json-diff", "colored", - "futures", - "hyper", + "futures-core", + "hyper 0.14.29", "log", "rand", "regex", @@ -1246,11 +1484,10 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -1280,10 +1517,10 @@ version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.5.0", "cfg-if", "libc", - "memoffset 0.9.0", + "memoffset 0.9.1", ] [[package]] @@ -1303,46 +1540,33 @@ dependencies = [ ] [[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.3", - "libc", -] - -[[package]] -name = "num_threads" -version = "0.1.6" +name = "num-conv" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" -dependencies = [ - "libc", -] +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "object" -version = "0.32.1" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssh-keys" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75a0ec2d1b302412fb503224289325fcc0e44600176864804c7211b055cfd58" +checksum = "e9939566c441a6542e87c74310d4ac713c17679c76f296932e732f405bc25e3d" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "byteorder", "md-5", "sha2", @@ -1351,11 +1575,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.60" +version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.5.0", "cfg-if", "foreign-types", "libc", @@ -1372,7 +1596,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.66", ] [[package]] @@ -1383,9 +1607,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.96" +version = "0.9.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" dependencies = [ "cc", "libc", @@ -1411,9 +1635,9 @@ checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -1421,15 +1645,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.52.5", ] [[package]] @@ -1438,11 +1662,31 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -1452,20 +1696,20 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" dependencies = [ "atomic-waker", - "fastrand 2.0.1", + "fastrand 2.1.0", "futures-io", ] [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "pnet_base" @@ -1476,24 +1720,33 @@ dependencies = [ "no-std-net", ] +[[package]] +name = "pnet_base" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc190d4067df16af3aba49b3b74c469e611cad6314676eaf1157f31aa0fb2f7" +dependencies = [ + "no-std-net", +] + [[package]] name = "pnet_datalink" -version = "0.34.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad5854abf0067ebbd3967f7d45ebc8976ff577ff0c7bd101c4973ae3c70f98fe" +checksum = "e79e70ec0be163102a332e1d2d5586d362ad76b01cec86f830241f2b6452a7b7" dependencies = [ "ipnetwork", "libc", - "pnet_base", + "pnet_base 0.35.0", "pnet_sys", "winapi", ] [[package]] name = "pnet_sys" -version = "0.34.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "417c0becd1b573f6d544f73671070b039051e5ad819cc64aa96377b536128d00" +checksum = "7d4643d3d4db6b08741050c2f3afa9a892c4244c085a72fcda93c9c2c9a00f4b" dependencies = [ "libc", "winapi", @@ -1512,21 +1765,22 @@ dependencies = [ "libc", "log", "pin-project-lite", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "polling" -version = "3.3.0" +version = "3.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e53b6af1f60f36f8c2ac2aad5459d75a5a9b4be1e8cdd40264f315d78193e531" +checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" dependencies = [ "cfg-if", "concurrent-queue", + "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.25", + "rustix 0.38.34", "tracing", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1553,27 +1807,27 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] [[package]] name = "quoted_printable" -version = "0.4.8" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3866219251662ec3b26fc217e3e05bf9c4f84325234dfb96bf0bf840889e49" +checksum = "79ec282e887b434b68c18fe5c121d38e72a5cf35119b59e54ec5b992ea9c8eb0" [[package]] name = "rand" @@ -1607,18 +1861,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", ] [[package]] name = "redox_users" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ "getrandom", "libredox", @@ -1627,9 +1881,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", @@ -1639,9 +1893,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -1650,26 +1904,30 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" -version = "0.11.22" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" dependencies = [ - "base64 0.21.5", + "base64 0.22.1", "bytes", "encoding_rs", + "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", - "hyper", + "h2 0.4.5", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.3.1", + "hyper-rustls", "hyper-tls", + "hyper-util", "ipnet", "js-sys", "log", @@ -1678,9 +1936,11 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", "system-configuration", "tokio", "tokio-native-tls", @@ -1692,6 +1952,21 @@ dependencies = [ "winreg", ] +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "rle-decode-fast" version = "1.0.3" @@ -1700,9 +1975,9 @@ checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422" [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustix" @@ -1715,41 +1990,81 @@ dependencies = [ "io-lifetimes", "libc", "linux-raw-sys 0.3.8", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "rustix" -version = "0.38.25" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.5.0", "errno", "libc", - "linux-raw-sys 0.4.11", - "windows-sys", + "linux-raw-sys 0.4.14", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.23.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + +[[package]] +name = "rustls-webpki" +version = "0.102.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", ] [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1760,11 +2075,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.9.2" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", "core-foundation", "core-foundation-sys", "libc", @@ -1773,9 +2088,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ "core-foundation-sys", "libc", @@ -1783,9 +2098,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.193" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] @@ -1804,20 +2119,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.66", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" dependencies = [ "itoa", "ryu", @@ -1826,13 +2141,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.66", ] [[package]] @@ -1849,9 +2164,9 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.27" +version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ "indexmap", "itoa", @@ -1884,18 +2199,18 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] [[package]] name = "similar" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aeaf503862c419d66959f5d7ca015337d864e9c49485d771b732e2a20453597" +checksum = "fa42c91313f1d05da9b26f267f931cf178d4aba455b4c4622dd7355eb80c6640" [[package]] name = "slab" @@ -1937,11 +2252,11 @@ dependencies = [ [[package]] name = "slog-term" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87d29185c55b7b258b4f120eab00f48557d4d9bc814f41713f449d35b0f8977c" +checksum = "b6e022d0b998abfe5c3782c1f03551a596269450ccd677ea51c56f8b214610e8" dependencies = [ - "atty", + "is-terminal", "slog", "term", "thread_local", @@ -1950,9 +2265,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" @@ -1966,14 +2281,26 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -1982,9 +2309,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" @@ -2005,15 +2332,32 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.39" +version = "2.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "system-configuration" version = "0.5.1" @@ -2043,15 +2387,14 @@ checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" [[package]] name = "tempfile" -version = "3.8.1" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", - "fastrand 2.0.1", - "redox_syscall", - "rustix 0.38.25", - "windows-sys", + "fastrand 2.1.0", + "rustix 0.38.34", + "windows-sys 0.52.0", ] [[package]] @@ -2071,35 +2414,35 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" dependencies = [ - "rustix 0.38.25", - "windows-sys", + "rustix 0.38.34", + "windows-sys 0.48.0", ] [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.66", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", @@ -2107,14 +2450,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.30" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", - "libc", - "num_threads", + "num-conv", "powerfmt", "serde", "time-core", @@ -2129,87 +2471,79 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ + "num-conv", "time-core", ] [[package]] -name = "tinyvec" -version = "1.6.0" +name = "tinystr" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ - "tinyvec_macros", + "displaydoc", + "zerovec", ] -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" -version = "1.34.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", - "signal-hook-registry", - "socket2 0.5.5", - "tokio-macros", - "windows-sys", + "socket2 0.5.7", + "windows-sys 0.48.0", ] [[package]] -name = "tokio-macros" -version = "2.2.0" +name = "tokio-native-tls" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", + "native-tls", + "tokio", ] [[package]] -name = "tokio-native-tls" -version = "0.3.1" +name = "tokio-rustls" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "native-tls", + "rustls", + "rustls-pki-types", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" [[package]] name = "toml_edit" @@ -2222,6 +2556,27 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -2247,7 +2602,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.66", ] [[package]] @@ -2261,9 +2616,9 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" @@ -2273,20 +2628,15 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "uds_windows" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" dependencies = [ + "memoffset 0.9.1", "tempfile", "winapi", ] -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - [[package]] name = "unicode-ident" version = "1.0.12" @@ -2294,36 +2644,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] -name = "unicode-normalization" -version = "0.1.22" +name = "unsafe-libyaml" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] -name = "unsafe-libyaml" -version = "0.2.9" +name = "untrusted" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "f7c25da092f0a868cdf09e8674cd3b7ef3a7d92a24253e663a2fb85e2496de56" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "uuid" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" dependencies = [ "serde", ] @@ -2366,9 +2725,9 @@ dependencies = [ [[package]] name = "waker-fn" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" [[package]] name = "want" @@ -2387,9 +2746,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2397,24 +2756,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.66", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.38" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -2424,9 +2783,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2434,28 +2793,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.66", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -2489,7 +2848,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.5", ] [[package]] @@ -2498,13 +2866,29 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", ] [[package]] @@ -2513,82 +2897,166 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + [[package]] name = "winnow" -version = "0.5.19" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] [[package]] name = "winreg" -version = "0.50.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] -name = "xdg-home" +name = "write16" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "xdg-home" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca91dcf8f93db085f3a0a29358cd0b9d670915468f4290e8b85d118a34211ab8" dependencies = [ - "nix 0.26.4", - "winapi", + "libc", + "windows-sys 0.52.0", ] [[package]] name = "xml-rs" -version = "0.8.19" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" + +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", + "synstructure", +] [[package]] name = "zbus" -version = "3.14.1" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948" +checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" dependencies = [ "async-broadcast", "async-executor", @@ -2627,9 +3095,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "3.14.1" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d" +checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2641,20 +3109,89 @@ dependencies = [ [[package]] name = "zbus_names" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9" +checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" dependencies = [ "serde", "static_assertions", "zvariant", ] +[[package]] +name = "zerocopy" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2cc8827d6c0994478a15c53f374f46fbd41bea663d809b14744bc42e6b109c" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97cf56601ee5052b4417d90c8755c6683473c926039908196cf35d99f893ebe7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "zvariant" -version = "3.15.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c" +checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" dependencies = [ "byteorder", "enumflags2", @@ -2666,9 +3203,9 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "3.15.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd" +checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index 6d3b893c..cfa2e6e5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,12 +4,12 @@ repository = "https://github.com/coreos/afterburn" license = "Apache-2.0" edition = "2021" # when updating this, also update README.md and docs/index.md -rust-version = "1.71.0" +rust-version = "1.75.0" exclude = ["/.cci.jenkinsfile", "/.github", "/.gitignore"] authors = [ "Stephen Demos ", "Luca Bruno " ] description = "A simple cloud provider agent" -version = "5.5.0" +version = "5.6.0" [package.metadata.release] sign-commit = true @@ -35,20 +35,20 @@ debug = true [dependencies] anyhow = "1.0" -base64 = "0.21" +base64 = "0.22" cfg-if = "1.0" -clap = { version = "4", "default_features" = false, "features" = ["std", "cargo", "derive", "error-context", "help", "suggestions", "usage", "wrap_help"] } +clap = { version = "4", "default-features" = false, "features" = ["std", "cargo", "derive", "error-context", "help", "suggestions", "usage", "wrap_help"] } ipnetwork = ">= 0.17, < 0.21" -libflate = "1.3" +libflate = "2.1" libsystemd = ">= 0.2.1, < 0.8.0" -mailparse = ">= 0.13, < 0.15" +mailparse = ">= 0.13, < 0.16" maplit = "1.0" -nix = { version = ">= 0.19, < 0.28", "default_features" = false, "features" = [ "mount", "user"] } +nix = { version = ">= 0.19, < 0.30", "default-features" = false, "features" = [ "mount", "user"] } openssh-keys = ">= 0.5, < 0.7" openssl = ">= 0.10.46, < 0.11" pnet_base = ">= 0.26, < 0.35" -pnet_datalink = ">= 0.26, < 0.35" -reqwest = { version = ">= 0.10, < 0.12", features = [ "blocking" ] } +pnet_datalink = ">= 0.26, < 0.36" +reqwest = { version = ">= 0.10, < 0.13", features = [ "blocking" ] } serde = { version = "1.0", features = [ "derive" ] } serde-xml-rs = ">= 0.4, < 0.7" serde_json = "1.0" diff --git a/README.md b/README.md index 66469faa..dce31faa 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Afterburn [![crates.io](https://img.shields.io/crates/v/afterburn.svg)](https://crates.io/crates/afterburn) -![minimum rust 1.71](https://img.shields.io/badge/rust-1.71%2B-orange.svg) +![minimum rust 1.75](https://img.shields.io/badge/rust-1.75%2B-orange.svg) Afterburn is a one-shot agent for cloud-like platforms which interacts with provider-specific metadata endpoints. It is typically used in conjunction with [Ignition](https://github.com/coreos/ignition). diff --git a/docs/_config.yml b/docs/_config.yml index 0bf40c6c..fed45bd8 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -14,7 +14,7 @@ kramdown: ndash: "--" mdash: "---" -remote_theme: just-the-docs/just-the-docs@v0.7.0 +remote_theme: just-the-docs/just-the-docs@v0.8.1 plugins: - jekyll-remote-theme diff --git a/docs/index.md b/docs/index.md index 9cafbc75..852f02ce 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,7 +5,7 @@ nav_order: 1 # Afterburn [![crates.io](https://img.shields.io/crates/v/afterburn.svg)](https://crates.io/crates/afterburn) -![minimum rust 1.71](https://img.shields.io/badge/rust-1.71%2B-orange.svg) +![minimum rust 1.75](https://img.shields.io/badge/rust-1.75%2B-orange.svg) Afterburn is a one-shot agent for cloud-like platforms which interacts with provider-specific metadata endpoints. It is typically used in conjunction with [Ignition](https://github.com/coreos/ignition). diff --git a/docs/platforms.md b/docs/platforms.md index d2795735..72d6700e 100644 --- a/docs/platforms.md +++ b/docs/platforms.md @@ -8,6 +8,9 @@ By default Afterburn uses the Ignition platform ID to detect the environment whe The following platforms are supported, with a different set of features available on each: +* akamai + - Attributes + - SSH Keys * aliyun - Attributes - SSH Keys @@ -61,6 +64,11 @@ The following platforms are supported, with a different set of features availabl * powervs - Attributes - SSH keys +* proxmoxve + - Attributes + - Hostname + - SSH keys + - Network configuration * scaleway - Attributes - Boot check-in diff --git a/docs/release-notes.md b/docs/release-notes.md index e0fedd1b..43e720d5 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -4,16 +4,33 @@ nav_order: 8 # Release notes -## Upcoming Afterburn 5.6.0 (unreleased) +## Upcoming Afterburn 5.7.0 (unreleased) Major changes: +- Add support for Proxmox VE Minor changes: +Packaging changes: + + +## Afterburn 5.6.0 + +Major changes: + +- Add support for Akamai Connected Cloud (Linode) Packaging changes: +- Require Rust ≥ 1.75.0 + + +## Afterburn 5.5.1 (2024-01-12) + +Minor changes: + +- providers/vmware: add missing public functions for non-amd64 ## Afterburn 5.5.0 (2023-11-22) diff --git a/docs/usage/attributes.md b/docs/usage/attributes.md index f3868f92..42e5a41a 100644 --- a/docs/usage/attributes.md +++ b/docs/usage/attributes.md @@ -13,6 +13,20 @@ which wants to make use of Afterburn metadata must explicitly pull it in using e Cloud providers with supported metadata endpoints and their respective attributes are listed below. +* akamai + - AFTERBURN_AKAMAI_INSTANCE_HOST_UUID + - AFTERBURN_AKAMAI_INSTANCE_ID + - AFTERBURN_AKAMAI_INSTANCE_LABEL + - AFTERBURN_AKAMAI_INSTANCE_REGION + - AFTERBURN_AKAMAI_INSTANCE_TAGS + - AFTERBURN_AKAMAI_INSTANCE_TYPE + - AFTERBURN_AKAMAI_IPV6_LINK_LOCAL + - AFTERBURN_AKAMAI_IPV6_RANGE_0 + - AFTERBURN_AKAMAI_IPV6_SHARED_RANGE_0 + - AFTERBURN_AKAMAI_IPV6_SLAAC + - AFTERBURN_AKAMAI_PRIVATE_IPV4_0 + - AFTERBURN_AKAMAI_PUBLIC_IPV4_0 + - AFTERBURN_AKAMAI_SHARED_IPV4_0 * aliyun - AFTERBURN_ALIYUN_EIPV4 - AFTERBURN_ALIYUN_HOSTNAME @@ -121,6 +135,11 @@ Cloud providers with supported metadata endpoints and their respective attribute * powervs - AFTERBURN_POWERVS_INSTANCE_ID - AFTERBURN_POWERVS_LOCAL_HOSTNAME +* proxmoxve + - AFTERBURN_PROXMOXVE_HOSTNAME + - AFTERBURN_PROXMOXVE_INSTANCE_ID + - AFTERBURN_PROXMOXVE_IPV4 + - AFTERBURN_PROXMOXVE_IPV6 * scaleway - AFTERBURN_SCALEWAY_HOSTNAME - AFTERBURN_SCALEWAY_INSTANCE_ID diff --git a/dracut/30afterburn/afterburn-hostname.service b/dracut/30afterburn/afterburn-hostname.service index 485cd82a..268522bd 100644 --- a/dracut/30afterburn/afterburn-hostname.service +++ b/dracut/30afterburn/afterburn-hostname.service @@ -12,6 +12,7 @@ ConditionKernelCommandLine=|ignition.platform.id=exoscale ConditionKernelCommandLine=|ignition.platform.id=hetzner ConditionKernelCommandLine=|ignition.platform.id=ibmcloud ConditionKernelCommandLine=|ignition.platform.id=kubevirt +ConditionKernelCommandLine=|ignition.platform.id=proxmoxve ConditionKernelCommandLine=|ignition.platform.id=scaleway ConditionKernelCommandLine=|ignition.platform.id=vultr diff --git a/src/metadata.rs b/src/metadata.rs index f27dc7e4..94f9238b 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -15,6 +15,7 @@ use anyhow::{bail, Result}; use crate::providers; +use crate::providers::akamai::AkamaiProvider; use crate::providers::aliyun::AliyunProvider; use crate::providers::aws::AwsProvider; use crate::providers::cloudstack::configdrive::ConfigDrive; @@ -32,6 +33,7 @@ use crate::providers::openstack; use crate::providers::openstack::network::OpenstackProviderNetwork; use crate::providers::packet::PacketProvider; use crate::providers::powervs::PowerVSProvider; +use crate::providers::proxmoxve::ProxmoxVEConfigDrive; use crate::providers::scaleway::ScalewayProvider; use crate::providers::vmware::VmwareProvider; use crate::providers::vultr::VultrProvider; @@ -49,6 +51,7 @@ macro_rules! box_result { /// to the provider-specific fetch logic. pub fn fetch_metadata(provider: &str) -> Result> { match provider { + "akamai" => box_result!(AkamaiProvider::try_new()?), "aliyun" => box_result!(AliyunProvider::try_new()?), "aws" => box_result!(AwsProvider::try_new()?), "azure" => box_result!(Azure::try_new()?), @@ -68,6 +71,7 @@ pub fn fetch_metadata(provider: &str) -> Result box_result!(OpenstackProviderNetwork::try_new()?), "packet" => box_result!(PacketProvider::try_new()?), "powervs" => box_result!(PowerVSProvider::try_new()?), + "proxmoxve" => box_result!(ProxmoxVEConfigDrive::try_new()?), "scaleway" => box_result!(ScalewayProvider::try_new()?), "vmware" => box_result!(VmwareProvider::try_new()?), "vultr" => box_result!(VultrProvider::try_new()?), diff --git a/src/network.rs b/src/network.rs index 77957352..26c0a6fb 100644 --- a/src/network.rs +++ b/src/network.rs @@ -79,6 +79,8 @@ pub struct Interface { pub priority: u8, pub nameservers: Vec, pub ip_addresses: Vec, + // Optionally enable DHCP + pub dhcp: Option, pub routes: Vec, pub bond: Option, pub unmanaged: bool, @@ -128,6 +130,31 @@ impl NetDevKind { } } +/// Optional use of DHCP. +#[allow(dead_code)] +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum DhcpSetting { + Both, + V4, + V6, +} + +impl DhcpSetting { + /// Return DHCP setting according to `systemd.network` + /// + /// See [systemd documentation](dhcp) for the full list. + /// + /// dhcp: https://www.freedesktop.org/software/systemd/man/latest/systemd.network.html#DHCP= + fn sd_dhcp_setting(&self) -> String { + let setting = match *self { + DhcpSetting::Both => "yes", + DhcpSetting::V4 => "ipv4", + DhcpSetting::V6 => "ipv6", + }; + setting.to_string() + } +} + impl Interface { /// Return a deterministic `systemd.network` unit name for this device. pub fn sd_network_unit_name(&self) -> Result { @@ -158,6 +185,9 @@ impl Interface { // [Network] section writeln!(config, "\n[Network]").unwrap(); + if let Some(dhcp) = &self.dhcp { + writeln!(config, "DHCP={}", dhcp.sd_dhcp_setting()).unwrap(); + } for ns in &self.nameservers { writeln!(config, "DNS={ns}").unwrap() } @@ -246,6 +276,7 @@ mod tests { priority: 20, nameservers: vec![], ip_addresses: vec![], + dhcp: None, routes: vec![], bond: None, unmanaged: false, @@ -261,6 +292,7 @@ mod tests { priority: 10, nameservers: vec![], ip_addresses: vec![], + dhcp: None, routes: vec![], bond: None, unmanaged: false, @@ -276,6 +308,7 @@ mod tests { priority: 20, nameservers: vec![], ip_addresses: vec![], + dhcp: None, routes: vec![], bond: None, unmanaged: false, @@ -291,6 +324,7 @@ mod tests { priority: 20, nameservers: vec![], ip_addresses: vec![], + dhcp: None, routes: vec![], bond: None, unmanaged: false, @@ -306,6 +340,7 @@ mod tests { priority: 20, nameservers: vec![], ip_addresses: vec![], + dhcp: None, routes: vec![], bond: None, unmanaged: false, @@ -330,6 +365,7 @@ mod tests { priority: 20, nameservers: vec![], ip_addresses: vec![], + dhcp: None, routes: vec![], bond: None, unmanaged: false, @@ -387,6 +423,7 @@ mod tests { Ipv6Network::new(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1), 128).unwrap(), ), ], + dhcp: None, routes: vec![NetworkRoute { destination: IpNetwork::V4( Ipv4Network::new(Ipv4Addr::new(127, 0, 0, 1), 8).unwrap(), @@ -428,6 +465,7 @@ Gateway=127.0.0.1 priority: 10, nameservers: vec![], ip_addresses: vec![], + dhcp: None, routes: vec![], bond: None, unmanaged: false, @@ -447,6 +485,7 @@ Gateway=127.0.0.1 priority: 10, nameservers: vec![], ip_addresses: vec![], + dhcp: None, routes: vec![], bond: None, unmanaged: false, @@ -470,6 +509,7 @@ RequiredForOnline=no priority: 10, nameservers: vec![], ip_addresses: vec![], + dhcp: None, routes: vec![], bond: None, unmanaged: true, @@ -482,6 +522,28 @@ Name=* [Link] Unmanaged=yes +", + ), + // test the DHCP setting + ( + Interface { + name: Some("*".to_owned()), + mac_address: None, + path: None, + priority: 10, + nameservers: vec![], + ip_addresses: vec![], + dhcp: Some(DhcpSetting::V4), + routes: vec![], + bond: None, + unmanaged: false, + required_for_online: None, + }, + "[Match] +Name=* + +[Network] +DHCP=ipv4 ", ), ]; diff --git a/src/providers/akamai/mock_tests.rs b/src/providers/akamai/mock_tests.rs new file mode 100644 index 00000000..e6ac21a7 --- /dev/null +++ b/src/providers/akamai/mock_tests.rs @@ -0,0 +1,104 @@ +use crate::providers::akamai::{AkamaiProvider, TOKEN_TTL}; +use crate::providers::MetadataProvider; +use mockito::{self}; + +#[test] +fn test_attributes() { + let mut server = mockito::Server::new(); + let token = "deadbeefcafebabe"; + + // Mock the PUT /v1/token endpoint. + let put_v1_token = server + .mock("PUT", "/v1/token") + .match_header("metadata-token-expiry-seconds", TOKEN_TTL) + .with_body(token) + .expect_at_least(1) + .create(); + + // Mock the GET /v1/instance endpoint. + let instance_metadata = r#"{ + "id": 12345678, + "label": "my-linode", + "region": "us-ord", + "type": "g6-nanode-1", + "specs": { + "vcpus": 1, + "memory": 1024, + "gpus": 0, + "transfer": 1000, + "disk": 25600 + }, + "backups": { + "enabled": false, + "status": null + }, + "host_uuid": "a631b16d14534d84e2830da16d1b28e1d08d24df", + "tags": ["foo", "bar", "baz"] + }"#; + + let get_v1_instance = server + .mock("GET", "/v1/instance") + .match_header("Accept", "application/json") + .match_header("metadata-token", token) + .with_body(instance_metadata) + .create(); + + // Mock the /v1/network endpoint. + let network_metadata = r#"{ + "interfaces": [ + { + "id": 12345678, + "purpose": "public", + "label": null, + "ipam_address": null + } + ], + "ipv4": { + "public": [ + "1.2.3.4/32" + ], + "private": [ + "192.168.1.1/32" + ], + "shared": [] + }, + "ipv6": { + "slaac": "2600:3c06::f03c:94ff:fecb:c10b/128", + "ranges": [], + "link_local": "fe80::f03c:94ff:fecb:c10b/128", + "shared_ranges": [] + } + }"#; + + let get_v1_network = server + .mock("GET", "/v1/network") + .match_header("Accept", "application/json") + .match_header("metadata-token", token) + .with_body(network_metadata) + .create(); + + let provider = AkamaiProvider::with_base_url(server.url()).unwrap(); + let attrs = provider.attributes(); + + // Assert that our endpoints were called. + put_v1_token.assert(); + get_v1_instance.assert(); + get_v1_network.assert(); + + let actual = attrs.unwrap(); + let expected = maplit::hashmap! { + "AKAMAI_INSTANCE_ID".to_string() => "12345678".to_string(), + "AKAMAI_INSTANCE_HOST_UUID".to_string() => "a631b16d14534d84e2830da16d1b28e1d08d24df".to_string(), + "AKAMAI_INSTANCE_LABEL".to_string() => "my-linode".to_string(), + "AKAMAI_INSTANCE_REGION".to_string() => "us-ord".to_string(), + "AKAMAI_INSTANCE_TYPE".to_string() => "g6-nanode-1".to_string(), + "AKAMAI_INSTANCE_TAGS".to_string() => "foo:bar:baz".to_string(), + "AKAMAI_PUBLIC_IPV4_0".to_string() => "1.2.3.4/32".to_string(), + "AKAMAI_PRIVATE_IPV4_0".to_string() => "192.168.1.1/32".to_string(), + "AKAMAI_IPV6_SLAAC".to_string() => "2600:3c06::f03c:94ff:fecb:c10b/128".to_string(), + "AKAMAI_IPV6_LINK_LOCAL".to_string() => "fe80::f03c:94ff:fecb:c10b/128".to_string(), + }; + assert_eq!(expected, actual); + + server.reset(); +} diff --git a/src/providers/akamai/mod.rs b/src/providers/akamai/mod.rs new file mode 100644 index 00000000..e13a59af --- /dev/null +++ b/src/providers/akamai/mod.rs @@ -0,0 +1,284 @@ +// Copyright 2024 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Metadata fetcher for Akamai Connected Cloud (Linode). +//! +//! The Metadata Service's API specification is described in [Guides - Overview of the Metadata +//! Service](https://www.linode.com/docs/products/compute/compute-instances/guides/metadata/). + +#[cfg(test)] +mod mock_tests; + +use anyhow::{Context, Result}; +use openssh_keys::PublicKey; +use reqwest::header::{HeaderName, HeaderValue}; +use serde::Deserialize; +use std::collections::HashMap; + +use crate::providers::MetadataProvider; +use crate::retry; + +/// Default TTL for the metadata token, in seconds. +static TOKEN_TTL: &str = "300"; + +pub struct AkamaiProvider { + client: retry::Client, +} + +impl AkamaiProvider { + /// Instantiate a new `AkamaiProvider`. + pub fn try_new() -> Result { + // Get a metadata token. + let client = retry::Client::try_new()?; + let token = get_token(client)?; + + // Create the new client with the token pre-loaded into a header. + // All of the other endpoints accept "text/plain" and "application/json". + // Let's prefer JSON. + let client = retry::Client::try_new()? + .header( + HeaderName::from_static("metadata-token"), + HeaderValue::from_str(&token)?, + ) + .header( + HeaderName::from_static("accept"), + HeaderValue::from_static("application/json"), + ) + .return_on_404(true); + Ok(Self { client }) + } + + /// Instantiate a new `AkamaiProvider` with a specific client. + /// + /// NOTE: This method solely exists for testing. + #[cfg(test)] + pub fn with_base_url(url: String) -> Result { + let client = retry::Client::try_new()? + .mock_base_url(url.clone()) + .return_on_404(true) + .max_retries(0); + let token = get_token(client)?; + + let client = retry::Client::try_new()? + .header( + HeaderName::from_static("metadata-token"), + HeaderValue::from_str(&token)?, + ) + .header( + HeaderName::from_static("accept"), + HeaderValue::from_static("application/json"), + ) + .mock_base_url(url) + .return_on_404(true) + .max_retries(0); + Ok(Self { client }) + } + + fn endpoint_for(key: &str) -> String { + const URL: &str = "http://169.254.169.254/v1"; + format!("{URL}/{key}") + } + + /// Fetch the instance metadata. + fn fetch_instance_metadata(&self) -> Result { + let instance: Instance = self + .client + .get(retry::Json, AkamaiProvider::endpoint_for("instance")) + .send()? + .context("get instance metadata")?; + Ok(instance) + } + + /// Fetch the network metadata. + fn fetch_network_metadata(&self) -> Result { + let network: Network = self + .client + .get(retry::Json, AkamaiProvider::endpoint_for("network")) + .send()? + .context("get network metadata")?; + Ok(network) + } + + /// Fetch the SSH keys. + /// The returned [HashMap] is a mapping of usernames, to SSH public keys. + fn fetch_ssh_keys(&self) -> Result>> { + let ssh_keys: SshKeys = self + .client + .get(retry::Json, AkamaiProvider::endpoint_for("ssh-keys")) + .send()? + .context("get ssh keys")?; + Ok(ssh_keys.users) + } + + /// Convert instance and network metadata into environment variables. + fn parse_attrs(&self) -> Result> { + // Instance metadata. + let data = self.fetch_instance_metadata()?; + let mut attrs = vec![ + ("AKAMAI_INSTANCE_ID".to_string(), data.id.to_string()), + ( + "AKAMAI_INSTANCE_HOST_UUID".to_string(), + data.host_uuid.clone(), + ), + ("AKAMAI_INSTANCE_LABEL".to_string(), data.label.clone()), + ("AKAMAI_INSTANCE_REGION".to_string(), data.region.clone()), + ("AKAMAI_INSTANCE_TYPE".to_string(), data.r#type.clone()), + ("AKAMAI_INSTANCE_TAGS".to_string(), data.tags.join(":")), + ]; + + // Network metadata. + let data = self.fetch_network_metadata()?; + + // IPv4 + for (i, addr) in data.ipv4.public.iter().enumerate() { + attrs.push((format!("AKAMAI_PUBLIC_IPV4_{i}"), addr.to_string())); + } + + for (i, addr) in data.ipv4.private.iter().enumerate() { + attrs.push((format!("AKAMAI_PRIVATE_IPV4_{i}"), addr.to_string())); + } + + for (i, addr) in data.ipv4.shared.iter().enumerate() { + attrs.push((format!("AKAMAI_SHARED_IPV4_{i}"), addr.to_string())); + } + + // IPv6 + attrs.push(("AKAMAI_IPV6_SLAAC".to_string(), data.ipv6.slaac.clone())); + attrs.push(( + "AKAMAI_IPV6_LINK_LOCAL".to_string(), + data.ipv6.link_local.clone(), + )); + for (i, v) in data.ipv6.ranges.iter().enumerate() { + attrs.push((format!("AKAMAI_IPV6_RANGE_{i}"), v.to_string())); + } + for (i, v) in data.ipv6.shared_ranges.iter().enumerate() { + attrs.push((format!("AKAMAI_IPV6_SHARED_RANGE_{i}"), v.to_string())); + } + + Ok(attrs) + } +} + +// Retrieve a token we can use to authenticate future requests to the Linode Metadata Service. +fn get_token(client: retry::Client) -> Result { + let token: String = client + .header( + HeaderName::from_static("metadata-token-expiry-seconds"), + HeaderValue::from_static(TOKEN_TTL), + ) + .put(retry::Raw, AkamaiProvider::endpoint_for("token"), None) + .dispatch_put()? + .context("get metadata token")?; + Ok(token) +} + +impl MetadataProvider for AkamaiProvider { + fn attributes(&self) -> Result> { + let attrs = self.parse_attrs()?; + Ok(attrs.into_iter().collect()) + } + + fn ssh_keys(&self) -> Result> { + Ok(self + .fetch_ssh_keys()? + .values() + .flatten() + .map(|k| PublicKey::parse(k)) + .collect::>()?) + } +} + +#[derive(Clone, Deserialize)] +struct Instance { + id: i64, + host_uuid: String, + label: String, + region: String, + r#type: String, + tags: Vec, + #[allow(dead_code)] + specs: Specs, + #[allow(dead_code)] + backups: Backups, +} + +#[allow(dead_code)] +#[derive(Clone, Deserialize)] +struct Specs { + // Total number of virtual CPU cores on the instance. + // Currently, the largest offering is 64 vCPUs on a `g6-dedicated-64` instance type. + vcpus: u8, + + // Total amount of instance memory, in MB (not MiB). + memory: u64, + + // Total amount of local disk, in MB. + // + // NOTE: This is a strange number. For example, an instance with 25GB of disk has a reported + // size of `25600`. + disk: u64, + + // The monthly network transfer limit for the instance, in GB (not GiB). + // For a 1TB monthly transfer limit, this value would be `1000`. + transfer: u64, + + // Total number of available GPUs. + gpus: u8, +} + +#[allow(dead_code)] +#[derive(Clone, Deserialize)] +struct Backups { + enabled: bool, + status: Option, // pending, running, complete +} + +#[derive(Clone, Deserialize)] +struct Network { + #[allow(dead_code)] + interfaces: Vec, + ipv4: Ipv4, + ipv6: Ipv6, +} + +#[allow(dead_code)] +#[derive(Clone, Deserialize)] +struct NetworkInterface { + id: u64, + purpose: Option, // public, vlan + label: Option, + ipam_address: Option, +} + +#[derive(Clone, Deserialize)] +struct Ipv4 { + public: Vec, + private: Vec, + shared: Vec, +} + +#[derive(Clone, Deserialize)] +struct Ipv6 { + slaac: String, // undocumented + ranges: Vec, // ??? + link_local: String, // snake_case is correct, documentation is wrong + shared_ranges: Vec, // undocumented, might be "elastic-ranges" in the doc +} + +/// Used for deserializing a JSON response from the /v1/ssh-keys endpoint. +#[derive(Clone, Deserialize)] +struct SshKeys { + // Mapping of user names, to a list of public keys. + users: HashMap>, +} diff --git a/src/providers/digitalocean/mod.rs b/src/providers/digitalocean/mod.rs index 25836967..dd817dc4 100644 --- a/src/providers/digitalocean/mod.rs +++ b/src/providers/digitalocean/mod.rs @@ -156,6 +156,7 @@ impl DigitalOceanProvider { mac_address: Some(mac), nameservers: self.dns.nameservers.clone(), ip_addresses: addrs, + dhcp: None, routes, bond: None, name: None, diff --git a/src/providers/ibmcloud_classic/mod.rs b/src/providers/ibmcloud_classic/mod.rs index 6546f08a..88c5483e 100644 --- a/src/providers/ibmcloud_classic/mod.rs +++ b/src/providers/ibmcloud_classic/mod.rs @@ -46,6 +46,7 @@ pub struct IBMClassicProvider { pub struct MetaDataJSON { /// Fully-Qualified Domain Name (FQDN). #[serde(rename = "hostname")] + #[allow(dead_code)] pub fqdn: String, /// Local hostname. #[serde(rename = "name")] @@ -54,6 +55,7 @@ pub struct MetaDataJSON { #[serde(rename = "uuid")] pub instance_id: String, /// SSH public keys. + #[allow(dead_code)] pub public_keys: HashMap, } @@ -78,9 +80,11 @@ pub struct NetLinkJSON { #[derive(Debug, Deserialize)] pub struct NetNetworkJSON { /// Unique network ID. + #[allow(dead_code)] pub id: String, /// Network type (e.g. `ipv4`) #[serde(rename = "type")] + #[allow(dead_code)] pub kind: String, /// Reference to the underlying interface (see `NetLinkJSON.id`) pub link: String, @@ -247,6 +251,7 @@ impl IBMClassicProvider { priority: 10, nameservers: nameservers.clone(), ip_addresses: vec![ip_net], + dhcp: None, routes, bond: None, unmanaged: false, diff --git a/src/providers/microsoft/goalstate.rs b/src/providers/microsoft/goalstate.rs index f657cf8b..8d1eab2b 100644 --- a/src/providers/microsoft/goalstate.rs +++ b/src/providers/microsoft/goalstate.rs @@ -14,7 +14,7 @@ pub(crate) struct GoalState { impl GoalState { /// Return the certificates endpoint (if any). pub(crate) fn certs_endpoint(&self) -> Option { - let role = match self.container.role_instance_list.role_instances.get(0) { + let role = match self.container.role_instance_list.role_instances.first() { Some(r) => r, None => return None, }; @@ -33,7 +33,7 @@ impl GoalState { .container .role_instance_list .role_instances - .get(0) + .first() .ok_or_else(|| anyhow!("empty RoleInstanceList"))? .instance_id) } diff --git a/src/providers/mod.rs b/src/providers/mod.rs index 0fb01f4a..e17d5519 100644 --- a/src/providers/mod.rs +++ b/src/providers/mod.rs @@ -23,6 +23,7 @@ //! function to fetch the metadata, and then add a match line in the top-level //! `fetch_metadata()` function in metadata.rs. +pub mod akamai; pub mod aliyun; pub mod aws; pub mod cloudstack; @@ -37,6 +38,7 @@ pub mod microsoft; pub mod openstack; pub mod packet; pub mod powervs; +pub mod proxmoxve; pub mod scaleway; pub mod vmware; pub mod vultr; diff --git a/src/providers/openstack/configdrive.rs b/src/providers/openstack/configdrive.rs index e665e499..3a633b91 100644 --- a/src/providers/openstack/configdrive.rs +++ b/src/providers/openstack/configdrive.rs @@ -40,6 +40,7 @@ pub struct MetadataOpenstackJSON { /// Instance ID. pub uuid: Option, /// Availability zone. + #[allow(dead_code)] pub availability_zone: Option, /// Local hostname. pub hostname: Option, diff --git a/src/providers/packet/mod.rs b/src/providers/packet/mod.rs index 314c6420..4a8ec351 100644 --- a/src/providers/packet/mod.rs +++ b/src/providers/packet/mod.rs @@ -216,6 +216,7 @@ impl PacketProvider { priority: 10, nameservers: Vec::new(), ip_addresses: Vec::new(), + dhcp: None, routes: Vec::new(), // the interface should be unmanaged if it doesn't have a bond // section @@ -241,6 +242,7 @@ impl PacketProvider { path: None, bond: None, ip_addresses: Vec::new(), + dhcp: None, routes: Vec::new(), unmanaged: false, required_for_online: Some("degraded-carrier".to_owned()), @@ -334,6 +336,7 @@ impl PacketProvider { bond: None, nameservers: Vec::new(), ip_addresses: Vec::new(), + dhcp: None, routes: Vec::new(), required_for_online: None, }; diff --git a/src/providers/powervs/mod.rs b/src/providers/powervs/mod.rs index 49e84a9a..674a6ed5 100644 --- a/src/providers/powervs/mod.rs +++ b/src/providers/powervs/mod.rs @@ -44,6 +44,7 @@ pub struct PowerVSProvider { pub struct MetaDataJSON { /// Fully-Qualified Domain Name (FQDN). #[serde(rename = "hostname")] + #[allow(dead_code)] pub fqdn: String, /// Local hostname. #[serde(rename = "name")] diff --git a/src/providers/proxmoxve/cloudconfig.rs b/src/providers/proxmoxve/cloudconfig.rs new file mode 100644 index 00000000..6be26763 --- /dev/null +++ b/src/providers/proxmoxve/cloudconfig.rs @@ -0,0 +1,275 @@ +use crate::{ + network::{self, DhcpSetting, NetworkRoute}, + providers::MetadataProvider, +}; +use anyhow::Result; +use ipnetwork::IpNetwork; +use openssh_keys::PublicKey; +use pnet_base::MacAddr; +use serde::Deserialize; +use slog_scope::warn; +use std::{ + collections::HashMap, + fs::File, + net::{AddrParseError, IpAddr}, + path::Path, + str::FromStr, +}; + +#[derive(Debug)] +pub struct ProxmoxVECloudConfig { + pub meta_data: ProxmoxVECloudMetaData, + pub user_data: Option, + pub vendor_data: ProxmoxVECloudVendorData, + pub network_config: ProxmoxVECloudNetworkConfig, +} + +#[derive(Debug, Deserialize)] +pub struct ProxmoxVECloudMetaData { + #[serde(rename = "instance-id")] + pub instance_id: String, +} + +#[derive(Debug, Deserialize)] +pub struct ProxmoxVECloudUserData { + pub hostname: String, + pub manage_etc_hosts: bool, + pub fqdn: String, + pub chpasswd: ProxmoxVECloudChpasswdConfig, + pub users: Vec, + pub package_upgrade: bool, + #[serde(default)] + pub ssh_authorized_keys: Vec, +} + +#[derive(Debug, Deserialize)] +pub struct ProxmoxVECloudChpasswdConfig { + pub expire: bool, +} + +#[derive(Debug, Deserialize)] +pub struct ProxmoxVECloudVendorData {} + +#[derive(Debug, Deserialize)] +pub struct ProxmoxVECloudNetworkConfig { + pub version: u32, + pub config: Vec, +} + +#[derive(Debug, Deserialize)] +pub struct ProxmoxVECloudNetworkConfigEntry { + #[serde(rename = "type")] + pub network_type: String, + pub name: Option, + pub mac_address: Option, + #[serde(default)] + pub address: Vec, + #[serde(default)] + pub search: Vec, + #[serde(default)] + pub subnets: Vec, +} + +#[derive(Debug, Deserialize)] +pub struct ProxmoxVECloudNetworkConfigSubnet { + #[serde(rename = "type")] + pub subnet_type: String, + pub address: Option, + pub netmask: Option, + pub gateway: Option, +} + +impl ProxmoxVECloudConfig { + pub fn try_new(path: &Path) -> Result { + let mut user_data = None; + let raw_user_data = std::fs::read_to_string(path.join("user-data"))?; + + if let Some(first_line) = raw_user_data.split('\n').next() { + if first_line.starts_with("#cloud-config") { + user_data = serde_yaml::from_str(&raw_user_data)?; + } + } + + if user_data.is_none() { + warn!( + "user-data does not have the expected header `#cloud-config`, ignoring this file" + ); + } + + Ok(Self { + user_data, + meta_data: serde_yaml::from_reader(File::open(path.join("meta-data"))?)?, + vendor_data: serde_yaml::from_reader(File::open(path.join("vendor-data"))?)?, + network_config: serde_yaml::from_reader(File::open(path.join("network-config"))?)?, + }) + } +} + +impl MetadataProvider for ProxmoxVECloudConfig { + fn attributes(&self) -> Result> { + let mut out = HashMap::new(); + + out.insert( + "PROXMOXVE_INSTANCE_ID".to_owned(), + self.meta_data.instance_id.clone(), + ); + + if let Some(hostname) = self.hostname()? { + out.insert("PROXMOXVE_HOSTNAME".to_owned(), hostname); + } + + if let Some(first_interface) = self.networks()?.first() { + first_interface.ip_addresses.iter().for_each(|ip| match ip { + IpNetwork::V4(network) => { + out.insert("PROXMOXVE_IPV4".to_owned(), network.ip().to_string()); + } + IpNetwork::V6(network) => { + out.insert("PROXMOXVE_IPV6".to_owned(), network.ip().to_string()); + } + }); + } + + Ok(out) + } + + fn hostname(&self) -> Result> { + Ok(self + .user_data + .as_ref() + .map(|user_data| user_data.hostname.clone())) + } + + fn ssh_keys(&self) -> Result> { + if let Some(user_data) = &self.user_data { + return Ok(user_data + .ssh_authorized_keys + .iter() + .map(|key| PublicKey::from_str(key)) + .collect::, _>>()?); + } + + Ok(vec![]) + } + + fn networks(&self) -> Result> { + let nameservers = self + .network_config + .config + .iter() + .filter(|config| config.network_type == "nameserver") + .collect::>(); + + if nameservers.len() > 1 { + return Err(anyhow::anyhow!("too many nameservers, only one supported")); + } + + let mut interfaces = self + .network_config + .config + .iter() + .filter(|config| config.network_type == "physical") + .map(|entry| entry.to_interface()) + .collect::, _>>()?; + + if let Some(iface) = interfaces.first_mut() { + if let Some(nameserver) = nameservers.first() { + iface.nameservers = nameserver + .address + .iter() + .map(|ip| IpAddr::from_str(ip)) + .collect::, AddrParseError>>()?; + } + } + + Ok(interfaces) + } +} + +impl ProxmoxVECloudNetworkConfigEntry { + pub fn to_interface(&self) -> Result { + if self.network_type != "physical" { + return Err(anyhow::anyhow!( + "cannot convert config to interface: unsupported config type \"{}\"", + self.network_type + )); + } + + let mut iface = network::Interface { + name: self.name.clone(), + + // filled later + nameservers: vec![], + // filled below + ip_addresses: vec![], + // filled below + routes: vec![], + // filled below + dhcp: None, + // filled below because Option::try_map doesn't exist yet + mac_address: None, + + // unsupported by proxmox ve + bond: None, + + // default values + path: None, + priority: 20, + unmanaged: false, + required_for_online: None, + }; + + for subnet in &self.subnets { + if subnet.subnet_type.contains("static") { + if subnet.address.is_none() { + return Err(anyhow::anyhow!( + "cannot convert static subnet to interface: missing address" + )); + } + + if let Some(netmask) = &subnet.netmask { + iface.ip_addresses.push(IpNetwork::with_netmask( + IpAddr::from_str(subnet.address.as_ref().unwrap())?, + IpAddr::from_str(netmask)?, + )?); + } else { + iface + .ip_addresses + .push(IpNetwork::from_str(subnet.address.as_ref().unwrap())?); + } + + if let Some(gateway) = &subnet.gateway { + let gateway = IpAddr::from_str(gateway)?; + + let destination = if gateway.is_ipv6() { + IpNetwork::from_str("::/0")? + } else { + IpNetwork::from_str("0.0.0.0/0")? + }; + + iface.routes.push(NetworkRoute { + destination, + gateway, + }); + } else { + warn!("found subnet type \"static\" without gateway"); + } + } + + if subnet.subnet_type == "dhcp" || subnet.subnet_type == "dhcp4" { + iface.dhcp = Some(DhcpSetting::V4) + } + if subnet.subnet_type == "dhcp6" { + iface.dhcp = Some(DhcpSetting::V6) + } + if subnet.subnet_type == "ipv6_slaac" { + warn!("subnet type \"ipv6_slaac\" not supported, ignoring"); + } + } + + if let Some(mac) = &self.mac_address { + iface.mac_address = Some(MacAddr::from_str(mac)?); + } + + Ok(iface) + } +} diff --git a/src/providers/proxmoxve/configdrive.rs b/src/providers/proxmoxve/configdrive.rs new file mode 100644 index 00000000..4b31a76d --- /dev/null +++ b/src/providers/proxmoxve/configdrive.rs @@ -0,0 +1,63 @@ +use super::ProxmoxVECloudConfig; +use crate::{network, providers::MetadataProvider}; +use anyhow::{Context, Result}; +use openssh_keys::PublicKey; +use slog_scope::error; +use std::{collections::HashMap, path::Path}; +use tempfile::TempDir; + +const CONFIG_DRIVE_LABEL: &str = "cidata"; +const TARGET_FS: &str = "iso9660"; + +#[derive(Debug)] +pub struct ProxmoxVEConfigDrive { + mount_dir: TempDir, + config: ProxmoxVECloudConfig, +} + +impl ProxmoxVEConfigDrive { + pub fn try_new() -> Result { + let mount_dir = tempfile::Builder::new() + .prefix("afterburn-") + .tempdir() + .context("failed to create temporary directory")?; + + crate::util::mount_ro( + &Path::new("/dev/disk/by-label/").join(CONFIG_DRIVE_LABEL), + mount_dir.path(), + TARGET_FS, + 3, + )?; + + Ok(Self { + config: ProxmoxVECloudConfig::try_new(mount_dir.path())?, + mount_dir, + }) + } +} + +impl MetadataProvider for ProxmoxVEConfigDrive { + fn attributes(&self) -> Result> { + self.config.attributes() + } + + fn hostname(&self) -> Result> { + self.config.hostname() + } + + fn ssh_keys(&self) -> Result> { + self.config.ssh_keys() + } + + fn networks(&self) -> Result> { + self.config.networks() + } +} + +impl Drop for ProxmoxVEConfigDrive { + fn drop(&mut self) { + if let Err(e) = crate::util::unmount(self.mount_dir.path(), 3) { + error!("failed to cleanup Proxmox VE config-drive: {:?}", e); + }; + } +} diff --git a/src/providers/proxmoxve/mod.rs b/src/providers/proxmoxve/mod.rs new file mode 100644 index 00000000..14146b0e --- /dev/null +++ b/src/providers/proxmoxve/mod.rs @@ -0,0 +1,22 @@ +// Copyright 2017 CoreOS, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +mod configdrive; +pub use configdrive::*; + +mod cloudconfig; +pub use cloudconfig::*; + +#[cfg(test)] +mod tests; diff --git a/src/providers/proxmoxve/tests.rs b/src/providers/proxmoxve/tests.rs new file mode 100644 index 00000000..b4b764e3 --- /dev/null +++ b/src/providers/proxmoxve/tests.rs @@ -0,0 +1,156 @@ +use super::ProxmoxVECloudConfig; +use crate::{ + network::{self, DhcpSetting, NetworkRoute}, + providers::MetadataProvider, +}; +use ipnetwork::IpNetwork; +use openssh_keys::PublicKey; +use pnet_base::MacAddr; +use std::{net::IpAddr, path::Path, str::FromStr}; + +#[test] +fn test_attributes() { + let config = ProxmoxVECloudConfig::try_new(Path::new("tests/fixtures/proxmoxve/static")) + .expect("cannot parse config"); + let attributes = config.attributes().expect("cannot get hostname"); + + assert_eq!(attributes["PROXMOXVE_HOSTNAME"], "dummy".to_string()); + + assert_eq!( + attributes["PROXMOXVE_INSTANCE_ID"], + "15a9919cb91024fbd1d70fa07f0efa749cbba03b".to_string() + ); + + assert_eq!(attributes["PROXMOXVE_IPV4"], "192.168.1.1".to_string()); + + assert_eq!( + attributes["PROXMOXVE_IPV6"], + "2001:db8:85a3::8a2e:370:0".to_string() + ); +} + +#[test] +fn test_hostname() { + let config = ProxmoxVECloudConfig::try_new(Path::new("tests/fixtures/proxmoxve/dhcp")) + .expect("cannot parse config"); + + assert_eq!( + config.hostname().expect("cannot get hostname"), + Some("dummy".to_string()) + ); +} + +#[test] +fn test_ssh_keys() { + let test_ssh_key = PublicKey::from_str("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDd1hElre4j44sbmULXyO5j6dRnkRFCMjEGtRSy2SuvFD8WyB5uectcEMvz7ORhQIVbPlz94wFjpSX5wl/gmSKL/7GOyerJo0Y2cvyjJJahuDn+JnIL0tT0HS1pJ5iJqQpxXeOAzMK5Heum+uGw9BzbiUHnRzjJr8Ltx4CAGMfubevD4SX32Q8BTQiaU4ZnGtdHo16pWwRsq1f6/UtL4gDCni9vm8QmmGDRloi/pBn1csjKw+volFyu/kSEmGLWow6NuT6TrhGAbMKas5HfYq0Mn3LGPZL7XjqJQ6CO0TzkG/BNplZT2tiwHtsvXsbePTp4ZUi4dkCMz2xR4eikaI1V dummy@dummy.local").unwrap(); + let config = ProxmoxVECloudConfig::try_new(Path::new("tests/fixtures/proxmoxve/dhcp")) + .expect("cannot parse config"); + + assert_eq!( + config.ssh_keys().expect("cannot get ssh keys"), + vec![test_ssh_key] + ); +} + +#[test] +fn test_network_dhcp() { + let config = ProxmoxVECloudConfig::try_new(Path::new("tests/fixtures/proxmoxve/dhcp")) + .expect("cannot parse config"); + + assert_eq!( + config.networks().expect("cannot get networks"), + vec![network::Interface { + name: Some("eth0".to_owned()), + mac_address: Some(MacAddr::from_str("01:23:45:67:89:00").unwrap()), + path: None, + priority: 20, + dhcp: Some(DhcpSetting::V4), + nameservers: vec![ + IpAddr::from_str("1.1.1.1").unwrap(), + IpAddr::from_str("8.8.8.8").unwrap() + ], + ip_addresses: vec![], + routes: vec![], + bond: None, + unmanaged: false, + required_for_online: None + }] + ); +} + +#[test] +fn test_network_static() { + let config = ProxmoxVECloudConfig::try_new(Path::new("tests/fixtures/proxmoxve/static")) + .expect("cannot parse config"); + + assert_eq!( + config.networks().expect("cannot get networks"), + vec![ + network::Interface { + name: Some("eth0".to_owned()), + mac_address: Some(MacAddr::from_str("01:23:45:67:89:00").unwrap()), + path: None, + priority: 20, + nameservers: vec![ + IpAddr::from_str("1.1.1.1").unwrap(), + IpAddr::from_str("8.8.8.8").unwrap() + ], + ip_addresses: vec![ + IpNetwork::from_str("192.168.1.1/24").unwrap(), + IpNetwork::from_str("2001:0db8:85a3:0000:0000:8a2e:0370:0/24").unwrap(), + ], + dhcp: None, + routes: vec![ + NetworkRoute { + destination: IpNetwork::from_str("0.0.0.0/0").unwrap(), + gateway: IpAddr::from_str("192.168.1.254").unwrap(), + }, + NetworkRoute { + destination: IpNetwork::from_str("::/0").unwrap(), + gateway: IpAddr::from_str("2001:0db8:85a3:0000:0000:8a2e:0370:9999") + .unwrap(), + }, + ], + bond: None, + unmanaged: false, + required_for_online: None + }, + network::Interface { + name: Some("eth1".to_owned()), + mac_address: Some(MacAddr::from_str("01:23:45:67:89:99").unwrap()), + path: None, + priority: 20, + nameservers: vec![], + ip_addresses: vec![ + IpNetwork::from_str("192.168.42.1/24").unwrap(), + IpNetwork::from_str("2001:0db8:85a3:0000:0000:8a2e:4242:0/24").unwrap(), + ], + dhcp: None, + routes: vec![ + NetworkRoute { + destination: IpNetwork::from_str("0.0.0.0/0").unwrap(), + gateway: IpAddr::from_str("192.168.42.254").unwrap(), + }, + NetworkRoute { + destination: IpNetwork::from_str("::/0").unwrap(), + gateway: IpAddr::from_str("2001:0db8:85a3:0000:0000:8a2e:4242:9999") + .unwrap(), + }, + ], + bond: None, + unmanaged: false, + required_for_online: None + }, + ] + ); +} + +#[test] +fn test_invalid_user_data() { + let config = + ProxmoxVECloudConfig::try_new(Path::new("tests/fixtures/proxmoxve/invalid-user-data")) + .expect("cannot parse config"); + + assert!(config.hostname().unwrap().is_none()); + assert_eq!(config.ssh_keys().unwrap(), vec![]); +} diff --git a/src/providers/vmware/unsupported.rs b/src/providers/vmware/unsupported.rs index 99dace52..5b592e32 100644 --- a/src/providers/vmware/unsupported.rs +++ b/src/providers/vmware/unsupported.rs @@ -7,4 +7,8 @@ impl VmwareProvider { pub fn try_new() -> Result { bail!("unsupported architecture"); } + + pub fn parse_netplan_config(&self) -> Result> { + bail!("unsupported architecture"); + } } diff --git a/systemd/afterburn-sshkeys@.service.in b/systemd/afterburn-sshkeys@.service.in index 9e889fb9..911a57e6 100644 --- a/systemd/afterburn-sshkeys@.service.in +++ b/systemd/afterburn-sshkeys@.service.in @@ -5,6 +5,7 @@ Description=Afterburn (SSH Keys) # (e.g. via optional platform components); those platforms need a user-provided # dropin, adding an appropriate triggering condition and setting the value of # `AFTERBURN_OPT_PROVIDER` as needed. +ConditionKernelCommandLine=|ignition.platform.id=akamai ConditionKernelCommandLine=|ignition.platform.id=aliyun ConditionKernelCommandLine=|ignition.platform.id=aws ConditionKernelCommandLine=|ignition.platform.id=azure @@ -15,6 +16,7 @@ ConditionKernelCommandLine=|ignition.platform.id=gcp ConditionKernelCommandLine=|ignition.platform.id=hetzner ConditionKernelCommandLine=|ignition.platform.id=ibmcloud ConditionKernelCommandLine=|ignition.platform.id=openstack +ConditionKernelCommandLine=|ignition.platform.id=proxmoxve ConditionKernelCommandLine=|ignition.platform.id=scaleway ConditionKernelCommandLine=|ignition.platform.id=packet ConditionKernelCommandLine=|ignition.platform.id=powervs diff --git a/tests/fixtures/proxmoxve/dhcp/meta-data b/tests/fixtures/proxmoxve/dhcp/meta-data new file mode 100644 index 00000000..bd5926b3 --- /dev/null +++ b/tests/fixtures/proxmoxve/dhcp/meta-data @@ -0,0 +1 @@ +instance-id: 15a9919cb91024fbd1d70fa07f0efa749cbba03b diff --git a/tests/fixtures/proxmoxve/dhcp/network-config b/tests/fixtures/proxmoxve/dhcp/network-config new file mode 100644 index 00000000..4031d025 --- /dev/null +++ b/tests/fixtures/proxmoxve/dhcp/network-config @@ -0,0 +1,13 @@ +version: 1 +config: + - type: physical + name: eth0 + mac_address: '01:23:45:67:89:00' + subnets: + - type: dhcp4 + - type: nameserver + address: + - '1.1.1.1' + - '8.8.8.8' + search: + - 'local.com' diff --git a/tests/fixtures/proxmoxve/dhcp/user-data b/tests/fixtures/proxmoxve/dhcp/user-data new file mode 100644 index 00000000..e62a3e6a --- /dev/null +++ b/tests/fixtures/proxmoxve/dhcp/user-data @@ -0,0 +1,13 @@ +#cloud-config +hostname: dummy +manage_etc_hosts: true +fqdn: dummy.local.com +user: dummy-user +password: $5$6LDowW6p$.RyFu8lVH7Cw3AB.pPS/K2lmB8IczVs99A7gbcUCLV2 +ssh_authorized_keys: + - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDd1hElre4j44sbmULXyO5j6dRnkRFCMjEGtRSy2SuvFD8WyB5uectcEMvz7ORhQIVbPlz94wFjpSX5wl/gmSKL/7GOyerJo0Y2cvyjJJahuDn+JnIL0tT0HS1pJ5iJqQpxXeOAzMK5Heum+uGw9BzbiUHnRzjJr8Ltx4CAGMfubevD4SX32Q8BTQiaU4ZnGtdHo16pWwRsq1f6/UtL4gDCni9vm8QmmGDRloi/pBn1csjKw+volFyu/kSEmGLWow6NuT6TrhGAbMKas5HfYq0Mn3LGPZL7XjqJQ6CO0TzkG/BNplZT2tiwHtsvXsbePTp4ZUi4dkCMz2xR4eikaI1V dummy@dummy.local +chpasswd: + expire: False +users: + - default +package_upgrade: true diff --git a/tests/fixtures/proxmoxve/dhcp/vendor-data b/tests/fixtures/proxmoxve/dhcp/vendor-data new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/proxmoxve/invalid-user-data/meta-data b/tests/fixtures/proxmoxve/invalid-user-data/meta-data new file mode 100644 index 00000000..bd5926b3 --- /dev/null +++ b/tests/fixtures/proxmoxve/invalid-user-data/meta-data @@ -0,0 +1 @@ +instance-id: 15a9919cb91024fbd1d70fa07f0efa749cbba03b diff --git a/tests/fixtures/proxmoxve/invalid-user-data/network-config b/tests/fixtures/proxmoxve/invalid-user-data/network-config new file mode 100644 index 00000000..e708ca1d --- /dev/null +++ b/tests/fixtures/proxmoxve/invalid-user-data/network-config @@ -0,0 +1,30 @@ +version: 1 +config: + - type: physical + name: eth0 + mac_address: '01:23:45:67:89:00' + subnets: + - type: static + address: '192.168.1.1' + netmask: '255.255.255.0' + gateway: '192.168.1.254' + - type: static6 + address: '2001:0db8:85a3:0000:0000:8a2e:0370:0/24' + gateway: '2001:0db8:85a3:0000:0000:8a2e:0370:9999' + - type: physical + name: eth1 + mac_address: '01:23:45:67:89:99' + subnets: + - type: static + address: '192.168.42.1' + netmask: '255.255.255.0' + gateway: '192.168.42.254' + - type: static6 + address: '2001:0db8:85a3:0000:0000:8a2e:4242:0/24' + gateway: '2001:0db8:85a3:0000:0000:8a2e:4242:9999' + - type: nameserver + address: + - '1.1.1.1' + - '8.8.8.8' + search: + - 'local.com' diff --git a/tests/fixtures/proxmoxve/invalid-user-data/user-data b/tests/fixtures/proxmoxve/invalid-user-data/user-data new file mode 100644 index 00000000..c1baeda3 --- /dev/null +++ b/tests/fixtures/proxmoxve/invalid-user-data/user-data @@ -0,0 +1,5 @@ +{ + "some": { + "ignition": "config" + } +} diff --git a/tests/fixtures/proxmoxve/invalid-user-data/vendor-data b/tests/fixtures/proxmoxve/invalid-user-data/vendor-data new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/proxmoxve/static/meta-data b/tests/fixtures/proxmoxve/static/meta-data new file mode 100644 index 00000000..bd5926b3 --- /dev/null +++ b/tests/fixtures/proxmoxve/static/meta-data @@ -0,0 +1 @@ +instance-id: 15a9919cb91024fbd1d70fa07f0efa749cbba03b diff --git a/tests/fixtures/proxmoxve/static/network-config b/tests/fixtures/proxmoxve/static/network-config new file mode 100644 index 00000000..e708ca1d --- /dev/null +++ b/tests/fixtures/proxmoxve/static/network-config @@ -0,0 +1,30 @@ +version: 1 +config: + - type: physical + name: eth0 + mac_address: '01:23:45:67:89:00' + subnets: + - type: static + address: '192.168.1.1' + netmask: '255.255.255.0' + gateway: '192.168.1.254' + - type: static6 + address: '2001:0db8:85a3:0000:0000:8a2e:0370:0/24' + gateway: '2001:0db8:85a3:0000:0000:8a2e:0370:9999' + - type: physical + name: eth1 + mac_address: '01:23:45:67:89:99' + subnets: + - type: static + address: '192.168.42.1' + netmask: '255.255.255.0' + gateway: '192.168.42.254' + - type: static6 + address: '2001:0db8:85a3:0000:0000:8a2e:4242:0/24' + gateway: '2001:0db8:85a3:0000:0000:8a2e:4242:9999' + - type: nameserver + address: + - '1.1.1.1' + - '8.8.8.8' + search: + - 'local.com' diff --git a/tests/fixtures/proxmoxve/static/user-data b/tests/fixtures/proxmoxve/static/user-data new file mode 100644 index 00000000..e62a3e6a --- /dev/null +++ b/tests/fixtures/proxmoxve/static/user-data @@ -0,0 +1,13 @@ +#cloud-config +hostname: dummy +manage_etc_hosts: true +fqdn: dummy.local.com +user: dummy-user +password: $5$6LDowW6p$.RyFu8lVH7Cw3AB.pPS/K2lmB8IczVs99A7gbcUCLV2 +ssh_authorized_keys: + - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDd1hElre4j44sbmULXyO5j6dRnkRFCMjEGtRSy2SuvFD8WyB5uectcEMvz7ORhQIVbPlz94wFjpSX5wl/gmSKL/7GOyerJo0Y2cvyjJJahuDn+JnIL0tT0HS1pJ5iJqQpxXeOAzMK5Heum+uGw9BzbiUHnRzjJr8Ltx4CAGMfubevD4SX32Q8BTQiaU4ZnGtdHo16pWwRsq1f6/UtL4gDCni9vm8QmmGDRloi/pBn1csjKw+volFyu/kSEmGLWow6NuT6TrhGAbMKas5HfYq0Mn3LGPZL7XjqJQ6CO0TzkG/BNplZT2tiwHtsvXsbePTp4ZUi4dkCMz2xR4eikaI1V dummy@dummy.local +chpasswd: + expire: False +users: + - default +package_upgrade: true diff --git a/tests/fixtures/proxmoxve/static/vendor-data b/tests/fixtures/proxmoxve/static/vendor-data new file mode 100644 index 00000000..e69de29b