├── .github ├── dependabot.yml └── workflows │ ├── build-release-binaries.yml │ └── rust.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── readme.md └── src └── main.rs /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "cargo" # This specifies that you're using Rust's Cargo 4 | directory: "/" # Location of your Cargo.toml file 5 | schedule: 6 | interval: "weekly" # Options: "daily", "weekly", "monthly" 7 | commit-message: 8 | prefix: "fix" # Customize the commit message prefix 9 | 10 | -------------------------------------------------------------------------------- /.github/workflows/build-release-binaries.yml: -------------------------------------------------------------------------------- 1 | name: "ci-build-release-binaries" 2 | 3 | on: 4 | release: 5 | types: [created] 6 | 7 | jobs: 8 | build_binaries: 9 | strategy: 10 | fail-fast: false 11 | matrix: 12 | include: 13 | - target: x86_64-unknown-linux-gnu 14 | os: ubuntu-latest 15 | archive_ext: tgz 16 | 17 | - target: x86_64-unknown-linux-musl 18 | os: ubuntu-latest 19 | archive_ext: tgz 20 | 21 | - target: x86_64-apple-darwin 22 | os: macos-13 23 | archive_ext: tgz 24 | 25 | - target: aarch64-apple-darwin 26 | os: macos-latest 27 | archive_ext: tgz 28 | 29 | - target: x86_64-pc-windows-msvc 30 | os: windows-latest 31 | archive_ext: zip 32 | 33 | runs-on: ${{ matrix.os }} 34 | steps: 35 | - name: checkout_tagged_commit 36 | uses: actions/checkout@v4 37 | with: 38 | ref: ${{ github.event.release.target_commitish }} 39 | 40 | - name: set_output 41 | id: set_output 42 | shell: bash 43 | run: | 44 | echo "archive=cloudwatch-log-redirector-${{ matrix.target }}-${{ github.event.release.tag_name }}.${{ matrix.archive_ext }}" >> $GITHUB_OUTPUT 45 | echo "subfolder=cloudwatch-log-redirector-${{ matrix.target }}-${{ github.event.release.tag_name }}" >> $GITHUB_OUTPUT 46 | 47 | - name: show_outputs 48 | shell: bash 49 | run: | 50 | echo "Archive: '${{ steps.set_output.outputs.archive }}'" 51 | echo "Subfolder: '${{ steps.set_output.outputs.subfolder }}'" 52 | 53 | - name: create_pkg_subfolder 54 | shell: bash 55 | run: mkdir ${{ steps.set_output.outputs.subfolder }} 56 | 57 | - name: copy_files_to_pkg_subfolder 58 | shell: bash 59 | run: | 60 | cp readme.md ${{ steps.set_output.outputs.subfolder }} 61 | 62 | - name: install_rust 63 | uses: dtolnay/rust-toolchain@stable 64 | 65 | - name: install musl-gcc 66 | if: matrix.target == 'x86_64-unknown-linux-musl' 67 | uses: awalsh128/cache-apt-pkgs-action@v1 68 | with: 69 | packages: musl-tools # provides musl-gcc 70 | version: 1.0 71 | 72 | - name: install musl-target 73 | if: matrix.target == 'x86_64-unknown-linux-musl' 74 | run: rustup target add x86_64-unknown-linux-musl 75 | 76 | - name: build_${{ matrix.target }}_release_binary 77 | shell: bash 78 | run: cargo build --target=${{ matrix.target }} --release 79 | 80 | - name: pack_archive_macos 81 | if: matrix.os == 'macos-13' || matrix.os == 'macos-latest' 82 | shell: bash 83 | run: | 84 | cp ./target/${{ matrix.target }}/release/cloudwatch-log-redirector ${{ steps.set_output.outputs.subfolder }} 85 | gtar --create --gzip --file=${{ steps.set_output.outputs.archive }} ${{ steps.set_output.outputs.subfolder }} 86 | 87 | - name: pack_archive_linux 88 | if: matrix.os == 'ubuntu-latest' 89 | shell: bash 90 | run: | 91 | cp target/${{ matrix.target }}/release/cloudwatch-log-redirector ${{ steps.set_output.outputs.subfolder }} 92 | tar --create --gzip --file=${{ steps.set_output.outputs.archive }} ${{ steps.set_output.outputs.subfolder }} 93 | 94 | - name: pack_archive_windows 95 | if: matrix.os == 'windows-latest' 96 | shell: bash 97 | run: | 98 | cp target/${{ matrix.target }}/release/cloudwatch-log-redirector.exe ./${{ steps.set_output.outputs.subfolder }} 99 | 7z a -tzip ${{ steps.set_output.outputs.archive }} ${{ steps.set_output.outputs.subfolder }} 100 | 101 | - name: upload_artifact 102 | uses: actions/upload-release-asset@v1.0.2 103 | env: 104 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 105 | with: 106 | upload_url: ${{ github.event.release.upload_url }} 107 | asset_path: ./${{ steps.set_output.outputs.archive }} 108 | asset_name: ${{ steps.set_output.outputs.archive }} 109 | asset_content_type: application/gzip -------------------------------------------------------------------------------- /.github/workflows/rust.yml: -------------------------------------------------------------------------------- 1 | name: "Test Suite" 2 | on: 3 | push: 4 | pull_request: 5 | 6 | jobs: 7 | test: 8 | name: cargo test 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v4 12 | - uses: actions-rust-lang/setup-rust-toolchain@v1 13 | - run: cargo test --all-features 14 | 15 | # Check formatting with rustfmt 16 | formatting: 17 | name: cargo fmt 18 | runs-on: ubuntu-latest 19 | steps: 20 | - uses: actions/checkout@v4 21 | # Ensure rustfmt is installed and setup problem matcher 22 | - uses: actions-rust-lang/setup-rust-toolchain@v1 23 | with: 24 | components: rustfmt 25 | - name: Rustfmt Check 26 | uses: actions-rust-lang/rustfmt@v1 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.3" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "anstream" 31 | version = "0.6.18" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 34 | dependencies = [ 35 | "anstyle", 36 | "anstyle-parse", 37 | "anstyle-query", 38 | "anstyle-wincon", 39 | "colorchoice", 40 | "is_terminal_polyfill", 41 | "utf8parse", 42 | ] 43 | 44 | [[package]] 45 | name = "anstyle" 46 | version = "1.0.10" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 49 | 50 | [[package]] 51 | name = "anstyle-parse" 52 | version = "0.2.6" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 55 | dependencies = [ 56 | "utf8parse", 57 | ] 58 | 59 | [[package]] 60 | name = "anstyle-query" 61 | version = "1.1.2" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 64 | dependencies = [ 65 | "windows-sys 0.59.0", 66 | ] 67 | 68 | [[package]] 69 | name = "anstyle-wincon" 70 | version = "3.0.7" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" 73 | dependencies = [ 74 | "anstyle", 75 | "once_cell", 76 | "windows-sys 0.59.0", 77 | ] 78 | 79 | [[package]] 80 | name = "atomic-waker" 81 | version = "1.1.2" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 84 | 85 | [[package]] 86 | name = "autocfg" 87 | version = "1.4.0" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 90 | 91 | [[package]] 92 | name = "aws-config" 93 | version = "1.6.1" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "8c39646d1a6b51240a1a23bb57ea4eebede7e16fbc237fdc876980233dcecb4f" 96 | dependencies = [ 97 | "aws-credential-types", 98 | "aws-runtime", 99 | "aws-sdk-sso", 100 | "aws-sdk-ssooidc", 101 | "aws-sdk-sts", 102 | "aws-smithy-async", 103 | "aws-smithy-http", 104 | "aws-smithy-json", 105 | "aws-smithy-runtime", 106 | "aws-smithy-runtime-api", 107 | "aws-smithy-types", 108 | "aws-types", 109 | "bytes", 110 | "fastrand", 111 | "hex", 112 | "http 1.3.1", 113 | "ring", 114 | "time", 115 | "tokio", 116 | "tracing", 117 | "url", 118 | "zeroize", 119 | ] 120 | 121 | [[package]] 122 | name = "aws-credential-types" 123 | version = "1.2.2" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "4471bef4c22a06d2c7a1b6492493d3fdf24a805323109d6874f9c94d5906ac14" 126 | dependencies = [ 127 | "aws-smithy-async", 128 | "aws-smithy-runtime-api", 129 | "aws-smithy-types", 130 | "zeroize", 131 | ] 132 | 133 | [[package]] 134 | name = "aws-lc-rs" 135 | version = "1.13.0" 136 | source = "registry+https://github.com/rust-lang/crates.io-index" 137 | checksum = "19b756939cb2f8dc900aa6dcd505e6e2428e9cae7ff7b028c49e3946efa70878" 138 | dependencies = [ 139 | "aws-lc-sys", 140 | "zeroize", 141 | ] 142 | 143 | [[package]] 144 | name = "aws-lc-sys" 145 | version = "0.28.1" 146 | source = "registry+https://github.com/rust-lang/crates.io-index" 147 | checksum = "0ddeb19ee86cb16ecfc871e5b0660aff6285760957aaedda6284cf0e790d3769" 148 | dependencies = [ 149 | "bindgen", 150 | "cc", 151 | "cmake", 152 | "dunce", 153 | "fs_extra", 154 | ] 155 | 156 | [[package]] 157 | name = "aws-runtime" 158 | version = "1.5.6" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | checksum = "0aff45ffe35196e593ea3b9dd65b320e51e2dda95aff4390bc459e461d09c6ad" 161 | dependencies = [ 162 | "aws-credential-types", 163 | "aws-sigv4", 164 | "aws-smithy-async", 165 | "aws-smithy-eventstream", 166 | "aws-smithy-http", 167 | "aws-smithy-runtime", 168 | "aws-smithy-runtime-api", 169 | "aws-smithy-types", 170 | "aws-types", 171 | "bytes", 172 | "fastrand", 173 | "http 0.2.12", 174 | "http-body 0.4.6", 175 | "once_cell", 176 | "percent-encoding", 177 | "pin-project-lite", 178 | "tracing", 179 | "uuid", 180 | ] 181 | 182 | [[package]] 183 | name = "aws-sdk-cloudwatchlogs" 184 | version = "1.76.0" 185 | source = "registry+https://github.com/rust-lang/crates.io-index" 186 | checksum = "3b7a8df7f19f2ff90191c905fefb8cf0ff512ad7c2cc92c422240ff5b114750c" 187 | dependencies = [ 188 | "aws-credential-types", 189 | "aws-runtime", 190 | "aws-smithy-async", 191 | "aws-smithy-eventstream", 192 | "aws-smithy-http", 193 | "aws-smithy-json", 194 | "aws-smithy-runtime", 195 | "aws-smithy-runtime-api", 196 | "aws-smithy-types", 197 | "aws-types", 198 | "bytes", 199 | "fastrand", 200 | "http 0.2.12", 201 | "once_cell", 202 | "regex-lite", 203 | "tracing", 204 | ] 205 | 206 | [[package]] 207 | name = "aws-sdk-sso" 208 | version = "1.64.0" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "02d4bdb0e5f80f0689e61c77ab678b2b9304af329616af38aef5b6b967b8e736" 211 | dependencies = [ 212 | "aws-credential-types", 213 | "aws-runtime", 214 | "aws-smithy-async", 215 | "aws-smithy-http", 216 | "aws-smithy-json", 217 | "aws-smithy-runtime", 218 | "aws-smithy-runtime-api", 219 | "aws-smithy-types", 220 | "aws-types", 221 | "bytes", 222 | "fastrand", 223 | "http 0.2.12", 224 | "once_cell", 225 | "regex-lite", 226 | "tracing", 227 | ] 228 | 229 | [[package]] 230 | name = "aws-sdk-ssooidc" 231 | version = "1.65.0" 232 | source = "registry+https://github.com/rust-lang/crates.io-index" 233 | checksum = "acbbb3ce8da257aedbccdcb1aadafbbb6a5fe9adf445db0e1ea897bdc7e22d08" 234 | dependencies = [ 235 | "aws-credential-types", 236 | "aws-runtime", 237 | "aws-smithy-async", 238 | "aws-smithy-http", 239 | "aws-smithy-json", 240 | "aws-smithy-runtime", 241 | "aws-smithy-runtime-api", 242 | "aws-smithy-types", 243 | "aws-types", 244 | "bytes", 245 | "fastrand", 246 | "http 0.2.12", 247 | "once_cell", 248 | "regex-lite", 249 | "tracing", 250 | ] 251 | 252 | [[package]] 253 | name = "aws-sdk-sts" 254 | version = "1.65.0" 255 | source = "registry+https://github.com/rust-lang/crates.io-index" 256 | checksum = "96a78a8f50a1630db757b60f679c8226a8a70ee2ab5f5e6e51dc67f6c61c7cfd" 257 | dependencies = [ 258 | "aws-credential-types", 259 | "aws-runtime", 260 | "aws-smithy-async", 261 | "aws-smithy-http", 262 | "aws-smithy-json", 263 | "aws-smithy-query", 264 | "aws-smithy-runtime", 265 | "aws-smithy-runtime-api", 266 | "aws-smithy-types", 267 | "aws-smithy-xml", 268 | "aws-types", 269 | "fastrand", 270 | "http 0.2.12", 271 | "once_cell", 272 | "regex-lite", 273 | "tracing", 274 | ] 275 | 276 | [[package]] 277 | name = "aws-sigv4" 278 | version = "1.3.0" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | checksum = "69d03c3c05ff80d54ff860fe38c726f6f494c639ae975203a101335f223386db" 281 | dependencies = [ 282 | "aws-credential-types", 283 | "aws-smithy-eventstream", 284 | "aws-smithy-http", 285 | "aws-smithy-runtime-api", 286 | "aws-smithy-types", 287 | "bytes", 288 | "form_urlencoded", 289 | "hex", 290 | "hmac", 291 | "http 0.2.12", 292 | "http 1.3.1", 293 | "once_cell", 294 | "percent-encoding", 295 | "sha2", 296 | "time", 297 | "tracing", 298 | ] 299 | 300 | [[package]] 301 | name = "aws-smithy-async" 302 | version = "1.2.5" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "1e190749ea56f8c42bf15dd76c65e14f8f765233e6df9b0506d9d934ebef867c" 305 | dependencies = [ 306 | "futures-util", 307 | "pin-project-lite", 308 | "tokio", 309 | ] 310 | 311 | [[package]] 312 | name = "aws-smithy-eventstream" 313 | version = "0.60.8" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "7c45d3dddac16c5c59d553ece225a88870cf81b7b813c9cc17b78cf4685eac7a" 316 | dependencies = [ 317 | "aws-smithy-types", 318 | "bytes", 319 | "crc32fast", 320 | ] 321 | 322 | [[package]] 323 | name = "aws-smithy-http" 324 | version = "0.62.0" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "c5949124d11e538ca21142d1fba61ab0a2a2c1bc3ed323cdb3e4b878bfb83166" 327 | dependencies = [ 328 | "aws-smithy-eventstream", 329 | "aws-smithy-runtime-api", 330 | "aws-smithy-types", 331 | "bytes", 332 | "bytes-utils", 333 | "futures-core", 334 | "http 0.2.12", 335 | "http 1.3.1", 336 | "http-body 0.4.6", 337 | "once_cell", 338 | "percent-encoding", 339 | "pin-project-lite", 340 | "pin-utils", 341 | "tracing", 342 | ] 343 | 344 | [[package]] 345 | name = "aws-smithy-http-client" 346 | version = "1.0.1" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "8aff1159006441d02e57204bf57a1b890ba68bedb6904ffd2873c1c4c11c546b" 349 | dependencies = [ 350 | "aws-smithy-async", 351 | "aws-smithy-runtime-api", 352 | "aws-smithy-types", 353 | "h2 0.4.9", 354 | "http 0.2.12", 355 | "http 1.3.1", 356 | "http-body 0.4.6", 357 | "hyper 0.14.32", 358 | "hyper 1.6.0", 359 | "hyper-rustls 0.24.2", 360 | "hyper-rustls 0.27.5", 361 | "hyper-util", 362 | "pin-project-lite", 363 | "rustls 0.21.12", 364 | "rustls 0.23.26", 365 | "rustls-native-certs 0.8.1", 366 | "rustls-pki-types", 367 | "tokio", 368 | "tower", 369 | "tracing", 370 | ] 371 | 372 | [[package]] 373 | name = "aws-smithy-json" 374 | version = "0.61.3" 375 | source = "registry+https://github.com/rust-lang/crates.io-index" 376 | checksum = "92144e45819cae7dc62af23eac5a038a58aa544432d2102609654376a900bd07" 377 | dependencies = [ 378 | "aws-smithy-types", 379 | ] 380 | 381 | [[package]] 382 | name = "aws-smithy-observability" 383 | version = "0.1.2" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "445d065e76bc1ef54963db400319f1dd3ebb3e0a74af20f7f7630625b0cc7cc0" 386 | dependencies = [ 387 | "aws-smithy-runtime-api", 388 | "once_cell", 389 | ] 390 | 391 | [[package]] 392 | name = "aws-smithy-query" 393 | version = "0.60.7" 394 | source = "registry+https://github.com/rust-lang/crates.io-index" 395 | checksum = "f2fbd61ceb3fe8a1cb7352e42689cec5335833cd9f94103a61e98f9bb61c64bb" 396 | dependencies = [ 397 | "aws-smithy-types", 398 | "urlencoding", 399 | ] 400 | 401 | [[package]] 402 | name = "aws-smithy-runtime" 403 | version = "1.8.1" 404 | source = "registry+https://github.com/rust-lang/crates.io-index" 405 | checksum = "0152749e17ce4d1b47c7747bdfec09dac1ccafdcbc741ebf9daa2a373356730f" 406 | dependencies = [ 407 | "aws-smithy-async", 408 | "aws-smithy-http", 409 | "aws-smithy-http-client", 410 | "aws-smithy-observability", 411 | "aws-smithy-runtime-api", 412 | "aws-smithy-types", 413 | "bytes", 414 | "fastrand", 415 | "http 0.2.12", 416 | "http 1.3.1", 417 | "http-body 0.4.6", 418 | "http-body 1.0.1", 419 | "once_cell", 420 | "pin-project-lite", 421 | "pin-utils", 422 | "tokio", 423 | "tracing", 424 | ] 425 | 426 | [[package]] 427 | name = "aws-smithy-runtime-api" 428 | version = "1.7.4" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | checksum = "3da37cf5d57011cb1753456518ec76e31691f1f474b73934a284eb2a1c76510f" 431 | dependencies = [ 432 | "aws-smithy-async", 433 | "aws-smithy-types", 434 | "bytes", 435 | "http 0.2.12", 436 | "http 1.3.1", 437 | "pin-project-lite", 438 | "tokio", 439 | "tracing", 440 | "zeroize", 441 | ] 442 | 443 | [[package]] 444 | name = "aws-smithy-types" 445 | version = "1.3.0" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "836155caafba616c0ff9b07944324785de2ab016141c3550bd1c07882f8cee8f" 448 | dependencies = [ 449 | "base64-simd", 450 | "bytes", 451 | "bytes-utils", 452 | "futures-core", 453 | "http 0.2.12", 454 | "http 1.3.1", 455 | "http-body 0.4.6", 456 | "http-body 1.0.1", 457 | "http-body-util", 458 | "itoa", 459 | "num-integer", 460 | "pin-project-lite", 461 | "pin-utils", 462 | "ryu", 463 | "serde", 464 | "time", 465 | "tokio", 466 | "tokio-util", 467 | ] 468 | 469 | [[package]] 470 | name = "aws-smithy-xml" 471 | version = "0.60.9" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "ab0b0166827aa700d3dc519f72f8b3a91c35d0b8d042dc5d643a91e6f80648fc" 474 | dependencies = [ 475 | "xmlparser", 476 | ] 477 | 478 | [[package]] 479 | name = "aws-types" 480 | version = "1.3.6" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "3873f8deed8927ce8d04487630dc9ff73193bab64742a61d050e57a68dec4125" 483 | dependencies = [ 484 | "aws-credential-types", 485 | "aws-smithy-async", 486 | "aws-smithy-runtime-api", 487 | "aws-smithy-types", 488 | "rustc_version", 489 | "tracing", 490 | ] 491 | 492 | [[package]] 493 | name = "backtrace" 494 | version = "0.3.74" 495 | source = "registry+https://github.com/rust-lang/crates.io-index" 496 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 497 | dependencies = [ 498 | "addr2line", 499 | "cfg-if", 500 | "libc", 501 | "miniz_oxide", 502 | "object", 503 | "rustc-demangle", 504 | "windows-targets", 505 | ] 506 | 507 | [[package]] 508 | name = "base64" 509 | version = "0.21.7" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 512 | 513 | [[package]] 514 | name = "base64-simd" 515 | version = "0.8.0" 516 | source = "registry+https://github.com/rust-lang/crates.io-index" 517 | checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" 518 | dependencies = [ 519 | "outref", 520 | "vsimd", 521 | ] 522 | 523 | [[package]] 524 | name = "bindgen" 525 | version = "0.69.5" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" 528 | dependencies = [ 529 | "bitflags", 530 | "cexpr", 531 | "clang-sys", 532 | "itertools", 533 | "lazy_static", 534 | "lazycell", 535 | "log", 536 | "prettyplease", 537 | "proc-macro2", 538 | "quote", 539 | "regex", 540 | "rustc-hash", 541 | "shlex", 542 | "syn", 543 | "which", 544 | ] 545 | 546 | [[package]] 547 | name = "bitflags" 548 | version = "2.9.0" 549 | source = "registry+https://github.com/rust-lang/crates.io-index" 550 | checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 551 | 552 | [[package]] 553 | name = "block-buffer" 554 | version = "0.10.4" 555 | source = "registry+https://github.com/rust-lang/crates.io-index" 556 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 557 | dependencies = [ 558 | "generic-array", 559 | ] 560 | 561 | [[package]] 562 | name = "bytes" 563 | version = "1.10.1" 564 | source = "registry+https://github.com/rust-lang/crates.io-index" 565 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 566 | 567 | [[package]] 568 | name = "bytes-utils" 569 | version = "0.1.4" 570 | source = "registry+https://github.com/rust-lang/crates.io-index" 571 | checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" 572 | dependencies = [ 573 | "bytes", 574 | "either", 575 | ] 576 | 577 | [[package]] 578 | name = "cc" 579 | version = "1.2.19" 580 | source = "registry+https://github.com/rust-lang/crates.io-index" 581 | checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" 582 | dependencies = [ 583 | "jobserver", 584 | "libc", 585 | "shlex", 586 | ] 587 | 588 | [[package]] 589 | name = "cexpr" 590 | version = "0.6.0" 591 | source = "registry+https://github.com/rust-lang/crates.io-index" 592 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 593 | dependencies = [ 594 | "nom", 595 | ] 596 | 597 | [[package]] 598 | name = "cfg-if" 599 | version = "1.0.0" 600 | source = "registry+https://github.com/rust-lang/crates.io-index" 601 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 602 | 603 | [[package]] 604 | name = "cfg_aliases" 605 | version = "0.2.1" 606 | source = "registry+https://github.com/rust-lang/crates.io-index" 607 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 608 | 609 | [[package]] 610 | name = "clang-sys" 611 | version = "1.8.1" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 614 | dependencies = [ 615 | "glob", 616 | "libc", 617 | "libloading", 618 | ] 619 | 620 | [[package]] 621 | name = "clap" 622 | version = "4.5.37" 623 | source = "registry+https://github.com/rust-lang/crates.io-index" 624 | checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071" 625 | dependencies = [ 626 | "clap_builder", 627 | "clap_derive", 628 | ] 629 | 630 | [[package]] 631 | name = "clap_builder" 632 | version = "4.5.37" 633 | source = "registry+https://github.com/rust-lang/crates.io-index" 634 | checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" 635 | dependencies = [ 636 | "anstream", 637 | "anstyle", 638 | "clap_lex", 639 | "strsim", 640 | ] 641 | 642 | [[package]] 643 | name = "clap_derive" 644 | version = "4.5.32" 645 | source = "registry+https://github.com/rust-lang/crates.io-index" 646 | checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" 647 | dependencies = [ 648 | "heck", 649 | "proc-macro2", 650 | "quote", 651 | "syn", 652 | ] 653 | 654 | [[package]] 655 | name = "clap_lex" 656 | version = "0.7.4" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 659 | 660 | [[package]] 661 | name = "cloudwatch-log-redirector" 662 | version = "0.1.11" 663 | dependencies = [ 664 | "aws-config", 665 | "aws-sdk-cloudwatchlogs", 666 | "clap", 667 | "futures", 668 | "nix", 669 | "signal-hook", 670 | "signal-hook-tokio", 671 | "tokio", 672 | "tokio-stream", 673 | "tracing", 674 | "tracing-subscriber", 675 | ] 676 | 677 | [[package]] 678 | name = "cmake" 679 | version = "0.1.54" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" 682 | dependencies = [ 683 | "cc", 684 | ] 685 | 686 | [[package]] 687 | name = "colorchoice" 688 | version = "1.0.3" 689 | source = "registry+https://github.com/rust-lang/crates.io-index" 690 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 691 | 692 | [[package]] 693 | name = "core-foundation" 694 | version = "0.9.4" 695 | source = "registry+https://github.com/rust-lang/crates.io-index" 696 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 697 | dependencies = [ 698 | "core-foundation-sys", 699 | "libc", 700 | ] 701 | 702 | [[package]] 703 | name = "core-foundation" 704 | version = "0.10.0" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" 707 | dependencies = [ 708 | "core-foundation-sys", 709 | "libc", 710 | ] 711 | 712 | [[package]] 713 | name = "core-foundation-sys" 714 | version = "0.8.7" 715 | source = "registry+https://github.com/rust-lang/crates.io-index" 716 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 717 | 718 | [[package]] 719 | name = "cpufeatures" 720 | version = "0.2.17" 721 | source = "registry+https://github.com/rust-lang/crates.io-index" 722 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 723 | dependencies = [ 724 | "libc", 725 | ] 726 | 727 | [[package]] 728 | name = "crc32fast" 729 | version = "1.4.2" 730 | source = "registry+https://github.com/rust-lang/crates.io-index" 731 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 732 | dependencies = [ 733 | "cfg-if", 734 | ] 735 | 736 | [[package]] 737 | name = "crypto-common" 738 | version = "0.1.6" 739 | source = "registry+https://github.com/rust-lang/crates.io-index" 740 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 741 | dependencies = [ 742 | "generic-array", 743 | "typenum", 744 | ] 745 | 746 | [[package]] 747 | name = "deranged" 748 | version = "0.4.0" 749 | source = "registry+https://github.com/rust-lang/crates.io-index" 750 | checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" 751 | dependencies = [ 752 | "powerfmt", 753 | ] 754 | 755 | [[package]] 756 | name = "digest" 757 | version = "0.10.7" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 760 | dependencies = [ 761 | "block-buffer", 762 | "crypto-common", 763 | "subtle", 764 | ] 765 | 766 | [[package]] 767 | name = "displaydoc" 768 | version = "0.2.5" 769 | source = "registry+https://github.com/rust-lang/crates.io-index" 770 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 771 | dependencies = [ 772 | "proc-macro2", 773 | "quote", 774 | "syn", 775 | ] 776 | 777 | [[package]] 778 | name = "dunce" 779 | version = "1.0.5" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" 782 | 783 | [[package]] 784 | name = "either" 785 | version = "1.15.0" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 788 | 789 | [[package]] 790 | name = "equivalent" 791 | version = "1.0.2" 792 | source = "registry+https://github.com/rust-lang/crates.io-index" 793 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 794 | 795 | [[package]] 796 | name = "errno" 797 | version = "0.3.11" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" 800 | dependencies = [ 801 | "libc", 802 | "windows-sys 0.59.0", 803 | ] 804 | 805 | [[package]] 806 | name = "fastrand" 807 | version = "2.3.0" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 810 | 811 | [[package]] 812 | name = "fnv" 813 | version = "1.0.7" 814 | source = "registry+https://github.com/rust-lang/crates.io-index" 815 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 816 | 817 | [[package]] 818 | name = "form_urlencoded" 819 | version = "1.2.1" 820 | source = "registry+https://github.com/rust-lang/crates.io-index" 821 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 822 | dependencies = [ 823 | "percent-encoding", 824 | ] 825 | 826 | [[package]] 827 | name = "fs_extra" 828 | version = "1.3.0" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" 831 | 832 | [[package]] 833 | name = "futures" 834 | version = "0.3.31" 835 | source = "registry+https://github.com/rust-lang/crates.io-index" 836 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 837 | dependencies = [ 838 | "futures-channel", 839 | "futures-core", 840 | "futures-executor", 841 | "futures-io", 842 | "futures-sink", 843 | "futures-task", 844 | "futures-util", 845 | ] 846 | 847 | [[package]] 848 | name = "futures-channel" 849 | version = "0.3.31" 850 | source = "registry+https://github.com/rust-lang/crates.io-index" 851 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 852 | dependencies = [ 853 | "futures-core", 854 | "futures-sink", 855 | ] 856 | 857 | [[package]] 858 | name = "futures-core" 859 | version = "0.3.31" 860 | source = "registry+https://github.com/rust-lang/crates.io-index" 861 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 862 | 863 | [[package]] 864 | name = "futures-executor" 865 | version = "0.3.31" 866 | source = "registry+https://github.com/rust-lang/crates.io-index" 867 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 868 | dependencies = [ 869 | "futures-core", 870 | "futures-task", 871 | "futures-util", 872 | ] 873 | 874 | [[package]] 875 | name = "futures-io" 876 | version = "0.3.31" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 879 | 880 | [[package]] 881 | name = "futures-macro" 882 | version = "0.3.31" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 885 | dependencies = [ 886 | "proc-macro2", 887 | "quote", 888 | "syn", 889 | ] 890 | 891 | [[package]] 892 | name = "futures-sink" 893 | version = "0.3.31" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 896 | 897 | [[package]] 898 | name = "futures-task" 899 | version = "0.3.31" 900 | source = "registry+https://github.com/rust-lang/crates.io-index" 901 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 902 | 903 | [[package]] 904 | name = "futures-util" 905 | version = "0.3.31" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 908 | dependencies = [ 909 | "futures-channel", 910 | "futures-core", 911 | "futures-io", 912 | "futures-macro", 913 | "futures-sink", 914 | "futures-task", 915 | "memchr", 916 | "pin-project-lite", 917 | "pin-utils", 918 | "slab", 919 | ] 920 | 921 | [[package]] 922 | name = "generic-array" 923 | version = "0.14.7" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 926 | dependencies = [ 927 | "typenum", 928 | "version_check", 929 | ] 930 | 931 | [[package]] 932 | name = "getrandom" 933 | version = "0.2.15" 934 | source = "registry+https://github.com/rust-lang/crates.io-index" 935 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 936 | dependencies = [ 937 | "cfg-if", 938 | "libc", 939 | "wasi 0.11.0+wasi-snapshot-preview1", 940 | ] 941 | 942 | [[package]] 943 | name = "getrandom" 944 | version = "0.3.2" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" 947 | dependencies = [ 948 | "cfg-if", 949 | "libc", 950 | "r-efi", 951 | "wasi 0.14.2+wasi-0.2.4", 952 | ] 953 | 954 | [[package]] 955 | name = "gimli" 956 | version = "0.31.1" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 959 | 960 | [[package]] 961 | name = "glob" 962 | version = "0.3.2" 963 | source = "registry+https://github.com/rust-lang/crates.io-index" 964 | checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 965 | 966 | [[package]] 967 | name = "h2" 968 | version = "0.3.26" 969 | source = "registry+https://github.com/rust-lang/crates.io-index" 970 | checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 971 | dependencies = [ 972 | "bytes", 973 | "fnv", 974 | "futures-core", 975 | "futures-sink", 976 | "futures-util", 977 | "http 0.2.12", 978 | "indexmap", 979 | "slab", 980 | "tokio", 981 | "tokio-util", 982 | "tracing", 983 | ] 984 | 985 | [[package]] 986 | name = "h2" 987 | version = "0.4.9" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" 990 | dependencies = [ 991 | "atomic-waker", 992 | "bytes", 993 | "fnv", 994 | "futures-core", 995 | "futures-sink", 996 | "http 1.3.1", 997 | "indexmap", 998 | "slab", 999 | "tokio", 1000 | "tokio-util", 1001 | "tracing", 1002 | ] 1003 | 1004 | [[package]] 1005 | name = "hashbrown" 1006 | version = "0.15.2" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 1009 | 1010 | [[package]] 1011 | name = "heck" 1012 | version = "0.5.0" 1013 | source = "registry+https://github.com/rust-lang/crates.io-index" 1014 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 1015 | 1016 | [[package]] 1017 | name = "hex" 1018 | version = "0.4.3" 1019 | source = "registry+https://github.com/rust-lang/crates.io-index" 1020 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1021 | 1022 | [[package]] 1023 | name = "hmac" 1024 | version = "0.12.1" 1025 | source = "registry+https://github.com/rust-lang/crates.io-index" 1026 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1027 | dependencies = [ 1028 | "digest", 1029 | ] 1030 | 1031 | [[package]] 1032 | name = "home" 1033 | version = "0.5.11" 1034 | source = "registry+https://github.com/rust-lang/crates.io-index" 1035 | checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 1036 | dependencies = [ 1037 | "windows-sys 0.59.0", 1038 | ] 1039 | 1040 | [[package]] 1041 | name = "http" 1042 | version = "0.2.12" 1043 | source = "registry+https://github.com/rust-lang/crates.io-index" 1044 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 1045 | dependencies = [ 1046 | "bytes", 1047 | "fnv", 1048 | "itoa", 1049 | ] 1050 | 1051 | [[package]] 1052 | name = "http" 1053 | version = "1.3.1" 1054 | source = "registry+https://github.com/rust-lang/crates.io-index" 1055 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 1056 | dependencies = [ 1057 | "bytes", 1058 | "fnv", 1059 | "itoa", 1060 | ] 1061 | 1062 | [[package]] 1063 | name = "http-body" 1064 | version = "0.4.6" 1065 | source = "registry+https://github.com/rust-lang/crates.io-index" 1066 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 1067 | dependencies = [ 1068 | "bytes", 1069 | "http 0.2.12", 1070 | "pin-project-lite", 1071 | ] 1072 | 1073 | [[package]] 1074 | name = "http-body" 1075 | version = "1.0.1" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 1078 | dependencies = [ 1079 | "bytes", 1080 | "http 1.3.1", 1081 | ] 1082 | 1083 | [[package]] 1084 | name = "http-body-util" 1085 | version = "0.1.3" 1086 | source = "registry+https://github.com/rust-lang/crates.io-index" 1087 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 1088 | dependencies = [ 1089 | "bytes", 1090 | "futures-core", 1091 | "http 1.3.1", 1092 | "http-body 1.0.1", 1093 | "pin-project-lite", 1094 | ] 1095 | 1096 | [[package]] 1097 | name = "httparse" 1098 | version = "1.10.1" 1099 | source = "registry+https://github.com/rust-lang/crates.io-index" 1100 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 1101 | 1102 | [[package]] 1103 | name = "httpdate" 1104 | version = "1.0.3" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1107 | 1108 | [[package]] 1109 | name = "hyper" 1110 | version = "0.14.32" 1111 | source = "registry+https://github.com/rust-lang/crates.io-index" 1112 | checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" 1113 | dependencies = [ 1114 | "bytes", 1115 | "futures-channel", 1116 | "futures-core", 1117 | "futures-util", 1118 | "h2 0.3.26", 1119 | "http 0.2.12", 1120 | "http-body 0.4.6", 1121 | "httparse", 1122 | "httpdate", 1123 | "itoa", 1124 | "pin-project-lite", 1125 | "socket2", 1126 | "tokio", 1127 | "tower-service", 1128 | "tracing", 1129 | "want", 1130 | ] 1131 | 1132 | [[package]] 1133 | name = "hyper" 1134 | version = "1.6.0" 1135 | source = "registry+https://github.com/rust-lang/crates.io-index" 1136 | checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 1137 | dependencies = [ 1138 | "bytes", 1139 | "futures-channel", 1140 | "futures-util", 1141 | "h2 0.4.9", 1142 | "http 1.3.1", 1143 | "http-body 1.0.1", 1144 | "httparse", 1145 | "itoa", 1146 | "pin-project-lite", 1147 | "smallvec", 1148 | "tokio", 1149 | "want", 1150 | ] 1151 | 1152 | [[package]] 1153 | name = "hyper-rustls" 1154 | version = "0.24.2" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" 1157 | dependencies = [ 1158 | "futures-util", 1159 | "http 0.2.12", 1160 | "hyper 0.14.32", 1161 | "log", 1162 | "rustls 0.21.12", 1163 | "rustls-native-certs 0.6.3", 1164 | "tokio", 1165 | "tokio-rustls 0.24.1", 1166 | ] 1167 | 1168 | [[package]] 1169 | name = "hyper-rustls" 1170 | version = "0.27.5" 1171 | source = "registry+https://github.com/rust-lang/crates.io-index" 1172 | checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" 1173 | dependencies = [ 1174 | "futures-util", 1175 | "http 1.3.1", 1176 | "hyper 1.6.0", 1177 | "hyper-util", 1178 | "rustls 0.23.26", 1179 | "rustls-native-certs 0.8.1", 1180 | "rustls-pki-types", 1181 | "tokio", 1182 | "tokio-rustls 0.26.2", 1183 | "tower-service", 1184 | ] 1185 | 1186 | [[package]] 1187 | name = "hyper-util" 1188 | version = "0.1.11" 1189 | source = "registry+https://github.com/rust-lang/crates.io-index" 1190 | checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" 1191 | dependencies = [ 1192 | "bytes", 1193 | "futures-channel", 1194 | "futures-util", 1195 | "http 1.3.1", 1196 | "http-body 1.0.1", 1197 | "hyper 1.6.0", 1198 | "libc", 1199 | "pin-project-lite", 1200 | "socket2", 1201 | "tokio", 1202 | "tower-service", 1203 | "tracing", 1204 | ] 1205 | 1206 | [[package]] 1207 | name = "icu_collections" 1208 | version = "1.5.0" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 1211 | dependencies = [ 1212 | "displaydoc", 1213 | "yoke", 1214 | "zerofrom", 1215 | "zerovec", 1216 | ] 1217 | 1218 | [[package]] 1219 | name = "icu_locid" 1220 | version = "1.5.0" 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" 1222 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 1223 | dependencies = [ 1224 | "displaydoc", 1225 | "litemap", 1226 | "tinystr", 1227 | "writeable", 1228 | "zerovec", 1229 | ] 1230 | 1231 | [[package]] 1232 | name = "icu_locid_transform" 1233 | version = "1.5.0" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 1236 | dependencies = [ 1237 | "displaydoc", 1238 | "icu_locid", 1239 | "icu_locid_transform_data", 1240 | "icu_provider", 1241 | "tinystr", 1242 | "zerovec", 1243 | ] 1244 | 1245 | [[package]] 1246 | name = "icu_locid_transform_data" 1247 | version = "1.5.1" 1248 | source = "registry+https://github.com/rust-lang/crates.io-index" 1249 | checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" 1250 | 1251 | [[package]] 1252 | name = "icu_normalizer" 1253 | version = "1.5.0" 1254 | source = "registry+https://github.com/rust-lang/crates.io-index" 1255 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 1256 | dependencies = [ 1257 | "displaydoc", 1258 | "icu_collections", 1259 | "icu_normalizer_data", 1260 | "icu_properties", 1261 | "icu_provider", 1262 | "smallvec", 1263 | "utf16_iter", 1264 | "utf8_iter", 1265 | "write16", 1266 | "zerovec", 1267 | ] 1268 | 1269 | [[package]] 1270 | name = "icu_normalizer_data" 1271 | version = "1.5.1" 1272 | source = "registry+https://github.com/rust-lang/crates.io-index" 1273 | checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" 1274 | 1275 | [[package]] 1276 | name = "icu_properties" 1277 | version = "1.5.1" 1278 | source = "registry+https://github.com/rust-lang/crates.io-index" 1279 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 1280 | dependencies = [ 1281 | "displaydoc", 1282 | "icu_collections", 1283 | "icu_locid_transform", 1284 | "icu_properties_data", 1285 | "icu_provider", 1286 | "tinystr", 1287 | "zerovec", 1288 | ] 1289 | 1290 | [[package]] 1291 | name = "icu_properties_data" 1292 | version = "1.5.1" 1293 | source = "registry+https://github.com/rust-lang/crates.io-index" 1294 | checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" 1295 | 1296 | [[package]] 1297 | name = "icu_provider" 1298 | version = "1.5.0" 1299 | source = "registry+https://github.com/rust-lang/crates.io-index" 1300 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 1301 | dependencies = [ 1302 | "displaydoc", 1303 | "icu_locid", 1304 | "icu_provider_macros", 1305 | "stable_deref_trait", 1306 | "tinystr", 1307 | "writeable", 1308 | "yoke", 1309 | "zerofrom", 1310 | "zerovec", 1311 | ] 1312 | 1313 | [[package]] 1314 | name = "icu_provider_macros" 1315 | version = "1.5.0" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 1318 | dependencies = [ 1319 | "proc-macro2", 1320 | "quote", 1321 | "syn", 1322 | ] 1323 | 1324 | [[package]] 1325 | name = "idna" 1326 | version = "1.0.3" 1327 | source = "registry+https://github.com/rust-lang/crates.io-index" 1328 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1329 | dependencies = [ 1330 | "idna_adapter", 1331 | "smallvec", 1332 | "utf8_iter", 1333 | ] 1334 | 1335 | [[package]] 1336 | name = "idna_adapter" 1337 | version = "1.2.0" 1338 | source = "registry+https://github.com/rust-lang/crates.io-index" 1339 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 1340 | dependencies = [ 1341 | "icu_normalizer", 1342 | "icu_properties", 1343 | ] 1344 | 1345 | [[package]] 1346 | name = "indexmap" 1347 | version = "2.9.0" 1348 | source = "registry+https://github.com/rust-lang/crates.io-index" 1349 | checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 1350 | dependencies = [ 1351 | "equivalent", 1352 | "hashbrown", 1353 | ] 1354 | 1355 | [[package]] 1356 | name = "is_terminal_polyfill" 1357 | version = "1.70.1" 1358 | source = "registry+https://github.com/rust-lang/crates.io-index" 1359 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 1360 | 1361 | [[package]] 1362 | name = "itertools" 1363 | version = "0.12.1" 1364 | source = "registry+https://github.com/rust-lang/crates.io-index" 1365 | checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 1366 | dependencies = [ 1367 | "either", 1368 | ] 1369 | 1370 | [[package]] 1371 | name = "itoa" 1372 | version = "1.0.15" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 1375 | 1376 | [[package]] 1377 | name = "jobserver" 1378 | version = "0.1.33" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" 1381 | dependencies = [ 1382 | "getrandom 0.3.2", 1383 | "libc", 1384 | ] 1385 | 1386 | [[package]] 1387 | name = "lazy_static" 1388 | version = "1.5.0" 1389 | source = "registry+https://github.com/rust-lang/crates.io-index" 1390 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1391 | 1392 | [[package]] 1393 | name = "lazycell" 1394 | version = "1.3.0" 1395 | source = "registry+https://github.com/rust-lang/crates.io-index" 1396 | checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" 1397 | 1398 | [[package]] 1399 | name = "libc" 1400 | version = "0.2.172" 1401 | source = "registry+https://github.com/rust-lang/crates.io-index" 1402 | checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 1403 | 1404 | [[package]] 1405 | name = "libloading" 1406 | version = "0.8.6" 1407 | source = "registry+https://github.com/rust-lang/crates.io-index" 1408 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 1409 | dependencies = [ 1410 | "cfg-if", 1411 | "windows-targets", 1412 | ] 1413 | 1414 | [[package]] 1415 | name = "linux-raw-sys" 1416 | version = "0.4.15" 1417 | source = "registry+https://github.com/rust-lang/crates.io-index" 1418 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 1419 | 1420 | [[package]] 1421 | name = "litemap" 1422 | version = "0.7.5" 1423 | source = "registry+https://github.com/rust-lang/crates.io-index" 1424 | checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" 1425 | 1426 | [[package]] 1427 | name = "lock_api" 1428 | version = "0.4.12" 1429 | source = "registry+https://github.com/rust-lang/crates.io-index" 1430 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1431 | dependencies = [ 1432 | "autocfg", 1433 | "scopeguard", 1434 | ] 1435 | 1436 | [[package]] 1437 | name = "log" 1438 | version = "0.4.27" 1439 | source = "registry+https://github.com/rust-lang/crates.io-index" 1440 | checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 1441 | 1442 | [[package]] 1443 | name = "memchr" 1444 | version = "2.7.4" 1445 | source = "registry+https://github.com/rust-lang/crates.io-index" 1446 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1447 | 1448 | [[package]] 1449 | name = "minimal-lexical" 1450 | version = "0.2.1" 1451 | source = "registry+https://github.com/rust-lang/crates.io-index" 1452 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1453 | 1454 | [[package]] 1455 | name = "miniz_oxide" 1456 | version = "0.8.8" 1457 | source = "registry+https://github.com/rust-lang/crates.io-index" 1458 | checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" 1459 | dependencies = [ 1460 | "adler2", 1461 | ] 1462 | 1463 | [[package]] 1464 | name = "mio" 1465 | version = "1.0.3" 1466 | source = "registry+https://github.com/rust-lang/crates.io-index" 1467 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 1468 | dependencies = [ 1469 | "libc", 1470 | "wasi 0.11.0+wasi-snapshot-preview1", 1471 | "windows-sys 0.52.0", 1472 | ] 1473 | 1474 | [[package]] 1475 | name = "nix" 1476 | version = "0.30.1" 1477 | source = "registry+https://github.com/rust-lang/crates.io-index" 1478 | checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 1479 | dependencies = [ 1480 | "bitflags", 1481 | "cfg-if", 1482 | "cfg_aliases", 1483 | "libc", 1484 | ] 1485 | 1486 | [[package]] 1487 | name = "nom" 1488 | version = "7.1.3" 1489 | source = "registry+https://github.com/rust-lang/crates.io-index" 1490 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1491 | dependencies = [ 1492 | "memchr", 1493 | "minimal-lexical", 1494 | ] 1495 | 1496 | [[package]] 1497 | name = "nu-ansi-term" 1498 | version = "0.46.0" 1499 | source = "registry+https://github.com/rust-lang/crates.io-index" 1500 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1501 | dependencies = [ 1502 | "overload", 1503 | "winapi", 1504 | ] 1505 | 1506 | [[package]] 1507 | name = "num-conv" 1508 | version = "0.1.0" 1509 | source = "registry+https://github.com/rust-lang/crates.io-index" 1510 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1511 | 1512 | [[package]] 1513 | name = "num-integer" 1514 | version = "0.1.46" 1515 | source = "registry+https://github.com/rust-lang/crates.io-index" 1516 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1517 | dependencies = [ 1518 | "num-traits", 1519 | ] 1520 | 1521 | [[package]] 1522 | name = "num-traits" 1523 | version = "0.2.19" 1524 | source = "registry+https://github.com/rust-lang/crates.io-index" 1525 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1526 | dependencies = [ 1527 | "autocfg", 1528 | ] 1529 | 1530 | [[package]] 1531 | name = "object" 1532 | version = "0.36.7" 1533 | source = "registry+https://github.com/rust-lang/crates.io-index" 1534 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1535 | dependencies = [ 1536 | "memchr", 1537 | ] 1538 | 1539 | [[package]] 1540 | name = "once_cell" 1541 | version = "1.21.3" 1542 | source = "registry+https://github.com/rust-lang/crates.io-index" 1543 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1544 | 1545 | [[package]] 1546 | name = "openssl-probe" 1547 | version = "0.1.6" 1548 | source = "registry+https://github.com/rust-lang/crates.io-index" 1549 | checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 1550 | 1551 | [[package]] 1552 | name = "outref" 1553 | version = "0.5.2" 1554 | source = "registry+https://github.com/rust-lang/crates.io-index" 1555 | checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" 1556 | 1557 | [[package]] 1558 | name = "overload" 1559 | version = "0.1.1" 1560 | source = "registry+https://github.com/rust-lang/crates.io-index" 1561 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1562 | 1563 | [[package]] 1564 | name = "parking_lot" 1565 | version = "0.12.3" 1566 | source = "registry+https://github.com/rust-lang/crates.io-index" 1567 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1568 | dependencies = [ 1569 | "lock_api", 1570 | "parking_lot_core", 1571 | ] 1572 | 1573 | [[package]] 1574 | name = "parking_lot_core" 1575 | version = "0.9.10" 1576 | source = "registry+https://github.com/rust-lang/crates.io-index" 1577 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1578 | dependencies = [ 1579 | "cfg-if", 1580 | "libc", 1581 | "redox_syscall", 1582 | "smallvec", 1583 | "windows-targets", 1584 | ] 1585 | 1586 | [[package]] 1587 | name = "percent-encoding" 1588 | version = "2.3.1" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1591 | 1592 | [[package]] 1593 | name = "pin-project-lite" 1594 | version = "0.2.16" 1595 | source = "registry+https://github.com/rust-lang/crates.io-index" 1596 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1597 | 1598 | [[package]] 1599 | name = "pin-utils" 1600 | version = "0.1.0" 1601 | source = "registry+https://github.com/rust-lang/crates.io-index" 1602 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1603 | 1604 | [[package]] 1605 | name = "powerfmt" 1606 | version = "0.2.0" 1607 | source = "registry+https://github.com/rust-lang/crates.io-index" 1608 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1609 | 1610 | [[package]] 1611 | name = "prettyplease" 1612 | version = "0.2.32" 1613 | source = "registry+https://github.com/rust-lang/crates.io-index" 1614 | checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" 1615 | dependencies = [ 1616 | "proc-macro2", 1617 | "syn", 1618 | ] 1619 | 1620 | [[package]] 1621 | name = "proc-macro2" 1622 | version = "1.0.95" 1623 | source = "registry+https://github.com/rust-lang/crates.io-index" 1624 | checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 1625 | dependencies = [ 1626 | "unicode-ident", 1627 | ] 1628 | 1629 | [[package]] 1630 | name = "quote" 1631 | version = "1.0.40" 1632 | source = "registry+https://github.com/rust-lang/crates.io-index" 1633 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1634 | dependencies = [ 1635 | "proc-macro2", 1636 | ] 1637 | 1638 | [[package]] 1639 | name = "r-efi" 1640 | version = "5.2.0" 1641 | source = "registry+https://github.com/rust-lang/crates.io-index" 1642 | checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 1643 | 1644 | [[package]] 1645 | name = "redox_syscall" 1646 | version = "0.5.11" 1647 | source = "registry+https://github.com/rust-lang/crates.io-index" 1648 | checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" 1649 | dependencies = [ 1650 | "bitflags", 1651 | ] 1652 | 1653 | [[package]] 1654 | name = "regex" 1655 | version = "1.11.1" 1656 | source = "registry+https://github.com/rust-lang/crates.io-index" 1657 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1658 | dependencies = [ 1659 | "aho-corasick", 1660 | "memchr", 1661 | "regex-automata", 1662 | "regex-syntax", 1663 | ] 1664 | 1665 | [[package]] 1666 | name = "regex-automata" 1667 | version = "0.4.9" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1670 | dependencies = [ 1671 | "aho-corasick", 1672 | "memchr", 1673 | "regex-syntax", 1674 | ] 1675 | 1676 | [[package]] 1677 | name = "regex-lite" 1678 | version = "0.1.6" 1679 | source = "registry+https://github.com/rust-lang/crates.io-index" 1680 | checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" 1681 | 1682 | [[package]] 1683 | name = "regex-syntax" 1684 | version = "0.8.5" 1685 | source = "registry+https://github.com/rust-lang/crates.io-index" 1686 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1687 | 1688 | [[package]] 1689 | name = "ring" 1690 | version = "0.17.14" 1691 | source = "registry+https://github.com/rust-lang/crates.io-index" 1692 | checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 1693 | dependencies = [ 1694 | "cc", 1695 | "cfg-if", 1696 | "getrandom 0.2.15", 1697 | "libc", 1698 | "untrusted", 1699 | "windows-sys 0.52.0", 1700 | ] 1701 | 1702 | [[package]] 1703 | name = "rustc-demangle" 1704 | version = "0.1.24" 1705 | source = "registry+https://github.com/rust-lang/crates.io-index" 1706 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1707 | 1708 | [[package]] 1709 | name = "rustc-hash" 1710 | version = "1.1.0" 1711 | source = "registry+https://github.com/rust-lang/crates.io-index" 1712 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1713 | 1714 | [[package]] 1715 | name = "rustc_version" 1716 | version = "0.4.1" 1717 | source = "registry+https://github.com/rust-lang/crates.io-index" 1718 | checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 1719 | dependencies = [ 1720 | "semver", 1721 | ] 1722 | 1723 | [[package]] 1724 | name = "rustix" 1725 | version = "0.38.44" 1726 | source = "registry+https://github.com/rust-lang/crates.io-index" 1727 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 1728 | dependencies = [ 1729 | "bitflags", 1730 | "errno", 1731 | "libc", 1732 | "linux-raw-sys", 1733 | "windows-sys 0.59.0", 1734 | ] 1735 | 1736 | [[package]] 1737 | name = "rustls" 1738 | version = "0.21.12" 1739 | source = "registry+https://github.com/rust-lang/crates.io-index" 1740 | checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" 1741 | dependencies = [ 1742 | "log", 1743 | "ring", 1744 | "rustls-webpki 0.101.7", 1745 | "sct", 1746 | ] 1747 | 1748 | [[package]] 1749 | name = "rustls" 1750 | version = "0.23.26" 1751 | source = "registry+https://github.com/rust-lang/crates.io-index" 1752 | checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" 1753 | dependencies = [ 1754 | "aws-lc-rs", 1755 | "once_cell", 1756 | "rustls-pki-types", 1757 | "rustls-webpki 0.103.1", 1758 | "subtle", 1759 | "zeroize", 1760 | ] 1761 | 1762 | [[package]] 1763 | name = "rustls-native-certs" 1764 | version = "0.6.3" 1765 | source = "registry+https://github.com/rust-lang/crates.io-index" 1766 | checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" 1767 | dependencies = [ 1768 | "openssl-probe", 1769 | "rustls-pemfile", 1770 | "schannel", 1771 | "security-framework 2.11.1", 1772 | ] 1773 | 1774 | [[package]] 1775 | name = "rustls-native-certs" 1776 | version = "0.8.1" 1777 | source = "registry+https://github.com/rust-lang/crates.io-index" 1778 | checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" 1779 | dependencies = [ 1780 | "openssl-probe", 1781 | "rustls-pki-types", 1782 | "schannel", 1783 | "security-framework 3.2.0", 1784 | ] 1785 | 1786 | [[package]] 1787 | name = "rustls-pemfile" 1788 | version = "1.0.4" 1789 | source = "registry+https://github.com/rust-lang/crates.io-index" 1790 | checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 1791 | dependencies = [ 1792 | "base64", 1793 | ] 1794 | 1795 | [[package]] 1796 | name = "rustls-pki-types" 1797 | version = "1.11.0" 1798 | source = "registry+https://github.com/rust-lang/crates.io-index" 1799 | checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" 1800 | 1801 | [[package]] 1802 | name = "rustls-webpki" 1803 | version = "0.101.7" 1804 | source = "registry+https://github.com/rust-lang/crates.io-index" 1805 | checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" 1806 | dependencies = [ 1807 | "ring", 1808 | "untrusted", 1809 | ] 1810 | 1811 | [[package]] 1812 | name = "rustls-webpki" 1813 | version = "0.103.1" 1814 | source = "registry+https://github.com/rust-lang/crates.io-index" 1815 | checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" 1816 | dependencies = [ 1817 | "aws-lc-rs", 1818 | "ring", 1819 | "rustls-pki-types", 1820 | "untrusted", 1821 | ] 1822 | 1823 | [[package]] 1824 | name = "ryu" 1825 | version = "1.0.20" 1826 | source = "registry+https://github.com/rust-lang/crates.io-index" 1827 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1828 | 1829 | [[package]] 1830 | name = "schannel" 1831 | version = "0.1.27" 1832 | source = "registry+https://github.com/rust-lang/crates.io-index" 1833 | checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 1834 | dependencies = [ 1835 | "windows-sys 0.59.0", 1836 | ] 1837 | 1838 | [[package]] 1839 | name = "scopeguard" 1840 | version = "1.2.0" 1841 | source = "registry+https://github.com/rust-lang/crates.io-index" 1842 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1843 | 1844 | [[package]] 1845 | name = "sct" 1846 | version = "0.7.1" 1847 | source = "registry+https://github.com/rust-lang/crates.io-index" 1848 | checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" 1849 | dependencies = [ 1850 | "ring", 1851 | "untrusted", 1852 | ] 1853 | 1854 | [[package]] 1855 | name = "security-framework" 1856 | version = "2.11.1" 1857 | source = "registry+https://github.com/rust-lang/crates.io-index" 1858 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1859 | dependencies = [ 1860 | "bitflags", 1861 | "core-foundation 0.9.4", 1862 | "core-foundation-sys", 1863 | "libc", 1864 | "security-framework-sys", 1865 | ] 1866 | 1867 | [[package]] 1868 | name = "security-framework" 1869 | version = "3.2.0" 1870 | source = "registry+https://github.com/rust-lang/crates.io-index" 1871 | checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" 1872 | dependencies = [ 1873 | "bitflags", 1874 | "core-foundation 0.10.0", 1875 | "core-foundation-sys", 1876 | "libc", 1877 | "security-framework-sys", 1878 | ] 1879 | 1880 | [[package]] 1881 | name = "security-framework-sys" 1882 | version = "2.14.0" 1883 | source = "registry+https://github.com/rust-lang/crates.io-index" 1884 | checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 1885 | dependencies = [ 1886 | "core-foundation-sys", 1887 | "libc", 1888 | ] 1889 | 1890 | [[package]] 1891 | name = "semver" 1892 | version = "1.0.26" 1893 | source = "registry+https://github.com/rust-lang/crates.io-index" 1894 | checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 1895 | 1896 | [[package]] 1897 | name = "serde" 1898 | version = "1.0.219" 1899 | source = "registry+https://github.com/rust-lang/crates.io-index" 1900 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1901 | dependencies = [ 1902 | "serde_derive", 1903 | ] 1904 | 1905 | [[package]] 1906 | name = "serde_derive" 1907 | version = "1.0.219" 1908 | source = "registry+https://github.com/rust-lang/crates.io-index" 1909 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1910 | dependencies = [ 1911 | "proc-macro2", 1912 | "quote", 1913 | "syn", 1914 | ] 1915 | 1916 | [[package]] 1917 | name = "sha2" 1918 | version = "0.10.8" 1919 | source = "registry+https://github.com/rust-lang/crates.io-index" 1920 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1921 | dependencies = [ 1922 | "cfg-if", 1923 | "cpufeatures", 1924 | "digest", 1925 | ] 1926 | 1927 | [[package]] 1928 | name = "sharded-slab" 1929 | version = "0.1.7" 1930 | source = "registry+https://github.com/rust-lang/crates.io-index" 1931 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1932 | dependencies = [ 1933 | "lazy_static", 1934 | ] 1935 | 1936 | [[package]] 1937 | name = "shlex" 1938 | version = "1.3.0" 1939 | source = "registry+https://github.com/rust-lang/crates.io-index" 1940 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1941 | 1942 | [[package]] 1943 | name = "signal-hook" 1944 | version = "0.3.17" 1945 | source = "registry+https://github.com/rust-lang/crates.io-index" 1946 | checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" 1947 | dependencies = [ 1948 | "cc", 1949 | "libc", 1950 | "signal-hook-registry", 1951 | ] 1952 | 1953 | [[package]] 1954 | name = "signal-hook-registry" 1955 | version = "1.4.5" 1956 | source = "registry+https://github.com/rust-lang/crates.io-index" 1957 | checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 1958 | dependencies = [ 1959 | "libc", 1960 | ] 1961 | 1962 | [[package]] 1963 | name = "signal-hook-tokio" 1964 | version = "0.3.1" 1965 | source = "registry+https://github.com/rust-lang/crates.io-index" 1966 | checksum = "213241f76fb1e37e27de3b6aa1b068a2c333233b59cca6634f634b80a27ecf1e" 1967 | dependencies = [ 1968 | "futures-core", 1969 | "libc", 1970 | "signal-hook", 1971 | "tokio", 1972 | ] 1973 | 1974 | [[package]] 1975 | name = "slab" 1976 | version = "0.4.9" 1977 | source = "registry+https://github.com/rust-lang/crates.io-index" 1978 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1979 | dependencies = [ 1980 | "autocfg", 1981 | ] 1982 | 1983 | [[package]] 1984 | name = "smallvec" 1985 | version = "1.15.0" 1986 | source = "registry+https://github.com/rust-lang/crates.io-index" 1987 | checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" 1988 | 1989 | [[package]] 1990 | name = "socket2" 1991 | version = "0.5.9" 1992 | source = "registry+https://github.com/rust-lang/crates.io-index" 1993 | checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" 1994 | dependencies = [ 1995 | "libc", 1996 | "windows-sys 0.52.0", 1997 | ] 1998 | 1999 | [[package]] 2000 | name = "stable_deref_trait" 2001 | version = "1.2.0" 2002 | source = "registry+https://github.com/rust-lang/crates.io-index" 2003 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2004 | 2005 | [[package]] 2006 | name = "strsim" 2007 | version = "0.11.1" 2008 | source = "registry+https://github.com/rust-lang/crates.io-index" 2009 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 2010 | 2011 | [[package]] 2012 | name = "subtle" 2013 | version = "2.6.1" 2014 | source = "registry+https://github.com/rust-lang/crates.io-index" 2015 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 2016 | 2017 | [[package]] 2018 | name = "syn" 2019 | version = "2.0.100" 2020 | source = "registry+https://github.com/rust-lang/crates.io-index" 2021 | checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" 2022 | dependencies = [ 2023 | "proc-macro2", 2024 | "quote", 2025 | "unicode-ident", 2026 | ] 2027 | 2028 | [[package]] 2029 | name = "synstructure" 2030 | version = "0.13.1" 2031 | source = "registry+https://github.com/rust-lang/crates.io-index" 2032 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 2033 | dependencies = [ 2034 | "proc-macro2", 2035 | "quote", 2036 | "syn", 2037 | ] 2038 | 2039 | [[package]] 2040 | name = "thread_local" 2041 | version = "1.1.8" 2042 | source = "registry+https://github.com/rust-lang/crates.io-index" 2043 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 2044 | dependencies = [ 2045 | "cfg-if", 2046 | "once_cell", 2047 | ] 2048 | 2049 | [[package]] 2050 | name = "time" 2051 | version = "0.3.41" 2052 | source = "registry+https://github.com/rust-lang/crates.io-index" 2053 | checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 2054 | dependencies = [ 2055 | "deranged", 2056 | "num-conv", 2057 | "powerfmt", 2058 | "serde", 2059 | "time-core", 2060 | "time-macros", 2061 | ] 2062 | 2063 | [[package]] 2064 | name = "time-core" 2065 | version = "0.1.4" 2066 | source = "registry+https://github.com/rust-lang/crates.io-index" 2067 | checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 2068 | 2069 | [[package]] 2070 | name = "time-macros" 2071 | version = "0.2.22" 2072 | source = "registry+https://github.com/rust-lang/crates.io-index" 2073 | checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 2074 | dependencies = [ 2075 | "num-conv", 2076 | "time-core", 2077 | ] 2078 | 2079 | [[package]] 2080 | name = "tinystr" 2081 | version = "0.7.6" 2082 | source = "registry+https://github.com/rust-lang/crates.io-index" 2083 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 2084 | dependencies = [ 2085 | "displaydoc", 2086 | "zerovec", 2087 | ] 2088 | 2089 | [[package]] 2090 | name = "tokio" 2091 | version = "1.44.2" 2092 | source = "registry+https://github.com/rust-lang/crates.io-index" 2093 | checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" 2094 | dependencies = [ 2095 | "backtrace", 2096 | "bytes", 2097 | "libc", 2098 | "mio", 2099 | "parking_lot", 2100 | "pin-project-lite", 2101 | "signal-hook-registry", 2102 | "socket2", 2103 | "tokio-macros", 2104 | "windows-sys 0.52.0", 2105 | ] 2106 | 2107 | [[package]] 2108 | name = "tokio-macros" 2109 | version = "2.5.0" 2110 | source = "registry+https://github.com/rust-lang/crates.io-index" 2111 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 2112 | dependencies = [ 2113 | "proc-macro2", 2114 | "quote", 2115 | "syn", 2116 | ] 2117 | 2118 | [[package]] 2119 | name = "tokio-rustls" 2120 | version = "0.24.1" 2121 | source = "registry+https://github.com/rust-lang/crates.io-index" 2122 | checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" 2123 | dependencies = [ 2124 | "rustls 0.21.12", 2125 | "tokio", 2126 | ] 2127 | 2128 | [[package]] 2129 | name = "tokio-rustls" 2130 | version = "0.26.2" 2131 | source = "registry+https://github.com/rust-lang/crates.io-index" 2132 | checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" 2133 | dependencies = [ 2134 | "rustls 0.23.26", 2135 | "tokio", 2136 | ] 2137 | 2138 | [[package]] 2139 | name = "tokio-stream" 2140 | version = "0.1.17" 2141 | source = "registry+https://github.com/rust-lang/crates.io-index" 2142 | checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 2143 | dependencies = [ 2144 | "futures-core", 2145 | "pin-project-lite", 2146 | "tokio", 2147 | ] 2148 | 2149 | [[package]] 2150 | name = "tokio-util" 2151 | version = "0.7.14" 2152 | source = "registry+https://github.com/rust-lang/crates.io-index" 2153 | checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" 2154 | dependencies = [ 2155 | "bytes", 2156 | "futures-core", 2157 | "futures-sink", 2158 | "pin-project-lite", 2159 | "tokio", 2160 | ] 2161 | 2162 | [[package]] 2163 | name = "tower" 2164 | version = "0.5.2" 2165 | source = "registry+https://github.com/rust-lang/crates.io-index" 2166 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 2167 | dependencies = [ 2168 | "tower-layer", 2169 | "tower-service", 2170 | ] 2171 | 2172 | [[package]] 2173 | name = "tower-layer" 2174 | version = "0.3.3" 2175 | source = "registry+https://github.com/rust-lang/crates.io-index" 2176 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 2177 | 2178 | [[package]] 2179 | name = "tower-service" 2180 | version = "0.3.3" 2181 | source = "registry+https://github.com/rust-lang/crates.io-index" 2182 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 2183 | 2184 | [[package]] 2185 | name = "tracing" 2186 | version = "0.1.41" 2187 | source = "registry+https://github.com/rust-lang/crates.io-index" 2188 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 2189 | dependencies = [ 2190 | "pin-project-lite", 2191 | "tracing-attributes", 2192 | "tracing-core", 2193 | ] 2194 | 2195 | [[package]] 2196 | name = "tracing-attributes" 2197 | version = "0.1.28" 2198 | source = "registry+https://github.com/rust-lang/crates.io-index" 2199 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 2200 | dependencies = [ 2201 | "proc-macro2", 2202 | "quote", 2203 | "syn", 2204 | ] 2205 | 2206 | [[package]] 2207 | name = "tracing-core" 2208 | version = "0.1.33" 2209 | source = "registry+https://github.com/rust-lang/crates.io-index" 2210 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 2211 | dependencies = [ 2212 | "once_cell", 2213 | "valuable", 2214 | ] 2215 | 2216 | [[package]] 2217 | name = "tracing-log" 2218 | version = "0.2.0" 2219 | source = "registry+https://github.com/rust-lang/crates.io-index" 2220 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 2221 | dependencies = [ 2222 | "log", 2223 | "once_cell", 2224 | "tracing-core", 2225 | ] 2226 | 2227 | [[package]] 2228 | name = "tracing-subscriber" 2229 | version = "0.3.19" 2230 | source = "registry+https://github.com/rust-lang/crates.io-index" 2231 | checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 2232 | dependencies = [ 2233 | "nu-ansi-term", 2234 | "sharded-slab", 2235 | "smallvec", 2236 | "thread_local", 2237 | "tracing-core", 2238 | "tracing-log", 2239 | ] 2240 | 2241 | [[package]] 2242 | name = "try-lock" 2243 | version = "0.2.5" 2244 | source = "registry+https://github.com/rust-lang/crates.io-index" 2245 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2246 | 2247 | [[package]] 2248 | name = "typenum" 2249 | version = "1.18.0" 2250 | source = "registry+https://github.com/rust-lang/crates.io-index" 2251 | checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 2252 | 2253 | [[package]] 2254 | name = "unicode-ident" 2255 | version = "1.0.18" 2256 | source = "registry+https://github.com/rust-lang/crates.io-index" 2257 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 2258 | 2259 | [[package]] 2260 | name = "untrusted" 2261 | version = "0.9.0" 2262 | source = "registry+https://github.com/rust-lang/crates.io-index" 2263 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 2264 | 2265 | [[package]] 2266 | name = "url" 2267 | version = "2.5.4" 2268 | source = "registry+https://github.com/rust-lang/crates.io-index" 2269 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 2270 | dependencies = [ 2271 | "form_urlencoded", 2272 | "idna", 2273 | "percent-encoding", 2274 | ] 2275 | 2276 | [[package]] 2277 | name = "urlencoding" 2278 | version = "2.1.3" 2279 | source = "registry+https://github.com/rust-lang/crates.io-index" 2280 | checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" 2281 | 2282 | [[package]] 2283 | name = "utf16_iter" 2284 | version = "1.0.5" 2285 | source = "registry+https://github.com/rust-lang/crates.io-index" 2286 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 2287 | 2288 | [[package]] 2289 | name = "utf8_iter" 2290 | version = "1.0.4" 2291 | source = "registry+https://github.com/rust-lang/crates.io-index" 2292 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2293 | 2294 | [[package]] 2295 | name = "utf8parse" 2296 | version = "0.2.2" 2297 | source = "registry+https://github.com/rust-lang/crates.io-index" 2298 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2299 | 2300 | [[package]] 2301 | name = "uuid" 2302 | version = "1.16.0" 2303 | source = "registry+https://github.com/rust-lang/crates.io-index" 2304 | checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" 2305 | 2306 | [[package]] 2307 | name = "valuable" 2308 | version = "0.1.1" 2309 | source = "registry+https://github.com/rust-lang/crates.io-index" 2310 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 2311 | 2312 | [[package]] 2313 | name = "version_check" 2314 | version = "0.9.5" 2315 | source = "registry+https://github.com/rust-lang/crates.io-index" 2316 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2317 | 2318 | [[package]] 2319 | name = "vsimd" 2320 | version = "0.8.0" 2321 | source = "registry+https://github.com/rust-lang/crates.io-index" 2322 | checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" 2323 | 2324 | [[package]] 2325 | name = "want" 2326 | version = "0.3.1" 2327 | source = "registry+https://github.com/rust-lang/crates.io-index" 2328 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2329 | dependencies = [ 2330 | "try-lock", 2331 | ] 2332 | 2333 | [[package]] 2334 | name = "wasi" 2335 | version = "0.11.0+wasi-snapshot-preview1" 2336 | source = "registry+https://github.com/rust-lang/crates.io-index" 2337 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2338 | 2339 | [[package]] 2340 | name = "wasi" 2341 | version = "0.14.2+wasi-0.2.4" 2342 | source = "registry+https://github.com/rust-lang/crates.io-index" 2343 | checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 2344 | dependencies = [ 2345 | "wit-bindgen-rt", 2346 | ] 2347 | 2348 | [[package]] 2349 | name = "which" 2350 | version = "4.4.2" 2351 | source = "registry+https://github.com/rust-lang/crates.io-index" 2352 | checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" 2353 | dependencies = [ 2354 | "either", 2355 | "home", 2356 | "once_cell", 2357 | "rustix", 2358 | ] 2359 | 2360 | [[package]] 2361 | name = "winapi" 2362 | version = "0.3.9" 2363 | source = "registry+https://github.com/rust-lang/crates.io-index" 2364 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2365 | dependencies = [ 2366 | "winapi-i686-pc-windows-gnu", 2367 | "winapi-x86_64-pc-windows-gnu", 2368 | ] 2369 | 2370 | [[package]] 2371 | name = "winapi-i686-pc-windows-gnu" 2372 | version = "0.4.0" 2373 | source = "registry+https://github.com/rust-lang/crates.io-index" 2374 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2375 | 2376 | [[package]] 2377 | name = "winapi-x86_64-pc-windows-gnu" 2378 | version = "0.4.0" 2379 | source = "registry+https://github.com/rust-lang/crates.io-index" 2380 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2381 | 2382 | [[package]] 2383 | name = "windows-sys" 2384 | version = "0.52.0" 2385 | source = "registry+https://github.com/rust-lang/crates.io-index" 2386 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2387 | dependencies = [ 2388 | "windows-targets", 2389 | ] 2390 | 2391 | [[package]] 2392 | name = "windows-sys" 2393 | version = "0.59.0" 2394 | source = "registry+https://github.com/rust-lang/crates.io-index" 2395 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2396 | dependencies = [ 2397 | "windows-targets", 2398 | ] 2399 | 2400 | [[package]] 2401 | name = "windows-targets" 2402 | version = "0.52.6" 2403 | source = "registry+https://github.com/rust-lang/crates.io-index" 2404 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2405 | dependencies = [ 2406 | "windows_aarch64_gnullvm", 2407 | "windows_aarch64_msvc", 2408 | "windows_i686_gnu", 2409 | "windows_i686_gnullvm", 2410 | "windows_i686_msvc", 2411 | "windows_x86_64_gnu", 2412 | "windows_x86_64_gnullvm", 2413 | "windows_x86_64_msvc", 2414 | ] 2415 | 2416 | [[package]] 2417 | name = "windows_aarch64_gnullvm" 2418 | version = "0.52.6" 2419 | source = "registry+https://github.com/rust-lang/crates.io-index" 2420 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2421 | 2422 | [[package]] 2423 | name = "windows_aarch64_msvc" 2424 | version = "0.52.6" 2425 | source = "registry+https://github.com/rust-lang/crates.io-index" 2426 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2427 | 2428 | [[package]] 2429 | name = "windows_i686_gnu" 2430 | version = "0.52.6" 2431 | source = "registry+https://github.com/rust-lang/crates.io-index" 2432 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2433 | 2434 | [[package]] 2435 | name = "windows_i686_gnullvm" 2436 | version = "0.52.6" 2437 | source = "registry+https://github.com/rust-lang/crates.io-index" 2438 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2439 | 2440 | [[package]] 2441 | name = "windows_i686_msvc" 2442 | version = "0.52.6" 2443 | source = "registry+https://github.com/rust-lang/crates.io-index" 2444 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2445 | 2446 | [[package]] 2447 | name = "windows_x86_64_gnu" 2448 | version = "0.52.6" 2449 | source = "registry+https://github.com/rust-lang/crates.io-index" 2450 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2451 | 2452 | [[package]] 2453 | name = "windows_x86_64_gnullvm" 2454 | version = "0.52.6" 2455 | source = "registry+https://github.com/rust-lang/crates.io-index" 2456 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2457 | 2458 | [[package]] 2459 | name = "windows_x86_64_msvc" 2460 | version = "0.52.6" 2461 | source = "registry+https://github.com/rust-lang/crates.io-index" 2462 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2463 | 2464 | [[package]] 2465 | name = "wit-bindgen-rt" 2466 | version = "0.39.0" 2467 | source = "registry+https://github.com/rust-lang/crates.io-index" 2468 | checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 2469 | dependencies = [ 2470 | "bitflags", 2471 | ] 2472 | 2473 | [[package]] 2474 | name = "write16" 2475 | version = "1.0.0" 2476 | source = "registry+https://github.com/rust-lang/crates.io-index" 2477 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 2478 | 2479 | [[package]] 2480 | name = "writeable" 2481 | version = "0.5.5" 2482 | source = "registry+https://github.com/rust-lang/crates.io-index" 2483 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 2484 | 2485 | [[package]] 2486 | name = "xmlparser" 2487 | version = "0.13.6" 2488 | source = "registry+https://github.com/rust-lang/crates.io-index" 2489 | checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" 2490 | 2491 | [[package]] 2492 | name = "yoke" 2493 | version = "0.7.5" 2494 | source = "registry+https://github.com/rust-lang/crates.io-index" 2495 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 2496 | dependencies = [ 2497 | "serde", 2498 | "stable_deref_trait", 2499 | "yoke-derive", 2500 | "zerofrom", 2501 | ] 2502 | 2503 | [[package]] 2504 | name = "yoke-derive" 2505 | version = "0.7.5" 2506 | source = "registry+https://github.com/rust-lang/crates.io-index" 2507 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 2508 | dependencies = [ 2509 | "proc-macro2", 2510 | "quote", 2511 | "syn", 2512 | "synstructure", 2513 | ] 2514 | 2515 | [[package]] 2516 | name = "zerofrom" 2517 | version = "0.1.6" 2518 | source = "registry+https://github.com/rust-lang/crates.io-index" 2519 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 2520 | dependencies = [ 2521 | "zerofrom-derive", 2522 | ] 2523 | 2524 | [[package]] 2525 | name = "zerofrom-derive" 2526 | version = "0.1.6" 2527 | source = "registry+https://github.com/rust-lang/crates.io-index" 2528 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 2529 | dependencies = [ 2530 | "proc-macro2", 2531 | "quote", 2532 | "syn", 2533 | "synstructure", 2534 | ] 2535 | 2536 | [[package]] 2537 | name = "zeroize" 2538 | version = "1.8.1" 2539 | source = "registry+https://github.com/rust-lang/crates.io-index" 2540 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2541 | 2542 | [[package]] 2543 | name = "zerovec" 2544 | version = "0.10.4" 2545 | source = "registry+https://github.com/rust-lang/crates.io-index" 2546 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 2547 | dependencies = [ 2548 | "yoke", 2549 | "zerofrom", 2550 | "zerovec-derive", 2551 | ] 2552 | 2553 | [[package]] 2554 | name = "zerovec-derive" 2555 | version = "0.10.3" 2556 | source = "registry+https://github.com/rust-lang/crates.io-index" 2557 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 2558 | dependencies = [ 2559 | "proc-macro2", 2560 | "quote", 2561 | "syn", 2562 | ] 2563 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "cloudwatch-log-redirector" 3 | version = "0.1.11" 4 | edition = "2021" 5 | authors = ["Rusty Conover "] 6 | license = "MIT OR Apache-2.0" 7 | description = "Redirect STDERR/STDOUT to CloudWatch Logs" 8 | readme = "readme.md" 9 | repository = "https://github.com/rustyconover/cloudwatch-log-redirector" 10 | keywords = ["cli", "cloudwatch", "cloudwatchlogs", "logging", "aws"] 11 | categories = ["command-line-utilities"] 12 | rust-version = "1.78" 13 | 14 | [badges] 15 | maintenance = { status = "actively-developed" } 16 | 17 | [lints.rust] 18 | unsafe_code = "forbid" 19 | 20 | [dependencies] 21 | aws-config = "1.5.15" 22 | aws-sdk-cloudwatchlogs = "1.52.0" 23 | clap = { version = "4.5.30", features = ["derive"] } 24 | futures = "0.3.31" 25 | nix = { version = "0.30.1", features = ["signal"] } 26 | signal-hook = { version = "0.3.17", features = ["extended-siginfo"] } 27 | signal-hook-tokio = { version = "0.3.1", features = ["futures-v0_3"] } 28 | tokio = { version = "1.41.0", features = ["full"] } 29 | tokio-stream = { version = "0.1.17", features = ["signal"] } 30 | tracing = "0.1.40" 31 | tracing-subscriber = "0.3.18" 32 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # CloudWatch Log Redirector 2 | 3 | Welcome to the **CloudWatch Log Redirector**! This handy command-line tool helps you capture the logs from your applications and redirect them to AWS CloudWatch Logs. 4 | 5 | ## Why Use CloudWatch Logs? 6 | 7 | CloudWatch Logs is a fantastic service for storing application logs, especially in environments like Docker or ECS containers. In these scenarios, local storage is often unavailable, making CloudWatch an ideal solution for log management. However, there are times when you want to capture logs from specific applications running alongside others within the same container or environment. That's where the CloudWatch Log Redirector comes in! 8 | 9 | ## Features 10 | 11 | - **Redirect Logs**: Capture both STDOUT and STDERR from your applications and send them directly to CloudWatch Logs. 12 | - **Stream Tagging**: Easily identify logs by tagging them with `[STDOUT]` and `[STDERR]`. 13 | - **Real-Time Monitoring**: Use the `--tee` option to view logs in real time while they are sent to CloudWatch. 14 | 15 | ## How to Use 16 | 17 | Getting started is simple! Here’s how to use the CloudWatch Log Redirector: 18 | 19 | ``` 20 | Usage: cloudwatch-log-redirector [OPTIONS] [ARGS]... 21 | 22 | Arguments: 23 | The name of the CloudWatch Logs log group. 24 | The name of the CloudWatch Logs log stream. 25 | The command to execute. 26 | [ARGS]... Additional arguments for the command. 27 | 28 | Options: 29 | -t, --tag-stream-names Tag the stream names with [STDOUT] and [STDERR]. 30 | --tee Display output in real time while sending it to CloudWatch Logs. 31 | -h, --help Show this help message. 32 | -V, --version Display the current version of the tool. 33 | ``` 34 | 35 | ### Example Usage 36 | 37 | Here’s a quick example of how to use the tool: 38 | 39 | ``` 40 | cloudwatch-log-redirector \ 41 | my-log-group \ 42 | my-log-stream \ 43 | command arg1 arg2 44 | ``` 45 | 46 | Here is a very simple that likely isn't very useful. 47 | 48 | ``` 49 | cloudwatch-log-redirector \ 50 | my-log-group \ 51 | my-log-stream \ 52 | ls -lR 53 | ``` 54 | 55 | ## How It Works 56 | 57 | The CloudWatch Log Redirector is built with **Tokio**, allowing it to efficiently manage subprocesses. When you run a command, the tool does the following: 58 | 59 | 1. **Starts the Subprocess**: It spawns your command as a subprocess. 60 | 2. **Attaches Pipes**: It connects pipes to capture both STDOUT and STDERR. 61 | 3. **Reads Logs**: Two tasks read from the respective pipes and place the logs into a queue. 62 | 4. **Flushes to CloudWatch**: The queued messages are periodically sent to CloudWatch Logs. 63 | 5. **Exit Code**: When the command completes, the exit code of the redirector matches that of the child process. 64 | 65 | ## Getting Help 66 | 67 | Need more assistance? Just run: 68 | 69 | ```bash 70 | cloudwatch-log-redirector --help 71 | ``` 72 | 73 | to view the available options and usage instructions. 74 | 75 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use aws_config::meta::region::RegionProviderChain; 2 | use aws_config::BehaviorVersion; 3 | use aws_sdk_cloudwatchlogs as cloudwatchlogs; 4 | use aws_sdk_cloudwatchlogs::types::InputLogEvent; 5 | use clap::Parser; 6 | use cloudwatchlogs::{Client, Error}; 7 | use futures::stream::StreamExt; 8 | use nix::sys::signal::{kill, Signal}; 9 | use nix::unistd::Pid; 10 | use signal_hook::consts::signal::SIGINT; 11 | use signal_hook_tokio::Signals; 12 | use std::os::unix::process::ExitStatusExt; 13 | use std::process::exit; 14 | use std::process::Stdio; 15 | use std::sync::Arc; 16 | use std::time::{SystemTime, UNIX_EPOCH}; 17 | use tokio::io::AsyncBufReadExt; 18 | use tokio::io::BufReader; 19 | use tokio::sync::Mutex; 20 | use tokio::time::{self, Duration}; 21 | struct LogBuffer { 22 | buffer: Vec<(InputLogEvent, u64)>, 23 | counter: u64, 24 | } 25 | 26 | impl LogBuffer { 27 | // Create a new LogBuffer instance 28 | fn new() -> Self { 29 | Self { 30 | buffer: Vec::new(), 31 | counter: 0, 32 | } 33 | } 34 | 35 | // Add a log event to the buffer 36 | fn add_event(&mut self, event: InputLogEvent) { 37 | self.buffer.push((event, self.counter)); 38 | self.counter += 1; 39 | } 40 | 41 | /// A function that sorts log events by timestamp and returns a subset whose total size is < 1MB. 42 | /// The returned subset is removed from the original vector. 43 | fn get_subset_to_publish(&mut self) -> Vec { 44 | // Sort the log events by timestamp in ascending order 45 | self.buffer 46 | .sort_by_key(|event| (event.0.timestamp(), event.1)); 47 | 48 | // Define the maximum size in bytes (1MB = 1 * 1024 * 1024 bytes) 49 | const MAX_SIZE: usize = 1024 * 1024; 50 | 51 | let mut subset = Vec::new(); 52 | let mut total_size = 0; 53 | 54 | // Use the `retain` method to remove events that are part of the subset from the original vector 55 | self.buffer.retain(|event| { 56 | let message_size = event.0.message().len(); 57 | 58 | // If adding this event would exceed the size limit, return true (keep the event) 59 | if total_size + message_size >= MAX_SIZE || subset.len() >= 1000 { 60 | return true; 61 | } 62 | 63 | // Otherwise, add the event to the subset and accumulate the size 64 | total_size += message_size; 65 | subset.push(event.clone()); 66 | 67 | // Return false to remove this event from the original vector 68 | false 69 | }); 70 | 71 | subset.iter().map(|(event, _)| event.clone()).collect() 72 | } 73 | 74 | // Flush the buffered log events 75 | } 76 | 77 | #[derive(Parser)] 78 | #[command(name = "cloudwatch_output_redirector")] 79 | #[command(version = "1.0")] 80 | #[command(author = "Rusty Conover ")] 81 | #[command(about = "Redirects stdout and stderr to CloudWatch Logs")] 82 | struct CommandLineArgs { 83 | /// The name of the CloudWatch Logs log group 84 | log_group_name: String, 85 | 86 | /// The name of the CloudWatch Logs log stream 87 | log_stream_name: String, 88 | 89 | #[arg( 90 | short, 91 | long, 92 | default_value_t = true, 93 | help = "Tag the stream names with [STDOUT] and [STDERR]" 94 | )] 95 | tag_stream_names: bool, 96 | 97 | #[arg( 98 | name = "tee", 99 | long, 100 | default_value_t = false, 101 | help = "Tee the output rather than just sending it to CloudWatch Logs" 102 | )] 103 | tee: bool, 104 | 105 | /// The command to execute 106 | command: String, 107 | 108 | /// Arguments for the command 109 | args: Vec, 110 | } 111 | 112 | fn current_time_in_millis() -> i64 { 113 | // Get the current time since the UNIX_EPOCH 114 | let now = SystemTime::now(); 115 | 116 | // Calculate the duration since UNIX_EPOCH 117 | now.duration_since(UNIX_EPOCH) 118 | .expect("Time went backwards") 119 | .as_millis() as i64 120 | } 121 | 122 | #[tokio::main] 123 | async fn main() -> Result<(), Error> { 124 | tracing_subscriber::fmt::init(); 125 | 126 | // Parse command line arguments 127 | let args = CommandLineArgs::parse(); 128 | 129 | // Create a CloudWatch Logs client 130 | let region_provider = RegionProviderChain::default_provider().or_else("us-east-1"); // Adjust your region 131 | let config = Arc::new( 132 | aws_config::defaults(BehaviorVersion::v2025_01_17()) 133 | .region(region_provider) 134 | .load() 135 | .await, 136 | ); 137 | 138 | // Create log group and stream 139 | { 140 | let client = Client::new(&Arc::clone(&config)); 141 | 142 | if let Err(e) = create_log_group(&client, &args.log_group_name).await { 143 | if e.to_string().contains("ResourceAlreadyExistsException") { 144 | tracing::debug!("Log group already exists"); 145 | } else { 146 | tracing::error!("Error creating log group: {}", e); 147 | } 148 | } 149 | if let Err(e) = 150 | create_log_stream(&client, &args.log_group_name, &args.log_stream_name).await 151 | { 152 | if e.to_string().contains("ResourceAlreadyExistsException") { 153 | tracing::debug!("Log stream already exists"); 154 | } else { 155 | tracing::error!("Error creating log group: {}", e); 156 | } 157 | } 158 | } 159 | 160 | // Start the subprocess 161 | let mut child = match tokio::process::Command::new(&args.command) 162 | .args(&args.args) 163 | .stdout(Stdio::piped()) 164 | .stderr(Stdio::piped()) 165 | .spawn() 166 | { 167 | Ok(child) => { 168 | println!("Successfully started child process: {}", args.command); 169 | // You can now interact with `child`, e.g., read stdout/stderr 170 | child 171 | } 172 | Err(e) => { 173 | eprintln!( 174 | "Error: Failed to start the child process '{}': {}", 175 | args.command, e 176 | ); 177 | exit(1); 178 | } 179 | }; 180 | 181 | let mut signals = Signals::new(&[SIGINT]).expect("Failed to set up signal handler"); 182 | 183 | let child_pid = child.id().expect("Failed to get child PID") as i32; 184 | 185 | let signal_task = tokio::spawn(async move { 186 | while let Some(signal) = signals.next().await { 187 | if signal == SIGINT { 188 | println!( 189 | "Parent received SIGINT. Forwarding to child (PID: {}).", 190 | child_pid 191 | ); 192 | // Forward SIGINT to the child process 193 | let _ = kill(Pid::from_raw(child_pid), Signal::SIGINT); 194 | } 195 | } 196 | }); 197 | 198 | // Create a buffer for the output streams 199 | let stdout = child.stdout.take().expect("Failed to capture stdout"); 200 | let stderr = child.stderr.take().expect("Failed to capture stderr"); 201 | 202 | let stdout_reader = BufReader::new(stdout); 203 | let stderr_reader = BufReader::new(stderr); 204 | 205 | let log_buffer = Arc::new(Mutex::new(LogBuffer::new())); 206 | 207 | let exit_indicator = Arc::new(Mutex::new(false)); 208 | 209 | // Stream stdout 210 | let stdout_buffer = Arc::clone(&log_buffer); 211 | let stdout_task = tokio::spawn(async move { 212 | let mut lines = stdout_reader.lines(); 213 | while let Some(line) = lines.next_line().await.unwrap() { 214 | let m = if args.tag_stream_names { 215 | format!("[STDOUT] {}", line) 216 | } else { 217 | line.clone() 218 | }; 219 | let log_event = InputLogEvent::builder() 220 | .message(m) 221 | .timestamp(current_time_in_millis()) 222 | .build() 223 | .unwrap(); 224 | 225 | if args.tee { 226 | println!("{}", line); 227 | } 228 | 229 | { 230 | let mut buffer = stdout_buffer.lock().await; 231 | buffer.add_event(log_event); 232 | } 233 | } 234 | }); 235 | 236 | let stderr_buffer = Arc::clone(&log_buffer); 237 | let stderr_task = tokio::spawn(async move { 238 | let mut lines = stderr_reader.lines(); 239 | while let Some(line) = lines.next_line().await.unwrap() { 240 | let m = if args.tag_stream_names { 241 | format!("[STDERR] {}", line) 242 | } else { 243 | line.clone() 244 | }; 245 | 246 | let log_event = InputLogEvent::builder() 247 | .message(m) 248 | .timestamp(current_time_in_millis()) 249 | .build() 250 | .unwrap(); 251 | 252 | if args.tee { 253 | eprintln!("{}", line); 254 | } 255 | 256 | { 257 | let mut buffer = stderr_buffer.lock().await; 258 | buffer.add_event(log_event); 259 | } 260 | } 261 | }); 262 | 263 | let flush_buffer = Arc::clone(&log_buffer); 264 | let exit_flag_handle = Arc::clone(&exit_indicator); 265 | let flush_handle = tokio::spawn(async move { 266 | let mut interval = time::interval(Duration::from_millis(250)); 267 | let client = Client::new(&config); 268 | let mut skip_sleep = false; 269 | loop { 270 | if !skip_sleep { 271 | interval.tick().await; // Wait for the next tick 272 | } 273 | 274 | let messages = { 275 | // Acquire the lock here but release it quickly 276 | let mut buffer = flush_buffer.lock().await; 277 | buffer.get_subset_to_publish() 278 | }; 279 | 280 | if messages.is_empty() { 281 | tracing::trace!("Nothing to flush"); 282 | let exit = exit_flag_handle.lock().await; 283 | if *exit { 284 | tracing::debug!("Exiting flush loop due to flag being set"); 285 | break; 286 | } 287 | skip_sleep = false; 288 | continue; // Nothing to flush 289 | } 290 | 291 | if messages.len() > 100 { 292 | skip_sleep = true; 293 | } 294 | 295 | tracing::debug!("Flushing {} log events", messages.len()); 296 | let result = client 297 | .put_log_events() 298 | .log_group_name(&args.log_group_name) 299 | .log_stream_name(&args.log_stream_name) 300 | .set_log_events(Some(messages.clone())) 301 | .send() 302 | .await; 303 | match result { 304 | Ok(put_result) => { 305 | if put_result.rejected_log_events_info.is_some() { 306 | tracing::warn!("Some log events were rejected"); 307 | } 308 | } 309 | Err(e) => { 310 | tracing::error!("Failed to flush log events: {}", e); 311 | } 312 | } 313 | } 314 | }); 315 | 316 | // Wait for the child process to finish 317 | let child_status = child.wait().await; 318 | match &child_status { 319 | Ok(exit_status) => { 320 | if let Some(signal) = exit_status.signal() { 321 | tracing::debug!("Process was terminated by signal: {}", signal); 322 | } else { 323 | tracing::debug!("Process finished with exit status: {}", exit_status); 324 | } 325 | } 326 | Err(e) => { 327 | tracing::error!("Failed to wait for child process: {}", e); 328 | } 329 | } 330 | 331 | signal_task.abort(); 332 | 333 | match stdout_task.await { 334 | Ok(_) => {} 335 | Err(e) => { 336 | tracing::error!("Failed to read stdout: {}", e); 337 | } 338 | } 339 | match stderr_task.await { 340 | Ok(_) => {} 341 | Err(e) => { 342 | tracing::error!("Failed to read stderr: {}", e); 343 | } 344 | } 345 | 346 | // Set the exit indicator to true 347 | tracing::debug!("Setting exit indicator so final messages are flushed."); 348 | { 349 | let mut exit = exit_indicator.lock().await; 350 | *exit = true; 351 | } 352 | 353 | // Flush any pending events. 354 | let flush_result = flush_handle.await; 355 | if let Err(e) = flush_result { 356 | tracing::error!("Failed to flush log events: {}", e); 357 | } 358 | 359 | if let Ok(exit_status) = &child_status { 360 | // Exit with the same status code as the child process 361 | // if there was a status code. 362 | if let Some(exit_code) = exit_status.code() { 363 | exit(exit_code); 364 | } else { 365 | // If the child exited with a signal, just exit with 1. 366 | exit(1); 367 | } 368 | } 369 | 370 | Ok(()) 371 | } 372 | 373 | // Function to create a CloudWatch log group 374 | async fn create_log_group(client: &Client, log_group_name: &str) -> Result<(), Error> { 375 | client 376 | .create_log_group() 377 | .log_group_name(log_group_name) 378 | .send() 379 | .await?; 380 | Ok(()) 381 | } 382 | 383 | // Function to create a CloudWatch log stream 384 | async fn create_log_stream( 385 | client: &Client, 386 | log_group_name: &str, 387 | log_stream_name: &str, 388 | ) -> Result<(), Error> { 389 | client 390 | .create_log_stream() 391 | .log_group_name(log_group_name) 392 | .log_stream_name(log_stream_name) 393 | .send() 394 | .await?; 395 | Ok(()) 396 | } 397 | --------------------------------------------------------------------------------