From 33ba734e680d7f0a40870c5cb13b00b214d29845 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Thu, 2 Jan 2025 18:44:21 +0100 Subject: [PATCH] Add Linux Local Redirect Mode (#206) --- .github/actions/setup/action.yml | 26 + .github/python-version.txt | 2 +- .github/scripts/pin-versions.py | 1 + .github/workflows/autofix.yml | 26 +- .github/workflows/ci.yml | 174 ++- .github/workflows/docs.yml | 18 +- CONTRIBUTING.md | 2 +- Cargo.lock | 1320 ++++++++++++----- Cargo.toml | 23 +- README.md | 9 +- architecture.png | Bin 293989 -> 398582 bytes mitmproxy-linux-ebpf-common/Cargo.toml | 16 + mitmproxy-linux-ebpf-common/src/lib.rs | 80 + mitmproxy-linux-ebpf/.cargo/config.toml | 12 + mitmproxy-linux-ebpf/Cargo.toml | 22 + mitmproxy-linux-ebpf/build.rs | 17 + mitmproxy-linux-ebpf/rust-toolchain.toml | 3 + mitmproxy-linux-ebpf/src/lib.rs | 3 + mitmproxy-linux-ebpf/src/main.rs | 54 + mitmproxy-linux/Cargo.toml | 41 + mitmproxy-linux/README.md | 13 + mitmproxy-linux/build.rs | 135 ++ mitmproxy-linux/mitmproxy_linux/__init__.py | 37 + mitmproxy-linux/pyproject.toml | 16 + mitmproxy-linux/src/main.rs | 7 + mitmproxy-linux/src/main2.rs | 197 +++ mitmproxy-macos/README.md | 5 + .../redirector/ipc/mitmproxy_ipc.pb.swift | 34 +- .../network-extension/InterceptConf.swift | 3 +- .../_pyinstaller/hook-mitmproxy_linux.py | 9 + mitmproxy-rs/pyproject.toml | 2 + mitmproxy-rs/pytests/test_task.rs | 5 +- mitmproxy-rs/src/server/base.rs | 18 +- mitmproxy-rs/src/server/local_redirector.rs | 52 +- mitmproxy-rs/src/task.rs | 10 +- mitmproxy-rs/stubtest-allowlist.txt | 1 + .../mitmproxy_windows/__init__.py | 2 +- mitmproxy-windows/pyproject.toml | 1 - mitmproxy-windows/redirector/src/main2.rs | 9 +- src/ipc/mitmproxy_ipc.proto | 5 +- src/ipc/mitmproxy_ipc.rs | 20 +- src/ipc/mod.rs | 1 - src/messages.rs | 24 +- src/network/core.rs | 2 +- src/network/icmp.rs | 18 +- src/network/task.rs | 23 +- src/network/tcp.rs | 2 +- src/network/tests.rs | 19 +- src/network/udp.rs | 3 +- src/network/virtual_device.rs | 2 +- src/packet_sources/linux.rs | 217 +++ src/packet_sources/macos.rs | 21 +- src/packet_sources/mod.rs | 113 +- src/packet_sources/tun.rs | 68 +- src/packet_sources/udp.rs | 15 +- src/packet_sources/windows.rs | 345 ++--- src/packet_sources/wireguard.rs | 17 +- src/shutdown.rs | 53 +- 58 files changed, 2532 insertions(+), 841 deletions(-) create mode 100644 .github/actions/setup/action.yml create mode 100644 mitmproxy-linux-ebpf-common/Cargo.toml create mode 100644 mitmproxy-linux-ebpf-common/src/lib.rs create mode 100644 mitmproxy-linux-ebpf/.cargo/config.toml create mode 100644 mitmproxy-linux-ebpf/Cargo.toml create mode 100644 mitmproxy-linux-ebpf/build.rs create mode 100644 mitmproxy-linux-ebpf/rust-toolchain.toml create mode 100644 mitmproxy-linux-ebpf/src/lib.rs create mode 100644 mitmproxy-linux-ebpf/src/main.rs create mode 100644 mitmproxy-linux/Cargo.toml create mode 100644 mitmproxy-linux/README.md create mode 100644 mitmproxy-linux/build.rs create mode 100644 mitmproxy-linux/mitmproxy_linux/__init__.py create mode 100644 mitmproxy-linux/pyproject.toml create mode 100644 mitmproxy-linux/src/main.rs create mode 100644 mitmproxy-linux/src/main2.rs create mode 100644 mitmproxy-rs/mitmproxy_rs/_pyinstaller/hook-mitmproxy_linux.py create mode 100755 src/packet_sources/linux.rs diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml new file mode 100644 index 00000000..c852e036 --- /dev/null +++ b/.github/actions/setup/action.yml @@ -0,0 +1,26 @@ +name: 'setup' +description: 'checkout, setup rust and python' +inputs: + rust-version: + description: 'Rust version' + required: true + default: 'stable' + extra-targets: + description: 'Extra Rust targets' + toolchain-args: + description: 'Extra args for `rustup toolchain`' +runs: + using: "composite" + steps: + - uses: mhils/workflows/setup-python@v12 # PyO3 wants recent Python on Windows. + - run: rustup toolchain install ${{ inputs.rust-version }} --profile minimal ${{ inputs.toolchain-args }} + shell: bash + - run: rustup default ${{ inputs.rust-version }} + shell: bash + - if: inputs.extra-targets + run: rustup target add ${{ inputs.extra-targets }} + shell: bash + - uses: mhils/workflows/rust-cache@v14 + - if: runner.os == 'Linux' + run: cargo install --locked bpf-linker + shell: bash diff --git a/.github/python-version.txt b/.github/python-version.txt index 2c073331..e4fba218 100644 --- a/.github/python-version.txt +++ b/.github/python-version.txt @@ -1 +1 @@ -3.11 +3.12 diff --git a/.github/scripts/pin-versions.py b/.github/scripts/pin-versions.py index 84ca6df8..36a80dd0 100644 --- a/.github/scripts/pin-versions.py +++ b/.github/scripts/pin-versions.py @@ -11,6 +11,7 @@ contents = ( contents .replace(f"mitmproxy_windows", f"mitmproxy_windows=={version}") + .replace(f"mitmproxy_linux", f"mitmproxy_linux=={version}") .replace(f"mitmproxy_macos", f"mitmproxy_macos=={version}") ) pyproject_toml.write_text(contents) diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml index 4ad7c9e6..1b32e18b 100644 --- a/.github/workflows/autofix.yml +++ b/.github/workflows/autofix.yml @@ -11,17 +11,18 @@ concurrency: cancel-in-progress: true env: - rust_clippy: "1.80" # MSRV + MSRV: "1.80" # Minimum Supported Rust Version jobs: protobuf: runs-on: macos-latest steps: - - uses: actions/checkout@v4 + - uses: mhils/workflows/checkout@v12 - run: brew install swift-protobuf - run: cargo install protoc-gen-prost - run: protoc --proto_path=./src/ipc/ mitmproxy_ipc.proto --prost_out=./src/ipc/ + --prost_opt="bytes=data" --swift_out=./mitmproxy-macos/redirector/ipc - run: cargo fmt --all - uses: autofix-ci/action@ff86a557419858bb967097bfc916833f5647fa8c @@ -35,18 +36,17 @@ jobs: - os: macos-latest - os: ubuntu-latest steps: - - uses: actions/checkout@v4 - - run: rustup toolchain install ${{ env.rust_clippy }} --profile minimal --component rustfmt --component clippy - - run: rustup default ${{ env.rust_clippy }} - - uses: Swatinem/rust-cache@82a92a6e8fbeee089604da2575dc567ae9ddeaab # v2.7.5 - timeout-minutes: 2 - continue-on-error: true - # PyO3 wants recent Python on Windows. - - uses: actions/setup-python@v5 + - uses: mhils/workflows/checkout@v12 + - uses: ./.github/actions/setup with: - python-version-file: .github/python-version.txt - - - run: cargo clippy --fix --allow-dirty --workspace + rust-version: ${{ env.MSRV }} + toolchain-args: --component rustfmt --component clippy + + # We could run clippy on mitmproxy-linux-ebpf with + # cargo +nightly clippy --workspace -- -C panic=abort -Zpanic_abort_tests + # but that means we'd use nightly clippy, which may change its behavior (and thus break CI). + # So we rather exempt mitmproxy-linux-ebpf from clippy lints. + - run: cargo clippy --fix --allow-dirty --workspace --exclude mitmproxy-linux-ebpf - run: cargo fmt --all - run: git checkout src/ipc/mitmproxy_ipc.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a8077ef9..9475fe62 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,25 +22,27 @@ jobs: matrix: include: - os: windows-latest - rust: "1.80" # MSRV - args: --exclude macos-certificate-truster + rust: "1.80" # MSRV - can't use variables here. + args: --exclude mitmproxy-linux-ebpf - os: macos-latest - rust: "1.80" - args: --exclude windows-redirector + rust: "1.80" # MSRV - can't use variables here. + args: --exclude mitmproxy-linux-ebpf + - os: ubuntu-22.04 + rust: "1.80" # MSRV - can't use variables here. + args: --exclude mitmproxy-linux-ebpf - os: ubuntu-latest rust: stable - args: --exclude windows-redirector --exclude macos-certificate-truster + args: --exclude mitmproxy-linux-ebpf + - os: ubuntu-latest # old Ubuntu to test eBPF verifier compatibility + rust: nightly + args: --package mitmproxy-linux-ebpf + env: + RUSTFLAGS: ${{ matrix.rust == 'nightly' && '-Zpanic_abort_tests -C panic=abort' || '' }} steps: - - uses: actions/checkout@v4 - - name: Set up Rust toolchain - run: rustup toolchain install ${{ matrix.rust }} --profile minimal - - uses: Swatinem/rust-cache@82a92a6e8fbeee089604da2575dc567ae9ddeaab # v2.7.5 - timeout-minutes: 2 - continue-on-error: true - # PyO3 wants recent Python on Windows. - - uses: actions/setup-python@v5 + - uses: mhils/workflows/checkout@v12 + - uses: ./.github/actions/setup with: - python-version-file: .github/python-version.txt + rust-version: ${{ matrix.rust }} - name: Run "cargo check" # the action-rs/cargo action adds inline annotations for "cargo check" output @@ -49,13 +51,19 @@ jobs: toolchain: ${{ matrix.rust }} command: check args: --workspace --verbose ${{ matrix.args }} - - name: Run "cargo test" + - if: matrix.rust != 'nightly' # XXX: weird errors here + name: Run "cargo test" # the action-rs/cargo action adds inline annotations for "cargo test" output uses: actions-rs/cargo@9e120dd99b0fbad1c065f686657e914e76bd7b72 with: toolchain: ${{ matrix.rust }} command: test args: --workspace --verbose ${{ matrix.args }} + - if: matrix.os == 'ubuntu-22.04' # Test that eBPF loads + run: cargo test --features root-tests + working-directory: mitmproxy-linux + env: + CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUNNER: sudo -E build: strategy: @@ -69,7 +77,7 @@ jobs: - name: linux-arm64 os: ubuntu-latest target: aarch64-unknown-linux-gnu - args: --compatibility manylinux2014 --zig --target aarch64-unknown-linux-gnu + args: --compatibility manylinux2014 --zig --target aarch64-unknown-linux-gnu -i 3.12 - name: macos-universal os: macos-latest target: aarch64-apple-darwin x86_64-apple-darwin @@ -77,25 +85,17 @@ jobs: runs-on: ${{ matrix.os }} name: build mitmproxy-rs (${{ matrix.name }}) steps: - - uses: actions/checkout@v4 - - run: rustup toolchain install stable --profile minimal - - run: rustup default stable - - if: matrix.target - run: rustup target add ${{ matrix.target }} - - run: rustup show - - uses: Swatinem/rust-cache@82a92a6e8fbeee089604da2575dc567ae9ddeaab # v2.7.5 - timeout-minutes: 2 - continue-on-error: true - - uses: actions/setup-python@v5 + - uses: mhils/workflows/checkout@v12 + - uses: ./.github/actions/setup with: - python-version-file: .github/python-version.txt + extra-targets: ${{ matrix.target }} - if: runner.os == 'Linux' name: Install maturin[zig] from PyPI - uses: install-pinned/maturin-with-zig@4804d730717f28b7565e71e68e5c9fe8c4f9b089 + uses: install-pinned/maturin-with-zig@68c027568b7d08df7bc3c52476ae28d1d2d787f5 - if: runner.os != 'Linux' name: Install maturin from PyPI - uses: install-pinned/maturin@c8c3a8f7f2b2ecf1728c96824734c6c6afe7e3e8 + uses: install-pinned/maturin@b1e3f698dbd19f284d4363cb361f75b2fa04679c - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') run: python .github/scripts/pin-versions.py @@ -106,7 +106,7 @@ jobs: # ensure that sdist is building. # We do this here instead of a separate job because we don't want to wait for the entire matrix. - if: contains(matrix.args, 'sdist') - run: pip install target/wheels/*.tar.gz + run: pip install --no-dependencies target/wheels/*.tar.gz - uses: actions/upload-artifact@v4 with: @@ -116,7 +116,7 @@ jobs: build-macos-app: runs-on: macos-latest steps: - - uses: actions/checkout@v4 + - uses: mhils/workflows/checkout@v12 - uses: actions/cache@v4 id: cache-app with: @@ -137,62 +137,96 @@ jobs: name: macos-app path: mitmproxy-macos/redirector/dist/ - build-os-wheels: - needs: build-macos-app - strategy: - matrix: - include: - - os: windows - build-rust: --package windows-redirector - - os: macos - build-rust: --package macos-certificate-truster - runs-on: ${{ matrix.os }}-latest - name: build mitmproxy-${{ matrix.os }} + build-windows-wheel: + runs-on: windows-latest + name: build mitmproxy-windows steps: - - uses: actions/checkout@v4 - - # Build Rust - - uses: Swatinem/rust-cache@82a92a6e8fbeee089604da2575dc567ae9ddeaab # v2.7.5 - timeout-minutes: 2 - continue-on-error: true - - run: rustup toolchain install stable --profile minimal - - run: rustup default stable - - if: runner.os == 'macOS' - run: rustup target add aarch64-apple-darwin x86_64-apple-darwin - - if: runner.os == 'macOS' - run: | - cargo build --release ${{ matrix.build-rust }} --target x86_64-apple-darwin - cargo build --release ${{ matrix.build-rust }} --target aarch64-apple-darwin - lipo -create -output target/release/macos-certificate-truster target/x86_64-apple-darwin/release/macos-certificate-truster target/aarch64-apple-darwin/release/macos-certificate-truster - - if: runner.os != 'macOS' - run: cargo build --release ${{ matrix.build-rust }} + - uses: mhils/workflows/checkout@v12 + - uses: ./.github/actions/setup + - uses: install-pinned/build@aa7fb973fec4a5593736c5dc25b322120ca41a98 + + - run: cargo build --release --package windows-redirector + + - run: python -m build --wheel ./mitmproxy-windows --outdir target/wheels/ + - uses: actions/upload-artifact@v4 + with: + name: wheels-os-windows + path: target/wheels + build-macos-wheel: + name: build mitmproxy-macos + needs: build-macos-app + runs-on: macos-latest + steps: + - uses: mhils/workflows/checkout@v12 + - uses: ./.github/actions/setup + with: + extra-targets: aarch64-apple-darwin x86_64-apple-darwin + - uses: install-pinned/build@aa7fb973fec4a5593736c5dc25b322120ca41a98 - # Download macOS app - - if: runner.os == 'macOS' - uses: actions/download-artifact@v4 + - run: | + cargo build --release --package macos-certificate-truster --target x86_64-apple-darwin + cargo build --release --package macos-certificate-truster --target aarch64-apple-darwin + lipo -create -output target/release/macos-certificate-truster target/x86_64-apple-darwin/release/macos-certificate-truster target/aarch64-apple-darwin/release/macos-certificate-truster + - uses: actions/download-artifact@v4 with: name: macos-app path: mitmproxy-macos/redirector/dist/ - # Build & upload wheel - - uses: actions/setup-python@v5 + - run: python -m build --wheel ./mitmproxy-macos --outdir target/wheels/ + - uses: actions/upload-artifact@v4 with: - python-version-file: .github/python-version.txt - - name: Install build from PyPI - uses: install-pinned/build@67059894d5ef2398af490c98fa8af8542d7b7008 - - run: python -m build --wheel ./mitmproxy-${{ matrix.os }} --outdir target/wheels/ + name: wheels-os-macos + path: target/wheels + + build-linux-wheel: + name: build mitmproxy-${{ matrix.name }} + strategy: + matrix: + include: + - name: linux-x86_64 + args: --compatibility manylinux2014 --zig --sdist + - name: linux-arm64 + target: aarch64-unknown-linux-gnu + args: --compatibility manylinux2014 --zig --target aarch64-unknown-linux-gnu -i 3.12 + runs-on: ubuntu-latest + steps: + - uses: mhils/workflows/checkout@v12 + - uses: ./.github/actions/setup + with: + extra-targets: ${{ matrix.target }} + - name: Install maturin[zig] from PyPI + uses: install-pinned/maturin-with-zig@68c027568b7d08df7bc3c52476ae28d1d2d787f5 + + - run: maturin build --release ${{ matrix.args }} + working-directory: ./mitmproxy-linux + - uses: actions/upload-artifact@v4 with: - name: wheels-os-${{ runner.os }} + name: wheels-os-${{ matrix.name }} + path: target/wheels + + test-linux-wheel-sdist: + needs: build-linux-wheel + runs-on: ubuntu-latest + steps: + - uses: mhils/workflows/checkout@v12 + - uses: ./.github/actions/setup + - uses: actions/download-artifact@v4 + with: + name: wheels-os-linux-x86_64 path: target/wheels + - run: pip install --no-dependencies target/wheels/*.tar.gz check: if: always() needs: - test + - test-linux-wheel-sdist - build - - build-os-wheels + - build-windows-wheel + - build-linux-wheel + - build-macos-wheel uses: mhils/workflows/.github/workflows/alls-green.yml@main with: jobs: ${{ toJSON(needs) }} diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index a0c4bba6..278cc37c 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -19,20 +19,16 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: Swatinem/rust-cache@82a92a6e8fbeee089604da2575dc567ae9ddeaab # v2.7.5 - timeout-minutes: 2 - continue-on-error: true - - name: Install maturin[zig] from PyPI - uses: install-pinned/maturin-with-zig@4804d730717f28b7565e71e68e5c9fe8c4f9b089 - - name: Install mypy from PyPI - uses: install-pinned/mypy@acfb567eb55a86c12a58ca1d28cd3e183e6a6d63 - - name: Install pdoc from PyPI - uses: install-pinned/pdoc@2e3e48c4027dad61fb97866e009e1e6b7da38209 + # TODO: This should ideally just reuse the main CI artifacts. + - uses: mhils/workflows/checkout@v12 + - uses: ./.github/actions/setup + - uses: install-pinned/maturin-with-zig@68c027568b7d08df7bc3c52476ae28d1d2d787f5 + - uses: install-pinned/mypy@2b552bed479e3f7065314667b670f7303619e989 + - uses: install-pinned/pdoc@fd9469ecb06f32b7012e07e449ce98b217bf1189 - run: maturin build working-directory: ./mitmproxy-rs - - run: pip install --no-index --find-links target/wheels/ mitmproxy_rs + - run: pip install --no-index --no-dependencies --find-links target/wheels/ mitmproxy_rs - run: stubtest --allowlist mitmproxy-rs/stubtest-allowlist.txt --mypy-config-file mitmproxy-rs/pyproject.toml mitmproxy_rs diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0b554578..fd5ecf96 100755 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,7 +24,7 @@ re-run `maturin develop` and restart mitmproxy** for changes to apply. If you've followed the procedure above, you can run the basic test suite as follows: ```shell -cargo test --workspace +cargo test ``` Please ensure that all patches are accompanied by matching changes in the test suite. diff --git a/Cargo.lock b/Cargo.lock index 9a772c6a..9506ca00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,18 +4,18 @@ version = 3 [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aead" @@ -36,6 +36,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "anes" version = "0.1.6" @@ -44,9 +50,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.14" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -59,43 +65,43 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.3" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" dependencies = [ "backtrace", ] @@ -108,9 +114,15 @@ checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "assert_matches" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" [[package]] name = "async-channel" @@ -126,9 +138,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -137,13 +149,13 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] @@ -154,13 +166,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] @@ -182,15 +194,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.5" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", "axum-core", @@ -207,17 +219,17 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper 1.0.1", - "tower", + "sync_wrapper", + "tower 0.5.2", "tower-layer", "tower-service", ] [[package]] name = "axum-core" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", "bytes", @@ -228,24 +240,151 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 0.1.2", + "sync_wrapper", "tower-layer", "tower-service", ] +[[package]] +name = "aya" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d18bc4e506fbb85ab7392ed993a7db4d1a452c71b75a246af4a80ab8c9d2dd50" +dependencies = [ + "assert_matches", + "aya-obj", + "bitflags 2.6.0", + "bytes", + "libc", + "log", + "object", + "once_cell", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "aya-ebpf" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8dbaf5409a1a0982e5c9bdc0f499a55fe5ead39fe9c846012053faf0d404f73" +dependencies = [ + "aya-ebpf-bindings", + "aya-ebpf-cty", + "aya-ebpf-macros", + "rustversion", +] + +[[package]] +name = "aya-ebpf-bindings" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "783dc1a82a3d71d83286165381dcc1b1d41643f4b110733d135547527c000a9a" +dependencies = [ + "aya-ebpf-cty", +] + +[[package]] +name = "aya-ebpf-cty" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cce099aaf3abb89f9a1f8594ffe07fa53738ebc2882fac624d10d9ba31a1b10" + +[[package]] +name = "aya-ebpf-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f47f7b4a75eb5f1d7ba0fb5628d247b1cf20388658899177875dabdda66865" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.92", +] + +[[package]] +name = "aya-log" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b600d806c1d07d3b81ab5f4a2a95fd80f479a0d3f1d68f29064d660865f85f02" +dependencies = [ + "aya", + "aya-log-common", + "bytes", + "log", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "aya-log-common" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "befef9fe882e63164a2ba0161874e954648a72b0e1c4b361f532d590638c4eec" +dependencies = [ + "num_enum", +] + +[[package]] +name = "aya-log-ebpf" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae348f459df78a79e5cd5e164b6562b927033b97ca3b033605b341a474f44510" +dependencies = [ + "aya-ebpf", + "aya-log-common", + "aya-log-ebpf-macros", +] + +[[package]] +name = "aya-log-ebpf-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6d8251a75f56077db51892041aa6b77c70ef2723845d7a210979700b2f01bc4" +dependencies = [ + "aya-log-common", + "aya-log-parser", + "proc-macro2", + "quote", + "syn 2.0.92", +] + +[[package]] +name = "aya-log-parser" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b102eb5c88c9aa0b49102d3fbcee08ecb0dfa81014f39b373311de7a7032cb" +dependencies = [ + "aya-log-common", +] + +[[package]] +name = "aya-obj" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51b96c5a8ed8705b40d655273bc4212cbbf38d4e3be2788f36306f154523ec7" +dependencies = [ + "bytes", + "core-error", + "hashbrown 0.15.2", + "log", + "object", + "thiserror 1.0.69", +] + [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -346,9 +485,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.16.1" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[package]] name = "byteorder" @@ -364,9 +503,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.6.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "c2rust-bitfields" @@ -388,6 +527,38 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8769706aad5d996120af43197bf46ef6ad0fda35216b4505f926a365a232d924" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.9", +] + [[package]] name = "cast" version = "0.3.0" @@ -396,9 +567,12 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.104" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490" +checksum = "8d6dbb628b8f8555f86d0323c2eb39e3ec81901f4b83e091db8a6a76d316a333" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -491,21 +665,21 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.8" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.8" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstyle", - "clap_lex 0.7.1", + "clap_lex 0.7.4", ] [[package]] @@ -519,9 +693,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "cocoa" @@ -555,9 +729,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "concurrent-queue" @@ -607,6 +781,21 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "const-sha1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8a42181e0652c2997ae4d217f25b63c5337a52fd2279736e97b832fa0a3cff" + +[[package]] +name = "core-error" +version = "0.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efcdb2972eb64230b4c50646d8498ff73f5128d196a90c7236eec4cbe8619b8f" +dependencies = [ + "version_check", +] + [[package]] name = "core-foundation" version = "0.10.0" @@ -649,9 +838,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -674,10 +863,10 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.5.8", + "clap 4.5.23", "criterion-plot", "is-terminal", - "itertools", + "itertools 0.10.5", "num-traits", "once_cell", "oorandom", @@ -698,23 +887,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", - "itertools", + "itertools 0.10.5", ] [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -731,9 +920,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" @@ -775,7 +964,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] @@ -786,9 +975,9 @@ checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "defmt" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a99dd22262668b887121d4672af5a64b238f026099f1a2a1b322066c9ecfe9e0" +checksum = "86f6162c53f659f65d00619fe31f14556a6e9f8752ccc4a41bd177ffcf3d6130" dependencies = [ "bitflags 1.3.2", "defmt-macros", @@ -796,24 +985,24 @@ dependencies = [ [[package]] name = "defmt-macros" -version = "0.3.9" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9f309eff1f79b3ebdf252954d90ae440599c26c2c553fe87a2d17195f2dcb" +checksum = "9d135dd939bad62d7490b0002602d35b358dce5fd9233a709d3c1ef467d4bde6" dependencies = [ "defmt-parser", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] name = "defmt-parser" -version = "0.3.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4a5fefe330e8d7f31b16a318f9ce81000d8e35e69b93eae154d16d2278f70f" +checksum = "3983b127f13995e68c1e29071e5d115cd96f215ccb5e6812e3728cd6f92653b3" dependencies = [ - "thiserror 1.0.61", + "thiserror 2.0.9", ] [[package]] @@ -836,6 +1025,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.92", +] + [[package]] name = "either" version = "1.13.0" @@ -844,31 +1044,37 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "enum-as-inner" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] name = "env_filter" -version = "0.1.0" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" dependencies = [ "log", "regex", ] +[[package]] +name = "env_home" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe" + [[package]] name = "env_logger" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" dependencies = [ "anstream", "anstyle", @@ -885,12 +1091,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -915,9 +1121,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ "event-listener", "pin-project-lite", @@ -925,15 +1131,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fdeflate" -version = "0.3.4" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] @@ -946,21 +1152,21 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "filetime" -version = "0.2.23" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", - "windows-sys 0.52.0", + "libredox", + "windows-sys 0.59.0", ] [[package]] name = "flate2" -version = "1.0.30" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -972,6 +1178,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + [[package]] name = "foreign-types" version = "0.5.0" @@ -990,7 +1202,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] @@ -1010,9 +1222,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1041,9 +1253,9 @@ checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1058,9 +1270,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ "futures-core", "pin-project-lite", @@ -1074,7 +1286,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] @@ -1130,15 +1342,15 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "h2" -version = "0.4.5" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", "bytes", @@ -1146,7 +1358,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.2.6", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -1180,9 +1392,14 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "hdrhistogram" @@ -1213,6 +1430,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -1224,9 +1447,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" [[package]] name = "hex" @@ -1236,9 +1459,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hickory-proto" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07698b8420e2f0d6447a436ba999ec85d8fbf2a398bbd737b82cac4a2e96e512" +checksum = "447afdcdb8afb9d0a852af6dc65d9b285ce720ed7a59e42a8bf2e931c67bc1b5" dependencies = [ "async-trait", "cfg-if", @@ -1247,11 +1470,11 @@ dependencies = [ "futures-channel", "futures-io", "futures-util", - "idna 0.4.0", + "idna", "ipnet", "once_cell", "rand", - "thiserror 1.0.61", + "thiserror 1.0.69", "tinyvec", "tokio", "tracing", @@ -1260,9 +1483,9 @@ dependencies = [ [[package]] name = "hickory-resolver" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28757f23aa75c98f254cf0405e6d8c25b831b32921b050a66692427679b1f243" +checksum = "0a2e2aba9c389ce5267d31cf1e4dace82390ae276b0b364ea55630b1fa1b44b4" dependencies = [ "cfg-if", "futures-util", @@ -1274,16 +1497,16 @@ dependencies = [ "rand", "resolv-conf", "smallvec", - "thiserror 1.0.61", + "thiserror 1.0.69", "tokio", "tracing", ] [[package]] name = "hickory-server" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be0e43c556b9b3fdb6c7c71a9a32153a2275d02419e3de809e520bfcfe40c37" +checksum = "35e6d1c2df0614595224b32479c72dd6fc82c9bda85962907c45fdb95a691489" dependencies = [ "async-trait", "bytes", @@ -1292,7 +1515,7 @@ dependencies = [ "futures-util", "hickory-proto", "serde", - "thiserror 1.0.61", + "thiserror 1.0.69", "time", "tokio", "tokio-util", @@ -1321,9 +1544,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -1355,9 +1578,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -1373,9 +1596,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", @@ -1394,9 +1617,9 @@ dependencies = [ [[package]] name = "hyper-timeout" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ "hyper", "hyper-util", @@ -1407,9 +1630,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.6" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -1420,29 +1643,147 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] [[package]] -name = "idna" -version = "0.4.0" +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.92", ] [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", ] [[package]] @@ -1470,12 +1811,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.2", ] [[package]] @@ -1511,9 +1852,12 @@ dependencies = [ [[package]] name = "inventory" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f958d3d68f4167080a18141e10381e7634563984a537f2a49a30fd8e53ac5767" +checksum = "e5d80fade88dd420ce0d9ab6f7c58ef2272dde38db874657950f827d4982c817" +dependencies = [ + "rustversion", +] [[package]] name = "ip_network" @@ -1551,26 +1895,26 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is-terminal" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi 0.4.0", "libc", "windows-sys 0.52.0", ] [[package]] name = "is_terminal_polyfill" -version = "1.70.0" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" @@ -1581,11 +1925,20 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jpeg-decoder" @@ -1595,10 +1948,11 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -1610,20 +1964,31 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.167" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", "windows-targets 0.52.6", ] +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall", +] + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -1636,6 +2001,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + [[package]] name = "lock_api" version = "0.4.12" @@ -1739,21 +2110,20 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ - "adler", + "adler2", "simd-adler32", ] [[package]] name = "mio" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "wasi", "windows-sys 0.52.0", @@ -1796,11 +2166,11 @@ dependencies = [ "pretty-hex", "prost", "rand", - "rand_core", "security-framework", "smoltcp", "socket2", "sysinfo", + "tempfile", "tokio", "tokio-util", "tun", @@ -1808,6 +2178,45 @@ dependencies = [ "x25519-dalek", ] +[[package]] +name = "mitmproxy-linux" +version = "0.12.0-dev" +dependencies = [ + "anyhow", + "aya", + "aya-log", + "cargo_metadata", + "const-sha1", + "env_logger", + "hex", + "internet-packet", + "libc", + "log", + "mitmproxy", + "mitmproxy-linux-ebpf", + "mitmproxy-linux-ebpf-common", + "prost", + "tokio", + "tun", +] + +[[package]] +name = "mitmproxy-linux-ebpf" +version = "0.12.0-dev" +dependencies = [ + "aya-ebpf", + "aya-log-ebpf", + "mitmproxy-linux-ebpf-common", + "which", +] + +[[package]] +name = "mitmproxy-linux-ebpf-common" +version = "0.12.0-dev" +dependencies = [ + "aya-ebpf", +] + [[package]] name = "mitmproxy_rs" version = "0.12.0-dev" @@ -1887,6 +2296,26 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.92", +] + [[package]] name = "objc" version = "0.2.7" @@ -1898,10 +2327,13 @@ dependencies = [ [[package]] name = "object" -version = "0.36.1" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ + "crc32fast", + "hashbrown 0.15.2", + "indexmap 2.7.0", "memchr", ] @@ -1913,9 +2345,9 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "oorandom" -version = "11.1.3" +version = "11.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" [[package]] name = "opaque-debug" @@ -1953,7 +2385,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.2", + "redox_syscall", "smallvec", "windows-targets 0.52.6", ] @@ -1966,29 +2398,29 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -2009,9 +2441,9 @@ dependencies = [ [[package]] name = "plotters" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" dependencies = [ "num-traits", "plotters-backend", @@ -2022,24 +2454,24 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" [[package]] name = "plotters-svg" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" dependencies = [ "plotters-backend", ] [[package]] name = "png" -version = "0.17.13" +version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -2061,9 +2493,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.6.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" [[package]] name = "powerfmt" @@ -2073,9 +2505,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "pretty-hex" @@ -2092,7 +2527,6 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn 1.0.109", "version_check", ] @@ -2107,6 +2541,28 @@ dependencies = [ "version_check", ] +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.92", +] + [[package]] name = "proc-macro2" version = "1.0.92" @@ -2118,9 +2574,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0487d90e047de87f984913713b85c601c05609aad5b0df4b4573fbf69aa13f" +checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" dependencies = [ "bytes", "prost-derive", @@ -2128,22 +2584,22 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" +checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" dependencies = [ "anyhow", - "itertools", + "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] name = "prost-types" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee5168b05f49d4b0ca581206eb14a7b22fafd963efe729ac48eb03266e25cc2" +checksum = "cc2f1e56baa61e93533aebc21af4d2134b70f66275e0fcdf3cbe43d77ff7e8fc" dependencies = [ "prost", ] @@ -2234,7 +2690,7 @@ dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] @@ -2243,11 +2699,11 @@ version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08260721f32db5e1a5beae69a55553f56b99bd0e1c3e6e0a5e8851a9d0f5a85c" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "pyo3-build-config", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] @@ -2258,9 +2714,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.36" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -2317,32 +2773,23 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.2" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags 2.6.0", ] [[package]] name = "regex" -version = "1.10.5" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -2356,13 +2803,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -2373,9 +2820,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "resolv-conf" @@ -2410,31 +2857,31 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" @@ -2459,9 +2906,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "3.0.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1415a607e92bec364ea2cf9264646dcce0f91e6d65281bd6f2819cca3bf39c8" +checksum = "81d3f8c9bfcc3cbb6b0179eb57042d75b1582bdc65c3cb95f3fa999509c03cbc" dependencies = [ "bitflags 2.6.0", "core-foundation", @@ -2472,9 +2919,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" dependencies = [ "core-foundation-sys", "libc", @@ -2482,37 +2929,41 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" +dependencies = [ + "serde", +] [[package]] name = "serde" -version = "1.0.203" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -2526,6 +2977,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -2618,9 +3075,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "70ae51629bf965c5c098cc9e87908a3df5301051a9e087d6f9bef5c9771ed126" dependencies = [ "proc-macro2", "quote", @@ -2629,21 +3086,26 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" [[package]] -name = "sync_wrapper" -version = "1.0.1" +name = "synstructure" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.92", +] [[package]] name = "sysinfo" -version = "0.33.0" +version = "0.33.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "948512566b1895f93b1592c7574baeb2de842f224f2aab158799ecadb8ebbb46" +checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" dependencies = [ "core-foundation-sys", "libc", @@ -2666,9 +3128,22 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.14" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tempfile" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] [[package]] name = "termcolor" @@ -2687,42 +3162,42 @@ checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.61", + "thiserror-impl 1.0.69", ] [[package]] name = "thiserror" -version = "2.0.3" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" dependencies = [ - "thiserror-impl 2.0.3", + "thiserror-impl 2.0.9", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] name = "thiserror-impl" -version = "2.0.3" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] @@ -2748,9 +3223,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "num-conv", @@ -2765,6 +3240,16 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -2777,9 +3262,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -2792,9 +3277,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.1" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -2816,14 +3301,14 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -2832,9 +3317,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -2854,9 +3339,9 @@ dependencies = [ [[package]] name = "tonic" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38659f4a91aba8598d27821589f5db7dddd94601e7a01b1e485a50e5484c7401" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" dependencies = [ "async-stream", "async-trait", @@ -2876,7 +3361,7 @@ dependencies = [ "socket2", "tokio", "tokio-stream", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", @@ -2902,23 +3387,37 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -2927,20 +3426,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -2948,9 +3447,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "once_cell", @@ -2969,9 +3468,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tun" -version = "0.7.5" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c3f82bccbec181c56278683da7d915cf875a6cf8a450b3bcf1367de222775e" +checksum = "086997de063a84b0e446f64e63a32ba6fba894525bb3825158927e0d3a6fd610" dependencies = [ "bytes", "cfg-if", @@ -2981,7 +3480,7 @@ dependencies = [ "libc", "log", "nix 0.29.0", - "thiserror 2.0.3", + "thiserror 2.0.9", "tokio", "tokio-util", "windows-sys 0.59.0", @@ -2994,26 +3493,11 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - [[package]] name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unindent" @@ -3039,15 +3523,27 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna 0.5.0", + "idna", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -3062,9 +3558,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "walkdir" @@ -3093,34 +3589,34 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3128,28 +3624,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", @@ -3161,6 +3657,18 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +[[package]] +name = "which" +version = "7.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb4a9e33648339dc1642b0e36e21b3385e6148e289226f657c809dee59df5028" +dependencies = [ + "either", + "env_home", + "rustix", + "winsafe", +] + [[package]] name = "widestring" version = "1.1.0" @@ -3185,11 +3693,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3205,7 +3713,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc6b6833a760d1c36b489314a5541a12a39d162dc8341d8f6f400212b96d3df1" dependencies = [ "etherparse", - "thiserror 1.0.61", + "thiserror 1.0.69", "windivert-sys", "windows 0.48.0", ] @@ -3217,7 +3725,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "832bc4af9272458a8a64395b3aabe10dc4089546486fcbd0e19b9b6d28ba6e54" dependencies = [ "cc", - "thiserror 1.0.61", + "thiserror 1.0.69", "windows 0.48.0", ] @@ -3260,7 +3768,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] @@ -3271,7 +3779,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", ] [[package]] @@ -3467,21 +3975,39 @@ dependencies = [ "toml", ] +[[package]] +name = "winsafe" +version = "0.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" + [[package]] name = "wintun-bindings" -version = "0.7.16" +version = "0.7.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74675b7fccee92389d38c3d120445864d1085c421ee91c7ed05d66fb9bb76050" +checksum = "379a11db27bd8fb4d14ac1a445fc056234f9a3b60e38c8ce2a3d56110f62771b" dependencies = [ "blocking", "c2rust-bitfields", "futures", "libloading", "log", - "thiserror 1.0.61", + "thiserror 2.0.9", "windows-sys 0.59.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "x25519-dalek" version = "2.0.1" @@ -3505,6 +4031,72 @@ dependencies = [ "rustix", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.92", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.92", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.92", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" @@ -3522,5 +4114,27 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.92", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.92", ] diff --git a/Cargo.toml b/Cargo.toml index 12379734..588e0142 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,9 +2,21 @@ members = [ ".", "mitmproxy-rs", + "mitmproxy-linux", + "mitmproxy-linux-ebpf", + "mitmproxy-linux-ebpf-common", + "mitmproxy-macos/certificate-truster", "mitmproxy-windows/redirector", "wireguard-test-client", +] +default-members = [ + ".", + "mitmproxy-rs", + "mitmproxy-linux", + "mitmproxy-linux-ebpf-common", "mitmproxy-macos/certificate-truster", + "mitmproxy-windows/redirector", + "wireguard-test-client", ] [workspace.package] @@ -18,6 +30,13 @@ repository = "https://github.com/mitmproxy/mitmproxy-rs" edition = "2021" rust-version = "1.80" # MSRV +[workspace.dependencies] +aya = { version = "0.13.0", default-features = false } +aya-ebpf = { version = "0.1.1", default-features = false } +aya-log = { version = "0.2.1", default-features = false } +aya-log-ebpf = { version = "0.1.1", default-features = false } +tun = { version = "0.7.1" } + [workspace.lints.clippy] large_futures = "deny" @@ -36,7 +55,6 @@ anyhow = { version = "1.0.93", features = ["backtrace"] } log = "0.4.22" once_cell = "1" pretty-hex = "0.4.1" -rand_core = { version = "0.6.4", features = ["getrandom"] } smoltcp = "0.11" tokio = { version = "1.41.1", features = ["macros", "net", "rt-multi-thread", "sync", "time", "io-util", "process"] } boringtun = { version = "0.6", default-features = false } @@ -83,7 +101,8 @@ objc = "0.2" sysinfo = "0.33.0" [target.'cfg(target_os = "linux")'.dependencies] -tun = { version = "0.7.5", features = ["async"] } +tun = { workspace = true, features = ["async"] } +tempfile = "3.14.0" sysinfo = "0.33.0" [dev-dependencies] diff --git a/README.md b/README.md index 222b4da1..d4cd91af 100644 --- a/README.md +++ b/README.md @@ -22,16 +22,21 @@ This repository contains mitmproxy's Rust bits, most notably: - [`src/`](./src): The `mitmproxy` crate containing most of the "meat". - [`mitmproxy-rs/`](./mitmproxy-rs): The `mitmproxy-rs` Python package, - which provides PyO3 bindings for the Rust crate. + which provides Python bindings for the Rust crate using [PyO3](https://pyo3.rs/). Source and binary distributions are available [on PyPI](https://pypi.org/project/mitmproxy-rs/). - [`mitmproxy-macos/`](./mitmproxy-macos): The `mitmproxy-macos` Python package, which contains a macOS Network Extension to transparently intercept macOS traffic. Only a binary distribution is available [on PyPI](https://pypi.org/project/mitmproxy-macos/) due to code signing and notarization requirements. - [`mitmproxy-windows/`](./mitmproxy-windows): The `mitmproxy-windows` Python package, which - contains the Windows traffic redirector based on WinDivert. + contains the Windows traffic redirector based on [WinDivert](https://github.com/basil00/WinDivert). Only a binary distribution is available [on PyPI](https://pypi.org/project/mitmproxy-windows/) due to build complexity. +- [`mitmproxy-linux/`](./mitmproxy-linux): The `mitmproxy-linux` Python package, which + contains the Linux traffic redirector based on [Aya](https://aya-rs.dev/). + Source and binary distributions are available [on PyPI](https://pypi.org/project/mitmproxy-linux/). +- [`mitmproxy-linux-ebpf/`](./mitmproxy-linux-ebpf): The eBPF program embedded in `mitmproxy-linux`. +- [`mitmproxy-linux-ebpf-common/`](./mitmproxy-linux-ebpf-common): Data structures shared by user space and eBPF. ### Architecture diff --git a/architecture.png b/architecture.png index a95f26e0934cffb74e562b3aaf400d9245982806..3b51859c3df0cb6328630ca55426bfb81962b29b 100644 GIT binary patch literal 398582 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