difftreelog
feat expected secret parts
in: trunk
16 files changed
Cargo.lockdiffbeforeafterboth456 packageslockfile v4
Might be heavy and slow!
abort-on-drop
0.2.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5dd6d700ad9af641490c1f7d67980d2de4d1433016e5b12f819448d3c832142adepends onused byaddr2line
0.25.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4bdepends onused byadler2
2.0.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefaused byaead
0.5.2crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0depends onaes
0.8.4crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0depends onused byaes-gcm
0.10.3crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1used byage
0.11.1crates.io↘ 29↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum57fc171f4874fa10887e47088f81a55fcf030cd421aa31ec2b370cafebcc608adepends on- aes
0.8.4 - aes-gcm
0.10.3 - age-core
0.11.0 - base64
0.21.7 - bcrypt-pbkdf
0.10.0 - bech32
0.9.1 - cbc
0.1.2 - chacha20poly1305
0.10.1 - cipher
0.4.4 - cookie-factory
0.3.3 - ctr
0.9.2 - curve25519-dalek
4.1.3 - hmac
0.12.1 - i18n-embed
0.15.4 - i18n-embed-fl
0.9.4 - lazy_static
1.5.0 - nom
7.1.3 - num-traits
0.2.19 - pin-project
1.1.10 - rand
0.8.5 - rsa
0.9.8 - rust-embed
8.7.2 - scrypt
0.11.0 - sha2
0.10.9 - subtle
2.6.1 - which
4.4.2 - wsl
0.1.0 - x25519-dalek
2.0.1 - zeroize
1.8.2
- aes
age-core
0.11.0crates.io↘ 10↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume2bf6a89c984ca9d850913ece2da39e1d200563b0a94b002b253beee4c5acf99depends onused byaho-corasick
1.1.3crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916depends onandroid_system_properties
0.1.5crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311depends onused byanstream
0.6.21crates.io↘ 7↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4adepends onanstyle
1.0.13crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78anstyle-parse
0.2.7crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2depends onused byanstyle-query
1.1.4crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2depends onused byanstyle-wincon
3.0.10crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2aused byanyhow
1.0.100crates.io↘ 0↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61arc-swap
1.7.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457used byasync-stream
0.3.6crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476used byasync-stream-impl
0.3.6crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574ddepends onused byasync-trait
0.1.89crates.io↘ 3↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbbdepends onatomic-waker
1.1.2crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0used byautocfg
1.5.0crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8axum
0.7.9crates.io↘ 19↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumedca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71fdepends onused byaxum-core
0.4.5crates.io↘ 12↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199depends onused bybacktrace
0.3.76crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6depends onused bybase64
0.21.7crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567used bybase64
0.22.1crates.io↘ 0↖ 11sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6basic-toml
0.1.10crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178adepends onused bybcrypt-pbkdf
0.10.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6aeac2e1fe888769f34f05ac343bbef98b14d1ffb292ab69d4608b3abc86f2a2depends onused bybetter-command
0.1.0workspace↘ 5↖ 2bindgen
0.72.1crates.io↘ 12↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895depends onused bybitflags
2.9.4crates.io↘ 1↖ 11sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394depends onblock-buffer
0.10.4crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71depends onused byblock-padding
0.3.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93depends onused byblowfish
0.9.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume412e2cd0f2b2d93e02543ceae7917b3c70331573df19ee046bcbc35e45e87d7depends onused bybumpalo
3.19.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43used bybytecount
0.6.9crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365eused bybyteorder
1.5.0crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64bbytes
1.10.1crates.io↘ 0↖ 17sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6acbc
0.1.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6depends onused bycc
1.2.41crates.io↘ 2↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7depends oncexpr
0.6.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766depends onused bycfg_aliases
0.2.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724used bycfg-if
1.0.3crates.io↘ 0↖ 18sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9chacha20
0.9.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818depends onused bychacha20poly1305
0.10.1crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35used bychrono
0.4.42crates.io↘ 6↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2depends onused bycipher
0.4.4crates.io↘ 3↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3daddepends onclang-sys
1.8.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4depends onused byclap
4.5.48crates.io↘ 2↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5faedepends onclap_builder
4.5.48crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9depends onused byclap_complete
4.5.58crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum75bf0b32ad2e152de789bb635ea4d3078f6b838ad7974143e99b99f45a04af4adepends onused byclap_derive
4.5.47crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9cused byclap_lex
0.7.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675used bycodespan-reporting
0.12.0crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81colorchoice
1.0.4crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75used byconsole
0.16.1crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb430743a6eb14e9764d4260d4c0d8123087d504eeb9c48f2b2a5e810dd369df4used byconst-oid
0.9.6crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8convert_case
0.7.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7depends onused bycookie-factory
0.3.3crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9885fa71e26b8ab7855e2ec7cae6e9b380edff76cd052e07c683a0319d51b3a2depends onused bycore-foundation-sys
0.8.7crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888bused bycpufeatures
0.2.17crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280depends oncrc32fast
1.5.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511depends onused bycrossterm
0.29.0crates.io↘ 11↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87bdepends onused bycrossterm_winapi
0.9.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumacdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2bdepends onused bycrypto-common
0.1.6crates.io↘ 3↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3ctr
0.9.2crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835depends onused bycursor-icon
1.2.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732fused bycurve25519-dalek
4.1.3crates.io↘ 8↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2bedepends oncurve25519-dalek-derive
0.1.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3depends onused bycxx
1.0.186crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4e9c4fe7f2f5dc5c62871a1b43992d197da6fa1394656a94276ac2894a90a6fedepends onused bycxx-build
1.0.186crates.io↘ 7↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb5cf2909d37d80633ddd208676fc27c2608a7f035fff69c882421168038b26dddepends onused bycxxbridge-cmd
1.0.186crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum077f5ee3d3bfd8d27f83208fdaa96ddd50af7f096c77077cc4b94da10bfacefdused bycxxbridge-flags
1.0.186crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb0108748615125b9f2e915dfafdffcbdabbca9b15102834f6d7e9a768f2f2864used bycxxbridge-macro
1.0.186crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume6e896681ef9b8dc462cfa6961d61909704bde0984b30bcb4082fe102b478890used byder
0.7.10crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcbdepends onderanged
0.5.4crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071depends onused byderive_more
2.0.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678depends onused byderive_more-impl
2.0.1crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3used bydigest
0.10.7crates.io↘ 4↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292displaydoc
0.2.5crates.io↘ 3↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0depends ondocument-features
0.2.11crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05ddepends onused byed25519
2.2.3crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53depends onused byed25519-dalek
2.2.0crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9used byeither
1.15.0crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719encode_unicode
1.0.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0used byenv_filter
0.1.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0depends onused byenv_logger
0.11.8crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069fused byequivalent
1.0.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0fused byerrno
0.3.14crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efebdepends onused byfastrand
2.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411beused byfiat-crypto
0.2.9crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811dused byfiledescriptor
0.8.3crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682ddepends onused byfind-crate
0.6.3crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum59a98bbaacea1c0eb6a0876280051b892eb73594fd90cf3b20e9c817029c57d2depends onfind-msvc-tools
0.1.4crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127used byfixedbitset
0.5.7crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99used byflate2
1.1.4crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9depends onused byfleet
0.2.0workspace↘ 39↖ 0depends on- abort-on-drop
0.2.2 - age
0.11.1 - age-core
0.11.0 - anyhow
1.0.100 - async-trait
0.1.89 - base64
0.22.1 - better-command
0.1.0 - chrono
0.4.42 - clap
4.5.48 - clap_complete
4.5.58 - crossterm
0.29.0 - fleet-base
0.1.0 - fleet-shared
0.1.0 - futures
0.3.31 - hostname
0.4.1 - human-repr
1.1.0 - indicatif
0.18.0 - itertools
0.14.0 - nix-eval
0.1.0 - nixlike
0.1.0 - nom
8.0.0 - openssh
0.11.5 - opentelemetry
0.30.0 - opentelemetry_sdk
0.30.0 - owo-colors
4.2.3 - peg
0.8.5 - regex
1.12.1 - serde
1.0.228 - serde_json
1.0.145 - shlex
1.3.0 - tabled
0.20.0 - tempfile
3.23.0 - time
0.3.44 - tokio
1.47.1 - tokio-util
0.7.16 - tracing
0.1.41 - tracing-indicatif
0.3.13 - tracing-opentelemetry
0.31.0 - tracing-subscriber
0.3.20
- abort-on-drop
fleet-base
0.1.0workspace↘ 23↖ 1depends onused byfleet-generator-helper
0.1.0workspace↘ 9↖ 0fleet-install-secrets
0.1.0workspace↘ 10↖ 0fluent
0.16.1crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbb74634707bebd0ce645a981148e8fb8c7bccd4c33c652aeffd28bf2f96d555adepends onfluent-bundle
0.15.3crates.io↘ 8↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7fe0a21ee80050c678013f82edf4b705fe2f26f1f9877593d13198612503f493depends onused byfluent-langneg
0.13.0crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2c4ad0989667548f06ccd0e306ed56b61bd4d35458d54df5ec7587c0e8ed5e94depends onfluent-syntax
0.11.1crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2a530c4694a6a8d528794ee9bbd8ba0122e779629ac908d15ad5a7ae7763a33ddepends onfnv
1.0.7crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1foldhash
0.2.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdbused byform_urlencoded
1.2.2crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcfdepends onfutures
0.3.31crates.io↘ 7↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876depends onfutures-channel
0.3.31crates.io↘ 2↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10depends onfutures-core
0.3.31crates.io↘ 0↖ 16sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663efutures-executor
0.3.31crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9ffutures-io
0.3.31crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6futures-macro
0.3.31crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650depends onused byfutures-sink
0.3.31crates.io↘ 0↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7futures-task
0.3.31crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988futures-util
0.3.31crates.io↘ 10↖ 10sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81depends ongeneric-array
0.14.8crates.io↘ 2↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1dc8f7d2ded5f9209535e4b3fd4d39c002f30902ff5ce9f64e2c33d549576500depends ongetrandom
0.2.16crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592used bygetrandom
0.3.3crates.io↘ 4↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4used byghash
0.5.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1depends onused bygimli
0.32.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7used byglob
0.3.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280used byh2
0.4.12crates.io↘ 11↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386depends onused byhashbrown
0.12.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888used byhashbrown
0.16.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748dused byheck
0.5.0crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55eahermit-abi
0.5.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849cused byhex
0.4.3crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70hkdf
0.12.4crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7depends onused byhmac
0.12.1crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5edepends onhome
0.5.11crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcfdepends onused byhostname
0.4.1crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65depends onused byhttp
1.3.1crates.io↘ 3↖ 14sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565depends onhttp-body
1.0.1crates.io↘ 2↖ 10sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184depends onhttp-body-util
0.1.3crates.io↘ 5↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64ahttparse
1.10.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87used byhttpdate
1.0.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdf3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9used byhuman-repr
1.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf58b778a5761513caf593693f8951c97a5b610841e754788400f32102eefdff1used byhyper
1.7.0crates.io↘ 15↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumeb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51edepends onhyper-timeout
0.5.2crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0used byhyper-util
0.1.17crates.io↘ 16↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8depends oni18n-config
0.4.8crates.io↘ 6↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3e06b90c8a0d252e203c94344b21e35a30f3a3a85dc7db5af8f8df9f3e0c63efi18n-embed
0.15.4crates.io↘ 12↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum669ffc2c93f97e6ddf06ddbe999fcd6782e3342978bb85f7d3c087c7978404c4depends onused byi18n-embed-fl
0.9.4crates.io↘ 11↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum04b2969d0b3fc6143776c535184c19722032b43e6a642d710fa3f88faec53c2ddepends onused byi18n-embed-impl
0.8.4crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0f2cc0e0523d1fe6fc2c6f66e5038624ea8091b3e7748b5e8e0c84b1698db6c2used byiana-time-zone
0.1.64crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fbdepends onused byiana-time-zone-haiku
0.1.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269fdepends onused byicu_collections
2.0.0crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47icu_locale_core
2.0.0crates.io↘ 5↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00aicu_normalizer
2.0.0crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979depends onused byicu_normalizer_data
2.0.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3used byicu_properties
2.0.1crates.io↘ 8↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32bdepends onicu_properties_data
2.0.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632used byicu_provider
2.0.0crates.io↘ 9↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5afdepends onidna
1.1.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4deused byidna_adapter
1.2.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344depends onused byindexmap
1.9.3crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99depends onused byindexmap
2.11.4crates.io↘ 2↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5depends onindicatif
0.18.0crates.io↘ 6↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum70a646d946d06bedbbc4cac4c218acf4bbf2d87757a784857025f4d447e4e1cddepends onindoc
2.0.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bdused byinout
0.1.4crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01depends onused byintl_pluralrules
7.0.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972depends onused byintl-memoizer
0.5.3crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum310da2e345f5eb861e7a07ee182262e94975051db9e4223e909ba90f392f163fdepends onio_tee
0.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4b3f7cef34251886990511df1c61443aa928499d598a9473929ab5a90a527304used byio-uring
0.7.10crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727bdepends onused byipnet
2.11.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130used byiri-string
0.7.8crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2depends onused byis_ci
1.2.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45is_terminal_polyfill
1.70.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecfused byis-terminal
0.4.16crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9used byitertools
0.13.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186depends onused byitertools
0.14.0crates.io↘ 1↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285depends onitoa
1.0.15crates.io↘ 0↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2cjs-sys
0.3.81crates.io↘ 2↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305depends onlazy_static
1.5.0crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fedepends onlibc
0.2.177crates.io↘ 0↖ 27sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976used by- android_system_properties
0.1.5 - backtrace
0.3.76 - clang-sys
1.8.1 - console
0.16.1 - cpufeatures
0.2.17 - errno
0.3.14 - filedescriptor
0.8.3 - getrandom
0.2.16 - getrandom
0.3.3 - hostname
0.4.1 - hyper-util
0.1.17 - io-uring
0.7.10 - is-terminal
0.4.16 - mio
1.0.4 - nix
0.30.1 - openssh
0.11.5 - parking_lot_core
0.9.12 - rand
0.8.5 - ring
0.17.14 - rustix
0.38.44 - rustix
1.1.2 - signal-hook
0.3.18 - signal-hook-mio
0.2.4 - signal-hook-registry
1.4.6 - socket2
0.5.10 - socket2
0.6.0 - tokio
1.47.1
- android_system_properties
libloading
0.8.9crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55depends onused bylibm
0.2.15crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97delink-cplusplus
1.0.12crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7f78c730aaa7d0b9336a299029ea49f9ee53b0ed06e9202e8cb7db9bae7b8c82depends onused bylinked-hash-map
0.5.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770fused bylinux-raw-sys
0.4.15crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807abused bylinux-raw-sys
0.11.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdf1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039used bylitemap
0.8.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956used bylitrs
0.4.2crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bedused bylock_api
0.4.14crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965depends onused bylog
0.4.28crates.io↘ 0↖ 14sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432matchers
0.2.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9depends onused bymemchr
2.7.6crates.io↘ 0↖ 11sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273mime
0.3.17crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139aused byminimal-lexical
0.2.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79aused byminiz_oxide
0.8.9crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316depends onused bymio
1.0.4crates.io↘ 4↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761cmultimap
0.10.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084used bynix
0.30.1crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6used bynixlike
0.1.0workspace↘ 7↖ 3nom
7.1.3crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4adepends onnom
8.0.0crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdf9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405depends onused bynu-ansi-term
0.50.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5depends onused bynum-bigint-dig
0.8.4crates.io↘ 9↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151depends onused bynum-conv
0.1.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9used bynum-integer
0.1.46crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858fdepends onnum-iter
0.1.45crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bfused bynum-traits
0.2.19crates.io↘ 2↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841depends onobject
0.37.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fedepends onused byonce_cell
1.21.3crates.io↘ 0↖ 13sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2donce_cell_polyfill
1.70.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0adused byopaque-debug
0.3.1crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381openssh
0.11.5crates.io↘ 6↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumea0bb128ba90e86bc55dae66031935f361cda4cbc1f011547c55a7d80079bc3eused byopentelemetry
0.30.0crates.io↘ 6↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumaaf416e4cb72756655126f7dd7bb0af49c674f4c1b9903e80c009e0c37e552e6depends onopentelemetry_sdk
0.30.0crates.io↘ 8↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum11f644aa9e5e31d11896e024305d7e3c98a88884d9f8919dbf37a9991bc47a4bdepends onopentelemetry-exporter-env
0.1.0workspace↘ 3↖ 0opentelemetry-http
0.30.0crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum50f6639e842a97dbea8886e3439710ae463120091e2e064518ba8e716e6ac36dused byopentelemetry-otlp
0.30.0crates.io↘ 12↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdbee664a43e07615731afc539ca60c6d9f1a9425e25ca09c57bc36c87c55852bdepends onopentelemetry-proto
0.30.0crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2e046fd7660710fe5a05e8748e70d9058dc15c94ba914e7c4faa7c728f0e8ddcdepends onused byowo-colors
4.2.3crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52depends onused bypapergrid
0.17.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6978128c8b51d8f4080631ceb2302ab51e32cc6e8615f735ee2f83fd269ae3f1depends onused byparking_lot
0.12.5crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1adepends onparking_lot_core
0.9.12crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1used bypbkdf2
0.12.2crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2depends onpeg
0.8.5crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9928cfca101b36ec5163e70049ee5368a8a1c3c6efc9ca9c5f9cc2f816152477depends onused bypeg-macros
0.8.5crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6298ab04c202fa5b5d52ba03269fb7b74550b150323038878fe6c372d8280f71used bypeg-runtime
0.8.5crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum132dca9b868d927b35b5dd728167b2dee150eb1ad686008fc71ccb298b776fcaused bypem
3.0.6crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291bedepends onused bypercent-encoding
2.3.2crates.io↘ 0↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220petgraph
0.7.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772depends onused bypin-project
1.1.10crates.io↘ 1↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8adepends onpin-project-internal
1.1.10crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861depends onused bypin-project-lite
0.2.16crates.io↘ 0↖ 18sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9bpin-utils
0.1.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184used bypkcs1
0.7.5crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47fdepends onused bypkcs8
0.10.2crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7pkg-config
0.3.32crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904cused bypoly1305
0.8.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abfused bypolyval
0.6.2crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25used byportable-atomic
1.11.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483used bypotential_utf
0.1.3crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08adepends onpowerfmt
0.2.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391used byppv-lite86
0.2.21crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9depends onprettyplease
0.2.37crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62bdepends onproc-macro-error-attr2
2.0.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5depends onused byproc-macro-error2
2.0.1crates.io↘ 4↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802proc-macro2
1.0.101crates.io↘ 1↖ 41sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732dedepends onused by- async-stream-impl
0.3.6 - async-trait
0.1.89 - bindgen
0.72.1 - clap_derive
4.5.47 - curve25519-dalek-derive
0.1.1 - cxx-build
1.0.186 - cxxbridge-cmd
1.0.186 - cxxbridge-macro
1.0.186 - derive_more-impl
2.0.1 - displaydoc
0.2.5 - futures-macro
0.3.31 - i18n-embed-fl
0.9.4 - i18n-embed-impl
0.8.4 - peg-macros
0.8.5 - pin-project-internal
1.1.10 - prettyplease
0.2.37 - proc-macro-error-attr2
2.0.0 - proc-macro-error2
2.0.1 - prost-derive
0.13.5 - quote
1.0.41 - rust-embed-impl
8.7.2 - serde_derive
1.0.228 - syn
2.0.106 - synstructure
0.13.2 - tabled_derive
0.11.0 - test-log-macros
0.2.18 - thiserror-impl
1.0.69 - thiserror-impl
2.0.17 - tokio-macros
2.5.0 - tonic-build
0.12.3 - tracing-attributes
0.1.30 - vte_generate_state_changes
0.1.2 - wasm-bindgen-backend
0.2.104 - wasm-bindgen-macro-support
0.2.104 - windows-implement
0.60.2 - windows-interface
0.59.3 - yoke-derive
0.8.0 - zerocopy-derive
0.8.27 - zerofrom-derive
0.1.6 - zeroize_derive
1.4.2 - zerovec-derive
0.11.1
- async-stream-impl
prost
0.13.5crates.io↘ 2↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5depends onprost-build
0.13.5crates.io↘ 12↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbe769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bfdepends onused byprost-derive
0.13.5crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4dused byprost-types
0.13.5crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16depends onquote
1.0.41crates.io↘ 1↖ 40sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1depends onused by- async-stream-impl
0.3.6 - async-trait
0.1.89 - bindgen
0.72.1 - clap_derive
4.5.47 - curve25519-dalek-derive
0.1.1 - cxx-build
1.0.186 - cxxbridge-cmd
1.0.186 - cxxbridge-macro
1.0.186 - derive_more-impl
2.0.1 - displaydoc
0.2.5 - futures-macro
0.3.31 - i18n-embed-fl
0.9.4 - i18n-embed-impl
0.8.4 - peg-macros
0.8.5 - pin-project-internal
1.1.10 - proc-macro-error-attr2
2.0.0 - proc-macro-error2
2.0.1 - prost-derive
0.13.5 - rust-embed-impl
8.7.2 - serde_derive
1.0.228 - syn
2.0.106 - synstructure
0.13.2 - tabled_derive
0.11.0 - test-log-macros
0.2.18 - thiserror-impl
1.0.69 - thiserror-impl
2.0.17 - tokio-macros
2.5.0 - tonic-build
0.12.3 - tracing-attributes
0.1.30 - vte_generate_state_changes
0.1.2 - wasm-bindgen-backend
0.2.104 - wasm-bindgen-macro
0.2.104 - wasm-bindgen-macro-support
0.2.104 - windows-implement
0.60.2 - windows-interface
0.59.3 - yoke-derive
0.8.0 - zerocopy-derive
0.8.27 - zerofrom-derive
0.1.6 - zeroize_derive
1.4.2 - zerovec-derive
0.11.1
- async-stream-impl
r-efi
5.3.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0fused byrand
0.8.5crates.io↘ 3↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404rand
0.9.2crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1depends onrand_chacha
0.3.1crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88depends onused byrand_chacha
0.9.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cbdepends onused byrand_core
0.6.4crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922cdepends onrand_core
0.9.3crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38depends onused byrcgen
0.13.2crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2used byredox_syscall
0.5.18crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362ddepends onused byregex
1.12.1crates.io↘ 4↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4a52d8d02cacdb176ef4678de6c052efb4b3da14b78e4db683a4252762be5433regex-automata
0.4.12crates.io↘ 3↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum722166aa0d7438abbaa4d5cc2c649dac844e8c56d82fb3d33e9c34b5cd268fc6regex-syntax
0.8.7crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc3160422bbd54dd5ecfdca71e5fd59b7b8fe2b1697ab2baf64f6d05dcc66d298reqwest
0.12.23crates.io↘ 26↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7cebdepends on- base64
0.22.1 - bytes
1.10.1 - futures-channel
0.3.31 - futures-core
0.3.31 - futures-util
0.3.31 - http
1.3.1 - http-body
1.0.1 - http-body-util
0.1.3 - hyper
1.7.0 - hyper-util
0.1.17 - js-sys
0.3.81 - log
0.4.28 - percent-encoding
2.3.2 - pin-project-lite
0.2.16 - serde
1.0.228 - serde_json
1.0.145 - serde_urlencoded
0.7.1 - sync_wrapper
1.0.2 - tokio
1.47.1 - tower
0.5.2 - tower-http
0.6.6 - tower-service
0.3.3 - url
2.5.7 - wasm-bindgen
0.2.104 - wasm-bindgen-futures
0.4.54 - web-sys
0.3.81
- base64
ring
0.17.14crates.io↘ 6↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7rmp
0.8.14crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4used byrmp-serde
1.3.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4dbdepends onused byron
0.11.0crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdb09040cc89e461f1a265139777a2bde7f8d8c67c4936f700c63ce3e2904d468used byrsa
0.9.8crates.io↘ 12↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691bdepends onused byrust-embed
8.7.2crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178aused byrust-embed-impl
8.7.2crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349cused byrust-embed-utils
8.7.2crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594depends onrustc_version
0.4.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92depends onused byrustc-demangle
0.1.26crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4aceused byrustc-hash
1.1.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2used byrustc-hash
2.1.1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0dused byrustix
0.38.44crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154used byrustix
1.1.2crates.io↘ 5↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3erustls
0.23.32crates.io↘ 7↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40depends onused byrustls-pemfile
2.2.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50depends onused byrustls-pki-types
1.12.0crates.io↘ 1↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79depends onrustls-webpki
0.103.7crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bfused byrustversion
1.0.22crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46dryu
1.0.20crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481fsalsa20
0.10.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213depends onused bysame-file
1.0.6crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502depends onused byscopeguard
1.2.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49used byscratch
1.0.9crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2used byscrypt
0.11.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1fdepends onused bysecrecy
0.10.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5adepends onused byself_cell
0.10.3crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume14e4d63b804dc0c7ec4a1e52bcb63f02c7ac94476755aa579edac21e01f915ddepends onused byself_cell
1.2.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749used bysemver
1.0.27crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2used byserde
1.0.228crates.io↘ 2↖ 33sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9edepends onused by- axum
0.7.9 - basic-toml
0.1.10 - better-command
0.1.0 - bitflags
2.9.4 - chrono
0.4.42 - codespan-reporting
0.12.0 - ed25519-dalek
2.2.0 - fleet
0.2.0 - fleet-base
0.1.0 - fleet-install-secrets
0.1.0 - fleet-shared
0.1.0 - i18n-config
0.4.8 - iri-string
0.7.8 - nix-eval
0.1.0 - nixlike
0.1.0 - opentelemetry-proto
0.30.0 - reqwest
0.12.23 - rmp-serde
1.3.0 - ron
0.11.0 - serde-transcode
1.1.1 - serde_bytes
0.11.19 - serde_json
1.0.145 - serde_urlencoded
0.7.1 - terraform-provider-fleet
0.1.0 - tf-provider
0.2.2 - time
0.3.44 - toml
0.5.11 - tracing-serde
0.2.0 - tracing-subscriber
0.3.20 - unic-langid-impl
0.9.6 - url
2.5.7 - x25519-dalek
2.0.1 - yoke
0.8.0
- axum
serde_bytes
0.11.19crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8depends onused byserde_core
1.0.228crates.io↘ 1↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67addepends onserde_derive
1.0.228crates.io↘ 3↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79depends onserde_json
1.0.145crates.io↘ 5↖ 11sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79cserde_urlencoded
0.7.1crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fdused byserde-transcode
1.1.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum590c0e25c2a5bb6e85bf5c1bce768ceb86b316e7a01bdf07d2cb4ec2271990e2depends onused bysha2
0.10.9crates.io↘ 3↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283depends onsharded-slab
0.1.7crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6depends onused byshell-escape
0.1.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184fused byshlex
1.3.0crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64signal-hook
0.3.18crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2depends onsignal-hook-mio
0.2.4crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cddepends onused bysignal-hook-registry
1.4.6crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28bdepends onused bysignature
2.2.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329dedepends onused bysimd-adler32
0.3.7crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078feused byslab
0.4.11crates.io↘ 0↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589smallvec
1.15.1crates.io↘ 0↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03socket2
0.5.10crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678depends onused bysocket2
0.6.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807depends onused byspin
0.9.8crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67used byspki
0.7.3crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29ddepends onstable_deref_trait
1.2.1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596used bystrsim
0.11.1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4fsubtle
2.6.1crates.io↘ 0↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292supports-color
2.1.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd6398cde53adc3c4557306a96ce67b302968513830a77a95b2b17305d9719a89depends onused bysupports-color
3.0.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6depends onused bysyn
2.0.106crates.io↘ 3↖ 37sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6used by- async-stream-impl
0.3.6 - async-trait
0.1.89 - bindgen
0.72.1 - clap_derive
4.5.47 - curve25519-dalek-derive
0.1.1 - cxx-build
1.0.186 - cxxbridge-cmd
1.0.186 - cxxbridge-macro
1.0.186 - derive_more-impl
2.0.1 - displaydoc
0.2.5 - futures-macro
0.3.31 - i18n-embed-fl
0.9.4 - i18n-embed-impl
0.8.4 - pin-project-internal
1.1.10 - prettyplease
0.2.37 - proc-macro-error2
2.0.1 - prost-build
0.13.5 - prost-derive
0.13.5 - rust-embed-impl
8.7.2 - serde_derive
1.0.228 - synstructure
0.13.2 - tabled_derive
0.11.0 - test-log-macros
0.2.18 - thiserror-impl
1.0.69 - thiserror-impl
2.0.17 - tokio-macros
2.5.0 - tonic-build
0.12.3 - tracing-attributes
0.1.30 - wasm-bindgen-backend
0.2.104 - wasm-bindgen-macro-support
0.2.104 - windows-implement
0.60.2 - windows-interface
0.59.3 - yoke-derive
0.8.0 - zerocopy-derive
0.8.27 - zerofrom-derive
0.1.6 - zeroize_derive
1.4.2 - zerovec-derive
0.11.1
- async-stream-impl
sync_wrapper
1.0.2crates.io↘ 1↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263depends onsynstructure
0.13.2crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2depends ontabled
0.20.0crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume39a2ee1fbcd360805a771e1b300f78cc88fec7b8d3e2f71cd37bbf23e725c7dused bytabled_derive
0.11.0crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0ea5d1b13ca6cff1f9231ffd62f15eefd72543dab5e468735f1a456728a02846used bytempfile
3.23.0crates.io↘ 5↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16termcolor
1.4.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755depends onused byterminal_size
0.4.3crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0depends onused byterraform-provider-fleet
0.1.0workspace↘ 5↖ 0test-log
0.2.18crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e33b98a582ea0be1168eba097538ee8dd4bbe0f2b01b22ac92ea30054e5be7bused bytest-log-macros
0.2.18crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum451b374529930d7601b1eef8d32bc79ae870b6079b069401709c2a8bf9e75f36depends onused bytesting_table
0.3.0crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0f8daae29995a24f65619e19d8d31dea5b389f3d853d8bf297bbf607cd0014ccdepends onused bytf-provider
0.2.2crates.io↘ 20↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd80ea2e5f9f54717952d199888aab7e607dc99275ec5221f1259ce7a5f55f5a6depends onthiserror
1.0.69crates.io↘ 1↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52depends onthiserror
2.0.17crates.io↘ 1↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8depends onthiserror-impl
1.0.69crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1depends onused bythiserror-impl
2.0.17crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913depends onused bythread_local
1.1.9crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185depends onused bytime
0.3.44crates.io↘ 6↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9dtime-core
0.1.6crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6bused bytime-macros
0.2.24crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3depends onused bytinystr
0.8.1crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8bdepends ontokio
1.47.1crates.io↘ 11↖ 19sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038depends ontokio-macros
2.5.0crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8depends onused bytokio-rustls
0.26.4crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61depends onused bytokio-stream
0.1.17crates.io↘ 4↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumeca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047tokio-util
0.7.16crates.io↘ 5↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5toml
0.5.11crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234depends onused bytonic
0.12.3crates.io↘ 24↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52depends on- async-stream
0.3.6 - async-trait
0.1.89 - axum
0.7.9 - base64
0.22.1 - bytes
1.10.1 - h2
0.4.12 - http
1.3.1 - http-body
1.0.1 - http-body-util
0.1.3 - hyper
1.7.0 - hyper-timeout
0.5.2 - hyper-util
0.1.17 - percent-encoding
2.3.2 - pin-project
1.1.10 - prost
0.13.5 - rustls-pemfile
2.2.0 - socket2
0.5.10 - tokio
1.47.1 - tokio-rustls
0.26.4 - tokio-stream
0.1.17 - tower
0.4.13 - tower-layer
0.3.3 - tower-service
0.3.3 - tracing
0.1.41
used by- async-stream
tonic
0.13.1crates.io↘ 19↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7e581ba15a835f4d9ea06c55ab1bd4dce26fc53752c69a04aac00703bfb49ba9depends ontonic-build
0.12.3crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11depends onused bytower
0.4.13crates.io↘ 12↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1cdepends onused bytower
0.5.2crates.io↘ 11↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9depends ontower-http
0.5.2crates.io↘ 9↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5depends onused bytower-http
0.6.6crates.io↘ 10↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumadc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2depends onused bytower-layer
0.3.3crates.io↘ 0↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780etower-service
0.3.3crates.io↘ 0↖ 11sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3tracing
0.1.41crates.io↘ 3↖ 18sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0used bytracing-attributes
0.1.30crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903depends onused bytracing-core
0.1.34crates.io↘ 2↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678depends ontracing-indicatif
0.3.13crates.io↘ 4↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum04d4e11e0e27acef25a47f27e9435355fecdc488867fa2bc90e75b0700d2823dtracing-log
0.2.0crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3tracing-opentelemetry
0.31.0crates.io↘ 10↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumddcf5959f39507d0d04d6413119c04f33b623f4f951ebcbdddddfad2d0623a9cdepends onused bytracing-serde
0.2.0crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1depends onused bytracing-subscriber
0.3.20crates.io↘ 13↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5depends ontype-map
0.5.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumcb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90depends onused bytypenum
1.19.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bbunic-langid
0.9.6crates.io↘ 1↖ 8sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma28ba52c9b05311f4f6e62d5d9d46f094bd6e84cb8df7b3ef952748d752a7d05depends onunic-langid-impl
0.9.6crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumdce1bf08044d4b7a94028c93786f8566047edc11110595914de93362559bc658depends onused byunicase
2.8.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539used byunicode_categories
0.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14eused byunicode-ident
1.0.19crates.io↘ 0↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9dunicode-segmentation
1.12.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493used byunicode-width
0.1.14crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6afused byunicode-width
0.2.2crates.io↘ 0↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254unit-prefix
0.5.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum323402cff2dd658f39ca17c789b502021b3f18707c91cdf22e3838e1b4023817used byuniversal-hash
0.5.1crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07eadepends onused byuntrusted
0.9.0crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1url
2.5.7crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5bused byutf8parse
0.2.2crates.io↘ 0↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821valuable
0.1.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65used byversion_check
0.9.5crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105aused byvt100
0.15.2crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum84cd863bf0db7e392ba3bd04994be3473491b31e66340672af5d11943c6274deused byvte
0.11.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf5022b5fbf9407086c180e9557be968742d839e68346af7792b8592489732197used byvte
0.15.0crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma5924018406ce0063cd67f8e008104968b74b563ee1b85dde3ed1f7cb87d3dbdused byvte_generate_state_changes
0.1.2crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum2e369bee1b05d510a7b4ed645f5faa90619e05437111783ea5848f28d97d3c2edepends onused bywalkdir
2.5.0crates.io↘ 2↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4bdepends onwant
0.3.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumbfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0edepends onused bywasi
0.11.1+wasi-snapshot-preview1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44bused bywasi
0.14.7+wasi-0.2.4crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8cdepends onused bywasip2
1.0.1+wasi-0.2.4crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7depends onused bywasm-bindgen
0.2.104crates.io↘ 5↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2ddepends onwasm-bindgen-backend
0.2.104crates.io↘ 6↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19wasm-bindgen-futures
0.4.54crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5cused bywasm-bindgen-macro
0.2.104crates.io↘ 2↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119used bywasm-bindgen-macro-support
0.2.104crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7depends onused byweb-sys
0.3.81crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120depends onweb-time
1.1.0crates.io↘ 2↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bbdepends onwhich
4.4.2crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7used bywinapi
0.3.9crates.io↘ 2↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419winapi-i686-pc-windows-gnu
0.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6used bywinapi-util
0.1.11crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22depends onwinapi-x86_64-pc-windows-gnu
0.4.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183fused bywindows_aarch64_gnullvm
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3used bywindows_aarch64_gnullvm
0.53.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksuma9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53used bywindows_aarch64_msvc
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469used bywindows_aarch64_msvc
0.53.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006used bywindows_i686_gnu
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0bused bywindows_i686_gnu
0.53.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3used bywindows_i686_gnullvm
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66used bywindows_i686_gnullvm
0.53.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumfa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180cused bywindows_i686_msvc
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66used bywindows_i686_msvc
0.53.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2used bywindows_x86_64_gnu
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78used bywindows_x86_64_gnu
0.53.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499used bywindows_x86_64_gnullvm
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0dused bywindows_x86_64_gnullvm
0.53.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1used bywindows_x86_64_msvc
0.52.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ecused bywindows_x86_64_msvc
0.53.1crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650used bywindows-core
0.62.2crates.io↘ 5↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9debdepends onused bywindows-implement
0.60.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddfdepends onused bywindows-interface
0.59.3crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358depends onused bywindows-link
0.1.3crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798aused bywindows-link
0.2.1crates.io↘ 0↖ 9sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5windows-result
0.4.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5depends onused bywindows-strings
0.5.1crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091depends onused bywindows-sys
0.52.0crates.io↘ 1↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33ddepends onused bywindows-sys
0.59.0crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853bdepends onwindows-sys
0.60.2crates.io↘ 1↖ 3sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcbdepends onwindows-sys
0.61.2crates.io↘ 1↖ 6sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fcdepends onwindows-targets
0.52.6crates.io↘ 8↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973depends onwindows-targets
0.53.5crates.io↘ 9↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3depends onused bywit-bindgen
0.46.0crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumf17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59used bywriteable
0.6.1crates.io↘ 0↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bbx25519-dalek
2.0.1crates.io↘ 4↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumc7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277yasna
0.5.2crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cddepends onused byyoke
0.8.0crates.io↘ 4↖ 4sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695ccyoke-derive
0.8.0crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6used byz85
3.0.6crates.io↘ 0↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum9b3a41ce106832b4da1c065baa4c31cf640cf965fa1483816402b7f6b96f0a64used byzerocopy
0.8.27crates.io↘ 1↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282cdepends onused byzerocopy-derive
0.8.27crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831depends onused byzerofrom
0.1.6crates.io↘ 1↖ 5sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5depends onzerofrom-derive
0.1.6crates.io↘ 4↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumd71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502used byzeroize
1.8.2crates.io↘ 1↖ 12sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumb97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0depends onzeroize_derive
1.4.2crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksumce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69depends onused byzerotrie
0.2.2crates.io↘ 3↖ 2sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595depends onzerovec
0.11.4crates.io↘ 3↖ 7sourceregistry+https://github.com/rust-lang/crates.io-indexchecksume7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73bzerovec-derive
0.11.1crates.io↘ 3↖ 1sourceregistry+https://github.com/rust-lang/crates.io-indexchecksum5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58fdepends onused by
cmds/fleet/Cargo.tomldiffbeforeafterboth--- a/cmds/fleet/Cargo.toml
+++ b/cmds/fleet/Cargo.toml
@@ -47,6 +47,7 @@
nom = "8.0.0"
opentelemetry = "0.30.0"
opentelemetry_sdk = "0.30.0"
+thiserror.workspace = true
tracing-indicatif = { version = "0.3", optional = true }
tracing-opentelemetry = "0.31.0"
cmds/fleet/src/cmds/secrets/mod.rsdiffbeforeafterboth--- a/cmds/fleet/src/cmds/secrets/mod.rs
+++ b/cmds/fleet/src/cmds/secrets/mod.rs
@@ -2,17 +2,18 @@
collections::{BTreeMap, BTreeSet, HashSet},
io::{self, Read, Write, stdin, stdout},
path::PathBuf,
- slice,
};
-use age::Recipient;
use anyhow::{Context, Result, anyhow, bail, ensure};
use chrono::{DateTime, Utc};
use clap::Parser;
use fleet_base::{
- fleetdata::{FleetSecret, FleetSecretPart, FleetSharedSecret, encrypt_secret_data},
+ fleetdata::{
+ FleetHostSecret, FleetSecretData, FleetSecretPart, FleetSharedSecret, encrypt_secret_data,
+ },
host::Config,
opts::FleetOpts,
+ secret::{Expectations, RegenerationReason, SharedSecretDefinition, secret_needs_regeneration},
};
use fleet_shared::SecretData;
use nix_eval::{NixType, Value, nix_go, nix_go_json};
@@ -144,76 +145,55 @@
#[clap(short = 'p', long, default_value = "secret")]
part: String,
},
-}
-
-fn secret_needs_regeneration(
- secret: &FleetSecret,
- expected_generation_data: &serde_json::Value,
-) -> bool {
- let data_is_expected = secret.generation_data == *expected_generation_data;
- // TODO: Leeway?
- let expired = secret
- .expires_at
- .map(|expiration| expiration < Utc::now())
- .unwrap_or(false);
- expired || !data_is_expected
}
#[allow(clippy::too_many_arguments)]
-#[tracing::instrument(skip(config, secret, field, prefer_identities))]
+#[tracing::instrument(skip(config, secret, definition, prefer_identities))]
async fn maybe_regenerate_shared_secret(
secret_name: &str,
config: &Config,
mut secret: FleetSharedSecret,
- field: Value,
- expected_owners: &[String],
- expected_generation_data: serde_json::Value,
+ definition: SharedSecretDefinition,
prefer_identities: &[String],
+ expectations: &Expectations,
) -> Result<FleetSharedSecret> {
- let original_set = secret.owners.clone();
+ let reason = secret_needs_regeneration(&secret.secret, &secret.owners, expectations);
+ let value = definition.inner();
- let set = original_set.iter().collect::<BTreeSet<_>>();
- let expected_set = expected_owners.iter().collect::<BTreeSet<_>>();
-
- let regeneration_required =
- secret_needs_regeneration(&secret.secret, &expected_generation_data);
-
- if set == expected_set && !regeneration_required {
- info!("no need to update owner list, it is already correct");
- return Ok(secret);
- }
-
- let should_regenerate = if regeneration_required {
- info!("secret has its generation data changed, regeneration is required");
- true
- } else if set.difference(&expected_set).next().is_some() {
- // TODO: Remove this warning for revokable secrets.
- warn!(
- "host was removed from secret owners, but until this host rebuild, the secret will still be stored on it."
- );
- nix_go_json!(field.regenerateOnOwnerRemoved)
- } else if expected_set.difference(&set).next().is_some() {
- nix_go_json!(field.regenerateOnOwnerAdded)
- } else {
- false
+ let (should_reencrypt, reason) = match reason {
+ Some(RegenerationReason::OwnersAdded(_)) => {
+ // Secret always needs to be reencrypted for new owners to be able to read it
+ (
+ true,
+ if nix_go_json!(value.regenerateOnOwnerAdded) {
+ reason
+ } else {
+ None
+ },
+ )
+ }
+ Some(RegenerationReason::OwnersRemoved(_)) => {
+ // No need to reencrypt, we can just leave stanzas in place.
+ if nix_go_json!(value.regenerateOnOwnerRemoved) {
+ (true, reason)
+ } else {
+ (false, None)
+ }
+ }
+ Some(_) => (true, reason),
+ None => (false, None),
};
- if should_regenerate {
- info!("secret needs to be regenerated");
- let generated = generate_shared(
- config,
- secret_name,
- field,
- expected_owners.to_vec(),
- expected_generation_data,
- )
- .await?;
+ if let Some(reason) = reason {
+ info!("secret needs to be regenerated: {reason}");
+ let generated = generate_shared(config, secret_name, definition, expectations).await?;
Ok(generated)
- } else {
+ } else if should_reencrypt {
+ info!("secret needs to be reencrypted");
let identity_holder = if !prefer_identities.is_empty() {
prefer_identities
.iter()
- .find(|i| original_set.iter().any(|s| s == *i))
+ .find(|i| secret.owners.iter().any(|s| s == *i))
} else {
secret.owners.first()
};
@@ -228,12 +208,16 @@
}
let host = config.host(identity_holder).await?;
let encrypted = host
- .reencrypt(part.raw.clone(), expected_owners.to_vec())
+ .reencrypt(
+ part.raw.clone(),
+ expectations.owners.iter().cloned().collect(),
+ )
.await?;
part.raw = encrypted;
}
-
- secret.owners = expected_owners.to_vec();
+ secret.owners = expectations.owners.clone();
+ Ok(secret)
+ } else {
Ok(secret)
}
}
@@ -250,8 +234,8 @@
_display_name: &str,
_secret: Value,
_default_generator: Value,
- _owners: &[String],
-) -> Result<FleetSecret> {
+ _expectations: &Expectations,
+) -> Result<FleetSecretData> {
bail!("pure generators are broken for now")
}
async fn generate_impure(
@@ -259,9 +243,8 @@
_display_name: &str,
secret: Value,
default_generator: Value,
- expected_owners: &[String],
- expected_generation_data: serde_json::Value,
-) -> Result<FleetSecret> {
+ expectations: &Expectations,
+) -> Result<FleetSecretData> {
let generator = nix_go!(secret.generator);
let on: Option<String> = nix_go_json!(default_generator.impureOn);
@@ -276,12 +259,11 @@
let mk_secret_generators = nix_go!(on_pkgs.mkSecretGenerators);
let mut recipients = Vec::new();
- for owner in expected_owners {
+ for owner in &expectations.owners {
let key = config.key(owner).await?;
recipients.push(key);
}
let generators = nix_go!(mk_secret_generators(Obj { recipients }));
- // FIXME: Apparently, // operator is slow in nix
let pkgs_and_generators = on_pkgs.attrs_update(generators)?;
let call_package = nix_go!(nixpkgs.lib.callPackageWith(pkgs_and_generators));
@@ -331,20 +313,26 @@
let created_at = host.read_file_value(format!("{out}/created_at")).await?;
let expires_at = host.read_file_value(format!("{out}/expires_at")).await.ok();
- Ok(FleetSecret {
+ let new_data = FleetSecretData {
created_at,
expires_at,
parts,
- generation_data: expected_generation_data,
- })
+ generation_data: expectations.generation_data.clone(),
+ };
+
+ if let Some(reason) = secret_needs_regeneration(&new_data, &expectations.owners, expectations) {
+ bail!("newly generated secret needs to be regenerated: {reason}")
+ }
+
+ Ok(new_data)
}
+
async fn generate(
config: &Config,
display_name: &str,
secret: Value,
- expected_owners: &[String],
- expected_generation_data: serde_json::Value,
-) -> Result<FleetSecret> {
+ expectations: &Expectations,
+) -> Result<FleetSecretData> {
let generator = nix_go!(secret.generator);
// Can't properly check on nix module system level
{
@@ -388,8 +376,7 @@
display_name,
secret,
default_generator,
- expected_owners,
- expected_generation_data,
+ expectations,
)
.await
}
@@ -399,7 +386,7 @@
display_name,
secret,
default_generator,
- expected_owners,
+ expectations,
)
.await
}
@@ -408,21 +395,14 @@
async fn generate_shared(
config: &Config,
display_name: &str,
- secret: Value,
- expected_owners: Vec<String>,
- expected_generation_data: serde_json::Value,
+ secret: SharedSecretDefinition,
+ expectations: &Expectations,
) -> Result<FleetSharedSecret> {
// let owners: Vec<String> = nix_go_json!(secret.expectedOwners);
Ok(FleetSharedSecret {
- secret: generate(
- config,
- display_name,
- secret,
- &expected_owners,
- expected_generation_data,
- )
- .await?,
- owners: expected_owners,
+ managed: Some(true),
+ secret: generate(config, display_name, secret.inner(), expectations).await?,
+ owners: expectations.owners.clone(),
})
}
@@ -457,11 +437,11 @@
}
fn parse_machines(
- initial: Vec<String>,
+ initial: BTreeSet<String>,
machines: Option<Vec<String>>,
mut add_machines: Vec<String>,
mut remove_machines: Vec<String>,
-) -> Result<Vec<String>> {
+) -> Result<BTreeSet<String>> {
if machines.is_none() && add_machines.is_empty() && remove_machines.is_empty() {
bail!("no operation");
}
@@ -470,7 +450,6 @@
let mut target_machines = initial;
info!("Currently encrypted for {initial_machines:?}");
- // ensure!(machines.is_some() || !add_machines.is_empty() || )
if let Some(machines) = machines {
ensure!(
add_machines.is_empty() && remove_machines.is_empty(),
@@ -487,20 +466,13 @@
}
for machine in &remove_machines {
- let mut removed = false;
- while let Some(pos) = target_machines.iter().position(|m| m == machine) {
- target_machines.swap_remove(pos);
- removed = true;
- }
- if !removed {
+ if !target_machines.remove(machine) {
warn!("secret is not enabled for {machine}");
}
}
for machine in &add_machines {
- if target_machines.iter().any(|m| m == machine) {
+ if !target_machines.insert(machine.to_owned()) {
warn!("secret is already added to {machine}");
- } else {
- target_machines.push(machine.to_owned());
}
}
if !remove_machines.is_empty() {
@@ -527,7 +499,7 @@
}
}
Secret::AddShared {
- mut machines,
+ machines,
name,
force,
public,
@@ -537,25 +509,32 @@
re_add,
part: part_name,
} => {
+ let mut machines: BTreeSet<String> = machines.into_iter().collect();
// TODO: Forbid updating secrets with set expectedOwners (= not user-managed).
- let exists = config.has_shared(&name);
- if exists && !force && !re_add {
- bail!("secret already defined");
- }
- if re_add {
- // Fixme: use clap to limit this usage
- ensure!(!force, "--force and --readd are not compatible");
- ensure!(exists, "secret doesn't exists");
- ensure!(
- machines.is_empty(),
- "you can't use machines argument for --readd"
- );
- let shared = config.shared_secret(&name)?;
- machines = shared.owners;
- }
+ if let Some(old_shared) = config.shared_secret(&name)? {
+ if !force && !re_add {
+ bail!("secret already defined");
+ };
+ if old_shared.managed.unwrap_or(false) {
+ bail!("secret is marked as managed, should not be updated manually");
+ };
+ if re_add {
+ // Fixme: use clap to limit this usage
+ ensure!(!force, "--force and --readd are not compatible");
+ ensure!(
+ machines.is_empty(),
+ "you can't use machines argument for --readd"
+ );
+ machines = old_shared.owners;
+ }
+ } else if re_add {
+ bail!("secret doesn't exists");
+ };
- let recipients = config.recipients(machines.clone()).await?;
+ let recipients = config
+ .recipients(machines.iter().cloned().collect())
+ .await?;
let mut parts = BTreeMap::new();
@@ -563,9 +542,8 @@
io::stdin().read_to_end(&mut input)?;
if !input.is_empty() {
- let encrypted =
- encrypt_secret_data(recipients.iter().map(|r| r as &dyn Recipient), input)
- .ok_or_else(|| anyhow!("no recipients provided"))?;
+ let encrypted = encrypt_secret_data(recipients.iter(), input)
+ .ok_or_else(|| anyhow!("no recipients provided"))?;
parts.insert(part_name, FleetSecretPart { raw: encrypted });
}
@@ -576,8 +554,9 @@
config.replace_shared(
name,
FleetSharedSecret {
+ managed: Some(false),
owners: machines,
- secret: FleetSecret {
+ secret: FleetSecretData {
created_at: Utc::now(),
expires_at,
parts,
@@ -607,34 +586,47 @@
.host_secret(&machine, &name)
.context("failed to read existing secret for --merge")?
} else {
- FleetSecret {
- created_at: Utc::now(),
- expires_at: None,
- parts: BTreeMap::new(),
- generation_data: serde_json::Value::Null,
+ FleetHostSecret {
+ managed: Some(false),
+ secret: FleetSecretData {
+ created_at: Utc::now(),
+ expires_at: None,
+ parts: BTreeMap::new(),
+ generation_data: serde_json::Value::Null,
+ },
}
};
+ if out.managed.unwrap_or(false) {
+ bail!("secret is managed by fleet and should not be updated manually");
+ }
+ out.managed = Some(false);
if let Some(secret) = parse_secret().await? {
let recipient = config.recipient(&machine).await?;
- let encrypted = encrypt_secret_data([&recipient as &dyn Recipient], secret)
- .expect("recipient provided");
+ let encrypted =
+ encrypt_secret_data([&recipient], secret).expect("recipient provided");
if out
+ .secret
.parts
.insert(part_name.clone(), FleetSecretPart { raw: encrypted })
.is_some() && !replace
{
- bail!("part {part_name:?} is already defined");
+ bail!(
+ "part {part_name:?} is already defined, use --replace if you wish to replace it"
+ );
}
}
if let Some(public) = parse_public(public, public_file).await? {
if out
+ .secret
.parts
.insert(public_name.clone(), FleetSecretPart { raw: public })
.is_some() && !replace
{
- bail!("part {public_name:?} is already defined");
+ bail!(
+ "part {public_name:?} is already defined, use --replace if you wish to replace it"
+ );
}
};
@@ -647,7 +639,7 @@
part: part_name,
} => {
let secret = config.host_secret(&machine, &name)?;
- let Some(secret) = secret.parts.get(&part_name) else {
+ let Some(secret) = secret.secret.parts.get(&part_name) else {
bail!("no part {part_name} in secret {name}");
};
let data = if secret.raw.encrypted {
@@ -664,7 +656,9 @@
part: part_name,
prefer_identities,
} => {
- let secret = config.shared_secret(&name)?;
+ let Some(secret) = config.shared_secret(&name)? else {
+ bail!("secret doesn't exists");
+ };
let Some(part) = secret.secret.parts.get(&part_name) else {
bail!("no part {part_name} in secret {name}");
};
@@ -695,7 +689,9 @@
} => {
// TODO: Forbid updating secrets with set expectedOwners (= not user-managed).
- let secret = config.shared_secret(&name)?;
+ let Some(secret) = config.shared_secret(&name)? else {
+ bail!("secret doesn't exists");
+ };
if secret.secret.parts.values().all(|v| !v.raw.encrypted) {
bail!("no secret");
}
@@ -714,20 +710,16 @@
return Ok(());
}
- let config_field = &config.config_field;
- let name_clone = name.clone();
- let field = nix_go!(config_field.sharedSecrets[name_clone]);
- let expected_generation_data = nix_go_json!(field.expectedGenerationData);
+ let definition = config.shared_secret_definition(&name)?;
+ let expectations = definition.expectations()?;
let updated = maybe_regenerate_shared_secret(
&name,
config,
secret,
- field,
- &target_machines,
- expected_generation_data,
+ definition,
&prefer_identities,
- // None,
+ &expectations,
)
.await?;
config.replace_shared(name, updated);
@@ -737,36 +729,26 @@
skip_hosts,
} => {
info!("checking for secrets to regenerate");
+ let expected_shared_set = config
+ .list_configured_shared()
+ .await?
+ .into_iter()
+ .collect::<HashSet<_>>();
let stored_shared_set = config.list_shared().into_iter().collect::<HashSet<_>>();
{
// Generate missing shared
let _span = info_span!("shared").entered();
- let expected_shared_set = config
- .list_configured_shared()
- .await?
- .into_iter()
- .collect::<HashSet<_>>();
for missing in expected_shared_set.difference(&stored_shared_set) {
- let config_field = &config.config_field;
- let secret = nix_go!(config_field.sharedSecrets[{ missing }]);
- let expected_generation_data: serde_json::Value =
- nix_go_json!(secret.expectedGenerationData);
- let expected_owners: Option<Vec<String>> =
- nix_go_json!(secret.expectedOwners);
- let Some(expected_owners) = expected_owners else {
- // Can't generate this missing secret, as it has no defined owners.
+ let definition = config.shared_secret_definition(missing)?;
+ if !definition.is_managed()? {
+ info!("skipping unmanaged secret: {missing}");
continue;
- };
+ }
+ let expectations = definition.expectations()?;
info!("generating secret: {missing}");
- let shared = generate_shared(
- config,
- missing,
- secret,
- expected_owners,
- expected_generation_data,
- )
- .in_current_span()
- .await?;
+ let shared = generate_shared(config, missing, definition, &expectations)
+ .in_current_span()
+ .await?;
config.replace_shared(missing.to_string(), shared)
}
}
@@ -778,26 +760,22 @@
let _span = info_span!("host", host = host.name).entered();
let expected_set = host
- .list_configured_secrets()
- .in_current_span()
- .await?
+ .list_defined_secrets()?
.into_iter()
.collect::<HashSet<_>>();
let stored_set = config
.list_secrets(&host.name)
.into_iter()
.collect::<HashSet<_>>();
- for missing in expected_set.difference(&stored_set) {
- info!("generating secret: {missing}");
- let secret = host.secret_field(missing).in_current_span().await?;
- let expected_generation_data =
- nix_go_json!(secret.expectedGenerationData);
+ for missing_secret in expected_set.difference(&stored_set) {
+ info!("generating missing secret: {missing_secret}");
+ let definition = host.secret_definition(missing_secret)?;
+ let expectations = definition.expectations()?;
let generated = match generate(
config,
- missing,
- secret,
- slice::from_ref(&host.name),
- expected_generation_data,
+ missing_secret,
+ definition.inner(),
+ &expectations,
)
.in_current_span()
.await
@@ -808,21 +786,27 @@
continue;
}
};
- config.insert_secret(&host.name, missing.to_string(), generated)
+ config.insert_secret(
+ &host.name,
+ missing_secret.to_string(),
+ FleetHostSecret {
+ managed: Some(true),
+ secret: generated,
+ },
+ )
}
- for name in stored_set {
- info!("updating secret: {name}");
- let data = config.host_secret(&host.name, &name)?;
- let secret = host.secret_field(&name).in_current_span().await?;
- let expected_generation_data =
- nix_go_json!(secret.expectedGenerationData);
- if secret_needs_regeneration(&data, &expected_generation_data) {
+ for known_secret in stored_set.intersection(&expected_set) {
+ info!("updating secret: {known_secret}");
+ let data = config.host_secret(&host.name, known_secret)?;
+ let definition = host.secret_definition(known_secret)?;
+ let expectations = definition.expectations()?;
+ if let Some(regen_reason) = data.needs_regeneration(&expectations) {
+ info!("needs regeneration: {regen_reason}");
let generated = match generate(
config,
- &name,
- secret,
- slice::from_ref(&host.name),
- expected_generation_data,
+ known_secret,
+ definition.inner(),
+ &expectations,
)
.in_current_span()
.await
@@ -833,43 +817,44 @@
continue;
}
};
- config.insert_secret(&host.name, name.to_string(), generated)
+ config.insert_secret(
+ &host.name,
+ known_secret.to_string(),
+ FleetHostSecret {
+ managed: Some(true),
+ secret: generated,
+ },
+ )
}
}
+ for removed_secret in stored_set.difference(&expected_set) {
+ info!("removing secret: {removed_secret}");
+ config.remove_secret(&host.name, removed_secret);
+ }
}
}
- let mut to_remove = Vec::new();
- for name in &stored_shared_set {
- info!("updating secret: {name}");
- let data = config.shared_secret(name)?;
- let config_field = &config.config_field;
- let expected_owners: Option<Vec<String>> =
- nix_go_json!(config_field.sharedSecrets[{ name }].expectedOwners);
- let Some(expected_owners) = expected_owners else {
- warn!("secret was removed from fleet config: {name}, removing from data");
- to_remove.push(name.to_string());
- continue;
- };
+ for known_secret in stored_shared_set.intersection(&expected_shared_set) {
+ info!("updating shared secret: {known_secret}");
+ let data = config.shared_secret(known_secret)?.expect("exists");
- let secret = nix_go!(config_field.sharedSecrets[{ name }]);
- let expected_generation_data = nix_go_json!(secret.expectedGenerationData);
+ let definition = config.shared_secret_definition(known_secret)?;
+ let expectations = definition.expectations()?;
config.replace_shared(
- name.to_owned(),
+ known_secret.to_owned(),
maybe_regenerate_shared_secret(
- name,
+ known_secret,
config,
data,
- secret,
- &expected_owners,
- expected_generation_data,
+ definition,
&prefer_identities,
- // None,
+ &expectations,
)
.await?,
);
}
- for k in to_remove {
- config.remove_shared(&k);
+ for removed_secret in stored_shared_set.difference(&expected_shared_set) {
+ info!("removing shared secret: {removed_secret}");
+ config.remove_shared(removed_secret);
}
}
Secret::List {} => {
@@ -885,13 +870,14 @@
let mut table = vec![];
for name in configured.iter().cloned() {
let config = config.clone();
- let expected_owners = config.shared_secret_expected_owners(&name).await?;
- let data = config.shared_secret(&name)?;
+ let data = config.shared_secret(&name)?.expect("exists");
+ let definition = config.shared_secret_definition(&name)?;
+ let expectations = definition.expectations()?;
let owners = data
.owners
.iter()
.map(|o| {
- if expected_owners.contains(o) {
+ if expectations.owners.contains(o) {
o.green().to_string()
} else {
o.red().to_string()
@@ -912,7 +898,7 @@
add,
} => {
let secret = config.host_secret(&machine, &name)?;
- if let Some(data) = secret.parts.get(&part) {
+ if let Some(data) = secret.secret.parts.get(&part) {
let host = config.host(&machine).await?;
let secret = host.decrypt(data.raw.clone()).await?;
String::from_utf8(secret).context("secret is not utf8")?
cmds/fleet/src/main.rsdiffbeforeafterboth--- a/cmds/fleet/src/main.rs
+++ b/cmds/fleet/src/main.rs
@@ -27,7 +27,7 @@
use tracing::{Instrument, error, info, info_span};
#[cfg(feature = "indicatif")]
use tracing_indicatif::IndicatifLayer;
-use tracing_subscriber::{EnvFilter, fmt::format::Format, prelude::*};
+use tracing_subscriber::{EnvFilter, prelude::*};
#[derive(Parser)]
struct Prefetch {}
crates/fleet-base/Cargo.tomldiffbeforeafterboth--- a/crates/fleet-base/Cargo.toml
+++ b/crates/fleet-base/Cargo.toml
@@ -24,6 +24,7 @@
serde_json = "1.0.140"
tabled = "0.20.0"
tempfile.workspace = true
+thiserror.workspace = true
time = { version = "0.3.41", features = ["parsing"] }
tokio.workspace = true
tokio-util = "0.7.15"
crates/fleet-base/src/fleetdata.rsdiffbeforeafterboth--- a/crates/fleet-base/src/fleetdata.rs
+++ b/crates/fleet-base/src/fleetdata.rs
@@ -1,5 +1,5 @@
use std::{
- collections::BTreeMap,
+ collections::{BTreeMap, BTreeSet},
io::{self, Cursor},
};
@@ -13,6 +13,8 @@
use serde::{Deserialize, Serialize, de::Error};
use serde_json::Value;
+use crate::secret::{Expectations, RegenerationReason, secret_needs_regeneration};
+
#[derive(Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct HostData {
@@ -75,30 +77,21 @@
pub shared_secrets: BTreeMap<String, FleetSharedSecret>,
#[serde(default)]
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
- pub host_secrets: BTreeMap<String, BTreeMap<String, FleetSecret>>,
+ pub host_secrets: BTreeMap<String, BTreeMap<String, FleetHostSecret>>,
// extra_name => anything
#[serde(default)]
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
pub extra: BTreeMap<String, Value>,
-}
-
-#[derive(Serialize, Deserialize, Clone)]
-#[serde(rename_all = "camelCase")]
-#[must_use]
-pub struct FleetSharedSecret {
- pub owners: Vec<String>,
- #[serde(flatten)]
- pub secret: FleetSecret,
}
/// Returns None if recipients.is_empty()
-pub fn encrypt_secret_data<'a>(
- recipients: impl IntoIterator<Item = &'a dyn Recipient>,
+pub fn encrypt_secret_data<'r>(
+ recipients: impl IntoIterator<Item = &'r Box<dyn Recipient>>,
data: Vec<u8>,
) -> Option<SecretData> {
let mut encrypted = vec![];
- let mut encryptor = age::Encryptor::with_recipients(recipients.into_iter())
+ let mut encryptor = age::Encryptor::with_recipients(recipients.into_iter().map(|v| &**v))
.ok()?
.wrap_output(&mut encrypted)
.expect("in memory write");
@@ -118,7 +111,7 @@
#[derive(Serialize, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
#[must_use]
-pub struct FleetSecret {
+pub struct FleetSecretData {
#[serde(default = "Utc::now")]
pub created_at: DateTime<Utc>,
#[serde(default)]
@@ -132,3 +125,31 @@
#[serde(skip_serializing_if = "Value::is_null")]
pub generation_data: Value,
}
+
+#[derive(Serialize, Deserialize, Clone)]
+#[serde(rename_all = "camelCase")]
+#[must_use]
+pub struct FleetHostSecret {
+ #[serde(default)]
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub managed: Option<bool>,
+ #[serde(flatten)]
+ pub secret: FleetSecretData,
+}
+impl FleetHostSecret {
+ pub fn needs_regeneration(&self, expectations: &Expectations) -> Option<RegenerationReason> {
+ secret_needs_regeneration(&self.secret, &expectations.owners, expectations)
+ }
+}
+
+#[derive(Serialize, Deserialize, Clone)]
+#[serde(rename_all = "camelCase")]
+#[must_use]
+pub struct FleetSharedSecret {
+ #[serde(default)]
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub managed: Option<bool>,
+ pub owners: BTreeSet<String>,
+ #[serde(flatten)]
+ pub secret: FleetSecretData,
+}
crates/fleet-base/src/host.rsdiffbeforeafterboth--- a/crates/fleet-base/src/host.rs
+++ b/crates/fleet-base/src/host.rs
@@ -22,7 +22,8 @@
use crate::{
command::MyCommand,
- fleetdata::{FleetData, FleetSecret, FleetSharedSecret},
+ fleetdata::{FleetData, FleetHostSecret, FleetSharedSecret},
+ secret::{HostSecretDefinition, SharedSecretDefinition},
};
pub struct FleetConfigInternals {
@@ -234,7 +235,7 @@
let is_fleet_managed = match self.file_exists("/etc/FLEET_HOST").await {
Ok(v) => v,
Err(e) => {
- bail!("failed to query remote system kind: {}", e);
+ bail!("failed to query remote system kind: {e}");
}
};
if !is_fleet_managed {
@@ -501,7 +502,7 @@
Ok(nixos_config)
}
- pub async fn nixos_unchecked_config(&self) -> Result<Value> {
+ pub fn nixos_unchecked_config(&self) -> Result<Value> {
if let Some(v) = self.nixos_unchecked_config.get() {
return Ok(v.clone());
}
@@ -515,23 +516,17 @@
Ok(nixos_config)
}
- pub async fn list_configured_secrets(&self) -> Result<Vec<String>> {
- let nixos = self.nixos_unchecked_config().await?;
+ pub fn list_defined_secrets(&self) -> Result<Vec<String>> {
+ let nixos = self.nixos_unchecked_config()?;
let secrets = nix_go!(nixos.secrets);
- let mut out = Vec::new();
- for name in secrets.list_fields()? {
- let secret = secrets.get_field(&name).context("getting secret")?;
- let is_shared: bool = nix_go_json!(secret.shared);
- if is_shared {
- continue;
- }
- out.push(name);
- }
- Ok(out)
+ secrets.list_fields()
}
- pub async fn secret_field(&self, name: &str) -> Result<Value> {
- let nixos = self.nixos_unchecked_config().await?;
- Ok(nix_go!(nixos.secrets[{ name }]))
+ pub fn secret_definition(&self, name: &str) -> Result<HostSecretDefinition> {
+ let nixos = self.nixos_unchecked_config()?;
+ Ok(HostSecretDefinition(
+ self.name.clone(),
+ nix_go!(nixos.secrets[{ name }]),
+ ))
}
/// Packages for this host, resolved with nixpkgs overlays
@@ -648,10 +643,19 @@
pub fn list_secrets(&self, host: &str) -> Vec<String> {
let data = self.data();
- let Some(secrets) = data.host_secrets.get(host) else {
- return Vec::new();
- };
- secrets.keys().cloned().collect()
+ let mut out = data
+ .host_secrets
+ .get(host)
+ .map(|s| s.keys().cloned().collect::<Vec<String>>())
+ .unwrap_or_default();
+
+ for (name, shared) in data.shared_secrets.iter() {
+ if shared.owners.contains(host) {
+ out.push(name.clone());
+ }
+ }
+
+ out
}
pub fn has_secret(&self, host: &str, secret: &str) -> bool {
@@ -661,34 +665,44 @@
};
host_secrets.contains_key(secret)
}
- pub fn insert_secret(&self, host: &str, secret: String, value: FleetSecret) {
+ pub fn insert_secret(&self, host: &str, secret: String, value: FleetHostSecret) {
let mut data = self.data_mut();
let host_secrets = data.host_secrets.entry(host.to_owned()).or_default();
host_secrets.insert(secret, value);
}
+ pub fn remove_secret(&self, host: &str, secret: &str) {
+ let mut data = self.data_mut();
+ let host_secrets = data.host_secrets.entry(host.to_owned()).or_default();
+ host_secrets.remove(secret);
+ }
- pub fn host_secret(&self, host: &str, secret: &str) -> Result<FleetSecret> {
+ pub fn host_secret(&self, host: &str, secret: &str) -> Result<FleetHostSecret> {
let data = self.data();
- let Some(host_secrets) = data.host_secrets.get(host) else {
- bail!("no secrets for machine {host}");
+ if let Some(host_secrets) = data.host_secrets.get(host) {
+ if let Some(secret) = host_secrets.get(secret) {
+ return Ok(secret.clone());
+ }
};
- let Some(secret) = host_secrets.get(secret) else {
+ let Some(shared) = data.shared_secrets.get(secret) else {
bail!("machine {host} has no secret {secret}");
};
- Ok(secret.clone())
+ if !shared.owners.contains(host) {
+ bail!("shared secret {secret} is not owned by {host}");
+ };
+ Ok(FleetHostSecret {
+ managed: shared.managed,
+ secret: shared.secret.clone(),
+ })
}
- pub fn shared_secret(&self, secret: &str) -> Result<FleetSharedSecret> {
+ pub fn shared_secret(&self, secret: &str) -> Result<Option<FleetSharedSecret>> {
let data = self.data();
- let Some(secret) = data.shared_secrets.get(secret) else {
- bail!("no shared secret {secret}");
- };
- Ok(secret.clone())
+ Ok(data.shared_secrets.get(secret).cloned())
}
- pub async fn shared_secret_expected_owners(&self, secret: &str) -> Result<Vec<String>> {
+ pub fn shared_secret_definition(&self, secret: &str) -> Result<SharedSecretDefinition> {
let config_field = &self.config_field;
- Ok(nix_go_json!(
- config_field.sharedSecrets[{ secret }].expectedOwners
- ))
+ Ok(SharedSecretDefinition(nix_go!(
+ config_field.sharedSecrets[{ secret }]
+ )))
}
// TODO: Should this be something modifiable from other processes?
crates/fleet-base/src/keys.rsdiffbeforeafterboth--- a/crates/fleet-base/src/keys.rs
+++ b/crates/fleet-base/src/keys.rs
@@ -39,12 +39,14 @@
}
}
/// Insecure, requires root
- pub async fn recipient(&self, host: &str) -> anyhow::Result<impl Recipient + use<>> {
+ pub async fn recipient(&self, host: &str) -> anyhow::Result<Box<dyn Recipient>> {
let key = self.key(host).await?;
- age::ssh::Recipient::from_str(&key).map_err(|e| anyhow!("parse recipient error: {:?}", e))
+ age::ssh::Recipient::from_str(&key)
+ .map_err(|e| anyhow!("parse recipient error: {e:?}"))
+ .map(|v| Box::new(v) as Box<dyn Recipient>)
}
- pub async fn recipients(&self, hosts: Vec<String>) -> Result<Vec<impl Recipient + use<>>> {
+ pub async fn recipients(&self, hosts: Vec<String>) -> Result<Vec<Box<dyn Recipient>>> {
let hosts = self.expand_owner_set(hosts).await?;
futures::stream::iter(hosts.iter())
.then(|m| self.recipient(m.as_ref()))
crates/fleet-base/src/lib.rsdiffbeforeafterboth--- a/crates/fleet-base/src/lib.rs
+++ b/crates/fleet-base/src/lib.rs
@@ -4,3 +4,4 @@
pub mod host;
mod keys;
pub mod opts;
+pub mod secret;
crates/fleet-base/src/secret.rsdiffbeforeafterboth--- /dev/null
+++ b/crates/fleet-base/src/secret.rs
@@ -0,0 +1,136 @@
+use std::collections::BTreeSet;
+
+use anyhow::Result;
+use chrono::{DateTime, Utc};
+use nix_eval::{Value, nix_go, nix_go_json};
+
+use crate::fleetdata::FleetSecretData;
+
+#[derive(Debug)]
+pub struct Expectations {
+ pub owners: BTreeSet<String>,
+ pub generation_data: serde_json::Value,
+ pub public_parts: BTreeSet<String>,
+ pub private_parts: BTreeSet<String>,
+}
+
+pub struct HostSecretDefinition(pub(crate) String, pub(crate) Value);
+impl HostSecretDefinition {
+ pub fn is_managed(&self) -> Result<bool> {
+ let value = &self.1;
+ Ok(!nix_go!(value.generator).is_null())
+ }
+ pub fn expectations(&self) -> Result<Expectations> {
+ let value = &self.1;
+ Ok(Expectations {
+ owners: BTreeSet::from([self.0.clone()]),
+ generation_data: nix_go_json!(value.expectedGenerationData),
+ public_parts: nix_go_json!(value.expectedPublicParts),
+ private_parts: nix_go_json!(value.expectedPrivateParts),
+ })
+ }
+ pub fn inner(&self) -> Value {
+ self.1.clone()
+ }
+}
+
+pub struct SharedSecretDefinition(pub(crate) Value);
+impl SharedSecretDefinition {
+ pub fn is_managed(&self) -> Result<bool> {
+ let value = &self.0;
+ Ok(!nix_go!(value.generator).is_null())
+ }
+ pub fn expectations(&self) -> Result<Expectations> {
+ let value = &self.0;
+ Ok(Expectations {
+ owners: nix_go_json!(value.expectedOwners),
+ generation_data: nix_go_json!(value.expectedGenerationData),
+ public_parts: nix_go_json!(value.expectedPublicParts),
+ private_parts: nix_go_json!(value.expectedPrivateParts),
+ })
+ }
+ pub fn inner(&self) -> Value {
+ self.0.clone()
+ }
+}
+
+#[derive(thiserror::Error, Debug)]
+pub enum RegenerationReason {
+ #[error("owners added: {0:?}")]
+ OwnersAdded(BTreeSet<String>),
+ #[error("owners added: {0:?}")]
+ OwnersRemoved(BTreeSet<String>),
+ #[error("unexpected generation data, expected: {expected:?}, found: {found:?}")]
+ GenerationData {
+ expected: serde_json::Value,
+ found: serde_json::Value,
+ },
+ #[error("unexpected part list, expected: {expected:?}, found: {found:?}")]
+ PartList {
+ expected: BTreeSet<String>,
+ found: BTreeSet<String>,
+ },
+ #[error("part {0} is expected to be encrypted")]
+ ExpectedPrivate(String),
+ #[error("part {0} is not expected to be encrypted")]
+ ExpectedPublic(String),
+ #[error("secret is expired at {0}")]
+ Expired(DateTime<Utc>),
+}
+
+pub fn secret_needs_regeneration(
+ secret: &FleetSecretData,
+ owners: &BTreeSet<String>,
+ expectations: &Expectations,
+) -> Option<RegenerationReason> {
+ if !owners.is_empty() {
+ let added: BTreeSet<String> = expectations.owners.difference(owners).cloned().collect();
+ if !added.is_empty() {
+ return Some(RegenerationReason::OwnersAdded(added));
+ }
+
+ let removed: BTreeSet<String> = owners.difference(&expectations.owners).cloned().collect();
+ if !removed.is_empty() {
+ return Some(RegenerationReason::OwnersRemoved(removed));
+ }
+ }
+
+ if secret.generation_data != expectations.generation_data {
+ return Some(RegenerationReason::GenerationData {
+ expected: expectations.generation_data.clone(),
+ found: secret.generation_data.clone(),
+ });
+ }
+
+ if !expectations.public_parts.is_empty() || !expectations.private_parts.is_empty() {
+ let expected: BTreeSet<String> = expectations
+ .public_parts
+ .union(&expectations.private_parts)
+ .cloned()
+ .collect();
+ let found: BTreeSet<String> = secret.parts.keys().cloned().collect();
+
+ if found != expected {
+ return Some(RegenerationReason::PartList { expected, found });
+ }
+
+ for (name, value) in secret.parts.iter() {
+ if value.raw.encrypted {
+ if !expectations.private_parts.contains(name) {
+ return Some(RegenerationReason::ExpectedPrivate(name.clone()));
+ }
+ } else if !expectations.public_parts.contains(name) {
+ return Some(RegenerationReason::ExpectedPublic(name.clone()));
+ }
+ }
+ }
+
+ if let Some(expiration) = secret.expires_at {
+ // TODO: Leeway?
+ if expiration < Utc::now() {
+ return Some(RegenerationReason::Expired(expiration));
+ }
+ }
+
+ None
+}
crates/nix-eval/src/lib.rsdiffbeforeafterboth--- a/crates/nix-eval/src/lib.rs
+++ b/crates/nix-eval/src/lib.rs
@@ -729,10 +729,13 @@
with_default_context(|c, es| unsafe { get_list_byidx(c, self.0, es, v as u32) }).map(Self)
}
- pub fn attrs_update(self, other: Value/*, ignore_errors: bool*/) -> Result<Self> {
+ pub fn attrs_update(self, other: Value /*, ignore_errors: bool*/) -> Result<Self> {
let attrs_update_fn = Self::eval("a: b: a // b")?;
- attrs_update_fn.call(self)?.call(other).context("attrs update")
+ attrs_update_fn
+ .call(self)?
+ .call(other)
+ .context("attrs update")
}
pub fn get_field(&self, name: impl AsFieldName) -> Result<Self> {
if !matches!(self.type_of(), NixType::Attrs) {
@@ -840,6 +843,9 @@
pub fn is_function(&self) -> bool {
self.functor_kind().is_some()
}
+ pub fn is_null(&self) -> bool {
+ matches!(self.type_of(), NixType::Null)
+ }
}
impl From<String> for Value {
flake.nixdiffbeforeafterboth--- a/flake.nix
+++ b/flake.nix
@@ -181,7 +181,7 @@
inputs'.nix.packages.nix-fetchers-c
inputs'.nix.packages.nix-store-c
- (rage.overrideAttrs {cargoFeatures = ["plugin"];})
+ (rage.overrideAttrs { cargoFeatures = [ "plugin" ]; })
];
environment.PROTOC = "${pkgs.protobuf}/bin/protoc";
};
modules/extras/tf.nixdiffbeforeafterboth--- a/modules/extras/tf.nix
+++ b/modules/extras/tf.nix
@@ -38,17 +38,19 @@
# will be somehow processed by fleet tf.
sensitive = true;
};
- fleetConfigurations.default = {config, ...}: {
- options.data = mkDataOption {
- # host => hostData
- options.extra.terraformHosts = mkOption {
- default = { };
- type = attrsOf (attrsOf unspecified);
- description = "Hosts data provided by fleet tf";
+ fleetConfigurations.default =
+ { config, ... }:
+ {
+ options.data = mkDataOption {
+ # host => hostData
+ options.extra.terraformHosts = mkOption {
+ default = { };
+ type = attrsOf (attrsOf unspecified);
+ description = "Hosts data provided by fleet tf";
+ };
};
+ config.hosts = config.data.extra.terraformHosts;
};
- config.hosts = config.data.extra.terraformHosts;
- };
perSystem.imports = [ ./tf-bootstrap.nix ];
};
modules/nixos/secrets.nixdiffbeforeafterboth--- a/modules/nixos/secrets.nix
+++ b/modules/nixos/secrets.nix
@@ -6,11 +6,11 @@
...
}:
let
- inherit (builtins) hashString;
+ inherit (builtins) hashString elemAt length toJSON filter;
inherit (lib.stringsWithDeps) stringAfter;
inherit (lib.options) mkOption literalExpression;
inherit (lib.lists) optional;
- inherit (lib.attrsets) mapAttrs;
+ inherit (lib.attrsets) mapAttrs mapAttrsToList;
inherit (lib.modules) mkIf;
inherit (lib.types)
submodule
@@ -22,10 +22,29 @@
uniq
functionTo
package
+ listOf
;
inherit (fleetLib.strings) decodeRawSecret;
sysConfig = config;
+ secretPartDataType = submodule {
+ options = {
+ raw = mkOption {
+ type = str;
+ internal = true;
+ description = "Encoded & Encrypted secret part data, passed from fleet.nix";
+ };
+ };
+ };
+ secretDataType = submodule {
+ freeformType = lazyAttrsOf secretPartDataType;
+ options = {
+ shared = mkOption {
+ description = "Is this secret owned by this machine, or propagated from shared secrets";
+ default = false;
+ };
+ };
+ };
secretPartType =
secretName:
submodule (
@@ -35,11 +54,6 @@
in
{
options = {
- raw = mkOption {
- type = str;
- internal = true;
- description = "Encoded & Encrypted secret part data, passed from fleet.nix";
- };
hash = mkOption {
type = str;
description = "Hash of secret in encoded format";
@@ -50,34 +64,50 @@
};
stablePath = mkOption {
type = str;
- description = "Path to secret part, incorporating data hash (thus it will be updated on secret change)";
+ description = "Path to secret part, stable path (users are expected to watch for file changes/re-read secret on demand)";
};
data = mkOption {
type = str;
description = "Secret public data (only available for plaintext)";
};
};
- config = {
- hash = hashString "sha1" config.raw;
- data = decodeRawSecret config.raw;
- path = "/run/secrets/${secretName}/${config.hash}-${partName}";
- stablePath = "/run/secrets/${secretName}/${partName}";
- };
+ config =
+ let
+ raw = sysConfig.data.secrets.${secretName}.${partName}.raw;
+ in
+ {
+ hash = hashString "sha1" raw;
+ data = decodeRawSecret raw;
+ path = "/run/secrets/${secretName}/${config.hash}-${partName}";
+ stablePath = "/run/secrets/${secretName}/${partName}";
+ };
}
);
secretType = submodule (
- { config, ... }:
+ {
+ config,
+ loc,
+ options,
+ ...
+ }:
let
- secretName = config._module.args.name;
+ secretName =
+ # Due to config definition for freeformType, we can't just use _module.args due to infinite recursion, instead
+ # extract the secret name the ugly way...
+ let
+ saLoc = options._module.specialArgs.loc;
+ comp = elemAt saLoc;
+ in
+ assert
+ (length saLoc == 2 ||
+ length saLoc == 4 &&
+ comp 0 == "secrets" && comp 2 == "_module" && comp 3 == "specialArgs") ||
+ throw "Unexpected module structure ${toJSON saLoc}";
+ if length saLoc == 2 then "documentation generator stub" else comp 1;
in
{
freeformType = lazyAttrsOf (secretPartType secretName);
options = {
- shared = mkOption {
- description = "Is this secret owned by this machine, or propagated from shared secrets";
- default = false;
- };
-
generator = mkOption {
type = uniq (nullOr (functionTo package));
description = "Derivation to evaluate for secret generation";
@@ -104,18 +134,30 @@
description = "Data that gets embedded into secret part";
default = null;
};
+ expectedPrivateParts = mkOption {
+ type = listOf str;
+ default = [ ];
+ description = "List of parts that are expected to be encrypted";
+ };
+ expectedPublicParts = mkOption {
+ type = listOf str;
+ default = [ ];
+ description = "List of parts that are expected to be public";
+ };
};
+ config = mapAttrs (_: _: { }) (removeAttrs (sysConfig.data.secrets.${secretName} or {}) [ "shared" ]);
}
);
- processPart = part: {
- inherit (part) raw path stablePath;
+ processPart = secretName: partName: part: {
+ inherit (part) path stablePath;
+ raw = config.data.secrets.${secretName}.${partName}.raw;
};
processSecret =
- secret:
+ secretName: secret:
{
inherit (secret) group mode owner;
}
- // (mapAttrs (_: processPart) (
+ // (mapAttrs (processPart secretName) (
removeAttrs secret [
"shared"
"generator"
@@ -123,11 +165,14 @@
"group"
"owner"
"expectedGenerationData"
+ "expectedPrivateParts"
+ "expectedPublicParts"
]
));
+ secretsData = (mapAttrs (processSecret) config.secrets);
secretsFile = pkgs.writeTextFile {
name = "secrets.json";
- text = builtins.toJSON (mapAttrs (_: processSecret) config.secrets);
+ text = toJSON secretsData;
};
useSysusers =
(config.systemd ? sysusers && config.systemd.sysusers.enable)
@@ -135,15 +180,38 @@
in
{
options = {
+ data.secrets = mkOption {
+ type = attrsOf secretDataType;
+ default = { };
+ description = "Host-local secret data";
+ };
secrets = mkOption {
type = attrsOf secretType;
default = { };
description = "Host-local secrets";
};
+ system.secretsData = mkOption {
+ type = unspecified;
+ default = {};
+ description = "secrets.json contents";
+ };
};
config = {
+ system = {inherit secretsData;};
environment.systemPackages = [ pkgs.fleet-install-secrets ];
+ warnings = filter (v: v!=null) (mapAttrsToList (
+ name: secret:
+ if
+ secret.expectedPrivateParts == [ ]
+ && secret.expectedPublicParts == [ ]
+ && !(config.data.secrets.${name} or { shared = false; }).shared
+ then
+ "Secret ${name} has no expected parts defined, this is deprecated for better visibility"
+ else
+ null
+ ) config.secrets);
+
systemd.services.fleet-install-secrets = mkIf useSysusers {
wantedBy = [ "sysinit.target" ];
after = [ "systemd-sysusers.service" ];
modules/secrets-data.nixdiffbeforeafterboth--- a/modules/secrets-data.nix
+++ b/modules/secrets-data.nix
@@ -151,8 +151,9 @@
toJSON (config.data.sharedSecrets.${name} or { owners = [ ]; }).owners
}. Run fleet secrets regenerate to fix";
}) config.sharedSecrets)
+
++ (mapAttrsToList (name: secret: {
- # TODO: Same aassertion should be in host secrets
+ # TODO: Same assertion should be in host secrets
assertion =
(config.data.sharedSecrets.${name} or { generationData = null; }).generationData
== secret.expectedGenerationData;
@@ -160,6 +161,5 @@
toJSON (config.data.sharedSecrets.${name} or { generationData = null; }).generationData
}. Run fleet secrets regenerate to fix";
}) config.sharedSecrets);
- sharedSecrets = mapAttrs (_: _: { }) config.data.sharedSecrets;
};
}
modules/secrets.nixdiffbeforeafterboth--- a/modules/secrets.nix
+++ b/modules/secrets.nix
@@ -69,6 +69,16 @@
description = "Contextual metadata embedded within the secret part value";
default = null;
};
+ expectedPrivateParts = mkOption {
+ type = listOf str;
+ default = [ ];
+ description = "List of parts that are expected to be encrypted";
+ };
+ expectedPublicParts = mkOption {
+ type = listOf str;
+ default = [ ];
+ description = "List of parts that are expected to be public";
+ };
};
};
in
@@ -81,16 +91,25 @@
};
};
config = {
- hosts = mapAttrs (_: secretMap: {
- nixos.secrets = mapAttrs (
- _: s:
- removeAttrs s [
- "createdAt"
- "expiresAt"
- "generationData"
- ]
- ) secretMap;
- }) config.data.hostSecrets;
+ hosts = mapAttrs (
+ _: secretMap:
+ let
+ partsOf =
+ s:
+ removeAttrs s [
+ "createdAt"
+ "expiresAt"
+ "generationData"
+ ];
+
+ in
+ {
+ nixos.data.secrets = mapAttrs (_: s: partsOf s) secretMap;
+ # nixos.secrets = mapAttrs (
+ # _: s: mapAttrs (_: _: {}) (partsOf s)
+ # ) secretMap;
+ }
+ ) config.data.hostSecrets;
nixpkgs.overlays = [
(final: prev: {
mkSecretGenerators =