From adc97033eeafd11e52181b87ac0b2f8bd8c2d8a6 Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Thu, 18 Apr 2024 21:48:00 +0200 Subject: [PATCH 01/21] Create rust library, supporting querying via access token --- rust/.gitignore | 1 + rust/Cargo.lock | 1502 +++++++++++++++++++++++++++++++++++++ rust/Cargo.toml | 18 + rust/README.md | 13 + rust/examples/adminapi.rs | 26 + rust/src/api.rs | 75 ++ rust/src/config.rs | 20 + rust/src/filter.rs | 123 +++ rust/src/lib.rs | 6 + rust/src/query.rs | 67 ++ 10 files changed, 1851 insertions(+) create mode 100644 rust/.gitignore create mode 100644 rust/Cargo.lock create mode 100644 rust/Cargo.toml create mode 100644 rust/README.md create mode 100644 rust/examples/adminapi.rs create mode 100644 rust/src/api.rs create mode 100644 rust/src/config.rs create mode 100644 rust/src/filter.rs create mode 100644 rust/src/lib.rs create mode 100644 rust/src/query.rs diff --git a/rust/.gitignore b/rust/.gitignore new file mode 100644 index 00000000..1de56593 --- /dev/null +++ b/rust/.gitignore @@ -0,0 +1 @@ +target \ No newline at end of file diff --git a/rust/Cargo.lock b/rust/Cargo.lock new file mode 100644 index 00000000..bf9cc336 --- /dev/null +++ b/rust/Cargo.lock @@ -0,0 +1,1502 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "adminapi" +version = "0.1.0" +dependencies = [ + "anyhow", + "env_logger", + "hmac", + "log", + "reqwest", + "serde", + "serde_json", + "sha1", + "tokio", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" + +[[package]] +name = "autocfg" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" + +[[package]] +name = "backtrace" +version = "0.3.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + +[[package]] +name = "cc" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "env_filter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fastrand" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "h2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[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", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower", + "tower-service", + "tracing", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.5.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "percent-encoding" +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", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "proc-macro2" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "reqwest" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e6cc1e89e689536eb5aeede61520e874df5a4707df811cd5da4aa5fbb2aae19" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustix" +version = "0.38.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.116" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "syn" +version = "2.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[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.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[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", + "tracing", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "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]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "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]] +name = "windows_aarch64_gnullvm" +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 = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] diff --git a/rust/Cargo.toml b/rust/Cargo.toml new file mode 100644 index 00000000..1f4391cf --- /dev/null +++ b/rust/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "adminapi" +version = "0.1.0" +edition = "2021" +description = "The ServerAdmin API available in Rust" + +[dependencies] +anyhow = "1.0.82" +hmac = "0.12.1" +log = "0.4.21" +reqwest = { version = "0.12.3", features = ["json"] } +serde = { version = "1.0.198", features = ["derive"] } +serde_json = "1.0.116" +sha1 = "0.10.6" + +[dev-dependencies] +env_logger = "0.11.3" +tokio = { version = "1.37.0", features = ["full"] } diff --git a/rust/README.md b/rust/README.md new file mode 100644 index 00000000..21ac4bc4 --- /dev/null +++ b/rust/README.md @@ -0,0 +1,13 @@ +# Adminapi in Rust! + +This is the adminapi Rust library + +## Features + +| Feature | Status | Note | +|--------------|-----------------|-----------------------------------------------------------------------------------------------------------------| +| Querying | Implemented | Querying works by either a generic `serde_json::Value`, or with a `serde` supported type. | +| Creating | Not implemented | | +| *other* APIs | Not implemented | The adminapi supports other APIs such as the "firewall" api. The support for those is currently not implemented | +| Token Auth | Implemented | | +| SSH Auth | Not implemented | | diff --git a/rust/examples/adminapi.rs b/rust/examples/adminapi.rs new file mode 100644 index 00000000..781a9ca2 --- /dev/null +++ b/rust/examples/adminapi.rs @@ -0,0 +1,26 @@ +use adminapi::filter::*; +use adminapi::query::Query; + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + env_logger::init(); + + let query = Query::builder().filter("hostname", regexp(".*payment-staging.*")) + .filter("os", not(empty())) + .restrict(["hostname", "responsible_admin", "os"]).build(); + + #[derive(Clone, Debug, serde::Deserialize)] + struct MyServer { + hostname: String, + os: String, + responsible_admin: Vec, + } + + let servers = query.request_typed::().await?; + + for server in servers.into_iter() { + println!("{server:#?}"); + } + + Ok(()) +} diff --git a/rust/src/api.rs b/rust/src/api.rs new file mode 100644 index 00000000..2aedeed4 --- /dev/null +++ b/rust/src/api.rs @@ -0,0 +1,75 @@ +use std::fmt::Display; + +use crate::config::Config; +use crate::query::Query; + +pub type ServerObject = serde_json::Value; + +pub const QUERY_ENDPOINT: &str = "dataset/query"; + +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] +pub struct QueryResponse { + status: String, + result: Vec>, +} + +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] +pub struct Server { + object_id: u64, + #[serde(flatten)] + attributes: T +} + +pub async fn query_objects(query: &Query) -> anyhow::Result> { + let config = Config::build_from_environment()?; + let response = request_api(QUERY_ENDPOINT, serde_json::to_value(query)?, config).await?; + let response = response.error_for_status()?; + + Ok(response.json().await?) +} + +pub async fn request_api(endpoint: impl Display, data: serde_json::Value, config: Config) -> anyhow::Result { + let client = reqwest::Client::new(); + let token = config.auth_token.unwrap_or_default(); + let body = serde_json::to_string(&data)?; + let now = std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH)?.as_secs(); + let url = format!("{}/{endpoint}", config.base_url); + let request = client.post(url) + .header("Content-Type", "application/json") + .header("X-Timestamp", now.to_string()) + .header("X-API-Version", config.api_version) + .header("X-SecurityToken", calculate_security_token(&token, now, &body)) + .header("X-Application", calculate_app_id(&token)) + .body(body.into_bytes()); + + Ok(request.send().await?) +} + +impl IntoIterator for QueryResponse { + type Item = Server; + type IntoIter = std::vec::IntoIter>; + + fn into_iter(self) -> Self::IntoIter { + self.result.into_iter() + } +} + +fn calculate_security_token(token: &String, now: u64, body: &str) -> String { + use hmac::Mac; + + type HmacSha1 = hmac::Hmac; + let mut hmac = HmacSha1::new_from_slice(token.as_bytes()).expect("Hmac can accept any size of key"); + hmac.update(format!("{now}:{body}").as_bytes()); + let result = hmac.finalize(); + + result.into_bytes().iter().map(|byte| format!("{:02x}", byte)).collect::() +} + +fn calculate_app_id(token: &String) -> String { + use sha1::Digest; + let mut hasher = sha1::Sha1::new(); + hasher.update(token.as_bytes()); + let result = hasher.finalize(); + + result.iter().map(|byte| format!("{:02x}", byte)).collect::() +} diff --git a/rust/src/config.rs b/rust/src/config.rs new file mode 100644 index 00000000..5bc74169 --- /dev/null +++ b/rust/src/config.rs @@ -0,0 +1,20 @@ +use crate::API_VERSION; + +#[derive(Clone, Debug, Default)] +pub struct Config { + pub base_url: String, + pub api_version: String, + pub ssh_signer: Option<()>, + pub auth_token: Option, +} + +impl Config { + pub fn build_from_environment() -> anyhow::Result { + Ok(Self { + base_url: std::env::var("SERVERADMIN_BASE_URL")?, + api_version: API_VERSION.to_string(), + ssh_signer: None, + auth_token: std::env::var("SERVERADMIN_TOKEN").ok(), + }) + } +} diff --git a/rust/src/filter.rs b/rust/src/filter.rs new file mode 100644 index 00000000..a37d3df6 --- /dev/null +++ b/rust/src/filter.rs @@ -0,0 +1,123 @@ +use std::collections::HashMap; + +pub type FilterValue = serde_json::Value; + +pub type AttributeFilter = HashMap; + +pub trait IntoFilterValue { + fn into_filter_value(self) -> FilterValue; +} + +/// ServerAdmin All Filter +pub fn all(value: impl IntoFilterValue + 'static) -> FilterValue { + create_filter("All", value) +} + +/// ServerAdmin Any Filter +pub fn any(value: impl IntoFilterValue + 'static) -> FilterValue { + create_filter("Any", value) +} + +/// ServerAdmin ContainedBy Filter +pub fn contained_by(value: impl IntoFilterValue + 'static) -> FilterValue { + create_filter("ContainedBy", value) +} + +/// ServerAdmin ContainedOnlyBy Filter +pub fn contained_only_by(value: impl IntoFilterValue + 'static) -> FilterValue { + create_filter("ContainedOnlyBy", value) +} + +/// ServerAdmin Contains Filter +pub fn contains(value: impl IntoFilterValue + 'static) -> FilterValue { + create_filter("Contains", value) +} + +/// ServerAdmin Empty Filter +pub fn empty() -> FilterValue { + create_filter("Empty", ()) +} + +/// ServerAdmin GreaterThan Filter +pub fn greater_than(value: impl IntoFilterValue + 'static) -> FilterValue { + create_filter("GreaterThan", value) +} + +/// ServerAdmin GreaterThanOrEquals Filter +pub fn greater_than_or_equals(value: impl IntoFilterValue + 'static) -> FilterValue { + create_filter("GreaterThanOrEquals", value) +} + +/// ServerAdmin LessThan Filter +pub fn less_than(value: impl IntoFilterValue + 'static) -> FilterValue { + create_filter("LessThan", value) +} + +/// ServerAdmin LessThanOrEquals Filter +pub fn less_than_or_equals(value: impl IntoFilterValue + 'static) -> FilterValue { + create_filter("LessThanOrEquals", value) +} + +/// ServerAdmin Not Filter +pub fn not(value: impl IntoFilterValue + 'static) -> FilterValue { + create_filter("Not", value) +} + +/// ServerAdmin Overlaps Filter +pub fn overlaps(value: impl IntoFilterValue + 'static) -> FilterValue { + create_filter("Overlaps", value) +} + +/// ServerAdmin Regexp Filter +pub fn regexp(value: impl IntoFilterValue + 'static) -> FilterValue { + create_filter("Regexp", value) +} + +/// ServerAdmin StartsWith Filter +pub fn starts_with(value: impl IntoFilterValue + 'static) -> FilterValue { + create_filter("StartsWith", value) +} + +impl IntoFilterValue for () { + fn into_filter_value(self) -> FilterValue { + FilterValue::Null + } +} + +impl IntoFilterValue for String { + fn into_filter_value(self) -> FilterValue { + FilterValue::String(self) + } +} + +impl IntoFilterValue for &str { + fn into_filter_value(self) -> FilterValue { + FilterValue::String(self.to_string()) + } +} + +impl IntoFilterValue for i32 { + fn into_filter_value(self) -> FilterValue { + FilterValue::from(self) + } +} + +impl IntoFilterValue for Vec { + fn into_filter_value(self) -> FilterValue { + FilterValue::from_iter(self.into_iter().map(IntoFilterValue::into_filter_value)) + } +} + +impl IntoFilterValue for serde_json::Value { + fn into_filter_value(self) -> FilterValue { + self + } +} + +/// Filters on an attribute +fn create_filter(filter_name: impl ToString, value: impl IntoFilterValue + 'static) -> FilterValue { + let mut filter = HashMap::new(); + filter.insert(filter_name.to_string(), value.into_filter_value()); + + FilterValue::from_iter(filter) +} diff --git a/rust/src/lib.rs b/rust/src/lib.rs new file mode 100644 index 00000000..b94f386c --- /dev/null +++ b/rust/src/lib.rs @@ -0,0 +1,6 @@ +pub const API_VERSION: &str = "4.9.0"; + +pub mod api; +pub mod filter; +pub mod query; +pub mod config; diff --git a/rust/src/query.rs b/rust/src/query.rs new file mode 100644 index 00000000..9e93a27e --- /dev/null +++ b/rust/src/query.rs @@ -0,0 +1,67 @@ +use std::collections::HashSet; + +use crate::api::{query_objects, QueryResponse}; +use crate::filter::{AttributeFilter, IntoFilterValue}; + +#[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)] +pub struct Query { + pub filters: AttributeFilter, + pub restrict: HashSet, + #[serde(skip_serializing_if = "Option::is_none")] + pub order_by: Option, +} + +#[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)] +pub struct QueryBuilder(Query); + +impl Query { + pub fn new() -> Self { + Default::default() + } + + pub fn builder() -> QueryBuilder { + Default::default() + } + + pub async fn request(&self) -> anyhow::Result { + query_objects(self).await + } + + pub async fn request_typed(&self) -> anyhow::Result> { + query_objects::(self).await + } +} + +impl QueryBuilder { + pub fn new() -> Self { + Default::default() + } + + pub fn filter(mut self, attribute: impl ToString, value: impl IntoFilterValue + 'static) -> Self { + self.0.filters.insert(attribute.to_string(), value.into_filter_value()); + + self + } + + pub fn restrict>(mut self, attributes: I) -> Self { + self.0.restrict = HashSet::from_iter(attributes.into_iter().map(|v| v.to_string())); + + self + } + + pub fn order_by>>(mut self, value: T) -> Self { + self.0.order_by = value.into().as_ref().map(ToString::to_string); + + self + } + + pub fn build(mut self) -> Query { + if self.0.restrict.is_empty() { + self.0.restrict.insert(String::from("hostname")); + } + + self.0.restrict.insert(String::from("object_id")); + + self.0 + } +} From 8abd6adc2c32bcc083c817176cce5451309a13ae Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Fri, 19 Apr 2024 01:10:35 +0200 Subject: [PATCH 02/21] Add commit endpoint --- rust/README.md | 2 +- rust/examples/adminapi.rs | 7 +- rust/examples/commit.rs | 38 +++++++++ rust/src/api.rs | 122 ++++++++++++++++++++++++--- rust/src/commit.rs | 169 ++++++++++++++++++++++++++++++++++++++ rust/src/lib.rs | 1 + 6 files changed, 327 insertions(+), 12 deletions(-) create mode 100644 rust/examples/commit.rs create mode 100644 rust/src/commit.rs diff --git a/rust/README.md b/rust/README.md index 21ac4bc4..2347762f 100644 --- a/rust/README.md +++ b/rust/README.md @@ -7,7 +7,7 @@ This is the adminapi Rust library | Feature | Status | Note | |--------------|-----------------|-----------------------------------------------------------------------------------------------------------------| | Querying | Implemented | Querying works by either a generic `serde_json::Value`, or with a `serde` supported type. | -| Creating | Not implemented | | +| Creating | Implemented | Creating/Changing/Deleting is implemented via `adminapi::commit::Commit` object. (may change later) | | *other* APIs | Not implemented | The adminapi supports other APIs such as the "firewall" api. The support for those is currently not implemented | | Token Auth | Implemented | | | SSH Auth | Not implemented | | diff --git a/rust/examples/adminapi.rs b/rust/examples/adminapi.rs index 781a9ca2..63f3b8be 100644 --- a/rust/examples/adminapi.rs +++ b/rust/examples/adminapi.rs @@ -1,3 +1,4 @@ +use adminapi::api::new_object; use adminapi::filter::*; use adminapi::query::Query; @@ -9,6 +10,7 @@ async fn main() -> anyhow::Result<()> { .filter("os", not(empty())) .restrict(["hostname", "responsible_admin", "os"]).build(); + #[allow(dead_code)] // The fields are unused, but this example still should show, that you can have the query return structured data #[derive(Clone, Debug, serde::Deserialize)] struct MyServer { hostname: String, @@ -17,10 +19,13 @@ async fn main() -> anyhow::Result<()> { } let servers = query.request_typed::().await?; - for server in servers.into_iter() { println!("{server:#?}"); } + let obj = new_object("service_group").await?; + + println!("{obj:#?}"); + Ok(()) } diff --git a/rust/examples/commit.rs b/rust/examples/commit.rs new file mode 100644 index 00000000..5ee06522 --- /dev/null +++ b/rust/examples/commit.rs @@ -0,0 +1,38 @@ +use adminapi::api::{commit_changes, new_object}; +use adminapi::commit::Commit; +use adminapi::filter::{empty, not, regexp}; +use adminapi::query::Query; + +#[tokio::main] +pub async fn main() -> anyhow::Result<()> { + env_logger::init(); + let mut server = Query::builder().filter("hostname", regexp(".*payment-staging.*")) + .filter("os", not(empty())) + .restrict(["hostname", "responsible_admin", "os"]) + .build() + .request() + .await? + .all() + .pop() + .ok_or(anyhow::anyhow!("No servers returned"))?; + + server.set("os", "bookworm")? + .add("responsible_admin", "yannik.schwiegerr")? + .remove("responsible_admin", "yannik.schwieger")?; + + let mut new_sg = new_object("service_group").await?.result; + new_sg.set("hostname", "yannik-adminapi-rs-2.test.sg") + .set("project", "test") + .add("responsible_admin", "yannik.schwieger") + .add("protocol_ports_inbound", "tcp443"); + + let changes = Commit::new() + .update(server.changeset()) + .create(new_sg); + println!("{}", serde_json::to_string_pretty(&changes)?); + + let response = commit_changes(&changes).await?; + println!("{response:#?}"); + + Ok(()) +} diff --git a/rust/src/api.rs b/rust/src/api.rs index 2aedeed4..6ec65ade 100644 --- a/rust/src/api.rs +++ b/rust/src/api.rs @@ -1,23 +1,36 @@ use std::fmt::Display; +use crate::commit::{AttributeChange, Dataset, Changeset, Commit, IntoAttributeValue}; use crate::config::Config; use crate::query::Query; -pub type ServerObject = serde_json::Value; - pub const QUERY_ENDPOINT: &str = "dataset/query"; +pub const COMMIT_ENDPOINT: &str = "dataset/commit"; +pub const NEW_OBJECT_ENDPOINT: &str = "dataset/new_object"; + +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] +pub struct QueryResponse { + pub status: String, + pub result: Vec>, +} + +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] +pub struct NewResponse { + pub result: Dataset, +} #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] -pub struct QueryResponse { - status: String, - result: Vec>, +pub struct CommitResponse { + pub status: String, } #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] -pub struct Server { - object_id: u64, +pub struct Server { + pub object_id: u64, #[serde(flatten)] - attributes: T + pub attributes: T, + #[serde(skip, default)] + changes: Changeset, } pub async fn query_objects(query: &Query) -> anyhow::Result> { @@ -28,6 +41,22 @@ pub async fn query_objects(query: &Query) -> any Ok(response.json().await?) } +pub async fn new_object(servertype: impl Display) -> anyhow::Result { + let config = Config::build_from_environment()?; + let response = request_api(format!("{NEW_OBJECT_ENDPOINT}?servertype={servertype}"), serde_json::Value::Null, config).await?; + let response = response.error_for_status()?; + + Ok(response.json().await?) +} + +pub async fn commit_changes(commit: &Commit) -> anyhow::Result { + let config = Config::build_from_environment()?; + let response = request_api(COMMIT_ENDPOINT, serde_json::to_value(commit)?, config).await?; + let response = response.error_for_status()?; + + Ok(response.json().await?) +} + pub async fn request_api(endpoint: impl Display, data: serde_json::Value, config: Config) -> anyhow::Result { let client = reqwest::Client::new(); let token = config.auth_token.unwrap_or_default(); @@ -62,7 +91,7 @@ fn calculate_security_token(token: &String, now: u64, body: &str) -> String { hmac.update(format!("{now}:{body}").as_bytes()); let result = hmac.finalize(); - result.into_bytes().iter().map(|byte| format!("{:02x}", byte)).collect::() + result.into_bytes().iter().fold(String::new(), |hash, byte| format!("{hash}{byte:02x}")) } fn calculate_app_id(token: &String) -> String { @@ -71,5 +100,78 @@ fn calculate_app_id(token: &String) -> String { hasher.update(token.as_bytes()); let result = hasher.finalize(); - result.iter().map(|byte| format!("{:02x}", byte)).collect::() + result.iter().fold(String::new(), |hash, byte| format!("{hash}{byte:02x}")) +} + +impl Server { + pub fn set(&mut self, attribute: impl ToString, value: impl IntoAttributeValue + 'static) -> anyhow::Result<&mut Self> { + let new = value.into_attribute_value(); + let attribute = attribute.to_string(); + + if self.attributes.get(&attribute).is_array() { + return Err(anyhow::anyhow!("Attribute is a multi attribute, set is not supported!")); + } + + let old = self.attributes.get(&attribute); + self.attributes.set(attribute.clone(), new.clone()); + self.changes.attributes.insert(attribute, AttributeChange::Update { old, new }); + + Ok(self) + } + + pub fn add(&mut self, attribute: impl ToString, value: impl IntoAttributeValue + 'static) -> anyhow::Result<&mut Self> { + let value = value.into_attribute_value(); + let attribute = attribute.to_string(); + + if !self.attributes.get(&attribute).is_array() { + return Err(anyhow::anyhow!("add is only supported with multi attributes")); + } + + self.attributes.add(attribute.clone(), value.clone()); + let entry = self.changes.attributes.entry(attribute).or_insert(AttributeChange::Multi { remove: vec![], add: vec![] }); + + if let AttributeChange::Multi { add, .. } = entry { + add.push(value); + } + Ok(self) + } + + pub fn remove(&mut self, attribute: impl ToString, value: impl IntoAttributeValue + 'static) -> anyhow::Result<&mut Self> { + let value = value.into_attribute_value(); + let attribute = attribute.to_string(); + + if !self.attributes.get(&attribute).is_array() { + return Err(anyhow::anyhow!("remove is only supported with multi attributes")); + } + + self.attributes.remove(attribute.clone(), value.clone()); + let entry = self.changes.attributes.entry(attribute).or_insert(AttributeChange::Multi { remove: vec![], add: vec![] }); + + if let AttributeChange::Multi { remove, .. } = entry { + remove.push(value); + } + + Ok(self) + } + + pub fn changeset(&self) -> Changeset { + let mut set = self.changes.clone(); + set.object_id = self.object_id; + + set + } +} + +impl QueryResponse { + pub fn one(mut self) -> anyhow::Result> { + if self.result.len() > 1 { + return Err(anyhow::anyhow!("Result has more then one item!")); + } + + self.result.pop().ok_or(anyhow::anyhow!("No result returned!")) + } + + pub fn all(self) -> Vec> { + self.result + } } diff --git a/rust/src/commit.rs b/rust/src/commit.rs new file mode 100644 index 00000000..989a996a --- /dev/null +++ b/rust/src/commit.rs @@ -0,0 +1,169 @@ +use std::collections::HashMap; + +use serde_json::Number; + +pub type AttributeValue = serde_json::Value; + +#[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)] +pub struct Dataset(HashMap); + +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] +#[serde(tag = "action", rename_all = "snake_case")] +pub enum AttributeChange { + Update { + old: AttributeValue, + new: AttributeValue, + }, + Multi { + remove: Vec, + add: Vec, + }, +} + +#[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)] +pub struct Changeset { + pub object_id: u64, + #[serde(flatten)] + pub attributes: HashMap, +} + +#[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)] +pub struct Commit { + #[serde(skip_serializing_if = "Vec::is_empty")] + pub created: Vec, + #[serde(skip_serializing_if = "Vec::is_empty")] + pub changed: Vec, + #[serde(skip_serializing_if = "Vec::is_empty")] + pub deleted: Vec, +} + +pub trait IntoAttributes { + fn into_attributes(self) -> Dataset; +} + +pub trait IntoAttributeValue { + fn into_attribute_value(self) -> AttributeValue; +} + +impl Commit { + pub fn new() -> Self { + Self { + created: Default::default(), + changed: Default::default(), + deleted: Default::default(), + } + } + + pub fn create(mut self, attrs: impl IntoAttributes + 'static) -> Self { + self.created.push(attrs.into_attributes()); + + self + } + + pub fn update(mut self, changeset: Changeset) -> Self { + self.changed.push(changeset); + + self + } + + pub fn delete(mut self, object_id: u64) -> Self { + self.deleted.push(object_id); + + self + } +} + +impl IntoAttributes for Dataset { + fn into_attributes(self) -> Dataset { + self + } +} + +impl IntoAttributeValue for String { + fn into_attribute_value(self) -> AttributeValue { + AttributeValue::String(self) + } +} + +impl IntoAttributeValue for () { + fn into_attribute_value(self) -> AttributeValue { + AttributeValue::Null + } +} + +impl IntoAttributeValue for f32 { + fn into_attribute_value(self) -> AttributeValue { + AttributeValue::from(self) + } +} + +impl IntoAttributeValue for i32 { + fn into_attribute_value(self) -> AttributeValue { + AttributeValue::Number(Number::from(self)) + } +} + +impl IntoAttributeValue for Vec { + fn into_attribute_value(self) -> AttributeValue { + AttributeValue::from_iter(self.into_iter().map(IntoAttributeValue::into_attribute_value)) + } +} + +impl IntoAttributeValue for AttributeValue { + fn into_attribute_value(self) -> AttributeValue { + self + } +} + +impl IntoAttributeValue for &str { + fn into_attribute_value(self) -> AttributeValue { + AttributeValue::String(self.to_string()) + } +} + +impl Dataset { + pub fn new() -> Self { + Self(Default::default()) + } + + pub fn set(&mut self, name: impl ToString, attr: impl IntoAttributeValue + 'static) -> &mut Self { + self.0.insert(name.to_string(), attr.into_attribute_value()); + + self + } + + pub fn add(&mut self, name: impl ToString, attr: impl IntoAttributeValue + 'static) -> &mut Self { + let name = name.to_string(); + let attr = attr.into_attribute_value(); + + let value = self.0.entry(name).or_insert(AttributeValue::Array(vec![])); + if let serde_json::Value::Array(array) = value { + array.push(attr); + } + + self + } + + pub fn remove(&mut self, name: impl ToString, attr: impl IntoAttributeValue + 'static) -> &mut Self { + let name = name.to_string(); + let attr = attr.into_attribute_value(); + + let Some(AttributeValue::Array(value)) = self.0.get_mut(&name) else { + return self; + }; + + if let Some(index) = value.iter().position(|val| val == &attr) { + value.remove(index); + } + + if value.is_empty() { + self.0.remove(&name); + } + + self + } + + pub fn get(&self, name: &str) -> AttributeValue { + self.0.get(name).cloned().unwrap_or(AttributeValue::Null) + } +} diff --git a/rust/src/lib.rs b/rust/src/lib.rs index b94f386c..57b4c133 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -4,3 +4,4 @@ pub mod api; pub mod filter; pub mod query; pub mod config; +pub mod commit; From 031d37cd2f78cebb9be81a679fcf9025cc3ddc2f Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Fri, 19 Apr 2024 01:27:38 +0200 Subject: [PATCH 03/21] Reformat code --- rust/examples/adminapi.rs | 9 ++-- rust/examples/commit.rs | 13 ++--- rust/src/api.rs | 99 +++++++++++++++++++++++++++++++-------- rust/src/commit.rs | 23 +++++++-- rust/src/lib.rs | 4 +- rust/src/query.rs | 16 +++++-- 6 files changed, 125 insertions(+), 39 deletions(-) diff --git a/rust/examples/adminapi.rs b/rust/examples/adminapi.rs index 63f3b8be..b9b1f2d8 100644 --- a/rust/examples/adminapi.rs +++ b/rust/examples/adminapi.rs @@ -6,11 +6,14 @@ use adminapi::query::Query; async fn main() -> anyhow::Result<()> { env_logger::init(); - let query = Query::builder().filter("hostname", regexp(".*payment-staging.*")) + let query = Query::builder() + .filter("hostname", regexp(".*payment-staging.*")) .filter("os", not(empty())) - .restrict(["hostname", "responsible_admin", "os"]).build(); + .restrict(["hostname", "responsible_admin", "os"]) + .build(); - #[allow(dead_code)] // The fields are unused, but this example still should show, that you can have the query return structured data + // The fields are unused, but this example still should show, that you can have the query return structured data + #[allow(dead_code)] #[derive(Clone, Debug, serde::Deserialize)] struct MyServer { hostname: String, diff --git a/rust/examples/commit.rs b/rust/examples/commit.rs index 5ee06522..37f5477c 100644 --- a/rust/examples/commit.rs +++ b/rust/examples/commit.rs @@ -6,7 +6,8 @@ use adminapi::query::Query; #[tokio::main] pub async fn main() -> anyhow::Result<()> { env_logger::init(); - let mut server = Query::builder().filter("hostname", regexp(".*payment-staging.*")) + let mut server = Query::builder() + .filter("hostname", regexp(".*payment-staging.*")) .filter("os", not(empty())) .restrict(["hostname", "responsible_admin", "os"]) .build() @@ -16,19 +17,19 @@ pub async fn main() -> anyhow::Result<()> { .pop() .ok_or(anyhow::anyhow!("No servers returned"))?; - server.set("os", "bookworm")? + server + .set("os", "bookworm")? .add("responsible_admin", "yannik.schwiegerr")? .remove("responsible_admin", "yannik.schwieger")?; let mut new_sg = new_object("service_group").await?.result; - new_sg.set("hostname", "yannik-adminapi-rs-2.test.sg") + new_sg + .set("hostname", "yannik-adminapi-rs-2.test.sg") .set("project", "test") .add("responsible_admin", "yannik.schwieger") .add("protocol_ports_inbound", "tcp443"); - let changes = Commit::new() - .update(server.changeset()) - .create(new_sg); + let changes = Commit::new().update(server.changeset()).create(new_sg); println!("{}", serde_json::to_string_pretty(&changes)?); let response = commit_changes(&changes).await?; diff --git a/rust/src/api.rs b/rust/src/api.rs index 6ec65ade..7360a135 100644 --- a/rust/src/api.rs +++ b/rust/src/api.rs @@ -1,6 +1,6 @@ use std::fmt::Display; -use crate::commit::{AttributeChange, Dataset, Changeset, Commit, IntoAttributeValue}; +use crate::commit::{AttributeChange, Changeset, Commit, Dataset, IntoAttributeValue}; use crate::config::Config; use crate::query::Query; @@ -33,7 +33,9 @@ pub struct Server { changes: Changeset, } -pub async fn query_objects(query: &Query) -> anyhow::Result> { +pub async fn query_objects( + query: &Query, +) -> anyhow::Result> { let config = Config::build_from_environment()?; let response = request_api(QUERY_ENDPOINT, serde_json::to_value(query)?, config).await?; let response = response.error_for_status()?; @@ -43,7 +45,12 @@ pub async fn query_objects(query: &Query) -> any pub async fn new_object(servertype: impl Display) -> anyhow::Result { let config = Config::build_from_environment()?; - let response = request_api(format!("{NEW_OBJECT_ENDPOINT}?servertype={servertype}"), serde_json::Value::Null, config).await?; + let response = request_api( + format!("{NEW_OBJECT_ENDPOINT}?servertype={servertype}"), + serde_json::Value::Null, + config, + ) + .await?; let response = response.error_for_status()?; Ok(response.json().await?) @@ -57,17 +64,27 @@ pub async fn commit_changes(commit: &Commit) -> anyhow::Result { Ok(response.json().await?) } -pub async fn request_api(endpoint: impl Display, data: serde_json::Value, config: Config) -> anyhow::Result { +pub async fn request_api( + endpoint: impl Display, + data: serde_json::Value, + config: Config, +) -> anyhow::Result { let client = reqwest::Client::new(); let token = config.auth_token.unwrap_or_default(); let body = serde_json::to_string(&data)?; - let now = std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH)?.as_secs(); + let now = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH)? + .as_secs(); let url = format!("{}/{endpoint}", config.base_url); - let request = client.post(url) + let request = client + .post(url) .header("Content-Type", "application/json") .header("X-Timestamp", now.to_string()) .header("X-API-Version", config.api_version) - .header("X-SecurityToken", calculate_security_token(&token, now, &body)) + .header( + "X-SecurityToken", + calculate_security_token(&token, now, &body), + ) .header("X-Application", calculate_app_id(&token)) .body(body.into_bytes()); @@ -87,11 +104,15 @@ fn calculate_security_token(token: &String, now: u64, body: &str) -> String { use hmac::Mac; type HmacSha1 = hmac::Hmac; - let mut hmac = HmacSha1::new_from_slice(token.as_bytes()).expect("Hmac can accept any size of key"); + let mut hmac = + HmacSha1::new_from_slice(token.as_bytes()).expect("Hmac can accept any size of key"); hmac.update(format!("{now}:{body}").as_bytes()); let result = hmac.finalize(); - result.into_bytes().iter().fold(String::new(), |hash, byte| format!("{hash}{byte:02x}")) + result + .into_bytes() + .iter() + .fold(String::new(), |hash, byte| format!("{hash}{byte:02x}")) } fn calculate_app_id(token: &String) -> String { @@ -100,35 +121,58 @@ fn calculate_app_id(token: &String) -> String { hasher.update(token.as_bytes()); let result = hasher.finalize(); - result.iter().fold(String::new(), |hash, byte| format!("{hash}{byte:02x}")) + result + .iter() + .fold(String::new(), |hash, byte| format!("{hash}{byte:02x}")) } impl Server { - pub fn set(&mut self, attribute: impl ToString, value: impl IntoAttributeValue + 'static) -> anyhow::Result<&mut Self> { + pub fn set( + &mut self, + attribute: impl ToString, + value: impl IntoAttributeValue + 'static, + ) -> anyhow::Result<&mut Self> { let new = value.into_attribute_value(); let attribute = attribute.to_string(); if self.attributes.get(&attribute).is_array() { - return Err(anyhow::anyhow!("Attribute is a multi attribute, set is not supported!")); + return Err(anyhow::anyhow!( + "Attribute is a multi attribute, set is not supported!" + )); } let old = self.attributes.get(&attribute); self.attributes.set(attribute.clone(), new.clone()); - self.changes.attributes.insert(attribute, AttributeChange::Update { old, new }); + self.changes + .attributes + .insert(attribute, AttributeChange::Update { old, new }); Ok(self) } - pub fn add(&mut self, attribute: impl ToString, value: impl IntoAttributeValue + 'static) -> anyhow::Result<&mut Self> { + pub fn add( + &mut self, + attribute: impl ToString, + value: impl IntoAttributeValue + 'static, + ) -> anyhow::Result<&mut Self> { let value = value.into_attribute_value(); let attribute = attribute.to_string(); if !self.attributes.get(&attribute).is_array() { - return Err(anyhow::anyhow!("add is only supported with multi attributes")); + return Err(anyhow::anyhow!( + "add is only supported with multi attributes" + )); } self.attributes.add(attribute.clone(), value.clone()); - let entry = self.changes.attributes.entry(attribute).or_insert(AttributeChange::Multi { remove: vec![], add: vec![] }); + let entry = self + .changes + .attributes + .entry(attribute) + .or_insert(AttributeChange::Multi { + remove: vec![], + add: vec![], + }); if let AttributeChange::Multi { add, .. } = entry { add.push(value); @@ -136,16 +180,29 @@ impl Server { Ok(self) } - pub fn remove(&mut self, attribute: impl ToString, value: impl IntoAttributeValue + 'static) -> anyhow::Result<&mut Self> { + pub fn remove( + &mut self, + attribute: impl ToString, + value: impl IntoAttributeValue + 'static, + ) -> anyhow::Result<&mut Self> { let value = value.into_attribute_value(); let attribute = attribute.to_string(); if !self.attributes.get(&attribute).is_array() { - return Err(anyhow::anyhow!("remove is only supported with multi attributes")); + return Err(anyhow::anyhow!( + "remove is only supported with multi attributes" + )); } self.attributes.remove(attribute.clone(), value.clone()); - let entry = self.changes.attributes.entry(attribute).or_insert(AttributeChange::Multi { remove: vec![], add: vec![] }); + let entry = self + .changes + .attributes + .entry(attribute) + .or_insert(AttributeChange::Multi { + remove: vec![], + add: vec![], + }); if let AttributeChange::Multi { remove, .. } = entry { remove.push(value); @@ -168,7 +225,9 @@ impl QueryResponse { return Err(anyhow::anyhow!("Result has more then one item!")); } - self.result.pop().ok_or(anyhow::anyhow!("No result returned!")) + self.result + .pop() + .ok_or(anyhow::anyhow!("No result returned!")) } pub fn all(self) -> Vec> { diff --git a/rust/src/commit.rs b/rust/src/commit.rs index 989a996a..5b2d3c56 100644 --- a/rust/src/commit.rs +++ b/rust/src/commit.rs @@ -105,7 +105,10 @@ impl IntoAttributeValue for i32 { impl IntoAttributeValue for Vec { fn into_attribute_value(self) -> AttributeValue { - AttributeValue::from_iter(self.into_iter().map(IntoAttributeValue::into_attribute_value)) + AttributeValue::from_iter( + self.into_iter() + .map(IntoAttributeValue::into_attribute_value), + ) } } @@ -126,13 +129,21 @@ impl Dataset { Self(Default::default()) } - pub fn set(&mut self, name: impl ToString, attr: impl IntoAttributeValue + 'static) -> &mut Self { + pub fn set( + &mut self, + name: impl ToString, + attr: impl IntoAttributeValue + 'static, + ) -> &mut Self { self.0.insert(name.to_string(), attr.into_attribute_value()); self } - pub fn add(&mut self, name: impl ToString, attr: impl IntoAttributeValue + 'static) -> &mut Self { + pub fn add( + &mut self, + name: impl ToString, + attr: impl IntoAttributeValue + 'static, + ) -> &mut Self { let name = name.to_string(); let attr = attr.into_attribute_value(); @@ -144,7 +155,11 @@ impl Dataset { self } - pub fn remove(&mut self, name: impl ToString, attr: impl IntoAttributeValue + 'static) -> &mut Self { + pub fn remove( + &mut self, + name: impl ToString, + attr: impl IntoAttributeValue + 'static, + ) -> &mut Self { let name = name.to_string(); let attr = attr.into_attribute_value(); diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 57b4c133..e5856038 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -1,7 +1,7 @@ pub const API_VERSION: &str = "4.9.0"; pub mod api; +pub mod commit; +pub mod config; pub mod filter; pub mod query; -pub mod config; -pub mod commit; diff --git a/rust/src/query.rs b/rust/src/query.rs index 9e93a27e..97abb732 100644 --- a/rust/src/query.rs +++ b/rust/src/query.rs @@ -27,7 +27,9 @@ impl Query { query_objects(self).await } - pub async fn request_typed(&self) -> anyhow::Result> { + pub async fn request_typed( + &self, + ) -> anyhow::Result> { query_objects::(self).await } } @@ -37,13 +39,19 @@ impl QueryBuilder { Default::default() } - pub fn filter(mut self, attribute: impl ToString, value: impl IntoFilterValue + 'static) -> Self { - self.0.filters.insert(attribute.to_string(), value.into_filter_value()); + pub fn filter( + mut self, + attribute: impl ToString, + value: impl IntoFilterValue + 'static, + ) -> Self { + self.0 + .filters + .insert(attribute.to_string(), value.into_filter_value()); self } - pub fn restrict>(mut self, attributes: I) -> Self { + pub fn restrict>(mut self, attributes: I) -> Self { self.0.restrict = HashSet::from_iter(attributes.into_iter().map(|v| v.to_string())); self From 738e3a37f1be5520cd12a879a84550b56b6875fb Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Fri, 19 Apr 2024 01:47:59 +0200 Subject: [PATCH 04/21] Create builder for new object --- rust/examples/commit.rs | 20 +++++++++-------- rust/src/api.rs | 22 +++++++++--------- rust/src/commit.rs | 12 +++++----- rust/src/lib.rs | 1 + rust/src/new_object.rs | 49 +++++++++++++++++++++++++++++++++++++++++ rust/src/query.rs | 12 +++++++++- 6 files changed, 89 insertions(+), 27 deletions(-) create mode 100644 rust/src/new_object.rs diff --git a/rust/examples/commit.rs b/rust/examples/commit.rs index 37f5477c..8ed1b523 100644 --- a/rust/examples/commit.rs +++ b/rust/examples/commit.rs @@ -1,6 +1,5 @@ -use adminapi::api::{commit_changes, new_object}; -use adminapi::commit::Commit; use adminapi::filter::{empty, not, regexp}; +use adminapi::new_object::NewObject; use adminapi::query::Query; #[tokio::main] @@ -22,18 +21,21 @@ pub async fn main() -> anyhow::Result<()> { .add("responsible_admin", "yannik.schwiegerr")? .remove("responsible_admin", "yannik.schwieger")?; - let mut new_sg = new_object("service_group").await?.result; + server.commit().await?; + + let mut new_sg = NewObject::request_new("service_group").await?; new_sg .set("hostname", "yannik-adminapi-rs-2.test.sg") .set("project", "test") .add("responsible_admin", "yannik.schwieger") .add("protocol_ports_inbound", "tcp443"); - - let changes = Commit::new().update(server.changeset()).create(new_sg); - println!("{}", serde_json::to_string_pretty(&changes)?); - - let response = commit_changes(&changes).await?; - println!("{response:#?}"); + let mut created_sg = new_sg.commit().await?; + created_sg + .add("protocol_ports_inbound", "tcp80")? + .add("sg_allow_from", "yannik-adminapi-rs-2.test.sg")? + .add("sg_allow_to", "yannik-adminapi-rs-2.test.sg")? + .commit() + .await?; Ok(()) } diff --git a/rust/src/api.rs b/rust/src/api.rs index 7360a135..b05c7799 100644 --- a/rust/src/api.rs +++ b/rust/src/api.rs @@ -15,7 +15,7 @@ pub struct QueryResponse { } #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] -pub struct NewResponse { +pub struct NewObjectResponse { pub result: Dataset, } @@ -24,15 +24,6 @@ pub struct CommitResponse { pub status: String, } -#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] -pub struct Server { - pub object_id: u64, - #[serde(flatten)] - pub attributes: T, - #[serde(skip, default)] - changes: Changeset, -} - pub async fn query_objects( query: &Query, ) -> anyhow::Result> { @@ -43,7 +34,7 @@ pub async fn query_objects( Ok(response.json().await?) } -pub async fn new_object(servertype: impl Display) -> anyhow::Result { +pub async fn new_object(servertype: impl Display) -> anyhow::Result { let config = Config::build_from_environment()?; let response = request_api( format!("{NEW_OBJECT_ENDPOINT}?servertype={servertype}"), @@ -91,6 +82,15 @@ pub async fn request_api( Ok(request.send().await?) } +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] +pub struct Server { + pub object_id: u64, + #[serde(flatten)] + pub attributes: T, + #[serde(skip, default)] + pub(crate) changes: Changeset, +} + impl IntoIterator for QueryResponse { type Item = Server; type IntoIter = std::vec::IntoIter>; diff --git a/rust/src/commit.rs b/rust/src/commit.rs index 5b2d3c56..06179bd7 100644 --- a/rust/src/commit.rs +++ b/rust/src/commit.rs @@ -37,8 +37,8 @@ pub struct Commit { pub deleted: Vec, } -pub trait IntoAttributes { - fn into_attributes(self) -> Dataset; +pub trait IntoDataset { + fn into_dataset(self) -> Dataset; } pub trait IntoAttributeValue { @@ -54,8 +54,8 @@ impl Commit { } } - pub fn create(mut self, attrs: impl IntoAttributes + 'static) -> Self { - self.created.push(attrs.into_attributes()); + pub fn create(mut self, attrs: impl IntoDataset + 'static) -> Self { + self.created.push(attrs.into_dataset()); self } @@ -73,8 +73,8 @@ impl Commit { } } -impl IntoAttributes for Dataset { - fn into_attributes(self) -> Dataset { +impl IntoDataset for Dataset { + fn into_dataset(self) -> Dataset { self } } diff --git a/rust/src/lib.rs b/rust/src/lib.rs index e5856038..0b10ec7e 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -4,4 +4,5 @@ pub mod api; pub mod commit; pub mod config; pub mod filter; +pub mod new_object; pub mod query; diff --git a/rust/src/new_object.rs b/rust/src/new_object.rs new file mode 100644 index 00000000..f14838a1 --- /dev/null +++ b/rust/src/new_object.rs @@ -0,0 +1,49 @@ +use std::ops::{Deref, DerefMut}; + +use crate::api::{commit_changes, new_object, NewObjectResponse, Server}; +use crate::commit::{AttributeValue, Commit, Dataset}; +use crate::query::Query; + +pub struct NewObject { + attributes: Dataset, +} + +impl NewObject { + pub async fn request_new(servertype: impl ToString) -> anyhow::Result { + let servertype = servertype.to_string(); + let NewObjectResponse { result } = new_object(&servertype).await?; + + Ok(Self { + attributes: result, + }) + } + + pub async fn commit(self) -> anyhow::Result { + let AttributeValue::String(hostname) = self.attributes.get("hostname") else { + return Err(anyhow::anyhow!("Required attribute 'hostname' is missing")); + }; + let commit = Commit::new().create(self.attributes); + commit_changes(&commit).await?; + + Query::builder() + .filter("hostname", hostname) + .build() + .request() + .await? + .one() + } +} + +impl Deref for NewObject { + type Target = Dataset; + + fn deref(&self) -> &Self::Target { + &self.attributes + } +} + +impl DerefMut for NewObject { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.attributes + } +} diff --git a/rust/src/query.rs b/rust/src/query.rs index 97abb732..5b5c0e26 100644 --- a/rust/src/query.rs +++ b/rust/src/query.rs @@ -1,6 +1,7 @@ use std::collections::HashSet; -use crate::api::{query_objects, QueryResponse}; +use crate::api::{commit_changes, query_objects, CommitResponse, QueryResponse, Server}; +use crate::commit::{Changeset, Commit}; use crate::filter::{AttributeFilter, IntoFilterValue}; #[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)] @@ -73,3 +74,12 @@ impl QueryBuilder { self.0 } } + +impl Server { + pub async fn commit(&mut self) -> anyhow::Result { + let commit = Commit::new().update(self.changeset()); + self.changes = Changeset::default(); + + commit_changes(&commit).await + } +} From 9ad5430e33e94b3e1a405c33c8bb73bdaf74556a Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Fri, 19 Apr 2024 13:43:47 +0200 Subject: [PATCH 05/21] Update readme, Add repo info to Cargo.toml --- rust/Cargo.toml | 22 +++++++++++++--------- rust/README.md | 12 ++++++++++-- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 1f4391cf..14400aac 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -3,16 +3,20 @@ name = "adminapi" version = "0.1.0" edition = "2021" description = "The ServerAdmin API available in Rust" +license = "MIT" +readme = "README.md" +authors = ["InnoGames System Administration "] +repository = "https://github.com/innogames/serveradmin/" [dependencies] -anyhow = "1.0.82" -hmac = "0.12.1" -log = "0.4.21" -reqwest = { version = "0.12.3", features = ["json"] } -serde = { version = "1.0.198", features = ["derive"] } -serde_json = "1.0.116" -sha1 = "0.10.6" +anyhow = "1.0" +hmac = "0.12" +log = "0.4" +reqwest = { version = "0.12", features = ["json"] } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +sha1 = "0.10" [dev-dependencies] -env_logger = "0.11.3" -tokio = { version = "1.37.0", features = ["full"] } +env_logger = "0.11" +tokio = { version = "1.37", features = ["full"] } diff --git a/rust/README.md b/rust/README.md index 2347762f..7fb08072 100644 --- a/rust/README.md +++ b/rust/README.md @@ -1,8 +1,16 @@ # Adminapi in Rust! -This is the adminapi Rust library +This is the client library for ServerAdmin in Rust! -## Features +## ServerAdmin + +Serveradmin is the central server database management system of InnoGames. +It has an HTTP web interface and an HTTP JSON API. Check out `the documentation +`_ or watch `this FOSDEM 19 +talk `_ for a deepdive how +InnoGames works with serveradmin. + +## Features of this library | Feature | Status | Note | |--------------|-----------------|-----------------------------------------------------------------------------------------------------------------| From 805908e2e6af7d2557ec4db603ea7cb9fa395555 Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Fri, 19 Apr 2024 15:49:25 +0200 Subject: [PATCH 06/21] Implement ssh auth --- rust/.gitignore | 3 +- rust/Cargo.lock | 562 +++++++++++++++++++++++++++++++++++++++++ rust/Cargo.toml | 4 + rust/README.md | 14 +- rust/src/api.rs | 44 +++- rust/src/config.rs | 107 +++++++- rust/src/new_object.rs | 4 +- 7 files changed, 710 insertions(+), 28 deletions(-) diff --git a/rust/.gitignore b/rust/.gitignore index 1de56593..9f3ad1f5 100644 --- a/rust/.gitignore +++ b/rust/.gitignore @@ -1 +1,2 @@ -target \ No newline at end of file +target +.adminapirc diff --git a/rust/Cargo.lock b/rust/Cargo.lock index bf9cc336..6cac8c8e 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -29,6 +29,10 @@ dependencies = [ "serde", "serde_json", "sha1", + "signature", + "ssh-agent-client-rs", + "ssh-encoding", + "ssh-key", "tokio", ] @@ -116,12 +120,24 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "bitflags" version = "1.3.2" @@ -149,6 +165,12 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "bytes" version = "1.6.0" @@ -167,12 +189,28 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "colorchoice" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "core-foundation" version = "0.9.4" @@ -198,6 +236,18 @@ dependencies = [ "libc", ] +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -208,6 +258,43 @@ dependencies = [ "typenum", ] +[[package]] +name = "curve25519-dalek" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" +dependencies = [ + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest", + "fiat-crypto", + "platforms", + "rustc_version", + "subtle", +] + +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "digest" version = "0.10.7" @@ -215,10 +302,81 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] +[[package]] +name = "dsa" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48bc224a9084ad760195584ce5abb3c2c34a225fa312a128ad245a6b412b7689" +dependencies = [ + "digest", + "num-bigint-dig", + "num-traits", + "pkcs8", + "rfc6979", + "sha2", + "signature", + "zeroize", +] + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +dependencies = [ + "curve25519-dalek", + "ed25519", + "sha2", + "subtle", +] + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "encoding_rs" version = "0.8.34" @@ -273,6 +431,22 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fiat-crypto" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f" + [[package]] name = "fnv" version = "1.0.7" @@ -350,6 +524,18 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +dependencies = [ + "cfg-if", + "libc", + "wasi", ] [[package]] @@ -358,6 +544,17 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + [[package]] name = "h2" version = "0.4.4" @@ -520,6 +717,15 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + [[package]] name = "ipnet" version = "2.9.0" @@ -546,6 +752,9 @@ name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin", +] [[package]] name = "libc" @@ -553,6 +762,12 @@ version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + [[package]] name = "linux-raw-sys" version = "0.4.13" @@ -625,6 +840,53 @@ dependencies = [ "tempfile", ] +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", + "libm", +] + [[package]] name = "num_cpus" version = "1.16.0" @@ -694,6 +956,44 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p384" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70786f51bcc69f6a4c0360e063a4cac5419ef7c5cd5b3c99ad70f3be5ba79209" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + +[[package]] +name = "p521" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc9e2161f1f215afdfce23677034ae137bbd45016a880c2eb3ba8eb95f085b2" +dependencies = [ + "base16ct", + "ecdsa", + "elliptic-curve", + "primeorder", + "rand_core", + "sha2", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -717,6 +1017,15 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -755,12 +1064,54 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +[[package]] +name = "platforms" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "proc-macro2" version = "1.0.81" @@ -779,6 +1130,35 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -859,12 +1239,52 @@ dependencies = [ "winreg", ] +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "rsa" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "sha2", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rustc-demangle" version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + [[package]] name = "rustix" version = "0.38.32" @@ -915,6 +1335,20 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + [[package]] name = "security-framework" version = "2.10.0" @@ -938,6 +1372,12 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + [[package]] name = "serde" version = "1.0.198" @@ -992,6 +1432,17 @@ dependencies = [ "digest", ] +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -1001,6 +1452,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + [[package]] name = "slab" version = "0.4.9" @@ -1026,6 +1487,81 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "ssh-agent-client-rs" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc9798a2e1390157853f81735b9815be2a45dd2200c36646aad942de9074d78" +dependencies = [ + "bytes", + "signature", + "ssh-encoding", + "ssh-key", + "thiserror", +] + +[[package]] +name = "ssh-cipher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caac132742f0d33c3af65bfcde7f6aa8f62f0e991d80db99149eb9d44708784f" +dependencies = [ + "cipher", + "ssh-encoding", +] + +[[package]] +name = "ssh-encoding" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9242b9ef4108a78e8cd1a2c98e193ef372437f8c22be363075233321dd4a15" +dependencies = [ + "base64ct", + "pem-rfc7468", + "sha2", +] + +[[package]] +name = "ssh-key" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca9b366a80cf18bb6406f4cf4d10aebfb46140a8c0c33f666a144c5c76ecbafc" +dependencies = [ + "dsa", + "ed25519-dalek", + "num-bigint-dig", + "p256", + "p384", + "p521", + "rand_core", + "rsa", + "sec1", + "serde", + "sha1", + "sha2", + "signature", + "ssh-cipher", + "ssh-encoding", + "subtle", + "zeroize", +] + [[package]] name = "subtle" version = "2.5.0" @@ -1082,6 +1618,26 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "thiserror" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -1500,3 +2056,9 @@ dependencies = [ "cfg-if", "windows-sys 0.48.0", ] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 14400aac..afe62afd 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -16,6 +16,10 @@ reqwest = { version = "0.12", features = ["json"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" sha1 = "0.10" +signature = "2.2" +ssh-agent-client-rs = "0.9" +ssh-encoding = { version = "0.2.0", features = ["base64"] } +ssh-key = { version = "0.6", features = ["serde", "ed25519", "dsa", "crypto", "rsa"] } [dev-dependencies] env_logger = "0.11" diff --git a/rust/README.md b/rust/README.md index 7fb08072..ca76e261 100644 --- a/rust/README.md +++ b/rust/README.md @@ -12,10 +12,10 @@ InnoGames works with serveradmin. ## Features of this library -| Feature | Status | Note | -|--------------|-----------------|-----------------------------------------------------------------------------------------------------------------| -| Querying | Implemented | Querying works by either a generic `serde_json::Value`, or with a `serde` supported type. | -| Creating | Implemented | Creating/Changing/Deleting is implemented via `adminapi::commit::Commit` object. (may change later) | -| *other* APIs | Not implemented | The adminapi supports other APIs such as the "firewall" api. The support for those is currently not implemented | -| Token Auth | Implemented | | -| SSH Auth | Not implemented | | +| Feature | Status | Note | +|--------------|-----------------|----------------------------------------------------------------------------------------------------------------------------------------| +| Querying | Implemented | Querying works by either a generic `serde_json::Value`, or with a `serde` supported type. | +| Creating | Implemented | Creating/Changing/Deleting is implemented via `adminapi::commit::Commit` object. (may change later) | +| *other* APIs | Not implemented | The adminapi supports other APIs such as the "firewall" api. The support for those is currently not implemented | +| Token Auth | Implemented | | +| SSH Auth | Implemented | The implementation either uses the SSH agent using the `SSH_AUTH_SOCK` env variable or reads a private key from `SERVERADMIN_KEY_PATH` | diff --git a/rust/src/api.rs b/rust/src/api.rs index b05c7799..f8aa054c 100644 --- a/rust/src/api.rs +++ b/rust/src/api.rs @@ -1,12 +1,15 @@ use std::fmt::Display; +use signature::Signer; +use ssh_encoding::Encode; + use crate::commit::{AttributeChange, Changeset, Commit, Dataset, IntoAttributeValue}; use crate::config::Config; use crate::query::Query; -pub const QUERY_ENDPOINT: &str = "dataset/query"; -pub const COMMIT_ENDPOINT: &str = "dataset/commit"; -pub const NEW_OBJECT_ENDPOINT: &str = "dataset/new_object"; +pub const QUERY_ENDPOINT: &str = "/api/dataset/query"; +pub const COMMIT_ENDPOINT: &str = "/api/dataset/commit"; +pub const NEW_OBJECT_ENDPOINT: &str = "/api/dataset/new_object"; #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] pub struct QueryResponse { @@ -66,19 +69,36 @@ pub async fn request_api( let now = std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH)? .as_secs(); - let url = format!("{}/{endpoint}", config.base_url); - let request = client + let sign_body = format!("{now}:{body}"); + let url = format!("{}{endpoint}", config.base_url); + let mut request = client .post(url) .header("Content-Type", "application/json") .header("X-Timestamp", now.to_string()) .header("X-API-Version", config.api_version) - .header( - "X-SecurityToken", - calculate_security_token(&token, now, &body), - ) - .header("X-Application", calculate_app_id(&token)) .body(body.into_bytes()); + if let Some(signer) = &config.ssh_signer { + let signature = signer.try_sign(sign_body.as_bytes())?; + let len = Encode::encoded_len_prefixed(&signature)?; + let base64_len = (((len.saturating_mul(4)) / 3).saturating_add(3)) & !3; + let mut buf = vec![0; base64_len]; + let mut writer = ssh_encoding::Base64Writer::new(&mut buf)?; + signature.encode(&mut writer)?; + let signature = writer.finish()?; + + request = request + .header("X-PublicKeys", signer.get_public_key()) + .header("X-Signatures", signature.to_string()); + } else { + request = request + .header( + "X-SecurityToken", + calculate_security_token(&token, &sign_body), + ) + .header("X-Application", calculate_app_id(&token)) + } + Ok(request.send().await?) } @@ -100,13 +120,13 @@ impl IntoIterator for QueryResponse { } } -fn calculate_security_token(token: &String, now: u64, body: &str) -> String { +fn calculate_security_token(token: &String, sign_body: &str) -> String { use hmac::Mac; type HmacSha1 = hmac::Hmac; let mut hmac = HmacSha1::new_from_slice(token.as_bytes()).expect("Hmac can accept any size of key"); - hmac.update(format!("{now}:{body}").as_bytes()); + hmac.update(sign_body.as_bytes()); let result = hmac.finalize(); result diff --git a/rust/src/config.rs b/rust/src/config.rs index 5bc74169..cf5c7281 100644 --- a/rust/src/config.rs +++ b/rust/src/config.rs @@ -1,20 +1,117 @@ +use std::fmt::{Debug, Formatter}; +use std::path::Path; +use std::rc::Rc; +use std::sync::Mutex; + +use signature::Signer; + use crate::API_VERSION; #[derive(Clone, Debug, Default)] pub struct Config { pub base_url: String, pub api_version: String, - pub ssh_signer: Option<()>, + pub ssh_signer: Option, pub auth_token: Option, } +#[derive(Clone)] +pub enum SshSigner { + Agent( + Box, + Box>>, + ), + Key(Box), +} + impl Config { pub fn build_from_environment() -> anyhow::Result { - Ok(Self { - base_url: std::env::var("SERVERADMIN_BASE_URL")?, + let config = Self { + base_url: std::env::var("SERVERADMIN_BASE_URL")? + .trim_end_matches('/') + .trim_end_matches("/api") + .to_string(), api_version: API_VERSION.to_string(), - ssh_signer: None, + ssh_signer: Self::get_signing_key()?, auth_token: std::env::var("SERVERADMIN_TOKEN").ok(), - }) + }; + + Ok(config) + } + + fn get_signing_key() -> anyhow::Result> { + if let Ok(path) = std::env::var("SERVERADMIN_KEY_PATH") { + let key = ssh_key::PrivateKey::read_openssh_file(Path::new(&path))?; + + return Ok(Some(SshSigner::Key(Box::new(key)))); + } + + let path = std::env::var("SSH_AUTH_SOCK").unwrap_or_default(); + let client = ssh_agent_client_rs::Client::connect(Path::new(&path)) + .map_err(|error| log::error!("Unable to connect to SSH agent: {error}")) + .ok(); + + if let Some(mut client) = client { + let identities = client.list_identities()?; + for key in identities { + log::debug!( + "Test signing with SSH key {}", + key.fingerprint(ssh_key::HashAlg::Sha256) + ); + + if client.sign(&key, b"mest message").is_ok() { + log::debug!( + "Found compatible key: {}", + key.fingerprint(ssh_key::HashAlg::Sha256) + ); + + return Ok(Some(SshSigner::Agent( + Box::new(key), + Box::new(Rc::new(Mutex::new(client))), + ))); + } + } + } + + Ok(None) + } +} + +impl Debug for SshSigner { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + SshSigner::Key(_key) => f.write_fmt(format_args!("Key: {}", self.get_public_key())), + SshSigner::Agent(_key, _) => { + f.write_fmt(format_args!("Agent: {}", self.get_public_key())) + } + } + } +} + +impl SshSigner { + pub fn get_public_key(&self) -> String { + let public_key = match self { + SshSigner::Key(key) => key.public_key(), + SshSigner::Agent(key, _) => key, + }; + + let key = public_key.to_openssh().unwrap(); + let mut key = key.split(' '); + key.next(); + + key.next().map(ToString::to_string).unwrap_or_default() + } +} + +impl Signer for SshSigner { + fn try_sign(&self, msg: &[u8]) -> Result { + match self { + SshSigner::Key(key) => key.try_sign(msg), + SshSigner::Agent(key, agent) => agent + .lock() + .unwrap() + .sign(key, msg) + .map_err(signature::Error::from_source), + } } } diff --git a/rust/src/new_object.rs b/rust/src/new_object.rs index f14838a1..56666117 100644 --- a/rust/src/new_object.rs +++ b/rust/src/new_object.rs @@ -13,9 +13,7 @@ impl NewObject { let servertype = servertype.to_string(); let NewObjectResponse { result } = new_object(&servertype).await?; - Ok(Self { - attributes: result, - }) + Ok(Self { attributes: result }) } pub async fn commit(self) -> anyhow::Result { From 7bd7ff5ed920c660447dbf84e1b973ed9206f00b Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Fri, 19 Apr 2024 17:47:15 +0200 Subject: [PATCH 07/21] Add getter for `Server`-Type --- rust/src/api.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rust/src/api.rs b/rust/src/api.rs index f8aa054c..08ea72df 100644 --- a/rust/src/api.rs +++ b/rust/src/api.rs @@ -3,7 +3,7 @@ use std::fmt::Display; use signature::Signer; use ssh_encoding::Encode; -use crate::commit::{AttributeChange, Changeset, Commit, Dataset, IntoAttributeValue}; +use crate::commit::{AttributeChange, AttributeValue, Changeset, Commit, Dataset, IntoAttributeValue}; use crate::config::Config; use crate::query::Query; @@ -231,6 +231,10 @@ impl Server { Ok(self) } + pub fn get(&self, name: &str) -> AttributeValue { + self.attributes.get(name) + } + pub fn changeset(&self) -> Changeset { let mut set = self.changes.clone(); set.object_id = self.object_id; From 0dd89b46ceedac75c797f78746be76c440d14779 Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Thu, 25 Apr 2024 16:08:44 +0200 Subject: [PATCH 08/21] Add cli parser, Identify api_call functions --- rust/Cargo.lock | 85 ++++++++++++++++++ rust/Cargo.toml | 2 + rust/examples/adminapi.rs | 26 ++---- rust/examples/parse_args.rs | 15 ++++ rust/examples/prepare_bookworm.rs | 64 ++++++++++++++ rust/src/cli.rs | 138 ++++++++++++++++++++++++++++++ rust/src/commit.rs | 6 ++ rust/src/lib.rs | 1 + rust/src/query.rs | 7 ++ 9 files changed, 326 insertions(+), 18 deletions(-) create mode 100644 rust/examples/parse_args.rs create mode 100644 rust/examples/prepare_bookworm.rs create mode 100644 rust/src/cli.rs diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 6cac8c8e..9d0bbf0a 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -22,7 +22,9 @@ name = "adminapi" version = "0.1.0" dependencies = [ "anyhow", + "clap", "env_logger", + "futures", "hmac", "log", "reqwest", @@ -199,6 +201,33 @@ dependencies = [ "inout", ] +[[package]] +name = "clap" +version = "4.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" + [[package]] name = "colorchoice" version = "1.0.0" @@ -477,6 +506,21 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.30" @@ -484,6 +528,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -492,6 +537,34 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "futures-sink" version = "0.3.30" @@ -510,10 +583,16 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ + "futures-channel", "futures-core", + "futures-io", + "futures-macro", + "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", + "slab", ] [[package]] @@ -1562,6 +1641,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "subtle" version = "2.5.0" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index afe62afd..871323f5 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -24,3 +24,5 @@ ssh-key = { version = "0.6", features = ["serde", "ed25519", "dsa", "crypto", "r [dev-dependencies] env_logger = "0.11" tokio = { version = "1.37", features = ["full"] } +clap = "4.5" +futures = "0.3" diff --git a/rust/examples/adminapi.rs b/rust/examples/adminapi.rs index b9b1f2d8..26e80aec 100644 --- a/rust/examples/adminapi.rs +++ b/rust/examples/adminapi.rs @@ -1,34 +1,24 @@ -use adminapi::api::new_object; -use adminapi::filter::*; +use adminapi::cli::parse_filter_args; use adminapi::query::Query; #[tokio::main] async fn main() -> anyhow::Result<()> { env_logger::init(); + let mut args = std::env::args(); + args.next(); + + let filters = parse_filter_args(args)?; + let query = Query::builder() - .filter("hostname", regexp(".*payment-staging.*")) - .filter("os", not(empty())) + .filters(filters) .restrict(["hostname", "responsible_admin", "os"]) .build(); - // The fields are unused, but this example still should show, that you can have the query return structured data - #[allow(dead_code)] - #[derive(Clone, Debug, serde::Deserialize)] - struct MyServer { - hostname: String, - os: String, - responsible_admin: Vec, - } - - let servers = query.request_typed::().await?; + let servers = query.request().await?; for server in servers.into_iter() { println!("{server:#?}"); } - let obj = new_object("service_group").await?; - - println!("{obj:#?}"); - Ok(()) } diff --git a/rust/examples/parse_args.rs b/rust/examples/parse_args.rs new file mode 100644 index 00000000..2cf80a51 --- /dev/null +++ b/rust/examples/parse_args.rs @@ -0,0 +1,15 @@ +use adminapi::cli::parse_filter_args; + +pub fn main() { + let mut args = std::env::args(); + args.next(); + + match parse_filter_args(args) { + Ok(arg) => { + println!("{arg:#?}"); + } + Err(err) => { + eprintln!("{err:#?}"); + } + } +} diff --git a/rust/examples/prepare_bookworm.rs b/rust/examples/prepare_bookworm.rs new file mode 100644 index 00000000..7e9a6aa6 --- /dev/null +++ b/rust/examples/prepare_bookworm.rs @@ -0,0 +1,64 @@ +use adminapi::cli::parse_filter_args; +use adminapi::commit::AttributeValue; +use adminapi::query::Query; + +#[tokio::main] +pub async fn main() -> anyhow::Result<()> { + let clap = clap::Command::new("prepare_bookworm") + .arg(clap::arg!([QUERY]).action(clap::ArgAction::Append).help("Query for the preparation").value_parser(clap::value_parser!(String)).num_args(1..).required(true)) + .arg(clap::arg!(--"puppet-environment" "Sets an optional puppet environment").value_parser(clap::value_parser!(String)).required(false)) + .arg(clap::arg!(--"maintenance" "Sets the servers to maintenance").action(clap::ArgAction::SetTrue).required(false)); + + let matches = clap.get_matches(); + let query = matches.get_many::("QUERY").unwrap().cloned().collect::>(); + let filters = parse_filter_args(query.into_iter())?; + + let query = Query::builder() + .filters(filters) + .restrict(["os", "repositories", "puppet_environment", "state"]) + .build(); + let response = query.request().await?; + let mut updates = vec![]; + + for mut server in response.all() { + let AttributeValue::String(base_os) = server.get("os") else { + return Err(anyhow::anyhow!("Unexpected value for os")); + }; + + server.set("os", "bookworm")?; + let AttributeValue::Array(repos) = server.get("repositories") else { + return Err(anyhow::anyhow!("Unexpected value for repositories")); + }; + + for repo in repos { + let AttributeValue::String(repo) = repo else { + return Err(anyhow::anyhow!("Unexpected value for repository")); + }; + + if !repo.contains(&base_os) { + continue; + } + + server.add("repositories", repo.replace(&base_os, "bookworm"))?; + server.remove("repositories", repo)?; + + if matches.get_flag("maintenance") { + server.set("state", "maintenance")?; + } + + if let Some(environment) = matches.get_one::("puppet-environment") { + if !server.get("puppet_environment").is_null() { + return Err(anyhow::anyhow!("Puppet environment is already set. Aborting!")); + } + + server.set("puppet_environment", environment.clone())?; + } + } + + updates.push(async move { server.commit().await }); + } + + futures::future::try_join_all(updates).await?; + + Ok(()) +} diff --git a/rust/src/cli.rs b/rust/src/cli.rs new file mode 100644 index 00000000..6d8d2fd1 --- /dev/null +++ b/rust/src/cli.rs @@ -0,0 +1,138 @@ +use std::str::Chars; + +use crate::filter::{AttributeFilter, FilterValue, IntoFilterValue}; +use crate::filter; + +pub fn parse_filter_args(args: impl Iterator + 'static) -> anyhow::Result { + let mut filter = AttributeFilter::default(); + + for arg in args { + let mut split = arg.split('='); + let Some(attribute) = split.next() else { + continue; + }; + let tail = split.collect::(); + if tail.is_empty() { + return Err(anyhow::anyhow!("Attribute value is missing")); + } + + filter.insert(attribute.to_string(), parse_filter_arg(tail)); + } + + Ok(filter) +} + +pub fn parse_filter_arg(arg: String) -> FilterValue { + let mut chars = arg.chars(); + + lookup_function(&mut chars) +} + +pub fn lookup_function(chars: &mut Chars) -> FilterValue { + let mut buffer = String::new(); + let mut fn_name = String::new(); + let mut depth = 0; + let mut inner = Vec::new(); + + for char in chars.by_ref() { + if char == '(' { + depth += 1; + } + if char == ')' { + depth -= 1; + } + + if char == '(' && depth == 1 { + fn_name.extend(buffer.drain(0..)); + } + + + if char == '(' && depth == 1 { + continue; + } + + if char == ')' && depth == 0 { + continue; + } + + if depth == 0 && char == ' ' { + inner.push(buffer.clone()); + buffer.clear(); + + continue; + } + + buffer.push(char); + } + + if fn_name.is_empty() && inner.is_empty() { + return buffer.into_filter_value(); + } + + if !buffer.is_empty() { + inner.push(buffer); + } + + let filter_fn = get_filter_function(&fn_name.to_lowercase()); + let mut inner_filters = inner.into_iter().map(|filter| { + let mut chars = filter.chars(); + + lookup_function(&mut chars) + }).collect::>(); + + if inner_filters.len() == 1 { + filter_fn(inner_filters.pop().unwrap()) + } else { + filter_fn(FilterValue::Array(inner_filters)) + } +} + +fn get_filter_function(name: &str) -> Box FilterValue> { + match name { + "all" => { + Box::new(filter::all) + } + "any" => { + Box::new(filter::any) + } + "containedby" => { + Box::new(filter::contained_by) + } + "containedonlyby" => { + Box::new(filter::contained_only_by) + } + "contains" => { + Box::new(filter::contains) + } + "empty" => { + Box::new(|_| filter::empty()) + } + "greaterthan" => { + Box::new(filter::greater_than) + } + "greaterthanorequals" => { + Box::new(filter::greater_than_or_equals) + } + "lessthan" => { + Box::new(filter::less_than) + } + "lessthanorequals" => { + Box::new(filter::less_than_or_equals) + } + "not" => { + Box::new(filter::not) + } + "overlaps" => { + Box::new(filter::overlaps) + } + "regexp" => { + Box::new(filter::regexp) + } + "startswith" => { + Box::new(filter::starts_with) + } + _name => { + Box::new(IntoFilterValue::into_filter_value) + } + } +} diff --git a/rust/src/commit.rs b/rust/src/commit.rs index 06179bd7..9902a52c 100644 --- a/rust/src/commit.rs +++ b/rust/src/commit.rs @@ -85,6 +85,12 @@ impl IntoAttributeValue for String { } } +impl IntoAttributeValue for &String { + fn into_attribute_value(self) -> AttributeValue { + AttributeValue::String(self.clone()) + } +} + impl IntoAttributeValue for () { fn into_attribute_value(self) -> AttributeValue { AttributeValue::Null diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 0b10ec7e..90ba1076 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -6,3 +6,4 @@ pub mod config; pub mod filter; pub mod new_object; pub mod query; +pub mod cli; diff --git a/rust/src/query.rs b/rust/src/query.rs index 5b5c0e26..242a2583 100644 --- a/rust/src/query.rs +++ b/rust/src/query.rs @@ -40,6 +40,13 @@ impl QueryBuilder { Default::default() } + pub fn filters(mut self, filter: AttributeFilter) -> Self { + self.0.filters.extend(filter); + + self + } + + pub fn filter( mut self, attribute: impl ToString, From e102f281c31586279e407fd1c5388a4cedbee8cf Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Thu, 25 Apr 2024 16:50:59 +0200 Subject: [PATCH 09/21] Add parameter for debian release --- rust/Cargo.lock | 366 ++++-------------- rust/Cargo.toml | 7 +- ...pare_bookworm.rs => prepare_os_upgrade.rs} | 49 ++- rust/src/api.rs | 4 +- rust/src/cli.rs | 78 ++-- rust/src/lib.rs | 2 +- rust/src/query.rs | 1 - 7 files changed, 153 insertions(+), 354 deletions(-) rename rust/examples/{prepare_bookworm.rs => prepare_os_upgrade.rs} (51%) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 9d0bbf0a..43fb24ca 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -146,12 +146,6 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" - [[package]] name = "block-buffer" version = "0.10.4" @@ -240,22 +234,6 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - [[package]] name = "cpufeatures" version = "0.2.12" @@ -406,15 +384,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - [[package]] name = "env_filter" version = "0.1.0" @@ -438,28 +407,6 @@ dependencies = [ "log", ] -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "fastrand" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" - [[package]] name = "ff" version = "0.13.0" @@ -482,21 +429,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.2.1" @@ -634,31 +566,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "h2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" - [[package]] name = "hermit-abi" version = "0.3.9" @@ -729,7 +636,6 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2", "http", "http-body", "httparse", @@ -741,18 +647,19 @@ dependencies = [ ] [[package]] -name = "hyper-tls" -version = "0.6.0" +name = "hyper-rustls" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" dependencies = [ - "bytes", - "http-body-util", + "futures-util", + "http", "hyper", "hyper-util", - "native-tls", + "rustls", + "rustls-pki-types", "tokio", - "tokio-native-tls", + "tokio-rustls", "tower-service", ] @@ -786,16 +693,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown", -] - [[package]] name = "inout" version = "0.1.3" @@ -832,7 +729,7 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" dependencies = [ - "spin", + "spin 0.5.2", ] [[package]] @@ -847,12 +744,6 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" -[[package]] -name = "linux-raw-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" - [[package]] name = "lock_api" version = "0.4.11" @@ -901,24 +792,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "num-bigint-dig" version = "0.8.4" @@ -991,50 +864,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "openssl" -version = "0.10.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" -dependencies = [ - "bitflags 2.5.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "p256" version = "0.13.2" @@ -1164,12 +993,6 @@ dependencies = [ "spki", ] -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - [[package]] name = "platforms" version = "3.4.0" @@ -1244,7 +1067,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags 1.3.2", + "bitflags", ] [[package]] @@ -1284,37 +1107,36 @@ checksum = "3e6cc1e89e689536eb5aeede61520e874df5a4707df811cd5da4aa5fbb2aae19" dependencies = [ "base64", "bytes", - "encoding_rs", "futures-core", "futures-util", - "h2", "http", "http-body", "http-body-util", "hyper", - "hyper-tls", + "hyper-rustls", "hyper-util", "ipnet", "js-sys", "log", "mime", - "native-tls", "once_cell", "percent-encoding", "pin-project-lite", + "rustls", "rustls-pemfile", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", - "tokio-native-tls", + "tokio-rustls", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "webpki-roots", "winreg", ] @@ -1328,6 +1150,21 @@ dependencies = [ "subtle", ] +[[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 0.9.8", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "rsa" version = "0.9.6" @@ -1365,16 +1202,17 @@ dependencies = [ ] [[package]] -name = "rustix" -version = "0.38.32" +name = "rustls" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +checksum = "99008d7ad0bbbea527ec27bddbc0e432c5b87d8175178cee68d2eec9c4a1813c" dependencies = [ - "bitflags 2.5.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", + "log", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", ] [[package]] @@ -1394,19 +1232,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" [[package]] -name = "ryu" -version = "1.0.17" +name = "rustls-webpki" +version = "0.102.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] [[package]] -name = "schannel" -version = "0.1.23" +name = "ryu" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "scopeguard" @@ -1428,29 +1268,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "security-framework" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "semver" version = "1.0.22" @@ -1572,6 +1389,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "spki" version = "0.7.3" @@ -1670,39 +1493,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if", - "fastrand", - "rustix", - "windows-sys 0.52.0", -] - [[package]] name = "thiserror" version = "1.0.58" @@ -1769,27 +1559,14 @@ dependencies = [ ] [[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.10" +name = "tokio-rustls" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", + "rustls", + "rustls-pki-types", "tokio", - "tracing", ] [[package]] @@ -1873,6 +1650,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.5.0" @@ -1890,12 +1673,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version_check" version = "0.9.4" @@ -1993,6 +1770,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "windows-sys" version = "0.48.0" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 871323f5..455ce008 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -12,7 +12,7 @@ repository = "https://github.com/innogames/serveradmin/" anyhow = "1.0" hmac = "0.12" log = "0.4" -reqwest = { version = "0.12", features = ["json"] } +reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" sha1 = "0.10" @@ -26,3 +26,8 @@ env_logger = "0.11" tokio = { version = "1.37", features = ["full"] } clap = "4.5" futures = "0.3" + +[profile.release] +lto = true +opt-level = "z" +strip = true diff --git a/rust/examples/prepare_bookworm.rs b/rust/examples/prepare_os_upgrade.rs similarity index 51% rename from rust/examples/prepare_bookworm.rs rename to rust/examples/prepare_os_upgrade.rs index 7e9a6aa6..aff5ec30 100644 --- a/rust/examples/prepare_bookworm.rs +++ b/rust/examples/prepare_os_upgrade.rs @@ -4,13 +4,44 @@ use adminapi::query::Query; #[tokio::main] pub async fn main() -> anyhow::Result<()> { - let clap = clap::Command::new("prepare_bookworm") - .arg(clap::arg!([QUERY]).action(clap::ArgAction::Append).help("Query for the preparation").value_parser(clap::value_parser!(String)).num_args(1..).required(true)) - .arg(clap::arg!(--"puppet-environment" "Sets an optional puppet environment").value_parser(clap::value_parser!(String)).required(false)) - .arg(clap::arg!(--"maintenance" "Sets the servers to maintenance").action(clap::ArgAction::SetTrue).required(false)); + let clap = clap::Command::new("prepare_os_upgrade") + .author("Yannik, yannik.schwieger@innogames.com") + .arg(clap::arg!([OS_RELEASE] "Sets the OS release name").required(true)) + .arg( + clap::arg!([QUERY]) + .action(clap::ArgAction::Append) + .help("Query for the preparation") + .value_parser(clap::value_parser!(String)) + .num_args(1..) + .required(true), + ) + .arg( + clap::arg!(--"puppet-environment" "Sets an optional puppet environment") + .value_parser(clap::value_parser!(String)) + .required(false), + ) + .arg( + clap::arg!(--"maintenance" "Sets the servers to maintenance") + .action(clap::ArgAction::SetTrue) + .required(false), + ); let matches = clap.get_matches(); - let query = matches.get_many::("QUERY").unwrap().cloned().collect::>(); + let os_release = matches + .get_one::("OS_RELEASE") + .expect("OS_RELEASE is required!"); + let query = matches + .get_many::("QUERY") + .unwrap() + .cloned() + .collect::>(); + + if !["buster", "bookworm", "trixie"].contains(&os_release.as_str()) { + return Err(anyhow::anyhow!( + "Error: {os_release} is not a valid Debian release!" + )); + } + let filters = parse_filter_args(query.into_iter())?; let query = Query::builder() @@ -25,7 +56,6 @@ pub async fn main() -> anyhow::Result<()> { return Err(anyhow::anyhow!("Unexpected value for os")); }; - server.set("os", "bookworm")?; let AttributeValue::Array(repos) = server.get("repositories") else { return Err(anyhow::anyhow!("Unexpected value for repositories")); }; @@ -39,8 +69,9 @@ pub async fn main() -> anyhow::Result<()> { continue; } - server.add("repositories", repo.replace(&base_os, "bookworm"))?; + server.add("repositories", repo.replace(&base_os, os_release))?; server.remove("repositories", repo)?; + server.set("os", os_release.to_string())?; if matches.get_flag("maintenance") { server.set("state", "maintenance")?; @@ -48,7 +79,9 @@ pub async fn main() -> anyhow::Result<()> { if let Some(environment) = matches.get_one::("puppet-environment") { if !server.get("puppet_environment").is_null() { - return Err(anyhow::anyhow!("Puppet environment is already set. Aborting!")); + return Err(anyhow::anyhow!( + "Puppet environment is already set. Aborting!" + )); } server.set("puppet_environment", environment.clone())?; diff --git a/rust/src/api.rs b/rust/src/api.rs index 08ea72df..6a68b5a4 100644 --- a/rust/src/api.rs +++ b/rust/src/api.rs @@ -3,7 +3,9 @@ use std::fmt::Display; use signature::Signer; use ssh_encoding::Encode; -use crate::commit::{AttributeChange, AttributeValue, Changeset, Commit, Dataset, IntoAttributeValue}; +use crate::commit::{ + AttributeChange, AttributeValue, Changeset, Commit, Dataset, IntoAttributeValue, +}; use crate::config::Config; use crate::query::Query; diff --git a/rust/src/cli.rs b/rust/src/cli.rs index 6d8d2fd1..ab6e7c0f 100644 --- a/rust/src/cli.rs +++ b/rust/src/cli.rs @@ -1,9 +1,11 @@ use std::str::Chars; -use crate::filter::{AttributeFilter, FilterValue, IntoFilterValue}; use crate::filter; +use crate::filter::{AttributeFilter, FilterValue, IntoFilterValue}; -pub fn parse_filter_args(args: impl Iterator + 'static) -> anyhow::Result { +pub fn parse_filter_args( + args: impl Iterator + 'static, +) -> anyhow::Result { let mut filter = AttributeFilter::default(); for arg in args { @@ -46,7 +48,6 @@ pub fn lookup_function(chars: &mut Chars) -> FilterValue { fn_name.extend(buffer.drain(0..)); } - if char == '(' && depth == 1 { continue; } @@ -74,11 +75,14 @@ pub fn lookup_function(chars: &mut Chars) -> FilterValue { } let filter_fn = get_filter_function(&fn_name.to_lowercase()); - let mut inner_filters = inner.into_iter().map(|filter| { - let mut chars = filter.chars(); + let mut inner_filters = inner + .into_iter() + .map(|filter| { + let mut chars = filter.chars(); - lookup_function(&mut chars) - }).collect::>(); + lookup_function(&mut chars) + }) + .collect::>(); if inner_filters.len() == 1 { filter_fn(inner_filters.pop().unwrap()) @@ -89,50 +93,20 @@ pub fn lookup_function(chars: &mut Chars) -> FilterValue { fn get_filter_function(name: &str) -> Box FilterValue> { match name { - "all" => { - Box::new(filter::all) - } - "any" => { - Box::new(filter::any) - } - "containedby" => { - Box::new(filter::contained_by) - } - "containedonlyby" => { - Box::new(filter::contained_only_by) - } - "contains" => { - Box::new(filter::contains) - } - "empty" => { - Box::new(|_| filter::empty()) - } - "greaterthan" => { - Box::new(filter::greater_than) - } - "greaterthanorequals" => { - Box::new(filter::greater_than_or_equals) - } - "lessthan" => { - Box::new(filter::less_than) - } - "lessthanorequals" => { - Box::new(filter::less_than_or_equals) - } - "not" => { - Box::new(filter::not) - } - "overlaps" => { - Box::new(filter::overlaps) - } - "regexp" => { - Box::new(filter::regexp) - } - "startswith" => { - Box::new(filter::starts_with) - } - _name => { - Box::new(IntoFilterValue::into_filter_value) - } + "all" => Box::new(filter::all), + "any" => Box::new(filter::any), + "containedby" => Box::new(filter::contained_by), + "containedonlyby" => Box::new(filter::contained_only_by), + "contains" => Box::new(filter::contains), + "empty" => Box::new(|_| filter::empty()), + "greaterthan" => Box::new(filter::greater_than), + "greaterthanorequals" => Box::new(filter::greater_than_or_equals), + "lessthan" => Box::new(filter::less_than), + "lessthanorequals" => Box::new(filter::less_than_or_equals), + "not" => Box::new(filter::not), + "overlaps" => Box::new(filter::overlaps), + "regexp" => Box::new(filter::regexp), + "startswith" => Box::new(filter::starts_with), + _name => Box::new(IntoFilterValue::into_filter_value), } } diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 90ba1076..78fdcd8a 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -1,9 +1,9 @@ pub const API_VERSION: &str = "4.9.0"; pub mod api; +pub mod cli; pub mod commit; pub mod config; pub mod filter; pub mod new_object; pub mod query; -pub mod cli; diff --git a/rust/src/query.rs b/rust/src/query.rs index 242a2583..673701d0 100644 --- a/rust/src/query.rs +++ b/rust/src/query.rs @@ -46,7 +46,6 @@ impl QueryBuilder { self } - pub fn filter( mut self, attribute: impl ToString, From 9b2279da441edbc448cc62ff50ae4046078f6602 Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Tue, 14 May 2024 12:54:14 +0200 Subject: [PATCH 10/21] rust: Upgrade dependencies, Fixup examples, Add deferred method --- rust/Cargo.lock | 364 ++++++++++++++++------------ rust/examples/prepare_os_upgrade.rs | 2 +- rust/src/api.rs | 8 + rust/src/commit.rs | 6 +- rust/src/config.rs | 13 +- rust/src/new_object.rs | 66 ++++- 6 files changed, 297 insertions(+), 162 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 43fb24ca..1b1dd4b4 100644 --- a/rust/Cargo.lock +++ b/rust/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", ] @@ -49,47 +49,48 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -97,21 +98,21 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.82" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "autocfg" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -130,9 +131,9 @@ checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" @@ -142,9 +143,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bitflags" -version = "1.3.2" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "block-buffer" @@ -175,9 +176,9 @@ checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.94" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" +checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490" [[package]] name = "cfg-if" @@ -197,18 +198,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.4" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" dependencies = [ "anstream", "anstyle", @@ -218,15 +219,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "const-oid" @@ -267,16 +268,15 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.1.2" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", "cpufeatures", "curve25519-dalek-derive", "digest", "fiat-crypto", - "platforms", "rustc_version", "subtle", ] @@ -419,9 +419,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c007b1ae3abe1cb6f85a16305acd418b7ca6343b953633fee2b76d8f108b830f" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "fnv" @@ -540,9 +540,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -551,9 +551,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "group" @@ -604,12 +604,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", - "futures-core", + "futures-util", "http", "http-body", "pin-project-lite", @@ -617,9 +617,9 @@ dependencies = [ [[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 = "humantime" @@ -629,9 +629,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +checksum = "c4fe55fb7a772d59a5ff1dfbff4fe0258d19b89fec4b233e75d35d5d2316badc" dependencies = [ "bytes", "futures-channel", @@ -648,9 +648,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.26.0" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" +checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" dependencies = [ "futures-util", "http", @@ -661,13 +661,14 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", + "webpki-roots", ] [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" dependencies = [ "bytes", "futures-channel", @@ -708,6 +709,12 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + [[package]] name = "itoa" version = "1.0.11" @@ -725,18 +732,18 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin 0.5.2", + "spin", ] [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libm" @@ -746,9 +753,9 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[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", @@ -756,15 +763,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "mime" @@ -774,9 +781,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] @@ -820,9 +827,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -831,9 +838,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", "libm", @@ -851,9 +858,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" dependencies = [ "memchr", ] @@ -904,9 +911,9 @@ dependencies = [ [[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", @@ -914,15 +921,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 0.48.5", + "windows-targets 0.52.5", ] [[package]] @@ -993,12 +1000,6 @@ dependencies = [ "spki", ] -[[package]] -name = "platforms" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" - [[package]] name = "ppv-lite86" version = "0.2.17" @@ -1016,13 +1017,60 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] +[[package]] +name = "quinn" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" +dependencies = [ + "bytes", + "rand", + "ring", + "rustc-hash", + "rustls", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" +dependencies = [ + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "quote" version = "1.0.36" @@ -1038,6 +1086,7 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ + "libc", "rand_chacha", "rand_core", ] @@ -1063,18 +1112,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", ] [[package]] name = "regex" -version = "1.10.4" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", @@ -1084,9 +1133,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -1095,15 +1144,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e6cc1e89e689536eb5aeede61520e874df5a4707df811cd5da4aa5fbb2aae19" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" dependencies = [ "base64", "bytes", @@ -1122,6 +1171,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", + "quinn", "rustls", "rustls-pemfile", "rustls-pki-types", @@ -1160,7 +1210,7 @@ dependencies = [ "cfg-if", "getrandom", "libc", - "spin 0.9.8", + "spin", "untrusted", "windows-sys 0.52.0", ] @@ -1188,9 +1238,15 @@ dependencies = [ [[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 = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc_version" @@ -1203,11 +1259,11 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.3" +version = "0.23.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99008d7ad0bbbea527ec27bddbc0e432c5b87d8175178cee68d2eec9c4a1813c" +checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" dependencies = [ - "log", + "once_cell", "ring", "rustls-pki-types", "rustls-webpki", @@ -1227,15 +1283,15 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.4.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "rustls-webpki" -version = "0.102.2" +version = "0.102.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" dependencies = [ "ring", "rustls-pki-types", @@ -1244,9 +1300,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "scopeguard" @@ -1270,24 +1326,24 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.198" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.198" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", @@ -1296,9 +1352,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "itoa", "ryu", @@ -1341,9 +1397,9 @@ 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", ] @@ -1375,20 +1431,14 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "spin" version = "0.9.8" @@ -1472,15 +1522,15 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.60" +version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", @@ -1489,24 +1539,24 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", @@ -1515,9 +1565,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" dependencies = [ "tinyvec_macros", ] @@ -1530,9 +1580,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", @@ -1549,9 +1599,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", @@ -1560,9 +1610,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ "rustls", "rustls-pki-types", @@ -1582,7 +1632,6 @@ dependencies = [ "tokio", "tower-layer", "tower-service", - "tracing", ] [[package]] @@ -1603,11 +1652,22 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tracing-core" version = "0.1.32" @@ -1658,9 +1718,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -1669,9 +1729,9 @@ dependencies = [ [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "version_check" @@ -1772,9 +1832,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.1" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" dependencies = [ "rustls-pki-types", ] @@ -1930,6 +1990,6 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/rust/examples/prepare_os_upgrade.rs b/rust/examples/prepare_os_upgrade.rs index aff5ec30..ba4e6113 100644 --- a/rust/examples/prepare_os_upgrade.rs +++ b/rust/examples/prepare_os_upgrade.rs @@ -36,7 +36,7 @@ pub async fn main() -> anyhow::Result<()> { .cloned() .collect::>(); - if !["buster", "bookworm", "trixie"].contains(&os_release.as_str()) { + if !["buster", "bullseye", "bookworm", "trixie"].contains(&os_release.as_str()) { return Err(anyhow::anyhow!( "Error: {os_release} is not a valid Debian release!" )); diff --git a/rust/src/api.rs b/rust/src/api.rs index 6a68b5a4..4ded5eb4 100644 --- a/rust/src/api.rs +++ b/rust/src/api.rs @@ -186,6 +186,10 @@ impl Server { )); } + if self.attributes.get(&attribute).as_array().unwrap().contains(&value) { + return Ok(self); + } + self.attributes.add(attribute.clone(), value.clone()); let entry = self .changes @@ -216,6 +220,10 @@ impl Server { )); } + if !self.attributes.get(&attribute).as_array().unwrap().contains(&value) { + return Ok(self); + } + self.attributes.remove(attribute.clone(), value.clone()); let entry = self .changes diff --git a/rust/src/commit.rs b/rust/src/commit.rs index 9902a52c..bd257fd5 100644 --- a/rust/src/commit.rs +++ b/rust/src/commit.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use serde_json::Number; @@ -187,4 +187,8 @@ impl Dataset { pub fn get(&self, name: &str) -> AttributeValue { self.0.get(name).cloned().unwrap_or(AttributeValue::Null) } + + pub fn keys(&self) -> HashSet { + self.0.keys().cloned().collect() + } } diff --git a/rust/src/config.rs b/rust/src/config.rs index cf5c7281..f812548f 100644 --- a/rust/src/config.rs +++ b/rust/src/config.rs @@ -7,6 +7,11 @@ use signature::Signer; use crate::API_VERSION; +pub const ENV_NAME_BASE_URL: &'static str = "SERVERADMIN_BASE_URL"; +pub const ENV_NAME_TOKEN: &'static str = "SERVERADMIN_TOKEN"; +pub const ENV_NAME_KEY_PATH: &'static str = "SERVERADMIN_KEY_PATH"; +pub const ENV_NAME_SSH_AGENT: &'static str = "SSH_AUTH_SOCK"; + #[derive(Clone, Debug, Default)] pub struct Config { pub base_url: String, @@ -27,26 +32,26 @@ pub enum SshSigner { impl Config { pub fn build_from_environment() -> anyhow::Result { let config = Self { - base_url: std::env::var("SERVERADMIN_BASE_URL")? + base_url: std::env::var(ENV_NAME_BASE_URL)? .trim_end_matches('/') .trim_end_matches("/api") .to_string(), api_version: API_VERSION.to_string(), ssh_signer: Self::get_signing_key()?, - auth_token: std::env::var("SERVERADMIN_TOKEN").ok(), + auth_token: std::env::var(ENV_NAME_TOKEN).ok(), }; Ok(config) } fn get_signing_key() -> anyhow::Result> { - if let Ok(path) = std::env::var("SERVERADMIN_KEY_PATH") { + if let Ok(path) = std::env::var(ENV_NAME_KEY_PATH) { let key = ssh_key::PrivateKey::read_openssh_file(Path::new(&path))?; return Ok(Some(SshSigner::Key(Box::new(key)))); } - let path = std::env::var("SSH_AUTH_SOCK").unwrap_or_default(); + let path = std::env::var(ENV_NAME_SSH_AGENT).unwrap_or_default(); let client = ssh_agent_client_rs::Client::connect(Path::new(&path)) .map_err(|error| log::error!("Unable to connect to SSH agent: {error}")) .ok(); diff --git a/rust/src/new_object.rs b/rust/src/new_object.rs index 56666117..541e2be9 100644 --- a/rust/src/new_object.rs +++ b/rust/src/new_object.rs @@ -1,11 +1,14 @@ use std::ops::{Deref, DerefMut}; use crate::api::{commit_changes, new_object, NewObjectResponse, Server}; -use crate::commit::{AttributeValue, Commit, Dataset}; +use crate::commit::{AttributeValue, Changeset, Commit, Dataset}; use crate::query::Query; +#[derive(Clone, Debug)] pub struct NewObject { + object_id: Option, attributes: Dataset, + changeset: Changeset, } impl NewObject { @@ -13,9 +16,36 @@ impl NewObject { let servertype = servertype.to_string(); let NewObjectResponse { result } = new_object(&servertype).await?; - Ok(Self { attributes: result }) + Ok(Self { + object_id: None, + attributes: result, + changeset: Default::default(), + }) } + pub async fn get_or_create(servertype: impl ToString, hostname: impl ToString) -> anyhow::Result { + let mut new_object = Self::request_new(servertype).await?; + + if let Ok(server) = Query::builder() + .filter("hostname", hostname.to_string()) + .restrict(new_object.attributes.keys()) + .build() + .request() + .await? + .one() { + new_object.object_id = Some(server.object_id); + new_object.attributes = server.attributes; + } + + Ok(new_object) + } + + /// + /// Commits the new object + /// + /// The changes done in [NewObject::deferred] will not be submitted yet, but the returned [Server] + /// object is preloaded with them. + /// pub async fn commit(self) -> anyhow::Result { let AttributeValue::String(hostname) = self.attributes.get("hostname") else { return Err(anyhow::anyhow!("Required attribute 'hostname' is missing")); @@ -23,12 +53,40 @@ impl NewObject { let commit = Commit::new().create(self.attributes); commit_changes(&commit).await?; - Query::builder() + let mut server = Query::builder() .filter("hostname", hostname) .build() .request() .await? - .one() + .one()?; + + server.changes = self.changeset; + + Ok(server) + } + + /// + /// The deferred method allows you to pre-update the newly created object + /// + /// It allows you to already prepare relations before other objects are created, making the new + /// object creation with relations a very simple 2-stage process. + /// + /// The input [Server] object for the `callback` is loaded with the [Dataset] of the current + /// object. Keep in mind though, that there are some attributes that are only filled after the + /// object is created + /// + pub fn deferred(&mut self, callback: impl FnOnce(&mut Server) -> R) -> R { + let mut server = Server { + object_id: 0, + attributes: self.attributes.clone(), + changes: std::mem::take(&mut self.changeset), + }; + + let output = callback(&mut server); + + self.changeset = std::mem::take(&mut server.changes); + + output } } From 91e2a73cc4bd0695abd1b6d13ec3d5dad3c285bb Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Thu, 4 Jul 2024 16:43:25 +0200 Subject: [PATCH 11/21] rust: Run code formatting and cleanup --- rust/src/api.rs | 16 ++++++++++++++-- rust/src/config.rs | 8 ++++---- rust/src/new_object.rs | 8 ++++++-- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/rust/src/api.rs b/rust/src/api.rs index 4ded5eb4..84e5d141 100644 --- a/rust/src/api.rs +++ b/rust/src/api.rs @@ -186,7 +186,13 @@ impl Server { )); } - if self.attributes.get(&attribute).as_array().unwrap().contains(&value) { + if self + .attributes + .get(&attribute) + .as_array() + .unwrap() + .contains(&value) + { return Ok(self); } @@ -220,7 +226,13 @@ impl Server { )); } - if !self.attributes.get(&attribute).as_array().unwrap().contains(&value) { + if !self + .attributes + .get(&attribute) + .as_array() + .unwrap() + .contains(&value) + { return Ok(self); } diff --git a/rust/src/config.rs b/rust/src/config.rs index f812548f..6516d487 100644 --- a/rust/src/config.rs +++ b/rust/src/config.rs @@ -7,10 +7,10 @@ use signature::Signer; use crate::API_VERSION; -pub const ENV_NAME_BASE_URL: &'static str = "SERVERADMIN_BASE_URL"; -pub const ENV_NAME_TOKEN: &'static str = "SERVERADMIN_TOKEN"; -pub const ENV_NAME_KEY_PATH: &'static str = "SERVERADMIN_KEY_PATH"; -pub const ENV_NAME_SSH_AGENT: &'static str = "SSH_AUTH_SOCK"; +pub const ENV_NAME_BASE_URL: &str = "SERVERADMIN_BASE_URL"; +pub const ENV_NAME_TOKEN: &str = "SERVERADMIN_TOKEN"; +pub const ENV_NAME_KEY_PATH: &str = "SERVERADMIN_KEY_PATH"; +pub const ENV_NAME_SSH_AGENT: &str = "SSH_AUTH_SOCK"; #[derive(Clone, Debug, Default)] pub struct Config { diff --git a/rust/src/new_object.rs b/rust/src/new_object.rs index 541e2be9..741e46b3 100644 --- a/rust/src/new_object.rs +++ b/rust/src/new_object.rs @@ -23,7 +23,10 @@ impl NewObject { }) } - pub async fn get_or_create(servertype: impl ToString, hostname: impl ToString) -> anyhow::Result { + pub async fn get_or_create( + servertype: impl ToString, + hostname: impl ToString, + ) -> anyhow::Result { let mut new_object = Self::request_new(servertype).await?; if let Ok(server) = Query::builder() @@ -32,7 +35,8 @@ impl NewObject { .build() .request() .await? - .one() { + .one() + { new_object.object_id = Some(server.object_id); new_object.attributes = server.attributes; } From 5ba08b4886afcf0fe3e4c3655ae11ecc66703670 Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Thu, 4 Jul 2024 17:27:46 +0200 Subject: [PATCH 12/21] rust: Improve NewObject::get_or_create to properly upsert objects --- rust/Cargo.lock | 58 ++++++++++++++++++++--------------------- rust/Cargo.toml | 4 +-- rust/examples/commit.rs | 8 +++--- rust/src/api.rs | 2 +- rust/src/commit.rs | 16 +++++++++++- rust/src/new_object.rs | 48 +++++++++++++++++++++------------- 6 files changed, 81 insertions(+), 55 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 1b1dd4b4..ba99d0d3 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -929,7 +929,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -1289,9 +1289,9 @@ checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "rustls-webpki" -version = "0.102.4" +version = "0.102.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" +checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78" dependencies = [ "ring", "rustls-pki-types", @@ -1854,7 +1854,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -1874,18 +1874,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "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", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -1896,9 +1896,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -1908,9 +1908,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -1920,15 +1920,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -1938,9 +1938,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -1950,9 +1950,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -1962,9 +1962,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -1974,9 +1974,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winreg" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 455ce008..fbf8adc5 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -18,12 +18,12 @@ serde_json = "1.0" sha1 = "0.10" signature = "2.2" ssh-agent-client-rs = "0.9" -ssh-encoding = { version = "0.2.0", features = ["base64"] } +ssh-encoding = { version = "0.2", features = ["base64"] } ssh-key = { version = "0.6", features = ["serde", "ed25519", "dsa", "crypto", "rsa"] } [dev-dependencies] env_logger = "0.11" -tokio = { version = "1.37", features = ["full"] } +tokio = { version = "1.38", features = ["full"] } clap = "4.5" futures = "0.3" diff --git a/rust/examples/commit.rs b/rust/examples/commit.rs index 8ed1b523..12019557 100644 --- a/rust/examples/commit.rs +++ b/rust/examples/commit.rs @@ -25,10 +25,10 @@ pub async fn main() -> anyhow::Result<()> { let mut new_sg = NewObject::request_new("service_group").await?; new_sg - .set("hostname", "yannik-adminapi-rs-2.test.sg") - .set("project", "test") - .add("responsible_admin", "yannik.schwieger") - .add("protocol_ports_inbound", "tcp443"); + .set("hostname", "yannik-adminapi-rs-2.test.sg")? + .set("project", "test")? + .add("responsible_admin", "yannik.schwieger")? + .add("protocol_ports_inbound", "tcp443")?; let mut created_sg = new_sg.commit().await?; created_sg .add("protocol_ports_inbound", "tcp80")? diff --git a/rust/src/api.rs b/rust/src/api.rs index 84e5d141..12b5214e 100644 --- a/rust/src/api.rs +++ b/rust/src/api.rs @@ -159,7 +159,7 @@ impl Server { if self.attributes.get(&attribute).is_array() { return Err(anyhow::anyhow!( - "Attribute is a multi attribute, set is not supported!" + "Attribute {attribute} is a multi attribute, set is not supported!" )); } diff --git a/rust/src/commit.rs b/rust/src/commit.rs index bd257fd5..91cfeb03 100644 --- a/rust/src/commit.rs +++ b/rust/src/commit.rs @@ -60,7 +60,21 @@ impl Commit { self } - pub fn update(mut self, changeset: Changeset) -> Self { + pub fn update(mut self, mut changeset: Changeset) -> Self { + let filtered = changeset + .attributes + .into_iter() + .filter(|(_, change)| { + if let AttributeChange::Update { new, old } = change { + return new.ne(old); + } + + true + }) + .collect(); + + changeset.attributes = filtered; + self.changed.push(changeset); self diff --git a/rust/src/new_object.rs b/rust/src/new_object.rs index 741e46b3..9f0582a7 100644 --- a/rust/src/new_object.rs +++ b/rust/src/new_object.rs @@ -1,14 +1,14 @@ use std::ops::{Deref, DerefMut}; use crate::api::{commit_changes, new_object, NewObjectResponse, Server}; -use crate::commit::{AttributeValue, Changeset, Commit, Dataset}; +use crate::commit::{AttributeValue, Changeset, Commit}; use crate::query::Query; #[derive(Clone, Debug)] pub struct NewObject { object_id: Option, - attributes: Dataset, - changeset: Changeset, + server: Server, + deferred_changes: Changeset, } impl NewObject { @@ -18,8 +18,12 @@ impl NewObject { Ok(Self { object_id: None, - attributes: result, - changeset: Default::default(), + server: Server { + object_id: 0, + attributes: result, + changes: Default::default(), + }, + deferred_changes: Default::default(), }) } @@ -31,31 +35,39 @@ impl NewObject { if let Ok(server) = Query::builder() .filter("hostname", hostname.to_string()) - .restrict(new_object.attributes.keys()) + .restrict(new_object.server.attributes.keys()) .build() .request() .await? .one() { new_object.object_id = Some(server.object_id); - new_object.attributes = server.attributes; + new_object.server = server; } Ok(new_object) } + pub fn is_new(&self) -> bool { + self.object_id.is_none() + } + /// /// Commits the new object /// /// The changes done in [NewObject::deferred] will not be submitted yet, but the returned [Server] /// object is preloaded with them. /// - pub async fn commit(self) -> anyhow::Result { - let AttributeValue::String(hostname) = self.attributes.get("hostname") else { + pub async fn commit(mut self) -> anyhow::Result { + let AttributeValue::String(hostname) = self.server.get("hostname") else { return Err(anyhow::anyhow!("Required attribute 'hostname' is missing")); }; - let commit = Commit::new().create(self.attributes); - commit_changes(&commit).await?; + + if self.is_new() { + commit_changes(&Commit::new().create(self.server.attributes)).await?; + } else { + self.server.commit().await?; + } let mut server = Query::builder() .filter("hostname", hostname) @@ -64,7 +76,7 @@ impl NewObject { .await? .one()?; - server.changes = self.changeset; + server.changes = self.deferred_changes; Ok(server) } @@ -82,28 +94,28 @@ impl NewObject { pub fn deferred(&mut self, callback: impl FnOnce(&mut Server) -> R) -> R { let mut server = Server { object_id: 0, - attributes: self.attributes.clone(), - changes: std::mem::take(&mut self.changeset), + attributes: self.server.attributes.clone(), + changes: std::mem::take(&mut self.deferred_changes), }; let output = callback(&mut server); - self.changeset = std::mem::take(&mut server.changes); + self.deferred_changes = std::mem::take(&mut server.changes); output } } impl Deref for NewObject { - type Target = Dataset; + type Target = Server; fn deref(&self) -> &Self::Target { - &self.attributes + &self.server } } impl DerefMut for NewObject { fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.attributes + &mut self.server } } From 73c80ff545405c5947de9b7d6b46f77546ac1c2a Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Thu, 4 Jul 2024 18:04:36 +0200 Subject: [PATCH 13/21] Add method to check if the Server object wsas changed --- rust/src/new_object.rs | 8 ++++++++ rust/src/query.rs | 20 +++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/rust/src/new_object.rs b/rust/src/new_object.rs index 9f0582a7..a7499914 100644 --- a/rust/src/new_object.rs +++ b/rust/src/new_object.rs @@ -52,6 +52,14 @@ impl NewObject { self.object_id.is_none() } + pub fn has_changes(&self) -> bool { + if self.is_new() { + return true; + } + + self.server.has_changes() + } + /// /// Commits the new object /// diff --git a/rust/src/query.rs b/rust/src/query.rs index 673701d0..1c9a80cb 100644 --- a/rust/src/query.rs +++ b/rust/src/query.rs @@ -1,7 +1,7 @@ use std::collections::HashSet; -use crate::api::{commit_changes, query_objects, CommitResponse, QueryResponse, Server}; -use crate::commit::{Changeset, Commit}; +use crate::api::{commit_changes, CommitResponse, query_objects, QueryResponse, Server}; +use crate::commit::{AttributeChange, Changeset, Commit}; use crate::filter::{AttributeFilter, IntoFilterValue}; #[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)] @@ -58,7 +58,7 @@ impl QueryBuilder { self } - pub fn restrict>(mut self, attributes: I) -> Self { + pub fn restrict>(mut self, attributes: I) -> Self { self.0.restrict = HashSet::from_iter(attributes.into_iter().map(|v| v.to_string())); self @@ -88,4 +88,18 @@ impl Server { commit_changes(&commit).await } + + pub fn has_changes(&self) -> bool { + self.changes + .attributes + .iter() + .filter(|(_, change)| { + if let AttributeChange::Update { new, old } = change { + return new.ne(old); + } + + true + }) + .find(|_| true).is_some() + } } From 254de234491fd555093d4dcfc8baac33b4b97076 Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Thu, 11 Jul 2024 18:24:36 +0200 Subject: [PATCH 14/21] rust: Add has_changes for Changeset --- rust/src/api.rs | 1 + rust/src/commit.rs | 24 ++++++++++++++++++++++++ rust/src/new_object.rs | 2 +- rust/src/query.rs | 16 +++------------- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/rust/src/api.rs b/rust/src/api.rs index 12b5214e..fded75c7 100644 --- a/rust/src/api.rs +++ b/rust/src/api.rs @@ -209,6 +209,7 @@ impl Server { if let AttributeChange::Multi { add, .. } = entry { add.push(value); } + Ok(self) } diff --git a/rust/src/commit.rs b/rust/src/commit.rs index 91cfeb03..199117ca 100644 --- a/rust/src/commit.rs +++ b/rust/src/commit.rs @@ -45,6 +45,26 @@ pub trait IntoAttributeValue { fn into_attribute_value(self) -> AttributeValue; } +impl Changeset { + pub fn has_changes(&self) -> bool { + self.attributes + .iter() + .filter(|(_, change)| { + if let AttributeChange::Multi { add, remove } = change { + return add.len() + remove.len() > 0; + } + + if let AttributeChange::Update { new, old } = change { + return new.ne(old); + } + + true + }) + .find(|_| true) + .is_some() + } +} + impl Commit { pub fn new() -> Self { Self { @@ -69,6 +89,10 @@ impl Commit { return new.ne(old); } + if let AttributeChange::Multi { add, remove } = change { + return add.len() + remove.len() > 0; + } + true }) .collect(); diff --git a/rust/src/new_object.rs b/rust/src/new_object.rs index a7499914..8278ed7f 100644 --- a/rust/src/new_object.rs +++ b/rust/src/new_object.rs @@ -57,7 +57,7 @@ impl NewObject { return true; } - self.server.has_changes() + self.server.has_changes() || self.deferred_changes.has_changes() } /// diff --git a/rust/src/query.rs b/rust/src/query.rs index 1c9a80cb..f2308722 100644 --- a/rust/src/query.rs +++ b/rust/src/query.rs @@ -1,6 +1,6 @@ use std::collections::HashSet; -use crate::api::{commit_changes, CommitResponse, query_objects, QueryResponse, Server}; +use crate::api::{commit_changes, query_objects, CommitResponse, QueryResponse, Server}; use crate::commit::{AttributeChange, Changeset, Commit}; use crate::filter::{AttributeFilter, IntoFilterValue}; @@ -58,7 +58,7 @@ impl QueryBuilder { self } - pub fn restrict>(mut self, attributes: I) -> Self { + pub fn restrict>(mut self, attributes: I) -> Self { self.0.restrict = HashSet::from_iter(attributes.into_iter().map(|v| v.to_string())); self @@ -90,16 +90,6 @@ impl Server { } pub fn has_changes(&self) -> bool { - self.changes - .attributes - .iter() - .filter(|(_, change)| { - if let AttributeChange::Update { new, old } = change { - return new.ne(old); - } - - true - }) - .find(|_| true).is_some() + self.changes.has_changes() } } From 25ba3ee98d8fd5454beccbb5853fd4c6d61e5791 Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Thu, 11 Jul 2024 18:28:30 +0200 Subject: [PATCH 15/21] rust: Run code fixing tools --- rust/src/commit.rs | 3 +-- rust/src/query.rs | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/rust/src/commit.rs b/rust/src/commit.rs index 199117ca..ef33b3c4 100644 --- a/rust/src/commit.rs +++ b/rust/src/commit.rs @@ -60,8 +60,7 @@ impl Changeset { true }) - .find(|_| true) - .is_some() + .any(|_| true) } } diff --git a/rust/src/query.rs b/rust/src/query.rs index f2308722..3c7ff84b 100644 --- a/rust/src/query.rs +++ b/rust/src/query.rs @@ -1,7 +1,7 @@ use std::collections::HashSet; use crate::api::{commit_changes, query_objects, CommitResponse, QueryResponse, Server}; -use crate::commit::{AttributeChange, Changeset, Commit}; +use crate::commit::{Changeset, Commit}; use crate::filter::{AttributeFilter, IntoFilterValue}; #[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)] From 6135f0aeea3fad969cfacab1abc17429719377d7 Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Tue, 5 Nov 2024 11:27:24 +0100 Subject: [PATCH 16/21] Update prepare_os_upgrade example --- rust/examples/prepare_os_upgrade.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/rust/examples/prepare_os_upgrade.rs b/rust/examples/prepare_os_upgrade.rs index ba4e6113..d9ac5613 100644 --- a/rust/examples/prepare_os_upgrade.rs +++ b/rust/examples/prepare_os_upgrade.rs @@ -4,6 +4,8 @@ use adminapi::query::Query; #[tokio::main] pub async fn main() -> anyhow::Result<()> { + env_logger::init(); + let clap = clap::Command::new("prepare_os_upgrade") .author("Yannik, yannik.schwieger@innogames.com") .arg(clap::arg!([OS_RELEASE] "Sets the OS release name").required(true)) @@ -60,6 +62,11 @@ pub async fn main() -> anyhow::Result<()> { return Err(anyhow::anyhow!("Unexpected value for repositories")); }; + server.set("os", os_release.to_string())?; + if matches.get_flag("maintenance") { + server.set("state", "maintenance")?; + } + for repo in repos { let AttributeValue::String(repo) = repo else { return Err(anyhow::anyhow!("Unexpected value for repository")); @@ -71,11 +78,6 @@ pub async fn main() -> anyhow::Result<()> { server.add("repositories", repo.replace(&base_os, os_release))?; server.remove("repositories", repo)?; - server.set("os", os_release.to_string())?; - - if matches.get_flag("maintenance") { - server.set("state", "maintenance")?; - } if let Some(environment) = matches.get_one::("puppet-environment") { if !server.get("puppet_environment").is_null() { From c795b277c17f056a6835a426b6a70f8ccd440ce8 Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Tue, 5 Nov 2024 11:29:11 +0100 Subject: [PATCH 17/21] Update dependencies --- rust/Cargo.lock | 847 +++++++++++++++++++++++++++++------------------- 1 file changed, 520 insertions(+), 327 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index ba99d0d3..fc1190c8 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -4,18 +4,18 @@ version = 3 [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "adminapi" @@ -49,9 +49,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.14" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -64,63 +64,63 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.3" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets", ] [[package]] @@ -170,15 +170,18 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "cc" -version = "1.0.104" +version = "1.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490" +checksum = "67b9470d453346108f93a59222a9a1a5724db32d0a4727b7ab7ace4b4d822dc9" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -186,6 +189,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "cipher" version = "0.4.4" @@ -198,18 +207,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.8" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.8" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -219,15 +228,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "colorchoice" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "const-oid" @@ -237,9 +246,9 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -314,6 +323,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "dsa" version = "0.6.3" @@ -386,9 +406,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" dependencies = [ "log", "regex", @@ -396,9 +416,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.3" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" dependencies = [ "anstream", "anstyle", @@ -440,9 +460,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -455,9 +475,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -465,15 +485,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -482,15 +502,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -499,21 +519,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -551,9 +571,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "group" @@ -594,9 +614,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", @@ -617,9 +637,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "humantime" @@ -629,9 +649,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4fe55fb7a772d59a5ff1dfbff4fe0258d19b89fec4b233e75d35d5d2316badc" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ "bytes", "futures-channel", @@ -648,9 +668,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http", @@ -666,9 +686,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.6" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -679,19 +699,147 @@ dependencies = [ "pin-project-lite", "socket2", "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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +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", +] + [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", ] [[package]] @@ -705,15 +853,15 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is_terminal_polyfill" -version = "1.70.0" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itoa" @@ -723,9 +871,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -741,15 +889,21 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.155" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "litemap" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" [[package]] name = "lock_api" @@ -781,22 +935,23 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "adler2", ] [[package]] name = "mio" -version = "0.8.11" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -846,30 +1001,20 @@ dependencies = [ "libm", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "object" -version = "0.36.1" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "p256" @@ -929,7 +1074,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -947,31 +1092,11 @@ 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", -] - [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -1002,9 +1127,12 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "primeorder" @@ -1017,18 +1145,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] [[package]] name = "quinn" -version = "0.11.2" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" dependencies = [ "bytes", "pin-project-lite", @@ -1036,6 +1164,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", + "socket2", "thiserror", "tokio", "tracing", @@ -1043,9 +1172,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.3" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" dependencies = [ "bytes", "rand", @@ -1060,22 +1189,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.2" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" +checksum = "e346e016eacfff12233c243718197ca12f148c84e1e84268a896699b41c71780" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -1112,18 +1242,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.10.5" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -1133,9 +1263,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", @@ -1144,15 +1274,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.5" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64", "bytes", @@ -1187,7 +1317,7 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "webpki-roots", - "winreg", + "windows-registry", ] [[package]] @@ -1244,24 +1374,24 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" -version = "1.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustls" -version = "0.23.10" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ "once_cell", "ring", @@ -1273,25 +1403,24 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.7.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" -version = "0.102.5" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", "rustls-pki-types", @@ -1332,18 +1461,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.203" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", @@ -1352,11 +1481,12 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -1395,6 +1525,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -1491,9 +1627,9 @@ dependencies = [ [[package]] name = "ssh-key" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca9b366a80cf18bb6406f4cf4d10aebfb46140a8c0c33f666a144c5c76ecbafc" +checksum = "3b86f5297f0f04d08cabaa0f6bff7cb6aec4d9c3b49d87990d63da9d9156a8c3" dependencies = [ "dsa", "ed25519-dalek", @@ -1514,6 +1650,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "strsim" version = "0.11.1" @@ -1528,9 +1670,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.68" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -1542,32 +1684,56 @@ name = "sync_wrapper" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -1580,28 +1746,27 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", @@ -1619,32 +1784,11 @@ dependencies = [ "tokio", ] -[[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" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -1653,21 +1797,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "pin-project-lite", - "tracing-attributes", "tracing-core", ] -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "tracing-core" version = "0.1.32" @@ -1689,26 +1821,11 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "untrusted" @@ -1718,15 +1835,27 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" 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 = "utf8parse" version = "0.2.2" @@ -1735,9 +1864,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "want" @@ -1756,19 +1885,20 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", @@ -1781,9 +1911,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -1793,9 +1923,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1803,9 +1933,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", @@ -1816,15 +1946,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -1832,20 +1962,41 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.3" +version = "0.26.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" +checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" dependencies = [ "rustls-pki-types", ] [[package]] -name = "windows-sys" -version = "0.48.0" +name = "windows-registry" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ - "windows-targets 0.48.5", + "windows-result", + "windows-strings", + "windows-targets", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets", ] [[package]] @@ -1854,22 +2005,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] -name = "windows-targets" -version = "0.48.5" +name = "windows-sys" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "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", + "windows-targets", ] [[package]] @@ -1878,46 +2023,28 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[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.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[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.6" @@ -1932,60 +2059,104 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] -name = "windows_i686_msvc" +name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" +name = "windows_x86_64_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] -name = "windows_x86_64_gnu" +name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" +name = "write16" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" [[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" +name = "writeable" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" +name = "yoke" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] [[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" +name = "yoke-derive" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] [[package]] -name = "winreg" -version = "0.52.0" +name = "zerocopy" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "cfg-if", - "windows-sys 0.48.0", + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[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", + "synstructure", ] [[package]] @@ -1993,3 +2164,25 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] From c761245ee43fffdfb32cc0a708c0afbcbf71a3bc Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Tue, 26 Nov 2024 09:30:30 +0100 Subject: [PATCH 18/21] Improve error reporting, Add some helper functions to implement api methods manually --- rust/src/api.rs | 36 ++++++++++++++++++++++++++++++++++-- rust/src/commit.rs | 6 ++++++ rust/src/config.rs | 10 ++++++---- rust/src/new_object.rs | 26 ++++++++++++++++++++++++-- 4 files changed, 70 insertions(+), 8 deletions(-) diff --git a/rust/src/api.rs b/rust/src/api.rs index fded75c7..07723586 100644 --- a/rust/src/api.rs +++ b/rust/src/api.rs @@ -27,6 +27,8 @@ pub struct NewObjectResponse { #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] pub struct CommitResponse { pub status: String, + #[serde(default)] + pub message: Option, } pub async fn query_objects( @@ -55,9 +57,22 @@ pub async fn new_object(servertype: impl Display) -> anyhow::Result anyhow::Result { let config = Config::build_from_environment()?; let response = request_api(COMMIT_ENDPOINT, serde_json::to_value(commit)?, config).await?; - let response = response.error_for_status()?; + let status = response.status(); + let body = response.json::().await?; - Ok(response.json().await?) + if status.is_client_error() || status.is_server_error() { + return Err(anyhow::anyhow!("Unable to process request").context(format!("{:?}", body))); + } + + if body.status == "error" { + return Err(anyhow::anyhow!( + "Error while committing {}", + body.message + .unwrap_or_else(|| String::from("Unknown commit error")) + )); + } + + Ok(body) } pub async fn request_api( @@ -149,6 +164,12 @@ fn calculate_app_id(token: &String) -> String { } impl Server { + pub fn clear(&mut self, attribute: impl ToString) -> anyhow::Result<&mut Self> { + self.attributes.clear(attribute.to_string()); + + Ok(self) + } + pub fn set( &mut self, attribute: impl ToString, @@ -264,6 +285,17 @@ impl Server { set } + + /// Rolls back the changes. + /// + /// Returns the reverted changes + pub fn rollback(&mut self) -> Changeset { + let old_changes = self.changeset(); + + self.changes = Changeset::default(); + + old_changes + } } impl QueryResponse { diff --git a/rust/src/commit.rs b/rust/src/commit.rs index ef33b3c4..0ee0e22a 100644 --- a/rust/src/commit.rs +++ b/rust/src/commit.rs @@ -172,6 +172,12 @@ impl Dataset { Self(Default::default()) } + pub fn clear(&mut self, name: impl ToString) -> &mut Self { + self.0.remove(&name.to_string()); + + self + } + pub fn set( &mut self, name: impl ToString, diff --git a/rust/src/config.rs b/rust/src/config.rs index 6516d487..02542a90 100644 --- a/rust/src/config.rs +++ b/rust/src/config.rs @@ -1,7 +1,6 @@ use std::fmt::{Debug, Formatter}; use std::path::Path; -use std::rc::Rc; -use std::sync::Mutex; +use std::sync::{Arc, Mutex}; use signature::Signer; @@ -24,7 +23,7 @@ pub struct Config { pub enum SshSigner { Agent( Box, - Box>>, + Box>>, ), Key(Box), } @@ -72,7 +71,7 @@ impl Config { return Ok(Some(SshSigner::Agent( Box::new(key), - Box::new(Rc::new(Mutex::new(client))), + Box::new(Arc::new(Mutex::new(client))), ))); } } @@ -120,3 +119,6 @@ impl Signer for SshSigner { } } } + +unsafe impl Send for SshSigner {} +unsafe impl Sync for SshSigner {} diff --git a/rust/src/new_object.rs b/rust/src/new_object.rs index 8278ed7f..f5449b0c 100644 --- a/rust/src/new_object.rs +++ b/rust/src/new_object.rs @@ -1,7 +1,7 @@ use std::ops::{Deref, DerefMut}; use crate::api::{commit_changes, new_object, NewObjectResponse, Server}; -use crate::commit::{AttributeValue, Changeset, Commit}; +use crate::commit::{AttributeValue, Changeset, Commit, Dataset}; use crate::query::Query; #[derive(Clone, Debug)] @@ -12,6 +12,18 @@ pub struct NewObject { } impl NewObject { + pub fn from_dataset(dataset: Dataset) -> Self { + Self { + object_id: None, + server: Server { + object_id: 0, + attributes: dataset, + changes: Default::default(), + }, + deferred_changes: Default::default(), + } + } + pub async fn request_new(servertype: impl ToString) -> anyhow::Result { let servertype = servertype.to_string(); let NewObjectResponse { result } = new_object(&servertype).await?; @@ -31,7 +43,7 @@ impl NewObject { servertype: impl ToString, hostname: impl ToString, ) -> anyhow::Result { - let mut new_object = Self::request_new(servertype).await?; + let mut new_object = Self::request_new(servertype.to_string()).await?; if let Ok(server) = Query::builder() .filter("hostname", hostname.to_string()) @@ -89,6 +101,16 @@ impl NewObject { Ok(server) } + /// + /// Gets the initial commit data and the follow-up commit of deferred changes + /// + pub fn get_commit(self) -> (Commit, Commit) { + ( + Commit::new().create(self.server.attributes), + Commit::new().update(self.deferred_changes), + ) + } + /// /// The deferred method allows you to pre-update the newly created object /// From 66b597b7cc0ed19ca7fe16444a92927cba203aee Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Wed, 19 Mar 2025 09:32:39 +0100 Subject: [PATCH 19/21] rust: Make status field optional --- rust/src/api.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rust/src/api.rs b/rust/src/api.rs index 07723586..bbe95681 100644 --- a/rust/src/api.rs +++ b/rust/src/api.rs @@ -15,6 +15,7 @@ pub const NEW_OBJECT_ENDPOINT: &str = "/api/dataset/new_object"; #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] pub struct QueryResponse { + #[serde(default)] pub status: String, pub result: Vec>, } @@ -26,6 +27,7 @@ pub struct NewObjectResponse { #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] pub struct CommitResponse { + #[serde(default)] pub status: String, #[serde(default)] pub message: Option, From 3d77eb093355956a0ef3676d7a22d57edc563231 Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Wed, 7 May 2025 17:00:15 +0200 Subject: [PATCH 20/21] Demote ssh-agent error message to debug message, Add "adminclone" example --- rust/examples/adminclone.rs | 79 +++++++++++++++++++++++++++++++++++++ rust/src/config.rs | 2 +- 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 rust/examples/adminclone.rs diff --git a/rust/examples/adminclone.rs b/rust/examples/adminclone.rs new file mode 100644 index 00000000..0f5be7f0 --- /dev/null +++ b/rust/examples/adminclone.rs @@ -0,0 +1,79 @@ +use std::collections::HashSet; + +use adminapi::{new_object::NewObject, query::Query}; + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + env_logger::init(); + let args = clap::Command::new("adminclone") + .arg(clap::arg!( "The origin object identified by it's hostname")) + .arg( + clap::arg!(-a "Adds a value to a multi-attribute field") + .action(clap::ArgAction::Append), + ) + .arg( + clap::arg!(-d "Deletes a value from a multi-attribute field") + .action(clap::ArgAction::Append), + ) + .arg( + clap::arg!(-s "Sets the value for an attribute") + .action(clap::ArgAction::Append), + ) + .arg(clap::arg!(-c "Clears an attribute").action(clap::ArgAction::Append)) + .get_matches(); + + let hostname = args + .get_one::("from") + .ok_or(anyhow::anyhow!("Missing from argument")) + .cloned()?; + + let mut query = Query::builder().filter("hostname", hostname).build(); + query.restrict = HashSet::new(); // We want to get all attributes here + let mut server = query.request().await?.one()?; + server.attributes.clear("hostname"); + let servertype = server.get("servertype"); + let mut server = NewObject::from_dataset(server.attributes); + server.set("servertype", servertype)?; + + for pair in args.get_many::("set_attribute").unwrap_or_default() { + let Some((name, value)) = pair.split_once("=") else { + return Err(anyhow::anyhow!("Got attribute set without '=': {pair}")); + }; + + server.set(name.to_string(), value.to_string())?; + } + + for pair in args.get_many::("add_attribute").unwrap_or_default() { + let Some((name, value)) = pair.split_once("=") else { + return Err(anyhow::anyhow!("Got attribute set without '=': {pair}")); + }; + + server.attributes.add(name.to_string(), value.to_string()); + } + + for pair in args + .get_many::("delete_attribute") + .unwrap_or_default() + { + let Some((name, value)) = pair.split_once("=") else { + return Err(anyhow::anyhow!("Got attribute set without '=': {pair}")); + }; + + server + .attributes + .remove(name.to_string(), value.to_string()); + } + + for name in args + .get_many::("clear_attribute") + .unwrap_or_default() + { + server.attributes.clear(name.to_string()); + } + + let server = server.commit().await?; + + log::info!("Server cloned"); + + Ok(()) +} diff --git a/rust/src/config.rs b/rust/src/config.rs index 02542a90..3bb40820 100644 --- a/rust/src/config.rs +++ b/rust/src/config.rs @@ -52,7 +52,7 @@ impl Config { let path = std::env::var(ENV_NAME_SSH_AGENT).unwrap_or_default(); let client = ssh_agent_client_rs::Client::connect(Path::new(&path)) - .map_err(|error| log::error!("Unable to connect to SSH agent: {error}")) + .map_err(|error| log::debug!("Unable to connect to SSH agent: {error}")) .ok(); if let Some(mut client) = client { From 2f3b0f5fad698bfd2f4078411c203e7f1aa5eb2d Mon Sep 17 00:00:00 2001 From: Yannik_Sc Date: Wed, 21 May 2025 13:05:50 +0200 Subject: [PATCH 21/21] Update dependencies --- rust/Cargo.lock | 876 +++++++++++++++++++++--------------- rust/examples/adminclone.rs | 2 +- 2 files changed, 505 insertions(+), 373 deletions(-) diff --git a/rust/Cargo.lock b/rust/Cargo.lock index fc1190c8..391c9a13 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "adminapi" @@ -49,9 +49,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" dependencies = [ "anstyle", "anstyle-parse", @@ -64,55 +64,56 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" dependencies = [ "anstyle", + "once_cell_polyfill", "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.92" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -137,15 +138,15 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "block-buffer" @@ -158,9 +159,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "byteorder" @@ -170,24 +171,24 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.1.34" +version = "1.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b9470d453346108f93a59222a9a1a5724db32d0a4727b7ab7ace4b4d822dc9" +checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" dependencies = [ "shlex", ] [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "cfg_aliases" @@ -207,18 +208,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" dependencies = [ "anstream", "anstyle", @@ -228,15 +229,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "const-oid" @@ -246,9 +247,9 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -260,7 +261,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -303,9 +304,9 @@ dependencies = [ [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "zeroize", @@ -398,7 +399,7 @@ dependencies = [ "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -406,9 +407,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" dependencies = [ "log", "regex", @@ -416,24 +417,24 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.5" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" dependencies = [ "anstream", "anstyle", "env_filter", - "humantime", + "jiff", "log", ] [[package]] name = "ff" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -560,13 +561,29 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", + "js-sys", "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", ] [[package]] @@ -582,16 +599,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.4", "subtle", ] -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hmac" version = "0.12.1" @@ -603,9 +614,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -624,12 +635,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", + "futures-core", "http", "http-body", "pin-project-lite", @@ -637,21 +648,15 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" - -[[package]] -name = "humantime" -version = "2.1.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hyper" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", @@ -668,11 +673,10 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "futures-util", "http", "hyper", "hyper-util", @@ -686,16 +690,21 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" dependencies = [ + "base64", "bytes", "futures-channel", + "futures-core", "futures-util", "http", "http-body", "hyper", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", "socket2", "tokio", @@ -705,21 +714,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -728,31 +738,11 @@ dependencies = [ "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" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -760,67 +750,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "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", -] - [[package]] name = "idna" version = "1.0.3" @@ -834,9 +811,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -844,18 +821,28 @@ dependencies = [ [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "generic-array", ] [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] [[package]] name = "is_terminal_polyfill" @@ -865,16 +852,41 @@ checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jiff" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" +dependencies = [ + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde", +] + +[[package]] +name = "jiff-static" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -889,27 +901,27 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.161" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libm" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "litemap" -version = "0.7.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -917,41 +929,40 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] -name = "memchr" -version = "2.7.4" +name = "lru-slab" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] -name = "mime" -version = "0.3.17" +name = "memchr" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ - "hermit-abi", "libc", - "wasi", - "windows-sys 0.52.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] @@ -966,7 +977,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand", + "rand 0.8.5", "smallvec", "zeroize", ] @@ -1003,18 +1014,24 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" [[package]] name = "p256" @@ -1030,9 +1047,9 @@ dependencies = [ [[package]] name = "p384" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70786f51bcc69f6a4c0360e063a4cac5419ef7c5cd5b3c99ad70f3be5ba79209" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" dependencies = [ "ecdsa", "elliptic-curve", @@ -1050,15 +1067,15 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "rand_core", + "rand_core 0.6.4", "sha2", ] [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -1066,9 +1083,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", @@ -1094,9 +1111,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1125,11 +1142,35 @@ dependencies = [ "spki", ] +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] @@ -1145,53 +1186,59 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" dependencies = [ "bytes", + "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash", "rustls", "socket2", - "thiserror", + "thiserror 2.0.12", "tokio", "tracing", + "web-time", ] [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" dependencies = [ "bytes", - "rand", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.1", "ring", "rustc-hash", "rustls", + "rustls-pki-types", "slab", - "thiserror", + "thiserror 2.0.12", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.6" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e346e016eacfff12233c243718197ca12f148c84e1e84268a896699b41c71780" +checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" dependencies = [ "cfg_aliases", "libc", @@ -1203,22 +1250,37 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", ] [[package]] @@ -1228,7 +1290,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -1237,14 +1309,23 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", ] [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" dependencies = [ "bitflags", ] @@ -1263,9 +1344,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -1280,30 +1361,25 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "eabf4c97d9130e2bf606614eb937e86edac8292eaa6f422f995d7e8de1eb1813" dependencies = [ "base64", "bytes", "futures-core", - "futures-util", "http", "http-body", "http-body-util", "hyper", "hyper-rustls", "hyper-util", - "ipnet", "js-sys", "log", - "mime", - "once_cell", "percent-encoding", "pin-project-lite", "quinn", "rustls", - "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", @@ -1311,13 +1387,14 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-rustls", + "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", "webpki-roots", - "windows-registry", ] [[package]] @@ -1332,24 +1409,23 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.16", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] [[package]] name = "rsa" -version = "0.9.6" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" dependencies = [ "const-oid", "digest", @@ -1358,7 +1434,7 @@ dependencies = [ "num-traits", "pkcs1", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sha2", "signature", "spki", @@ -1368,15 +1444,15 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustc_version" @@ -1389,9 +1465,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.16" +version = "0.23.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" dependencies = [ "once_cell", "ring", @@ -1402,36 +1478,37 @@ dependencies = [ ] [[package]] -name = "rustls-pemfile" -version = "2.2.0" +name = "rustls-pki-types" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ - "rustls-pki-types", + "web-time", + "zeroize", ] -[[package]] -name = "rustls-pki-types" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" - [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ "ring", "rustls-pki-types", "untrusted", ] +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "scopeguard" @@ -1455,24 +1532,24 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "serde" -version = "1.0.214" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", @@ -1481,9 +1558,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -1516,9 +1593,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -1533,9 +1610,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -1547,29 +1624,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.4", ] [[package]] name = "slab" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1601,7 +1675,7 @@ dependencies = [ "signature", "ssh-encoding", "ssh-key", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1637,7 +1711,7 @@ dependencies = [ "p256", "p384", "p521", - "rand_core", + "rand_core 0.6.4", "rsa", "sec1", "serde", @@ -1670,9 +1744,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.87" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote", @@ -1681,18 +1755,18 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -1701,18 +1775,38 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.68" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.12", ] [[package]] name = "thiserror-impl" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", @@ -1721,9 +1815,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -1731,9 +1825,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -1746,9 +1840,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.0" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", @@ -1764,9 +1858,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", @@ -1775,15 +1869,53 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls", - "rustls-pki-types", "tokio", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -1792,9 +1924,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", "tracing-core", @@ -1802,9 +1934,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", ] @@ -1817,15 +1949,15 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "untrusted" @@ -1835,21 +1967,15 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 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" @@ -1879,30 +2005,39 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", "syn", @@ -1911,21 +2046,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1933,9 +2069,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -1946,57 +2082,40 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] -name = "webpki-roots" -version = "0.26.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets", -] - -[[package]] -name = "windows-result" -version = "0.2.0" +name = "web-time" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ - "windows-targets", + "js-sys", + "wasm-bindgen", ] [[package]] -name = "windows-strings" -version = "0.1.0" +name = "webpki-roots" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502" dependencies = [ - "windows-result", - "windows-targets", + "rustls-pki-types", ] [[package]] @@ -2082,22 +2201,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "write16" -version = "1.0.0" +name = "wit-bindgen-rt" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "yoke" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -2107,9 +2229,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", @@ -2119,19 +2241,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", @@ -2140,18 +2261,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", @@ -2165,11 +2286,22 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -2178,9 +2310,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", diff --git a/rust/examples/adminclone.rs b/rust/examples/adminclone.rs index 0f5be7f0..90566f5f 100644 --- a/rust/examples/adminclone.rs +++ b/rust/examples/adminclone.rs @@ -71,7 +71,7 @@ async fn main() -> anyhow::Result<()> { server.attributes.clear(name.to_string()); } - let server = server.commit().await?; + server.commit().await?; log::info!("Server cloned");