diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 37af36ad03..09e72ad261 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[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 = "agama-autoinstall" @@ -18,7 +18,6 @@ dependencies = [ "agama-utils", "anyhow", "tempfile", - "thiserror 2.0.18", "tokio", "url", ] @@ -29,16 +28,13 @@ version = "0.1.0" dependencies = [ "agama-storage-client", "agama-utils", - "anyhow", "async-trait", "gettext-rs", - "regex", "serde", "serde_json", "test-context", "thiserror 2.0.18", "tokio", - "tokio-stream", "tokio-test", "tracing", "zbus", @@ -52,7 +48,6 @@ dependencies = [ "agama-transfer", "agama-utils", "anyhow", - "async-trait", "chrono", "clap", "console", @@ -61,7 +56,6 @@ dependencies = [ "indicatif", "inquire", "regex", - "reqwest", "serde", "serde_json", "tempfile", @@ -99,7 +93,6 @@ dependencies = [ "thiserror 2.0.18", "tokio", "tokio-stream", - "tokio-test", "tracing", "zbus", ] @@ -146,32 +139,22 @@ dependencies = [ name = "agama-lib" version = "1.0.0" dependencies = [ - "agama-l10n", - "agama-locale-data", - "agama-network", "agama-transfer", "agama-utils", "anyhow", - "async-trait", "chrono", - "curl", "env_logger", "fluent-uri 0.4.1", "fs_extra", - "futures-util", "home", "httpmock", "jsonschema", "jsonwebtoken", "log", "percent-encoding", - "regex", "reqwest", "serde", "serde_json", - "serde_repr", - "serde_with", - "strum", "tempfile", "thiserror 2.0.18", "tokio", @@ -183,7 +166,6 @@ dependencies = [ "utoipa", "uuid", "zbus", - "zypp-agama", ] [[package]] @@ -244,13 +226,10 @@ dependencies = [ "pin-project", "semver", "serde", - "serde_json", "serde_with", - "strum", "thiserror 2.0.18", "tokio", "tokio-stream", - "tokio-test", "tracing", "utoipa", "uuid", @@ -264,7 +243,6 @@ dependencies = [ "agama-utils", "anyhow", "async-trait", - "env_filter", "gettext-rs", "libsystemd", "strum", @@ -274,7 +252,6 @@ dependencies = [ "tracing", "tracing-journald", "tracing-subscriber", - "url", ] [[package]] @@ -332,25 +309,17 @@ dependencies = [ "config", "futures-util", "gethostname", - "gettext-rs", - "glob", "http-body-util", - "hyper 1.6.0", + "hyper 1.8.1", "hyper-util", "libsystemd", "openssl", "pam", "pin-project", - "rand 0.9.1", - "regex", + "rand 0.9.2", "sd-notify", "serde", "serde_json", - "serde_with", - "serde_yaml", - "strum", - "subprocess", - "tempfile", "test-context", "thiserror 2.0.18", "tokio", @@ -365,9 +334,7 @@ dependencies = [ "tracing-subscriber", "url", "utoipa", - "uuid", "zbus", - "zypp-agama", ] [[package]] @@ -376,7 +343,6 @@ version = "0.1.0" dependencies = [ "agama-bootloader", "agama-l10n", - "agama-locale-data", "agama-security", "agama-utils", "async-trait", @@ -385,16 +351,13 @@ dependencies = [ "glob", "i18n-format", "openssl", - "regex", "serde", - "serde_with", "serde_yaml", "strum", "suseconnect-agama", "tempfile", "thiserror 2.0.18", "tokio", - "tokio-stream", "tracing", "tracing-subscriber", "url", @@ -416,7 +379,6 @@ dependencies = [ "tokio", "tokio-stream", "tokio-test", - "tracing", "zbus", ] @@ -430,8 +392,6 @@ dependencies = [ "serde_json", "thiserror 2.0.18", "tokio", - "tokio-stream", - "tracing", "zbus", ] @@ -449,21 +409,16 @@ dependencies = [ name = "agama-users" version = "0.1.0" dependencies = [ - "agama-locale-data", "agama-utils", - "anyhow", "async-trait", "gettext-rs", - "regex", "serde", "test-context", "thiserror 2.0.18", "tokio", - "tokio-stream", "tokio-test", "tracing", "utoipa", - "zbus", ] [[package]] @@ -490,7 +445,6 @@ dependencies = [ "test-context", "thiserror 2.0.18", "tokio", - "tokio-stream", "tokio-test", "tracing", "url", @@ -502,23 +456,23 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.2.16", + "getrandom 0.3.4", "once_cell", "serde", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -547,12 +501,6 @@ dependencies = [ "cc", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -570,9 +518,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -585,44 +533,44 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[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.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", - "once_cell", - "windows-sys 0.59.0", + "once_cell_polyfill", + "windows-sys 0.61.2", ] [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "arraydeque" @@ -665,7 +613,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ - "event-listener 5.4.0", + "event-listener 5.4.1", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -684,9 +632,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -696,22 +644,21 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.23" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b37fc50485c4f3f736a4fb14199f6d5f5ba008d7f28fe710306c92780f004c07" +checksum = "d0f9ee0f6e02ffd7ad5816e9464499fba7b3effd01123b515c41d1697c43dad1" dependencies = [ - "brotli", - "futures-core", - "memchr", + "compression-codecs", + "compression-core", "pin-project-lite", "tokio", ] [[package]] name = "async-executor" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" dependencies = [ "async-task", "concurrent-queue", @@ -727,7 +674,7 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "async-executor", "async-io", "async-lock", @@ -738,30 +685,29 @@ dependencies = [ [[package]] name = "async-io" -version = "2.4.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" dependencies = [ - "async-lock", + "autocfg", "cfg-if", "concurrent-queue", "futures-io", "futures-lite", "parking", "polling", - "rustix 0.38.44", + "rustix 1.1.4", "slab", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ - "event-listener 5.4.0", + "event-listener 5.4.1", "event-listener-strategy", "pin-project-lite", ] @@ -777,21 +723,20 @@ dependencies = [ [[package]] name = "async-process" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "async-io", "async-lock", "async-signal", "async-task", "blocking", "cfg-if", - "event-listener 5.4.0", + "event-listener 5.4.1", "futures-lite", - "rustix 0.38.44", - "tracing", + "rustix 1.1.4", ] [[package]] @@ -802,14 +747,14 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] name = "async-signal" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ "async-io", "async-lock", @@ -817,17 +762,17 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.44", + "rustix 1.1.4", "signal-hook-registry", "slab", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "async-std" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730294c1c08c2e0f85759590518f6333f0d5a0a766a27d519c1b244c3dfd8a24" +checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" dependencies = [ "async-attributes", "async-channel 1.9.0", @@ -851,28 +796,6 @@ dependencies = [ "wasm-bindgen-futures", ] -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "async-task" version = "4.7.1" @@ -887,7 +810,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] @@ -898,9 +821,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[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 = "axum" @@ -914,10 +837,10 @@ dependencies = [ "base64 0.22.1", "bytes", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.6.0", + "hyper 1.8.1", "hyper-util", "itoa", "matchit", @@ -949,7 +872,7 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "http-body-util", "mime", @@ -974,7 +897,7 @@ dependencies = [ "fastrand", "futures-util", "headers", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "http-body-util", "mime", @@ -994,7 +917,7 @@ checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] @@ -1026,7 +949,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.11.0", "cexpr", "clang-sys", "itertools 0.12.1", @@ -1039,7 +962,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.101", + "syn 2.0.117", "which", ] @@ -1049,7 +972,7 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.11.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -1060,7 +983,7 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] @@ -1101,11 +1024,11 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -1125,11 +1048,11 @@ dependencies = [ [[package]] name = "blocking" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "async-task", "futures-io", "futures-lite", @@ -1144,9 +1067,9 @@ checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c" [[package]] name = "brotli" -version = "8.0.0" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf19e729cdbd51af9a397fb9ef8ac8378007b797f8273cfbfdf45dcaa316167b" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1165,15 +1088,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "bytecount" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" +checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" [[package]] name = "byteorder" @@ -1183,15 +1106,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "camino" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" [[package]] name = "cast" @@ -1201,10 +1124,11 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.20" +version = "1.2.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" dependencies = [ + "find-msvc-tools", "shlex", ] @@ -1219,9 +1143,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -1231,40 +1155,28 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.41" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-link 0.1.1", + "windows-link", ] [[package]] name = "chrono-tz" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efdce149c370f133a071ca8ef6ea340b7b88748ab0810097a9e2976eaa34b4f3" +checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" dependencies = [ "chrono", - "chrono-tz-build", "phf", ] -[[package]] -name = "chrono-tz-build" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f10f8c9340e31fc120ff885fcdb54a0b48e474bbd77cab557f0c30a3e569402" -dependencies = [ - "parse-zoneinfo", - "phf_codegen", -] - [[package]] name = "ciborium" version = "0.2.2" @@ -1294,9 +1206,9 @@ dependencies = [ [[package]] name = "cidr" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd1b64030216239a2e7c364b13cd96a2097ebf0dfe5025f2dedee14a23f2ab60" +checksum = "579504560394e388085d0c080ea587dfa5c15f7e251b4d5247d1e1a61d1d6928" dependencies = [ "serde", ] @@ -1314,9 +1226,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.37" +version = "4.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" +checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" dependencies = [ "clap_builder", "clap_derive", @@ -1324,18 +1236,18 @@ dependencies = [ [[package]] name = "clap-markdown" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ebc67e6266e14f8b31541c2f204724fa2ac7ad5c17d6f5908fbb92a60f42cff" +checksum = "d2a2617956a06d4885b490697b5307ebb09fec10b088afc18c81762d848c2339" dependencies = [ "clap", ] [[package]] name = "clap_builder" -version = "4.5.37" +version = "4.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" +checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" dependencies = [ "anstream", "anstyle", @@ -1346,36 +1258,36 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.48" +version = "4.5.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be8c97f3a6f02b9e24cadc12aaba75201d18754b53ea0a9d99642f806ccdb4c9" +checksum = "c757a3b7e39161a4e56f9365141ada2a6c915a8622c408ab6bb4b5d047371031" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "4.5.32" +version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] name = "clap_lex" -version = "0.7.4" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" [[package]] name = "clap_mangen" -version = "0.2.26" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "724842fa9b144f9b89b3f3d371a89f3455eea660361d13a554f68f8ae5d6c13a" +checksum = "439ea63a92086df93893164221ad4f24142086d535b3a0957b9b9bea2dc86301" dependencies = [ "clap", "roff", @@ -1383,9 +1295,25 @@ dependencies = [ [[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 = "compression-codecs" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" +dependencies = [ + "brotli", + "compression-core", +] + +[[package]] +name = "compression-core" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" [[package]] name = "concurrent-queue" @@ -1398,9 +1326,9 @@ dependencies = [ [[package]] name = "config" -version = "0.15.11" +version = "0.15.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595aae20e65c3be792d05818e8c63025294ac3cb7e200f11459063a352a6ef80" +checksum = "b30fa8254caad766fc03cb0ccae691e14bf3bd72bfff27f72802ce729551b3d6" dependencies = [ "async-trait", "convert_case", @@ -1408,7 +1336,8 @@ dependencies = [ "pathdiff", "ron", "rust-ini", - "serde", + "serde-untagged", + "serde_core", "serde_json", "toml", "winnow", @@ -1424,7 +1353,7 @@ dependencies = [ "encode_unicode", "libc", "once_cell", - "unicode-width 0.2.0", + "unicode-width 0.2.2", "windows-sys 0.59.0", ] @@ -1443,7 +1372,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "once_cell", "tiny-keccak", ] @@ -1470,9 +1399,9 @@ dependencies = [ [[package]] name = "cookie_store" -version = "0.21.1" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eac901828f88a5241ee0600950ab981148a18f2f756900ffba1b125ca6a3ef9" +checksum = "15b2c103cf610ec6cae3da84a766285b42fd16aad564758459e6ecf128c75206" dependencies = [ "cookie", "document-features", @@ -1496,6 +1425,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1513,9 +1452,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -1607,15 +1546,15 @@ dependencies = [ [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -1629,18 +1568,18 @@ checksum = "79fc3b6dd0b87ba36e565715bf9a2ced221311db47bd18011676f24a6066edbc" dependencies = [ "curl-sys", "libc", - "openssl-probe", + "openssl-probe 0.1.6", "openssl-sys", "schannel", - "socket2 0.6.0", + "socket2 0.6.2", "windows-sys 0.59.0", ] [[package]] name = "curl-sys" -version = "0.4.84+curl-8.17.0" +version = "0.4.85+curl-8.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abc4294dc41b882eaff37973c2ec3ae203d0091341ee68fbadd1d06e0c18a73b" +checksum = "c0efa6142b5ecc05f6d3eaa39e6af4888b9d3939273fb592c92b7088a8cf3fdb" dependencies = [ "cc", "libc", @@ -1672,7 +1611,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] @@ -1683,23 +1622,23 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] name = "data-encoding" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] @@ -1742,7 +1681,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] @@ -1756,18 +1695,18 @@ dependencies = [ [[package]] name = "document-features" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ "litrs", ] [[package]] name = "dyn-clone" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "either" @@ -1786,9 +1725,9 @@ dependencies = [ [[package]] name = "ena" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +checksum = "eabffdaee24bd1bf95c5ef7cec31260444317e72ea56c4c91750e8b7ee58d5f1" dependencies = [ "log", ] @@ -1810,15 +1749,15 @@ dependencies = [ [[package]] name = "endi" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" [[package]] name = "enumflags2" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" dependencies = [ "enumflags2_derive", "serde", @@ -1826,20 +1765,20 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] name = "env_filter" -version = "0.1.4" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +checksum = "7a1c3cc8e57274ec99de65301228b537f1e4eedc1b8e0f9411c6caac8ae7308f" dependencies = [ "log", "regex", @@ -1847,9 +1786,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +checksum = "b2daee4ea451f429a58296525ddf28b45a3b64f1acf6587e2067437bb11e218d" dependencies = [ "anstream", "anstyle", @@ -1864,14 +1803,25 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + [[package]] name = "errno" -version = "0.3.11" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -1882,9 +1832,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -1897,7 +1847,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.4.0", + "event-listener 5.4.1", "pin-project-lite", ] @@ -1918,6 +1868,12 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + [[package]] name = "fixedbitset" version = "0.4.2" @@ -1926,9 +1882,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.1.1" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", @@ -2010,9 +1966,9 @@ dependencies = [ [[package]] name = "fs-err" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62d91fd049c123429b018c47887d3f75a265540dd3c30ba9cb7bae9197edb03a" +checksum = "73fde052dbfc920003cfd2c8e2c6e6d4cc7c1091538c3a24226cec0665ab08c0" dependencies = [ "autocfg", ] @@ -2025,9 +1981,9 @@ checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -2040,9 +1996,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -2050,15 +2006,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -2067,15 +2023,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-lite" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ "fastrand", "futures-core", @@ -2086,32 +2042,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -2121,7 +2077,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -2146,37 +2101,50 @@ dependencies = [ [[package]] name = "gethostname" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed7131e57abbde63513e0e6636f76668a1ca9798dcae2df4e283cae9ee83859e" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" dependencies = [ - "rustix 1.0.5", - "windows-targets 0.52.6", + "rustix 1.1.4", + "windows-link", ] [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" dependencies = [ "cfg-if", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasip2", + "wasip3", ] [[package]] @@ -2191,9 +2159,9 @@ dependencies = [ [[package]] name = "gettext-sys" -version = "0.22.5" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb45773f5b8945f12aecd04558f545964f943dacda1b1155b3d738f5469ef661" +checksum = "4ea859ab0dd7e70ff823032b3e077d03d39c965d68c6c10775add60e999d8ee9" dependencies = [ "cc", "temp-dir", @@ -2201,9 +2169,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "gloo-timers" @@ -2219,17 +2187,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.9" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.3.1", - "indexmap 2.9.0", + "http 1.4.0", + "indexmap 2.13.0", "slab", "tokio", "tokio-util", @@ -2244,7 +2212,7 @@ checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", - "zerocopy 0.8.39", + "zerocopy", ] [[package]] @@ -2261,32 +2229,38 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.3" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + [[package]] name = "hashlink" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.3", + "hashbrown 0.15.5", ] [[package]] name = "headers" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322106e6bd0cba2d5ead589ddb8150a13d7c4217cf80d7c4f682ca994ccc6aa9" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "bytes", "headers-core", - "http 1.3.1", + "http 1.4.0", "httpdate", "mime", "sha1", @@ -2298,7 +2272,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" dependencies = [ - "http 1.3.1", + "http 1.4.0", ] [[package]] @@ -2309,9 +2283,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -2330,11 +2304,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2350,12 +2324,11 @@ dependencies = [ [[package]] name = "http" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -2377,7 +2350,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.3.1", + "http 1.4.0", ] [[package]] @@ -2388,7 +2361,7 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "pin-project-lite", ] @@ -2455,7 +2428,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.9", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -2464,20 +2437,22 @@ dependencies = [ [[package]] name = "hyper" -version = "1.6.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "h2", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "httparse", "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -2485,13 +2460,12 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "futures-util", - "http 1.3.1", - "hyper 1.6.0", + "http 1.4.0", + "hyper 1.8.1", "hyper-util", "rustls", "rustls-pki-types", @@ -2508,7 +2482,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.6.0", + "hyper 1.8.1", "hyper-util", "native-tls", "tokio", @@ -2518,22 +2492,27 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.11" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ + "base64 0.22.1", "bytes", "futures-channel", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", - "hyper 1.6.0", + "hyper 1.8.1", + "ipnet", "libc", + "percent-encoding", "pin-project-lite", - "socket2 0.5.9", + "socket2 0.6.2", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] @@ -2548,9 +2527,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2572,21 +2551,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -2596,97 +2576,65 @@ dependencies = [ ] [[package]] -name = "icu_locid_transform" -version = "1.5.0" +name = "icu_normalizer" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", + "icu_collections", + "icu_normalizer_data", + "icu_properties", "icu_provider", - "tinystr", + "smallvec", "zerovec", ] [[package]] -name = "icu_locid_transform_data" -version = "1.5.1" +name = "icu_normalizer_data" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ - "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", + "icu_locale_core", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] [[package]] -name = "icu_provider_macros" -version = "1.5.0" +name = "id-arena" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" [[package]] name = "ident_case" @@ -2707,9 +2655,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", @@ -2728,13 +2676,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", - "hashbrown 0.15.3", + "hashbrown 0.16.1", "serde", + "serde_core", ] [[package]] @@ -2746,7 +2695,7 @@ dependencies = [ "console", "number_prefix", "portable-atomic", - "unicode-width 0.2.0", + "unicode-width 0.2.2", "web-time", ] @@ -2756,7 +2705,7 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fddf93031af70e75410a2511ec04d49e758ed2f26dad3404a934e0fb45cc12a" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.11.0", "crossterm", "dyn-clone", "fxhash", @@ -2768,15 +2717,25 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "iri-string" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -2807,39 +2766,39 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "jiff" -version = "0.2.10" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a064218214dc6a10fbae5ec5fa888d80c45d611aba169222fc272072bf7aef6" +checksum = "819b44bc7c87d9117eb522f14d46e918add69ff12713c475946b0a29363ed1c2" dependencies = [ "jiff-static", "log", "portable-atomic", "portable-atomic-util", - "serde", + "serde_core", ] [[package]] name = "jiff-static" -version = "0.2.10" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "199b7932d97e325aff3a7030e141eafe7f2c6268e1d1b24859b753a627f45254" +checksum = "470252db18ecc35fd766c0891b1e3ec6cbbcd62507e85276c01bf75d8e94d4a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" dependencies = [ "once_cell", "wasm-bindgen", @@ -2949,6 +2908,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "levenshtein" version = "1.0.5" @@ -2957,9 +2922,9 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.172" +version = "0.2.182" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" [[package]] name = "libloading" @@ -2968,16 +2933,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-link 0.2.1", + "windows-link", ] [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" dependencies = [ - "bitflags 2.9.0", "libc", ] @@ -2990,7 +2954,7 @@ dependencies = [ "hmac", "libc", "log", - "nix 0.29.0", + "nix", "nom 8.0.0", "once_cell", "serde", @@ -3001,9 +2965,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.22" +version = "1.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b70e7a7df205e92a1a4cd9aaae7898dac0aa555503cc0a649494d0d60e7651d" +checksum = "4735e9cbde5aac84a5ce588f6b23a90b9b0b528f6c5a8db8a4aff300463a0839" dependencies = [ "cc", "libc", @@ -3019,21 +2983,21 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "litrs" -version = "0.4.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "locale_config" @@ -3050,19 +3014,18 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.27" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" dependencies = [ "value-bag", ] @@ -3102,9 +3065,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.7.4" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memoffset" @@ -3134,7 +3097,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] @@ -3161,11 +3124,12 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -3176,19 +3140,19 @@ checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys 0.48.0", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] @@ -3200,7 +3164,7 @@ dependencies = [ "bytes", "encoding_rs", "futures-util", - "http 1.3.1", + "http 1.4.0", "httparse", "memchr", "mime", @@ -3210,14 +3174,14 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.14" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" dependencies = [ "libc", "log", "openssl", - "openssl-probe", + "openssl-probe 0.2.1", "openssl-sys", "schannel", "security-framework", @@ -3246,20 +3210,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.9.0", - "cfg-if", - "cfg_aliases", - "libc", - "memoffset", -] - -[[package]] -name = "nix" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" -dependencies = [ - "bitflags 2.9.0", + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "libc", @@ -3335,9 +3286,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "num-integer" @@ -3420,6 +3371,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + [[package]] name = "oorandom" version = "11.1.5" @@ -3432,7 +3389,7 @@ version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.11.0", "cfg-if", "foreign-types", "libc", @@ -3449,7 +3406,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] @@ -3458,6 +3415,12 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + [[package]] name = "openssl-sys" version = "0.9.111" @@ -3547,9 +3510,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -3557,24 +3520,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "parse-zoneinfo" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24" -dependencies = [ - "regex", + "windows-link", ] [[package]] @@ -3585,12 +3539,12 @@ checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "pem" -version = "3.0.5" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" dependencies = [ "base64 0.22.1", - "serde", + "serde_core", ] [[package]] @@ -3601,20 +3555,19 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.0" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" dependencies = [ "memchr", - "thiserror 2.0.18", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.8.0" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d725d9cfd79e87dccc9341a2ef39d1b6f6353d68c4b33c177febbe1a402c97c5" +checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" dependencies = [ "pest", "pest_generator", @@ -3622,24 +3575,23 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.0" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db7d01726be8ab66ab32f9df467ae8b1148906685bbe75c82d1e65d7f5b3f841" +checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] name = "pest_meta" -version = "2.8.0" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9f832470494906d1fca5329f8ab5791cc60beb230c74815dff541cbd2b5ca0" +checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" dependencies = [ - "once_cell", "pest", "sha2", ] @@ -3651,43 +3603,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.9.0", + "indexmap 2.13.0", ] [[package]] name = "phf" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.11.3" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" dependencies = [ - "phf_generator", - "phf_shared", + "phf_shared 0.12.1", ] [[package]] -name = "phf_generator" +name = "phf_shared" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "phf_shared", - "rand 0.8.5", + "siphasher", ] [[package]] name = "phf_shared" -version = "0.11.3" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" dependencies = [ "siphasher", ] @@ -3700,29 +3641,29 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -3732,9 +3673,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" dependencies = [ "atomic-waker", "fastrand", @@ -3777,34 +3718,42 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.4" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix 0.38.44", - "tracing", - "windows-sys 0.59.0", + "rustix 1.1.4", + "windows-sys 0.61.2", ] [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" dependencies = [ "portable-atomic", ] +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -3817,7 +3766,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.39", + "zerocopy", ] [[package]] @@ -3828,19 +3777,19 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "prettyplease" -version = "0.2.34" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6837b9e10d61f45f987d50808f83d1ee3d206c66acf650c3e4ae2e1f6ddedf55" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] name = "proc-macro-crate" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ "toml_edit", ] @@ -3864,14 +3813,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -3904,18 +3853,18 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" @@ -3930,12 +3879,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -3955,7 +3904,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -3964,16 +3913,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.4", ] [[package]] @@ -3998,11 +3947,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.11" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.11.0", ] [[package]] @@ -4011,29 +3960,29 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "libredox", "thiserror 1.0.69", ] [[package]] name = "ref-cast" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] @@ -4052,9 +4001,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -4064,9 +4013,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -4075,15 +4024,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "reqwest" -version = "0.12.15" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64 0.22.1", "bytes", @@ -4091,38 +4040,34 @@ dependencies = [ "cookie_store", "encoding_rs", "futures-core", - "futures-util", "h2", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.6.0", + "hyper 1.8.1", "hyper-rustls", "hyper-tls", "hyper-util", - "ipnet", "js-sys", "log", "mime", "native-tls", - "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-native-tls", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows-registry", ] [[package]] @@ -4133,7 +4078,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -4147,25 +4092,26 @@ checksum = "88f8660c1ff60292143c98d08fc6e2f654d722db50410e3f3797d40baaf9d8f3" [[package]] name = "ron" -version = "0.8.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +checksum = "fd490c5b18261893f14449cbd28cb9c0b637aebf161cd77900bfdedaff21ec32" dependencies = [ - "base64 0.21.7", - "bitflags 2.9.0", + "bitflags 2.11.0", + "once_cell", "serde", "serde_derive", + "typeid", + "unicode-ident", ] [[package]] name = "rust-ini" -version = "0.21.1" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e310ef0e1b6eeb79169a1171daf9abcb87a2e17c03bee2c4bb100b55c75409f" +checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" dependencies = [ "cfg-if", "ordered-multimap", - "trim-in-place", ] [[package]] @@ -4186,7 +4132,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -4195,22 +4141,22 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.5" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.11.0", "errno", "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.26" +version = "0.23.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ "once_cell", "rustls-pki-types", @@ -4220,25 +4166,19 @@ dependencies = [ ] [[package]] -name = "rustls-pemfile" -version = "2.2.0" +name = "rustls-pki-types" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ - "rustls-pki-types", + "zeroize", ] -[[package]] -name = "rustls-pki-types" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" - [[package]] name = "rustls-webpki" -version = "0.103.1" +version = "0.103.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" dependencies = [ "ring", "rustls-pki-types", @@ -4247,15 +4187,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "same-file" @@ -4268,11 +4208,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -4289,9 +4229,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" dependencies = [ "dyn-clone", "ref-cast", @@ -4316,12 +4256,12 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.1" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.9.0", - "core-foundation", + "bitflags 2.11.0", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -4329,9 +4269,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -4339,9 +4279,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" @@ -4353,6 +4293,18 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + [[package]] name = "serde_core" version = "1.0.228" @@ -4370,7 +4322,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] @@ -4388,12 +4340,13 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.17" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", ] [[package]] @@ -4414,16 +4367,16 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] name = "serde_spanned" -version = "0.6.8" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -4440,17 +4393,17 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.16.1" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +checksum = "381b283ce7bc6b476d903296fb59d0d36633652b633b27f64db4fb46dcbfc3b9" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.9.0", + "indexmap 2.13.0", "schemars 0.9.0", - "schemars 1.1.0", + "schemars 1.2.1", "serde_core", "serde_json", "serde_with_macros", @@ -4459,14 +4412,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.16.1" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +checksum = "a6d4e30573c8cb306ed6ab1dca8423eec9a463ea0e155f45399455e0368b27e0" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] @@ -4475,7 +4428,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.13.0", "itoa", "ryu", "serde", @@ -4521,9 +4474,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" dependencies = [ "libc", "signal-hook-registry", @@ -4531,9 +4484,9 @@ dependencies = [ [[package]] name = "signal-hook-mio" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" dependencies = [ "libc", "mio 0.8.11", @@ -4542,13 +4495,20 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + [[package]] name = "similar" version = "2.7.0" @@ -4557,9 +4517,9 @@ checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" [[package]] name = "simple_asn1" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d" dependencies = [ "num-bigint", "num-traits", @@ -4569,30 +4529,27 @@ dependencies = [ [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", @@ -4600,12 +4557,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -4616,15 +4573,9 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - -[[package]] -name = "static_assertions" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "string_cache" @@ -4634,7 +4585,7 @@ checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", "parking_lot", - "phf_shared", + "phf_shared 0.11.3", "precomputed-hash", ] @@ -4655,25 +4606,14 @@ dependencies = [ [[package]] name = "strum_macros" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ "heck", "proc-macro2", "quote", - "rustversion", - "syn 2.0.101", -] - -[[package]] -name = "subprocess" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2e86926081dda636c546d8c5e641661049d7562a68f5488be4a1f7f66f6086" -dependencies = [ - "libc", - "winapi", + "syn 2.0.117", ] [[package]] @@ -4716,9 +4656,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.101" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -4742,17 +4682,17 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] name = "system-configuration" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.9.0", - "core-foundation", + "bitflags 2.11.0", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -4768,20 +4708,20 @@ dependencies = [ [[package]] name = "temp-dir" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc1ee6eef34f12f765cb94725905c6312b6610ab2b0940889cfe58dae7bc3c72" +checksum = "83176759e9416cf81ee66cb6508dbfe9c96f20b8b56265a39917551c23c70964" [[package]] name = "tempfile" -version = "3.23.0" +version = "3.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "82a72c767771b47409d2345987fda8628641887d5466101319899796367354a0" dependencies = [ "fastrand", - "getrandom 0.3.2", + "getrandom 0.4.1", "once_cell", - "rustix 1.0.5", + "rustix 1.1.4", "windows-sys 0.61.2", ] @@ -4798,12 +4738,12 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" +checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" dependencies = [ - "rustix 1.0.5", - "windows-sys 0.59.0", + "rustix 1.1.4", + "windows-sys 0.60.2", ] [[package]] @@ -4824,7 +4764,7 @@ checksum = "97e0639209021e54dbe19cafabfc0b5574b078c37358945e6d473eabe39bb974" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] @@ -4853,7 +4793,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] @@ -4864,45 +4804,44 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] name = "time" -version = "0.3.41" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", "num-conv", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", @@ -4919,9 +4858,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -4945,11 +4884,11 @@ checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ "bytes", "libc", - "mio 1.0.3", + "mio 1.1.1", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.0", + "socket2 0.6.2", "tokio-macros", "tracing", "windows-sys 0.61.2", @@ -4957,13 +4896,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] @@ -4989,9 +4928,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -4999,9 +4938,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ "futures-core", "pin-project-lite", @@ -5010,12 +4949,10 @@ dependencies = [ [[package]] name = "tokio-test" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2468baabc3311435b55dd935f702f42cd1b8abb7e754fb7dfb16bd36aa88f9f7" +checksum = "3f6d24790a10a7af737693a3e8f1d03faef7e6ca0cc99aae5066f533766de545" dependencies = [ - "async-stream", - "bytes", "futures-core", "tokio", "tokio-stream", @@ -5049,9 +4986,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -5062,43 +4999,52 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.22" +version = "0.9.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" dependencies = [ - "serde", + "serde_core", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_parser", + "winnow", ] [[package]] name = "toml_datetime" -version = "0.6.9" +version = "0.7.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" dependencies = [ - "serde", + "serde_core", ] [[package]] name = "toml_edit" -version = "0.22.26" +version = "0.23.10+spec-1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" dependencies = [ - "indexmap 2.9.0", - "serde", - "serde_spanned", + "indexmap 2.13.0", "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.9+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +dependencies = [ "winnow", ] [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", @@ -5112,26 +5058,28 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.2" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ "async-compression", - "bitflags 2.9.0", + "bitflags 2.11.0", "bytes", "futures-core", "futures-util", - "http 1.3.1", + "http 1.4.0", "http-body 1.0.1", "http-body-util", "http-range-header", "httpdate", + "iri-string", "mime", "mime_guess", "percent-encoding", "pin-project-lite", "tokio", "tokio-util", + "tower", "tower-layer", "tower-service", "tracing", @@ -5169,7 +5117,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] @@ -5222,12 +5170,6 @@ dependencies = [ "tracing-log", ] -[[package]] -name = "trim-in-place" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" - [[package]] name = "try-lock" version = "0.2.5" @@ -5243,7 +5185,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.3.1", + "http 1.4.0", "httparse", "log", "rand 0.8.5", @@ -5260,21 +5202,27 @@ checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" dependencies = [ "bytes", "data-encoding", - "http 1.3.1", + "http 1.4.0", "httparse", "log", "native-tls", - "rand 0.9.1", + "rand 0.9.2", "sha1", "thiserror 2.0.18", "utf-8", ] +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "ucd-trie" @@ -5295,15 +5243,15 @@ dependencies = [ [[package]] name = "unicase" -version = "2.8.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" @@ -5319,9 +5267,9 @@ checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-width" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "unicode-xid" @@ -5360,12 +5308,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[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" @@ -5384,7 +5326,7 @@ version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.13.0", "serde", "serde_json", "utoipa-gen", @@ -5399,20 +5341,20 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.101", + "syn 2.0.117", "url", "uuid", ] [[package]] name = "uuid" -version = "1.17.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.4.1", "js-sys", - "serde", + "serde_core", "wasm-bindgen", ] @@ -5445,9 +5387,9 @@ checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "value-bag" -version = "1.11.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" +checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" [[package]] name = "vcpkg" @@ -5488,52 +5430,49 @@ 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 = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" +name = "wasip2" +version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] -name = "wasm-bindgen" -version = "0.2.100" +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", + "wit-bindgen", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" +name = "wasm-bindgen" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.101", + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" dependencies = [ "cfg-if", + "futures-util", "js-sys", "once_cell", "wasm-bindgen", @@ -5542,9 +5481,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5552,31 +5491,65 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.101", - "wasm-bindgen-backend", + "syn 2.0.117", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver", +] + [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" dependencies = [ "js-sys", "wasm-bindgen", @@ -5622,11 +5595,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5637,45 +5610,39 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.61.0" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.1.1", + "windows-link", "windows-result", - "windows-strings 0.4.0", + "windows-strings", ] [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] -[[package]] -name = "windows-link" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" - [[package]] name = "windows-link" version = "0.2.1" @@ -5684,40 +5651,31 @@ checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-registry" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ + "windows-link", "windows-result", - "windows-strings 0.3.1", - "windows-targets 0.53.0", + "windows-strings", ] [[package]] name = "windows-result" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" -dependencies = [ - "windows-link 0.1.1", -] - -[[package]] -name = "windows-strings" -version = "0.3.1" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.1.1", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link 0.1.1", + "windows-link", ] [[package]] @@ -5747,13 +5705,22 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + [[package]] name = "windows-sys" version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -5789,18 +5756,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.0" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -5817,9 +5785,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -5835,9 +5803,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -5853,9 +5821,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -5865,9 +5833,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -5883,9 +5851,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -5901,9 +5869,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -5919,9 +5887,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -5937,39 +5905,112 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.7" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" dependencies = [ - "bitflags 2.9.0", + "wit-bindgen-rust-macro", ] [[package]] -name = "write16" -version = "1.0.0" +name = "wit-bindgen-core" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap 2.13.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "xtask" @@ -5985,9 +6026,9 @@ dependencies = [ [[package]] name = "yaml-rust2" -version = "0.10.1" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "818913695e83ece1f8d2a1c52d54484b7b46d0f9c06beeb2649b9da50d9b512d" +checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9" dependencies = [ "arraydeque", "encoding_rs", @@ -5996,11 +6037,10 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -6008,21 +6048,21 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", "synstructure", ] [[package]] name = "zbus" -version = "5.12.0" +version = "5.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" +checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" dependencies = [ "async-broadcast", "async-executor", @@ -6034,12 +6074,13 @@ dependencies = [ "async-trait", "blocking", "enumflags2", - "event-listener 5.4.0", + "event-listener 5.4.1", "futures-core", "futures-lite", "hex", - "nix 0.30.1", + "libc", "ordered-stream", + "rustix 1.1.4", "serde", "serde_repr", "tokio", @@ -6055,14 +6096,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.12.0" +version = "5.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" +checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", "zbus_names", "zvariant", "zvariant_utils", @@ -6070,54 +6111,33 @@ dependencies = [ [[package]] name = "zbus_names" -version = "4.2.0" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" dependencies = [ "serde", - "static_assertions", "winnow", "zvariant", ] [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5" dependencies = [ - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" -dependencies = [ - "zerocopy-derive 0.8.39", + "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] @@ -6137,21 +6157,32 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "yoke", "zerofrom", @@ -6160,26 +6191,26 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", ] [[package]] name = "zmij" -version = "1.0.14" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] name = "zvariant" -version = "5.5.2" +version = "5.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34d60a2cff1bfddd0d4a73791fd0a4255a59e349aa0cec437cb0df7776f2450" +checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" dependencies = [ "endi", "enumflags2", @@ -6191,28 +6222,27 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "5.5.2" +version = "5.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0604376d86f838e0c3f4fe6d6ee1f861a04dac9015cbbb25c25d336996c91423" +checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.117", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" dependencies = [ "proc-macro2", "quote", "serde", - "static_assertions", - "syn 2.0.101", + "syn 2.0.117", "winnow", ] @@ -6223,7 +6253,6 @@ dependencies = [ "criterion", "glob", "tracing", - "url", "zypp-agama-sys", ] @@ -6232,5 +6261,4 @@ name = "zypp-agama-sys" version = "0.1.0" dependencies = [ "bindgen 0.72.1", - "tracing", ] diff --git a/rust/agama-autoinstall/Cargo.toml b/rust/agama-autoinstall/Cargo.toml index a6e69d4ad7..eaa74df14e 100644 --- a/rust/agama-autoinstall/Cargo.toml +++ b/rust/agama-autoinstall/Cargo.toml @@ -10,7 +10,6 @@ agama-utils = { path = "../agama-utils" } agama-transfer = { path = "../agama-transfer" } anyhow = { version = "1.0.98" } tempfile = "3.20.0" -thiserror = "2.0.12" tokio = "1.46.0" url = "2.5.4" agama-l10n = { path = "../agama-l10n" } diff --git a/rust/agama-bootloader/Cargo.toml b/rust/agama-bootloader/Cargo.toml index 9ec00a2521..3d4abf4fde 100644 --- a/rust/agama-bootloader/Cargo.toml +++ b/rust/agama-bootloader/Cargo.toml @@ -7,15 +7,12 @@ edition.workspace = true [dependencies] agama-utils = { path = "../agama-utils" } agama-storage-client = { path = "../agama-storage-client" } -anyhow = "1.0.99" async-trait = "0.1.89" gettext-rs = { version = "0.7.2", features = ["gettext-system"] } -regex = "1.11.2" serde = { version = "1.0.228", features = ["derive"] } serde_json = { version = "1.0.128", features = ["raw_value"] } thiserror = "2.0.16" tokio = { version = "1.47.1", features = ["macros", "rt-multi-thread", "sync"] } -tokio-stream = "0.1.17" tracing = "0.1.41" zbus = "5.11.0" diff --git a/rust/agama-cli/Cargo.toml b/rust/agama-cli/Cargo.toml index 7574deb90e..89f2058228 100644 --- a/rust/agama-cli/Cargo.toml +++ b/rust/agama-cli/Cargo.toml @@ -17,8 +17,6 @@ console = "0.15.8" anyhow = "1.0.89" tempfile = "3.13.0" tokio = { version = "1.40.0", features = ["macros", "rt-multi-thread"] } -async-trait = "0.1.83" -reqwest = { version = "0.12.8", features = ["json"] } url = "2.5.2" inquire = { version = "0.7.5", default-features = false, features = [ "crossterm", diff --git a/rust/agama-hostname/Cargo.toml b/rust/agama-hostname/Cargo.toml index 187eefbf54..24c866ef52 100644 --- a/rust/agama-hostname/Cargo.toml +++ b/rust/agama-hostname/Cargo.toml @@ -12,7 +12,6 @@ tempfile = "3.23.0" thiserror = "2.0.17" tokio = { version = "1.48.0", features = ["macros", "rt-multi-thread", "sync"] } tokio-stream = "0.1.17" -tokio-test = "0.4.4" tracing = "0.1.43" zbus = "5.12.0" diff --git a/rust/agama-lib/Cargo.toml b/rust/agama-lib/Cargo.toml index 2bc171645c..728f7b73b6 100644 --- a/rust/agama-lib/Cargo.toml +++ b/rust/agama-lib/Cargo.toml @@ -8,12 +8,7 @@ edition = "2021" [dependencies] anyhow = "1.0" agama-utils = { path = "../agama-utils" } -agama-network = { path = "../agama-network" } -agama-locale-data = { path = "../agama-locale-data" } -agama-l10n = { path = "../agama-l10n" } agama-transfer = { path = "../agama-transfer" } -async-trait = "0.1.83" -futures-util = "0.3.30" jsonschema = { version = "0.30.0", default-features = false, features = [ "resolve-file", ] } @@ -21,7 +16,6 @@ log = "0.4" reqwest = { version = "0.12.8", features = ["json", "cookies"] } serde = { version = "1.0.210", features = ["derive"] } serde_json = { version = "1.0.128", features = ["raw_value"] } -serde_repr = "0.1.19" tempfile = "3.13.0" thiserror = "2.0.12" tokio = { version = "1.40.0", features = ["macros", "rt-multi-thread"] } @@ -30,8 +24,6 @@ tracing = "0.1.40" url = { version = "2.5.2", features = ["serde"] } utoipa = { version = "5.2.0", features = ["url"] } zbus = { version = "5", default-features = false, features = ["tokio"] } -# Needed to define curl error in profile errors -curl = { version = "0.4.47", features = ["protocol-ftp"] } jsonwebtoken = "9.3.0" chrono = { version = "0.4.38", default-features = false, features = [ "now", @@ -40,16 +32,12 @@ chrono = { version = "0.4.38", default-features = false, features = [ "clock", ] } home = "0.5.9" -strum = { version = "0.27.1", features = ["derive"] } fs_extra = "1.3.0" -serde_with = "3.12.0" -regex = "1.11.1" fluent-uri = { version = "0.4.1", features = ["serde"] } tokio-tungstenite = { version = "0.26.2", features = ["native-tls"] } tokio-native-tls = "0.3.1" percent-encoding = "2.3.1" uuid = { version = "1.17.0", features = ["serde", "v4"] } -zypp-agama = { path = "../zypp-agama" } [dev-dependencies] httpmock = "0.7.0" diff --git a/rust/agama-lib/src/files.rs b/rust/agama-lib/src/files.rs deleted file mode 100644 index 8f962ab049..0000000000 --- a/rust/agama-lib/src/files.rs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) [2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements support for handling the file deployment - -pub mod error; diff --git a/rust/agama-lib/src/files/error.rs b/rust/agama-lib/src/files/error.rs deleted file mode 100644 index 91b6378017..0000000000 --- a/rust/agama-lib/src/files/error.rs +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) [2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -use std::{io, num::ParseIntError}; -use thiserror::Error; - -use crate::{file_source::FileSourceError, utils::TransferError}; - -#[derive(Error, Debug)] -pub enum FileError { - #[error("Could not fetch the file: '{0}'")] - Unreachable(#[from] TransferError), - #[error("I/O error: '{0}'")] - InputOutputError(#[from] io::Error), - #[error("Invalid permissions: '{0}'")] - PermissionsError(#[from] ParseIntError), - #[error("Failed to change owner: command '{0}' stderr '{1}'")] - OwnerChangeError(String, String), - #[error("Failed to create directories: command '{0}' stderr '{1}'")] - MkdirError(String, String), - #[error(transparent)] - FileSourceError(#[from] FileSourceError), -} diff --git a/rust/agama-lib/src/hostname.rs b/rust/agama-lib/src/hostname.rs deleted file mode 100644 index a749e2cea2..0000000000 --- a/rust/agama-lib/src/hostname.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) [2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements support for handling the hostname settings - -pub mod client; -pub mod http_client; -pub mod model; -pub mod store; diff --git a/rust/agama-lib/src/hostname/client.rs b/rust/agama-lib/src/hostname/client.rs deleted file mode 100644 index adc87d53af..0000000000 --- a/rust/agama-lib/src/hostname/client.rs +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) [2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements a client to access Hostnamed D-Bus API related to hostname management. - -use crate::{error::ServiceError, hostname::model::HostnameSettings, proxies::Hostname1Proxy}; - -/// Client to connect to org.freedesktop.hostname1 DBUS API on the system bus for Hostname management. -#[derive(Clone)] -pub struct HostnameClient<'a> { - hostname_proxy: Hostname1Proxy<'a>, -} - -impl<'a> HostnameClient<'a> { - pub async fn new() -> Result, ServiceError> { - let connection = zbus::Connection::system().await?; - let hostname_proxy = Hostname1Proxy::new(&connection).await?; - - Ok(Self { hostname_proxy }) - } - - pub async fn get_config(&self) -> Result { - let hostname = self.hostname_proxy.hostname().await?; - let static_hostname = self.hostname_proxy.static_hostname().await?; - - let settings = HostnameSettings { - hostname: Some(hostname), - static_hostname: Some(static_hostname), - }; - - Ok(settings) - } - - pub async fn set_config(&self, config: &HostnameSettings) -> Result<(), ServiceError> { - let settings = self.get_config().await?; - - // order is important as otherwise the transient hostname could not be set in case the - // static one is not empty - if let Some(config_static_hostname) = &config.static_hostname { - if settings.static_hostname != config.static_hostname { - self.hostname_proxy - .set_static_hostname(config_static_hostname.as_str(), false) - .await?; - } - } - - if let Some(config_hostname) = &config.hostname { - if settings.hostname != config.hostname { - self.hostname_proxy - .set_hostname(config_hostname.as_str(), false) - .await?; - } - } - - Ok(()) - } -} diff --git a/rust/agama-lib/src/hostname/http_client.rs b/rust/agama-lib/src/hostname/http_client.rs deleted file mode 100644 index 67176bcdfd..0000000000 --- a/rust/agama-lib/src/hostname/http_client.rs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) [2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements a client to access Agama's HTTP API related to Hostname management. - -use crate::{ - hostname::model::HostnameSettings, - http::{BaseHTTPClient, BaseHTTPClientError}, -}; - -#[derive(Debug, thiserror::Error)] -pub enum HostnameHTTPClientError { - #[error(transparent)] - HTTP(#[from] BaseHTTPClientError), -} - -pub struct HostnameHTTPClient { - client: BaseHTTPClient, -} - -impl HostnameHTTPClient { - pub fn new(base: BaseHTTPClient) -> Self { - Self { client: base } - } - - pub async fn get_config(&self) -> Result { - Ok(self.client.get("/hostname/config").await?) - } - - pub async fn set_config( - &self, - config: &HostnameSettings, - ) -> Result<(), HostnameHTTPClientError> { - Ok(self.client.put_void("/hostname/config", config).await?) - } -} diff --git a/rust/agama-lib/src/hostname/model.rs b/rust/agama-lib/src/hostname/model.rs deleted file mode 100644 index feb8a5d2d6..0000000000 --- a/rust/agama-lib/src/hostname/model.rs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) [2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements a data model for Hostname configuration. - -use serde::{Deserialize, Serialize}; - -/// Represents a Hostname -#[derive(Clone, Debug, Serialize, Deserialize, Default, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct HostnameSettings { - #[serde(rename = "transient", skip_serializing_if = "Option::is_none")] - pub hostname: Option, - // empty string means removing the static hostname - #[serde(rename = "static", skip_serializing_if = "Option::is_none")] - pub static_hostname: Option, -} diff --git a/rust/agama-lib/src/hostname/store.rs b/rust/agama-lib/src/hostname/store.rs deleted file mode 100644 index ed7551fb4a..0000000000 --- a/rust/agama-lib/src/hostname/store.rs +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) [2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements the store for the hostname settings. - -use super::{ - http_client::{HostnameHTTPClient, HostnameHTTPClientError}, - model::HostnameSettings, -}; -use crate::http::BaseHTTPClient; - -#[derive(Debug, thiserror::Error)] -#[error("Error processing hostname settings: {0}")] -pub struct HostnameStoreError(#[from] HostnameHTTPClientError); - -type HostnameStoreResult = Result; - -/// Loads and stores the hostname settings from/to the HTTP service. -pub struct HostnameStore { - hostname_client: HostnameHTTPClient, -} - -impl HostnameStore { - pub fn new(client: BaseHTTPClient) -> Self { - Self { - hostname_client: HostnameHTTPClient::new(client), - } - } - - pub async fn load(&self) -> HostnameStoreResult { - Ok(self.hostname_client.get_config().await?) - } - - pub async fn store(&self, settings: &HostnameSettings) -> HostnameStoreResult<()> { - Ok(self.hostname_client.set_config(settings).await?) - } -} diff --git a/rust/agama-lib/src/install_settings.rs b/rust/agama-lib/src/install_settings.rs deleted file mode 100644 index 8493dacddf..0000000000 --- a/rust/agama-lib/src/install_settings.rs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) [2024-2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Configuration settings handling -//! -//! This module implements the mechanisms to load and store the installation settings. -use crate::hostname::model::HostnameSettings; -use crate::storage::settings::zfcp::ZFCPConfig; -use crate::{network::NetworkSettings, storage::settings::dasd::DASDConfig}; -use serde::{Deserialize, Serialize}; -use serde_json::value::RawValue; -use std::default::Default; - -#[derive(Debug, thiserror::Error)] -pub enum InstallSettingsError { - #[error("I/O error: {0}")] - InputOuputError(#[from] std::io::Error), - #[error("Could not parse the settings: {0}")] - ParseError(#[from] serde_json::Error), -} - -/// Installation settings -/// -/// This struct represents installation settings. It serves as an entry point and it is composed of -/// other structs which hold the settings for each area ("software", etc.). -#[derive(Clone, Debug, Default, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct InstallSettings { - #[serde(skip_serializing_if = "Option::is_none")] - pub dasd: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub hostname: Option, - #[serde(skip_serializing_if = "Option::is_none")] - #[schema(value_type = Object)] - pub iscsi: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - #[schema(value_type = Object)] - pub storage: Option>, - #[serde(rename = "legacyAutoyastStorage")] - #[serde(skip_serializing_if = "Option::is_none")] - #[schema(value_type = Object)] - pub storage_autoyast: Option>, - #[serde(skip_serializing_if = "Option::is_none")] - pub network: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub zfcp: Option, -} diff --git a/rust/agama-lib/src/jobs.rs b/rust/agama-lib/src/jobs.rs deleted file mode 100644 index 4090cff362..0000000000 --- a/rust/agama-lib/src/jobs.rs +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! This module implements support for the so-called Jobs. It is a concept hat represents running -//! an external command that may take some time, like formatting a DASD device. It is exposed via -//! D-Bus and, at this time, only the storage service makes use of it. - -use std::collections::HashMap; - -use serde::{Deserialize, Serialize}; -use zbus::zvariant::OwnedValue; - -use crate::error::ServiceError; -use agama_utils::dbus::get_property; - -pub mod client; - -/// Represents a job. -#[derive(Clone, Debug, Default, Deserialize, Serialize)] -#[serde(rename_all = "camelCase")] -pub struct Job { - /// Artificial job identifier. - pub id: String, - /// Whether the job is running. - pub running: bool, - /// Job exit code. - pub exit_code: u32, -} - -impl TryFrom<&HashMap> for Job { - type Error = ServiceError; - - fn try_from(value: &HashMap) -> Result { - Ok(Job { - running: get_property(value, "Running")?, - exit_code: get_property(value, "ExitCode")?, - ..Default::default() - }) - } -} diff --git a/rust/agama-lib/src/jobs/client.rs b/rust/agama-lib/src/jobs/client.rs deleted file mode 100644 index 62678882ba..0000000000 --- a/rust/agama-lib/src/jobs/client.rs +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements a client to access Agama's Jobs API. - -use zbus::{fdo::ObjectManagerProxy, zvariant::OwnedObjectPath, Connection}; - -use crate::error::ServiceError; - -use super::Job; - -#[derive(Clone)] -pub struct JobsClient<'a> { - object_manager_proxy: ObjectManagerProxy<'a>, -} - -impl JobsClient<'_> { - pub async fn new( - connection: Connection, - destination: &'static str, - path: &'static str, - ) -> Result { - let object_manager_proxy = ObjectManagerProxy::builder(&connection) - .destination(destination)? - .path(path)? - .build() - .await?; - - Ok(Self { - object_manager_proxy, - }) - } - - pub async fn jobs(&self) -> Result, ServiceError> { - let managed_objects = self.object_manager_proxy.get_managed_objects().await?; - - let mut jobs = vec![]; - for (path, ifaces) in managed_objects { - let Some(properties) = ifaces.get("org.opensuse.Agama.Storage1.Job") else { - continue; - }; - - match Job::try_from(properties) { - Ok(mut job) => { - job.id = path.to_string(); - jobs.push((path, job)); - } - Err(error) => { - log::warn!("Not a valid job: {}", error); - } - } - } - - Ok(jobs) - } -} diff --git a/rust/agama-lib/src/lib.rs b/rust/agama-lib/src/lib.rs index 725c20c22e..31ffa3f3d5 100644 --- a/rust/agama-lib/src/lib.rs +++ b/rust/agama-lib/src/lib.rs @@ -45,22 +45,13 @@ pub mod auth; pub mod error; -pub mod hostname; pub mod http; -pub mod install_settings; pub use agama_utils::issue; -pub mod jobs; pub mod logs; pub mod manager; pub mod monitor; -pub mod network; pub mod profile; -pub mod progress; -pub mod proxies; pub mod questions; -pub mod storage; -mod store; -pub use store::Store; pub mod utils; pub use agama_utils::{dbus, openapi}; diff --git a/rust/agama-lib/src/manager.rs b/rust/agama-lib/src/manager.rs index 8e70169ac1..15e1893856 100644 --- a/rust/agama-lib/src/manager.rs +++ b/rust/agama-lib/src/manager.rs @@ -21,164 +21,4 @@ //! This module implements the web API for the manager module. pub mod http_client; -use agama_utils::api::FinishMethod; pub use http_client::ManagerHTTPClient; -use serde::{Deserialize, Serialize}; -use std::collections::HashMap; - -use crate::error::ServiceError; -use crate::proxies::ServiceStatusProxy; -use crate::{ - progress::Progress, - proxies::{Manager1Proxy, ProgressProxy}, -}; -use serde_repr::{Deserialize_repr, Serialize_repr}; -use tokio_stream::StreamExt; -use zbus::Connection; - -/// D-Bus client for the manager service -#[derive(Clone)] -pub struct ManagerClient<'a> { - manager_proxy: Manager1Proxy<'a>, - progress_proxy: ProgressProxy<'a>, - status_proxy: ServiceStatusProxy<'a>, -} - -/// Holds information about the manager's status. -#[derive(Clone, Default, Debug, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct InstallerStatus { - /// Current installation phase. - pub phase: InstallationPhase, - /// Whether the service is busy. - pub is_busy: bool, - /// Whether Agama is running on Iguana. - pub use_iguana: bool, - /// Whether it is possible to start the installation. - pub can_install: bool, -} - -/// Represents the installation phase. -/// NOTE: does this conversion have any value? -#[derive( - Clone, Copy, Default, Debug, PartialEq, Serialize_repr, Deserialize_repr, utoipa::ToSchema, -)] -#[repr(u32)] -pub enum InstallationPhase { - /// Start up phase. - #[default] - Startup, - /// Configuration phase. - Config, - /// Installation phase. - Install, - /// Finished installation phase. - Finish, -} - -impl TryFrom for InstallationPhase { - type Error = ServiceError; - - fn try_from(value: u32) -> Result { - match value { - 0 => Ok(Self::Startup), - 1 => Ok(Self::Config), - 2 => Ok(Self::Install), - 3 => Ok(Self::Finish), - _ => Err(ServiceError::UnknownInstallationPhase(value)), - } - } -} - -impl<'a> ManagerClient<'a> { - pub async fn new(connection: Connection) -> zbus::Result> { - Ok(Self { - manager_proxy: Manager1Proxy::new(&connection).await?, - progress_proxy: ProgressProxy::new(&connection).await?, - status_proxy: ServiceStatusProxy::new(&connection).await?, - }) - } - - /// Returns the list of busy services. - pub async fn busy_services(&self) -> Result, ServiceError> { - Ok(self.manager_proxy.busy_services().await?) - } - - /// Returns the current installation phase. - pub async fn current_installation_phase(&self) -> Result { - let phase = self.manager_proxy.current_installation_phase().await?; - phase.try_into() - } - - /// Starts the probing process. - pub async fn probe(&self, client_id: String) -> Result<(), ServiceError> { - self.wait().await?; - Ok(self - .manager_proxy - .probe(HashMap::from([("client_id", &client_id.into())])) - .await?) - } - - /// Starts the reprobing process. - pub async fn reprobe(&self, client_id: String) -> Result<(), ServiceError> { - self.wait().await?; - Ok(self - .manager_proxy - .reprobe(HashMap::from([("client_id", &client_id.into())])) - .await?) - } - - /// Starts the installation. - pub async fn install(&self) -> Result<(), ServiceError> { - Ok(self.manager_proxy.commit().await?) - } - - /// Executes the after installation tasks finishing with the method given or rebooting the - /// system by default. - pub async fn finish(&self, method: FinishMethod) -> Result { - Ok(self - .manager_proxy - .finish(method.to_string().as_str()) - .await?) - } - - /// Determines whether it is possible to start the installation. - pub async fn can_install(&self) -> Result { - Ok(self.manager_proxy.can_install().await?) - } - - /// Determines whether the installer is running on Iguana. - pub async fn use_iguana(&self) -> Result { - Ok(self.manager_proxy.iguana_backend().await?) - } - - /// Returns the current progress. - pub async fn progress(&self) -> zbus::Result { - Progress::from_proxy(&self.progress_proxy).await - } - - /// Returns whether the service is busy or not - /// - /// TODO: move this code to a trait with functions related to the service status. - pub async fn is_busy(&self) -> bool { - if let Ok(status) = self.status_proxy.current().await { - return status != 0; - } - true - } - - /// Waits until the manager is idle. - pub async fn wait(&self) -> Result<(), ServiceError> { - let mut stream = self.status_proxy.receive_current_changed().await; - if !self.is_busy().await { - return Ok(()); - } - - while let Some(change) = stream.next().await { - if change.get().await? == 0 { - return Ok(()); - } - } - Ok(()) - } -} diff --git a/rust/agama-lib/src/manager/http_client.rs b/rust/agama-lib/src/manager/http_client.rs index e16e931e86..5111854e2a 100644 --- a/rust/agama-lib/src/manager/http_client.rs +++ b/rust/agama-lib/src/manager/http_client.rs @@ -22,13 +22,11 @@ use crate::{ http::{BaseHTTPClient, BaseHTTPClientError}, logs::LogsLists, }; -use agama_utils::api::{self, Status}; +use agama_utils::api::{self, FinishMethod, Status}; use reqwest::header::CONTENT_ENCODING; use std::path::{Path, PathBuf}; use std::{fs, io::Cursor, os::unix::fs::OpenOptionsExt}; -use super::FinishMethod; - #[derive(Debug, thiserror::Error)] pub enum ManagerHTTPClientError { #[error(transparent)] diff --git a/rust/agama-lib/src/network.rs b/rust/agama-lib/src/network.rs deleted file mode 100644 index 86d44e074b..0000000000 --- a/rust/agama-lib/src/network.rs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) [2024-2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements support for handling the network settings - -mod client; -mod store; - -pub use agama_network::{ - error, model, types, Action, Adapter, NetworkAdapterError, NetworkManagerAdapter, - NetworkSystemClient, NetworkSystemError, Service, -}; -pub use agama_utils::api::network::*; -pub use client::{NetworkClient, NetworkClientError}; -pub use store::{NetworkStore, NetworkStoreError}; diff --git a/rust/agama-lib/src/network/client.rs b/rust/agama-lib/src/network/client.rs deleted file mode 100644 index dbb3854beb..0000000000 --- a/rust/agama-lib/src/network/client.rs +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -use crate::http::{BaseHTTPClient, BaseHTTPClientError}; -use crate::network::{Device, NetworkConnection}; -use crate::utils::url::encode; - -#[derive(Debug, thiserror::Error)] -pub enum NetworkClientError { - #[error(transparent)] - HTTP(#[from] BaseHTTPClientError), -} - -/// HTTP/JSON client for the network service -pub struct NetworkClient { - pub client: BaseHTTPClient, -} - -impl NetworkClient { - pub fn new(base: BaseHTTPClient) -> Self { - Self { client: base } - } - - /// Returns an array of network devices - pub async fn devices(&self) -> Result, NetworkClientError> { - let json = self.client.get::>("/network/devices").await?; - - Ok(json) - } - - /// Returns an array of network connections - pub async fn connections(&self) -> Result, NetworkClientError> { - let json = self - .client - .get::>("/network/connections") - .await?; - - Ok(json) - } - - /// Returns an array of network connections - pub async fn connection(&self, id: &str) -> Result { - let encoded_id = encode(id); - let json = self - .client - .get::(format!("/network/connections/{encoded_id}").as_str()) - .await?; - - Ok(json) - } - - /// Returns an array of network connections - pub async fn add_or_update_connection( - &self, - connection: NetworkConnection, - ) -> Result<(), NetworkClientError> { - let id = connection.id.clone(); - let encoded_id = encode(id.as_str()); - let response = self.connection(id.as_str()).await; - - if response.is_ok() { - let path = format!("/network/connections/{encoded_id}"); - self.client.put_void(path.as_str(), &connection).await? - } else { - self.client - .post_void("/network/connections".to_string().as_str(), &connection) - .await? - } - - Ok(()) - } - - /// Returns an array of network connections - pub async fn apply(&self) -> Result<(), NetworkClientError> { - // trying to be tricky here. If something breaks then we need a put method on - // BaseHTTPClient which doesn't require a serialiable object for the body - self.client - .post_void("/network/system/apply".to_string().as_str(), &()) - .await?; - - Ok(()) - } -} diff --git a/rust/agama-lib/src/network/store.rs b/rust/agama-lib/src/network/store.rs deleted file mode 100644 index dcc2fecfe8..0000000000 --- a/rust/agama-lib/src/network/store.rs +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright (c) [2024-2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -use super::NetworkClientError; -use crate::{ - http::BaseHTTPClient, - network::{NetworkClient, NetworkSettings}, -}; -use agama_network::types::NetworkConnectionsCollection; -use agama_utils::api::network::NetworkConnection; - -#[derive(Debug, thiserror::Error)] -#[error("Error processing network settings: {0}")] -pub struct NetworkStoreError(#[from] NetworkClientError); - -type NetworkStoreResult = Result; - -/// Loads and stores the network settings from/to the D-Bus service. -pub struct NetworkStore { - network_client: NetworkClient, -} - -impl NetworkStore { - pub fn new(client: BaseHTTPClient) -> Self { - Self { - network_client: NetworkClient::new(client), - } - } - - // TODO: read the settings from the service - pub async fn load(&self) -> NetworkStoreResult { - let connections = NetworkConnectionsCollection(self.network_client.connections().await?); - - Ok(NetworkSettings { connections }) - } - - pub async fn store(&self, settings: &NetworkSettings) -> NetworkStoreResult<()> { - let connections = &settings.connections.0; - for id in ordered_connections(connections) { - let id = id.as_str(); - let fallback = default_connection(id); - let conn = find_connection(id, connections).unwrap_or(&fallback); - self.network_client - .add_or_update_connection(conn.clone()) - .await?; - } - self.network_client.apply().await?; - - Ok(()) - } -} - -/// Returns the list of connections in the order they should be written to the D-Bus service. -/// -/// * `conns`: connections to write. -fn ordered_connections(conns: &Vec) -> Vec { - let mut ordered: Vec = Vec::with_capacity(conns.len()); - for conn in conns { - add_ordered_connection(conn, conns, &mut ordered); - } - ordered -} - -/// Adds a connections and its dependencies to the list. -/// -/// * `conn`: connection to add. -/// * `conns`: existing connections. -/// * `ordered`: ordered list of connections. -fn add_ordered_connection( - conn: &NetworkConnection, - conns: &Vec, - ordered: &mut Vec, -) { - if let Some(bond) = &conn.bond { - for port in &bond.ports { - if let Some(conn) = find_connection(port, conns) { - add_ordered_connection(conn, conns, ordered); - } else if !ordered.contains(&conn.id) { - ordered.push(port.clone()); - } - } - } - - if let Some(bridge) = &conn.bridge { - for port in &bridge.ports { - if let Some(conn) = find_connection(port, conns) { - add_ordered_connection(conn, conns, ordered); - } else if !ordered.contains(&conn.id) { - ordered.push(port.clone()); - } - } - } - - if !ordered.contains(&conn.id) { - ordered.push(conn.id.to_owned()) - } -} - -/// Finds a connection by id in the list. -/// -/// * `id`: connection ID. -fn find_connection<'a>(id: &str, conns: &'a [NetworkConnection]) -> Option<&'a NetworkConnection> { - conns - .iter() - .find(|c| c.id == id || c.interface == Some(id.to_string())) -} - -fn default_connection(id: &str) -> NetworkConnection { - NetworkConnection { - id: id.to_string(), - interface: Some(id.to_string()), - ..Default::default() - } -} - -#[cfg(test)] -mod tests { - use super::ordered_connections; - use crate::network::{BondSettings, BridgeSettings, NetworkConnection}; - - #[test] - fn test_ordered_connections() { - let bond = NetworkConnection { - id: "bond0".to_string(), - bond: Some(BondSettings { - ports: vec!["eth0".to_string(), "eth1".to_string(), "eth3".to_string()], - ..Default::default() - }), - ..Default::default() - }; - - let bridge = NetworkConnection { - id: "br0".to_string(), - bridge: Some(BridgeSettings { - ports: vec!["eth0".to_string(), "eth1".to_string(), "eth3".to_string()], - ..Default::default() - }), - ..Default::default() - }; - - let eth0 = NetworkConnection { - id: "eth0".to_string(), - ..Default::default() - }; - let eth1 = NetworkConnection { - id: "Wired connection".to_string(), - interface: Some("eth1".to_string()), - ..Default::default() - }; - let eth2 = NetworkConnection { - id: "eth2".to_string(), - ..Default::default() - }; - - let conns = vec![bond, eth0, eth1, eth2]; - let ordered = ordered_connections(&conns); - assert_eq!( - ordered, - vec![ - "eth0".to_string(), - "Wired connection".to_string(), - "eth3".to_string(), - "bond0".to_string(), - "eth2".to_string() - ] - ); - - let conns = vec![bridge]; - let ordered = ordered_connections(&conns); - assert_eq!( - ordered, - vec![ - "eth0".to_string(), - "eth1".to_string(), - "eth3".to_string(), - "br0".to_string() - ] - ) - } -} diff --git a/rust/agama-lib/src/progress.rs b/rust/agama-lib/src/progress.rs deleted file mode 100644 index b4a8167996..0000000000 --- a/rust/agama-lib/src/progress.rs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! This module includes the struct that represent a service progress step. - -use serde::{Deserialize, Serialize}; - -/// Represents the progress for an Agama service. -#[derive(Clone, Default, Debug, Deserialize, Serialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct Progress { - /// Current step - pub current_step: u32, - /// Number of steps - pub max_steps: u32, - /// Title of the current step - pub current_title: String, - /// Whether the progress reporting is finished - pub finished: bool, -} - -impl Progress { - pub async fn from_proxy(proxy: &crate::proxies::ProgressProxy<'_>) -> zbus::Result { - let (current_step, max_steps, finished) = - tokio::join!(proxy.current_step(), proxy.total_steps(), proxy.finished()); - - let (current_step, current_title) = current_step?; - Ok(Self { - current_step, - current_title, - max_steps: max_steps?, - finished: finished?, - }) - } - - pub fn from_cached_proxy(proxy: &crate::proxies::ProgressProxy<'_>) -> Option { - let (current_step, current_title) = proxy.cached_current_step().ok()??; - let max_steps = proxy.cached_total_steps().ok()??; - let finished = proxy.cached_finished().ok()??; - - Some(Progress { - current_step, - current_title, - max_steps, - finished, - }) - } -} - -/// Information about the current progress sequence. -#[derive(Clone, Debug, Default, Serialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct ProgressSequence { - /// Sequence steps if known in advance - pub steps: Vec, - #[serde(flatten)] - pub progress: Progress, -} diff --git a/rust/agama-lib/src/proxies.rs b/rust/agama-lib/src/proxies.rs deleted file mode 100644 index 89e2435382..0000000000 --- a/rust/agama-lib/src/proxies.rs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -mod progress; -pub use progress::{ProgressChanged, ProgressChangedArgs, ProgressChangedStream, ProgressProxy}; - -mod service_status; -pub use service_status::ServiceStatusProxy; - -mod manager1; -pub use manager1::Manager1Proxy; - -mod locale; -pub use locale::LocaleMixinProxy; - -pub mod jobs; - -mod hostname1; -pub use hostname1::Hostname1Proxy; diff --git a/rust/agama-lib/src/proxies/hostname1.rs b/rust/agama-lib/src/proxies/hostname1.rs deleted file mode 100644 index 5c4630d61f..0000000000 --- a/rust/agama-lib/src/proxies/hostname1.rs +++ /dev/null @@ -1,155 +0,0 @@ -//! # D-Bus interface proxy for: `org.freedesktop.hostname1` -//! -//! This code was generated by `zbus-xmlgen` `4.1.0` from D-Bus introspection data. -//! Source: `Interface '/org/freedesktop/hostname1' from service 'org.freedesktop.hostname1' on system bus`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::PeerProxy`] -//! * [`zbus::fdo::IntrospectableProxy`] -//! * [`zbus::fdo::PropertiesProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy( - interface = "org.freedesktop.hostname1", - default_service = "org.freedesktop.hostname1", - default_path = "/org/freedesktop/hostname1" -)] -pub trait Hostname1 { - /// Describe method - fn describe(&self) -> zbus::Result; - - /// GetHardwareSerial method - fn get_hardware_serial(&self) -> zbus::Result; - - /// GetProductUUID method - #[zbus(name = "GetProductUUID")] - fn get_product_uuid(&self, interactive: bool) -> zbus::Result>; - - /// SetChassis method - fn set_chassis(&self, chassis: &str, interactive: bool) -> zbus::Result<()>; - - /// SetDeployment method - fn set_deployment(&self, deployment: &str, interactive: bool) -> zbus::Result<()>; - - /// SetHostname method - fn set_hostname(&self, hostname: &str, interactive: bool) -> zbus::Result<()>; - - /// SetIconName method - fn set_icon_name(&self, icon: &str, interactive: bool) -> zbus::Result<()>; - - /// SetLocation method - fn set_location(&self, location: &str, interactive: bool) -> zbus::Result<()>; - - /// SetPrettyHostname method - fn set_pretty_hostname(&self, hostname: &str, interactive: bool) -> zbus::Result<()>; - - /// SetStaticHostname method - fn set_static_hostname(&self, hostname: &str, interactive: bool) -> zbus::Result<()>; - - /// BootID property - #[zbus(property, name = "BootID")] - fn boot_id(&self) -> zbus::Result>; - - /// Chassis property - #[zbus(property)] - fn chassis(&self) -> zbus::Result; - - /// DefaultHostname property - #[zbus(property)] - fn default_hostname(&self) -> zbus::Result; - - /// Deployment property - #[zbus(property)] - fn deployment(&self) -> zbus::Result; - - /// FirmwareDate property - #[zbus(property)] - fn firmware_date(&self) -> zbus::Result; - - /// FirmwareVendor property - #[zbus(property)] - fn firmware_vendor(&self) -> zbus::Result; - - /// FirmwareVersion property - #[zbus(property)] - fn firmware_version(&self) -> zbus::Result; - - /// HardwareModel property - #[zbus(property)] - fn hardware_model(&self) -> zbus::Result; - - /// HardwareVendor property - #[zbus(property)] - fn hardware_vendor(&self) -> zbus::Result; - - /// HomeURL property - #[zbus(property, name = "HomeURL")] - fn home_url(&self) -> zbus::Result; - - /// Hostname property - #[zbus(property)] - fn hostname(&self) -> zbus::Result; - - /// HostnameSource property - #[zbus(property)] - fn hostname_source(&self) -> zbus::Result; - - /// IconName property - #[zbus(property)] - fn icon_name(&self) -> zbus::Result; - - /// KernelName property - #[zbus(property)] - fn kernel_name(&self) -> zbus::Result; - - /// KernelRelease property - #[zbus(property)] - fn kernel_release(&self) -> zbus::Result; - - /// KernelVersion property - #[zbus(property)] - fn kernel_version(&self) -> zbus::Result; - - /// Location property - #[zbus(property)] - fn location(&self) -> zbus::Result; - - /// MachineID property - #[zbus(property, name = "MachineID")] - fn machine_id(&self) -> zbus::Result>; - - /// OperatingSystemCPEName property - #[zbus(property, name = "OperatingSystemCPEName")] - fn operating_system_cpename(&self) -> zbus::Result; - - /// OperatingSystemPrettyName property - #[zbus(property)] - fn operating_system_pretty_name(&self) -> zbus::Result; - - /// OperatingSystemSupportEnd property - #[zbus(property)] - fn operating_system_support_end(&self) -> zbus::Result; - - /// PrettyHostname property - #[zbus(property)] - fn pretty_hostname(&self) -> zbus::Result; - - /// StaticHostname property - #[zbus(property)] - fn static_hostname(&self) -> zbus::Result; - - /// VSockCID property - #[zbus(property, name = "VSockCID")] - fn vsock_cid(&self) -> zbus::Result; -} diff --git a/rust/agama-lib/src/proxies/jobs.rs b/rust/agama-lib/src/proxies/jobs.rs deleted file mode 100644 index 5c739983b0..0000000000 --- a/rust/agama-lib/src/proxies/jobs.rs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -use zbus::proxy; -#[proxy( - interface = "org.opensuse.Agama.Storage1.Job", - default_service = "org.opensuse.Agama.Storage1", - default_path = "/org/opensuse/Agama/Storage1/jobs" -)] -trait Job { - #[zbus(property)] - fn running(&self) -> zbus::Result; - - #[zbus(property)] - fn exit_code(&self) -> zbus::Result; - - #[zbus(signal)] - fn finished(&self, exit_code: u32) -> zbus::Result<()>; -} - -#[proxy( - interface = "org.opensuse.Agama.Storage1.DASD.Format", - default_service = "org.opensuse.Agama.Storage1", - default_path = "/org/opensuse/Agama/Storage1/jobs/1" -)] -trait FormatJob { - #[zbus(property)] - fn summary(&self) -> zbus::Result>; -} diff --git a/rust/agama-lib/src/proxies/locale.rs b/rust/agama-lib/src/proxies/locale.rs deleted file mode 100644 index ea7d57f94a..0000000000 --- a/rust/agama-lib/src/proxies/locale.rs +++ /dev/null @@ -1,31 +0,0 @@ -//! # D-Bus interface proxy for: `org.opensuse.Agama1.LocaleMixin` -//! -//! This code was generated by `zbus-xmlgen` `5.0.0` from D-Bus introspection data. -//! Source: `org.opensuse.Agama1.Manager.bus.xml`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::PropertiesProxy`] -//! * [`zbus::fdo::IntrospectableProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy( - default_service = "org.opensuse.Agama.Manager1", - default_path = "/org/opensuse/Agama/Manager1", - interface = "org.opensuse.Agama1.LocaleMixin", - assume_defaults = true -)] -pub trait LocaleMixin { - /// SetLocale method - fn set_locale(&self, locale: &str) -> zbus::Result<()>; -} diff --git a/rust/agama-lib/src/proxies/manager1.rs b/rust/agama-lib/src/proxies/manager1.rs deleted file mode 100644 index 81b50d4e66..0000000000 --- a/rust/agama-lib/src/proxies/manager1.rs +++ /dev/null @@ -1,70 +0,0 @@ -//! # D-Bus interface proxy for: `org.opensuse.Agama.Manager1` -//! -//! This code was generated by `zbus-xmlgen` `5.0.0` from D-Bus introspection data. -//! Source: `org.opensuse.Agama1.Manager.bus.xml`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::PropertiesProxy`] -//! * [`zbus::fdo::IntrospectableProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy( - default_service = "org.opensuse.Agama.Manager1", - default_path = "/org/opensuse/Agama/Manager1", - interface = "org.opensuse.Agama.Manager1", - assume_defaults = true -)] -pub trait Manager1 { - /// CanInstall method - fn can_install(&self) -> zbus::Result; - - /// CollectLogs method - fn collect_logs(&self) -> zbus::Result; - - /// Commit method - fn commit(&self) -> zbus::Result<()>; - - /// Finish method - fn finish(&self, method: &str) -> zbus::Result; - - /// Probe method - fn probe( - &self, - data: std::collections::HashMap<&str, &zbus::zvariant::Value<'_>>, - ) -> zbus::Result<()>; - - /// Reprobe method - fn reprobe( - &self, - data: std::collections::HashMap<&str, &zbus::zvariant::Value<'_>>, - ) -> zbus::Result<()>; - - /// BusyServices property - #[zbus(property)] - fn busy_services(&self) -> zbus::Result>; - - /// CurrentInstallationPhase property - #[zbus(property)] - fn current_installation_phase(&self) -> zbus::Result; - - /// IguanaBackend property - #[zbus(property)] - fn iguana_backend(&self) -> zbus::Result; - - /// InstallationPhases property - #[zbus(property)] - fn installation_phases( - &self, - ) -> zbus::Result>>; -} diff --git a/rust/agama-lib/src/proxies/progress.rs b/rust/agama-lib/src/proxies/progress.rs deleted file mode 100644 index c39d6c697f..0000000000 --- a/rust/agama-lib/src/proxies/progress.rs +++ /dev/null @@ -1,50 +0,0 @@ -//! # D-Bus interface proxy for: `org.opensuse.Agama1.Progress` -//! -//! This code was generated by `zbus-xmlgen` `5.0.0` from D-Bus introspection data. -//! Source: `org.opensuse.Agama.Storage1.bus.xml`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::IntrospectableProxy`] -//! * [`zbus::fdo::ObjectManagerProxy`] -//! * [`zbus::fdo::PropertiesProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy(interface = "org.opensuse.Agama1.Progress", assume_defaults = true)] -pub trait Progress { - /// ProgressChanged signal - #[zbus(signal)] - fn progress_changed( - &self, - total_steps: u32, - current_step: (u32, &str), - finished: bool, - steps: Vec<&str>, - ) -> zbus::Result<()>; - - /// CurrentStep property - #[zbus(property)] - fn current_step(&self) -> zbus::Result<(u32, String)>; - - /// Finished property - #[zbus(property)] - fn finished(&self) -> zbus::Result; - - /// TotalSteps property - #[zbus(property)] - fn total_steps(&self) -> zbus::Result; - - /// Steps property - #[zbus(property)] - fn steps(&self) -> zbus::Result>; -} diff --git a/rust/agama-lib/src/proxies/service_status.rs b/rust/agama-lib/src/proxies/service_status.rs deleted file mode 100644 index 31ec5df004..0000000000 --- a/rust/agama-lib/src/proxies/service_status.rs +++ /dev/null @@ -1,38 +0,0 @@ -//! # D-Bus interface proxy for: `org.opensuse.Agama1.ServiceStatus` -//! -//! This code was generated by `zbus-xmlgen` `5.0.0` from D-Bus introspection data. -//! Source: `org.opensuse.Agama1.ServiceStatus.bus.xml`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::PropertiesProxy`] -//! * [`zbus::fdo::IntrospectableProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy( - default_service = "org.opensuse.Agama.Manager1", - default_path = "/org/opensuse/Agama/Manager1", - interface = "org.opensuse.Agama1.ServiceStatus", - assume_defaults = true -)] -pub trait ServiceStatus { - /// All property - #[zbus(property)] - fn all( - &self, - ) -> zbus::Result>>; - - /// Current property - #[zbus(property)] - fn current(&self) -> zbus::Result; -} diff --git a/rust/agama-lib/src/scripts/error.rs b/rust/agama-lib/src/scripts/error.rs deleted file mode 100644 index 3e9b561fc7..0000000000 --- a/rust/agama-lib/src/scripts/error.rs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -use std::io; -use thiserror::Error; - -use crate::{file_source::FileSourceError, utils::TransferError}; - -#[derive(Error, Debug)] -pub enum ScriptError { - #[error("Could not fetch the profile: '{0}'")] - Unreachable(#[from] TransferError), - #[error("I/O error: '{0}'")] - InputOutputError(#[from] io::Error), - #[error("Wrong script type")] - WrongScriptType, - #[error(transparent)] - FileSourceError(#[from] FileSourceError), -} diff --git a/rust/agama-lib/src/storage.rs b/rust/agama-lib/src/storage.rs deleted file mode 100644 index 4ad2acd7fb..0000000000 --- a/rust/agama-lib/src/storage.rs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements support for handling the storage settings - -pub mod client; -pub mod http_client; -pub mod model; -pub mod proxies; -pub mod settings; -pub(crate) mod store; - -pub use client::{ - iscsi::{ISCSIAuth, ISCSIClient, ISCSIInitiator, ISCSINode}, - zfcp::ZFCPClient, - StorageClient, -}; -pub use settings::StorageSettings; -pub use store::{StorageStore, StorageStoreError}; diff --git a/rust/agama-lib/src/storage/client.rs b/rust/agama-lib/src/storage/client.rs deleted file mode 100644 index 6f40de592d..0000000000 --- a/rust/agama-lib/src/storage/client.rs +++ /dev/null @@ -1,484 +0,0 @@ -// Copyright (c) [2024-2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements a client to access Agama's storage service. - -use super::model::{ - Action, BlockDevice, Component, Device, DeviceInfo, DeviceSid, Drive, Filesystem, LvmLv, LvmVg, - Md, Multipath, Partition, PartitionTable, ProposalSettings, ProposalSettingsPatch, Raid, - Volume, -}; -use super::proxies::{DevicesProxy, ProposalCalculatorProxy, ProposalProxy, Storage1Proxy}; -use super::StorageSettings; -use crate::error::ServiceError; -use agama_utils::dbus::get_property; -use serde_json::value::RawValue; -use std::collections::HashMap; -use zbus::fdo::ObjectManagerProxy; -use zbus::names::{InterfaceName, OwnedInterfaceName}; -use zbus::zvariant::{OwnedObjectPath, OwnedValue}; -use zbus::Connection; -pub mod dasd; -pub mod iscsi; -pub mod zfcp; - -type DBusObject = ( - OwnedObjectPath, - HashMap>, -); - -/// D-Bus client for the storage service -#[derive(Clone)] -pub struct StorageClient<'a> { - pub connection: Connection, - calculator_proxy: ProposalCalculatorProxy<'a>, - storage_proxy: Storage1Proxy<'a>, - object_manager_proxy: ObjectManagerProxy<'a>, - devices_proxy: DevicesProxy<'a>, - proposal_proxy: ProposalProxy<'a>, -} - -impl<'a> StorageClient<'a> { - pub async fn new(connection: Connection) -> Result, ServiceError> { - Ok(Self { - calculator_proxy: ProposalCalculatorProxy::new(&connection).await?, - storage_proxy: Storage1Proxy::new(&connection).await?, - object_manager_proxy: ObjectManagerProxy::builder(&connection) - .destination("org.opensuse.Agama.Storage1")? - .path("/org/opensuse/Agama/Storage1")? - .build() - .await?, - // Do not cache the D-Bus proposal proxy because the proposal object is reexported with - // every new call to calculate. - proposal_proxy: ProposalProxy::builder(&connection) - .cache_properties(zbus::proxy::CacheProperties::No) - .build() - .await?, - // Same than above, actions are reexported with every call to recalculate - devices_proxy: DevicesProxy::builder(&connection) - .cache_properties(zbus::proxy::CacheProperties::No) - .build() - .await?, - connection, - }) - } - - /// Whether the devices have changed. - pub async fn devices_dirty_bit(&self) -> Result { - Ok(self.storage_proxy.deprecated_system().await?) - } - - /// Actions to perform in the storage devices. - pub async fn actions(&self) -> Result, ServiceError> { - let actions = self.devices_proxy.actions().await?; - let mut result: Vec = Vec::with_capacity(actions.len()); - - for i in actions { - result.push(i.try_into()?); - } - - Ok(result) - } - - /// SIDs of the available drives for the installation. - pub async fn available_drives(&self) -> Result, ServiceError> { - self.sids(self.devices_proxy.available_drives().await?) - } - - /// SIDs of the candidate drives for the installation. - pub async fn candidate_drives(&self) -> Result, ServiceError> { - self.sids(self.devices_proxy.candidate_drives().await?) - } - - /// SIDs of the available MD RAIDs for the installation. - pub async fn available_md_raids(&self) -> Result, ServiceError> { - self.sids(self.devices_proxy.available_md_raids().await?) - } - - /// SIDs of the candidate MD RAIDs for the installation. - pub async fn candidate_md_raids(&self) -> Result, ServiceError> { - self.sids(self.devices_proxy.candidate_md_raids().await?) - } - - /// SIDs from the given list of object paths. - fn sids(&self, object_paths: Vec) -> Result, ServiceError> { - let paths: Vec = - object_paths.into_iter().map(|p| p.into_inner()).collect(); - - let result: Result, _> = paths.into_iter().map(|v| v.try_into()).collect(); - - Ok(result?) - } - - /// Default values for a volume with the given mount path. - pub async fn volume_for(&self, mount_path: &str) -> Result { - let volume_hash = self.calculator_proxy.default_volume(mount_path).await?; - - Ok(volume_hash.try_into()?) - } - - /// Mount points of the volumes pre-defined by the product. - pub async fn product_mount_points(&self) -> Result, ServiceError> { - Ok(self.calculator_proxy.product_mount_points().await?) - } - - /// Encryption methods allowed by the product. - pub async fn encryption_methods(&self) -> Result, ServiceError> { - Ok(self.calculator_proxy.encryption_methods().await?) - } - - /// Settings used for calculating the proposal. - pub async fn proposal_settings(&self) -> Result { - Ok(self.proposal_proxy.settings().await?.try_into()?) - } - - /// Runs the probing process - pub async fn probe(&self, client_id: String) -> Result<(), ServiceError> { - Ok(self - .storage_proxy - .probe(HashMap::from([("client_id", &client_id.into())])) - .await?) - } - - /// Runs the reprobing process - pub async fn reprobe(&self, client_id: String) -> Result<(), ServiceError> { - Ok(self - .storage_proxy - .reprobe(HashMap::from([("client_id", &client_id.into())])) - .await?) - } - - /// Runs the reactivation process - pub async fn reactivate(&self, client_id: String) -> Result<(), ServiceError> { - Ok(self - .storage_proxy - .reactivate(HashMap::from([("client_id", &client_id.into())])) - .await?) - } - - /// Set the storage config according to the JSON schema - pub async fn set_config( - &self, - settings: StorageSettings, - client_id: String, - ) -> Result { - Ok(self - .storage_proxy - .set_config( - serde_json::to_string(&settings)?.as_str(), - HashMap::from([("client_id", &client_id.into())]), - ) - .await?) - } - - /// Reset the storage config to the default value - pub async fn reset_config(&self, client_id: String) -> Result { - Ok(self - .storage_proxy - .reset_config(HashMap::from([("client_id", &client_id.into())])) - .await?) - } - - /// Get the storage config according to the JSON schema - pub async fn get_config(&self) -> Result, ServiceError> { - let serialized_settings = self.storage_proxy.get_config().await?; - let settings = serde_json::from_str(serialized_settings.as_str())?; - Ok(settings) - } - - /// Set the storage config model according to the JSON schema - pub async fn set_config_model( - &self, - model: Box, - client_id: String, - ) -> Result { - Ok(self - .storage_proxy - .set_config_model( - serde_json::to_string(&model).unwrap().as_str(), - HashMap::from([("client_id", &client_id.into())]), - ) - .await?) - } - - /// Get the storage config model according to the JSON schema - pub async fn get_config_model(&self) -> Result, ServiceError> { - let serialized_config_model = self.storage_proxy.get_config_model().await?; - let config_model = serde_json::from_str(serialized_config_model.as_str()).unwrap(); - Ok(config_model) - } - - /// Solves the storage config model - pub async fn solve_config_model(&self, model: &str) -> Result, ServiceError> { - let serialized_solved_model = self.storage_proxy.solve_config_model(model).await?; - let solved_model = serde_json::from_str(serialized_solved_model.as_str()).unwrap(); - Ok(solved_model) - } - - pub async fn calculate(&self, settings: ProposalSettingsPatch) -> Result { - let map: HashMap<&str, zbus::zvariant::Value> = settings.into(); - let options: HashMap<&str, &zbus::zvariant::Value> = - map.iter().map(|(id, value)| (*id, value)).collect(); - - Ok(self.calculator_proxy.calculate(options).await?) - } - - /// Probed devices. - pub async fn system_devices(&self) -> Result, ServiceError> { - let objects = self.object_manager_proxy.get_managed_objects().await?; - let mut result = vec![]; - for object in objects { - let path = &object.0; - if !path.as_str().contains("Storage1/system") { - continue; - } - - result.push(self.build_device(&object).await?) - } - - Ok(result) - } - - /// Resulting devices after calculating a proposal. - pub async fn staging_devices(&self) -> Result, ServiceError> { - let objects = self.object_manager_proxy.get_managed_objects().await?; - let mut result = vec![]; - for object in objects { - let path = &object.0; - if !path.as_str().contains("Storage1/staging") { - continue; - } - - result.push(self.build_device(&object).await?) - } - - Ok(result) - } - - fn get_interface<'b>( - &'b self, - object: &'b DBusObject, - name: &str, - ) -> Option<&'b HashMap> { - let interface: OwnedInterfaceName = InterfaceName::from_str_unchecked(name).into(); - let interfaces = &object.1; - interfaces.get(&interface) - } - - async fn build_device(&self, object: &DBusObject) -> Result { - Ok(Device { - block_device: self.build_block_device(object).await?, - component: self.build_component(object).await?, - device_info: self.build_device_info(object).await?, - drive: self.build_drive(object).await?, - filesystem: self.build_filesystem(object).await?, - lvm_lv: self.build_lvm_lv(object).await?, - lvm_vg: self.build_lvm_vg(object).await?, - md: self.build_md(object).await?, - multipath: self.build_multipath(object).await?, - partition: self.build_partition(object).await?, - partition_table: self.build_partition_table(object).await?, - raid: self.build_raid(object).await?, - }) - } - - async fn build_device_info(&self, object: &DBusObject) -> Result { - let iface = self.get_interface(object, "org.opensuse.Agama.Storage1.Device"); - // All devices have to implement the Device interface, so report error if it is not there. - let Some(properties) = iface else { - return Err(zbus::zvariant::Error::Message(format!( - "Storage device {} is missing the Device interface", - object.0 - )) - .into()); - }; - - Ok(DeviceInfo { - sid: get_property(properties, "SID")?, - name: get_property(properties, "Name")?, - description: get_property(properties, "Description")?, - }) - } - - async fn build_block_device( - &self, - object: &DBusObject, - ) -> Result, ServiceError> { - let iface = self.get_interface(object, "org.opensuse.Agama.Storage1.Block"); - let Some(properties) = iface else { - return Ok(None); - }; - - Ok(Some(BlockDevice { - active: get_property(properties, "Active")?, - encrypted: get_property(properties, "Encrypted")?, - size: get_property(properties, "Size")?, - shrinking: get_property(properties, "Shrinking")?, - start: get_property(properties, "Start")?, - systems: get_property(properties, "Systems")?, - udev_ids: get_property(properties, "UdevIds")?, - udev_paths: get_property(properties, "UdevPaths")?, - })) - } - - async fn build_component( - &self, - object: &DBusObject, - ) -> Result, ServiceError> { - let iface = self.get_interface(object, "org.opensuse.Agama.Storage1.Component"); - let Some(properties) = iface else { - return Ok(None); - }; - - Ok(Some(Component { - component_type: get_property(properties, "Type")?, - device_names: get_property(properties, "DeviceNames")?, - devices: get_property(properties, "Devices")?, - })) - } - - async fn build_drive(&self, object: &DBusObject) -> Result, ServiceError> { - let iface = self.get_interface(object, "org.opensuse.Agama.Storage1.Drive"); - let Some(properties) = iface else { - return Ok(None); - }; - - Ok(Some(Drive { - drive_type: get_property(properties, "Type")?, - vendor: get_property(properties, "Vendor")?, - model: get_property(properties, "Model")?, - bus: get_property(properties, "Bus")?, - bus_id: get_property(properties, "BusId")?, - driver: get_property(properties, "Driver")?, - transport: get_property(properties, "Transport")?, - info: get_property(properties, "Info")?, - })) - } - - async fn build_filesystem( - &self, - object: &DBusObject, - ) -> Result, ServiceError> { - let iface = self.get_interface(object, "org.opensuse.Agama.Storage1.Filesystem"); - let Some(properties) = iface else { - return Ok(None); - }; - - Ok(Some(Filesystem { - sid: get_property(properties, "SID")?, - fs_type: get_property(properties, "Type")?, - mount_path: get_property(properties, "MountPath")?, - label: get_property(properties, "Label")?, - })) - } - - async fn build_lvm_lv(&self, object: &DBusObject) -> Result, ServiceError> { - let iface = self.get_interface(object, "org.opensuse.Agama.Storage1.LVM.LogicalVolume"); - let Some(properties) = iface else { - return Ok(None); - }; - - Ok(Some(LvmLv { - volume_group: get_property(properties, "VolumeGroup")?, - })) - } - - async fn build_lvm_vg(&self, object: &DBusObject) -> Result, ServiceError> { - let iface = self.get_interface(object, "org.opensuse.Agama.Storage1.LVM.VolumeGroup"); - let Some(properties) = iface else { - return Ok(None); - }; - - Ok(Some(LvmVg { - size: get_property(properties, "Size")?, - physical_volumes: get_property(properties, "PhysicalVolumes")?, - logical_volumes: get_property(properties, "LogicalVolumes")?, - })) - } - - async fn build_md(&self, object: &DBusObject) -> Result, ServiceError> { - let iface = self.get_interface(object, "org.opensuse.Agama.Storage1.MD"); - let Some(properties) = iface else { - return Ok(None); - }; - - Ok(Some(Md { - uuid: get_property(properties, "UUID")?, - level: get_property(properties, "Level")?, - devices: get_property(properties, "Devices")?, - })) - } - - async fn build_multipath( - &self, - object: &DBusObject, - ) -> Result, ServiceError> { - let iface = self.get_interface(object, "org.opensuse.Agama.Storage1.Multipath"); - let Some(properties) = iface else { - return Ok(None); - }; - - Ok(Some(Multipath { - wires: get_property(properties, "Wires")?, - })) - } - - async fn build_partition( - &self, - object: &DBusObject, - ) -> Result, ServiceError> { - let iface = self.get_interface(object, "org.opensuse.Agama.Storage1.Partition"); - let Some(properties) = iface else { - return Ok(None); - }; - - Ok(Some(Partition { - device: get_property(properties, "Device")?, - efi: get_property(properties, "EFI")?, - })) - } - - async fn build_partition_table( - &self, - object: &DBusObject, - ) -> Result, ServiceError> { - let iface = self.get_interface(object, "org.opensuse.Agama.Storage1.PartitionTable"); - let Some(properties) = iface else { - return Ok(None); - }; - - Ok(Some(PartitionTable { - ptable_type: get_property(properties, "Type")?, - partitions: get_property(properties, "Partitions")?, - unused_slots: get_property(properties, "UnusedSlots")?, - })) - } - - async fn build_raid(&self, object: &DBusObject) -> Result, ServiceError> { - let iface = self.get_interface(object, "org.opensuse.Agama.Storage1.RAID"); - let Some(properties) = iface else { - return Ok(None); - }; - - Ok(Some(Raid { - devices: get_property(properties, "Devices")?, - })) - } -} diff --git a/rust/agama-lib/src/storage/client/dasd.rs b/rust/agama-lib/src/storage/client/dasd.rs deleted file mode 100644 index d448d8b4e6..0000000000 --- a/rust/agama-lib/src/storage/client/dasd.rs +++ /dev/null @@ -1,297 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements a client to access Agama's D-Bus API related to DASD management. - -use std::{collections::HashMap, time::Duration}; - -use tokio::time::sleep; -use zbus::{ - fdo::{IntrospectableProxy, ObjectManagerProxy}, - zvariant::{ObjectPath, OwnedObjectPath}, - Connection, -}; - -use crate::{ - error::ServiceError, - jobs::client::JobsClient, - storage::{ - model::dasd::DASDDevice, - proxies::dasd::ManagerProxy, - settings::dasd::{DASDConfig, DASDDeviceConfig, DASDDeviceState}, - }, -}; - -/// Client to connect to Agama's D-Bus API for DASD management. -#[derive(Clone)] -pub struct DASDClient<'a> { - manager_proxy: ManagerProxy<'a>, - object_manager_proxy: ObjectManagerProxy<'a>, - introspectable_proxy: IntrospectableProxy<'a>, - connection: Connection, -} - -impl<'a> DASDClient<'a> { - pub async fn new(connection: Connection) -> Result, ServiceError> { - let manager_proxy = ManagerProxy::new(&connection).await?; - let object_manager_proxy = ObjectManagerProxy::builder(&connection) - .destination("org.opensuse.Agama.Storage1")? - .path("/org/opensuse/Agama/Storage1")? - .build() - .await?; - let introspectable_proxy = IntrospectableProxy::builder(&connection) - .destination("org.opensuse.Agama.Storage1")? - .path("/org/opensuse/Agama/Storage1")? - .build() - .await?; - - Ok(Self { - manager_proxy, - object_manager_proxy, - introspectable_proxy, - connection, - }) - } - - pub async fn supported(&self) -> Result { - let introspect = self.introspectable_proxy.introspect().await?; - // simply check if introspection contain given interface - Ok(introspect.contains("org.opensuse.Agama.Storage1.DASD.Manager")) - } - - /// Returns DASD configuration that can be used by set_config call - pub async fn get_config(&self) -> Result { - // TODO: implement - Ok(DASDConfig::default()) - } - - /// applies DASD configuration - /// - /// Note that it do actions immediatelly. So there is no write method there that apply it. - pub async fn set_config(&self, config: DASDConfig) -> Result<(), ServiceError> { - // at first probe to ensure we work on real system info - self.probe().await?; - self.config_activate(&config).await?; - self.config_format(&config).await?; - self.config_set_diag(&config).await?; - - Ok(()) - } - - /// Apply activation or deactivation from config - async fn config_activate(&self, config: &DASDConfig) -> Result<(), ServiceError> { - let pairs = self.config_pairs(config).await?; - let to_activate: Vec<&str> = pairs - .iter() - .filter(|(system, _config)| !system.enabled) - .filter(|(_system, config)| config.state.unwrap_or_default() == DASDDeviceState::Active) - .map(|(system, _config)| system.id.as_str()) - .collect(); - self.enable(&to_activate).await?; - - let to_deactivate: Vec<&str> = pairs - .iter() - .filter(|(system, _config)| system.enabled) - .filter(|(_system, config)| config.state == Some(DASDDeviceState::Offline)) - .map(|(system, _config)| system.id.as_str()) - .collect(); - self.disable(&to_deactivate).await?; - - if !to_activate.is_empty() || !to_deactivate.is_empty() { - // reprobe after calling enable. TODO: check if it is needed or callbacks take into action and update it automatically - self.probe().await?; - } - Ok(()) - } - - /// Apply request for device formatting from config - async fn config_format(&self, config: &DASDConfig) -> Result<(), ServiceError> { - let pairs = self.config_pairs(config).await?; - let to_format: Vec<&str> = pairs - .iter() - .filter(|(system, config)| { - if config.format == Some(true) { - true - } else if config.format.is_none() { - !system.formatted - } else { - false - } - }) - .map(|(system, _config)| system.id.as_str()) - .collect(); - - if !to_format.is_empty() { - let job_path = self.format(&to_format).await?; - self.wait_for_format(job_path).await?; - // reprobe after calling format. TODO: check if it is needed or callbacks take into action and update it automatically - // also do we need to wait here for finish of format progress? - self.probe().await?; - } - Ok(()) - } - - /// Wait for format operation to finish - async fn wait_for_format(&self, job_path: String) -> Result<(), ServiceError> { - let mut finished = false; - let jobs_client = JobsClient::new( - self.connection.clone(), - "org.opensuse.Agama.Storage1", - "/org/opensuse/Agama/Storage1", - ) - .await?; - while !finished { - // active polling with 1 sec sleep for jobs - sleep(Duration::from_secs(1)).await; - let jobs = jobs_client.jobs().await?; - let job_pair = jobs - .iter() - .find(|(path, _job)| path.to_string() == job_path); - - if let Some((_, job)) = job_pair { - finished = !job.running; - } else { - // job does not exist, so probably finished - finished = true; - } - } - - Ok(()) - } - - /// Apply diag flag from config - async fn config_set_diag(&self, config: &DASDConfig) -> Result<(), ServiceError> { - let pairs = self.config_pairs(config).await?; - let to_enable: Vec<&str> = pairs - .iter() - .filter(|(_system, config)| config.diag == Some(true)) - .map(|(system, _config)| system.id.as_str()) - .collect(); - self.set_diag(&to_enable, true).await?; - - let to_disable: Vec<&str> = pairs - .iter() - .filter(|(_system, config)| config.diag == Some(false)) - .map(|(system, _config)| system.id.as_str()) - .collect(); - self.set_diag(&to_disable, false).await?; - - if !to_enable.is_empty() || !to_disable.is_empty() { - // reprobe after calling format. TODO: check if it is needed or callbacks take into action and update it automatically - // also do we need to wait here for finish of format progress? - self.probe().await?; - } - Ok(()) - } - - /// create vector with pairs of devices on system and devices specification in config - async fn config_pairs( - &self, - config: &DASDConfig, - ) -> Result, ServiceError> { - let devices = self.devices().await?; - let mut devices_map: HashMap<&str, DASDDevice> = devices - .iter() - .map(|d| (d.1.id.as_str(), d.1.clone())) - .collect(); - config - .devices - .iter() - .map(|c| { - Ok(( - devices_map - .remove(c.channel.as_str()) - .ok_or(ServiceError::DASDChannelNotFound(c.channel.clone()))?, - c.clone(), - )) - }) - .collect() - } - - pub async fn probe(&self) -> Result<(), ServiceError> { - Ok(self.manager_proxy.probe().await?) - } - - pub async fn devices(&self) -> Result, ServiceError> { - let managed_objects = self.object_manager_proxy.get_managed_objects().await?; - - let mut devices: Vec<(OwnedObjectPath, DASDDevice)> = vec![]; - for (path, ifaces) in managed_objects { - if let Some(properties) = ifaces.get("org.opensuse.Agama.Storage1.DASD.Device") { - match DASDDevice::try_from(properties) { - Ok(device) => { - devices.push((path, device)); - } - Err(error) => { - log::warn!("Not a valid DASD device: {}", error); - } - } - } - } - Ok(devices) - } - - pub async fn format(&self, ids: &[&str]) -> Result { - let selected = self.find_devices(ids).await?; - let references = selected.iter().collect::>>(); - let (exit_code, job_path) = self.manager_proxy.format(&references).await?; - if exit_code != 0 { - return Err(ServiceError::UnsuccessfulAction("DASD format".to_string())); - } - - Ok(job_path.to_string()) - } - - pub async fn enable(&self, ids: &[&str]) -> Result<(), ServiceError> { - let selected = self.find_devices(ids).await?; - let references = selected.iter().collect::>>(); - self.manager_proxy.enable(&references).await?; - Ok(()) - } - - pub async fn disable(&self, ids: &[&str]) -> Result<(), ServiceError> { - let selected = self.find_devices(ids).await?; - let references = selected.iter().collect::>>(); - self.manager_proxy.disable(&references).await?; - Ok(()) - } - - pub async fn set_diag(&self, ids: &[&str], diag: bool) -> Result<(), ServiceError> { - let selected = self.find_devices(ids).await?; - let references = selected.iter().collect::>>(); - self.manager_proxy.set_diag(&references, diag).await?; - Ok(()) - } - - async fn find_devices(&self, ids: &[&str]) -> Result>, ServiceError> { - let devices = self.devices().await?; - let selected: Vec = devices - .into_iter() - .filter_map(|(path, device)| { - if ids.contains(&device.id.as_str()) { - Some(path.into_inner()) - } else { - None - } - }) - .collect(); - Ok(selected) - } -} diff --git a/rust/agama-lib/src/storage/client/iscsi.rs b/rust/agama-lib/src/storage/client/iscsi.rs deleted file mode 100644 index 691ea5a2b2..0000000000 --- a/rust/agama-lib/src/storage/client/iscsi.rs +++ /dev/null @@ -1,337 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -use core::fmt; -use std::collections::HashMap; - -use crate::{ - error::ServiceError, - storage::proxies::iscsi::{ISCSIProxy, InitiatorProxy, NodeProxy}, -}; -use agama_utils::dbus::{extract_id_from_path, get_property}; -use serde::{Deserialize, Serialize}; -use serde_json::value::RawValue; -use thiserror::Error; -use zbus::{ - fdo::ObjectManagerProxy, - zvariant::{self, ObjectPath, OwnedValue, Value}, - Connection, -}; - -#[derive(Serialize, utoipa::ToSchema)] -pub struct ISCSIInitiator { - name: String, - ibft: bool, -} - -#[derive(Clone, Debug, Default, Deserialize, Serialize, utoipa::ToSchema)] -/// ISCSI node -pub struct ISCSINode { - /// Artificial ID to match it against the D-Bus backend. - pub id: u32, - /// Target name. - pub target: String, - /// Target IP address (in string-like form). - pub address: String, - /// Target port. - pub port: u32, - /// Interface name. - pub interface: String, - /// Whether the node was initiated by iBFT - pub ibft: bool, - /// Whether the node is connected (there is a session). - pub connected: bool, - /// Startup status (TODO: document better) - pub startup: String, -} - -impl TryFrom<&HashMap> for ISCSINode { - type Error = ServiceError; - - fn try_from(value: &HashMap) -> Result { - Ok(ISCSINode { - id: 0, - target: get_property(value, "Target")?, - address: get_property(value, "Address")?, - interface: get_property(value, "Interface")?, - port: get_property(value, "Port")?, - ibft: get_property(value, "IBFT")?, - connected: get_property(value, "Connected")?, - startup: get_property(value, "Startup")?, - }) - } -} - -#[derive(Clone, Default, Serialize, Deserialize, utoipa::ToSchema)] -pub struct ISCSIAuth { - /// Username for authentication by target. - pub username: Option, - /// Password for authentication by target. - pub password: Option, - /// Username for authentication by initiator. - pub reverse_username: Option, - /// Password for authentication by initiator. - pub reverse_password: Option, -} - -impl TryFrom for HashMap { - type Error = zbus::zvariant::Error; - - fn try_from(value: ISCSIAuth) -> Result { - let mut hash = HashMap::new(); - - if let Some(username) = value.username { - hash.insert("Username".to_string(), Value::new(username).try_into()?); - } - - if let Some(password) = value.password { - hash.insert("Password".to_string(), Value::new(password).try_into()?); - } - - if let Some(reverse_username) = value.reverse_username { - hash.insert( - "ReverseUsername".to_string(), - Value::new(reverse_username).try_into()?, - ); - } - - if let Some(reverse_password) = value.reverse_password { - hash.insert( - "ReversePassword".to_string(), - Value::new(reverse_password).try_into()?, - ); - } - - Ok(hash) - } -} - -/// D-Bus client for the ISCSI part of the storage service. -#[derive(Clone)] -pub struct ISCSIClient<'a> { - connection: zbus::Connection, - initiator_proxy: InitiatorProxy<'a>, - object_manager_proxy: ObjectManagerProxy<'a>, - iscsi_proxy: ISCSIProxy<'a>, -} - -impl<'a> ISCSIClient<'a> { - pub async fn new(connection: Connection) -> Result, ServiceError> { - let initiator_proxy = InitiatorProxy::builder(&connection) - .destination("org.opensuse.Agama.Storage1")? - .path("/org/opensuse/Agama/Storage1")? - .build() - .await?; - - let object_manager_proxy = ObjectManagerProxy::builder(&connection) - .destination("org.opensuse.Agama.Storage1")? - .path("/org/opensuse/Agama/Storage1")? - .build() - .await?; - - let iscsi_proxy = ISCSIProxy::builder(&connection).build().await?; - - Ok(Self { - connection, - initiator_proxy, - object_manager_proxy, - iscsi_proxy, - }) - } - - /// Performs an iSCSI discovery. - /// - /// It returns true when the discovery was successful. - /// - /// * `address`: target address in string-like form. - /// * `port`: target port. - /// * `auth`: authentication options. - pub async fn discover( - &self, - address: &str, - port: u32, - auth: ISCSIAuth, - ) -> Result { - let mut options_hash: HashMap<&str, zvariant::Value> = HashMap::new(); - - if let (Some(ref username), Some(ref password)) = (auth.username, auth.password) { - options_hash.insert("Username", username.to_string().into()); - options_hash.insert("Password", password.to_string().into()); - } - - if let (Some(ref username), Some(ref password)) = - (auth.reverse_username, auth.reverse_password) - { - options_hash.insert("ReverseUsername", username.to_string().into()); - options_hash.insert("ReversePassword", password.to_string().into()); - } - - let mut options_ref: HashMap<&str, &zvariant::Value<'_>> = HashMap::new(); - for (key, value) in options_hash.iter() { - options_ref.insert(key, value); - } - - let result = self - .initiator_proxy - .discover(address, port, options_ref) - .await?; - Ok(result == 0) - } - - /// Returns the initiator data. - pub async fn get_initiator(&self) -> Result { - let ibft = self.initiator_proxy.ibft().await?; - let name = self.initiator_proxy.initiator_name().await?; - Ok(ISCSIInitiator { name, ibft }) - } - - /// Sets the initiator name. - /// - /// * `name`: new name. - pub async fn set_initiator_name(&self, name: &str) -> Result<(), ServiceError> { - Ok(self.initiator_proxy.set_initiator_name(name).await?) - } - - /// Returns the iSCSI nodes. - pub async fn get_nodes(&self) -> Result, ServiceError> { - let managed_objects = self.object_manager_proxy.get_managed_objects().await?; - - let mut nodes: Vec = vec![]; - for (path, ifaces) in managed_objects { - if let Some(properties) = ifaces.get("org.opensuse.Agama.Storage1.ISCSI.Node") { - let id = extract_id_from_path(&path).unwrap_or(0); - match ISCSINode::try_from(properties) { - Ok(mut node) => { - node.id = id; - nodes.push(node); - } - Err(error) => { - log::warn!("Not a valid iSCSI node: {}", error); - } - } - } - } - Ok(nodes) - } - - /// Sets the startup for a ISCSI node. - /// - /// * `id`: node ID. - /// * `startup`: new startup value. - pub async fn set_startup(&self, id: u32, startup: &str) -> Result<(), ServiceError> { - let proxy = self.get_node_proxy(id).await?; - Ok(proxy.set_startup(startup).await?) - } - - pub async fn login( - &self, - id: u32, - auth: ISCSIAuth, - startup: String, - ) -> Result { - let proxy = self.get_node_proxy(id).await?; - - let mut options: HashMap = auth.try_into()?; - options.insert("Startup".to_string(), Value::new(startup).try_to_owned()?); - - // FIXME: duplicated code (see discover) - let mut options_ref: HashMap<&str, &zvariant::Value<'_>> = HashMap::new(); - for (key, value) in options.iter() { - options_ref.insert(key, value); - } - let result = proxy.login(options_ref).await?; - let result = - LoginResult::try_from(result).map_err(|e| zbus::fdo::Error::Failed(e.to_string()))?; - Ok(result) - } - - pub async fn logout(&self, id: u32) -> Result { - let proxy = self.get_node_proxy(id).await?; - let result = proxy.logout().await?; - Ok(result == 0) - } - - pub async fn delete_node(&self, id: u32) -> Result<(), ServiceError> { - let path = format!("/org/opensuse/Agama/Storage1/iscsi_nodes/{}", id); - let path = ObjectPath::from_string_unchecked(path); - self.initiator_proxy.delete(&path).await?; - Ok(()) - } - - pub async fn get_node_proxy(&'a self, id: u32) -> Result, ServiceError> { - let proxy = NodeProxy::builder(&self.connection) - .path(format!("/org/opensuse/Agama/Storage1/iscsi_nodes/{}", id))? - .build() - .await?; - Ok(proxy) - } - - pub async fn set_config(&self, value: &RawValue) -> Result<(), ServiceError> { - let result = self - .iscsi_proxy - .set_config(&serde_json::to_string(value)?) - .await?; - if result == 0 { - Ok(()) - } else { - Err(ServiceError::UnsuccessfulAction( - "Failed to set iscsi config".to_string(), - )) // TODO: can we get better error? - } - } -} - -#[derive(Serialize, utoipa::ToSchema)] -pub enum LoginResult { - /// Successful login. - Success = 0, - /// Invalid startup value. - InvalidStartup = 1, - /// Failed login. - Failed = 2, -} - -#[derive(Debug, Error, PartialEq)] -#[error("Invalid iSCSI login result: {0}")] -pub struct InvalidLoginResult(u32); - -impl TryFrom for LoginResult { - type Error = InvalidLoginResult; - - fn try_from(value: u32) -> Result { - match value { - v if v == Self::Success as u32 => Ok(Self::Success), - v if v == Self::InvalidStartup as u32 => Ok(Self::InvalidStartup), - v if v == Self::Failed as u32 => Ok(Self::Failed), - _ => Err(InvalidLoginResult(value)), - } - } -} - -// TODO: the error description should come from the backend (as in deregister) -impl fmt::Display for LoginResult { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Success => write!(f, "Success"), - Self::InvalidStartup => write!(f, "Invalid startup value"), - Self::Failed => write!(f, "Could not login into the iSCSI node"), - } - } -} diff --git a/rust/agama-lib/src/storage/client/zfcp.rs b/rust/agama-lib/src/storage/client/zfcp.rs deleted file mode 100644 index d1b8e64a38..0000000000 --- a/rust/agama-lib/src/storage/client/zfcp.rs +++ /dev/null @@ -1,252 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements a client to access Agama's D-Bus API related to zFCP management. - -use std::collections::{HashMap, HashSet}; - -use futures_util::future::join_all; -use zbus::{ - fdo::{IntrospectableProxy, ObjectManagerProxy}, - zvariant::OwnedObjectPath, - Connection, -}; - -use crate::{ - error::ServiceError, - storage::{ - model::zfcp::{ZFCPController, ZFCPDisk}, - proxies::zfcp::{ControllerProxy, ManagerProxy}, - settings::zfcp::ZFCPConfig, - }, -}; -use agama_utils::dbus::{extract_id_from_path, get_property}; - -const ZFCP_CONTROLLER_PREFIX: &str = "/org/opensuse/Agama/Storage1/zfcp_controllers"; - -/// Client to connect to Agama's D-Bus API for zFCP management. -#[derive(Clone)] -pub struct ZFCPClient<'a> { - connection: Connection, - manager_proxy: ManagerProxy<'a>, - object_manager_proxy: ObjectManagerProxy<'a>, - introspectable_proxy: IntrospectableProxy<'a>, -} - -impl<'a> ZFCPClient<'a> { - pub async fn new(connection: Connection) -> Result { - let manager_proxy = ManagerProxy::new(&connection).await?; - let object_manager_proxy = ObjectManagerProxy::builder(&connection) - .destination("org.opensuse.Agama.Storage1")? - .path("/org/opensuse/Agama/Storage1")? - .build() - .await?; - let introspectable_proxy = IntrospectableProxy::builder(&connection) - .destination("org.opensuse.Agama.Storage1")? - .path("/org/opensuse/Agama/Storage1")? - .build() - .await?; - Ok(Self { - connection, - manager_proxy, - object_manager_proxy, - introspectable_proxy, - }) - } - - pub async fn supported(&self) -> Result { - let introspect = self.introspectable_proxy.introspect().await?; - // simply check if introspection contain given interface - Ok(introspect.contains("org.opensuse.Agama.Storage1.ZFCP.Manager")) - } - - pub async fn is_lun_scan_allowed(&self) -> Result { - let allowed = self.manager_proxy.allow_lunscan().await?; - Ok(allowed) - } - - pub async fn probe(&self) -> Result<(), ServiceError> { - Ok(self.manager_proxy.probe().await?) - } - - pub async fn get_disks(&self) -> Result, ServiceError> { - let managed_objects = self.object_manager_proxy.get_managed_objects().await?; - - let mut devices: Vec<(OwnedObjectPath, ZFCPDisk)> = vec![]; - for (path, ifaces) in managed_objects { - if let Some(properties) = ifaces.get("org.opensuse.Agama.Storage1.ZFCP.Disk") { - match ZFCPDisk::try_from(properties) { - Ok(device) => { - devices.push((path, device)); - } - Err(error) => { - log::warn!("Not a valid zFCP disk: {}", error); - } - } - } - } - Ok(devices) - } - - pub async fn get_controllers( - &self, - ) -> Result, ServiceError> { - let managed_objects = self.object_manager_proxy.get_managed_objects().await?; - - let mut devices: Vec<(OwnedObjectPath, ZFCPController)> = vec![]; - for (path, ifaces) in managed_objects { - if let Some(properties) = ifaces.get("org.opensuse.Agama.Storage1.ZFCP.Controller") { - let id = extract_id_from_path(&path)?.to_string(); - devices.push(( - path, - ZFCPController { - id: id.clone(), - channel: get_property(properties, "Channel")?, - lun_scan: get_property(properties, "LUNScan")?, - active: get_property(properties, "Active")?, - luns_map: self.get_luns_map(id.as_str()).await?, - }, - )) - } - } - Ok(devices) - } - - async fn get_controller_proxy( - &'a self, - controller_id: &str, - ) -> Result, ServiceError> { - let dbus = ControllerProxy::builder(&self.connection) - .path(ZFCP_CONTROLLER_PREFIX.to_string() + "/" + controller_id)? - .build() - .await?; - Ok(dbus) - } - - pub async fn activate_controller(&self, controller_id: &str) -> Result<(), ServiceError> { - let controller = self.get_controller_proxy(controller_id).await?; - controller.activate().await?; - Ok(()) - } - - pub async fn get_wwpns(&self, controller_id: &str) -> Result, ServiceError> { - let controller = self.get_controller_proxy(controller_id).await?; - let result = controller.get_wwpns().await?; - Ok(result) - } - - pub async fn get_luns( - &self, - controller_id: &str, - wwpn: &str, - ) -> Result, ServiceError> { - let controller = self.get_controller_proxy(controller_id).await?; - let result = controller.get_luns(wwpn).await?; - Ok(result) - } - - /// Obtains a LUNs map for the given controller - /// - /// Given a controller id it returns a HashMap with each of its WWPNs as keys and the list of - /// LUNS corresponding to that specific WWPN as values. - /// - /// Arguments: - /// - /// `controller_id`: controller id - pub async fn get_luns_map( - &self, - controller_id: &str, - ) -> Result>, ServiceError> { - let wwpns = self.get_wwpns(controller_id).await?; - let aresult = wwpns.into_iter().map(|wwpn| async move { - Ok(( - wwpn.clone(), - self.get_luns(controller_id, wwpn.as_str()).await?, - )) - }); - let sresult = join_all(aresult).await; - sresult - .into_iter() - .collect::>, _>>() - } - - pub async fn activate_disk( - &self, - controller_id: &str, - wwpn: &str, - lun: &str, - ) -> Result<(), ServiceError> { - let controller = self.get_controller_proxy(controller_id).await?; - let result = controller.activate_disk(wwpn, lun).await?; - if result == 0 { - Ok(()) - } else { - let text = format!("Failed to activate disk. chzdev exit code {}", result); - Err(ServiceError::UnsuccessfulAction(text)) - } - } - - pub async fn deactivate_disk( - &self, - controller_id: &str, - wwpn: &str, - lun: &str, - ) -> Result<(), ServiceError> { - let controller = self.get_controller_proxy(controller_id).await?; - let result = controller.deactivate_disk(wwpn, lun).await?; - if result == 0 { - Ok(()) - } else { - let text = format!("Failed to deactivate disk. chzdev exit code {}", result); - Err(ServiceError::UnsuccessfulAction(text)) - } - } - - pub async fn set_config(&self, config: &ZFCPConfig) -> Result<(), ServiceError> { - // at first probe zfcp to ensure controller are on dbus - self.probe().await?; - // collect controllers to activate it ( unique ) - let controllers = self.get_controllers().await?; - let mut channels: HashSet = HashSet::new(); - for dev in &config.devices { - channels.insert(dev.channel.clone()); - } - let mut channel_mapping: HashMap = HashMap::new(); - for controller in controllers { - channel_mapping.insert(controller.1.channel.clone(), controller.1.id.clone()); - } - for channel in channels { - let id = channel_mapping - .get(&channel) - .ok_or_else(|| ServiceError::ZFCPControllerNotFound(channel))?; - self.activate_controller(id).await?; - } - - // and then activate all disks - for dev in &config.devices { - let id = channel_mapping - .get(&dev.channel) - .ok_or_else(|| ServiceError::ZFCPControllerNotFound(dev.channel.clone()))?; - self.activate_disk(id, &dev.wwpn, &dev.lun).await?; - } - - Ok(()) - } -} diff --git a/rust/agama-lib/src/storage/http_client.rs b/rust/agama-lib/src/storage/http_client.rs deleted file mode 100644 index 0abc8a8516..0000000000 --- a/rust/agama-lib/src/storage/http_client.rs +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements a client to access Agama's storage service. -pub mod dasd; -pub mod iscsi; -pub mod zfcp; - -use crate::{ - http::{BaseHTTPClient, BaseHTTPClientError}, - storage::StorageSettings, -}; - -#[derive(Debug, thiserror::Error)] -pub enum StorageHTTPClientError { - #[error(transparent)] - Storage(#[from] BaseHTTPClientError), -} - -pub struct StorageHTTPClient { - client: BaseHTTPClient, -} - -impl StorageHTTPClient { - pub fn new(client: BaseHTTPClient) -> Self { - Self { client } - } - - pub async fn get_config(&self) -> Result, StorageHTTPClientError> { - Ok(self.client.get("/storage/config").await?) - } - - pub async fn set_config(&self, config: &StorageSettings) -> Result<(), StorageHTTPClientError> { - Ok(self.client.put_void("/storage/config", config).await?) - } - - pub async fn is_dirty(&self) -> Result { - Ok(self.client.get("/storage/devices/dirty").await?) - } - - pub async fn reprobe(&self) -> Result<(), StorageHTTPClientError> { - Ok(self.client.post_void("/storage/reprobe", &()).await?) - } -} diff --git a/rust/agama-lib/src/storage/http_client/dasd.rs b/rust/agama-lib/src/storage/http_client/dasd.rs deleted file mode 100644 index 5a65e910f6..0000000000 --- a/rust/agama-lib/src/storage/http_client/dasd.rs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) [2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements a client to access Agama's DASD service. - -use crate::{ - http::{BaseHTTPClient, BaseHTTPClientError}, - storage::settings::dasd::DASDConfig, -}; - -#[derive(Debug, thiserror::Error)] -pub enum DASDHTTPClientError { - #[error(transparent)] - DASD(#[from] BaseHTTPClientError), -} - -pub struct DASDHTTPClient { - client: BaseHTTPClient, -} - -impl DASDHTTPClient { - pub fn new(base: BaseHTTPClient) -> Self { - Self { client: base } - } - - pub async fn get_config(&self) -> Result, DASDHTTPClientError> { - let config: DASDConfig = self.client.get("/storage/dasd/config").await?; - // without any dasd devices config is nothing - if config.devices.is_empty() { - Ok(None) - } else { - Ok(Some(config)) - } - } - - pub async fn set_config(&self, config: &DASDConfig) -> Result<(), DASDHTTPClientError> { - if !self.supported().await? { - // TODO: should we add tracing error here? - return Ok(()); - } - Ok(self.client.put_void("/storage/dasd/config", config).await?) - } - - pub async fn supported(&self) -> Result { - Ok(self.client.get("/storage/dasd/supported").await?) - } -} diff --git a/rust/agama-lib/src/storage/http_client/iscsi.rs b/rust/agama-lib/src/storage/http_client/iscsi.rs deleted file mode 100644 index 88ea08cb52..0000000000 --- a/rust/agama-lib/src/storage/http_client/iscsi.rs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) [2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements a client to access Agama's iscsi service. - -use serde_json::value::RawValue; - -use crate::{ - http::{BaseHTTPClient, BaseHTTPClientError}, - storage::StorageSettings, -}; - -#[derive(Debug, thiserror::Error)] -pub enum ISCSIHTTPClientError { - #[error(transparent)] - ISCSI(#[from] BaseHTTPClientError), -} - -pub struct ISCSIHTTPClient { - client: BaseHTTPClient, -} - -impl ISCSIHTTPClient { - pub fn new(base: BaseHTTPClient) -> Self { - Self { client: base } - } - - pub async fn get_config(&self) -> Result, ISCSIHTTPClientError> { - // TODO: implement it as part of next step - //self.client.get("/storage/config").await - Ok(None) - } - - #[allow(clippy::borrowed_box)] - pub async fn set_config(&self, config: &Box) -> Result<(), ISCSIHTTPClientError> { - Ok(self.client.post_void("/iscsi/config", config).await?) - } -} diff --git a/rust/agama-lib/src/storage/http_client/zfcp.rs b/rust/agama-lib/src/storage/http_client/zfcp.rs deleted file mode 100644 index 019c8498eb..0000000000 --- a/rust/agama-lib/src/storage/http_client/zfcp.rs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) [2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements a client to access Agama's DASD service. - -use crate::{ - http::{BaseHTTPClient, BaseHTTPClientError}, - storage::settings::zfcp::ZFCPConfig, -}; - -#[derive(Debug, thiserror::Error)] -pub enum ZFCPHTTPClientError { - #[error(transparent)] - ZFCP(#[from] BaseHTTPClientError), -} - -pub struct ZFCPHTTPClient { - client: BaseHTTPClient, -} - -impl ZFCPHTTPClient { - pub fn new(base: BaseHTTPClient) -> Self { - Self { client: base } - } - - pub async fn get_config(&self) -> Result, ZFCPHTTPClientError> { - let config: ZFCPConfig = self.client.get("/storage/zfcp/config").await?; - // without any zfcp devices config is nothing - if config.devices.is_empty() { - Ok(None) - } else { - Ok(Some(config)) - } - } - - pub async fn set_config(&self, config: &ZFCPConfig) -> Result<(), ZFCPHTTPClientError> { - if !self.supported().await? { - // TODO: should we add tracing error here? - return Ok(()); - } - Ok(self.client.put_void("/storage/zfcp/config", config).await?) - } - - pub async fn supported(&self) -> Result { - Ok(self.client.get("/storage/zfcp/supported").await?) - } -} diff --git a/rust/agama-lib/src/storage/model.rs b/rust/agama-lib/src/storage/model.rs deleted file mode 100644 index 385216d8c4..0000000000 --- a/rust/agama-lib/src/storage/model.rs +++ /dev/null @@ -1,691 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -use std::collections::HashMap; - -use serde::{Deserialize, Serialize}; -use zbus::zvariant::{OwnedValue, Value}; - -use agama_utils::dbus::{get_optional_property, get_property}; - -pub mod dasd; -pub mod zfcp; - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -pub struct DeviceSid(u32); - -impl From for DeviceSid { - fn from(sid: u32) -> Self { - DeviceSid(sid) - } -} - -impl TryFrom for DeviceSid { - type Error = zbus::zvariant::Error; - - fn try_from(value: i32) -> Result { - u32::try_from(value) - .map(|v| v.into()) - .map_err(|_| Self::Error::Message(format!("Cannot convert sid from {}", value))) - } -} - -impl TryFrom> for DeviceSid { - type Error = zbus::zvariant::Error; - - fn try_from(value: Value) -> Result { - match value { - Value::ObjectPath(path) => path.try_into(), - Value::U32(v) => Ok(v.into()), - Value::I32(v) => v.try_into(), - _ => Err(Self::Error::Message(format!( - "Cannot convert sid from {}", - value - ))), - } - } -} - -impl TryFrom> for DeviceSid { - type Error = zbus::zvariant::Error; - - fn try_from(path: zbus::zvariant::ObjectPath) -> Result { - path.as_str() - .rsplit_once('/') - .and_then(|(_, sid)| sid.parse::().ok()) - .ok_or_else(|| Self::Error::Message(format!("Cannot parse sid from {}", path))) - .map(DeviceSid) - } -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -pub struct DeviceSize(u64); - -impl From for DeviceSize { - fn from(value: u64) -> Self { - DeviceSize(value) - } -} - -impl TryFrom for DeviceSize { - type Error = zbus::zvariant::Error; - - fn try_from(value: i64) -> Result { - u64::try_from(value) - .map(|v| v.into()) - .map_err(|_| Self::Error::Message(format!("Cannot convert size from {}", value))) - } -} - -impl TryFrom> for DeviceSize { - type Error = zbus::zvariant::Error; - - fn try_from(value: Value) -> Result { - match value { - Value::U32(v) => Ok(u64::from(v).into()), - Value::U64(v) => Ok(v.into()), - Value::I32(v) => i64::from(v).try_into(), - Value::I64(v) => v.try_into(), - _ => Err(Self::Error::Message(format!( - "Cannot convert size from {}", - value - ))), - } - } -} - -impl From for zbus::zvariant::Value<'_> { - fn from(val: DeviceSize) -> Self { - Value::new(val.0) - } -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -// note that dbus use camelCase for proposalTarget values and snake_case for volumeTarget -#[serde(rename_all = "camelCase")] -pub enum ProposalTarget { - Disk, - NewLvmVg, - ReusedLvmVg, -} - -impl TryFrom> for ProposalTarget { - type Error = zbus::zvariant::Error; - - fn try_from(value: zbus::zvariant::Value) -> Result { - let svalue: String = value.try_into()?; - match svalue.as_str() { - "disk" => Ok(Self::Disk), - "newLvmVg" => Ok(Self::NewLvmVg), - "reusedLvmVg" => Ok(Self::ReusedLvmVg), - _ => Err(zbus::zvariant::Error::Message( - format!("Wrong value for Target: {}", svalue).to_string(), - )), - } - } -} - -impl ProposalTarget { - pub fn as_dbus_string(&self) -> String { - match &self { - ProposalTarget::Disk => "disk", - ProposalTarget::NewLvmVg => "newLvmVg", - ProposalTarget::ReusedLvmVg => "reusedLvmVg", - } - .to_string() - } -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "snake_case")] -pub enum SpaceAction { - ForceDelete, - Resize, -} - -impl SpaceAction { - pub fn as_dbus_string(&self) -> String { - match &self { - Self::ForceDelete => "force_delete", - Self::Resize => "resize", - } - .to_string() - } -} - -impl TryFrom> for SpaceAction { - type Error = zbus::zvariant::Error; - - fn try_from(value: zbus::zvariant::Value) -> Result { - let svalue: String = value.try_into()?; - match svalue.as_str() { - "force_delete" => Ok(Self::ForceDelete), - "resize" => Ok(Self::Resize), - _ => Err(zbus::zvariant::Error::Message( - format!("Wrong value for SpacePolicy: {}", svalue).to_string(), - )), - } - } -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -pub struct SpaceActionSettings { - pub device: String, - pub action: SpaceAction, -} - -impl TryFrom> for SpaceActionSettings { - type Error = zbus::zvariant::Error; - - fn try_from(value: zbus::zvariant::Value) -> Result { - let mvalue: HashMap = value.try_into()?; - let res = SpaceActionSettings { - device: get_property(&mvalue, "Device")?, - action: get_property(&mvalue, "Action")?, - }; - - Ok(res) - } -} - -impl From for zbus::zvariant::Value<'_> { - fn from(val: SpaceActionSettings) -> Self { - let result: HashMap<&str, Value> = HashMap::from([ - ("Device", Value::new(val.device)), - ("Action", Value::new(val.action.as_dbus_string())), - ]); - - Value::new(result) - } -} - -/// Represents a proposal patch -> change of proposal configuration that can be partial -#[derive(Debug, Clone, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct ProposalSettingsPatch { - pub target: Option, - pub target_device: Option, - #[serde(rename = "targetPVDevices")] - pub target_pv_devices: Option>, - pub configure_boot: Option, - pub boot_device: Option, - pub encryption_password: Option, - pub encryption_method: Option, - #[serde(rename = "encryptionPBKDFunction")] - pub encryption_pbkd_function: Option, - pub space_policy: Option, - pub space_actions: Option>, - pub volumes: Option>, -} - -impl From for HashMap<&'static str, Value<'_>> { - fn from(val: ProposalSettingsPatch) -> Self { - let mut result = HashMap::new(); - if let Some(target) = val.target { - result.insert("Target", Value::new(target.as_dbus_string())); - } - if let Some(dev) = val.target_device { - result.insert("TargetDevice", Value::new(dev)); - } - if let Some(devs) = val.target_pv_devices { - result.insert("TargetPVDevices", Value::new(devs)); - } - if let Some(value) = val.configure_boot { - result.insert("ConfigureBoot", Value::new(value)); - } - if let Some(value) = val.boot_device { - result.insert("BootDevice", Value::new(value)); - } - if let Some(value) = val.encryption_password { - result.insert("EncryptionPassword", Value::new(value)); - } - if let Some(value) = val.encryption_method { - result.insert("EncryptionMethod", Value::new(value)); - } - if let Some(value) = val.encryption_pbkd_function { - result.insert("EncryptionPBKDFunction", Value::new(value)); - } - if let Some(value) = val.space_policy { - result.insert("SpacePolicy", Value::new(value)); - } - if let Some(value) = val.space_actions { - let list: Vec = value.into_iter().map(|a| a.into()).collect(); - result.insert("SpaceActions", Value::new(list)); - } - if let Some(value) = val.volumes { - let list: Vec = value.into_iter().map(|a| a.into()).collect(); - result.insert("Volumes", Value::new(list)); - } - result - } -} - -/// Represents a proposal configuration -#[derive(Debug, Clone, Serialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct ProposalSettings { - pub target: ProposalTarget, - pub target_device: Option, - #[serde(rename = "targetPVDevices")] - pub target_pv_devices: Option>, - pub configure_boot: bool, - pub boot_device: String, - pub default_boot_device: String, - pub encryption_password: String, - pub encryption_method: String, - #[serde(rename = "encryptionPBKDFunction")] - pub encryption_pbkd_function: String, - pub space_policy: String, - pub space_actions: Vec, - pub volumes: Vec, -} - -impl TryFrom> for ProposalSettings { - type Error = zbus::zvariant::Error; - - fn try_from(hash: HashMap) -> Result { - let res = ProposalSettings { - target: get_property(&hash, "Target")?, - target_device: get_optional_property(&hash, "TargetDevice")?, - target_pv_devices: get_optional_property(&hash, "TargetPVDevices")?, - configure_boot: get_property(&hash, "ConfigureBoot")?, - boot_device: get_property(&hash, "BootDevice")?, - default_boot_device: get_property(&hash, "DefaultBootDevice")?, - encryption_password: get_property(&hash, "EncryptionPassword")?, - encryption_method: get_property(&hash, "EncryptionMethod")?, - encryption_pbkd_function: get_property(&hash, "EncryptionPBKDFunction")?, - space_policy: get_property(&hash, "SpacePolicy")?, - space_actions: get_property(&hash, "SpaceActions")?, - volumes: get_property(&hash, "Volumes")?, - }; - - Ok(res) - } -} - -/// Represents a single change action done to storage -#[derive(Debug, Clone, Serialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct Action { - device: DeviceSid, - text: String, - subvol: bool, - delete: bool, - resize: bool, -} - -impl TryFrom> for Action { - type Error = zbus::zvariant::Error; - - fn try_from(hash: HashMap) -> Result { - let res = Action { - device: get_property(&hash, "Device")?, - text: get_property(&hash, "Text")?, - subvol: get_property(&hash, "Subvol")?, - delete: get_property(&hash, "Delete")?, - resize: get_property(&hash, "Resize")?, - }; - - Ok(res) - } -} - -/// Represents value for target key of Volume -/// It is snake cased when serializing to be compatible with yast2-storage-ng. -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "snake_case")] -pub enum VolumeTarget { - Default, - NewPartition, - NewVg, - Device, - Filesystem, -} - -impl From for zbus::zvariant::Value<'_> { - fn from(val: VolumeTarget) -> Self { - let str = match val { - VolumeTarget::Default => "default", - VolumeTarget::NewPartition => "new_partition", - VolumeTarget::NewVg => "new_vg", - VolumeTarget::Device => "device", - VolumeTarget::Filesystem => "filesystem", - }; - - Value::new(str) - } -} - -impl TryFrom> for VolumeTarget { - type Error = zbus::zvariant::Error; - - fn try_from(value: zbus::zvariant::Value) -> Result { - let svalue: String = value.try_into()?; - match svalue.as_str() { - "default" => Ok(VolumeTarget::Default), - "new_partition" => Ok(VolumeTarget::NewPartition), - "new_vg" => Ok(VolumeTarget::NewVg), - "device" => Ok(VolumeTarget::Device), - "filesystem" => Ok(VolumeTarget::Filesystem), - _ => Err(zbus::zvariant::Error::Message( - format!("Wrong value for Target: {}", svalue).to_string(), - )), - } - } -} - -/// Represents volume outline aka requirements for volume -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct VolumeOutline { - required: bool, - fs_types: Vec, - support_auto_size: bool, - adjust_by_ram: bool, - snapshots_affect_sizes: bool, - size_relevant_volumes: Vec, -} - -impl TryFrom> for VolumeOutline { - type Error = zbus::zvariant::Error; - - fn try_from(value: zbus::zvariant::Value) -> Result { - let mvalue: HashMap = value.try_into()?; - let res = VolumeOutline { - required: get_property(&mvalue, "Required")?, - fs_types: get_property(&mvalue, "FsTypes")?, - support_auto_size: get_property(&mvalue, "SupportAutoSize")?, - adjust_by_ram: get_property(&mvalue, "AdjustByRam")?, - snapshots_affect_sizes: get_property(&mvalue, "SnapshotsAffectSizes")?, - size_relevant_volumes: get_property(&mvalue, "SizeRelevantVolumes")?, - }; - - Ok(res) - } -} - -/// Represents a single volume -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct Volume { - mount_path: String, - mount_options: Vec, - target: VolumeTarget, - target_device: Option, - fs_type: String, - min_size: Option, - max_size: Option, - auto_size: bool, - outline: Option, -} - -impl From for zbus::zvariant::Value<'_> { - fn from(val: Volume) -> Self { - let mut result: HashMap<&str, Value> = HashMap::from([ - ("MountPath", Value::new(val.mount_path)), - ("MountOptions", Value::new(val.mount_options)), - ("Target", val.target.into()), - ("FsType", Value::new(val.fs_type)), - ("AutoSize", Value::new(val.auto_size)), - ]); - if let Some(dev) = val.target_device { - result.insert("TargetDevice", Value::new(dev)); - } - if let Some(value) = val.min_size { - result.insert("MinSize", value.into()); - } - if let Some(value) = val.max_size { - result.insert("MaxSize", value.into()); - } - // intentionally skip outline as it is not send to dbus and act as read only parameter - Value::new(result) - } -} - -impl TryFrom> for Volume { - type Error = zbus::zvariant::Error; - - fn try_from(object: zbus::zvariant::Value) -> Result { - let hash: HashMap = object.try_into()?; - - hash.try_into() - } -} - -impl TryFrom> for Volume { - type Error = zbus::zvariant::Error; - - fn try_from(volume_hash: HashMap) -> Result { - let res = Volume { - mount_path: get_property(&volume_hash, "MountPath")?, - mount_options: get_property(&volume_hash, "MountOptions")?, - target: get_property(&volume_hash, "Target")?, - target_device: get_optional_property(&volume_hash, "TargetDevice")?, - fs_type: get_property(&volume_hash, "FsType")?, - min_size: get_optional_property(&volume_hash, "MinSize")?, - max_size: get_optional_property(&volume_hash, "MaxSize")?, - auto_size: get_property(&volume_hash, "AutoSize")?, - outline: get_optional_property(&volume_hash, "Outline")?, - }; - - Ok(res) - } -} - -/// Information about system device created by composition to reflect different devices on system -// FIXME Device schema is not generated because it collides with the network Device. -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct Device { - pub device_info: DeviceInfo, - pub block_device: Option, - pub component: Option, - pub drive: Option, - pub filesystem: Option, - pub lvm_lv: Option, - pub lvm_vg: Option, - pub md: Option, - pub multipath: Option, - pub partition: Option, - pub partition_table: Option, - pub raid: Option, -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -pub struct DeviceInfo { - pub sid: DeviceSid, - pub name: String, - pub description: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct BlockDevice { - pub active: bool, - pub encrypted: bool, - pub size: DeviceSize, - pub shrinking: ShrinkingInfo, - pub start: u64, - pub systems: Vec, - pub udev_ids: Vec, - pub udev_paths: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub enum ShrinkingInfo { - Supported(DeviceSize), - Unsupported(Vec), -} - -impl TryFrom> for ShrinkingInfo { - type Error = zbus::zvariant::Error; - - fn try_from(value: zbus::zvariant::Value) -> Result { - let hash: HashMap = value.try_clone()?.try_into()?; - let mut info: Option = None; - - if let Some(size) = get_optional_property(&hash, "Supported")? { - info = Some(Self::Supported(size)); - } - if let Some(reasons) = get_optional_property(&hash, "Unsupported")? { - info = Some(Self::Unsupported(reasons)); - } - - info.ok_or(Self::Error::Message(format!( - "Wrong value for Shrinking: {}", - value - ))) - } -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct Component { - #[serde(rename = "type")] - pub component_type: String, - pub device_names: Vec, - pub devices: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct Drive { - #[serde(rename = "type")] - pub drive_type: String, - pub vendor: String, - pub model: String, - pub bus: String, - pub bus_id: String, - pub driver: Vec, - pub transport: String, - pub info: DriveInfo, -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct DriveInfo { - pub sd_card: bool, - #[serde(rename = "dellBOSS")] - pub dell_boss: bool, -} - -impl TryFrom> for DriveInfo { - type Error = zbus::zvariant::Error; - - fn try_from(object: zbus::zvariant::Value) -> Result { - let hash: HashMap = object.try_into()?; - - hash.try_into() - } -} - -impl TryFrom> for DriveInfo { - type Error = zbus::zvariant::Error; - - fn try_from(info_hash: HashMap) -> Result { - let res = DriveInfo { - sd_card: get_property(&info_hash, "SDCard")?, - dell_boss: get_property(&info_hash, "DellBOSS")?, - }; - - Ok(res) - } -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct Filesystem { - pub sid: DeviceSid, - #[serde(rename = "type")] - pub fs_type: String, - pub mount_path: String, - pub label: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct LvmLv { - pub volume_group: DeviceSid, -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct LvmVg { - pub size: DeviceSize, - pub physical_volumes: Vec, - pub logical_volumes: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct Md { - pub uuid: String, - pub level: String, - pub devices: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct Multipath { - pub wires: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct Partition { - pub device: DeviceSid, - pub efi: bool, -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct PartitionTable { - #[serde(rename = "type")] - pub ptable_type: String, - pub partitions: Vec, - pub unused_slots: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct UnusedSlot { - pub start: u64, - pub size: DeviceSize, -} - -impl TryFrom> for UnusedSlot { - type Error = zbus::zvariant::Error; - - fn try_from(value: Value) -> Result { - let slot_info: (u64, u64) = value.try_into()?; - - Ok(UnusedSlot { - start: slot_info.0, - size: slot_info.1.into(), - }) - } -} - -#[derive(Debug, Clone, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct Raid { - pub devices: Vec, -} diff --git a/rust/agama-lib/src/storage/model/dasd.rs b/rust/agama-lib/src/storage/model/dasd.rs deleted file mode 100644 index 26c9bd4b5e..0000000000 --- a/rust/agama-lib/src/storage/model/dasd.rs +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements a data model for DASD devices management. -use std::collections::HashMap; - -use serde::{Deserialize, Serialize}; -use zbus::zvariant::OwnedValue; - -use crate::error::ServiceError; -use agama_utils::dbus::get_property; - -/// Represents a DASD device (specific to s390x systems). -#[derive(Clone, Debug, Deserialize, Serialize, Default, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct DASDDevice { - pub id: String, - pub enabled: bool, - pub device_name: String, - pub formatted: bool, - pub diag: bool, - pub status: String, - pub device_type: String, - pub access_type: String, - pub partition_info: String, -} -#[derive(Clone, Debug, Deserialize, Serialize, Default, utoipa::ToSchema)] -pub struct DASDFormatSummary { - pub total: u32, - pub step: u32, - pub done: bool, -} - -impl TryFrom<&HashMap> for DASDDevice { - type Error = ServiceError; - - fn try_from(value: &HashMap) -> Result { - Ok(DASDDevice { - id: get_property(value, "Id")?, - enabled: get_property(value, "Enabled")?, - device_name: get_property(value, "DeviceName")?, - formatted: get_property(value, "Formatted")?, - diag: get_property(value, "Diag")?, - status: get_property(value, "Status")?, - device_type: get_property(value, "Type")?, - access_type: get_property(value, "AccessType")?, - partition_info: get_property(value, "PartitionInfo")?, - }) - } -} diff --git a/rust/agama-lib/src/storage/model/zfcp.rs b/rust/agama-lib/src/storage/model/zfcp.rs deleted file mode 100644 index 6dd47e12f2..0000000000 --- a/rust/agama-lib/src/storage/model/zfcp.rs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements a data model for zFCP devices management. -use std::collections::HashMap; - -use serde::{Deserialize, Serialize}; -use zbus::zvariant::OwnedValue; - -use crate::error::ServiceError; -use agama_utils::dbus::get_property; - -/// Represents a zFCP disk (specific to s390x systems). -#[derive(Clone, Debug, Deserialize, Serialize, Default, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct ZFCPDisk { - /// Name of the zFCP device (e.g., /dev/sda) - pub name: String, - /// zFCP controller channel id (e.g., 0.0.fa00) - pub channel: String, - /// WWPN of the targer port (e.g., 0x500507630300c562) - pub wwpn: String, - /// LUN of the SCSI device (e.g. 0x4010403300000000) - pub lun: String, -} - -impl TryFrom<&HashMap> for ZFCPDisk { - type Error = ServiceError; - - fn try_from(value: &HashMap) -> Result { - Ok(ZFCPDisk { - name: get_property(value, "Name")?, - channel: get_property(value, "Channel")?, - wwpn: get_property(value, "WWPN")?, - lun: get_property(value, "LUN")?, - }) - } -} - -/// Represents a zFCP controller (specific to s390x systems). -#[derive(Clone, Debug, Deserialize, Serialize, Default, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct ZFCPController { - /// unique internal ID for given controller - pub id: String, - /// zFCP controller channel id (e.g., 0.0.fa00) - pub channel: String, - /// flag whenever channel is performing LUN auto scan - pub lun_scan: bool, - /// flag whenever channel is active - pub active: bool, - /// map of associated WWPNs and its LUNs - pub luns_map: HashMap>, -} diff --git a/rust/agama-lib/src/storage/proxies.rs b/rust/agama-lib/src/storage/proxies.rs deleted file mode 100644 index 1e9717aace..0000000000 --- a/rust/agama-lib/src/storage/proxies.rs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -mod storage1; -pub use storage1::Storage1Proxy; - -mod devices; -pub use devices::DevicesProxy; - -mod calculator; -pub use calculator::CalculatorProxy as ProposalCalculatorProxy; - -mod proposal; -pub use proposal::ProposalProxy; - -pub mod dasd; -pub mod iscsi; -pub mod zfcp; diff --git a/rust/agama-lib/src/storage/proxies/calculator.rs b/rust/agama-lib/src/storage/proxies/calculator.rs deleted file mode 100644 index ea8c09ee62..0000000000 --- a/rust/agama-lib/src/storage/proxies/calculator.rs +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) [2025-2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! # D-Bus interface proxy for: `org.opensuse.Agama.Storage1.Proposal.Calculator` -//! -//! This code was generated by `zbus-xmlgen` `5.0.0` from D-Bus introspection data. -//! Source: `org.opensuse.Agama.Storage1.bus.xml`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::IntrospectableProxy`] -//! * [`zbus::fdo::ObjectManagerProxy`] -//! * [`zbus::fdo::PropertiesProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy( - default_service = "org.opensuse.Agama.Storage1", - default_path = "/org/opensuse/Agama/Storage1", - interface = "org.opensuse.Agama.Storage1.Proposal.Calculator", - assume_defaults = true -)] -pub trait Calculator { - /// Calculate method - fn calculate( - &self, - settings: std::collections::HashMap<&str, &zbus::zvariant::Value<'_>>, - ) -> zbus::Result; - - /// DefaultVolume method - fn default_volume( - &self, - mount_path: &str, - ) -> zbus::Result>; - - /// EncryptionMethods property - #[zbus(property)] - fn encryption_methods(&self) -> zbus::Result>; - - /// ProductMountPoints property - #[zbus(property)] - fn product_mount_points(&self) -> zbus::Result>; - - /// Result property - #[zbus(property)] - fn result(&self) -> zbus::Result; -} diff --git a/rust/agama-lib/src/storage/proxies/dasd.rs b/rust/agama-lib/src/storage/proxies/dasd.rs deleted file mode 100644 index 0232deac45..0000000000 --- a/rust/agama-lib/src/storage/proxies/dasd.rs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -mod manager; -pub use manager::ManagerProxy; - -mod device; -pub use device::DeviceProxy; diff --git a/rust/agama-lib/src/storage/proxies/dasd/device.rs b/rust/agama-lib/src/storage/proxies/dasd/device.rs deleted file mode 100644 index f42d12e042..0000000000 --- a/rust/agama-lib/src/storage/proxies/dasd/device.rs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! # D-Bus interface proxy for: `org.opensuse.Agama.Storage1.DASD.Device` -//! -//! This code was generated by `zbus-xmlgen` `5.0.0` from D-Bus introspection data. -//! Source: `org.opensuse.Agama.Storage1.DASD.Device.bus.xml`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::PropertiesProxy`] -//! * [`zbus::fdo::IntrospectableProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy( - default_service = "org.opensuse.Agama.Storage1", - interface = "org.opensuse.Agama.Storage1.DASD.Device", - assume_defaults = true -)] -pub trait Device { - /// AccessType property - #[zbus(property)] - fn access_type(&self) -> zbus::Result; - - /// DeviceName property - #[zbus(property)] - fn device_name(&self) -> zbus::Result; - - /// Diag property - #[zbus(property)] - fn diag(&self) -> zbus::Result; - - /// Enabled property - #[zbus(property)] - fn enabled(&self) -> zbus::Result; - - /// Formatted property - #[zbus(property)] - fn formatted(&self) -> zbus::Result; - - /// Id property - #[zbus(property)] - fn id(&self) -> zbus::Result; - - /// PartitionInfo property - #[zbus(property)] - fn partition_info(&self) -> zbus::Result; - - /// Status property - #[zbus(property)] - fn status(&self) -> zbus::Result; - - /// Type property - #[zbus(property)] - fn type_(&self) -> zbus::Result; -} diff --git a/rust/agama-lib/src/storage/proxies/dasd/manager.rs b/rust/agama-lib/src/storage/proxies/dasd/manager.rs deleted file mode 100644 index dc0de1d45a..0000000000 --- a/rust/agama-lib/src/storage/proxies/dasd/manager.rs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! # D-Bus interface proxy for: `org.opensuse.Agama.Storage1.DASD.Manager` -//! -//! This code was generated by `zbus-xmlgen` `5.0.0` from D-Bus introspection data. -//! Source: `org.opensuse.Agama.Storage1.bus.xml`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::IntrospectableProxy`] -//! * [`zbus::fdo::ObjectManagerProxy`] -//! * [`zbus::fdo::PropertiesProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy( - default_service = "org.opensuse.Agama.Storage1", - default_path = "/org/opensuse/Agama/Storage1", - interface = "org.opensuse.Agama.Storage1.DASD.Manager", - assume_defaults = true -)] -pub trait Manager { - /// Disable method - fn disable(&self, devices: &[&zbus::zvariant::ObjectPath<'_>]) -> zbus::Result; - - /// Enable method - fn enable(&self, devices: &[&zbus::zvariant::ObjectPath<'_>]) -> zbus::Result; - - /// Format method - fn format( - &self, - devices: &[&zbus::zvariant::ObjectPath<'_>], - ) -> zbus::Result<(u32, zbus::zvariant::OwnedObjectPath)>; - - /// Probe method - fn probe(&self) -> zbus::Result<()>; - - /// SetDiag method - fn set_diag( - &self, - devices: &[&zbus::zvariant::ObjectPath<'_>], - diag: bool, - ) -> zbus::Result; -} diff --git a/rust/agama-lib/src/storage/proxies/devices.rs b/rust/agama-lib/src/storage/proxies/devices.rs deleted file mode 100644 index 08091d9fc2..0000000000 --- a/rust/agama-lib/src/storage/proxies/devices.rs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) [2024-2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! # D-Bus interface proxy for: `org.opensuse.Agama.Storage1.Proposal.Calculator` -//! -//! This code was generated by `zbus-xmlgen` `5.0.0` from D-Bus introspection data. -//! Source: `org.opensuse.Agama.Storage1.bus.xml`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::IntrospectableProxy`] -//! * [`zbus::fdo::ObjectManagerProxy`] -//! * [`zbus::fdo::PropertiesProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy( - default_service = "org.opensuse.Agama.Storage1", - default_path = "/org/opensuse/Agama/Storage1", - interface = "org.opensuse.Agama.Storage1.Devices", - assume_defaults = true -)] -pub trait Devices { - /// Actions property - #[zbus(property)] - fn actions( - &self, - ) -> zbus::Result>>; - - /// AvailableDrives property - #[zbus(property)] - fn available_drives(&self) -> zbus::Result>; - - /// CandidateDrives property - #[zbus(property)] - fn candidate_drives(&self) -> zbus::Result>; - - /// AvailableMdRaids property - #[zbus(property)] - fn available_md_raids(&self) -> zbus::Result>; - - /// CandidateMdRaids property - #[zbus(property)] - fn candidate_md_raids(&self) -> zbus::Result>; -} diff --git a/rust/agama-lib/src/storage/proxies/iscsi.rs b/rust/agama-lib/src/storage/proxies/iscsi.rs deleted file mode 100644 index ca3d1ef5be..0000000000 --- a/rust/agama-lib/src/storage/proxies/iscsi.rs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -mod initiator; -pub use initiator::InitiatorProxy; - -mod node; -pub use node::NodeProxy; - -use zbus::proxy; -#[proxy( - default_service = "org.opensuse.Agama.Storage1", - default_path = "/org/opensuse/Agama/Storage1/ISCSI", - interface = "org.opensuse.Agama.Storage1.ISCSI", - assume_defaults = true -)] -pub trait ISCSI { - /// SetConfig method - fn set_config(&self, serialized_config: &str) -> zbus::Result; -} diff --git a/rust/agama-lib/src/storage/proxies/iscsi/initiator.rs b/rust/agama-lib/src/storage/proxies/iscsi/initiator.rs deleted file mode 100644 index 171d49fb0c..0000000000 --- a/rust/agama-lib/src/storage/proxies/iscsi/initiator.rs +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! # D-Bus interface proxy for: `org.opensuse.Agama.Storage1.ISCSI.Initiator` -//! -//! This code was generated by `zbus-xmlgen` `5.0.0` from D-Bus introspection data. -//! Source: `org.opensuse.Agama.Storage1.ISCSI.Initiator.bus.xml`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::IntrospectableProxy`] -//! * [`zbus::fdo::ObjectManagerProxy`] -//! * [`zbus::fdo::PropertiesProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy( - default_service = "org.opensuse.Agama.Storage1", - default_path = "/org/opensuse/Agama/Storage1", - interface = "org.opensuse.Agama.Storage1.ISCSI.Initiator", - assume_defaults = true -)] -pub trait Initiator { - /// Delete method - fn delete(&self, node: &zbus::zvariant::ObjectPath<'_>) -> zbus::Result; - - /// Discover method - fn discover( - &self, - address: &str, - port: u32, - options: std::collections::HashMap<&str, &zbus::zvariant::Value<'_>>, - ) -> zbus::Result; - - /// IBFT property - #[zbus(property, name = "IBFT")] - fn ibft(&self) -> zbus::Result; - - /// InitiatorName property - #[zbus(property)] - fn initiator_name(&self) -> zbus::Result; - #[zbus(property)] - fn set_initiator_name(&self, value: &str) -> zbus::Result<()>; -} diff --git a/rust/agama-lib/src/storage/proxies/iscsi/node.rs b/rust/agama-lib/src/storage/proxies/iscsi/node.rs deleted file mode 100644 index c1d85a15e2..0000000000 --- a/rust/agama-lib/src/storage/proxies/iscsi/node.rs +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! # D-Bus interface proxy for: `org.opensuse.Agama.Storage1.ISCSI.Node` -//! -//! This code was generated by `zbus-xmlgen` `5.0.0` from D-Bus introspection data. -//! Source: `org.opensuse.Agama.Storage1.ISCSI.Node.bus.xml`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::PropertiesProxy`] -//! * [`zbus::fdo::IntrospectableProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy( - default_service = "org.opensuse.Agama.Storage1", - interface = "org.opensuse.Agama.Storage1.ISCSI.Node", - assume_defaults = true -)] -pub trait Node { - /// Login method - fn login( - &self, - options: std::collections::HashMap<&str, &zbus::zvariant::Value<'_>>, - ) -> zbus::Result; - - /// Logout method - fn logout(&self) -> zbus::Result; - - /// Address property - #[zbus(property)] - fn address(&self) -> zbus::Result; - - /// Connected property - #[zbus(property)] - fn connected(&self) -> zbus::Result; - - /// IBFT property - #[zbus(property, name = "IBFT")] - fn ibft(&self) -> zbus::Result; - - /// Interface property - #[zbus(property)] - fn interface(&self) -> zbus::Result; - - /// Port property - #[zbus(property)] - fn port(&self) -> zbus::Result; - - /// Startup property - #[zbus(property)] - fn startup(&self) -> zbus::Result; - #[zbus(property)] - fn set_startup(&self, value: &str) -> zbus::Result<()>; - - /// Target property - #[zbus(property)] - fn target(&self) -> zbus::Result; -} diff --git a/rust/agama-lib/src/storage/proxies/proposal.rs b/rust/agama-lib/src/storage/proxies/proposal.rs deleted file mode 100644 index ea6a9626ec..0000000000 --- a/rust/agama-lib/src/storage/proxies/proposal.rs +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! # D-Bus interface proxy for: `org.opensuse.Agama.Storage1.Proposal` -//! -//! This code was generated by `zbus-xmlgen` `5.0.0` from D-Bus introspection data. -//! Source: `org.opensuse.Agama.Storage1.Proposal.bus.xml`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::IntrospectableProxy`] -//! * [`zbus::fdo::PropertiesProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy( - default_service = "org.opensuse.Agama.Storage1", - default_path = "/org/opensuse/Agama/Storage1/Proposal", - interface = "org.opensuse.Agama.Storage1.Proposal", - assume_defaults = true -)] -pub trait Proposal { - /// Actions property - #[zbus(property)] - fn actions( - &self, - ) -> zbus::Result>>; - - /// Settings property - #[zbus(property)] - fn settings( - &self, - ) -> zbus::Result>; -} diff --git a/rust/agama-lib/src/storage/proxies/storage1.rs b/rust/agama-lib/src/storage/proxies/storage1.rs deleted file mode 100644 index d8b59af15b..0000000000 --- a/rust/agama-lib/src/storage/proxies/storage1.rs +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (c) [2024-2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! # D-Bus interface proxy for: `org.opensuse.Agama.Storage1` -//! -//! This code was generated by `zbus-xmlgen` `5.0.0` from D-Bus introspection data. -//! Source: `org.opensuse.Agama.Storage1.bus.xml`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::IntrospectableProxy`] -//! * [`zbus::fdo::ObjectManagerProxy`] -//! * [`zbus::fdo::PropertiesProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy( - default_service = "org.opensuse.Agama.Storage1", - default_path = "/org/opensuse/Agama/Storage1", - interface = "org.opensuse.Agama.Storage1", - assume_defaults = true -)] -pub trait Storage1 { - /// Storage configured signal - #[zbus(signal)] - fn configured(&self, client_id: &str) -> zbus::Result<()>; - - /// Finish method - fn finish(&self) -> zbus::Result<()>; - - /// Install method - fn install(&self) -> zbus::Result<()>; - - /// Probe method - fn probe( - &self, - data: std::collections::HashMap<&str, &zbus::zvariant::Value<'_>>, - ) -> zbus::Result<()>; - - /// Reprobe method - fn reprobe( - &self, - data: std::collections::HashMap<&str, &zbus::zvariant::Value<'_>>, - ) -> zbus::Result<()>; - - /// Reactivate method - fn reactivate( - &self, - data: std::collections::HashMap<&str, &zbus::zvariant::Value<'_>>, - ) -> zbus::Result<()>; - - /// Set the storage config according to the JSON schema - fn set_config( - &self, - settings: &str, - data: std::collections::HashMap<&str, &zbus::zvariant::Value<'_>>, - ) -> zbus::Result; - - /// Reset the storage config to the default value - fn reset_config( - &self, - data: std::collections::HashMap<&str, &zbus::zvariant::Value<'_>>, - ) -> zbus::Result; - - /// Set the storage config model according to the JSON schema - fn set_config_model( - &self, - model: &str, - data: std::collections::HashMap<&str, &zbus::zvariant::Value<'_>>, - ) -> zbus::Result; - - /// Get the current storage config according to the JSON schema - fn get_config(&self) -> zbus::Result; - - /// Get the storage config model according to the JSON schema - fn get_config_model(&self) -> zbus::Result; - - /// Solve a storage config model - fn solve_config_model(&self, model: &str) -> zbus::Result; - - /// DeprecatedSystem property - #[zbus(property)] - fn deprecated_system(&self) -> zbus::Result; -} diff --git a/rust/agama-lib/src/storage/proxies/zfcp.rs b/rust/agama-lib/src/storage/proxies/zfcp.rs deleted file mode 100644 index 0f8fac590a..0000000000 --- a/rust/agama-lib/src/storage/proxies/zfcp.rs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -mod manager; -pub use manager::ManagerProxy; - -mod controller; -pub use controller::ControllerProxy; - -mod disk; -pub use disk::DiskProxy; diff --git a/rust/agama-lib/src/storage/proxies/zfcp/controller.rs b/rust/agama-lib/src/storage/proxies/zfcp/controller.rs deleted file mode 100644 index b3749bf7be..0000000000 --- a/rust/agama-lib/src/storage/proxies/zfcp/controller.rs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! # D-Bus interface proxy for: `org.opensuse.Agama.Storage1.ZFCP.Controller` -//! -//! This code was generated by `zbus-xmlgen` `5.0.0` from D-Bus introspection data. -//! Source: `org.opensuse.Agama.Storage1.ZFCP.Controller.bus.xml`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::PropertiesProxy`] -//! * [`zbus::fdo::IntrospectableProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy( - default_service = "org.opensuse.Agama.Storage1", - default_path = "/org/opensuse/Agama/Storage1", - interface = "org.opensuse.Agama.Storage1.ZFCP.Controller", - assume_defaults = true -)] -pub trait Controller { - /// Activate method - fn activate(&self) -> zbus::Result; - - /// ActivateDisk method - fn activate_disk(&self, wwpn: &str, lun: &str) -> zbus::Result; - - /// DeactivateDisk method - fn deactivate_disk(&self, wwpn: &str, lun: &str) -> zbus::Result; - - /// GetLUNs method - #[zbus(name = "GetLUNs")] - fn get_luns(&self, wwpn: &str) -> zbus::Result>; - - /// GetWWPNs method - #[zbus(name = "GetWWPNs")] - fn get_wwpns(&self) -> zbus::Result>; - - /// Active property - #[zbus(property)] - fn active(&self) -> zbus::Result; - - /// Channel property - #[zbus(property)] - fn channel(&self) -> zbus::Result; - - /// LUNScan property - #[zbus(property, name = "LUNScan")] - fn lunscan(&self) -> zbus::Result; -} diff --git a/rust/agama-lib/src/storage/proxies/zfcp/disk.rs b/rust/agama-lib/src/storage/proxies/zfcp/disk.rs deleted file mode 100644 index beeac4afe3..0000000000 --- a/rust/agama-lib/src/storage/proxies/zfcp/disk.rs +++ /dev/null @@ -1,44 +0,0 @@ -//! # D-Bus interface proxy for: `org.opensuse.Agama.Storage1.ZFCP.Disk` -//! -//! This code was generated by `zbus-xmlgen` `5.0.0` from D-Bus introspection data. -//! Source: `org.opensuse.Agama.Storage1.ZFCP.Disk.bus.xml`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::PropertiesProxy`] -//! * [`zbus::fdo::IntrospectableProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy( - default_service = "org.opensuse.Agama.Storage1", - default_path = "/org/opensuse/Agama/Storage1", - interface = "org.opensuse.Agama.Storage1.ZFCP.Disk", - assume_defaults = true -)] -pub trait Disk { - /// Channel property - #[zbus(property)] - fn channel(&self) -> zbus::Result; - - /// LUN property - #[zbus(property, name = "LUN")] - fn lun(&self) -> zbus::Result; - - /// Name property - #[zbus(property)] - fn name(&self) -> zbus::Result; - - /// WWPN property - #[zbus(property, name = "WWPN")] - fn wwpn(&self) -> zbus::Result; -} diff --git a/rust/agama-lib/src/storage/proxies/zfcp/manager.rs b/rust/agama-lib/src/storage/proxies/zfcp/manager.rs deleted file mode 100644 index 829c28c22e..0000000000 --- a/rust/agama-lib/src/storage/proxies/zfcp/manager.rs +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! # D-Bus interface proxy for: `org.opensuse.Agama.Storage1.ZFCP.Manager` -//! -//! This code was generated by `zbus-xmlgen` `5.0.0` from D-Bus introspection data. -//! Source: `org.opensuse.Agama.Storage1.DASD.Manager.bus.xml`. -//! -//! You may prefer to adapt it, instead of using it verbatim. -//! -//! More information can be found in the [Writing a client proxy] section of the zbus -//! documentation. -//! -//! This type implements the [D-Bus standard interfaces], (`org.freedesktop.DBus.*`) for which the -//! following zbus API can be used: -//! -//! * [`zbus::fdo::PropertiesProxy`] -//! * [`zbus::fdo::IntrospectableProxy`] -//! * [`zbus::fdo::ObjectManagerProxy`] -//! -//! Consequently `zbus-xmlgen` did not generate code for the above interfaces. -//! -//! [Writing a client proxy]: https://dbus2.github.io/zbus/client.html -//! [D-Bus standard interfaces]: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces, -use zbus::proxy; -#[proxy( - default_service = "org.opensuse.Agama.Storage1", - default_path = "/org/opensuse/Agama/Storage1", - interface = "org.opensuse.Agama.Storage1.ZFCP.Manager", - assume_defaults = true -)] -pub trait Manager { - /// Probe method - fn probe(&self) -> zbus::Result<()>; - - /// AllowLUNScan property - #[zbus(property, name = "AllowLUNScan")] - fn allow_lunscan(&self) -> zbus::Result; -} diff --git a/rust/agama-lib/src/storage/settings.rs b/rust/agama-lib/src/storage/settings.rs deleted file mode 100644 index 47cc854f7a..0000000000 --- a/rust/agama-lib/src/storage/settings.rs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Representation of the storage settings - -pub mod dasd; -pub mod zfcp; - -use crate::install_settings::InstallSettings; -use serde::{Deserialize, Serialize}; -use serde_json::value::RawValue; - -/// Storage settings for installation -#[derive(Debug, Default, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct StorageSettings { - #[serde(default)] - #[serde(skip_serializing_if = "Option::is_none")] - #[schema(value_type = String)] - pub storage: Option>, - #[serde(default, rename = "legacyAutoyastStorage")] - #[serde(skip_serializing_if = "Option::is_none")] - #[schema(value_type = String)] - pub storage_autoyast: Option>, -} - -impl From<&InstallSettings> for StorageSettings { - fn from(install_settings: &InstallSettings) -> Self { - StorageSettings { - storage: install_settings.storage.clone(), - storage_autoyast: install_settings.storage_autoyast.clone(), - } - } -} diff --git a/rust/agama-lib/src/storage/settings/dasd.rs b/rust/agama-lib/src/storage/settings/dasd.rs deleted file mode 100644 index f2e423cd4c..0000000000 --- a/rust/agama-lib/src/storage/settings/dasd.rs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) [2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Representation of the DASD settings used in set/get config - -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, Default, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct DASDConfig { - pub devices: Vec, -} - -#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub enum DASDDeviceState { - #[default] - Active, - Offline, -} - -/// Representation of single DASD device in settings used in set/get config -#[derive(Clone, Debug, Default, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct DASDDeviceConfig { - /// DASD device Channel. Mandatory part of device config. - pub channel: String, - /// State of device. Optional, if missing then default is active. - pub state: Option, - /// explicit request to format device. If missing then it will format only if not already formatted. - /// false means never format. - pub format: Option, - /// Set diag flag for device. If missing, then do not change what device already has set. - pub diag: Option, -} diff --git a/rust/agama-lib/src/storage/settings/zfcp.rs b/rust/agama-lib/src/storage/settings/zfcp.rs deleted file mode 100644 index 222c69b167..0000000000 --- a/rust/agama-lib/src/storage/settings/zfcp.rs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) [2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Representation of the zFCP settings used in set/get config - -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, Default, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct ZFCPConfig { - pub devices: Vec, -} - -/// Representation of single zFCP device in settings used in set/get config -#[derive(Clone, Debug, Default, Serialize, Deserialize, utoipa::ToSchema)] -#[serde(rename_all = "camelCase")] -pub struct ZFCPDeviceConfig { - /// zFCP controller channel id (e.g., 0.0.fa00) - pub channel: String, - /// WWPN of the targer port (e.g., 0x500507630300c562) - pub wwpn: String, - /// LUN of the SCSI device (e.g. 0x4010403300000000) - pub lun: String, -} diff --git a/rust/agama-lib/src/storage/store.rs b/rust/agama-lib/src/storage/store.rs deleted file mode 100644 index 6c95a5f0b8..0000000000 --- a/rust/agama-lib/src/storage/store.rs +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright (c) [2024-2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements the store for the storage settings. - -pub mod dasd; -pub mod zfcp; - -use super::{http_client::StorageHTTPClientError, StorageSettings}; -use crate::{http::BaseHTTPClient, storage::http_client::StorageHTTPClient}; - -#[derive(Debug, thiserror::Error)] -#[error("Error processing storage settings: {0}")] -pub struct StorageStoreError(#[from] StorageHTTPClientError); - -type StorageStoreResult = Result; - -/// Loads and stores the storage settings from/to the HTTP service. -pub struct StorageStore { - storage_client: StorageHTTPClient, -} - -impl StorageStore { - pub fn new(client: BaseHTTPClient) -> StorageStore { - Self { - storage_client: StorageHTTPClient::new(client), - } - } - - pub async fn load(&self) -> StorageStoreResult> { - Ok(self.storage_client.get_config().await?) - } - - pub async fn store(&self, settings: &StorageSettings) -> StorageStoreResult<()> { - self.storage_client.set_config(settings).await?; - Ok(()) - } -} - -#[cfg(test)] -mod test { - use super::*; - use crate::http::BaseHTTPClient; - use httpmock::prelude::*; - use std::error::Error; - use tokio::test; // without this, "error: async functions cannot be used for tests" - - fn storage_store(mock_server_url: String) -> StorageStore { - let bhc = BaseHTTPClient::new(mock_server_url).unwrap(); - let client = StorageHTTPClient::new(bhc); - StorageStore { - storage_client: client, - } - } - - #[test] - async fn test_getting_storage() -> Result<(), Box> { - let server = MockServer::start(); - let storage_mock = server.mock(|when, then| { - when.method(GET).path("/api/storage/config"); - then.status(200) - .header("content-type", "application/json") - .body( - r#"{ - "storage": { "some": "stuff" } - }"#, - ); - }); - let url = server.url("/api"); - - let store = storage_store(url); - let opt_settings = store.load().await?; - assert!(opt_settings.is_some()); - let settings = opt_settings.unwrap(); - - // main assertion - assert_eq!(settings.storage.unwrap().get(), r#"{ "some": "stuff" }"#); - assert!(settings.storage_autoyast.is_none()); - - // Ensure the specified mock was called exactly one time (or fail with a detailed error description). - storage_mock.assert(); - Ok(()) - } - - #[test] - async fn test_getting_storage_null() -> Result<(), Box> { - let server = MockServer::start(); - let storage_mock = server.mock(|when, then| { - when.method(GET).path("/api/storage/config"); - then.status(200) - .header("content-type", "application/json") - .body("null"); - }); - let url = server.url("/api"); - - let store = storage_store(url); - let opt_settings = store.load().await?; - - // main assertion - assert!(opt_settings.is_none()); - - // Ensure the specified mock was called exactly one time (or fail with a detailed error description). - storage_mock.assert(); - Ok(()) - } - - #[test] - async fn test_setting_storage_ok() -> Result<(), Box> { - let server = MockServer::start(); - let storage_mock = server.mock(|when, then| { - when.method(PUT) - .path("/api/storage/config") - .header("content-type", "application/json") - .body(r#"{"legacyAutoyastStorage":{ "some" : "data" }}"#); - then.status(200); - }); - let url = server.url("/api"); - - let store = storage_store(url); - let boxed_raw_value = - serde_json::value::RawValue::from_string(r#"{ "some" : "data" }"#.to_owned())?; - let settings = StorageSettings { - storage: None, - storage_autoyast: Some(boxed_raw_value), - }; - - let result = store.store(&settings).await; - - // main assertion - result?; - - // Ensure the specified mock was called exactly one time (or fail with a detailed error description). - storage_mock.assert(); - Ok(()) - } -} diff --git a/rust/agama-lib/src/storage/store/dasd.rs b/rust/agama-lib/src/storage/store/dasd.rs deleted file mode 100644 index 3de60448b7..0000000000 --- a/rust/agama-lib/src/storage/store/dasd.rs +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) [2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements the store for the storage settings. - -use crate::{ - http::BaseHTTPClient, - storage::{ - http_client::dasd::{DASDHTTPClient, DASDHTTPClientError}, - settings::dasd::DASDConfig, - }, -}; - -#[derive(Debug, thiserror::Error)] -#[error("Error processing DASD settings: {0}")] -pub struct DASDStoreError(#[from] DASDHTTPClientError); - -type DASDStoreResult = Result; - -/// Loads and stores the storage settings from/to the HTTP service. -pub struct DASDStore { - client: DASDHTTPClient, -} - -impl DASDStore { - pub fn new(client: BaseHTTPClient) -> Self { - Self { - client: DASDHTTPClient::new(client), - } - } - - pub async fn load(&self) -> DASDStoreResult> { - Ok(self.client.get_config().await?) - } - - pub async fn store(&self, settings: &DASDConfig) -> DASDStoreResult<()> { - self.client.set_config(settings).await?; - Ok(()) - } -} diff --git a/rust/agama-lib/src/storage/store/zfcp.rs b/rust/agama-lib/src/storage/store/zfcp.rs deleted file mode 100644 index 271de35436..0000000000 --- a/rust/agama-lib/src/storage/store/zfcp.rs +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) [2025] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Implements the store for the zFCP settings. - -use crate::{ - http::BaseHTTPClient, - storage::{ - http_client::zfcp::{ZFCPHTTPClient, ZFCPHTTPClientError}, - settings::zfcp::ZFCPConfig, - }, -}; - -#[derive(Debug, thiserror::Error)] -#[error("Error processing ZFCP settings: {0}")] -pub struct ZFCPStoreError(#[from] ZFCPHTTPClientError); - -type ZFCPStoreResult = Result; - -/// Loads and stores the storage settings from/to the HTTP service. -pub struct ZFCPStore { - client: ZFCPHTTPClient, -} - -impl ZFCPStore { - pub fn new(client: BaseHTTPClient) -> Self { - Self { - client: ZFCPHTTPClient::new(client), - } - } - - pub async fn load(&self) -> ZFCPStoreResult> { - Ok(self.client.get_config().await?) - } - - pub async fn store(&self, settings: &ZFCPConfig) -> ZFCPStoreResult<()> { - self.client.set_config(settings).await?; - Ok(()) - } -} diff --git a/rust/agama-lib/src/store.rs b/rust/agama-lib/src/store.rs deleted file mode 100644 index 7f2c5538d5..0000000000 --- a/rust/agama-lib/src/store.rs +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (c) [2024] SUSE LLC -// -// All Rights Reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, contact SUSE LLC. -// -// To contact SUSE LLC about this file by physical or electronic mail, you may -// find current contact information at www.suse.com. - -//! Load/store the settings from/to the D-Bus services. -// TODO: quickly explain difference between FooSettings and FooStore, with an example - -use crate::{ - hostname::store::{HostnameStore, HostnameStoreError}, - http::BaseHTTPClient, - install_settings::InstallSettings, - network::{NetworkStore, NetworkStoreError}, - storage::{ - http_client::{ - iscsi::{ISCSIHTTPClient, ISCSIHTTPClientError}, - StorageHTTPClient, - }, - store::{ - dasd::{DASDStore, DASDStoreError}, - zfcp::{ZFCPStore, ZFCPStoreError}, - }, - StorageStore, StorageStoreError, - }, -}; - -#[derive(Debug, thiserror::Error)] -pub enum StoreError { - #[error(transparent)] - Dasd(#[from] DASDStoreError), - #[error(transparent)] - Hostname(#[from] HostnameStoreError), - #[error(transparent)] - Network(#[from] NetworkStoreError), - #[error(transparent)] - Storage(#[from] StorageStoreError), - #[error(transparent)] - Iscsi(#[from] ISCSIHTTPClientError), - #[error(transparent)] - Zfcp(#[from] ZFCPStoreError), - #[error("Could not calculate the context")] - InvalidStoreContext, -} - -/// Struct that loads/stores the settings from/to the D-Bus services. -/// -/// It is composed by a set of "stores" that are able to load/store the -/// settings for each service. -/// -/// This struct uses the default connection built by [connection function](super::connection). -pub struct Store { - dasd: DASDStore, - hostname: HostnameStore, - network: NetworkStore, - storage: StorageStore, - iscsi_client: ISCSIHTTPClient, - http_client: BaseHTTPClient, - zfcp: ZFCPStore, -} - -impl Store { - pub async fn new(http_client: BaseHTTPClient) -> Result { - Ok(Self { - dasd: DASDStore::new(http_client.clone()), - hostname: HostnameStore::new(http_client.clone()), - network: NetworkStore::new(http_client.clone()), - storage: StorageStore::new(http_client.clone()), - iscsi_client: ISCSIHTTPClient::new(http_client.clone()), - zfcp: ZFCPStore::new(http_client.clone()), - http_client, - }) - } - - /// Loads the installation settings from the HTTP interface. - pub async fn load(&self) -> Result { - let mut settings = InstallSettings { - dasd: self.dasd.load().await?, - hostname: Some(self.hostname.load().await?), - network: Some(self.network.load().await?), - zfcp: self.zfcp.load().await?, - ..Default::default() - }; - - if let Some(storage_settings) = self.storage.load().await? { - settings.storage = storage_settings.storage; - settings.storage_autoyast = storage_settings.storage_autoyast; - } - - // TODO: use try_join here - Ok(settings) - } - - /// Stores the given installation settings in the Agama service - /// - /// It causes the storage proposal to be reset. This behavior should be revisited in - /// the future but it might be the storage service the responsible for dealing with this. - /// - /// * `settings`: installation settings. - pub async fn store(&self, settings: &InstallSettings) -> Result<(), StoreError> { - if let Some(network) = &settings.network { - self.network.store(network).await?; - } - let mut dirty_flag_set = false; - // iscsi has to be done before storage - if let Some(iscsi) = &settings.iscsi { - self.iscsi_client.set_config(iscsi).await? - } - // dasd devices has to be activated before storage - if let Some(dasd) = &settings.dasd { - dirty_flag_set = true; - self.dasd.store(dasd).await? - } - // zfcp devices has to be activated before storage - if let Some(zfcp) = &settings.zfcp { - dirty_flag_set = true; - self.zfcp.store(zfcp).await? - } - // Reprobing storage is not directly done by zFCP, DASD or iSCSI services for a matter of - // efficiency. For now, clients are expected to explicitly reprobe. It is important to - // reprobe here before loading the storage settings. Otherwise, the new storage devices are - // not used. - if dirty_flag_set { - self.reprobe_storage().await?; - } - - if settings.storage.is_some() || settings.storage_autoyast.is_some() { - self.storage.store(&settings.into()).await? - } - if let Some(hostname) = &settings.hostname { - self.hostname.store(hostname).await?; - } - - Ok(()) - } - - // Reprobes the storage devices if the system was marked as deprecated. - async fn reprobe_storage(&self) -> Result<(), StorageStoreError> { - let storage_client = StorageHTTPClient::new(self.http_client.clone()); - if storage_client.is_dirty().await? { - storage_client.reprobe().await?; - } - Ok(()) - } -} diff --git a/rust/agama-network/Cargo.toml b/rust/agama-network/Cargo.toml index b874669572..635f119306 100644 --- a/rust/agama-network/Cargo.toml +++ b/rust/agama-network/Cargo.toml @@ -16,15 +16,12 @@ macaddr = { version = "1.0.1", features = ["serde_std"] } pin-project = "1.1.10" serde = { version = "1.0.219", features = ["derive"] } serde_with = "3.12.0" -strum = { version = "0.27.1", features = ["derive"] } thiserror = "2.0.12" tokio = { version = "1.40.0", features = ["macros", "rt-multi-thread"] } tokio-stream = "0.1.17" -tokio-test = "0.4.4" tracing = "0.1.41" utoipa = { version = "5.3.1", features = ["uuid"] } uuid = { version = "1.16.0", features = ["v4", "serde"] } zbus = { version = "5", default-features = false, features = ["tokio"] } semver = "1.0.26" -serde_json = "1.0.148" gettext-rs = "0.7.7" diff --git a/rust/agama-proxy/Cargo.toml b/rust/agama-proxy/Cargo.toml index cbb804685c..2e7e855822 100644 --- a/rust/agama-proxy/Cargo.toml +++ b/rust/agama-proxy/Cargo.toml @@ -8,7 +8,6 @@ edition.workspace = true agama-utils = { version = "0.1.0", path = "../agama-utils" } anyhow = "1.0.100" async-trait = "0.1.89" -env_filter = "0.1.4" gettext-rs = "0.7.7" libsystemd = "0.7.2" strum = "0.27.2" @@ -16,7 +15,6 @@ thiserror = "2.0.18" tracing = "0.1.44" tracing-journald = "0.3.2" tracing-subscriber = { version = "0.3.22", features = ["env-filter"] } -url = "2.5.8" [[bin]] name = "agama-proxy-setup" diff --git a/rust/agama-server/Cargo.toml b/rust/agama-server/Cargo.toml index a7bb9db837..055852665c 100644 --- a/rust/agama-server/Cargo.toml +++ b/rust/agama-server/Cargo.toml @@ -17,13 +17,10 @@ agama-network = { path = "../agama-network" } agama-software = { path = "../agama-software" } agama-transfer = { path = "../agama-transfer" } zbus = { version = "5", default-features = false, features = ["tokio"] } -uuid = { version = "1.10.0", features = ["v4"] } thiserror = "2.0.12" serde = { version = "1.0.210", features = ["derive"] } tokio = { version = "1.40.0", features = ["macros", "rt-multi-thread", "sync"] } tokio-stream = "0.1.16" -gettext-rs = { version = "0.7.1", features = ["gettext-system"] } -regex = "1.11.0" async-trait = "0.1.83" axum = { version = "0.7.7", features = ["ws", "macros"] } serde_json = "1.0.128" @@ -45,7 +42,6 @@ axum-extra = { version = "0.9.4", features = ["cookie", "typed-header"] } # pam 0.8.0 (2023-11) plus an unreleased commit from 2023-12 # that switches from users to uzers, fixing CVE-2025-5791 pam = { git = "https://github.com/1wilkens/pam.git", rev = "daf26ae" } -serde_with = "3.10.0" pin-project = "1.1.5" openssl = "0.10.66" sd-notify = "0.4.2" @@ -56,15 +52,9 @@ futures-util = { version = "0.3.30", default-features = false, features = [ "alloc", ] } libsystemd = "0.7.0" -subprocess = "0.2.9" gethostname = "1.0.0" tokio-util = "0.7.12" -zypp-agama = { path = "../zypp-agama" } -glob = "0.3.1" -tempfile = "3.13.0" url = "2.5.2" -serde_yaml = "0.9.34" -strum = { version = "0.27.2", features = ["derive"] } [[bin]] name = "agama-web-server" diff --git a/rust/agama-server/src/web/docs/config.rs b/rust/agama-server/src/web/docs/config.rs index b1e18695b0..3f56c6ad00 100644 --- a/rust/agama-server/src/web/docs/config.rs +++ b/rust/agama-server/src/web/docs/config.rs @@ -51,47 +51,46 @@ impl ApiDocBuilder for ConfigApiDocBuilder { .schema("macaddr.MacAddr6", schemas::mac_addr6()) .schema_from::() .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() + .schema_from::() .schema_from::() .schema_from::() .schema_from::() @@ -107,11 +106,6 @@ impl ApiDocBuilder for ConfigApiDocBuilder { .schema_from::() .schema_from::() .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() - .schema_from::() .schema_from::() .schema_from::() .schema_from::() diff --git a/rust/agama-software/Cargo.toml b/rust/agama-software/Cargo.toml index 6f94c89597..c9c55e269b 100644 --- a/rust/agama-software/Cargo.toml +++ b/rust/agama-software/Cargo.toml @@ -7,7 +7,6 @@ edition.workspace = true [dependencies] agama-bootloader = { path = "../agama-bootloader" } agama-l10n = { path = "../agama-l10n" } -agama-locale-data = { path = "../agama-locale-data" } agama-utils = { path = "../agama-utils" } agama-security = { path = "../agama-security" } async-trait = "0.1.89" @@ -15,13 +14,10 @@ camino = "1.2.1" gettext-rs = { version = "0.7.1", features = ["gettext-system"] } glob = "0.3.1" i18n-format = "0.4.0" -regex = "1.11.0" serde = { version = "1.0.210", features = ["derive"] } -serde_with = "3.10.0" strum = { version = "0.27.2", features = ["derive"] } thiserror = "2.0.12" tokio = { version = "1.40.0", features = ["macros", "rt-multi-thread", "sync"] } -tokio-stream = "0.1.16" tracing = "0.1.41" url = "2.5.7" utoipa = { version = "5.2.0", features = ["axum_extras", "uuid"] } diff --git a/rust/agama-storage-client/Cargo.toml b/rust/agama-storage-client/Cargo.toml index ee74da750d..81b5952fee 100644 --- a/rust/agama-storage-client/Cargo.toml +++ b/rust/agama-storage-client/Cargo.toml @@ -10,8 +10,6 @@ thiserror = "2.0.16" async-trait = "0.1.89" zbus = "5.7.1" tokio = { version = "1.47.1", features = ["macros", "rt-multi-thread", "sync"] } -tokio-stream = "0.1.16" serde = { version = "1.0.228" } serde_json = "1.0.140" -tracing = "0.1.44" diff --git a/rust/agama-storage/Cargo.toml b/rust/agama-storage/Cargo.toml index ccf287534f..5ae080158f 100644 --- a/rust/agama-storage/Cargo.toml +++ b/rust/agama-storage/Cargo.toml @@ -14,7 +14,6 @@ tokio = { version = "1.47.1", features = ["macros", "rt-multi-thread", "sync"] } tokio-stream = "0.1.16" serde = { version = "1.0.228" } serde_json = "1.0.140" -tracing = "0.1.44" [dev-dependencies] test-context = "0.4.1" diff --git a/rust/agama-users/Cargo.toml b/rust/agama-users/Cargo.toml index 5bc3fa918e..8c430b2124 100644 --- a/rust/agama-users/Cargo.toml +++ b/rust/agama-users/Cargo.toml @@ -5,16 +5,11 @@ rust-version.workspace = true edition.workspace = true [dependencies] -anyhow = "1.0.99" thiserror = "2.0.16" -agama-locale-data = { path = "../agama-locale-data" } agama-utils = { path = "../agama-utils" } -regex = "1.11.2" tracing = "0.1.41" gettext-rs = { version = "0.7.2", features = ["gettext-system"] } tokio = { version = "1.47.1", features = ["macros", "rt-multi-thread", "sync"] } -tokio-stream = "0.1.17" -zbus = "5.11.0" async-trait = "0.1.89" serde = { version = "1.0.228", features = ["derive"] } utoipa = "5.4.0" diff --git a/rust/agama-utils/Cargo.toml b/rust/agama-utils/Cargo.toml index c15ec38e34..a8758816b7 100644 --- a/rust/agama-utils/Cargo.toml +++ b/rust/agama-utils/Cargo.toml @@ -14,8 +14,7 @@ serde_json = "1.0.140" serde_with = "3.14.0" strum = { version = "0.27.2", features = ["derive"] } thiserror = "2.0.16" -tokio = { version = "1.47.1", features = ["macros", "rt-multi-thread", "process", "sync"] } -tokio-stream = "0.1.17" +tokio = { version = "1.47.1", features = ["macros", "rt-multi-thread", "process", "sync", "time"] } utoipa = { version = "5.3.1", features = ["url"] } zbus = "5.7.1" zvariant = "5.5.2" diff --git a/rust/package/agama.changes b/rust/package/agama.changes index 3cbcc33bb6..142a7675ce 100644 --- a/rust/package/agama.changes +++ b/rust/package/agama.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Wed Mar 4 07:03:28 UTC 2026 - Imobach Gonzalez Sosa + +- Update and clean-up dependencies (gh#agama-project/agama#3234). +- Drop unused code from agama-lib (gh#agama-project/agama#3234). + ------------------------------------------------------------------- Wed Mar 4 06:55:12 UTC 2026 - Imobach Gonzalez Sosa diff --git a/rust/suseconnect-agama/Cargo.toml b/rust/suseconnect-agama/Cargo.toml index ba49b1c181..9c95b9868b 100644 --- a/rust/suseconnect-agama/Cargo.toml +++ b/rust/suseconnect-agama/Cargo.toml @@ -14,7 +14,7 @@ serde_json = "1.0.140" suseconnect-agama-sys = { path="./suseconnect-agama-sys" } thiserror = "2.0.16" tracing = "0.1.41" -url = "2.5.4" +url = { version = "2.5.4", features = ["serde"] } [dev-dependencies] tempfile = "3.20.0" diff --git a/rust/zypp-agama/Cargo.toml b/rust/zypp-agama/Cargo.toml index 21b1d8d032..a29ec9330f 100644 --- a/rust/zypp-agama/Cargo.toml +++ b/rust/zypp-agama/Cargo.toml @@ -5,7 +5,6 @@ edition = "2021" [dependencies] zypp-agama-sys = { path="./zypp-agama-sys" } -url = "2.5.7" tracing = "0.1.41" [dev-dependencies] diff --git a/rust/zypp-agama/zypp-agama-sys/Cargo.toml b/rust/zypp-agama/zypp-agama-sys/Cargo.toml index c19f1cb7cd..9568c60578 100644 --- a/rust/zypp-agama/zypp-agama-sys/Cargo.toml +++ b/rust/zypp-agama/zypp-agama-sys/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" edition.workspace = true [dependencies] -tracing = "0.1.41" [build-dependencies] -bindgen = { version= "0.72.1", features = ["runtime"] } \ No newline at end of file +bindgen = { version= "0.72.1", features = ["runtime"] }