From 12f2d6e6afb3471da29d32017e0148e9ee5f7679 Mon Sep 17 00:00:00 2001 From: jasonwitty Date: Fri, 28 Nov 2025 14:43:49 -0800 Subject: [PATCH] - modernize packages and rust edition. - increase timeout for rollout - increment cargo version --- .gitea/workflows/build-and-deploy.yaml | 4 +- .gitignore | 1 + Cargo.lock | 3104 +++++++++++------------- Cargo.toml | 45 +- README.md | 222 +- build.rs | 54 + src/event.rs | 53 +- src/lib.rs | 345 +-- src/server.rs | 82 +- src/terminado.rs | 2 +- templates/term.html | 12 +- 11 files changed, 1999 insertions(+), 1925 deletions(-) create mode 100644 build.rs diff --git a/.gitea/workflows/build-and-deploy.yaml b/.gitea/workflows/build-and-deploy.yaml index aedcc1d..9438d84 100644 --- a/.gitea/workflows/build-and-deploy.yaml +++ b/.gitea/workflows/build-and-deploy.yaml @@ -62,7 +62,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v4gt.wittyoneoff.com/jason/socktop-webterm:0.2.2 - name: Install kubectl run: | @@ -111,7 +111,7 @@ jobs: - name: Wait for rollout to complete run: | - kubectl rollout status deployment/socktop-webterm -n socktop --timeout=5m + kubectl rollout status deployment/socktop-webterm -n socktop --timeout=30m - name: Verify deployment run: | diff --git a/.gitignore b/.gitignore index c4856fa..ea16ed7 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,4 @@ scripts/docker-quickstart.sh scripts/publish-to-gitea-multiarch.sh scripts/publish-to-gitea.sh scripts/verify_upgrade.sh +scripts/check-setup.sh diff --git a/Cargo.lock b/Cargo.lock index eb1b164..9c3da68 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,522 +4,431 @@ version = 4 [[package]] name = "actix" -version = "0.8.3" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671ce3d27313f236827a5dd153a1073ad03ef31fc77f562020263e7830cf1ef7" +checksum = "de7fa236829ba0841304542f7614c42b80fca007455315c45c785ccfa873a85b" dependencies = [ - "actix-http", + "actix-macros", "actix-rt", "actix_derive", - "bitflags", + "bitflags 2.10.0", "bytes", "crossbeam-channel", - "derive_more 0.14.1", - "futures", - "hashbrown 0.3.1", - "lazy_static", + "futures-core", + "futures-sink", + "futures-task", + "futures-util", "log", - "parking_lot 0.8.0", + "once_cell", + "parking_lot", + "pin-project-lite", "smallvec", - "tokio-codec", - "tokio-executor", - "tokio-io", - "tokio-tcp", - "tokio-timer", - "trust-dns-resolver", + "tokio", + "tokio-util", ] [[package]] name = "actix-codec" -version = "0.1.2" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2c11af4b06dc935d8e1b1491dad56bfb32febc49096a91e773f8535c176453" +checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ + "bitflags 2.10.0", "bytes", - "futures", - "log", - "tokio-codec", - "tokio-io", -] - -[[package]] -name = "actix-connect" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fade9bd4bb46bacde89f1e726c7a3dd230536092712f5d94d77ca57c087fca0" -dependencies = [ - "actix-codec", - "actix-rt", - "actix-service", - "actix-utils", - "derive_more 0.15.0", - "either", - "futures", - "http", - "log", - "tokio-current-thread", - "tokio-tcp", - "trust-dns-resolver", + "futures-core", + "futures-sink", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", + "tracing", ] [[package]] name = "actix-files" -version = "0.1.6" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "095a533b67977f96ab0ff0ae37e75208607abdcc22983b314ddac06651165ec5" +checksum = "4009a8beb4dc78a58286ac9d58969ee0a8acecb7912d5ce898b4da4335579341" dependencies = [ "actix-http", "actix-service", + "actix-utils", "actix-web", - "bitflags", + "bitflags 2.10.0", "bytes", - "derive_more 0.15.0", - "futures", + "derive_more", + "futures-core", + "http-range", "log", "mime", "mime_guess", - "percent-encoding 2.1.0", + "percent-encoding", + "pin-project-lite", "v_htmlescape", ] [[package]] name = "actix-http" -version = "0.2.10" +version = "3.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf758ebbc4abfecbdc1ce7408601b2d7e0cd7e4766ef61183cd8ce16c194d64" +checksum = "7926860314cbe2fb5d1f13731e387ab43bd32bca224e82e6e2db85de0a3dba49" dependencies = [ "actix-codec", - "actix-connect", - "actix-server-config", + "actix-rt", "actix-service", - "actix-threadpool", "actix-utils", "base64", - "bitflags", - "brotli2", + "bitflags 2.10.0", + "brotli", "bytes", - "chrono", - "copyless", - "derive_more 0.15.0", - "either", + "bytestring", + "derive_more", "encoding_rs", - "failure", "flate2", - "futures", + "foldhash", + "futures-core", "h2", - "hashbrown 0.5.0", "http", "httparse", - "indexmap", + "httpdate", + "itoa", "language-tags", - "lazy_static", - "log", + "local-channel", "mime", - "percent-encoding 2.1.0", - "rand 0.7.2", - "regex", - "serde", - "serde_json", - "serde_urlencoded", + "percent-encoding", + "pin-project-lite", + "rand", "sha1", - "slab", - "time", - "tokio-current-thread", - "tokio-tcp", - "tokio-timer", - "trust-dns-resolver", + "smallvec", + "tokio", + "tokio-util", + "tracing", + "zstd", +] + +[[package]] +name = "actix-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" +dependencies = [ + "quote", + "syn", ] [[package]] name = "actix-router" -version = "0.1.5" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23224bb527e204261d0291102cb9b52713084def67d94f7874923baefe04ccf7" +checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" dependencies = [ - "bytes", + "bytestring", + "cfg-if 1.0.4", "http", - "log", "regex", + "regex-lite", "serde", - "string", + "tracing", ] [[package]] name = "actix-rt" -version = "0.2.5" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168620aaf00fcd2a16e621790abaf180ef7377c2f8355b4ca5775d6afc778ed8" +checksum = "92589714878ca59a7626ea19734f0e07a6a875197eec751bb5d3f99e64998c63" dependencies = [ - "actix-threadpool", - "copyless", - "futures", - "tokio-current-thread", - "tokio-executor", - "tokio-reactor", - "tokio-timer", + "actix-macros", + "futures-core", + "tokio", ] [[package]] name = "actix-server" -version = "0.6.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd626534af8d0a738e5f74901fe603af0445708f91b86a7d763d80df10d562a5" +checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" dependencies = [ "actix-rt", - "actix-server-config", "actix-service", - "futures", - "log", + "actix-utils", + "futures-core", + "futures-util", "mio", - "net2", - "num_cpus", - "slab", - "tokio-io", - "tokio-reactor", - "tokio-signal", - "tokio-tcp", - "tokio-timer", -] - -[[package]] -name = "actix-server-config" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483a34989c682d93142bacad6300375bb6ad8002d2e0bb249dbad86128b9ff30" -dependencies = [ - "futures", - "tokio-io", - "tokio-tcp", + "socket2 0.5.10", + "tokio", + "tracing", ] [[package]] name = "actix-service" -version = "0.4.2" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca5b48e928841ff7e7dce1fdb5b0d4582f6b1b976e08f4bac3f640643e0773f" +checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f" dependencies = [ - "futures", -] - -[[package]] -name = "actix-testing" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af001e97ac6750994824d400a1b7087055aab14317aa012f528d0b2b363f37f1" -dependencies = [ - "actix-rt", - "actix-server", - "actix-server-config", - "actix-service", - "futures", - "log", - "net2", - "tokio-reactor", - "tokio-tcp", -] - -[[package]] -name = "actix-threadpool" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b5ae85d13da7e6fb86b1b7bc83185e0e3bd4cc5f421c887e1803796c034d35d" -dependencies = [ - "derive_more 0.15.0", - "futures", - "lazy_static", - "log", - "num_cpus", - "parking_lot 0.9.0", - "threadpool", + "futures-core", + "pin-project-lite", ] [[package]] name = "actix-utils" -version = "0.4.5" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea501068a0173533704be321f149853f702d9e3c3ce9d57e7a96d94b1ab5aca" +checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" dependencies = [ - "actix-codec", - "actix-service", - "bytes", - "either", - "futures", - "log", - "tokio-current-thread", - "tokio-timer", + "local-waker", + "pin-project-lite", ] [[package]] name = "actix-web" -version = "1.0.8" +version = "4.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36e59485f007a4be3df228791ff6c4aedcbe7bb09bd9225c3554f538aca4a584" +checksum = "1654a77ba142e37f049637a3e5685f864514af11fcbc51cb51eb6596afe5b8d6" dependencies = [ "actix-codec", "actix-http", + "actix-macros", "actix-router", "actix-rt", "actix-server", - "actix-server-config", "actix-service", - "actix-testing", - "actix-threadpool", "actix-utils", "actix-web-codegen", - "awc", "bytes", - "derive_more 0.15.0", + "bytestring", + "cfg-if 1.0.4", + "cookie", + "derive_more", "encoding_rs", - "futures", - "hashbrown 0.5.0", + "foldhash", + "futures-core", + "futures-util", + "impl-more", + "itoa", + "language-tags", "log", "mime", - "net2", - "parking_lot 0.9.0", + "once_cell", + "pin-project-lite", "regex", + "regex-lite", "serde", "serde_json", "serde_urlencoded", + "smallvec", + "socket2 0.6.1", "time", - "url 2.1.0", + "tracing", + "url", ] [[package]] name = "actix-web-actors" -version = "1.0.2" +version = "4.3.1+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008c1b686048a16fef4ef2fc6b6e5fcf5f29829891ad87fc0848ade26b285627" +checksum = "f98c5300b38fd004fe7d2a964f9a90813fdbe8a81fed500587e78b1b71c6f980" dependencies = [ "actix", "actix-codec", "actix-http", "actix-web", "bytes", - "futures", + "bytestring", + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", ] [[package]] name = "actix-web-codegen" -version = "0.1.2" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fe9e3cdec1e645b675f354766e0688c5705021c85ab3cf739be1c8999b91c76" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" dependencies = [ - "quote 0.6.12", - "syn 0.15.34", + "actix-router", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "actix_derive" -version = "0.4.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf5f6d7bf2d220ae8b4a7ae02a572bb35b7c4806b24049af905ab8110de156c" +checksum = "b6ac1e58cded18cb28ddc17143c4dea5345b3ad575e14f32f66e4054a56eb271" dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.12", - "syn 0.15.34", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "adler32" -version = "1.0.3" +name = "adler2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" -version = "0.7.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f484ae0c99fec2e858eb6134949117399f222608d84cadb3f58c1f97c2364c" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] [[package]] -name = "ansi_term" -version = "0.11.0" +name = "alloc-no-stdlib" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" dependencies = [ - "winapi 0.3.7", + "alloc-no-stdlib", ] [[package]] -name = "arc-swap" -version = "0.3.11" +name = "anstream" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc4662175ead9cd84451d5c35070517777949a2ed84551764129cedb88384841" - -[[package]] -name = "arrayvec" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92c7fb76bc8826a8b33b4ee5bb07a247a81e76764ab4d55e8f73e3a4d8808c71" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ - "nodrop", + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", ] [[package]] -name = "atty" -version = "0.2.11" +name = "anstyle" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ - "libc", - "termion", - "winapi 0.3.7", + "utf8parse", ] +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + [[package]] name = "autocfg" -version = "0.1.4" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" - -[[package]] -name = "awc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "364537de6ac9f996780f9dd097d6c4ca7c91dd5735153e9fb545037479becd10" -dependencies = [ - "actix-codec", - "actix-http", - "actix-service", - "base64", - "bytes", - "derive_more 0.15.0", - "futures", - "log", - "mime", - "percent-encoding 2.1.0", - "rand 0.7.2", - "serde", - "serde_json", - "serde_urlencoded", - "tokio-timer", -] - -[[package]] -name = "backtrace" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ada4c783bb7e7443c14e0480f429ae2cc99da95065aeab7ee1b81ada0419404f" -dependencies = [ - "autocfg", - "backtrace-sys", - "cfg-if 0.1.9", - "libc", - "rustc-demangle", -] - -[[package]] -name = "backtrace-sys" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "797c830ac25ccc92a7f8a7b9862bde440715531514594a6154e3d4a54dd769b6" -dependencies = [ - "cc", - "libc", -] +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "base64" -version = "0.10.1" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" -dependencies = [ - "byteorder", -] +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "1.0.4" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "block-buffer" -version = "0.7.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "block-padding", - "byte-tools", - "byteorder", "generic-array", ] [[package]] -name = "block-padding" -version = "0.1.4" +name = "brotli" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ - "byte-tools", + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", ] [[package]] -name = "brotli-sys" -version = "0.3.2" +name = "brotli-decompressor" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4445dea95f4c2b41cde57cc9fee236ae4dbae88d8fcbdb4750fc1bb5d86aaecd" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" dependencies = [ - "cc", - "libc", + "alloc-no-stdlib", + "alloc-stdlib", ] -[[package]] -name = "brotli2" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb036c3eade309815c15ddbacec5b22c4d1f3983a774ab2eac2e3e9ea85568e" -dependencies = [ - "brotli-sys", - "libc", -] - -[[package]] -name = "build_const" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - -[[package]] -name = "byteorder" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" - [[package]] name = "bytes" -version = "0.4.12" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" -dependencies = [ - "byteorder", - "iovec", -] +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] -name = "c2-chacha" -version = "0.2.2" +name = "bytestring" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d64d04786e0f528460fc884753cf8dddcc466be308f6026f8e355c41a0e4101" +checksum = "113b4343b5f6617e7ad401ced8de3cc8b012e73a594347c307b90db3e9271289" dependencies = [ - "lazy_static", - "ppv-lite86", + "bytes", ] [[package]] name = "cc" -version = "1.0.37" +version = "1.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" +checksum = "c481bdbf0ed3b892f6f806287d72acd515b352a4ec27a208489b8c1bc839633a" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] [[package]] name = "cfg-if" @@ -533,54 +442,70 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "chrono" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" -dependencies = [ - "num-integer", - "num-traits", - "time", -] - [[package]] name = "clap" -version = "2.33.0" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ - "ansi_term", - "atty", - "bitflags", + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", "strsim", - "textwrap", - "unicode-width", - "vec_map", ] [[package]] -name = "cloudabi" -version = "0.0.3" +name = "clap_derive" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ - "bitflags", + "heck", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "copyless" -version = "0.1.4" +name = "clap_lex" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff9c56c9fb2a49c05ef0e431485a22400af20d33226dc0764d891d09e724127" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] -name = "crc" -version = "1.8.1" +name = "colorchoice" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "cookie" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" dependencies = [ - "build_const", + "percent-encoding", + "time", + "version_check 0.9.5", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", ] [[package]] @@ -594,103 +519,151 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.3.8" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0ed1a4de2235cabda8558ff5840bffb97fcb64c97827f354a451307df5f72b" -dependencies = [ - "crossbeam-utils", - "smallvec", -] - -[[package]] -name = "crossbeam-deque" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04c9e3102cc2d69cd681412141b390abd55a362afc1540965dad0ad4d34280b4" -dependencies = [ - "arrayvec", - "cfg-if 0.1.9", - "crossbeam-utils", - "lazy_static", - "memoffset", - "scopeguard 0.3.3", -] - -[[package]] -name = "crossbeam-queue" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.6.5" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8306fcef4a7b563b76b7dd949ca48f52bc1141aa067d2ea09565f3e2652aa5c" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ - "cfg-if 0.1.9", - "lazy_static", + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn", ] [[package]] name = "derive_more" -version = "0.14.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d944ac6003ed268757ef1ee686753b57efc5fcf0ebe7b64c9fc81e7e32ff839" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.12", - "rustc_version", - "syn 0.15.34", + "derive_more-impl", ] [[package]] -name = "derive_more" -version = "0.15.0" +name = "derive_more-impl" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a141330240c921ec6d074a3e188a7c7ef95668bb95e7d44fa0e5778ec2a7afe" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ - "lazy_static", - "proc-macro2 0.4.30", - "quote 0.6.12", - "regex", - "rustc_version", - "syn 0.15.34", + "proc-macro2", + "quote", + "syn", + "unicode-xid", ] [[package]] name = "digest" -version = "0.8.1" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "generic-array", + "block-buffer", + "crypto-common", ] [[package]] -name = "dtoa" -version = "0.4.4" +name = "displaydoc" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] -name = "either" -version = "1.5.3" +name = "downcast-rs" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "encoding_rs" @@ -702,196 +675,245 @@ dependencies = [ ] [[package]] -name = "enum-as-inner" -version = "0.2.1" +name = "env_filter" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d58266c97445680766be408285e798d3401c6d4c378ec5552e78737e681e37d" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.12", - "syn 0.15.34", + "log", + "regex", ] [[package]] name = "env_logger" -version = "0.6.2" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" dependencies = [ - "atty", - "humantime", + "anstream", + "anstyle", + "env_filter", + "jiff", "log", - "regex", - "termcolor", ] [[package]] -name = "failure" +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "filedescriptor" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" +dependencies = [ + "libc", + "thiserror 1.0.69", + "winapi", +] + +[[package]] +name = "find-msvc-tools" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" -dependencies = [ - "backtrace", - "failure_derive", -] - -[[package]] -name = "failure_derive" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea1063915fd7ef4309e222a5a07cf9c319fb9c7836b1f89b85458672dbb127e1" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.12", - "syn 0.15.34", - "synstructure", -] - -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" [[package]] name = "flate2" -version = "1.0.7" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87e68aa82b2de08a6e037f1385455759df6e445a8df5e005b4297191dbf18aa" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", - "libc", - "miniz-sys", - "miniz_oxide_c_api", + "miniz_oxide", ] [[package]] name = "fnv" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "fuchsia-cprng" -version = "0.1.1" +name = "foldhash" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] -name = "fuchsia-zircon" -version = "0.3.3" +name = "form_urlencoded" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ - "bitflags", - "fuchsia-zircon-sys", + "percent-encoding", ] [[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" +name = "futures" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] [[package]] -name = "futures" -version = "0.1.29" +name = "futures-channel" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] [[package]] name = "generic-array" -version = "0.12.3" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", + "version_check 0.9.5", ] [[package]] name = "getrandom" -version = "0.1.12" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473a1265acc8ff1e808cd0a1af8cee3c2ee5200916058a2ca113c29f2d903571" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ - "cfg-if 0.1.9", + "cfg-if 1.0.4", "libc", - "wasi", + "r-efi", + "wasip2", ] [[package]] name = "h2" -version = "0.1.23" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e42e3daed5a7e17b12a0c23b5b2fbff23a925a570938ebee4baca1a9a1a2240" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ - "byteorder", "bytes", "fnv", - "futures", + "futures-core", + "futures-sink", + "futures-util", "http", "indexmap", - "log", "slab", - "string", - "tokio-io", + "tokio", + "tokio-util", + "tracing", ] [[package]] name = "handlebars" -version = "2.0.2" +version = "6.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ef1ac30f2eaaa2b835fce73c57091cb6b9fc62b7eef285efbf980b0f20001b" +checksum = "759e2d5aea3287cb1190c8ec394f42866cb5bf74fcbf213f354e3c856ea26098" dependencies = [ - "hashbrown 0.5.0", + "derive_builder", "log", + "num-order", "pest", "pest_derive", - "quick-error", "serde", "serde_json", - "walkdir", + "thiserror 2.0.17", ] [[package]] name = "hashbrown" -version = "0.3.1" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29fba9abe4742d586dfd0c06ae4f7e73a1c2d86b856933509b269d82cdf06e18" - -[[package]] -name = "hashbrown" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1de41fb8dba9714efd92241565cdff73f78508c95697dd56787d3cba27e2353" -dependencies = [ - "serde", -] +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] name = "heck" -version = "0.3.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hostname" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21ceb46a83a85e824ef93669c8b390009623863b5c195d1ba747292c0c72f94e" -dependencies = [ - "libc", - "winutil", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "http" -version = "0.1.21" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -899,179 +921,272 @@ dependencies = [ ] [[package]] -name = "httparse" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" - -[[package]] -name = "humantime" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" -dependencies = [ - "quick-error", -] - -[[package]] -name = "idna" +name = "http-range" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", ] [[package]] -name = "idna" -version = "0.2.0" +name = "icu_locale_core" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-more" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" + [[package]] name = "indexmap" -version = "1.0.2" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown", +] [[package]] -name = "iovec" -version = "0.1.2" +name = "ioctl-rs" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" +checksum = "f7970510895cee30b3e9128319f2cefd4bde883a39f38baa279567ba3a7eb97d" dependencies = [ "libc", - "winapi 0.2.8", ] [[package]] -name = "ipconfig" -version = "0.2.1" +name = "is_terminal_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa79fa216fbe60834a9c0737d7fcd30425b32d1c58854663e24d4c4b328ed83f" -dependencies = [ - "socket2", - "widestring", - "winapi 0.3.7", - "winreg", -] +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itoa" -version = "0.4.4" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] -name = "kernel32-sys" -version = "0.2.2" +name = "jiff" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" dependencies = [ - "winapi 0.2.8", - "winapi-build", + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-static" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom", + "libc", ] [[package]] name = "language-tags" -version = "0.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.66" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] -name = "linked-hash-map" -version = "0.5.2" +name = "litemap" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] -name = "lock_api" +name = "local-channel" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" +checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" dependencies = [ - "owning_ref", - "scopeguard 0.3.3", + "futures-core", + "futures-sink", + "local-waker", ] [[package]] -name = "lock_api" -version = "0.2.0" +name = "local-waker" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed946d4529956a20f2d63ebe1b69996d5a2137c91913fe3ebbeff957f5bca7ff" -dependencies = [ - "scopeguard 1.0.0", -] +checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" [[package]] name = "lock_api" -version = "0.3.1" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8912e782533a93a167888781b836336a6ca5da6175c05944c86cf28c31104dc" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "scopeguard 1.0.0", + "scopeguard", ] [[package]] name = "log" -version = "0.4.8" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" -dependencies = [ - "cfg-if 0.1.9", -] - -[[package]] -name = "lru-cache" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "matches" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "memchr" -version = "2.2.0" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efc7bc57c883d4a4d6e3246905283d8dae951bb3bd32f49d6ef297f546e1c39" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memoffset" -version = "0.2.1" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] [[package]] name = "mime" @@ -1092,256 +1207,119 @@ dependencies = [ "unicase", ] -[[package]] -name = "miniz-sys" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9e3ae51cea1576ceba0dde3d484d30e6e5b86dee0b2d412fe3a16a15c98202" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "miniz_oxide" -version = "0.2.1" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c468f2369f07d651a5d0bb2c9079f8488a66d5466efe42d0c5c6466edcb7f71e" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ - "adler32", -] - -[[package]] -name = "miniz_oxide_c_api" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7fe927a42e3807ef71defb191dc87d4e24479b221e67015fe38ae2b7b447bab" -dependencies = [ - "cc", - "crc", - "libc", - "miniz_oxide", + "adler2", + "simd-adler32", ] [[package]] name = "mio" -version = "0.6.19" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ - "fuchsia-zircon", - "fuchsia-zircon-sys", - "iovec", - "kernel32-sys", "libc", "log", - "miow", - "net2", - "slab", - "winapi 0.2.8", + "wasi", + "windows-sys 0.61.2", ] [[package]] -name = "mio-uds" -version = "0.6.7" +name = "nix" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" -dependencies = [ - "iovec", - "libc", - "mio", -] - -[[package]] -name = "miow" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -dependencies = [ - "kernel32-sys", - "net2", - "winapi 0.2.8", - "ws2_32-sys", -] - -[[package]] -name = "net2" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" -dependencies = [ - "cfg-if 0.1.9", - "libc", - "winapi 0.3.7", -] - -[[package]] -name = "nodrop" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" - -[[package]] -name = "nom" -version = "4.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" -dependencies = [ - "memchr", - "version_check", -] - -[[package]] -name = "num-integer" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" +checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" dependencies = [ "autocfg", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" -dependencies = [ + "bitflags 1.3.2", + "cfg-if 1.0.4", "libc", + "memoffset", + "pin-utils", ] [[package]] -name = "numtoa" +name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] -name = "opaque-debug" -version = "0.2.3" +name = "num-modular" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" +checksum = "17bb261bf36fa7d83f4c294f834e91256769097b3cb505d44831e0a179ac647f" [[package]] -name = "owning_ref" -version = "0.4.0" +name = "num-order" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" +checksum = "537b596b97c40fcf8056d153049eb22f481c17ebce72a513ec9286e4986d1bb6" dependencies = [ - "stable_deref_trait", + "num-modular", ] [[package]] -name = "parking_lot" -version = "0.7.1" +name = "once_cell" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab41b4aed082705d1056416ae4468b6ea99d52599ecf3169b00088d43113e337" -dependencies = [ - "lock_api 0.1.5", - "parking_lot_core 0.4.0", -] +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "parking_lot" -version = "0.8.0" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7767817701cce701d5585b9c4db3cdd02086398322c1d7e8bf5094a96a2ce7" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ - "lock_api 0.2.0", - "parking_lot_core 0.5.0", - "rustc_version", -] - -[[package]] -name = "parking_lot" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" -dependencies = [ - "lock_api 0.3.1", - "parking_lot_core 0.6.2", - "rustc_version", + "lock_api", + "parking_lot_core", ] [[package]] name = "parking_lot_core" -version = "0.4.0" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ - "libc", - "rand 0.6.5", - "rustc_version", - "smallvec", - "winapi 0.3.7", -] - -[[package]] -name = "parking_lot_core" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb88cb1cb3790baa6776844f968fea3be44956cf184fa1be5a03341f5491278c" -dependencies = [ - "cfg-if 0.1.9", - "cloudabi", - "libc", - "rand 0.6.5", - "redox_syscall", - "rustc_version", - "smallvec", - "winapi 0.3.7", -] - -[[package]] -name = "parking_lot_core" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" -dependencies = [ - "cfg-if 0.1.9", - "cloudabi", + "cfg-if 1.0.4", "libc", "redox_syscall", - "rustc_version", "smallvec", - "winapi 0.3.7", + "windows-link", ] [[package]] name = "percent-encoding" -version = "1.0.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" - -[[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.1.2" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4fb201c5c22a55d8b24fef95f78be52738e5e1361129be1b5e862ecdb6894a" +checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" dependencies = [ + "memchr", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.1.0" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" +checksum = "51f72981ade67b1ca6adc26ec221be9f463f2b5839c7508998daa17c23d94d7f" dependencies = [ "pest", "pest_generator", @@ -1349,341 +1327,201 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.1.1" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b9fcf299b5712d06ee128a556c94709aaa04512c4dffb8ead07c5c998447fc0" +checksum = "dee9efd8cdb50d719a80088b76f81aec7c41ed6d522ee750178f83883d271625" dependencies = [ "pest", "pest_meta", - "proc-macro2 1.0.2", - "quote 1.0.2", - "syn 1.0.5", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "pest_meta" -version = "2.1.2" +version = "2.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df43fd99896fd72c485fe47542c7b500e4ac1e8700bf995544d1317a60ded547" +checksum = "bf1d70880e76bdc13ba52eafa6239ce793d85c8e43896507e43dd8984ff05b82" dependencies = [ - "maplit", "pest", - "sha-1", + "sha2", ] +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "portable-pty" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "806ee80c2a03dbe1a9fb9534f8d19e4c0546b790cde8fd1fea9d6390644cb0be" +dependencies = [ + "anyhow", + "bitflags 1.3.2", + "downcast-rs", + "filedescriptor", + "lazy_static", + "libc", + "log", + "nix", + "serial", + "shared_library", + "shell-words", + "winapi", + "winreg", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" -version = "0.2.5" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3cbf9f658cdb5000fcf6f362b8ea2ba154b9f146a61c7a20d647034c6b6561b" - -[[package]] -name = "pretty_env_logger" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "717ee476b1690853d222af4634056d830b5197ffd747726a9a1eee6da9f49074" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "chrono", - "env_logger", - "log", -] - -[[package]] -name = "proc-macro-error" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53c98547ceaea14eeb26fcadf51dc70d01a2479a7839170eae133721105e4428" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2 1.0.2", - "quote 1.0.2", - "rustversion", - "syn 1.0.5", -] - -[[package]] -name = "proc-macro-error-attr" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2bf5d493cf5d3e296beccfd61794e445e830dfc8070a9c248ad3ee071392c6c" -dependencies = [ - "proc-macro2 1.0.2", - "quote 1.0.2", - "rustversion", - "syn 1.0.5", - "syn-mid", + "zerocopy", ] [[package]] name = "proc-macro2" -version = "0.4.30" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ - "unicode-xid 0.1.0", -] - -[[package]] -name = "proc-macro2" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175a40b9cf564ce9bf050654633dbf339978706b8ead1a907bb970b63185dd95" -dependencies = [ - "unicode-xid 0.2.0", -] - -[[package]] -name = "quick-error" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" - -[[package]] -name = "quote" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db" -dependencies = [ - "proc-macro2 0.4.30", + "unicode-ident", ] [[package]] name = "quote" -version = "1.0.2" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ - "proc-macro2 1.0.2", + "proc-macro2", ] [[package]] -name = "rand" -version = "0.6.5" +name = "r-efi" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.0", - "rand_hc 0.1.0", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg", - "rand_xorshift", - "winapi 0.3.7", -] +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" -version = "0.7.2" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "getrandom", - "libc", - "rand_chacha 0.2.1", - "rand_core 0.5.1", - "rand_hc 0.2.0", + "rand_chacha", + "rand_core", ] [[package]] name = "rand_chacha" -version = "0.1.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ - "autocfg", - "rand_core 0.3.1", -] - -[[package]] -name = "rand_chacha" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" -dependencies = [ - "c2-chacha", - "rand_core 0.5.1", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" -version = "0.3.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.0", -] - -[[package]] -name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom", ] -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_jitter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -dependencies = [ - "libc", - "rand_core 0.4.0", - "winapi 0.3.7", -] - -[[package]] -name = "rand_os" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -dependencies = [ - "cloudabi", - "fuchsia-cprng", - "libc", - "rand_core 0.4.0", - "rdrand", - "winapi 0.3.7", -] - -[[package]] -name = "rand_pcg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -dependencies = [ - "autocfg", - "rand_core 0.4.0", -] - -[[package]] -name = "rand_xorshift" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", -] - [[package]] name = "redox_syscall" -version = "0.1.54" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252" - -[[package]] -name = "redox_termios" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "redox_syscall", + "bitflags 2.10.0", ] [[package]] name = "regex" -version = "1.1.6" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f0a0bcab2fd7d1d7c54fa9eae6f43eddeb9ce2e7352f8518a814a4f65d60c58" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", "regex-syntax", - "thread_local", - "utf8-ranges", ] +[[package]] +name = "regex-lite" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" + [[package]] name = "regex-syntax" -version = "0.6.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" -dependencies = [ - "ucd-util", -] - -[[package]] -name = "resolv-conf" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b263b4aa1b5de9ffc0054a2386f96992058bb6870aab516f8cdeb8a667d56dcb" -dependencies = [ - "hostname", - "quick-error", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af" - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - -[[package]] -name = "rustversion" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c48f91977f4ef3be5358c15d131d3f663f6b4d7a112555bf3bf52ad23b6659e5" -dependencies = [ - "proc-macro2 1.0.2", - "quote 1.0.2", - "syn 1.0.5", -] +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "ryu" @@ -1691,123 +1529,168 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c92464b447c0ee8c4fb3824ecc8383b81717b9f1e74ba2e72540aef7b9f82997" -[[package]] -name = "same-file" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585e8ddcedc187886a30fa705c47985c3fa88d06624095856b36ca0b82ff4421" -dependencies = [ - "winapi-util", -] - [[package]] name = "scopeguard" -version = "0.3.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" - -[[package]] -name = "scopeguard" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.104" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.104" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ - "proc-macro2 1.0.2", - "quote 1.0.2", - "syn 1.0.5", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "serde_json" -version = "1.0.44" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c575e0cc52bdd09b47f330f646cf59afc586e9c4e3ccd6fc1f625b8ea1dad7" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", "itoa", "ryu", "serde", ] [[package]] -name = "serde_urlencoded" -version = "0.6.1" +name = "serial" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" +checksum = "a1237a96570fc377c13baa1b88c7589ab66edced652e43ffb17088f003db3e86" dependencies = [ - "dtoa", - "itoa", - "serde", - "url 2.1.0", + "serial-core", + "serial-unix", + "serial-windows", ] [[package]] -name = "sha-1" -version = "0.8.1" +name = "serial-core" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" +checksum = "3f46209b345401737ae2125fe5b19a77acce90cd53e1658cda928e4fe9a64581" dependencies = [ - "block-buffer", - "digest", - "fake-simd", - "opaque-debug", + "libc", +] + +[[package]] +name = "serial-unix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f03fbca4c9d866e24a459cbca71283f545a37f8e3e002ad8c70593871453cab7" +dependencies = [ + "ioctl-rs", + "libc", + "serial-core", + "termios", +] + +[[package]] +name = "serial-windows" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15c6d3b776267a75d31bbdfd5d36c0ca051251caafc285827052bc53bcdc8162" +dependencies = [ + "libc", + "serial-core", ] [[package]] name = "sha1" -version = "0.6.0" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if 1.0.4", + "cpufeatures", + "digest", +] [[package]] -name = "signal-hook" +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if 1.0.4", + "cpufeatures", + "digest", +] + +[[package]] +name = "shared_library" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ab58f1fda436857e6337dcb6a5aaa34f16c5ddc87b3a8b6ef7a212f90b9c5a" +checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" dependencies = [ + "lazy_static", "libc", - "signal-hook-registry", ] +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" -version = "1.0.1" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cded4ffa32146722ec54ab1f16320568465aa922aa9ab4708129599740da85d7" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" dependencies = [ - "arc-swap", "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "slab" version = "0.4.2" @@ -1816,444 +1699,238 @@ checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" [[package]] name = "smallvec" -version = "0.6.10" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab606a9c5e214920bb66c458cd7be8ef094f813f20fe77a54cc7dbfff220d4b7" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.3.19" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ - "cfg-if 1.0.4", "libc", - "winapi 0.3.7", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", ] [[package]] name = "stable_deref_trait" -version = "1.1.1" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" - -[[package]] -name = "string" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0bbfb8937e38e34c3444ff00afb28b0811d9554f15c5ad64d12b0308d1d1995" -dependencies = [ - "bytes", -] +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "strsim" -version = "0.8.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "structopt" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884ae79d6aad1e738f4a70dff314203fd498490a63ebc4d03ea83323c40b7b72" -dependencies = [ - "clap", - "structopt-derive", -] - -[[package]] -name = "structopt-derive" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a97f829a34a0a9d5b353a881025a23b8c9fd09d46be6045df6b22920dbd7a93" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2 1.0.2", - "quote 1.0.2", - "syn 1.0.5", -] +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "0.15.34" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.12", - "unicode-xid 0.1.0", -] - -[[package]] -name = "syn" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf" -dependencies = [ - "proc-macro2 1.0.2", - "quote 1.0.2", - "unicode-xid 0.2.0", -] - -[[package]] -name = "syn-mid" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fd3937748a7eccff61ba5b90af1a20dbf610858923a9192ea0ecb0cb77db1d0" -dependencies = [ - "proc-macro2 1.0.2", - "quote 1.0.2", - "syn 1.0.5", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] name = "synstructure" -version = "0.10.2" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.12", - "syn 0.15.34", - "unicode-xid 0.1.0", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "termcolor" -version = "1.0.5" +name = "termios" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e" -dependencies = [ - "wincolor", -] - -[[package]] -name = "termion" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea" +checksum = "d5d9cf598a6d7ce700a4e6a9199da127e6819a61e64b68609683cc9a01b5683a" dependencies = [ "libc", - "numtoa", - "redox_syscall", - "redox_termios", ] [[package]] -name = "textwrap" -version = "0.11.0" +name = "thiserror" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "unicode-width", + "thiserror-impl 1.0.69", ] [[package]] -name = "thread_local" -version = "0.3.6" +name = "thiserror" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "lazy_static", + "thiserror-impl 2.0.17", ] [[package]] -name = "threadpool" -version = "1.7.1" +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "num_cpus", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] name = "time" -version = "0.1.42" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ - "libc", - "redox_syscall", - "winapi 0.3.7", + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "time-macros" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", ] [[package]] name = "tokio" -version = "0.1.22" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ "bytes", - "futures", - "mio", - "num_cpus", - "tokio-codec", - "tokio-current-thread", - "tokio-executor", - "tokio-fs", - "tokio-io", - "tokio-reactor", - "tokio-sync", - "tokio-tcp", - "tokio-threadpool", - "tokio-timer", - "tokio-udp", - "tokio-uds", -] - -[[package]] -name = "tokio-codec" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" -dependencies = [ - "bytes", - "futures", - "tokio-io", -] - -[[package]] -name = "tokio-current-thread" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" -dependencies = [ - "futures", - "tokio-executor", -] - -[[package]] -name = "tokio-executor" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ea44c6c0773cc034771693711c35c677b4b5a4b21b9e7071704c54de7d555e" -dependencies = [ - "crossbeam-utils", - "futures", -] - -[[package]] -name = "tokio-fs" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" -dependencies = [ - "futures", - "tokio-io", - "tokio-threadpool", -] - -[[package]] -name = "tokio-io" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" -dependencies = [ - "bytes", - "futures", - "log", -] - -[[package]] -name = "tokio-pty-process" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e3193b62e8c2277534e195d8f8ec4cb43d28a92f89494dd755686026795175" -dependencies = [ - "bytes", - "futures", "libc", "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2 0.6.1", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-util" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", "tokio", - "tokio-io", - "tokio-signal", ] [[package]] -name = "tokio-reactor" -version = "0.1.9" +name = "tracing" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6af16bfac7e112bea8b0442542161bfc41cbfa4466b580bdda7d18cb88b911ce" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" dependencies = [ - "crossbeam-utils", - "futures", - "lazy_static", "log", - "mio", - "num_cpus", - "parking_lot 0.7.1", - "slab", - "tokio-executor", - "tokio-io", - "tokio-sync", + "pin-project-lite", + "tracing-attributes", + "tracing-core", ] [[package]] -name = "tokio-signal" -version = "0.2.7" +name = "tracing-attributes" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6dc5276ea05ce379a16de90083ec80836440d5ef8a6a39545a3207373b8296" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ - "futures", - "libc", - "mio", - "mio-uds", - "signal-hook", - "tokio-executor", - "tokio-io", - "tokio-reactor", - "winapi 0.3.7", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "tokio-sync" -version = "0.1.5" +name = "tracing-core" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b2f843ffdf8d6e1f90bddd48da43f99ab071660cd92b7ec560ef3cdfd7a409a" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" dependencies = [ - "fnv", - "futures", -] - -[[package]] -name = "tokio-tcp" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" -dependencies = [ - "bytes", - "futures", - "iovec", - "mio", - "tokio-io", - "tokio-reactor", -] - -[[package]] -name = "tokio-threadpool" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2" -dependencies = [ - "crossbeam-deque", - "crossbeam-queue", - "crossbeam-utils", - "futures", - "log", - "num_cpus", - "rand 0.6.5", - "slab", - "tokio-executor", -] - -[[package]] -name = "tokio-timer" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" -dependencies = [ - "crossbeam-utils", - "futures", - "slab", - "tokio-executor", -] - -[[package]] -name = "tokio-udp" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" -dependencies = [ - "bytes", - "futures", - "log", - "mio", - "tokio-codec", - "tokio-io", - "tokio-reactor", -] - -[[package]] -name = "tokio-uds" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" -dependencies = [ - "bytes", - "futures", - "iovec", - "libc", - "log", - "mio", - "mio-uds", - "tokio-codec", - "tokio-io", - "tokio-reactor", -] - -[[package]] -name = "trust-dns-proto" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5559ebdf6c2368ddd11e20b11d6bbaf9e46deb803acd7815e93f5a7b4a6d2901" -dependencies = [ - "byteorder", - "enum-as-inner", - "failure", - "futures", - "idna 0.1.5", - "lazy_static", - "log", - "rand 0.6.5", - "smallvec", - "socket2", - "tokio-executor", - "tokio-io", - "tokio-reactor", - "tokio-tcp", - "tokio-timer", - "tokio-udp", - "url 1.7.2", -] - -[[package]] -name = "trust-dns-resolver" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c9992e58dba365798803c0b91018ff6c8d3fc77e06977c4539af2a6bfe0a039" -dependencies = [ - "cfg-if 0.1.9", - "failure", - "futures", - "ipconfig", - "lazy_static", - "log", - "lru-cache", - "resolv-conf", - "smallvec", - "tokio-executor", - "trust-dns-proto", + "once_cell", ] [[package]] name = "typenum" -version = "1.11.2" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "ucd-trie" -version = "0.1.2" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f00ed7be0c1ff1e24f46c3d2af4859f7e863672ba3a6e92e7cff702bf9f06c2" - -[[package]] -name = "ucd-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "unicase" @@ -2261,115 +1938,50 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a84e5511b2a947f3ae965dcb29b13b7b1691b6e7332cf5dbc1744138d5acb7f6" dependencies = [ - "version_check", + "version_check 0.1.5", ] [[package]] -name = "unicode-bidi" -version = "0.3.4" +name = "unicode-ident" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -dependencies = [ - "matches", -] - -[[package]] -name = "unicode-normalization" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "141339a08b982d942be2ca06ff8b076563cbe223d1befd5450716790d44e2426" -dependencies = [ - "smallvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9" - -[[package]] -name = "unicode-width" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-xid" -version = "0.1.0" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - -[[package]] -name = "unicode-xid" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "url" -version = "1.7.2" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ - "idna 0.1.5", - "matches", - "percent-encoding 1.0.1", + "form_urlencoded", + "idna", + "percent-encoding", + "serde", ] [[package]] -name = "url" -version = "2.1.0" +name = "utf8_iter" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b414f6c464c879d7f9babf951f23bc3743fb7313c081b2e6ca719067ea9d61" -dependencies = [ - "idna 0.2.0", - "matches", - "percent-encoding 2.1.0", -] +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] -name = "utf8-ranges" -version = "1.0.2" +name = "utf8parse" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" - -[[package]] -name = "v_escape" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "660b101c07b5d0863deb9e7fb3138777e858d6d2a79f9e6049a27d1cc77c6da6" -dependencies = [ - "v_escape_derive", -] - -[[package]] -name = "v_escape_derive" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ca2a14bc3fc5b64d188b087a7d3a927df87b152e941ccfbc66672e20c467ae" -dependencies = [ - "nom", - "proc-macro2 1.0.2", - "quote 1.0.2", - "syn 1.0.5", -] +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "v_htmlescape" -version = "0.4.5" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33e939c0d8cf047514fb6ba7d5aac78bc56677a6938b2ee67000b91f2e97e41" -dependencies = [ - "cfg-if 0.1.9", - "v_escape", -] - -[[package]] -name = "vec_map" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" +checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" [[package]] name = "version_check" @@ -2378,21 +1990,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" [[package]] -name = "walkdir" -version = "2.2.9" +name = "version_check" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9658c94fa8b940eab2250bd5a457f9c48b748420d71293b165c8cdbe2f55f71e" -dependencies = [ - "same-file", - "winapi 0.3.7", - "winapi-util", -] +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wasi" -version = "0.7.0" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] [[package]] name = "webterm" @@ -2400,67 +2016,39 @@ version = "0.2.2" dependencies = [ "actix", "actix-files", - "actix-service", + "actix-rt", "actix-web", "actix-web-actors", + "bytes", + "clap", + "env_logger", "futures", "handlebars", - "lazy_static", "libc", "log", - "pretty_env_logger", + "portable-pty", "serde", "serde_json", - "structopt", "tokio", - "tokio-codec", - "tokio-io", - "tokio-pty-process", + "tokio-util", ] -[[package]] -name = "widestring" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effc0e4ff8085673ea7b9b2e3c73f6bd4d118810c9009ed8f1e16bd96c331db6" - [[package]] name = "winapi" -version = "0.2.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - -[[package]] -name = "winapi" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" -dependencies = [ - "winapi 0.3.7", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -2468,39 +2056,309 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "wincolor" -version = "1.0.1" +name = "windows-link" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "winapi 0.3.7", - "winapi-util", + "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "winapi 0.3.7", + "stable_deref_trait", + "yoke-derive", + "zerofrom", ] [[package]] -name = "winutil" -version = "0.1.1" +name = "yoke-derive" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daf138b6b14196e3830a588acf1e86966c694d3e8fb026fb105b8b5dca07e6e" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ - "winapi 0.3.7", + "proc-macro2", + "quote", + "syn", + "synstructure", ] [[package]] -name = "ws2_32-sys" -version = "0.2.1" +name = "zerocopy" +version = "0.8.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +checksum = "4ea879c944afe8a2b25fef16bb4ba234f47c694565e97383b36f3a878219065c" dependencies = [ - "winapi 0.2.8", - "winapi-build", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf955aa904d6040f70dc8e9384444cb1030aed272ba3cb09bbc4ab9e7c1f34f5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", ] diff --git a/Cargo.toml b/Cargo.toml index 8e2efd6..35d017e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,39 +1,34 @@ [package] name = "webterm" -description = "xterm.js - based webterminal" -repository = "https://github.com/fubarnetes/webterm" +description = "socktop xterm.js - based webterminal" +repository = "https://gt.wittyoneoff.com/jason/socktop-webterm" documentation = "https://docs.rs/webterm" readme = "README.md" categories = ["web-programming", "web-programming::websocket", "web-programming::http-server", "command-line-utilities"] keywords = ["terminal", "xterm", "websocket", "terminus", "console"] version = "0.2.2" authors = ["fabian.freyer@physik.tu-berlin.de","jasonpwitty+socktop@proton.me"] -edition = "2018" +edition = "2021" license = "BSD-3-Clause" -[badges] -travis-ci = { repository = "fubarnetes/webterm", branch = "master" } -maintenance = { status = "actively-developed" } - [dependencies] -actix-files = "0.1.6" -actix-service = "0.4.2" -actix-web-actors = "1.0.2" -actix-web= "1.0.8" -actix= "0.8.3" -futures = "0.1.29" -handlebars = "2.0.2" -lazy_static = "1.4.0" -libc = "0.2.66" -log = "0.4.8" -pretty_env_logger = "0.3.1" -serde = "1.0.104" -serde_json = "1.0.44" -structopt = "0.3.7" -tokio = "0.1.22" -tokio-codec= "0.1.1" -tokio-io= "0.1.12" -tokio-pty-process = "0.4" +actix-files = "0.6" +actix-web = "4.9" +actix-web-actors = "4.3" +actix = "0.13" +actix-rt = "2.10" +futures = "0.3" +handlebars = "6.3" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +clap = { version = "4.5", features = ["derive"] } +tokio = { version = "1.42", features = ["full"] } +tokio-util = { version = "0.7", features = ["codec"] } +portable-pty = "0.8" +bytes = "1.9" +log = "0.4" +env_logger = "0.11" +libc = "0.2" [lib] name = "webterm" diff --git a/README.md b/README.md index 7517866..de23050 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,217 @@ -# webterm -web terminal based on xterm.js in rust +# Socktop WebTerm + +A web-based terminal using xterm.js and Rust, part of the Socktop project. ![Screenshot](screenshots/screenshot.png) -# Is it any good? -[Yes.](https://news.ycombinator.com/item?id=3067434) +## About -# How does it work? +This is a modern web terminal server that provides browser-based terminal access with WebSocket support. It's built with Rust using the Actix-Web framework and xterm.js for the frontend. -There is a rust backend based [Actix], consisting of two actors: -* `Websocket` implements a websocket that speaks the [Terminado] protocol -* `Terminal` handles communication to a child spawned on a PTY using [tokio-pty-process]. +## Features -The frontend is a static HTML page served by [actix-web][Actix] providing an [xterm.js] UI. +- πŸ–₯️ Full-featured terminal emulation via xterm.js +- πŸ”Œ WebSocket-based communication using the Terminado protocol +- πŸš€ High-performance Rust backend +- ⚑ Zero-downtime rolling deployments via CI/CD +- 🐳 Containerized deployment with Docker +- ☸️ Kubernetes/k3s ready with automated deployments -[Actix]: https://actix.rs -[Terminado]: https://github.com/jupyter/terminado -[tokio-pty-process]: https://crates.io/crates/tokio-pty-process -[xterm.js]: https://xtermjs.org/ +## Architecture -# Local development -``` +The application consists of two main components: + +### Backend (Rust) +- **Websocket Actor**: Implements WebSocket communication using the [Terminado](https://github.com/jupyter/terminado) protocol +- **Terminal Actor**: Manages PTY communication with spawned processes using [portable-pty](https://crates.io/crates/portable-pty) +- **Actix-Web Server**: Serves static files and handles HTTP/WebSocket routing + +### Frontend +- **xterm.js**: Provides the terminal UI in the browser +- **Static Assets**: HTML, CSS, and JavaScript served by Actix-Web + +## Prerequisites + +- Rust 1.90+ (2021 edition) +- Node.js and npm (for xterm.js dependencies) +- Docker (optional, for containerized deployment) +- Kubernetes/k3s (optional, for orchestrated deployment) + +## Local Development + +```bash +# Clone the repository +git clone https://gt.wittyoneoff.com/jason/socktop-webterm +cd socktop-webterm + +# Install npm dependencies +npm install + +# Verify setup (optional but recommended) +./check-setup.sh + +# Build and run cargo build cargo run ``` -Then head to `http://localhost:8080/` to see it in action! -# Should I run this on the internet? +Then head to `http://localhost:8082/` to see it in action! -Probably not. It lets anyone who can access the webpage control your system. +### Setup Verification + +Before running the server, you can verify that all required files and dependencies are in place: + +```bash +./check-setup.sh +``` + +This will check for: +- Required directories (static, templates, node_modules) +- Critical files (templates, JavaScript, CSS) +- xterm.js installation +- Build tools (cargo, npm) + +**Note**: The server must be run from the project root directory, as it expects `./static`, `./templates`, and `./node_modules` to be accessible in the current working directory. + +### Command Line Options + +```bash +webterm-server --help +``` + +Options: +- `-p, --port ` - The port to listen on (default: 8082) +- `-H, --host ` - The host or IP to listen on (default: localhost) +- `-c, --command ` - The command to execute (default: /bin/sh) + +Example: +```bash +cargo run -- --port 8080 --host 0.0.0.0 --command /bin/bash +``` + +## Production Deployment + +### Docker + +```bash +# Build the image +docker build -t socktop-webterm:latest . + +# Run the container +docker run -d -p 8082:8082 socktop-webterm:latest +``` + +### Kubernetes/k3s + +Automated deployment via Gitea Actions CI/CD: + +1. Push to `main` branch +2. Workflow automatically builds arm64 image +3. Image tagged with version from `Cargo.toml` +4. Deployed to k3s cluster with zero-downtime rolling update + +See `.gitea/workflows/build-and-deploy.yaml` for the complete workflow. + +Manual deployment: +```bash +kubectl apply -f kubernetes/ +``` + +## CI/CD Pipeline + +This project includes a complete CI/CD pipeline using Gitea Actions: + +- **Automatic builds** on every push to main/master +- **Version tagging** from Cargo.toml +- **Container registry** integration +- **Automated k3s deployment** with rolling updates +- **Zero downtime** deployments + +For setup instructions, see: +- [Getting Started Guide](GETTING-STARTED-CI-CD.md) +- [CI/CD Overview](CI-CD-OVERVIEW.md) +- [Quick Reference](.gitea/QUICKSTART.md) + +## Technology Stack + +- **Backend**: Rust 2021, Actix-Web 4.x, Actix 0.13, portable-pty +- **Frontend**: xterm.js, HTML5, CSS3 +- **Templating**: Handlebars 6.x +- **CLI**: clap 4.x +- **Async Runtime**: Tokio 1.x +- **Containerization**: Docker, Kubernetes/k3s +- **CI/CD**: Gitea Actions + +## Security Considerations + +⚠️ **Warning**: This application provides shell access to anyone who can access the web interface. It is intended for use in controlled environments only. Only run in Run in isolated containers/namespaces. + +## Credits + +### Original Author +This project is a fork of [webterm](https://github.com/fubarnetes/webterm) originally created by: +- **Fabian Freyer** (fabian.freyer@physik.tu-berlin.de) + +### Socktop Enhancements +Modernized and enhanced for the Socktop project by: +- **Jason Witty** (jasonpwitty+socktop@proton.me) + +#### Major Changes from Original +- Updated to Rust 2021 edition +- Modernized dependencies (Actix-Web 1.x β†’ 4.x, Tokio 0.1 β†’ 1.x) +- Replaced deprecated `tokio-pty-process` with `portable-pty` +- Added automated CI/CD pipeline with Gitea Actions +- Containerized deployment with Docker +- Kubernetes/k3s orchestration support +- Added idle session timeout (5 minutes) +- Improved error handling and logging +- Modern CLI with clap instead of structopt +- Updated to latest xterm.js + +## License + +This project is licensed under the **BSD 3-Clause License** - see below: + +``` +Copyright (c) 2019 Fabian Freyer +Copyright (c) 2024 Jason Witty +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +``` + +## Contributing + +Contributions are welcome! Please feel free to submit pull requests or open issues. + +## Links + +- **Repository**: https://gt.wittyoneoff.com/jason/socktop-webterm +- **Original Project**: https://github.com/fubarnetes/webterm +- **xterm.js**: https://xtermjs.org/ +- **Actix-Web**: https://actix.rs +- **portable-pty**: https://crates.io/crates/portable-pty diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..a815672 --- /dev/null +++ b/build.rs @@ -0,0 +1,54 @@ +use std::path::Path; + +fn main() { + // Verify that required directories exist at build time + let required_dirs = vec!["static", "templates", "node_modules"]; + + let mut missing_dirs = Vec::new(); + + for dir in &required_dirs { + if !Path::new(dir).exists() { + missing_dirs.push(*dir); + } + } + + if !missing_dirs.is_empty() { + println!("cargo:warning=Missing required directories:"); + for dir in &missing_dirs { + println!("cargo:warning= - {}", dir); + } + + if missing_dirs.contains(&"node_modules") { + println!("cargo:warning=Run 'npm install' to install frontend dependencies"); + } + } + + // Verify critical files + let required_files = vec![ + "templates/term.html", + "static/terminal.js", + "static/terminado-addon.js", + "static/styles.css", + ]; + + let mut missing_files = Vec::new(); + + for file in &required_files { + if !Path::new(file).exists() { + missing_files.push(*file); + } + } + + if !missing_files.is_empty() { + println!("cargo:warning=Missing required files:"); + for file in &missing_files { + println!("cargo:warning= - {}", file); + } + } + + // Tell cargo to rerun if these directories change + println!("cargo:rerun-if-changed=static/"); + println!("cargo:rerun-if-changed=templates/"); + println!("cargo:rerun-if-changed=package.json"); + println!("cargo:rerun-if-changed=package-lock.json"); +} diff --git a/src/event.rs b/src/event.rs index dc5b63b..450d86b 100644 --- a/src/event.rs +++ b/src/event.rs @@ -1,71 +1,34 @@ use actix::Message; -use futures::{Future, Poll}; -use libc::c_ushort; -use tokio_pty_process::PtyMaster; +use bytes::Bytes; pub use crate::terminado::TerminadoMessage; -use tokio_codec::{BytesCodec, Decoder}; -type BytesMut = ::Item; - -pub struct Resize { - pty: T, - rows: c_ushort, - cols: c_ushort, -} - -impl Resize { - pub fn new(pty: T, rows: c_ushort, cols: c_ushort) -> Self { - Self { pty, rows, cols } - } -} - -impl Future for Resize { - type Item = (); - type Error = std::io::Error; - - fn poll(&mut self) -> Poll { - self.pty.resize(self.rows, self.cols) - } -} - #[derive(Debug, Eq, PartialEq, Clone)] -pub struct IO(pub BytesMut); +pub struct IO(pub Bytes); impl Message for IO { type Result = (); } -impl Into for IO { - fn into(self) -> actix_web::web::Bytes { - self.0.into() - } -} - -impl AsRef<[u8]> for IO { - fn as_ref(&self) -> &[u8] { - self.0.as_ref() - } -} - -impl From for IO { - fn from(b: actix_web::web::Bytes) -> Self { - Self(b.as_ref().into()) +impl From for IO { + fn from(b: Bytes) -> Self { + Self(b) } } impl From for IO { fn from(s: String) -> Self { - Self(s.into()) + Self(Bytes::from(s)) } } impl From<&str> for IO { fn from(s: &str) -> Self { - Self(s.into()) + Self(Bytes::from(s.to_owned())) } } +#[derive(Debug, Clone)] pub struct ChildDied(); impl Message for ChildDied { diff --git a/src/lib.rs b/src/lib.rs index b2bb8e5..34b27c4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,5 @@ // Copyright (c) 2019 Fabian Freyer . +// Copyright (c) 2024 Jason Witty . // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -27,24 +28,19 @@ // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. -#[macro_use] -extern crate serde_json; -#[macro_use] -extern crate log; - use actix::prelude::*; use actix::{Actor, StreamHandler}; use actix_web::{web, App, HttpRequest, HttpResponse}; use actix_web_actors::ws; -use std::io::Write; +use std::io::{Read, Write}; use std::process::Command; use std::time::{Duration, Instant}; -use tokio_codec::{BytesCodec, Decoder, FramedRead}; -use tokio_pty_process::{AsyncPtyMaster, AsyncPtyMasterWriteHalf, Child, CommandExt}; - +use bytes::Bytes; use handlebars::Handlebars; +use portable_pty::{native_pty_system, CommandBuilder, PtySize}; +use serde_json::json; const HEARTBEAT_INTERVAL: Duration = Duration::from_secs(5); const CLIENT_TIMEOUT: Duration = Duration::from_secs(10); @@ -54,6 +50,8 @@ const IDLE_CHECK_INTERVAL: Duration = Duration::from_secs(30); // Check every 30 mod event; mod terminado; +use event::{ChildDied, TerminadoMessage, IO}; + /// Actix WebSocket actor pub struct Websocket { cons: Option>, @@ -76,51 +74,49 @@ impl Actor for Websocket { // Start PTY self.cons = Some(Terminal::new(ctx.address(), command).start()); - trace!("Started WebSocket"); + log::trace!("Started WebSocket"); } fn stopping(&mut self, _ctx: &mut Self::Context) -> Running { - trace!("Stopping WebSocket"); + log::trace!("Stopping WebSocket"); - // When the WebSocket disconnects, the Terminal's idle timeout will - // automatically clean up the PTY session after IDLE_TIMEOUT (5 minutes). - // This prevents "grey goo" accumulation of orphaned terminal processes - // while giving reconnecting clients a grace period. if let Some(_cons) = self.cons.take() { - info!("WebSocket disconnecting, Terminal will timeout if idle"); + log::info!("WebSocket disconnecting, Terminal will timeout if idle"); } Running::Stop } fn stopped(&mut self, _ctx: &mut Self::Context) { - trace!("Stopped WebSocket"); + log::trace!("Stopped WebSocket"); } } -impl Handler for Websocket { +impl Handler for Websocket { type Result = (); - fn handle(&mut self, msg: event::IO, ctx: &mut ::Context) { - trace!("Websocket <- Terminal : {:?}", msg); - ctx.binary(msg); + fn handle(&mut self, msg: IO, ctx: &mut ::Context) { + log::trace!("Websocket <- Terminal : {:?}", msg); + ctx.binary(msg.0); } } -impl Handler for Websocket { +impl Handler for Websocket { type Result = (); - fn handle(&mut self, msg: event::TerminadoMessage, ctx: &mut ::Context) { - trace!("Websocket <- Terminal : {:?}", msg); + fn handle(&mut self, msg: TerminadoMessage, ctx: &mut ::Context) { + log::trace!("Websocket <- Terminal : {:?}", msg); match msg { - event::TerminadoMessage::Stdout(_) => { + TerminadoMessage::Stdout(_) => { let json = serde_json::to_string(&msg); if let Ok(json) = json { ctx.text(json); } } - _ => error!(r#"Invalid event::TerminadoMessage to Websocket: only "stdout" supported"#), + _ => log::error!( + r#"Invalid event::TerminadoMessage to Websocket: only "stdout" supported"# + ), } } } @@ -137,22 +133,31 @@ impl Websocket { fn hb(&self, ctx: &mut ::Context) { ctx.run_interval(HEARTBEAT_INTERVAL, |act, ctx| { if Instant::now().duration_since(act.hb) > CLIENT_TIMEOUT { - warn!("Client heartbeat timeout, disconnecting."); + log::warn!("Client heartbeat timeout, disconnecting."); ctx.stop(); return; } - ctx.ping(""); + ctx.ping(b""); }); } } -impl StreamHandler for Websocket { - fn handle(&mut self, msg: ws::Message, ctx: &mut Self::Context) { +impl StreamHandler> for Websocket { + fn handle(&mut self, msg: Result, ctx: &mut Self::Context) { let cons: &mut Addr = match self.cons { Some(ref mut c) => c, None => { - error!("Terminalole died, closing websocket."); + log::error!("Terminal died, closing websocket."); + ctx.stop(); + return; + } + }; + + let msg = match msg { + Ok(msg) => msg, + Err(e) => { + log::error!("WebSocket protocol error: {}", e); ctx.stop(); return; } @@ -166,34 +171,35 @@ impl StreamHandler for Websocket { ws::Message::Pong(_) => self.hb = Instant::now(), ws::Message::Text(t) => { // Attempt to parse the message as JSON. - if let Ok(tmsg) = event::TerminadoMessage::from_json(&t) { + if let Ok(tmsg) = TerminadoMessage::from_json(t.as_ref()) { cons.do_send(tmsg); } else { // Otherwise, it's just byte data. - cons.do_send(event::IO::from(t)); + cons.do_send(IO::from(t.to_string())); } } - ws::Message::Binary(b) => cons.do_send(event::IO::from(b)), + ws::Message::Binary(b) => cons.do_send(IO::from(b)), ws::Message::Close(_) => ctx.stop(), - ws::Message::Nop => {} + ws::Message::Nop | ws::Message::Continuation(_) => {} }; } } -impl Handler for Websocket { +impl Handler for Websocket { type Result = (); - fn handle(&mut self, _msg: event::ChildDied, ctx: &mut ::Context) { - trace!("Websocket <- ChildDied"); + fn handle(&mut self, _msg: ChildDied, ctx: &mut ::Context) { + log::trace!("Websocket <- ChildDied"); ctx.close(None); ctx.stop(); } } -/// Represents a PTY backenActix WebSocket actor.d with attached child +/// Represents a PTY backend with attached child pub struct Terminal { - pty_write: Option, - child: Option, + pty_master: Option>, + pty_writer: Option>, + child: Option>, ws: Addr, command: Command, last_activity: Instant, @@ -203,7 +209,8 @@ pub struct Terminal { impl Terminal { pub fn new(ws: Addr, command: Command) -> Self { Self { - pty_write: None, + pty_master: None, + pty_writer: None, child: None, ws, command, @@ -213,58 +220,101 @@ impl Terminal { } } -impl StreamHandler<::Item, ::Error> for Terminal { - fn handle(&mut self, msg: ::Item, _ctx: &mut Self::Context) { - self.ws - .do_send(event::TerminadoMessage::Stdout(event::IO(msg))); - } -} - impl Actor for Terminal { type Context = Context; fn started(&mut self, ctx: &mut Self::Context) { - info!("Started Terminal"); - let pty = match AsyncPtyMaster::open() { + log::info!("Started Terminal"); + + let pty_system = native_pty_system(); + + let pty_pair = match pty_system.openpty(PtySize { + rows: 24, + cols: 80, + pixel_width: 0, + pixel_height: 0, + }) { + Ok(pair) => pair, Err(e) => { - error!("Unable to open PTY: {:?}", e); + log::error!("Unable to open PTY: {:?}", e); ctx.stop(); return; } - Ok(pty) => pty, }; - let child = match self.command.spawn_pty_async(&pty) { - Err(e) => { - error!("Unable to spawn child: {:?}", e); - ctx.stop(); - return; + let mut cmd_builder = CommandBuilder::new(self.command.get_program()); + for arg in self.command.get_args() { + cmd_builder.arg(arg); + } + for (key, val) in self.command.get_envs() { + if let Some(val) = val { + cmd_builder.env(key, val); } + } + + let child = match pty_pair.slave.spawn_command(cmd_builder) { Ok(child) => child, + Err(e) => { + log::error!("Unable to spawn child: {:?}", e); + ctx.stop(); + return; + } }; - info!("Spawned new child process with PID {}", child.id()); + log::info!("Spawned new child process"); - let (pty_read, mut pty_write) = pty.split(); + // Get reader and writer + let reader = match pty_pair.master.try_clone_reader() { + Ok(r) => r, + Err(e) => { + log::error!("Unable to clone reader: {:?}", e); + ctx.stop(); + return; + } + }; - // Set a sensible default PTY size immediately after splitting the PTY. - // This avoids sending an initial 0x0 resize to the backend which can - // cause panics in terminal UI libraries like ratatui. - // - // We use the Resize helper which accepts a mutable reference to the - // write-half of the PTY and block until the resize completes. - let _ = event::Resize::new(&mut pty_write, 24, 80).wait(); + let writer = match pty_pair.master.take_writer() { + Ok(w) => w, + Err(e) => { + log::error!("Unable to get writer: {:?}", e); + ctx.stop(); + return; + } + }; - self.pty_write = Some(pty_write); + self.pty_master = Some(pty_pair.master); + self.pty_writer = Some(writer); self.child = Some(child); - Self::add_stream(FramedRead::new(pty_read, BytesCodec::new()), ctx); + // Spawn blocking thread to read from PTY + let ws = self.ws.clone(); + std::thread::spawn(move || { + let mut reader = reader; + let mut buf = [0u8; 8192]; + + loop { + match reader.read(&mut buf) { + Ok(0) => { + log::info!("PTY reader reached EOF"); + break; + } + Ok(n) => { + let data = Bytes::copy_from_slice(&buf[..n]); + ws.do_send(TerminadoMessage::Stdout(IO(data))); + } + Err(e) => { + log::error!("Error reading from PTY: {}", e); + break; + } + } + } + }); // Start idle timeout checker ctx.run_interval(IDLE_CHECK_INTERVAL, |act, ctx| { let idle_duration = Instant::now().duration_since(act.last_activity); if idle_duration >= act.idle_timeout { - info!( + log::info!( "Terminal idle timeout reached ({:?} idle), stopping session", idle_duration ); @@ -274,93 +324,81 @@ impl Actor for Terminal { } fn stopping(&mut self, _ctx: &mut Self::Context) -> Running { - info!("Stopping Terminal"); + log::info!("Stopping Terminal"); - let child = self.child.take(); - - if child.is_none() { - // Great, child is already dead! - return Running::Stop; + if let Some(mut child) = self.child.take() { + let _ = child.kill(); + let _ = child.wait(); } - let mut child = child.unwrap(); - - match child.kill() { - Ok(()) => match child.wait() { - Ok(exit) => info!("Child died: {:?}", exit), - Err(e) => error!("Child wouldn't die: {}", e), - }, - Err(e) => error!("Could not kill child with PID {}: {}", child.id(), e), - }; - // Notify the websocket that the child died. - self.ws.do_send(event::ChildDied()); + self.ws.do_send(ChildDied()); Running::Stop } fn stopped(&mut self, _ctx: &mut Self::Context) { - info!("Stopped Terminal"); + log::info!("Stopped Terminal"); } } -impl Handler for Terminal { +impl Handler for Terminal { type Result = (); - fn handle(&mut self, msg: event::IO, ctx: &mut ::Context) { + fn handle(&mut self, msg: IO, ctx: &mut ::Context) { // Reset idle timer on activity self.last_activity = Instant::now(); - let pty = match self.pty_write { - Some(ref mut p) => p, + let writer = match &mut self.pty_writer { + Some(w) => w, None => { - error!("Write half of PTY died, stopping Terminal."); + log::error!("PTY writer died, stopping Terminal."); ctx.stop(); return; } }; - if let Err(e) = pty.write(msg.as_ref()) { - error!("Could not write to PTY: {}", e); + if let Err(e) = writer.write_all(&msg.0) { + log::error!("Could not write to PTY: {}", e); ctx.stop(); + return; } - trace!("Websocket -> Terminal : {:?}", msg); + log::trace!("Websocket -> Terminal : {:?}", msg); } } -impl Handler for Terminal { +impl Handler for Terminal { type Result = (); - fn handle(&mut self, msg: event::TerminadoMessage, ctx: &mut ::Context) { - let pty = match self.pty_write { - Some(ref mut p) => p, - None => { - error!("Write half of PTY died, stopping Terminal."); - ctx.stop(); - return; - } - }; - - trace!("Websocket -> Terminal : {:?}", msg); + fn handle(&mut self, msg: TerminadoMessage, ctx: &mut ::Context) { + log::trace!("Websocket -> Terminal : {:?}", msg); match msg { - event::TerminadoMessage::Stdin(io) => { + TerminadoMessage::Stdin(io) => { // Reset idle timer on user input self.last_activity = Instant::now(); - if let Err(e) = pty.write(io.as_ref()) { - error!("Could not write to PTY: {}", e); + let writer = match &mut self.pty_writer { + Some(w) => w, + None => { + log::error!("PTY writer died, stopping Terminal."); + ctx.stop(); + return; + } + }; + + if let Err(e) = writer.write_all(&io.0) { + log::error!("Could not write to PTY: {}", e); ctx.stop(); } } - event::TerminadoMessage::Resize { rows, cols } => { + TerminadoMessage::Resize { rows, cols } => { // Reset idle timer on resize (user interaction) self.last_activity = Instant::now(); - // Ignore zero-sized resizes which can cause panics in backends - // such as ratatui when they receive a Rect with width or height 0. + // Ignore zero-sized resizes if rows == 0 || cols == 0 { - trace!( + log::trace!( "Ignoring zero-sized resize: cols = {}, rows = {}", cols, rows @@ -368,14 +406,29 @@ impl Handler for Terminal { return; } - info!("Resize: cols = {}, rows = {}", cols, rows); - if let Err(e) = event::Resize::new(pty, rows, cols).wait() { - error!("Resize failed: {}", e); + log::info!("Resize: cols = {}, rows = {}", cols, rows); + + let pty = match &mut self.pty_master { + Some(p) => p, + None => { + log::error!("PTY died, stopping Terminal."); + ctx.stop(); + return; + } + }; + + if let Err(e) = pty.resize(PtySize { + rows, + cols, + pixel_width: 0, + pixel_height: 0, + }) { + log::error!("Resize failed: {}", e); ctx.stop(); } } - event::TerminadoMessage::Stdout(_) => { - error!("Invalid Terminado Message: Stdin cannot go to PTY") + TerminadoMessage::Stdout(_) => { + log::error!("Invalid Terminado Message: Stdout cannot go to PTY") } }; } @@ -384,63 +437,57 @@ impl Handler for Terminal { /// Trait to extend an [actix_web::App] by serving a web terminal. pub trait WebTermExt { /// Serve the websocket for the webterm - fn webterm_socket(self: Self, endpoint: &str, handler: F) -> Self + fn webterm_socket(self, endpoint: &str, handler: F) -> Self where F: Clone + Fn(&actix_web::HttpRequest) -> Command + 'static; - fn webterm_ui( - self: Self, - endpoint: &str, - webterm_socket_endpoint: &str, - static_path: &str, - ) -> Self; + fn webterm_ui(self, endpoint: &str, webterm_socket_endpoint: &str, static_path: &str) -> Self; } -impl WebTermExt for App +impl WebTermExt for App where - B: actix_web::body::MessageBody, - T: actix_service::NewService< + T: actix_web::dev::ServiceFactory< + actix_web::dev::ServiceRequest, Config = (), - Request = actix_web::dev::ServiceRequest, - Response = actix_web::dev::ServiceResponse, Error = actix_web::Error, InitError = (), >, { - fn webterm_socket(self: Self, endpoint: &str, handler: F) -> Self + fn webterm_socket(self, endpoint: &str, handler: F) -> Self where F: Clone + Fn(&actix_web::HttpRequest) -> Command + 'static, { self.route( endpoint, web::get().to(move |req: HttpRequest, stream: web::Payload| { - ws::start(Websocket::new(handler(&req)), &req, stream) + let cmd = handler(&req); + async move { ws::start(Websocket::new(cmd), &req, stream) } }), ) } - fn webterm_ui( - self: Self, - endpoint: &str, - webterm_socket_endpoint: &str, - static_path: &str, - ) -> Self { + fn webterm_ui(self, endpoint: &str, webterm_socket_endpoint: &str, static_path: &str) -> Self { let mut handlebars = Handlebars::new(); handlebars - .register_templates_directory(".html", "./templates") + .register_template_file("term", "./templates/term.html") .unwrap(); let handlebars_ref = web::Data::new(handlebars); let static_path = static_path.to_owned(); let webterm_socket_endpoint = webterm_socket_endpoint.to_owned(); - self.register_data(handlebars_ref.clone()).route( + + self.app_data(handlebars_ref.clone()).route( endpoint, - web::get().to(move |hb: web::Data| { - let data = json!({ - "websocket_path": webterm_socket_endpoint, - "static_path": static_path, - }); - let body = hb.render("term", &data).unwrap(); - HttpResponse::Ok().body(body) + web::get().to(move |hb: web::Data>| { + let websocket_path = webterm_socket_endpoint.clone(); + let static_path_clone = static_path.clone(); + async move { + let data = json!({ + "websocket_path": websocket_path, + "static_path": static_path_clone, + }); + let body = hb.render("term", &data).unwrap(); + HttpResponse::Ok().body(body) + } }), ) } diff --git a/src/server.rs b/src/server.rs index dbf2300..f56f6e5 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,90 +1,60 @@ -#[macro_use] -extern crate lazy_static; - -use actix_files; use actix_web::{App, HttpServer}; -use structopt::StructOpt; +use clap::Parser; use webterm::WebTermExt; -use std::net::TcpListener; use std::process::Command; -#[derive(StructOpt, Debug)] -#[structopt(name = "webterm-server")] +#[derive(Parser, Debug)] +#[command(name = "webterm-server")] +#[command(about = "Web terminal server based on xterm.js")] struct Opt { /// The port to listen on - #[structopt(short, long, default_value = "8082")] + #[arg(short, long, default_value = "8082")] port: u16, /// The host or IP to listen on - #[structopt(short, long, default_value = "localhost")] + #[arg(short = 'H', long, default_value = "localhost")] host: String, /// The command to execute - #[structopt(short, long, default_value = "/bin/sh")] + #[arg(short, long, default_value = "/bin/sh")] command: String, } -lazy_static! { - static ref OPT: Opt = Opt::from_args(); -} +#[actix_web::main] +async fn main() -> std::io::Result<()> { + env_logger::init(); -fn main() { - pretty_env_logger::init(); + let opt = Opt::parse(); // Normalize common hostnames that sometimes resolve to IPv6-only addresses // which can cause platform-specific bind failures. Mapping `localhost` to // 127.0.0.1 makes behavior predictable on systems where `::1` would otherwise // be selected. - let host = if OPT.host == "localhost" { + let host = if opt.host == "localhost" { "127.0.0.1".to_string() } else { - OPT.host.clone() + opt.host.clone() }; - let bind_addr = format!("{}:{}", host, OPT.port); + let bind_addr = format!("{}:{}", host, opt.port); println!("Starting webterm server on http://{}", bind_addr); - // Single factory closure variable that we reuse for HttpServer::new. - // The closure does not capture any stack variables (it references the static - // `OPT`), so it can act as a simple, repeated factory for the server. - let factory = || { + let command = opt.command.clone(); + + HttpServer::new(move || { + let cmd = command.clone(); App::new() .service(actix_files::Files::new("/assets", "./static")) .service(actix_files::Files::new("/static", "./node_modules")) - .webterm_socket("/websocket", |_req| { - // Use the static OPT inside the handler; this does not make the - // outer `factory` closure capture stack variables, so factory - // remains a zero-capture closure (a function item/type). - let mut cmd = Command::new(OPT.command.clone()); - cmd.env("TERM", "xterm"); - cmd + .webterm_socket("/websocket", move |_req| { + let mut command = Command::new(&cmd); + command.env("TERM", "xterm"); + command }) .webterm_ui("/", "/websocket", "/static") - }; - - // Bind a std::net::TcpListener ourselves and hand it to actix via `listen`. - // This avoids actix's address parser producing EINVAL on some platforms. - let listener = match TcpListener::bind(&bind_addr) { - Ok(l) => l, - Err(e) => { - eprintln!("Failed to bind TcpListener to {}: {}", bind_addr, e); - eprintln!("Try `--host 0.0.0.0` or `--host 127.0.0.1` to bind explicitly."); - std::process::exit(1); - } - }; - - let server = HttpServer::new(factory) - .listen(listener) - .unwrap_or_else(|e| { - eprintln!("Failed to listen on {}: {}", bind_addr, e); - std::process::exit(1); - }); - - println!("Listening on http://{}", bind_addr); - - if let Err(e) = server.run() { - eprintln!("Server run failed: {}", e); - std::process::exit(1); - } + }) + .bind(&bind_addr)? + .run() + .await } diff --git a/src/terminado.rs b/src/terminado.rs index 41bd660..fefce5b 100644 --- a/src/terminado.rs +++ b/src/terminado.rs @@ -1,4 +1,5 @@ use actix::Message; +use log::error; use libc::c_ushort; @@ -6,7 +7,6 @@ use std::convert::TryFrom; use serde::ser::SerializeSeq; use serde::{Serialize, Serializer}; -use serde_json; use crate::event::IO; diff --git a/templates/term.html b/templates/term.html index 163a144..03b80ad 100644 --- a/templates/term.html +++ b/templates/term.html @@ -44,23 +44,23 @@ /> - - + + - + - - + + @@ -184,6 +184,6 @@ - +