├── .cargo ├── audit.toml └── config ├── .github ├── dependabot.yml └── workflows │ ├── release.yml │ ├── security-audit-cron.yml │ ├── security-audit-reactive.yml │ └── tests.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── crates └── http-wasmtime-kube │ ├── .gitignore │ ├── Cargo.toml │ ├── README.md │ ├── build.rs │ ├── src │ ├── lib.rs │ ├── request_config.rs │ └── url_rewrite.rs │ └── wit │ └── ephemeral │ └── .gitignore └── src ├── cli.rs ├── errors.rs ├── ls.rs ├── main.rs ├── pull.rs ├── rm.rs ├── run.rs ├── store.rs └── wasm_host.rs /.cargo/audit.toml: -------------------------------------------------------------------------------- 1 | [advisories] 2 | ignore = [ 3 | "RUSTSEC-2020-0071", # `time` localtime_r segfault -- https://rustsec.org/advisories/RUSTSEC-2020-0071 4 | # Ignored because there are not known workarounds or dependency version bump 5 | # at this time. The call to localtime_r is not protected by any lock and can 6 | # cause unsoundness. Read the previous link for more information. 7 | "RUSTSEC-2020-0159", # `chrono` localtime_r segfault -- https://rustsec.org/advisories/RUSTSEC-2020-0159 8 | # Ignored because there are not known workarounds or dependency version bump 9 | # at this time. The call to localtime_r is not protected by any lock and can 10 | # cause unsoundness. Read the previous link for more information. 11 | "RUSTSEC-2022-0075", 12 | "RUSTSEC-2022-0076", # Old release of `wasmtime`: we have to use this version because of `wit-bindgen` 13 | "RUSTSEC-2020-0168", # `mach` not being maintained anymore. This is a transitive dep of wasmtime 14 | "RUSTSEC-2021-0145", # `atty` potential issue on windows, this is a transitive dep of wasmtime 15 | ] 16 | -------------------------------------------------------------------------------- /.cargo/config: -------------------------------------------------------------------------------- 1 | # Due to an issue with linking when cross-compiling, specify the 2 | # linker and archiver for cross-compiled targets. 3 | # 4 | # More information: https://github.com/rust-lang/cargo/issues/4133 5 | 6 | [target.x86_64-unknown-linux-musl] 7 | linker = "x86_64-linux-musl-ld" 8 | ar = "x86_64-linux-musl-ar" 9 | 10 | [target.aarch64-unknown-linux-musl] 11 | linker = "aarch64-linux-musl-ld" 12 | ar = "aarch64-linux-musl-ar" -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: cargo 4 | directory: "/" 5 | ignore: 6 | # Given dependabot opens a PR per dependency at this time, ignore 7 | # patch level updates because of the noise they create. Renovatebot 8 | # will take care of creating PR's that bump all patchlevel versions 9 | # of all dependencies in a single PR. For minor and major releases 10 | # of dependencies we are happy having a PR per dependency. 11 | - dependency-name: "*" 12 | update-types: ["version-update:semver-patch"] 13 | schedule: 14 | interval: daily 15 | time: "13:00" 16 | open-pull-requests-limit: 10 17 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: krew-wasm release 2 | on: 3 | push: 4 | tags: 5 | - 'v*' 6 | env: 7 | CARGO_TERM_COLOR: always 8 | jobs: 9 | 10 | ci: 11 | # A branch iserequired, and cannot be dynamic - https://github.com/actions/runner/issues/1493 12 | uses: flavio/krew-wasm/.github/workflows/tests.yml@main 13 | 14 | build-linux-x86_64: 15 | name: Build linux (x86_64) binary 16 | runs-on: ubuntu-latest 17 | needs: 18 | - ci 19 | steps: 20 | - uses: actions/checkout@v2 21 | - name: Setup rust toolchain 22 | uses: actions-rs/toolchain@v1 23 | with: 24 | toolchain: stable 25 | - name: Setup musl for x86_64 26 | run: | 27 | curl https://musl.cc/x86_64-linux-musl-cross.tgz | tar -xz 28 | echo "$PWD/x86_64-linux-musl-cross/bin" >> $GITHUB_PATH 29 | - run: rustup target add x86_64-unknown-linux-musl 30 | - name: Build krew-wasm 31 | env: 32 | CC: x86_64-linux-musl-gcc 33 | run: cargo build --target=x86_64-unknown-linux-musl --release 34 | - run: mv target/x86_64-unknown-linux-musl/release/krew-wasm krew-wasm-linux-x86_64 35 | - run: zip -j9 krew-wasm-linux-x86_64.zip krew-wasm-linux-x86_64 36 | - name: Upload binary 37 | uses: actions/upload-artifact@v2 38 | with: 39 | name: krew-wasm-linux-x86_64 40 | path: krew-wasm-linux-x86_64.zip 41 | 42 | build-linux-aarch64: 43 | name: Build linux (aarch64) binary 44 | runs-on: ubuntu-latest 45 | needs: 46 | - ci 47 | steps: 48 | - uses: actions/checkout@v2 49 | - name: Setup rust toolchain 50 | uses: actions-rs/toolchain@v1 51 | with: 52 | toolchain: stable 53 | - name: Setup musl for aarch64 54 | run: | 55 | curl https://musl.cc/aarch64-linux-musl-cross.tgz | tar -xz 56 | echo "$PWD/aarch64-linux-musl-cross/bin" >> $GITHUB_PATH 57 | - run: rustup target add aarch64-unknown-linux-musl 58 | - name: Build krew-wasm 59 | env: 60 | CC: aarch64-linux-musl-gcc 61 | run: cargo build --target=aarch64-unknown-linux-musl --release 62 | - run: mv target/aarch64-unknown-linux-musl/release/krew-wasm krew-wasm-linux-aarch64 63 | - run: zip -j9 krew-wasm-linux-aarch64.zip krew-wasm-linux-aarch64 64 | - name: Upload binary 65 | uses: actions/upload-artifact@v2 66 | with: 67 | name: krew-wasm-linux-aarch64 68 | path: krew-wasm-linux-aarch64.zip 69 | 70 | build-darwin-x86_64: 71 | name: Build darwin (x86_64) binary 72 | runs-on: macos-latest 73 | needs: 74 | - ci 75 | steps: 76 | - uses: actions/checkout@v2 77 | - name: Setup rust toolchain 78 | uses: actions-rs/toolchain@v1 79 | with: 80 | toolchain: stable 81 | - run: rustup target add x86_64-apple-darwin 82 | - name: Build krew-wasm 83 | run: cargo build --target=x86_64-apple-darwin --release 84 | - run: mv target/x86_64-apple-darwin/release/krew-wasm krew-wasm-darwin-x86_64 85 | - run: zip -j9 krew-wasm-darwin-x86_64.zip krew-wasm-darwin-x86_64 86 | - name: Upload binary 87 | uses: actions/upload-artifact@v2 88 | with: 89 | name: krew-wasm-darwin-x86_64 90 | path: krew-wasm-darwin-x86_64.zip 91 | 92 | # TODO: re-enable it once we fix build errors caused by: 93 | # ``` 94 | # error[E0433]: failed to resolve: could not find `unix` in `os` 95 | # --> src\pull.rs:84:14 96 | # | 97 | # 84 | std::os::unix::fs::symlink( 98 | # | ^^^^ could not find `unix` in `os` 99 | # 100 | # error[E0433]: failed to resolve: could not find `unix` in `os` 101 | # --> src\pull.rs:93:14 102 | # | 103 | # 93 | std::os::unix::fs::symlink( 104 | # | ^^^^ could not find `unix` in `os` 105 | # ``` 106 | # 107 | # build-windows-x86_64: 108 | # name: Build windows (x86_64) binary 109 | # runs-on: windows-latest 110 | # needs: 111 | # - ci 112 | # steps: 113 | # - uses: actions/checkout@v2 114 | # - name: Setup rust toolchain 115 | # uses: actions-rs/toolchain@v1 116 | # with: 117 | # toolchain: stable 118 | # - run: rustup target add x86_64-pc-windows-msvc 119 | # - name: Build krew-wasm 120 | # run: cargo build --target=x86_64-pc-windows-msvc --release 121 | # - run: mv target/x86_64-pc-windows-msvc/release/krew-wasm.exe krew-wasm-windows-x86_64.exe 122 | # - run: | 123 | # "/c/Program Files/7-Zip/7z.exe" a krew-wasm-windows-x86_64.exe.zip krew-wasm-windows-x86_64.exe 124 | # shell: bash 125 | # - name: Upload binary 126 | # uses: actions/upload-artifact@v2 127 | # with: 128 | # name: krew-wasm-windows-x86_64 129 | # path: krew-wasm-windows-x86_64.exe.zip 130 | 131 | release: 132 | name: Create release 133 | runs-on: ubuntu-latest 134 | needs: 135 | - build-linux-x86_64 136 | - build-linux-aarch64 137 | - build-darwin-x86_64 138 | # - build-windows-x86_64 139 | steps: 140 | - name: Create Release 141 | id: create-release 142 | uses: actions/create-release@v1 143 | env: 144 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 145 | with: 146 | tag_name: ${{ github.ref }} 147 | release_name: Release krew-wasm ${{ github.ref }} 148 | draft: false 149 | prerelease: ${{ contains(github.ref, '-alpha') || contains(github.ref, '-beta') || contains(github.ref, '-rc') }} 150 | 151 | - name: Download linux-x86_64 binary 152 | uses: actions/download-artifact@v2 153 | with: 154 | name: krew-wasm-linux-x86_64 155 | - name: Publish linux-x86_64 binary 156 | uses: actions/upload-release-asset@v1 157 | env: 158 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 159 | with: 160 | upload_url: ${{ steps.create-release.outputs.upload_url }} 161 | asset_name: krew-wasm-linux-x86_64.zip 162 | asset_path: krew-wasm-linux-x86_64.zip 163 | asset_content_type: application/zip 164 | 165 | - name: Download linux-aarch64 binary 166 | uses: actions/download-artifact@v2 167 | with: 168 | name: krew-wasm-linux-aarch64 169 | - name: Publish linux-aarch64 binary 170 | uses: actions/upload-release-asset@v1 171 | env: 172 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 173 | with: 174 | upload_url: ${{ steps.create-release.outputs.upload_url }} 175 | asset_name: krew-wasm-linux-aarch64.zip 176 | asset_path: krew-wasm-linux-aarch64.zip 177 | asset_content_type: application/zip 178 | 179 | - name: Download darwin-x86_64 binary 180 | uses: actions/download-artifact@v2 181 | with: 182 | name: krew-wasm-darwin-x86_64 183 | - name: Publish darwin-x86_64 binary 184 | uses: actions/upload-release-asset@v1 185 | env: 186 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 187 | with: 188 | upload_url: ${{ steps.create-release.outputs.upload_url }} 189 | asset_name: krew-wasm-darwin-x86_64.zip 190 | asset_path: krew-wasm-darwin-x86_64.zip 191 | asset_content_type: application/zip 192 | 193 | # - name: Download windows-x86_64 binary 194 | # uses: actions/download-artifact@v2 195 | # with: 196 | # name: krew-wasm-windows-x86_64 197 | # - name: Publish windows-x86_64 binary 198 | # uses: actions/upload-release-asset@v1 199 | # env: 200 | # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 201 | # with: 202 | # upload_url: ${{ steps.create-release.outputs.upload_url }} 203 | # asset_name: krew-wasm-windows-x86_64.exe.zip 204 | # asset_path: krew-wasm-windows-x86_64.exe.zip 205 | # asset_content_type: application/zip 206 | -------------------------------------------------------------------------------- /.github/workflows/security-audit-cron.yml: -------------------------------------------------------------------------------- 1 | name: Security audit cron job 2 | on: 3 | schedule: 4 | - cron: '0 0 * * *' 5 | jobs: 6 | audit: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v1 10 | - uses: actions-rs/audit-check@v1 11 | with: 12 | token: ${{ secrets.GITHUB_TOKEN }} 13 | -------------------------------------------------------------------------------- /.github/workflows/security-audit-reactive.yml: -------------------------------------------------------------------------------- 1 | name: Security audit 2 | on: 3 | push: 4 | paths: 5 | - '**/Cargo.toml' 6 | - '**/Cargo.lock' 7 | jobs: 8 | security_audit: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v1 12 | - uses: actions-rs/audit-check@v1 13 | with: 14 | token: ${{ secrets.GITHUB_TOKEN }} 15 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Continuous integration 2 | on: 3 | - push 4 | - pull_request 5 | - workflow_call 6 | jobs: 7 | check: 8 | name: Check 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - uses: actions-rs/toolchain@v1 13 | with: 14 | profile: minimal 15 | toolchain: stable 16 | override: true 17 | - uses: actions-rs/cargo@v1 18 | with: 19 | command: check 20 | test: 21 | name: Test Suite 22 | runs-on: ubuntu-latest 23 | steps: 24 | - uses: actions/checkout@v2 25 | - uses: actions-rs/toolchain@v1 26 | with: 27 | profile: minimal 28 | toolchain: stable 29 | override: true 30 | - uses: actions-rs/cargo@v1 31 | with: 32 | command: test 33 | args: --workspace 34 | fmt: 35 | name: Rustfmt 36 | runs-on: ubuntu-latest 37 | steps: 38 | - uses: actions/checkout@v2 39 | - uses: actions-rs/toolchain@v1 40 | with: 41 | profile: minimal 42 | toolchain: stable 43 | override: true 44 | - run: rustup component add rustfmt 45 | - uses: actions-rs/cargo@v1 46 | with: 47 | command: fmt 48 | args: --all -- --check 49 | clippy: 50 | name: Clippy 51 | runs-on: ubuntu-latest 52 | steps: 53 | - uses: actions/checkout@v2 54 | - uses: actions-rs/toolchain@v1 55 | with: 56 | profile: minimal 57 | toolchain: stable 58 | override: true 59 | - run: rustup component add clippy 60 | - uses: actions-rs/cargo@v1 61 | with: 62 | command: clippy 63 | args: -- -D warnings 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.17.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" 10 | dependencies = [ 11 | "gimli 0.26.2", 12 | ] 13 | 14 | [[package]] 15 | name = "addr2line" 16 | version = "0.19.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" 19 | dependencies = [ 20 | "gimli 0.27.2", 21 | ] 22 | 23 | [[package]] 24 | name = "adler" 25 | version = "1.0.2" 26 | source = "registry+https://github.com/rust-lang/crates.io-index" 27 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 28 | 29 | [[package]] 30 | name = "aho-corasick" 31 | version = "0.7.20" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" 34 | dependencies = [ 35 | "memchr", 36 | ] 37 | 38 | [[package]] 39 | name = "aho-corasick" 40 | version = "1.0.1" 41 | source = "registry+https://github.com/rust-lang/crates.io-index" 42 | checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04" 43 | dependencies = [ 44 | "memchr", 45 | ] 46 | 47 | [[package]] 48 | name = "ambient-authority" 49 | version = "0.0.1" 50 | source = "registry+https://github.com/rust-lang/crates.io-index" 51 | checksum = "ec8ad6edb4840b78c5c3d88de606b22252d552b55f3a4699fbb10fc070ec3049" 52 | 53 | [[package]] 54 | name = "android_system_properties" 55 | version = "0.1.5" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 58 | dependencies = [ 59 | "libc", 60 | ] 61 | 62 | [[package]] 63 | name = "anstream" 64 | version = "0.5.0" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c" 67 | dependencies = [ 68 | "anstyle", 69 | "anstyle-parse", 70 | "anstyle-query", 71 | "anstyle-wincon", 72 | "colorchoice", 73 | "utf8parse", 74 | ] 75 | 76 | [[package]] 77 | name = "anstyle" 78 | version = "1.0.0" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" 81 | 82 | [[package]] 83 | name = "anstyle-parse" 84 | version = "0.2.0" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" 87 | dependencies = [ 88 | "utf8parse", 89 | ] 90 | 91 | [[package]] 92 | name = "anstyle-query" 93 | version = "1.0.0" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" 96 | dependencies = [ 97 | "windows-sys 0.48.0", 98 | ] 99 | 100 | [[package]] 101 | name = "anstyle-wincon" 102 | version = "2.1.0" 103 | source = "registry+https://github.com/rust-lang/crates.io-index" 104 | checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd" 105 | dependencies = [ 106 | "anstyle", 107 | "windows-sys 0.48.0", 108 | ] 109 | 110 | [[package]] 111 | name = "anyhow" 112 | version = "1.0.70" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" 115 | 116 | [[package]] 117 | name = "async-channel" 118 | version = "1.8.0" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" 121 | dependencies = [ 122 | "concurrent-queue", 123 | "event-listener", 124 | "futures-core", 125 | ] 126 | 127 | [[package]] 128 | name = "async-executor" 129 | version = "1.5.0" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b" 132 | dependencies = [ 133 | "async-lock", 134 | "async-task", 135 | "concurrent-queue", 136 | "fastrand", 137 | "futures-lite", 138 | "slab", 139 | ] 140 | 141 | [[package]] 142 | name = "async-global-executor" 143 | version = "2.3.1" 144 | source = "registry+https://github.com/rust-lang/crates.io-index" 145 | checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" 146 | dependencies = [ 147 | "async-channel", 148 | "async-executor", 149 | "async-io", 150 | "async-lock", 151 | "blocking", 152 | "futures-lite", 153 | "once_cell", 154 | ] 155 | 156 | [[package]] 157 | name = "async-io" 158 | version = "1.13.0" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" 161 | dependencies = [ 162 | "async-lock", 163 | "autocfg", 164 | "cfg-if", 165 | "concurrent-queue", 166 | "futures-lite", 167 | "log", 168 | "parking", 169 | "polling", 170 | "rustix 0.37.3", 171 | "slab", 172 | "socket2 0.4.9", 173 | "waker-fn", 174 | ] 175 | 176 | [[package]] 177 | name = "async-lock" 178 | version = "2.7.0" 179 | source = "registry+https://github.com/rust-lang/crates.io-index" 180 | checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" 181 | dependencies = [ 182 | "event-listener", 183 | ] 184 | 185 | [[package]] 186 | name = "async-std" 187 | version = "1.12.0" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" 190 | dependencies = [ 191 | "async-channel", 192 | "async-global-executor", 193 | "async-io", 194 | "async-lock", 195 | "crossbeam-utils", 196 | "futures-channel", 197 | "futures-core", 198 | "futures-io", 199 | "futures-lite", 200 | "gloo-timers", 201 | "kv-log-macro", 202 | "log", 203 | "memchr", 204 | "once_cell", 205 | "pin-project-lite", 206 | "pin-utils", 207 | "slab", 208 | "wasm-bindgen-futures", 209 | ] 210 | 211 | [[package]] 212 | name = "async-stream" 213 | version = "0.3.4" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "ad445822218ce64be7a341abfb0b1ea43b5c23aa83902542a4542e78309d8e5e" 216 | dependencies = [ 217 | "async-stream-impl", 218 | "futures-core", 219 | "pin-project-lite", 220 | ] 221 | 222 | [[package]] 223 | name = "async-stream-impl" 224 | version = "0.3.4" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "e4655ae1a7b0cdf149156f780c5bf3f1352bc53cbd9e0a361a7ef7b22947e965" 227 | dependencies = [ 228 | "proc-macro2", 229 | "quote", 230 | "syn 1.0.109", 231 | ] 232 | 233 | [[package]] 234 | name = "async-task" 235 | version = "4.4.0" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" 238 | 239 | [[package]] 240 | name = "async-trait" 241 | version = "0.1.68" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" 244 | dependencies = [ 245 | "proc-macro2", 246 | "quote", 247 | "syn 2.0.10", 248 | ] 249 | 250 | [[package]] 251 | name = "atomic-waker" 252 | version = "1.1.0" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "debc29dde2e69f9e47506b525f639ed42300fc014a3e007832592448fa8e4599" 255 | 256 | [[package]] 257 | name = "atty" 258 | version = "0.2.14" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 261 | dependencies = [ 262 | "hermit-abi 0.1.19", 263 | "libc", 264 | "winapi", 265 | ] 266 | 267 | [[package]] 268 | name = "autocfg" 269 | version = "1.1.0" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 272 | 273 | [[package]] 274 | name = "backtrace" 275 | version = "0.3.67" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" 278 | dependencies = [ 279 | "addr2line 0.19.0", 280 | "cc", 281 | "cfg-if", 282 | "libc", 283 | "miniz_oxide", 284 | "object 0.30.3", 285 | "rustc-demangle", 286 | ] 287 | 288 | [[package]] 289 | name = "base64" 290 | version = "0.13.1" 291 | source = "registry+https://github.com/rust-lang/crates.io-index" 292 | checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" 293 | 294 | [[package]] 295 | name = "base64" 296 | version = "0.21.0" 297 | source = "registry+https://github.com/rust-lang/crates.io-index" 298 | checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" 299 | 300 | [[package]] 301 | name = "base64ct" 302 | version = "1.6.0" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 305 | 306 | [[package]] 307 | name = "bincode" 308 | version = "1.3.3" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" 311 | dependencies = [ 312 | "serde", 313 | ] 314 | 315 | [[package]] 316 | name = "bitflags" 317 | version = "1.3.2" 318 | source = "registry+https://github.com/rust-lang/crates.io-index" 319 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 320 | 321 | [[package]] 322 | name = "block-buffer" 323 | version = "0.9.0" 324 | source = "registry+https://github.com/rust-lang/crates.io-index" 325 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 326 | dependencies = [ 327 | "generic-array", 328 | ] 329 | 330 | [[package]] 331 | name = "block-buffer" 332 | version = "0.10.4" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 335 | dependencies = [ 336 | "generic-array", 337 | ] 338 | 339 | [[package]] 340 | name = "blocking" 341 | version = "1.3.0" 342 | source = "registry+https://github.com/rust-lang/crates.io-index" 343 | checksum = "3c67b173a56acffd6d2326fb7ab938ba0b00a71480e14902b2591c87bc5741e8" 344 | dependencies = [ 345 | "async-channel", 346 | "async-lock", 347 | "async-task", 348 | "atomic-waker", 349 | "fastrand", 350 | "futures-lite", 351 | ] 352 | 353 | [[package]] 354 | name = "bstr" 355 | version = "1.4.0" 356 | source = "registry+https://github.com/rust-lang/crates.io-index" 357 | checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09" 358 | dependencies = [ 359 | "memchr", 360 | "serde", 361 | ] 362 | 363 | [[package]] 364 | name = "bumpalo" 365 | version = "3.12.0" 366 | source = "registry+https://github.com/rust-lang/crates.io-index" 367 | checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" 368 | 369 | [[package]] 370 | name = "byteorder" 371 | version = "1.4.3" 372 | source = "registry+https://github.com/rust-lang/crates.io-index" 373 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 374 | 375 | [[package]] 376 | name = "bytes" 377 | version = "1.1.0" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" 380 | 381 | [[package]] 382 | name = "cap-fs-ext" 383 | version = "0.24.4" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "e54b86398b5852ddd45784b1d9b196b98beb39171821bad4b8b44534a1e87927" 386 | dependencies = [ 387 | "cap-primitives", 388 | "cap-std", 389 | "io-lifetimes 0.5.3", 390 | "winapi", 391 | ] 392 | 393 | [[package]] 394 | name = "cap-primitives" 395 | version = "0.24.4" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "fb8fca3e81fae1d91a36e9784ca22a39ef623702b5f7904d89dc31f10184a178" 398 | dependencies = [ 399 | "ambient-authority", 400 | "errno 0.2.8", 401 | "fs-set-times", 402 | "io-extras", 403 | "io-lifetimes 0.5.3", 404 | "ipnet", 405 | "maybe-owned", 406 | "rustix 0.33.7", 407 | "winapi", 408 | "winapi-util", 409 | "winx", 410 | ] 411 | 412 | [[package]] 413 | name = "cap-rand" 414 | version = "0.24.4" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "ca3b27294116983d706f4c8168f6d10c84f9f5daed0c28bc7d0296cf16bcf971" 417 | dependencies = [ 418 | "ambient-authority", 419 | "rand", 420 | ] 421 | 422 | [[package]] 423 | name = "cap-std" 424 | version = "0.24.4" 425 | source = "registry+https://github.com/rust-lang/crates.io-index" 426 | checksum = "2247568946095c7765ad2b441a56caffc08027734c634a6d5edda648f04e32eb" 427 | dependencies = [ 428 | "cap-primitives", 429 | "io-extras", 430 | "io-lifetimes 0.5.3", 431 | "ipnet", 432 | "rustix 0.33.7", 433 | ] 434 | 435 | [[package]] 436 | name = "cap-time-ext" 437 | version = "0.24.4" 438 | source = "registry+https://github.com/rust-lang/crates.io-index" 439 | checksum = "c50472b6ebc302af0401fa3fb939694cd8ff00e0d4c9182001e434fc822ab83a" 440 | dependencies = [ 441 | "cap-primitives", 442 | "once_cell", 443 | "rustix 0.33.7", 444 | "winx", 445 | ] 446 | 447 | [[package]] 448 | name = "cc" 449 | version = "1.0.79" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" 452 | dependencies = [ 453 | "jobserver", 454 | ] 455 | 456 | [[package]] 457 | name = "cfg-if" 458 | version = "1.0.0" 459 | source = "registry+https://github.com/rust-lang/crates.io-index" 460 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 461 | 462 | [[package]] 463 | name = "chrono" 464 | version = "0.4.24" 465 | source = "registry+https://github.com/rust-lang/crates.io-index" 466 | checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" 467 | dependencies = [ 468 | "iana-time-zone", 469 | "num-integer", 470 | "num-traits", 471 | "serde", 472 | "winapi", 473 | ] 474 | 475 | [[package]] 476 | name = "clap" 477 | version = "4.4.0" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "1d5f1946157a96594eb2d2c10eb7ad9a2b27518cb3000209dec700c35df9197d" 480 | dependencies = [ 481 | "clap_builder", 482 | "clap_derive", 483 | "once_cell", 484 | ] 485 | 486 | [[package]] 487 | name = "clap_builder" 488 | version = "4.4.0" 489 | source = "registry+https://github.com/rust-lang/crates.io-index" 490 | checksum = "78116e32a042dd73c2901f0dc30790d20ff3447f3e3472fad359e8c3d282bcd6" 491 | dependencies = [ 492 | "anstream", 493 | "anstyle", 494 | "clap_lex", 495 | "strsim", 496 | ] 497 | 498 | [[package]] 499 | name = "clap_derive" 500 | version = "4.4.0" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | checksum = "c9fd1a5729c4548118d7d70ff234a44868d00489a4b6597b0b020918a0e91a1a" 503 | dependencies = [ 504 | "heck 0.4.1", 505 | "proc-macro2", 506 | "quote", 507 | "syn 2.0.10", 508 | ] 509 | 510 | [[package]] 511 | name = "clap_lex" 512 | version = "0.5.0" 513 | source = "registry+https://github.com/rust-lang/crates.io-index" 514 | checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" 515 | 516 | [[package]] 517 | name = "codespan-reporting" 518 | version = "0.11.1" 519 | source = "registry+https://github.com/rust-lang/crates.io-index" 520 | checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 521 | dependencies = [ 522 | "termcolor", 523 | "unicode-width", 524 | ] 525 | 526 | [[package]] 527 | name = "colorchoice" 528 | version = "1.0.0" 529 | source = "registry+https://github.com/rust-lang/crates.io-index" 530 | checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" 531 | 532 | [[package]] 533 | name = "concurrent-queue" 534 | version = "2.1.0" 535 | source = "registry+https://github.com/rust-lang/crates.io-index" 536 | checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e" 537 | dependencies = [ 538 | "crossbeam-utils", 539 | ] 540 | 541 | [[package]] 542 | name = "const-oid" 543 | version = "0.7.1" 544 | source = "registry+https://github.com/rust-lang/crates.io-index" 545 | checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" 546 | 547 | [[package]] 548 | name = "core-foundation" 549 | version = "0.9.3" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 552 | dependencies = [ 553 | "core-foundation-sys", 554 | "libc", 555 | ] 556 | 557 | [[package]] 558 | name = "core-foundation-sys" 559 | version = "0.8.3" 560 | source = "registry+https://github.com/rust-lang/crates.io-index" 561 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 562 | 563 | [[package]] 564 | name = "cpp_demangle" 565 | version = "0.3.5" 566 | source = "registry+https://github.com/rust-lang/crates.io-index" 567 | checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" 568 | dependencies = [ 569 | "cfg-if", 570 | ] 571 | 572 | [[package]] 573 | name = "cpufeatures" 574 | version = "0.2.6" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" 577 | dependencies = [ 578 | "libc", 579 | ] 580 | 581 | [[package]] 582 | name = "cranelift-bforest" 583 | version = "0.81.2" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "0eba0f73ab0da95f5d3bd5161da14edc586a88aeae1d09e4a0924f7a141a0093" 586 | dependencies = [ 587 | "cranelift-entity", 588 | ] 589 | 590 | [[package]] 591 | name = "cranelift-codegen" 592 | version = "0.81.2" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "e9cff8758662518d743460f32c3ca6f32d726070af612c19ba92d01ea727e6d9" 595 | dependencies = [ 596 | "cranelift-bforest", 597 | "cranelift-codegen-meta", 598 | "cranelift-codegen-shared", 599 | "cranelift-entity", 600 | "gimli 0.26.2", 601 | "log", 602 | "regalloc", 603 | "smallvec", 604 | "target-lexicon", 605 | ] 606 | 607 | [[package]] 608 | name = "cranelift-codegen-meta" 609 | version = "0.81.2" 610 | source = "registry+https://github.com/rust-lang/crates.io-index" 611 | checksum = "bfc82fef9d470dd617c4d2537d8f4146d82526bb3bc3ef35b599a3978dad8c81" 612 | dependencies = [ 613 | "cranelift-codegen-shared", 614 | ] 615 | 616 | [[package]] 617 | name = "cranelift-codegen-shared" 618 | version = "0.81.2" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | checksum = "a06f531b6173eb2fd92d9a9b2a0dbb2450079f913040bdc323ec43ec752b7e44" 621 | 622 | [[package]] 623 | name = "cranelift-entity" 624 | version = "0.81.2" 625 | source = "registry+https://github.com/rust-lang/crates.io-index" 626 | checksum = "d84f8e8a408071d67f479a00c6d3da965b1f9b4b240b7e7e27edb1a34401b3cd" 627 | dependencies = [ 628 | "serde", 629 | ] 630 | 631 | [[package]] 632 | name = "cranelift-frontend" 633 | version = "0.81.2" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "72cc22592c10f1fa6664a55e34ec52593125a94176856d3ec2f7af5664374da1" 636 | dependencies = [ 637 | "cranelift-codegen", 638 | "log", 639 | "smallvec", 640 | "target-lexicon", 641 | ] 642 | 643 | [[package]] 644 | name = "cranelift-native" 645 | version = "0.81.2" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "c3da723ebbee69f348feb49acc9f6f5b7ad668c04a145abbc7a75b669f9b0afd" 648 | dependencies = [ 649 | "cranelift-codegen", 650 | "libc", 651 | "target-lexicon", 652 | ] 653 | 654 | [[package]] 655 | name = "cranelift-wasm" 656 | version = "0.81.2" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | checksum = "642c30e1600295e9c58fc349376187831dce1df6822ece7e8ab880010d6e4be2" 659 | dependencies = [ 660 | "cranelift-codegen", 661 | "cranelift-entity", 662 | "cranelift-frontend", 663 | "itertools", 664 | "log", 665 | "smallvec", 666 | "wasmparser", 667 | "wasmtime-types", 668 | ] 669 | 670 | [[package]] 671 | name = "crc32fast" 672 | version = "1.3.2" 673 | source = "registry+https://github.com/rust-lang/crates.io-index" 674 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 675 | dependencies = [ 676 | "cfg-if", 677 | ] 678 | 679 | [[package]] 680 | name = "crossbeam-channel" 681 | version = "0.5.7" 682 | source = "registry+https://github.com/rust-lang/crates.io-index" 683 | checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c" 684 | dependencies = [ 685 | "cfg-if", 686 | "crossbeam-utils", 687 | ] 688 | 689 | [[package]] 690 | name = "crossbeam-deque" 691 | version = "0.8.3" 692 | source = "registry+https://github.com/rust-lang/crates.io-index" 693 | checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" 694 | dependencies = [ 695 | "cfg-if", 696 | "crossbeam-epoch", 697 | "crossbeam-utils", 698 | ] 699 | 700 | [[package]] 701 | name = "crossbeam-epoch" 702 | version = "0.9.14" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" 705 | dependencies = [ 706 | "autocfg", 707 | "cfg-if", 708 | "crossbeam-utils", 709 | "memoffset 0.8.0", 710 | "scopeguard", 711 | ] 712 | 713 | [[package]] 714 | name = "crossbeam-utils" 715 | version = "0.8.15" 716 | source = "registry+https://github.com/rust-lang/crates.io-index" 717 | checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" 718 | dependencies = [ 719 | "cfg-if", 720 | ] 721 | 722 | [[package]] 723 | name = "crypto-bigint" 724 | version = "0.3.2" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "03c6a1d5fa1de37e071642dfa44ec552ca5b299adb128fab16138e24b548fd21" 727 | dependencies = [ 728 | "generic-array", 729 | "subtle", 730 | ] 731 | 732 | [[package]] 733 | name = "crypto-common" 734 | version = "0.1.6" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 737 | dependencies = [ 738 | "generic-array", 739 | "typenum", 740 | ] 741 | 742 | [[package]] 743 | name = "crypto-mac" 744 | version = "0.11.1" 745 | source = "registry+https://github.com/rust-lang/crates.io-index" 746 | checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" 747 | dependencies = [ 748 | "generic-array", 749 | "subtle", 750 | ] 751 | 752 | [[package]] 753 | name = "ctor" 754 | version = "0.1.26" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" 757 | dependencies = [ 758 | "quote", 759 | "syn 1.0.109", 760 | ] 761 | 762 | [[package]] 763 | name = "cxx" 764 | version = "1.0.94" 765 | source = "registry+https://github.com/rust-lang/crates.io-index" 766 | checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" 767 | dependencies = [ 768 | "cc", 769 | "cxxbridge-flags", 770 | "cxxbridge-macro", 771 | "link-cplusplus", 772 | ] 773 | 774 | [[package]] 775 | name = "cxx-build" 776 | version = "1.0.94" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" 779 | dependencies = [ 780 | "cc", 781 | "codespan-reporting", 782 | "once_cell", 783 | "proc-macro2", 784 | "quote", 785 | "scratch", 786 | "syn 2.0.10", 787 | ] 788 | 789 | [[package]] 790 | name = "cxxbridge-flags" 791 | version = "1.0.94" 792 | source = "registry+https://github.com/rust-lang/crates.io-index" 793 | checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" 794 | 795 | [[package]] 796 | name = "cxxbridge-macro" 797 | version = "1.0.94" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" 800 | dependencies = [ 801 | "proc-macro2", 802 | "quote", 803 | "syn 2.0.10", 804 | ] 805 | 806 | [[package]] 807 | name = "data-encoding" 808 | version = "2.3.3" 809 | source = "registry+https://github.com/rust-lang/crates.io-index" 810 | checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" 811 | 812 | [[package]] 813 | name = "der" 814 | version = "0.5.1" 815 | source = "registry+https://github.com/rust-lang/crates.io-index" 816 | checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" 817 | dependencies = [ 818 | "const-oid", 819 | "crypto-bigint", 820 | "pem-rfc7468", 821 | ] 822 | 823 | [[package]] 824 | name = "der-oid-macro" 825 | version = "0.5.0" 826 | source = "registry+https://github.com/rust-lang/crates.io-index" 827 | checksum = "c73af209b6a5dc8ca7cbaba720732304792cddc933cfea3d74509c2b1ef2f436" 828 | dependencies = [ 829 | "num-bigint", 830 | "num-traits", 831 | "syn 1.0.109", 832 | ] 833 | 834 | [[package]] 835 | name = "der-parser" 836 | version = "6.0.1" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | checksum = "4cddf120f700b411b2b02ebeb7f04dc0b7c8835909a6c2f52bf72ed0dd3433b2" 839 | dependencies = [ 840 | "der-oid-macro", 841 | "nom", 842 | "num-bigint", 843 | "num-traits", 844 | "rusticata-macros", 845 | ] 846 | 847 | [[package]] 848 | name = "digest" 849 | version = "0.9.0" 850 | source = "registry+https://github.com/rust-lang/crates.io-index" 851 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 852 | dependencies = [ 853 | "generic-array", 854 | ] 855 | 856 | [[package]] 857 | name = "digest" 858 | version = "0.10.6" 859 | source = "registry+https://github.com/rust-lang/crates.io-index" 860 | checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" 861 | dependencies = [ 862 | "block-buffer 0.10.4", 863 | "crypto-common", 864 | ] 865 | 866 | [[package]] 867 | name = "directories" 868 | version = "4.0.1" 869 | source = "registry+https://github.com/rust-lang/crates.io-index" 870 | checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" 871 | dependencies = [ 872 | "dirs-sys 0.3.7", 873 | ] 874 | 875 | [[package]] 876 | name = "directories" 877 | version = "5.0.0" 878 | source = "registry+https://github.com/rust-lang/crates.io-index" 879 | checksum = "74be3be809c18e089de43bdc504652bb2bc473fca8756131f8689db8cf079ba9" 880 | dependencies = [ 881 | "dirs-sys 0.4.0", 882 | ] 883 | 884 | [[package]] 885 | name = "directories-next" 886 | version = "2.0.0" 887 | source = "registry+https://github.com/rust-lang/crates.io-index" 888 | checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" 889 | dependencies = [ 890 | "cfg-if", 891 | "dirs-sys-next", 892 | ] 893 | 894 | [[package]] 895 | name = "dirs" 896 | version = "4.0.0" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" 899 | dependencies = [ 900 | "dirs-sys 0.3.7", 901 | ] 902 | 903 | [[package]] 904 | name = "dirs-sys" 905 | version = "0.3.7" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" 908 | dependencies = [ 909 | "libc", 910 | "redox_users", 911 | "winapi", 912 | ] 913 | 914 | [[package]] 915 | name = "dirs-sys" 916 | version = "0.4.0" 917 | source = "registry+https://github.com/rust-lang/crates.io-index" 918 | checksum = "04414300db88f70d74c5ff54e50f9e1d1737d9a5b90f53fcf2e95ca2a9ab554b" 919 | dependencies = [ 920 | "libc", 921 | "redox_users", 922 | "windows-sys 0.45.0", 923 | ] 924 | 925 | [[package]] 926 | name = "dirs-sys-next" 927 | version = "0.1.2" 928 | source = "registry+https://github.com/rust-lang/crates.io-index" 929 | checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" 930 | dependencies = [ 931 | "libc", 932 | "redox_users", 933 | "winapi", 934 | ] 935 | 936 | [[package]] 937 | name = "doc-comment" 938 | version = "0.3.3" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" 941 | 942 | [[package]] 943 | name = "dyn-clone" 944 | version = "1.0.11" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" 947 | 948 | [[package]] 949 | name = "either" 950 | version = "1.8.1" 951 | source = "registry+https://github.com/rust-lang/crates.io-index" 952 | checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" 953 | 954 | [[package]] 955 | name = "encoding_rs" 956 | version = "0.8.32" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" 959 | dependencies = [ 960 | "cfg-if", 961 | ] 962 | 963 | [[package]] 964 | name = "env_logger" 965 | version = "0.10.0" 966 | source = "registry+https://github.com/rust-lang/crates.io-index" 967 | checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" 968 | dependencies = [ 969 | "humantime", 970 | "is-terminal 0.4.5", 971 | "log", 972 | "regex", 973 | "termcolor", 974 | ] 975 | 976 | [[package]] 977 | name = "errno" 978 | version = "0.2.8" 979 | source = "registry+https://github.com/rust-lang/crates.io-index" 980 | checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" 981 | dependencies = [ 982 | "errno-dragonfly", 983 | "libc", 984 | "winapi", 985 | ] 986 | 987 | [[package]] 988 | name = "errno" 989 | version = "0.3.0" 990 | source = "registry+https://github.com/rust-lang/crates.io-index" 991 | checksum = "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0" 992 | dependencies = [ 993 | "errno-dragonfly", 994 | "libc", 995 | "windows-sys 0.45.0", 996 | ] 997 | 998 | [[package]] 999 | name = "errno-dragonfly" 1000 | version = "0.1.2" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" 1003 | dependencies = [ 1004 | "cc", 1005 | "libc", 1006 | ] 1007 | 1008 | [[package]] 1009 | name = "error-chain" 1010 | version = "0.12.4" 1011 | source = "registry+https://github.com/rust-lang/crates.io-index" 1012 | checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" 1013 | dependencies = [ 1014 | "backtrace", 1015 | "version_check 0.9.4", 1016 | ] 1017 | 1018 | [[package]] 1019 | name = "event-listener" 1020 | version = "2.5.3" 1021 | source = "registry+https://github.com/rust-lang/crates.io-index" 1022 | checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" 1023 | 1024 | [[package]] 1025 | name = "fallible-iterator" 1026 | version = "0.2.0" 1027 | source = "registry+https://github.com/rust-lang/crates.io-index" 1028 | checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" 1029 | 1030 | [[package]] 1031 | name = "fastrand" 1032 | version = "1.9.0" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" 1035 | dependencies = [ 1036 | "instant", 1037 | ] 1038 | 1039 | [[package]] 1040 | name = "file-per-thread-logger" 1041 | version = "0.1.6" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "84f2e425d9790201ba4af4630191feac6dcc98765b118d4d18e91d23c2353866" 1044 | dependencies = [ 1045 | "env_logger", 1046 | "log", 1047 | ] 1048 | 1049 | [[package]] 1050 | name = "fnv" 1051 | version = "1.0.7" 1052 | source = "registry+https://github.com/rust-lang/crates.io-index" 1053 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1054 | 1055 | [[package]] 1056 | name = "foreign-types" 1057 | version = "0.3.2" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 1060 | dependencies = [ 1061 | "foreign-types-shared", 1062 | ] 1063 | 1064 | [[package]] 1065 | name = "foreign-types-shared" 1066 | version = "0.1.1" 1067 | source = "registry+https://github.com/rust-lang/crates.io-index" 1068 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 1069 | 1070 | [[package]] 1071 | name = "form_urlencoded" 1072 | version = "1.0.1" 1073 | source = "registry+https://github.com/rust-lang/crates.io-index" 1074 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 1075 | dependencies = [ 1076 | "matches", 1077 | "percent-encoding 2.1.0", 1078 | ] 1079 | 1080 | [[package]] 1081 | name = "fs-set-times" 1082 | version = "0.15.0" 1083 | source = "registry+https://github.com/rust-lang/crates.io-index" 1084 | checksum = "7df62ee66ee2d532ea8d567b5a3f0d03ecd64636b98bad5be1e93dcc918b92aa" 1085 | dependencies = [ 1086 | "io-lifetimes 0.5.3", 1087 | "rustix 0.33.7", 1088 | "winapi", 1089 | ] 1090 | 1091 | [[package]] 1092 | name = "futures" 1093 | version = "0.3.27" 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" 1095 | checksum = "531ac96c6ff5fd7c62263c5e3c67a603af4fcaee2e1a0ae5565ba3a11e69e549" 1096 | dependencies = [ 1097 | "futures-channel", 1098 | "futures-core", 1099 | "futures-executor", 1100 | "futures-io", 1101 | "futures-sink", 1102 | "futures-task", 1103 | "futures-util", 1104 | ] 1105 | 1106 | [[package]] 1107 | name = "futures-channel" 1108 | version = "0.3.27" 1109 | source = "registry+https://github.com/rust-lang/crates.io-index" 1110 | checksum = "164713a5a0dcc3e7b4b1ed7d3b433cabc18025386f9339346e8daf15963cf7ac" 1111 | dependencies = [ 1112 | "futures-core", 1113 | "futures-sink", 1114 | ] 1115 | 1116 | [[package]] 1117 | name = "futures-core" 1118 | version = "0.3.27" 1119 | source = "registry+https://github.com/rust-lang/crates.io-index" 1120 | checksum = "86d7a0c1aa76363dac491de0ee99faf6941128376f1cf96f07db7603b7de69dd" 1121 | 1122 | [[package]] 1123 | name = "futures-executor" 1124 | version = "0.3.27" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "1997dd9df74cdac935c76252744c1ed5794fac083242ea4fe77ef3ed60ba0f83" 1127 | dependencies = [ 1128 | "futures-core", 1129 | "futures-task", 1130 | "futures-util", 1131 | ] 1132 | 1133 | [[package]] 1134 | name = "futures-io" 1135 | version = "0.3.27" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "89d422fa3cbe3b40dca574ab087abb5bc98258ea57eea3fd6f1fa7162c778b91" 1138 | 1139 | [[package]] 1140 | name = "futures-lite" 1141 | version = "1.12.0" 1142 | source = "registry+https://github.com/rust-lang/crates.io-index" 1143 | checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" 1144 | dependencies = [ 1145 | "fastrand", 1146 | "futures-core", 1147 | "futures-io", 1148 | "memchr", 1149 | "parking", 1150 | "pin-project-lite", 1151 | "waker-fn", 1152 | ] 1153 | 1154 | [[package]] 1155 | name = "futures-macro" 1156 | version = "0.3.27" 1157 | source = "registry+https://github.com/rust-lang/crates.io-index" 1158 | checksum = "3eb14ed937631bd8b8b8977f2c198443447a8355b6e3ca599f38c975e5a963b6" 1159 | dependencies = [ 1160 | "proc-macro2", 1161 | "quote", 1162 | "syn 1.0.109", 1163 | ] 1164 | 1165 | [[package]] 1166 | name = "futures-sink" 1167 | version = "0.3.27" 1168 | source = "registry+https://github.com/rust-lang/crates.io-index" 1169 | checksum = "ec93083a4aecafb2a80a885c9de1f0ccae9dbd32c2bb54b0c3a65690e0b8d2f2" 1170 | 1171 | [[package]] 1172 | name = "futures-task" 1173 | version = "0.3.27" 1174 | source = "registry+https://github.com/rust-lang/crates.io-index" 1175 | checksum = "fd65540d33b37b16542a0438c12e6aeead10d4ac5d05bd3f805b8f35ab592879" 1176 | 1177 | [[package]] 1178 | name = "futures-util" 1179 | version = "0.3.27" 1180 | source = "registry+https://github.com/rust-lang/crates.io-index" 1181 | checksum = "3ef6b17e481503ec85211fed8f39d1970f128935ca1f814cd32ac4a6842e84ab" 1182 | dependencies = [ 1183 | "futures-channel", 1184 | "futures-core", 1185 | "futures-io", 1186 | "futures-macro", 1187 | "futures-sink", 1188 | "futures-task", 1189 | "memchr", 1190 | "pin-project-lite", 1191 | "pin-utils", 1192 | "slab", 1193 | ] 1194 | 1195 | [[package]] 1196 | name = "generic-array" 1197 | version = "0.14.6" 1198 | source = "registry+https://github.com/rust-lang/crates.io-index" 1199 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 1200 | dependencies = [ 1201 | "typenum", 1202 | "version_check 0.9.4", 1203 | ] 1204 | 1205 | [[package]] 1206 | name = "getrandom" 1207 | version = "0.2.8" 1208 | source = "registry+https://github.com/rust-lang/crates.io-index" 1209 | checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" 1210 | dependencies = [ 1211 | "cfg-if", 1212 | "libc", 1213 | "wasi", 1214 | ] 1215 | 1216 | [[package]] 1217 | name = "gimli" 1218 | version = "0.26.2" 1219 | source = "registry+https://github.com/rust-lang/crates.io-index" 1220 | checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" 1221 | dependencies = [ 1222 | "fallible-iterator", 1223 | "indexmap", 1224 | "stable_deref_trait", 1225 | ] 1226 | 1227 | [[package]] 1228 | name = "gimli" 1229 | version = "0.27.2" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" 1232 | 1233 | [[package]] 1234 | name = "globset" 1235 | version = "0.4.10" 1236 | source = "registry+https://github.com/rust-lang/crates.io-index" 1237 | checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" 1238 | dependencies = [ 1239 | "aho-corasick 0.7.20", 1240 | "bstr", 1241 | "fnv", 1242 | "log", 1243 | "regex", 1244 | ] 1245 | 1246 | [[package]] 1247 | name = "gloo-timers" 1248 | version = "0.2.6" 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" 1250 | checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" 1251 | dependencies = [ 1252 | "futures-channel", 1253 | "futures-core", 1254 | "js-sys", 1255 | "wasm-bindgen", 1256 | ] 1257 | 1258 | [[package]] 1259 | name = "h2" 1260 | version = "0.3.16" 1261 | source = "registry+https://github.com/rust-lang/crates.io-index" 1262 | checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" 1263 | dependencies = [ 1264 | "bytes", 1265 | "fnv", 1266 | "futures-core", 1267 | "futures-sink", 1268 | "futures-util", 1269 | "http", 1270 | "indexmap", 1271 | "slab", 1272 | "tokio", 1273 | "tokio-util", 1274 | "tracing", 1275 | ] 1276 | 1277 | [[package]] 1278 | name = "hashbrown" 1279 | version = "0.12.3" 1280 | source = "registry+https://github.com/rust-lang/crates.io-index" 1281 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 1282 | 1283 | [[package]] 1284 | name = "heck" 1285 | version = "0.3.3" 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" 1287 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 1288 | dependencies = [ 1289 | "unicode-segmentation", 1290 | ] 1291 | 1292 | [[package]] 1293 | name = "heck" 1294 | version = "0.4.1" 1295 | source = "registry+https://github.com/rust-lang/crates.io-index" 1296 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 1297 | 1298 | [[package]] 1299 | name = "hermit-abi" 1300 | version = "0.1.19" 1301 | source = "registry+https://github.com/rust-lang/crates.io-index" 1302 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 1303 | dependencies = [ 1304 | "libc", 1305 | ] 1306 | 1307 | [[package]] 1308 | name = "hermit-abi" 1309 | version = "0.2.6" 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" 1311 | checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" 1312 | dependencies = [ 1313 | "libc", 1314 | ] 1315 | 1316 | [[package]] 1317 | name = "hermit-abi" 1318 | version = "0.3.1" 1319 | source = "registry+https://github.com/rust-lang/crates.io-index" 1320 | checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" 1321 | 1322 | [[package]] 1323 | name = "hex" 1324 | version = "0.4.3" 1325 | source = "registry+https://github.com/rust-lang/crates.io-index" 1326 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1327 | 1328 | [[package]] 1329 | name = "hmac" 1330 | version = "0.11.0" 1331 | source = "registry+https://github.com/rust-lang/crates.io-index" 1332 | checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" 1333 | dependencies = [ 1334 | "crypto-mac", 1335 | "digest 0.9.0", 1336 | ] 1337 | 1338 | [[package]] 1339 | name = "http" 1340 | version = "0.2.9" 1341 | source = "registry+https://github.com/rust-lang/crates.io-index" 1342 | checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" 1343 | dependencies = [ 1344 | "bytes", 1345 | "fnv", 1346 | "itoa", 1347 | ] 1348 | 1349 | [[package]] 1350 | name = "http-body" 1351 | version = "0.4.5" 1352 | source = "registry+https://github.com/rust-lang/crates.io-index" 1353 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 1354 | dependencies = [ 1355 | "bytes", 1356 | "http", 1357 | "pin-project-lite", 1358 | ] 1359 | 1360 | [[package]] 1361 | name = "httparse" 1362 | version = "1.8.0" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 1365 | 1366 | [[package]] 1367 | name = "httpdate" 1368 | version = "1.0.2" 1369 | source = "registry+https://github.com/rust-lang/crates.io-index" 1370 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 1371 | 1372 | [[package]] 1373 | name = "humantime" 1374 | version = "2.1.0" 1375 | source = "registry+https://github.com/rust-lang/crates.io-index" 1376 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 1377 | 1378 | [[package]] 1379 | name = "hyper" 1380 | version = "0.14.25" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | checksum = "cc5e554ff619822309ffd57d8734d77cd5ce6238bc956f037ea06c58238c9899" 1383 | dependencies = [ 1384 | "bytes", 1385 | "futures-channel", 1386 | "futures-core", 1387 | "futures-util", 1388 | "h2", 1389 | "http", 1390 | "http-body", 1391 | "httparse", 1392 | "httpdate", 1393 | "itoa", 1394 | "pin-project-lite", 1395 | "socket2 0.4.9", 1396 | "tokio", 1397 | "tower-service", 1398 | "tracing", 1399 | "want", 1400 | ] 1401 | 1402 | [[package]] 1403 | name = "hyper-rustls" 1404 | version = "0.23.2" 1405 | source = "registry+https://github.com/rust-lang/crates.io-index" 1406 | checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" 1407 | dependencies = [ 1408 | "http", 1409 | "hyper", 1410 | "rustls", 1411 | "tokio", 1412 | "tokio-rustls", 1413 | ] 1414 | 1415 | [[package]] 1416 | name = "hyper-tls" 1417 | version = "0.5.0" 1418 | source = "registry+https://github.com/rust-lang/crates.io-index" 1419 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 1420 | dependencies = [ 1421 | "bytes", 1422 | "hyper", 1423 | "native-tls", 1424 | "tokio", 1425 | "tokio-native-tls", 1426 | ] 1427 | 1428 | [[package]] 1429 | name = "hyperx" 1430 | version = "1.4.0" 1431 | source = "registry+https://github.com/rust-lang/crates.io-index" 1432 | checksum = "5617e92fc2f2501c3e2bc6ce547cad841adba2bae5b921c7e52510beca6d084c" 1433 | dependencies = [ 1434 | "base64 0.13.1", 1435 | "bytes", 1436 | "http", 1437 | "httpdate", 1438 | "language-tags", 1439 | "mime", 1440 | "percent-encoding 2.1.0", 1441 | "unicase 2.6.0", 1442 | ] 1443 | 1444 | [[package]] 1445 | name = "iana-time-zone" 1446 | version = "0.1.54" 1447 | source = "registry+https://github.com/rust-lang/crates.io-index" 1448 | checksum = "0c17cc76786e99f8d2f055c11159e7f0091c42474dcc3189fbab96072e873e6d" 1449 | dependencies = [ 1450 | "android_system_properties", 1451 | "core-foundation-sys", 1452 | "iana-time-zone-haiku", 1453 | "js-sys", 1454 | "wasm-bindgen", 1455 | "windows", 1456 | ] 1457 | 1458 | [[package]] 1459 | name = "iana-time-zone-haiku" 1460 | version = "0.1.1" 1461 | source = "registry+https://github.com/rust-lang/crates.io-index" 1462 | checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" 1463 | dependencies = [ 1464 | "cxx", 1465 | "cxx-build", 1466 | ] 1467 | 1468 | [[package]] 1469 | name = "id-arena" 1470 | version = "2.2.1" 1471 | source = "registry+https://github.com/rust-lang/crates.io-index" 1472 | checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" 1473 | 1474 | [[package]] 1475 | name = "idna" 1476 | version = "0.1.5" 1477 | source = "registry+https://github.com/rust-lang/crates.io-index" 1478 | checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" 1479 | dependencies = [ 1480 | "matches", 1481 | "unicode-bidi", 1482 | "unicode-normalization", 1483 | ] 1484 | 1485 | [[package]] 1486 | name = "idna" 1487 | version = "0.2.3" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 1490 | dependencies = [ 1491 | "matches", 1492 | "unicode-bidi", 1493 | "unicode-normalization", 1494 | ] 1495 | 1496 | [[package]] 1497 | name = "indexmap" 1498 | version = "1.9.3" 1499 | source = "registry+https://github.com/rust-lang/crates.io-index" 1500 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 1501 | dependencies = [ 1502 | "autocfg", 1503 | "hashbrown", 1504 | "serde", 1505 | ] 1506 | 1507 | [[package]] 1508 | name = "instant" 1509 | version = "0.1.12" 1510 | source = "registry+https://github.com/rust-lang/crates.io-index" 1511 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 1512 | dependencies = [ 1513 | "cfg-if", 1514 | ] 1515 | 1516 | [[package]] 1517 | name = "io-extras" 1518 | version = "0.13.2" 1519 | source = "registry+https://github.com/rust-lang/crates.io-index" 1520 | checksum = "d0c937cc9891c12eaa8c63ad347e4a288364b1328b924886970b47a14ab8f8f8" 1521 | dependencies = [ 1522 | "io-lifetimes 0.5.3", 1523 | "winapi", 1524 | ] 1525 | 1526 | [[package]] 1527 | name = "io-lifetimes" 1528 | version = "0.5.3" 1529 | source = "registry+https://github.com/rust-lang/crates.io-index" 1530 | checksum = "ec58677acfea8a15352d42fc87d11d63596ade9239e0a7c9352914417515dbe6" 1531 | dependencies = [ 1532 | "libc", 1533 | "winapi", 1534 | ] 1535 | 1536 | [[package]] 1537 | name = "io-lifetimes" 1538 | version = "1.0.9" 1539 | source = "registry+https://github.com/rust-lang/crates.io-index" 1540 | checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb" 1541 | dependencies = [ 1542 | "hermit-abi 0.3.1", 1543 | "libc", 1544 | "windows-sys 0.45.0", 1545 | ] 1546 | 1547 | [[package]] 1548 | name = "ipnet" 1549 | version = "2.7.1" 1550 | source = "registry+https://github.com/rust-lang/crates.io-index" 1551 | checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" 1552 | 1553 | [[package]] 1554 | name = "is-terminal" 1555 | version = "0.1.0" 1556 | source = "registry+https://github.com/rust-lang/crates.io-index" 1557 | checksum = "7c89a757e762896bdbdfadf2860d0f8b0cea5e363d8cf3e7bdfeb63d1d976352" 1558 | dependencies = [ 1559 | "hermit-abi 0.2.6", 1560 | "io-lifetimes 0.5.3", 1561 | "rustix 0.33.7", 1562 | "winapi", 1563 | ] 1564 | 1565 | [[package]] 1566 | name = "is-terminal" 1567 | version = "0.4.5" 1568 | source = "registry+https://github.com/rust-lang/crates.io-index" 1569 | checksum = "8687c819457e979cc940d09cb16e42a1bf70aa6b60a549de6d3a62a0ee90c69e" 1570 | dependencies = [ 1571 | "hermit-abi 0.3.1", 1572 | "io-lifetimes 1.0.9", 1573 | "rustix 0.36.11", 1574 | "windows-sys 0.45.0", 1575 | ] 1576 | 1577 | [[package]] 1578 | name = "itertools" 1579 | version = "0.10.5" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 1582 | dependencies = [ 1583 | "either", 1584 | ] 1585 | 1586 | [[package]] 1587 | name = "itoa" 1588 | version = "1.0.6" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" 1591 | 1592 | [[package]] 1593 | name = "jobserver" 1594 | version = "0.1.26" 1595 | source = "registry+https://github.com/rust-lang/crates.io-index" 1596 | checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" 1597 | dependencies = [ 1598 | "libc", 1599 | ] 1600 | 1601 | [[package]] 1602 | name = "js-sys" 1603 | version = "0.3.61" 1604 | source = "registry+https://github.com/rust-lang/crates.io-index" 1605 | checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" 1606 | dependencies = [ 1607 | "wasm-bindgen", 1608 | ] 1609 | 1610 | [[package]] 1611 | name = "jwt" 1612 | version = "0.15.0" 1613 | source = "registry+https://github.com/rust-lang/crates.io-index" 1614 | checksum = "98328bb4f360e6b2ceb1f95645602c7014000ef0c3809963df8ad3a3a09f8d99" 1615 | dependencies = [ 1616 | "base64 0.13.1", 1617 | "crypto-mac", 1618 | "digest 0.9.0", 1619 | "hmac", 1620 | "serde", 1621 | "serde_json", 1622 | "sha2 0.9.9", 1623 | ] 1624 | 1625 | [[package]] 1626 | name = "keccak" 1627 | version = "0.1.3" 1628 | source = "registry+https://github.com/rust-lang/crates.io-index" 1629 | checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" 1630 | dependencies = [ 1631 | "cpufeatures", 1632 | ] 1633 | 1634 | [[package]] 1635 | name = "krew-wasm" 1636 | version = "0.1.0" 1637 | dependencies = [ 1638 | "anyhow", 1639 | "clap", 1640 | "directories 5.0.0", 1641 | "kube-conf", 1642 | "lazy_static", 1643 | "pathdiff", 1644 | "policy-fetcher", 1645 | "regex", 1646 | "term-table", 1647 | "thiserror", 1648 | "tokio", 1649 | "tracing", 1650 | "tracing-futures", 1651 | "tracing-subscriber", 1652 | "wasi-cap-std-sync", 1653 | "wasi-common", 1654 | "wasi-outbound-http-wasmtime-kube", 1655 | "wasmtime", 1656 | "wasmtime-wasi", 1657 | ] 1658 | 1659 | [[package]] 1660 | name = "kube-conf" 1661 | version = "0.2.0" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | checksum = "4e1c10cd46f9d12fdcf1c006ec4780a25fca34a7fd76ac0f7dca2695ce550d0f" 1664 | dependencies = [ 1665 | "error-chain", 1666 | "serde", 1667 | "serde_derive", 1668 | "serde_yaml", 1669 | ] 1670 | 1671 | [[package]] 1672 | name = "kv-log-macro" 1673 | version = "1.0.7" 1674 | source = "registry+https://github.com/rust-lang/crates.io-index" 1675 | checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" 1676 | dependencies = [ 1677 | "log", 1678 | ] 1679 | 1680 | [[package]] 1681 | name = "language-tags" 1682 | version = "0.3.2" 1683 | source = "registry+https://github.com/rust-lang/crates.io-index" 1684 | checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" 1685 | 1686 | [[package]] 1687 | name = "lazy_static" 1688 | version = "1.4.0" 1689 | source = "registry+https://github.com/rust-lang/crates.io-index" 1690 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1691 | dependencies = [ 1692 | "spin", 1693 | ] 1694 | 1695 | [[package]] 1696 | name = "leb128" 1697 | version = "0.2.5" 1698 | source = "registry+https://github.com/rust-lang/crates.io-index" 1699 | checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" 1700 | 1701 | [[package]] 1702 | name = "libc" 1703 | version = "0.2.150" 1704 | source = "registry+https://github.com/rust-lang/crates.io-index" 1705 | checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" 1706 | 1707 | [[package]] 1708 | name = "libm" 1709 | version = "0.2.6" 1710 | source = "registry+https://github.com/rust-lang/crates.io-index" 1711 | checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" 1712 | 1713 | [[package]] 1714 | name = "link-cplusplus" 1715 | version = "1.0.8" 1716 | source = "registry+https://github.com/rust-lang/crates.io-index" 1717 | checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" 1718 | dependencies = [ 1719 | "cc", 1720 | ] 1721 | 1722 | [[package]] 1723 | name = "linked-hash-map" 1724 | version = "0.5.6" 1725 | source = "registry+https://github.com/rust-lang/crates.io-index" 1726 | checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" 1727 | 1728 | [[package]] 1729 | name = "linux-raw-sys" 1730 | version = "0.0.42" 1731 | source = "registry+https://github.com/rust-lang/crates.io-index" 1732 | checksum = "5284f00d480e1c39af34e72f8ad60b94f47007e3481cd3b731c1d67190ddc7b7" 1733 | 1734 | [[package]] 1735 | name = "linux-raw-sys" 1736 | version = "0.1.4" 1737 | source = "registry+https://github.com/rust-lang/crates.io-index" 1738 | checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" 1739 | 1740 | [[package]] 1741 | name = "linux-raw-sys" 1742 | version = "0.3.0" 1743 | source = "registry+https://github.com/rust-lang/crates.io-index" 1744 | checksum = "cd550e73688e6d578f0ac2119e32b797a327631a42f9433e59d02e139c8df60d" 1745 | 1746 | [[package]] 1747 | name = "lock_api" 1748 | version = "0.4.9" 1749 | source = "registry+https://github.com/rust-lang/crates.io-index" 1750 | checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" 1751 | dependencies = [ 1752 | "autocfg", 1753 | "scopeguard", 1754 | ] 1755 | 1756 | [[package]] 1757 | name = "log" 1758 | version = "0.4.17" 1759 | source = "registry+https://github.com/rust-lang/crates.io-index" 1760 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 1761 | dependencies = [ 1762 | "cfg-if", 1763 | "value-bag", 1764 | ] 1765 | 1766 | [[package]] 1767 | name = "mach" 1768 | version = "0.3.2" 1769 | source = "registry+https://github.com/rust-lang/crates.io-index" 1770 | checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" 1771 | dependencies = [ 1772 | "libc", 1773 | ] 1774 | 1775 | [[package]] 1776 | name = "matchers" 1777 | version = "0.1.0" 1778 | source = "registry+https://github.com/rust-lang/crates.io-index" 1779 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1780 | dependencies = [ 1781 | "regex-automata 0.1.10", 1782 | ] 1783 | 1784 | [[package]] 1785 | name = "matches" 1786 | version = "0.1.10" 1787 | source = "registry+https://github.com/rust-lang/crates.io-index" 1788 | checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" 1789 | 1790 | [[package]] 1791 | name = "maybe-owned" 1792 | version = "0.3.4" 1793 | source = "registry+https://github.com/rust-lang/crates.io-index" 1794 | checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" 1795 | 1796 | [[package]] 1797 | name = "md-5" 1798 | version = "0.10.5" 1799 | source = "registry+https://github.com/rust-lang/crates.io-index" 1800 | checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" 1801 | dependencies = [ 1802 | "digest 0.10.6", 1803 | ] 1804 | 1805 | [[package]] 1806 | name = "memchr" 1807 | version = "2.6.4" 1808 | source = "registry+https://github.com/rust-lang/crates.io-index" 1809 | checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" 1810 | 1811 | [[package]] 1812 | name = "memoffset" 1813 | version = "0.6.5" 1814 | source = "registry+https://github.com/rust-lang/crates.io-index" 1815 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 1816 | dependencies = [ 1817 | "autocfg", 1818 | ] 1819 | 1820 | [[package]] 1821 | name = "memoffset" 1822 | version = "0.8.0" 1823 | source = "registry+https://github.com/rust-lang/crates.io-index" 1824 | checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" 1825 | dependencies = [ 1826 | "autocfg", 1827 | ] 1828 | 1829 | [[package]] 1830 | name = "mime" 1831 | version = "0.3.17" 1832 | source = "registry+https://github.com/rust-lang/crates.io-index" 1833 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1834 | 1835 | [[package]] 1836 | name = "minimal-lexical" 1837 | version = "0.2.1" 1838 | source = "registry+https://github.com/rust-lang/crates.io-index" 1839 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1840 | 1841 | [[package]] 1842 | name = "miniz_oxide" 1843 | version = "0.6.2" 1844 | source = "registry+https://github.com/rust-lang/crates.io-index" 1845 | checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" 1846 | dependencies = [ 1847 | "adler", 1848 | ] 1849 | 1850 | [[package]] 1851 | name = "mio" 1852 | version = "0.8.9" 1853 | source = "registry+https://github.com/rust-lang/crates.io-index" 1854 | checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" 1855 | dependencies = [ 1856 | "libc", 1857 | "wasi", 1858 | "windows-sys 0.48.0", 1859 | ] 1860 | 1861 | [[package]] 1862 | name = "more-asserts" 1863 | version = "0.2.2" 1864 | source = "registry+https://github.com/rust-lang/crates.io-index" 1865 | checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" 1866 | 1867 | [[package]] 1868 | name = "native-tls" 1869 | version = "0.2.11" 1870 | source = "registry+https://github.com/rust-lang/crates.io-index" 1871 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 1872 | dependencies = [ 1873 | "lazy_static", 1874 | "libc", 1875 | "log", 1876 | "openssl", 1877 | "openssl-probe", 1878 | "openssl-sys", 1879 | "schannel", 1880 | "security-framework", 1881 | "security-framework-sys", 1882 | "tempfile", 1883 | ] 1884 | 1885 | [[package]] 1886 | name = "nom" 1887 | version = "7.1.3" 1888 | source = "registry+https://github.com/rust-lang/crates.io-index" 1889 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1890 | dependencies = [ 1891 | "memchr", 1892 | "minimal-lexical", 1893 | ] 1894 | 1895 | [[package]] 1896 | name = "nu-ansi-term" 1897 | version = "0.46.0" 1898 | source = "registry+https://github.com/rust-lang/crates.io-index" 1899 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1900 | dependencies = [ 1901 | "overload", 1902 | "winapi", 1903 | ] 1904 | 1905 | [[package]] 1906 | name = "num-bigint" 1907 | version = "0.4.3" 1908 | source = "registry+https://github.com/rust-lang/crates.io-index" 1909 | checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" 1910 | dependencies = [ 1911 | "autocfg", 1912 | "num-integer", 1913 | "num-traits", 1914 | ] 1915 | 1916 | [[package]] 1917 | name = "num-bigint-dig" 1918 | version = "0.8.2" 1919 | source = "registry+https://github.com/rust-lang/crates.io-index" 1920 | checksum = "2399c9463abc5f909349d8aa9ba080e0b88b3ce2885389b60b993f39b1a56905" 1921 | dependencies = [ 1922 | "byteorder", 1923 | "lazy_static", 1924 | "libm", 1925 | "num-integer", 1926 | "num-iter", 1927 | "num-traits", 1928 | "rand", 1929 | "serde", 1930 | "smallvec", 1931 | "zeroize", 1932 | ] 1933 | 1934 | [[package]] 1935 | name = "num-integer" 1936 | version = "0.1.45" 1937 | source = "registry+https://github.com/rust-lang/crates.io-index" 1938 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 1939 | dependencies = [ 1940 | "autocfg", 1941 | "num-traits", 1942 | ] 1943 | 1944 | [[package]] 1945 | name = "num-iter" 1946 | version = "0.1.43" 1947 | source = "registry+https://github.com/rust-lang/crates.io-index" 1948 | checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" 1949 | dependencies = [ 1950 | "autocfg", 1951 | "num-integer", 1952 | "num-traits", 1953 | ] 1954 | 1955 | [[package]] 1956 | name = "num-traits" 1957 | version = "0.2.15" 1958 | source = "registry+https://github.com/rust-lang/crates.io-index" 1959 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 1960 | dependencies = [ 1961 | "autocfg", 1962 | "libm", 1963 | ] 1964 | 1965 | [[package]] 1966 | name = "num_cpus" 1967 | version = "1.15.0" 1968 | source = "registry+https://github.com/rust-lang/crates.io-index" 1969 | checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" 1970 | dependencies = [ 1971 | "hermit-abi 0.2.6", 1972 | "libc", 1973 | ] 1974 | 1975 | [[package]] 1976 | name = "object" 1977 | version = "0.27.1" 1978 | source = "registry+https://github.com/rust-lang/crates.io-index" 1979 | checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" 1980 | dependencies = [ 1981 | "crc32fast", 1982 | "indexmap", 1983 | "memchr", 1984 | ] 1985 | 1986 | [[package]] 1987 | name = "object" 1988 | version = "0.30.3" 1989 | source = "registry+https://github.com/rust-lang/crates.io-index" 1990 | checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" 1991 | dependencies = [ 1992 | "memchr", 1993 | ] 1994 | 1995 | [[package]] 1996 | name = "oci-distribution" 1997 | version = "0.8.1" 1998 | source = "git+https://github.com/krustlet/oci-distribution?rev=0f717968093a5415f428503d741dedf24ea97948#0f717968093a5415f428503d741dedf24ea97948" 1999 | dependencies = [ 2000 | "anyhow", 2001 | "futures-util", 2002 | "hyperx", 2003 | "jwt", 2004 | "lazy_static", 2005 | "regex", 2006 | "reqwest 0.11.15", 2007 | "serde", 2008 | "serde_json", 2009 | "sha2 0.9.9", 2010 | "tokio", 2011 | "tracing", 2012 | "unicase 1.4.2", 2013 | "url 1.7.2", 2014 | "www-authenticate", 2015 | ] 2016 | 2017 | [[package]] 2018 | name = "oid" 2019 | version = "0.2.1" 2020 | source = "registry+https://github.com/rust-lang/crates.io-index" 2021 | checksum = "9c19903c598813dba001b53beeae59bb77ad4892c5c1b9b3500ce4293a0d06c2" 2022 | dependencies = [ 2023 | "serde", 2024 | ] 2025 | 2026 | [[package]] 2027 | name = "oid-registry" 2028 | version = "0.2.0" 2029 | source = "registry+https://github.com/rust-lang/crates.io-index" 2030 | checksum = "fe554cb2393bc784fd678c82c84cc0599c31ceadc7f03a594911f822cb8d1815" 2031 | dependencies = [ 2032 | "der-parser", 2033 | ] 2034 | 2035 | [[package]] 2036 | name = "olpc-cjson" 2037 | version = "0.1.3" 2038 | source = "registry+https://github.com/rust-lang/crates.io-index" 2039 | checksum = "d637c9c15b639ccff597da8f4fa968300651ad2f1e968aefc3b4927a6fb2027a" 2040 | dependencies = [ 2041 | "serde", 2042 | "serde_json", 2043 | "unicode-normalization", 2044 | ] 2045 | 2046 | [[package]] 2047 | name = "once_cell" 2048 | version = "1.17.1" 2049 | source = "registry+https://github.com/rust-lang/crates.io-index" 2050 | checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" 2051 | 2052 | [[package]] 2053 | name = "opaque-debug" 2054 | version = "0.3.0" 2055 | source = "registry+https://github.com/rust-lang/crates.io-index" 2056 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 2057 | 2058 | [[package]] 2059 | name = "openssl" 2060 | version = "0.10.48" 2061 | source = "registry+https://github.com/rust-lang/crates.io-index" 2062 | checksum = "518915b97df115dd36109bfa429a48b8f737bd05508cf9588977b599648926d2" 2063 | dependencies = [ 2064 | "bitflags", 2065 | "cfg-if", 2066 | "foreign-types", 2067 | "libc", 2068 | "once_cell", 2069 | "openssl-macros", 2070 | "openssl-sys", 2071 | ] 2072 | 2073 | [[package]] 2074 | name = "openssl-macros" 2075 | version = "0.1.0" 2076 | source = "registry+https://github.com/rust-lang/crates.io-index" 2077 | checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" 2078 | dependencies = [ 2079 | "proc-macro2", 2080 | "quote", 2081 | "syn 1.0.109", 2082 | ] 2083 | 2084 | [[package]] 2085 | name = "openssl-probe" 2086 | version = "0.1.5" 2087 | source = "registry+https://github.com/rust-lang/crates.io-index" 2088 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 2089 | 2090 | [[package]] 2091 | name = "openssl-sys" 2092 | version = "0.9.83" 2093 | source = "registry+https://github.com/rust-lang/crates.io-index" 2094 | checksum = "666416d899cf077260dac8698d60a60b435a46d57e82acb1be3d0dad87284e5b" 2095 | dependencies = [ 2096 | "autocfg", 2097 | "cc", 2098 | "libc", 2099 | "pkg-config", 2100 | "vcpkg", 2101 | ] 2102 | 2103 | [[package]] 2104 | name = "overload" 2105 | version = "0.1.1" 2106 | source = "registry+https://github.com/rust-lang/crates.io-index" 2107 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 2108 | 2109 | [[package]] 2110 | name = "parking" 2111 | version = "2.0.0" 2112 | source = "registry+https://github.com/rust-lang/crates.io-index" 2113 | checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" 2114 | 2115 | [[package]] 2116 | name = "parking_lot" 2117 | version = "0.12.1" 2118 | source = "registry+https://github.com/rust-lang/crates.io-index" 2119 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 2120 | dependencies = [ 2121 | "lock_api", 2122 | "parking_lot_core", 2123 | ] 2124 | 2125 | [[package]] 2126 | name = "parking_lot_core" 2127 | version = "0.9.7" 2128 | source = "registry+https://github.com/rust-lang/crates.io-index" 2129 | checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" 2130 | dependencies = [ 2131 | "cfg-if", 2132 | "libc", 2133 | "redox_syscall", 2134 | "smallvec", 2135 | "windows-sys 0.45.0", 2136 | ] 2137 | 2138 | [[package]] 2139 | name = "paste" 2140 | version = "1.0.12" 2141 | source = "registry+https://github.com/rust-lang/crates.io-index" 2142 | checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" 2143 | 2144 | [[package]] 2145 | name = "path-absolutize" 2146 | version = "3.0.14" 2147 | source = "registry+https://github.com/rust-lang/crates.io-index" 2148 | checksum = "0f1d4993b16f7325d90c18c3c6a3327db7808752db8d208cea0acee0abd52c52" 2149 | dependencies = [ 2150 | "path-dedot", 2151 | ] 2152 | 2153 | [[package]] 2154 | name = "path-dedot" 2155 | version = "3.0.18" 2156 | source = "registry+https://github.com/rust-lang/crates.io-index" 2157 | checksum = "9a81540d94551664b72b72829b12bd167c73c9d25fbac0e04fafa8023f7e4901" 2158 | dependencies = [ 2159 | "once_cell", 2160 | ] 2161 | 2162 | [[package]] 2163 | name = "path-slash" 2164 | version = "0.1.5" 2165 | source = "registry+https://github.com/rust-lang/crates.io-index" 2166 | checksum = "498a099351efa4becc6a19c72aa9270598e8fd274ca47052e37455241c88b696" 2167 | 2168 | [[package]] 2169 | name = "pathdiff" 2170 | version = "0.2.1" 2171 | source = "registry+https://github.com/rust-lang/crates.io-index" 2172 | checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" 2173 | 2174 | [[package]] 2175 | name = "pem" 2176 | version = "1.1.1" 2177 | source = "registry+https://github.com/rust-lang/crates.io-index" 2178 | checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" 2179 | dependencies = [ 2180 | "base64 0.13.1", 2181 | ] 2182 | 2183 | [[package]] 2184 | name = "pem-rfc7468" 2185 | version = "0.3.1" 2186 | source = "registry+https://github.com/rust-lang/crates.io-index" 2187 | checksum = "01de5d978f34aa4b2296576379fcc416034702fd94117c56ffd8a1a767cefb30" 2188 | dependencies = [ 2189 | "base64ct", 2190 | ] 2191 | 2192 | [[package]] 2193 | name = "percent-encoding" 2194 | version = "1.0.1" 2195 | source = "registry+https://github.com/rust-lang/crates.io-index" 2196 | checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" 2197 | 2198 | [[package]] 2199 | name = "percent-encoding" 2200 | version = "2.1.0" 2201 | source = "registry+https://github.com/rust-lang/crates.io-index" 2202 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 2203 | 2204 | [[package]] 2205 | name = "picky" 2206 | version = "7.0.0-rc.2" 2207 | source = "git+https://github.com/Devolutions/picky-rs.git?tag=picky-7.0.0-rc.2#912af2ea93051e53aadf97a1dc8bb5e43dee51ee" 2208 | dependencies = [ 2209 | "base64 0.13.1", 2210 | "digest 0.10.6", 2211 | "md-5", 2212 | "num-bigint-dig", 2213 | "oid", 2214 | "picky-asn1", 2215 | "picky-asn1-der", 2216 | "picky-asn1-x509", 2217 | "rand", 2218 | "ring", 2219 | "rsa", 2220 | "serde", 2221 | "sha-1", 2222 | "sha2 0.10.6", 2223 | "sha3", 2224 | "thiserror", 2225 | ] 2226 | 2227 | [[package]] 2228 | name = "picky-asn1" 2229 | version = "0.5.0" 2230 | source = "git+https://github.com/Devolutions/picky-rs.git?tag=picky-7.0.0-rc.2#912af2ea93051e53aadf97a1dc8bb5e43dee51ee" 2231 | dependencies = [ 2232 | "oid", 2233 | "serde", 2234 | "serde_bytes", 2235 | ] 2236 | 2237 | [[package]] 2238 | name = "picky-asn1-der" 2239 | version = "0.3.0" 2240 | source = "git+https://github.com/Devolutions/picky-rs.git?tag=picky-7.0.0-rc.2#912af2ea93051e53aadf97a1dc8bb5e43dee51ee" 2241 | dependencies = [ 2242 | "picky-asn1", 2243 | "serde", 2244 | "serde_bytes", 2245 | ] 2246 | 2247 | [[package]] 2248 | name = "picky-asn1-x509" 2249 | version = "0.7.0" 2250 | source = "git+https://github.com/Devolutions/picky-rs.git?tag=picky-7.0.0-rc.2#912af2ea93051e53aadf97a1dc8bb5e43dee51ee" 2251 | dependencies = [ 2252 | "base64 0.13.1", 2253 | "num-bigint-dig", 2254 | "oid", 2255 | "picky-asn1", 2256 | "picky-asn1-der", 2257 | "serde", 2258 | ] 2259 | 2260 | [[package]] 2261 | name = "pin-project" 2262 | version = "1.0.12" 2263 | source = "registry+https://github.com/rust-lang/crates.io-index" 2264 | checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" 2265 | dependencies = [ 2266 | "pin-project-internal", 2267 | ] 2268 | 2269 | [[package]] 2270 | name = "pin-project-internal" 2271 | version = "1.0.12" 2272 | source = "registry+https://github.com/rust-lang/crates.io-index" 2273 | checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" 2274 | dependencies = [ 2275 | "proc-macro2", 2276 | "quote", 2277 | "syn 1.0.109", 2278 | ] 2279 | 2280 | [[package]] 2281 | name = "pin-project-lite" 2282 | version = "0.2.12" 2283 | source = "registry+https://github.com/rust-lang/crates.io-index" 2284 | checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" 2285 | 2286 | [[package]] 2287 | name = "pin-utils" 2288 | version = "0.1.0" 2289 | source = "registry+https://github.com/rust-lang/crates.io-index" 2290 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 2291 | 2292 | [[package]] 2293 | name = "pkcs1" 2294 | version = "0.3.3" 2295 | source = "registry+https://github.com/rust-lang/crates.io-index" 2296 | checksum = "a78f66c04ccc83dd4486fd46c33896f4e17b24a7a3a6400dedc48ed0ddd72320" 2297 | dependencies = [ 2298 | "der", 2299 | "pkcs8", 2300 | "zeroize", 2301 | ] 2302 | 2303 | [[package]] 2304 | name = "pkcs8" 2305 | version = "0.8.0" 2306 | source = "registry+https://github.com/rust-lang/crates.io-index" 2307 | checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" 2308 | dependencies = [ 2309 | "der", 2310 | "spki", 2311 | "zeroize", 2312 | ] 2313 | 2314 | [[package]] 2315 | name = "pkg-config" 2316 | version = "0.3.26" 2317 | source = "registry+https://github.com/rust-lang/crates.io-index" 2318 | checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" 2319 | 2320 | [[package]] 2321 | name = "policy-fetcher" 2322 | version = "0.6.1" 2323 | source = "git+https://github.com/kubewarden/policy-fetcher?tag=v0.6.1#75dfde5f6ecc619147646d55d48ab9ce84e1b5b8" 2324 | dependencies = [ 2325 | "anyhow", 2326 | "async-std", 2327 | "async-stream", 2328 | "async-trait", 2329 | "base64 0.13.1", 2330 | "directories 4.0.1", 2331 | "lazy_static", 2332 | "oci-distribution", 2333 | "path-slash", 2334 | "rayon", 2335 | "regex", 2336 | "reqwest 0.11.15", 2337 | "rustls", 2338 | "serde", 2339 | "serde_json", 2340 | "serde_yaml", 2341 | "sha2 0.10.6", 2342 | "sigstore", 2343 | "tracing", 2344 | "url 2.3.0", 2345 | "walkdir", 2346 | ] 2347 | 2348 | [[package]] 2349 | name = "polling" 2350 | version = "2.6.0" 2351 | source = "registry+https://github.com/rust-lang/crates.io-index" 2352 | checksum = "7e1f879b2998099c2d69ab9605d145d5b661195627eccc680002c4918a7fb6fa" 2353 | dependencies = [ 2354 | "autocfg", 2355 | "bitflags", 2356 | "cfg-if", 2357 | "concurrent-queue", 2358 | "libc", 2359 | "log", 2360 | "pin-project-lite", 2361 | "windows-sys 0.45.0", 2362 | ] 2363 | 2364 | [[package]] 2365 | name = "ppv-lite86" 2366 | version = "0.2.17" 2367 | source = "registry+https://github.com/rust-lang/crates.io-index" 2368 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 2369 | 2370 | [[package]] 2371 | name = "proc-macro2" 2372 | version = "1.0.69" 2373 | source = "registry+https://github.com/rust-lang/crates.io-index" 2374 | checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" 2375 | dependencies = [ 2376 | "unicode-ident", 2377 | ] 2378 | 2379 | [[package]] 2380 | name = "psm" 2381 | version = "0.1.21" 2382 | source = "registry+https://github.com/rust-lang/crates.io-index" 2383 | checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" 2384 | dependencies = [ 2385 | "cc", 2386 | ] 2387 | 2388 | [[package]] 2389 | name = "pulldown-cmark" 2390 | version = "0.8.0" 2391 | source = "registry+https://github.com/rust-lang/crates.io-index" 2392 | checksum = "ffade02495f22453cd593159ea2f59827aae7f53fa8323f756799b670881dcf8" 2393 | dependencies = [ 2394 | "bitflags", 2395 | "memchr", 2396 | "unicase 2.6.0", 2397 | ] 2398 | 2399 | [[package]] 2400 | name = "quote" 2401 | version = "1.0.26" 2402 | source = "registry+https://github.com/rust-lang/crates.io-index" 2403 | checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" 2404 | dependencies = [ 2405 | "proc-macro2", 2406 | ] 2407 | 2408 | [[package]] 2409 | name = "rand" 2410 | version = "0.8.5" 2411 | source = "registry+https://github.com/rust-lang/crates.io-index" 2412 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2413 | dependencies = [ 2414 | "libc", 2415 | "rand_chacha", 2416 | "rand_core", 2417 | ] 2418 | 2419 | [[package]] 2420 | name = "rand_chacha" 2421 | version = "0.3.1" 2422 | source = "registry+https://github.com/rust-lang/crates.io-index" 2423 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2424 | dependencies = [ 2425 | "ppv-lite86", 2426 | "rand_core", 2427 | ] 2428 | 2429 | [[package]] 2430 | name = "rand_core" 2431 | version = "0.6.4" 2432 | source = "registry+https://github.com/rust-lang/crates.io-index" 2433 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2434 | dependencies = [ 2435 | "getrandom", 2436 | ] 2437 | 2438 | [[package]] 2439 | name = "rayon" 2440 | version = "1.7.0" 2441 | source = "registry+https://github.com/rust-lang/crates.io-index" 2442 | checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" 2443 | dependencies = [ 2444 | "either", 2445 | "rayon-core", 2446 | ] 2447 | 2448 | [[package]] 2449 | name = "rayon-core" 2450 | version = "1.11.0" 2451 | source = "registry+https://github.com/rust-lang/crates.io-index" 2452 | checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" 2453 | dependencies = [ 2454 | "crossbeam-channel", 2455 | "crossbeam-deque", 2456 | "crossbeam-utils", 2457 | "num_cpus", 2458 | ] 2459 | 2460 | [[package]] 2461 | name = "redox_syscall" 2462 | version = "0.2.16" 2463 | source = "registry+https://github.com/rust-lang/crates.io-index" 2464 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 2465 | dependencies = [ 2466 | "bitflags", 2467 | ] 2468 | 2469 | [[package]] 2470 | name = "redox_users" 2471 | version = "0.4.3" 2472 | source = "registry+https://github.com/rust-lang/crates.io-index" 2473 | checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" 2474 | dependencies = [ 2475 | "getrandom", 2476 | "redox_syscall", 2477 | "thiserror", 2478 | ] 2479 | 2480 | [[package]] 2481 | name = "regalloc" 2482 | version = "0.0.34" 2483 | source = "registry+https://github.com/rust-lang/crates.io-index" 2484 | checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" 2485 | dependencies = [ 2486 | "log", 2487 | "rustc-hash", 2488 | "smallvec", 2489 | ] 2490 | 2491 | [[package]] 2492 | name = "regex" 2493 | version = "1.10.0" 2494 | source = "registry+https://github.com/rust-lang/crates.io-index" 2495 | checksum = "d119d7c7ca818f8a53c300863d4f87566aac09943aef5b355bb83969dae75d87" 2496 | dependencies = [ 2497 | "aho-corasick 1.0.1", 2498 | "memchr", 2499 | "regex-automata 0.4.1", 2500 | "regex-syntax 0.8.0", 2501 | ] 2502 | 2503 | [[package]] 2504 | name = "regex-automata" 2505 | version = "0.1.10" 2506 | source = "registry+https://github.com/rust-lang/crates.io-index" 2507 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 2508 | dependencies = [ 2509 | "regex-syntax 0.6.29", 2510 | ] 2511 | 2512 | [[package]] 2513 | name = "regex-automata" 2514 | version = "0.4.1" 2515 | source = "registry+https://github.com/rust-lang/crates.io-index" 2516 | checksum = "465c6fc0621e4abc4187a2bda0937bfd4f722c2730b29562e19689ea796c9a4b" 2517 | dependencies = [ 2518 | "aho-corasick 1.0.1", 2519 | "memchr", 2520 | "regex-syntax 0.8.0", 2521 | ] 2522 | 2523 | [[package]] 2524 | name = "regex-syntax" 2525 | version = "0.6.29" 2526 | source = "registry+https://github.com/rust-lang/crates.io-index" 2527 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 2528 | 2529 | [[package]] 2530 | name = "regex-syntax" 2531 | version = "0.8.0" 2532 | source = "registry+https://github.com/rust-lang/crates.io-index" 2533 | checksum = "c3cbb081b9784b07cceb8824c8583f86db4814d172ab043f3c23f7dc600bf83d" 2534 | 2535 | [[package]] 2536 | name = "region" 2537 | version = "2.2.0" 2538 | source = "registry+https://github.com/rust-lang/crates.io-index" 2539 | checksum = "877e54ea2adcd70d80e9179344c97f93ef0dffd6b03e1f4529e6e83ab2fa9ae0" 2540 | dependencies = [ 2541 | "bitflags", 2542 | "libc", 2543 | "mach", 2544 | "winapi", 2545 | ] 2546 | 2547 | [[package]] 2548 | name = "reqwest" 2549 | version = "0.11.10" 2550 | source = "git+https://github.com/seanmonstar/reqwest.git?rev=2e5debe24832d4a28a90dbe0eb092eea27386d41#2e5debe24832d4a28a90dbe0eb092eea27386d41" 2551 | dependencies = [ 2552 | "base64 0.13.1", 2553 | "bytes", 2554 | "encoding_rs", 2555 | "futures-core", 2556 | "futures-util", 2557 | "h2", 2558 | "http", 2559 | "http-body", 2560 | "hyper", 2561 | "hyper-rustls", 2562 | "hyper-tls", 2563 | "ipnet", 2564 | "js-sys", 2565 | "lazy_static", 2566 | "log", 2567 | "mime", 2568 | "native-tls", 2569 | "percent-encoding 2.1.0", 2570 | "pin-project-lite", 2571 | "rustls", 2572 | "rustls-pemfile", 2573 | "serde", 2574 | "serde_json", 2575 | "serde_urlencoded", 2576 | "tokio", 2577 | "tokio-native-tls", 2578 | "tokio-rustls", 2579 | "url 2.3.0", 2580 | "wasm-bindgen", 2581 | "wasm-bindgen-futures", 2582 | "web-sys", 2583 | "webpki-roots", 2584 | "winreg", 2585 | ] 2586 | 2587 | [[package]] 2588 | name = "reqwest" 2589 | version = "0.11.15" 2590 | source = "registry+https://github.com/rust-lang/crates.io-index" 2591 | checksum = "0ba30cc2c0cd02af1222ed216ba659cdb2f879dfe3181852fe7c50b1d0005949" 2592 | dependencies = [ 2593 | "base64 0.21.0", 2594 | "bytes", 2595 | "encoding_rs", 2596 | "futures-core", 2597 | "futures-util", 2598 | "h2", 2599 | "http", 2600 | "http-body", 2601 | "hyper", 2602 | "hyper-rustls", 2603 | "ipnet", 2604 | "js-sys", 2605 | "log", 2606 | "mime", 2607 | "once_cell", 2608 | "percent-encoding 2.1.0", 2609 | "pin-project-lite", 2610 | "rustls", 2611 | "rustls-pemfile", 2612 | "serde", 2613 | "serde_json", 2614 | "serde_urlencoded", 2615 | "tokio", 2616 | "tokio-rustls", 2617 | "tokio-util", 2618 | "tower-service", 2619 | "url 2.3.0", 2620 | "wasm-bindgen", 2621 | "wasm-bindgen-futures", 2622 | "wasm-streams", 2623 | "web-sys", 2624 | "webpki-roots", 2625 | "winreg", 2626 | ] 2627 | 2628 | [[package]] 2629 | name = "ring" 2630 | version = "0.16.20" 2631 | source = "registry+https://github.com/rust-lang/crates.io-index" 2632 | checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" 2633 | dependencies = [ 2634 | "cc", 2635 | "libc", 2636 | "once_cell", 2637 | "spin", 2638 | "untrusted", 2639 | "web-sys", 2640 | "winapi", 2641 | ] 2642 | 2643 | [[package]] 2644 | name = "rsa" 2645 | version = "0.6.1" 2646 | source = "registry+https://github.com/rust-lang/crates.io-index" 2647 | checksum = "4cf22754c49613d2b3b119f0e5d46e34a2c628a937e3024b8762de4e7d8c710b" 2648 | dependencies = [ 2649 | "byteorder", 2650 | "digest 0.10.6", 2651 | "num-bigint-dig", 2652 | "num-integer", 2653 | "num-iter", 2654 | "num-traits", 2655 | "pkcs1", 2656 | "pkcs8", 2657 | "rand_core", 2658 | "smallvec", 2659 | "subtle", 2660 | "zeroize", 2661 | ] 2662 | 2663 | [[package]] 2664 | name = "rustc-demangle" 2665 | version = "0.1.22" 2666 | source = "registry+https://github.com/rust-lang/crates.io-index" 2667 | checksum = "d4a36c42d1873f9a77c53bde094f9664d9891bc604a45b4798fd2c389ed12e5b" 2668 | 2669 | [[package]] 2670 | name = "rustc-hash" 2671 | version = "1.1.0" 2672 | source = "registry+https://github.com/rust-lang/crates.io-index" 2673 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 2674 | 2675 | [[package]] 2676 | name = "rusticata-macros" 2677 | version = "4.1.0" 2678 | source = "registry+https://github.com/rust-lang/crates.io-index" 2679 | checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" 2680 | dependencies = [ 2681 | "nom", 2682 | ] 2683 | 2684 | [[package]] 2685 | name = "rustix" 2686 | version = "0.33.7" 2687 | source = "registry+https://github.com/rust-lang/crates.io-index" 2688 | checksum = "938a344304321a9da4973b9ff4f9f8db9caf4597dfd9dda6a60b523340a0fff0" 2689 | dependencies = [ 2690 | "bitflags", 2691 | "errno 0.2.8", 2692 | "io-lifetimes 0.5.3", 2693 | "itoa", 2694 | "libc", 2695 | "linux-raw-sys 0.0.42", 2696 | "once_cell", 2697 | "winapi", 2698 | ] 2699 | 2700 | [[package]] 2701 | name = "rustix" 2702 | version = "0.36.11" 2703 | source = "registry+https://github.com/rust-lang/crates.io-index" 2704 | checksum = "db4165c9963ab29e422d6c26fbc1d37f15bace6b2810221f9d925023480fcf0e" 2705 | dependencies = [ 2706 | "bitflags", 2707 | "errno 0.2.8", 2708 | "io-lifetimes 1.0.9", 2709 | "libc", 2710 | "linux-raw-sys 0.1.4", 2711 | "windows-sys 0.45.0", 2712 | ] 2713 | 2714 | [[package]] 2715 | name = "rustix" 2716 | version = "0.37.3" 2717 | source = "registry+https://github.com/rust-lang/crates.io-index" 2718 | checksum = "62b24138615de35e32031d041a09032ef3487a616d901ca4db224e7d557efae2" 2719 | dependencies = [ 2720 | "bitflags", 2721 | "errno 0.3.0", 2722 | "io-lifetimes 1.0.9", 2723 | "libc", 2724 | "linux-raw-sys 0.3.0", 2725 | "windows-sys 0.45.0", 2726 | ] 2727 | 2728 | [[package]] 2729 | name = "rustls" 2730 | version = "0.20.8" 2731 | source = "registry+https://github.com/rust-lang/crates.io-index" 2732 | checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" 2733 | dependencies = [ 2734 | "log", 2735 | "ring", 2736 | "sct", 2737 | "webpki", 2738 | ] 2739 | 2740 | [[package]] 2741 | name = "rustls-pemfile" 2742 | version = "1.0.2" 2743 | source = "registry+https://github.com/rust-lang/crates.io-index" 2744 | checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" 2745 | dependencies = [ 2746 | "base64 0.21.0", 2747 | ] 2748 | 2749 | [[package]] 2750 | name = "ryu" 2751 | version = "1.0.13" 2752 | source = "registry+https://github.com/rust-lang/crates.io-index" 2753 | checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" 2754 | 2755 | [[package]] 2756 | name = "same-file" 2757 | version = "1.0.6" 2758 | source = "registry+https://github.com/rust-lang/crates.io-index" 2759 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2760 | dependencies = [ 2761 | "winapi-util", 2762 | ] 2763 | 2764 | [[package]] 2765 | name = "schannel" 2766 | version = "0.1.21" 2767 | source = "registry+https://github.com/rust-lang/crates.io-index" 2768 | checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" 2769 | dependencies = [ 2770 | "windows-sys 0.42.0", 2771 | ] 2772 | 2773 | [[package]] 2774 | name = "scopeguard" 2775 | version = "1.1.0" 2776 | source = "registry+https://github.com/rust-lang/crates.io-index" 2777 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 2778 | 2779 | [[package]] 2780 | name = "scratch" 2781 | version = "1.0.5" 2782 | source = "registry+https://github.com/rust-lang/crates.io-index" 2783 | checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" 2784 | 2785 | [[package]] 2786 | name = "sct" 2787 | version = "0.7.0" 2788 | source = "registry+https://github.com/rust-lang/crates.io-index" 2789 | checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" 2790 | dependencies = [ 2791 | "ring", 2792 | "untrusted", 2793 | ] 2794 | 2795 | [[package]] 2796 | name = "security-framework" 2797 | version = "2.8.2" 2798 | source = "registry+https://github.com/rust-lang/crates.io-index" 2799 | checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" 2800 | dependencies = [ 2801 | "bitflags", 2802 | "core-foundation", 2803 | "core-foundation-sys", 2804 | "libc", 2805 | "security-framework-sys", 2806 | ] 2807 | 2808 | [[package]] 2809 | name = "security-framework-sys" 2810 | version = "2.8.0" 2811 | source = "registry+https://github.com/rust-lang/crates.io-index" 2812 | checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" 2813 | dependencies = [ 2814 | "core-foundation-sys", 2815 | "libc", 2816 | ] 2817 | 2818 | [[package]] 2819 | name = "serde" 2820 | version = "1.0.158" 2821 | source = "registry+https://github.com/rust-lang/crates.io-index" 2822 | checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9" 2823 | dependencies = [ 2824 | "serde_derive", 2825 | ] 2826 | 2827 | [[package]] 2828 | name = "serde_bytes" 2829 | version = "0.11.9" 2830 | source = "registry+https://github.com/rust-lang/crates.io-index" 2831 | checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" 2832 | dependencies = [ 2833 | "serde", 2834 | ] 2835 | 2836 | [[package]] 2837 | name = "serde_derive" 2838 | version = "1.0.158" 2839 | source = "registry+https://github.com/rust-lang/crates.io-index" 2840 | checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad" 2841 | dependencies = [ 2842 | "proc-macro2", 2843 | "quote", 2844 | "syn 2.0.10", 2845 | ] 2846 | 2847 | [[package]] 2848 | name = "serde_json" 2849 | version = "1.0.94" 2850 | source = "registry+https://github.com/rust-lang/crates.io-index" 2851 | checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea" 2852 | dependencies = [ 2853 | "itoa", 2854 | "ryu", 2855 | "serde", 2856 | ] 2857 | 2858 | [[package]] 2859 | name = "serde_plain" 2860 | version = "1.0.1" 2861 | source = "registry+https://github.com/rust-lang/crates.io-index" 2862 | checksum = "d6018081315db179d0ce57b1fe4b62a12a0028c9cf9bbef868c9cf477b3c34ae" 2863 | dependencies = [ 2864 | "serde", 2865 | ] 2866 | 2867 | [[package]] 2868 | name = "serde_urlencoded" 2869 | version = "0.7.1" 2870 | source = "registry+https://github.com/rust-lang/crates.io-index" 2871 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2872 | dependencies = [ 2873 | "form_urlencoded", 2874 | "itoa", 2875 | "ryu", 2876 | "serde", 2877 | ] 2878 | 2879 | [[package]] 2880 | name = "serde_yaml" 2881 | version = "0.8.26" 2882 | source = "registry+https://github.com/rust-lang/crates.io-index" 2883 | checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" 2884 | dependencies = [ 2885 | "indexmap", 2886 | "ryu", 2887 | "serde", 2888 | "yaml-rust", 2889 | ] 2890 | 2891 | [[package]] 2892 | name = "sha-1" 2893 | version = "0.10.1" 2894 | source = "registry+https://github.com/rust-lang/crates.io-index" 2895 | checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" 2896 | dependencies = [ 2897 | "cfg-if", 2898 | "cpufeatures", 2899 | "digest 0.10.6", 2900 | ] 2901 | 2902 | [[package]] 2903 | name = "sha2" 2904 | version = "0.9.9" 2905 | source = "registry+https://github.com/rust-lang/crates.io-index" 2906 | checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" 2907 | dependencies = [ 2908 | "block-buffer 0.9.0", 2909 | "cfg-if", 2910 | "cpufeatures", 2911 | "digest 0.9.0", 2912 | "opaque-debug", 2913 | ] 2914 | 2915 | [[package]] 2916 | name = "sha2" 2917 | version = "0.10.6" 2918 | source = "registry+https://github.com/rust-lang/crates.io-index" 2919 | checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" 2920 | dependencies = [ 2921 | "cfg-if", 2922 | "cpufeatures", 2923 | "digest 0.10.6", 2924 | ] 2925 | 2926 | [[package]] 2927 | name = "sha3" 2928 | version = "0.10.6" 2929 | source = "registry+https://github.com/rust-lang/crates.io-index" 2930 | checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" 2931 | dependencies = [ 2932 | "digest 0.10.6", 2933 | "keccak", 2934 | ] 2935 | 2936 | [[package]] 2937 | name = "sharded-slab" 2938 | version = "0.1.4" 2939 | source = "registry+https://github.com/rust-lang/crates.io-index" 2940 | checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" 2941 | dependencies = [ 2942 | "lazy_static", 2943 | ] 2944 | 2945 | [[package]] 2946 | name = "shellexpand" 2947 | version = "2.1.2" 2948 | source = "registry+https://github.com/rust-lang/crates.io-index" 2949 | checksum = "7ccc8076840c4da029af4f87e4e8daeb0fca6b87bbb02e10cb60b791450e11e4" 2950 | dependencies = [ 2951 | "dirs", 2952 | ] 2953 | 2954 | [[package]] 2955 | name = "signal-hook-registry" 2956 | version = "1.4.1" 2957 | source = "registry+https://github.com/rust-lang/crates.io-index" 2958 | checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" 2959 | dependencies = [ 2960 | "libc", 2961 | ] 2962 | 2963 | [[package]] 2964 | name = "sigstore" 2965 | version = "0.2.0" 2966 | source = "git+https://github.com/sigstore/sigstore-rs?rev=3954129ff0fc91beb8b8a6568ecb09e8c2d19392#3954129ff0fc91beb8b8a6568ecb09e8c2d19392" 2967 | dependencies = [ 2968 | "async-trait", 2969 | "base64 0.13.1", 2970 | "lazy_static", 2971 | "oci-distribution", 2972 | "olpc-cjson", 2973 | "pem", 2974 | "picky", 2975 | "regex", 2976 | "ring", 2977 | "serde", 2978 | "serde_json", 2979 | "sha2 0.10.6", 2980 | "thiserror", 2981 | "tokio", 2982 | "tough", 2983 | "tracing", 2984 | "url 2.3.0", 2985 | "x509-parser", 2986 | ] 2987 | 2988 | [[package]] 2989 | name = "slab" 2990 | version = "0.4.8" 2991 | source = "registry+https://github.com/rust-lang/crates.io-index" 2992 | checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" 2993 | dependencies = [ 2994 | "autocfg", 2995 | ] 2996 | 2997 | [[package]] 2998 | name = "smallvec" 2999 | version = "1.10.0" 3000 | source = "registry+https://github.com/rust-lang/crates.io-index" 3001 | checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" 3002 | 3003 | [[package]] 3004 | name = "snafu" 3005 | version = "0.7.4" 3006 | source = "registry+https://github.com/rust-lang/crates.io-index" 3007 | checksum = "cb0656e7e3ffb70f6c39b3c2a86332bb74aa3c679da781642590f3c1118c5045" 3008 | dependencies = [ 3009 | "doc-comment", 3010 | "snafu-derive", 3011 | ] 3012 | 3013 | [[package]] 3014 | name = "snafu-derive" 3015 | version = "0.7.4" 3016 | source = "registry+https://github.com/rust-lang/crates.io-index" 3017 | checksum = "475b3bbe5245c26f2d8a6f62d67c1f30eb9fffeccee721c45d162c3ebbdf81b2" 3018 | dependencies = [ 3019 | "heck 0.4.1", 3020 | "proc-macro2", 3021 | "quote", 3022 | "syn 1.0.109", 3023 | ] 3024 | 3025 | [[package]] 3026 | name = "socket2" 3027 | version = "0.4.9" 3028 | source = "registry+https://github.com/rust-lang/crates.io-index" 3029 | checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" 3030 | dependencies = [ 3031 | "libc", 3032 | "winapi", 3033 | ] 3034 | 3035 | [[package]] 3036 | name = "socket2" 3037 | version = "0.5.5" 3038 | source = "registry+https://github.com/rust-lang/crates.io-index" 3039 | checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" 3040 | dependencies = [ 3041 | "libc", 3042 | "windows-sys 0.48.0", 3043 | ] 3044 | 3045 | [[package]] 3046 | name = "spin" 3047 | version = "0.5.2" 3048 | source = "registry+https://github.com/rust-lang/crates.io-index" 3049 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 3050 | 3051 | [[package]] 3052 | name = "spki" 3053 | version = "0.5.4" 3054 | source = "registry+https://github.com/rust-lang/crates.io-index" 3055 | checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" 3056 | dependencies = [ 3057 | "base64ct", 3058 | "der", 3059 | ] 3060 | 3061 | [[package]] 3062 | name = "stable_deref_trait" 3063 | version = "1.2.0" 3064 | source = "registry+https://github.com/rust-lang/crates.io-index" 3065 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 3066 | 3067 | [[package]] 3068 | name = "strsim" 3069 | version = "0.10.0" 3070 | source = "registry+https://github.com/rust-lang/crates.io-index" 3071 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 3072 | 3073 | [[package]] 3074 | name = "subtle" 3075 | version = "2.4.1" 3076 | source = "registry+https://github.com/rust-lang/crates.io-index" 3077 | checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" 3078 | 3079 | [[package]] 3080 | name = "syn" 3081 | version = "1.0.109" 3082 | source = "registry+https://github.com/rust-lang/crates.io-index" 3083 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 3084 | dependencies = [ 3085 | "proc-macro2", 3086 | "quote", 3087 | "unicode-ident", 3088 | ] 3089 | 3090 | [[package]] 3091 | name = "syn" 3092 | version = "2.0.10" 3093 | source = "registry+https://github.com/rust-lang/crates.io-index" 3094 | checksum = "5aad1363ed6d37b84299588d62d3a7d95b5a5c2d9aad5c85609fda12afaa1f40" 3095 | dependencies = [ 3096 | "proc-macro2", 3097 | "quote", 3098 | "unicode-ident", 3099 | ] 3100 | 3101 | [[package]] 3102 | name = "system-interface" 3103 | version = "0.20.0" 3104 | source = "registry+https://github.com/rust-lang/crates.io-index" 3105 | checksum = "1e09bb3fb4e02ec4b87e182ea9718fadbc0fa3e50085b40a9af9690572b67f9e" 3106 | dependencies = [ 3107 | "atty", 3108 | "bitflags", 3109 | "cap-fs-ext", 3110 | "cap-std", 3111 | "io-lifetimes 0.5.3", 3112 | "rustix 0.33.7", 3113 | "winapi", 3114 | "winx", 3115 | ] 3116 | 3117 | [[package]] 3118 | name = "target-lexicon" 3119 | version = "0.12.6" 3120 | source = "registry+https://github.com/rust-lang/crates.io-index" 3121 | checksum = "8ae9980cab1db3fceee2f6c6f643d5d8de2997c58ee8d25fb0cc8a9e9e7348e5" 3122 | 3123 | [[package]] 3124 | name = "tempfile" 3125 | version = "3.4.0" 3126 | source = "registry+https://github.com/rust-lang/crates.io-index" 3127 | checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95" 3128 | dependencies = [ 3129 | "cfg-if", 3130 | "fastrand", 3131 | "redox_syscall", 3132 | "rustix 0.36.11", 3133 | "windows-sys 0.42.0", 3134 | ] 3135 | 3136 | [[package]] 3137 | name = "term-table" 3138 | version = "1.3.2" 3139 | source = "registry+https://github.com/rust-lang/crates.io-index" 3140 | checksum = "d5e59d7fb313157de2a568be8d81e4d7f9af6e50e697702e8e00190a6566d3b8" 3141 | dependencies = [ 3142 | "lazy_static", 3143 | "regex", 3144 | "unicode-width", 3145 | ] 3146 | 3147 | [[package]] 3148 | name = "termcolor" 3149 | version = "1.2.0" 3150 | source = "registry+https://github.com/rust-lang/crates.io-index" 3151 | checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" 3152 | dependencies = [ 3153 | "winapi-util", 3154 | ] 3155 | 3156 | [[package]] 3157 | name = "thiserror" 3158 | version = "1.0.40" 3159 | source = "registry+https://github.com/rust-lang/crates.io-index" 3160 | checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" 3161 | dependencies = [ 3162 | "thiserror-impl", 3163 | ] 3164 | 3165 | [[package]] 3166 | name = "thiserror-impl" 3167 | version = "1.0.40" 3168 | source = "registry+https://github.com/rust-lang/crates.io-index" 3169 | checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" 3170 | dependencies = [ 3171 | "proc-macro2", 3172 | "quote", 3173 | "syn 2.0.10", 3174 | ] 3175 | 3176 | [[package]] 3177 | name = "thread_local" 3178 | version = "1.1.7" 3179 | source = "registry+https://github.com/rust-lang/crates.io-index" 3180 | checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" 3181 | dependencies = [ 3182 | "cfg-if", 3183 | "once_cell", 3184 | ] 3185 | 3186 | [[package]] 3187 | name = "tinyvec" 3188 | version = "1.6.0" 3189 | source = "registry+https://github.com/rust-lang/crates.io-index" 3190 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 3191 | dependencies = [ 3192 | "tinyvec_macros", 3193 | ] 3194 | 3195 | [[package]] 3196 | name = "tinyvec_macros" 3197 | version = "0.1.1" 3198 | source = "registry+https://github.com/rust-lang/crates.io-index" 3199 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 3200 | 3201 | [[package]] 3202 | name = "tokio" 3203 | version = "1.35.0" 3204 | source = "registry+https://github.com/rust-lang/crates.io-index" 3205 | checksum = "841d45b238a16291a4e1584e61820b8ae57d696cc5015c459c229ccc6990cc1c" 3206 | dependencies = [ 3207 | "backtrace", 3208 | "bytes", 3209 | "libc", 3210 | "mio", 3211 | "num_cpus", 3212 | "parking_lot", 3213 | "pin-project-lite", 3214 | "signal-hook-registry", 3215 | "socket2 0.5.5", 3216 | "tokio-macros", 3217 | "windows-sys 0.48.0", 3218 | ] 3219 | 3220 | [[package]] 3221 | name = "tokio-macros" 3222 | version = "2.2.0" 3223 | source = "registry+https://github.com/rust-lang/crates.io-index" 3224 | checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" 3225 | dependencies = [ 3226 | "proc-macro2", 3227 | "quote", 3228 | "syn 2.0.10", 3229 | ] 3230 | 3231 | [[package]] 3232 | name = "tokio-native-tls" 3233 | version = "0.3.1" 3234 | source = "registry+https://github.com/rust-lang/crates.io-index" 3235 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 3236 | dependencies = [ 3237 | "native-tls", 3238 | "tokio", 3239 | ] 3240 | 3241 | [[package]] 3242 | name = "tokio-rustls" 3243 | version = "0.23.4" 3244 | source = "registry+https://github.com/rust-lang/crates.io-index" 3245 | checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" 3246 | dependencies = [ 3247 | "rustls", 3248 | "tokio", 3249 | "webpki", 3250 | ] 3251 | 3252 | [[package]] 3253 | name = "tokio-util" 3254 | version = "0.7.7" 3255 | source = "registry+https://github.com/rust-lang/crates.io-index" 3256 | checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" 3257 | dependencies = [ 3258 | "bytes", 3259 | "futures-core", 3260 | "futures-sink", 3261 | "pin-project-lite", 3262 | "tokio", 3263 | "tracing", 3264 | ] 3265 | 3266 | [[package]] 3267 | name = "toml" 3268 | version = "0.5.11" 3269 | source = "registry+https://github.com/rust-lang/crates.io-index" 3270 | checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" 3271 | dependencies = [ 3272 | "serde", 3273 | ] 3274 | 3275 | [[package]] 3276 | name = "tough" 3277 | version = "0.12.5" 3278 | source = "registry+https://github.com/rust-lang/crates.io-index" 3279 | checksum = "dc636dd1ee889a366af6731f1b63b60baf19528b46df5a7c2d4b3bf8b60bca2d" 3280 | dependencies = [ 3281 | "chrono", 3282 | "dyn-clone", 3283 | "globset", 3284 | "hex", 3285 | "log", 3286 | "olpc-cjson", 3287 | "path-absolutize", 3288 | "pem", 3289 | "percent-encoding 2.1.0", 3290 | "reqwest 0.11.15", 3291 | "ring", 3292 | "serde", 3293 | "serde_json", 3294 | "serde_plain", 3295 | "snafu", 3296 | "tempfile", 3297 | "untrusted", 3298 | "url 2.3.0", 3299 | "walkdir", 3300 | ] 3301 | 3302 | [[package]] 3303 | name = "tower-service" 3304 | version = "0.3.2" 3305 | source = "registry+https://github.com/rust-lang/crates.io-index" 3306 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 3307 | 3308 | [[package]] 3309 | name = "tracing" 3310 | version = "0.1.37" 3311 | source = "registry+https://github.com/rust-lang/crates.io-index" 3312 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 3313 | dependencies = [ 3314 | "cfg-if", 3315 | "log", 3316 | "pin-project-lite", 3317 | "tracing-attributes", 3318 | "tracing-core", 3319 | ] 3320 | 3321 | [[package]] 3322 | name = "tracing-attributes" 3323 | version = "0.1.23" 3324 | source = "registry+https://github.com/rust-lang/crates.io-index" 3325 | checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" 3326 | dependencies = [ 3327 | "proc-macro2", 3328 | "quote", 3329 | "syn 1.0.109", 3330 | ] 3331 | 3332 | [[package]] 3333 | name = "tracing-core" 3334 | version = "0.1.30" 3335 | source = "registry+https://github.com/rust-lang/crates.io-index" 3336 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 3337 | dependencies = [ 3338 | "once_cell", 3339 | "valuable", 3340 | ] 3341 | 3342 | [[package]] 3343 | name = "tracing-futures" 3344 | version = "0.2.5" 3345 | source = "registry+https://github.com/rust-lang/crates.io-index" 3346 | checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" 3347 | dependencies = [ 3348 | "pin-project", 3349 | "tracing", 3350 | ] 3351 | 3352 | [[package]] 3353 | name = "tracing-log" 3354 | version = "0.1.3" 3355 | source = "registry+https://github.com/rust-lang/crates.io-index" 3356 | checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" 3357 | dependencies = [ 3358 | "lazy_static", 3359 | "log", 3360 | "tracing-core", 3361 | ] 3362 | 3363 | [[package]] 3364 | name = "tracing-subscriber" 3365 | version = "0.3.16" 3366 | source = "registry+https://github.com/rust-lang/crates.io-index" 3367 | checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" 3368 | dependencies = [ 3369 | "matchers", 3370 | "nu-ansi-term", 3371 | "once_cell", 3372 | "regex", 3373 | "sharded-slab", 3374 | "smallvec", 3375 | "thread_local", 3376 | "tracing", 3377 | "tracing-core", 3378 | "tracing-log", 3379 | ] 3380 | 3381 | [[package]] 3382 | name = "try-lock" 3383 | version = "0.2.4" 3384 | source = "registry+https://github.com/rust-lang/crates.io-index" 3385 | checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" 3386 | 3387 | [[package]] 3388 | name = "typenum" 3389 | version = "1.16.0" 3390 | source = "registry+https://github.com/rust-lang/crates.io-index" 3391 | checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" 3392 | 3393 | [[package]] 3394 | name = "unicase" 3395 | version = "1.4.2" 3396 | source = "registry+https://github.com/rust-lang/crates.io-index" 3397 | checksum = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" 3398 | dependencies = [ 3399 | "version_check 0.1.5", 3400 | ] 3401 | 3402 | [[package]] 3403 | name = "unicase" 3404 | version = "2.6.0" 3405 | source = "registry+https://github.com/rust-lang/crates.io-index" 3406 | checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 3407 | dependencies = [ 3408 | "version_check 0.9.4", 3409 | ] 3410 | 3411 | [[package]] 3412 | name = "unicode-bidi" 3413 | version = "0.3.13" 3414 | source = "registry+https://github.com/rust-lang/crates.io-index" 3415 | checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" 3416 | 3417 | [[package]] 3418 | name = "unicode-ident" 3419 | version = "1.0.8" 3420 | source = "registry+https://github.com/rust-lang/crates.io-index" 3421 | checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" 3422 | 3423 | [[package]] 3424 | name = "unicode-normalization" 3425 | version = "0.1.22" 3426 | source = "registry+https://github.com/rust-lang/crates.io-index" 3427 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 3428 | dependencies = [ 3429 | "tinyvec", 3430 | ] 3431 | 3432 | [[package]] 3433 | name = "unicode-segmentation" 3434 | version = "1.10.1" 3435 | source = "registry+https://github.com/rust-lang/crates.io-index" 3436 | checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" 3437 | 3438 | [[package]] 3439 | name = "unicode-width" 3440 | version = "0.1.10" 3441 | source = "registry+https://github.com/rust-lang/crates.io-index" 3442 | checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" 3443 | 3444 | [[package]] 3445 | name = "unicode-xid" 3446 | version = "0.2.4" 3447 | source = "registry+https://github.com/rust-lang/crates.io-index" 3448 | checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" 3449 | 3450 | [[package]] 3451 | name = "untrusted" 3452 | version = "0.7.1" 3453 | source = "registry+https://github.com/rust-lang/crates.io-index" 3454 | checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" 3455 | 3456 | [[package]] 3457 | name = "url" 3458 | version = "1.7.2" 3459 | source = "registry+https://github.com/rust-lang/crates.io-index" 3460 | checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" 3461 | dependencies = [ 3462 | "idna 0.1.5", 3463 | "matches", 3464 | "percent-encoding 1.0.1", 3465 | ] 3466 | 3467 | [[package]] 3468 | name = "url" 3469 | version = "2.3.0" 3470 | source = "registry+https://github.com/rust-lang/crates.io-index" 3471 | checksum = "22fe195a4f217c25b25cb5058ced57059824a678474874038dc88d211bf508d3" 3472 | dependencies = [ 3473 | "form_urlencoded", 3474 | "idna 0.2.3", 3475 | "percent-encoding 2.1.0", 3476 | "serde", 3477 | ] 3478 | 3479 | [[package]] 3480 | name = "utf8parse" 3481 | version = "0.2.1" 3482 | source = "registry+https://github.com/rust-lang/crates.io-index" 3483 | checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 3484 | 3485 | [[package]] 3486 | name = "uuid" 3487 | version = "1.6.1" 3488 | source = "registry+https://github.com/rust-lang/crates.io-index" 3489 | checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" 3490 | dependencies = [ 3491 | "getrandom", 3492 | ] 3493 | 3494 | [[package]] 3495 | name = "valuable" 3496 | version = "0.1.0" 3497 | source = "registry+https://github.com/rust-lang/crates.io-index" 3498 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 3499 | 3500 | [[package]] 3501 | name = "value-bag" 3502 | version = "1.0.0-alpha.9" 3503 | source = "registry+https://github.com/rust-lang/crates.io-index" 3504 | checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" 3505 | dependencies = [ 3506 | "ctor", 3507 | "version_check 0.9.4", 3508 | ] 3509 | 3510 | [[package]] 3511 | name = "vcpkg" 3512 | version = "0.2.15" 3513 | source = "registry+https://github.com/rust-lang/crates.io-index" 3514 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 3515 | 3516 | [[package]] 3517 | name = "version_check" 3518 | version = "0.1.5" 3519 | source = "registry+https://github.com/rust-lang/crates.io-index" 3520 | checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" 3521 | 3522 | [[package]] 3523 | name = "version_check" 3524 | version = "0.9.4" 3525 | source = "registry+https://github.com/rust-lang/crates.io-index" 3526 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 3527 | 3528 | [[package]] 3529 | name = "waker-fn" 3530 | version = "1.1.0" 3531 | source = "registry+https://github.com/rust-lang/crates.io-index" 3532 | checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" 3533 | 3534 | [[package]] 3535 | name = "walkdir" 3536 | version = "2.3.3" 3537 | source = "registry+https://github.com/rust-lang/crates.io-index" 3538 | checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" 3539 | dependencies = [ 3540 | "same-file", 3541 | "winapi-util", 3542 | ] 3543 | 3544 | [[package]] 3545 | name = "want" 3546 | version = "0.3.0" 3547 | source = "registry+https://github.com/rust-lang/crates.io-index" 3548 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 3549 | dependencies = [ 3550 | "log", 3551 | "try-lock", 3552 | ] 3553 | 3554 | [[package]] 3555 | name = "wasi" 3556 | version = "0.11.0+wasi-snapshot-preview1" 3557 | source = "registry+https://github.com/rust-lang/crates.io-index" 3558 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3559 | 3560 | [[package]] 3561 | name = "wasi-cap-std-sync" 3562 | version = "0.34.2" 3563 | source = "registry+https://github.com/rust-lang/crates.io-index" 3564 | checksum = "09b1c389a029e158b3dbb1be62d47ffcd959db94eeafd0d8c38bef15e6097fae" 3565 | dependencies = [ 3566 | "anyhow", 3567 | "async-trait", 3568 | "cap-fs-ext", 3569 | "cap-rand", 3570 | "cap-std", 3571 | "cap-time-ext", 3572 | "fs-set-times", 3573 | "io-extras", 3574 | "io-lifetimes 0.5.3", 3575 | "is-terminal 0.1.0", 3576 | "lazy_static", 3577 | "rustix 0.33.7", 3578 | "system-interface", 3579 | "tracing", 3580 | "wasi-common", 3581 | "winapi", 3582 | ] 3583 | 3584 | [[package]] 3585 | name = "wasi-common" 3586 | version = "0.34.2" 3587 | source = "registry+https://github.com/rust-lang/crates.io-index" 3588 | checksum = "7cd93ae0ba21453de39b6c08c5c22ce6ff75393e3094e449631d7dcd562495c3" 3589 | dependencies = [ 3590 | "anyhow", 3591 | "bitflags", 3592 | "cap-rand", 3593 | "cap-std", 3594 | "rustix 0.33.7", 3595 | "thiserror", 3596 | "tracing", 3597 | "wiggle", 3598 | "winapi", 3599 | ] 3600 | 3601 | [[package]] 3602 | name = "wasi-outbound-http-defs" 3603 | version = "0.1.0" 3604 | source = "git+https://github.com/flavio/wasi-experimental-toolkit?branch=wasi-outbount-http-add-request-config#7321ff5a3735e4c9dd368c0abce733b1fce6fcaa" 3605 | dependencies = [ 3606 | "lazy_static", 3607 | ] 3608 | 3609 | [[package]] 3610 | name = "wasi-outbound-http-wasmtime-kube" 3611 | version = "0.1.0" 3612 | dependencies = [ 3613 | "anyhow", 3614 | "bytes", 3615 | "cfg-if", 3616 | "futures", 3617 | "http", 3618 | "openssl", 3619 | "reqwest 0.11.10", 3620 | "tokio", 3621 | "tracing", 3622 | "url 2.3.0", 3623 | "uuid", 3624 | "wasi-outbound-http-defs", 3625 | "wit-bindgen-wasmtime", 3626 | ] 3627 | 3628 | [[package]] 3629 | name = "wasm-bindgen" 3630 | version = "0.2.84" 3631 | source = "registry+https://github.com/rust-lang/crates.io-index" 3632 | checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" 3633 | dependencies = [ 3634 | "cfg-if", 3635 | "wasm-bindgen-macro", 3636 | ] 3637 | 3638 | [[package]] 3639 | name = "wasm-bindgen-backend" 3640 | version = "0.2.84" 3641 | source = "registry+https://github.com/rust-lang/crates.io-index" 3642 | checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" 3643 | dependencies = [ 3644 | "bumpalo", 3645 | "log", 3646 | "once_cell", 3647 | "proc-macro2", 3648 | "quote", 3649 | "syn 1.0.109", 3650 | "wasm-bindgen-shared", 3651 | ] 3652 | 3653 | [[package]] 3654 | name = "wasm-bindgen-futures" 3655 | version = "0.4.34" 3656 | source = "registry+https://github.com/rust-lang/crates.io-index" 3657 | checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" 3658 | dependencies = [ 3659 | "cfg-if", 3660 | "js-sys", 3661 | "wasm-bindgen", 3662 | "web-sys", 3663 | ] 3664 | 3665 | [[package]] 3666 | name = "wasm-bindgen-macro" 3667 | version = "0.2.84" 3668 | source = "registry+https://github.com/rust-lang/crates.io-index" 3669 | checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" 3670 | dependencies = [ 3671 | "quote", 3672 | "wasm-bindgen-macro-support", 3673 | ] 3674 | 3675 | [[package]] 3676 | name = "wasm-bindgen-macro-support" 3677 | version = "0.2.84" 3678 | source = "registry+https://github.com/rust-lang/crates.io-index" 3679 | checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" 3680 | dependencies = [ 3681 | "proc-macro2", 3682 | "quote", 3683 | "syn 1.0.109", 3684 | "wasm-bindgen-backend", 3685 | "wasm-bindgen-shared", 3686 | ] 3687 | 3688 | [[package]] 3689 | name = "wasm-bindgen-shared" 3690 | version = "0.2.84" 3691 | source = "registry+https://github.com/rust-lang/crates.io-index" 3692 | checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" 3693 | 3694 | [[package]] 3695 | name = "wasm-encoder" 3696 | version = "0.25.0" 3697 | source = "registry+https://github.com/rust-lang/crates.io-index" 3698 | checksum = "4eff853c4f09eec94d76af527eddad4e9de13b11d6286a1ef7134bc30135a2b7" 3699 | dependencies = [ 3700 | "leb128", 3701 | ] 3702 | 3703 | [[package]] 3704 | name = "wasm-streams" 3705 | version = "0.2.3" 3706 | source = "registry+https://github.com/rust-lang/crates.io-index" 3707 | checksum = "6bbae3363c08332cadccd13b67db371814cd214c2524020932f0804b8cf7c078" 3708 | dependencies = [ 3709 | "futures-util", 3710 | "js-sys", 3711 | "wasm-bindgen", 3712 | "wasm-bindgen-futures", 3713 | "web-sys", 3714 | ] 3715 | 3716 | [[package]] 3717 | name = "wasmparser" 3718 | version = "0.82.0" 3719 | source = "registry+https://github.com/rust-lang/crates.io-index" 3720 | checksum = "0559cc0f1779240d6f894933498877ea94f693d84f3ee39c9a9932c6c312bd70" 3721 | 3722 | [[package]] 3723 | name = "wasmtime" 3724 | version = "0.34.2" 3725 | source = "registry+https://github.com/rust-lang/crates.io-index" 3726 | checksum = "cc8463ad287e1d87d9a141a010cbe4b3f8227ade85cc8ac64f2bef3219b66f94" 3727 | dependencies = [ 3728 | "anyhow", 3729 | "async-trait", 3730 | "backtrace", 3731 | "bincode", 3732 | "cfg-if", 3733 | "indexmap", 3734 | "lazy_static", 3735 | "libc", 3736 | "log", 3737 | "object 0.27.1", 3738 | "once_cell", 3739 | "paste", 3740 | "psm", 3741 | "rayon", 3742 | "region", 3743 | "serde", 3744 | "target-lexicon", 3745 | "wasmparser", 3746 | "wasmtime-cache", 3747 | "wasmtime-cranelift", 3748 | "wasmtime-environ", 3749 | "wasmtime-fiber", 3750 | "wasmtime-jit", 3751 | "wasmtime-runtime", 3752 | "wat", 3753 | "winapi", 3754 | ] 3755 | 3756 | [[package]] 3757 | name = "wasmtime-cache" 3758 | version = "0.34.2" 3759 | source = "registry+https://github.com/rust-lang/crates.io-index" 3760 | checksum = "b066cd527050ed06eba8f4eb8948d833f033401f09313a5e5231ebe3e316bb9d" 3761 | dependencies = [ 3762 | "anyhow", 3763 | "base64 0.13.1", 3764 | "bincode", 3765 | "directories-next", 3766 | "file-per-thread-logger", 3767 | "log", 3768 | "rustix 0.33.7", 3769 | "serde", 3770 | "sha2 0.9.9", 3771 | "toml", 3772 | "winapi", 3773 | "zstd", 3774 | ] 3775 | 3776 | [[package]] 3777 | name = "wasmtime-cranelift" 3778 | version = "0.34.2" 3779 | source = "registry+https://github.com/rust-lang/crates.io-index" 3780 | checksum = "381b034926e26980a0aed3f26ec4ba2ff3be9763f386bfb18b7bf2a3fbc1a284" 3781 | dependencies = [ 3782 | "anyhow", 3783 | "cranelift-codegen", 3784 | "cranelift-entity", 3785 | "cranelift-frontend", 3786 | "cranelift-native", 3787 | "cranelift-wasm", 3788 | "gimli 0.26.2", 3789 | "log", 3790 | "more-asserts", 3791 | "object 0.27.1", 3792 | "target-lexicon", 3793 | "thiserror", 3794 | "wasmparser", 3795 | "wasmtime-environ", 3796 | ] 3797 | 3798 | [[package]] 3799 | name = "wasmtime-environ" 3800 | version = "0.34.2" 3801 | source = "registry+https://github.com/rust-lang/crates.io-index" 3802 | checksum = "877230e7f92f8b5509845e804bb27c7c993197339a7cf0de4a2af411ee6ea75b" 3803 | dependencies = [ 3804 | "anyhow", 3805 | "cranelift-entity", 3806 | "gimli 0.26.2", 3807 | "indexmap", 3808 | "log", 3809 | "more-asserts", 3810 | "object 0.27.1", 3811 | "serde", 3812 | "target-lexicon", 3813 | "thiserror", 3814 | "wasmparser", 3815 | "wasmtime-types", 3816 | ] 3817 | 3818 | [[package]] 3819 | name = "wasmtime-fiber" 3820 | version = "0.34.2" 3821 | source = "registry+https://github.com/rust-lang/crates.io-index" 3822 | checksum = "dffb509e67c6c2ea49f38bd5db3712476fcc94c4776521012e5f69ae4bb27b4a" 3823 | dependencies = [ 3824 | "cc", 3825 | "rustix 0.33.7", 3826 | "winapi", 3827 | ] 3828 | 3829 | [[package]] 3830 | name = "wasmtime-jit" 3831 | version = "0.34.2" 3832 | source = "registry+https://github.com/rust-lang/crates.io-index" 3833 | checksum = "4ee2da33bb337fbdfb6e031d485bf2a39d51f37f48e79c6327228d3fc68ec531" 3834 | dependencies = [ 3835 | "addr2line 0.17.0", 3836 | "anyhow", 3837 | "bincode", 3838 | "cfg-if", 3839 | "cpp_demangle", 3840 | "gimli 0.26.2", 3841 | "log", 3842 | "object 0.27.1", 3843 | "region", 3844 | "rustc-demangle", 3845 | "rustix 0.33.7", 3846 | "serde", 3847 | "target-lexicon", 3848 | "thiserror", 3849 | "wasmtime-environ", 3850 | "wasmtime-runtime", 3851 | "winapi", 3852 | ] 3853 | 3854 | [[package]] 3855 | name = "wasmtime-runtime" 3856 | version = "0.34.2" 3857 | source = "registry+https://github.com/rust-lang/crates.io-index" 3858 | checksum = "bcb5bd981c971c398dac645874748f261084dc907a98b3ee70fa41e005a2b365" 3859 | dependencies = [ 3860 | "anyhow", 3861 | "backtrace", 3862 | "cc", 3863 | "cfg-if", 3864 | "indexmap", 3865 | "lazy_static", 3866 | "libc", 3867 | "log", 3868 | "mach", 3869 | "memoffset 0.6.5", 3870 | "more-asserts", 3871 | "rand", 3872 | "region", 3873 | "rustix 0.33.7", 3874 | "thiserror", 3875 | "wasmtime-environ", 3876 | "wasmtime-fiber", 3877 | "winapi", 3878 | ] 3879 | 3880 | [[package]] 3881 | name = "wasmtime-types" 3882 | version = "0.34.2" 3883 | source = "registry+https://github.com/rust-lang/crates.io-index" 3884 | checksum = "73696a97fb815c2944896ae9e4fc49182fd7ec0b58088f9ad9768459a521e347" 3885 | dependencies = [ 3886 | "cranelift-entity", 3887 | "serde", 3888 | "thiserror", 3889 | "wasmparser", 3890 | ] 3891 | 3892 | [[package]] 3893 | name = "wasmtime-wasi" 3894 | version = "0.34.2" 3895 | source = "registry+https://github.com/rust-lang/crates.io-index" 3896 | checksum = "08a84b460a4d493d7f81dff72cfab35388e621e314ea38f56c18579bc15e6693" 3897 | dependencies = [ 3898 | "anyhow", 3899 | "wasi-cap-std-sync", 3900 | "wasi-common", 3901 | "wasmtime", 3902 | "wiggle", 3903 | ] 3904 | 3905 | [[package]] 3906 | name = "wast" 3907 | version = "35.0.2" 3908 | source = "registry+https://github.com/rust-lang/crates.io-index" 3909 | checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" 3910 | dependencies = [ 3911 | "leb128", 3912 | ] 3913 | 3914 | [[package]] 3915 | name = "wast" 3916 | version = "55.0.0" 3917 | source = "registry+https://github.com/rust-lang/crates.io-index" 3918 | checksum = "4984d3e1406571f4930ba5cf79bd70f75f41d0e87e17506e0bd19b0e5d085f05" 3919 | dependencies = [ 3920 | "leb128", 3921 | "memchr", 3922 | "unicode-width", 3923 | "wasm-encoder", 3924 | ] 3925 | 3926 | [[package]] 3927 | name = "wat" 3928 | version = "1.0.61" 3929 | source = "registry+https://github.com/rust-lang/crates.io-index" 3930 | checksum = "af2b53f4da14db05d32e70e9c617abdf6620c575bd5dd972b7400037b4df2091" 3931 | dependencies = [ 3932 | "wast 55.0.0", 3933 | ] 3934 | 3935 | [[package]] 3936 | name = "web-sys" 3937 | version = "0.3.61" 3938 | source = "registry+https://github.com/rust-lang/crates.io-index" 3939 | checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" 3940 | dependencies = [ 3941 | "js-sys", 3942 | "wasm-bindgen", 3943 | ] 3944 | 3945 | [[package]] 3946 | name = "webpki" 3947 | version = "0.22.0" 3948 | source = "registry+https://github.com/rust-lang/crates.io-index" 3949 | checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" 3950 | dependencies = [ 3951 | "ring", 3952 | "untrusted", 3953 | ] 3954 | 3955 | [[package]] 3956 | name = "webpki-roots" 3957 | version = "0.22.6" 3958 | source = "registry+https://github.com/rust-lang/crates.io-index" 3959 | checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" 3960 | dependencies = [ 3961 | "webpki", 3962 | ] 3963 | 3964 | [[package]] 3965 | name = "wiggle" 3966 | version = "0.34.2" 3967 | source = "registry+https://github.com/rust-lang/crates.io-index" 3968 | checksum = "c3b8257a2ab818e9ce3f1b54c6f2dec674066c0e03d7dd8a6c73f72dab9919d4" 3969 | dependencies = [ 3970 | "anyhow", 3971 | "async-trait", 3972 | "bitflags", 3973 | "thiserror", 3974 | "tracing", 3975 | "wasmtime", 3976 | "wiggle-macro", 3977 | ] 3978 | 3979 | [[package]] 3980 | name = "wiggle-generate" 3981 | version = "0.34.2" 3982 | source = "registry+https://github.com/rust-lang/crates.io-index" 3983 | checksum = "cd4ff909fb2ba62ebbdde749e4273f495cd5db962262aa1b15f6087c42828aad" 3984 | dependencies = [ 3985 | "anyhow", 3986 | "heck 0.3.3", 3987 | "proc-macro2", 3988 | "quote", 3989 | "shellexpand", 3990 | "syn 1.0.109", 3991 | "witx", 3992 | ] 3993 | 3994 | [[package]] 3995 | name = "wiggle-macro" 3996 | version = "0.34.2" 3997 | source = "registry+https://github.com/rust-lang/crates.io-index" 3998 | checksum = "144e7e767f8b39649c8a97f3f4732b73a4f0337f2a6f0c96cedcb15e52bec9f6" 3999 | dependencies = [ 4000 | "proc-macro2", 4001 | "quote", 4002 | "syn 1.0.109", 4003 | "wiggle-generate", 4004 | ] 4005 | 4006 | [[package]] 4007 | name = "winapi" 4008 | version = "0.3.9" 4009 | source = "registry+https://github.com/rust-lang/crates.io-index" 4010 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 4011 | dependencies = [ 4012 | "winapi-i686-pc-windows-gnu", 4013 | "winapi-x86_64-pc-windows-gnu", 4014 | ] 4015 | 4016 | [[package]] 4017 | name = "winapi-i686-pc-windows-gnu" 4018 | version = "0.4.0" 4019 | source = "registry+https://github.com/rust-lang/crates.io-index" 4020 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 4021 | 4022 | [[package]] 4023 | name = "winapi-util" 4024 | version = "0.1.5" 4025 | source = "registry+https://github.com/rust-lang/crates.io-index" 4026 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 4027 | dependencies = [ 4028 | "winapi", 4029 | ] 4030 | 4031 | [[package]] 4032 | name = "winapi-x86_64-pc-windows-gnu" 4033 | version = "0.4.0" 4034 | source = "registry+https://github.com/rust-lang/crates.io-index" 4035 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 4036 | 4037 | [[package]] 4038 | name = "windows" 4039 | version = "0.46.0" 4040 | source = "registry+https://github.com/rust-lang/crates.io-index" 4041 | checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25" 4042 | dependencies = [ 4043 | "windows-targets 0.42.2", 4044 | ] 4045 | 4046 | [[package]] 4047 | name = "windows-sys" 4048 | version = "0.42.0" 4049 | source = "registry+https://github.com/rust-lang/crates.io-index" 4050 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 4051 | dependencies = [ 4052 | "windows_aarch64_gnullvm 0.42.2", 4053 | "windows_aarch64_msvc 0.42.2", 4054 | "windows_i686_gnu 0.42.2", 4055 | "windows_i686_msvc 0.42.2", 4056 | "windows_x86_64_gnu 0.42.2", 4057 | "windows_x86_64_gnullvm 0.42.2", 4058 | "windows_x86_64_msvc 0.42.2", 4059 | ] 4060 | 4061 | [[package]] 4062 | name = "windows-sys" 4063 | version = "0.45.0" 4064 | source = "registry+https://github.com/rust-lang/crates.io-index" 4065 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 4066 | dependencies = [ 4067 | "windows-targets 0.42.2", 4068 | ] 4069 | 4070 | [[package]] 4071 | name = "windows-sys" 4072 | version = "0.48.0" 4073 | source = "registry+https://github.com/rust-lang/crates.io-index" 4074 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 4075 | dependencies = [ 4076 | "windows-targets 0.48.0", 4077 | ] 4078 | 4079 | [[package]] 4080 | name = "windows-targets" 4081 | version = "0.42.2" 4082 | source = "registry+https://github.com/rust-lang/crates.io-index" 4083 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 4084 | dependencies = [ 4085 | "windows_aarch64_gnullvm 0.42.2", 4086 | "windows_aarch64_msvc 0.42.2", 4087 | "windows_i686_gnu 0.42.2", 4088 | "windows_i686_msvc 0.42.2", 4089 | "windows_x86_64_gnu 0.42.2", 4090 | "windows_x86_64_gnullvm 0.42.2", 4091 | "windows_x86_64_msvc 0.42.2", 4092 | ] 4093 | 4094 | [[package]] 4095 | name = "windows-targets" 4096 | version = "0.48.0" 4097 | source = "registry+https://github.com/rust-lang/crates.io-index" 4098 | checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" 4099 | dependencies = [ 4100 | "windows_aarch64_gnullvm 0.48.0", 4101 | "windows_aarch64_msvc 0.48.0", 4102 | "windows_i686_gnu 0.48.0", 4103 | "windows_i686_msvc 0.48.0", 4104 | "windows_x86_64_gnu 0.48.0", 4105 | "windows_x86_64_gnullvm 0.48.0", 4106 | "windows_x86_64_msvc 0.48.0", 4107 | ] 4108 | 4109 | [[package]] 4110 | name = "windows_aarch64_gnullvm" 4111 | version = "0.42.2" 4112 | source = "registry+https://github.com/rust-lang/crates.io-index" 4113 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 4114 | 4115 | [[package]] 4116 | name = "windows_aarch64_gnullvm" 4117 | version = "0.48.0" 4118 | source = "registry+https://github.com/rust-lang/crates.io-index" 4119 | checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" 4120 | 4121 | [[package]] 4122 | name = "windows_aarch64_msvc" 4123 | version = "0.42.2" 4124 | source = "registry+https://github.com/rust-lang/crates.io-index" 4125 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 4126 | 4127 | [[package]] 4128 | name = "windows_aarch64_msvc" 4129 | version = "0.48.0" 4130 | source = "registry+https://github.com/rust-lang/crates.io-index" 4131 | checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" 4132 | 4133 | [[package]] 4134 | name = "windows_i686_gnu" 4135 | version = "0.42.2" 4136 | source = "registry+https://github.com/rust-lang/crates.io-index" 4137 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 4138 | 4139 | [[package]] 4140 | name = "windows_i686_gnu" 4141 | version = "0.48.0" 4142 | source = "registry+https://github.com/rust-lang/crates.io-index" 4143 | checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" 4144 | 4145 | [[package]] 4146 | name = "windows_i686_msvc" 4147 | version = "0.42.2" 4148 | source = "registry+https://github.com/rust-lang/crates.io-index" 4149 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 4150 | 4151 | [[package]] 4152 | name = "windows_i686_msvc" 4153 | version = "0.48.0" 4154 | source = "registry+https://github.com/rust-lang/crates.io-index" 4155 | checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" 4156 | 4157 | [[package]] 4158 | name = "windows_x86_64_gnu" 4159 | version = "0.42.2" 4160 | source = "registry+https://github.com/rust-lang/crates.io-index" 4161 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 4162 | 4163 | [[package]] 4164 | name = "windows_x86_64_gnu" 4165 | version = "0.48.0" 4166 | source = "registry+https://github.com/rust-lang/crates.io-index" 4167 | checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" 4168 | 4169 | [[package]] 4170 | name = "windows_x86_64_gnullvm" 4171 | version = "0.42.2" 4172 | source = "registry+https://github.com/rust-lang/crates.io-index" 4173 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 4174 | 4175 | [[package]] 4176 | name = "windows_x86_64_gnullvm" 4177 | version = "0.48.0" 4178 | source = "registry+https://github.com/rust-lang/crates.io-index" 4179 | checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" 4180 | 4181 | [[package]] 4182 | name = "windows_x86_64_msvc" 4183 | version = "0.42.2" 4184 | source = "registry+https://github.com/rust-lang/crates.io-index" 4185 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 4186 | 4187 | [[package]] 4188 | name = "windows_x86_64_msvc" 4189 | version = "0.48.0" 4190 | source = "registry+https://github.com/rust-lang/crates.io-index" 4191 | checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" 4192 | 4193 | [[package]] 4194 | name = "winreg" 4195 | version = "0.10.1" 4196 | source = "registry+https://github.com/rust-lang/crates.io-index" 4197 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 4198 | dependencies = [ 4199 | "winapi", 4200 | ] 4201 | 4202 | [[package]] 4203 | name = "winx" 4204 | version = "0.31.0" 4205 | source = "registry+https://github.com/rust-lang/crates.io-index" 4206 | checksum = "08d5973cb8cd94a77d03ad7e23bbe14889cb29805da1cec0e4aff75e21aebded" 4207 | dependencies = [ 4208 | "bitflags", 4209 | "io-lifetimes 0.5.3", 4210 | "winapi", 4211 | ] 4212 | 4213 | [[package]] 4214 | name = "wit-bindgen-gen-core" 4215 | version = "0.1.0" 4216 | source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=f5eed0fb9f1087a2f8889194d0debeeafa789c88#f5eed0fb9f1087a2f8889194d0debeeafa789c88" 4217 | dependencies = [ 4218 | "anyhow", 4219 | "wit-parser", 4220 | ] 4221 | 4222 | [[package]] 4223 | name = "wit-bindgen-gen-rust" 4224 | version = "0.1.0" 4225 | source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=f5eed0fb9f1087a2f8889194d0debeeafa789c88#f5eed0fb9f1087a2f8889194d0debeeafa789c88" 4226 | dependencies = [ 4227 | "heck 0.3.3", 4228 | "wit-bindgen-gen-core", 4229 | ] 4230 | 4231 | [[package]] 4232 | name = "wit-bindgen-gen-wasmtime" 4233 | version = "0.1.0" 4234 | source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=f5eed0fb9f1087a2f8889194d0debeeafa789c88#f5eed0fb9f1087a2f8889194d0debeeafa789c88" 4235 | dependencies = [ 4236 | "heck 0.3.3", 4237 | "wit-bindgen-gen-core", 4238 | "wit-bindgen-gen-rust", 4239 | ] 4240 | 4241 | [[package]] 4242 | name = "wit-bindgen-wasmtime" 4243 | version = "0.1.0" 4244 | source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=f5eed0fb9f1087a2f8889194d0debeeafa789c88#f5eed0fb9f1087a2f8889194d0debeeafa789c88" 4245 | dependencies = [ 4246 | "anyhow", 4247 | "bitflags", 4248 | "thiserror", 4249 | "wasmtime", 4250 | "wit-bindgen-wasmtime-impl", 4251 | ] 4252 | 4253 | [[package]] 4254 | name = "wit-bindgen-wasmtime-impl" 4255 | version = "0.1.0" 4256 | source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=f5eed0fb9f1087a2f8889194d0debeeafa789c88#f5eed0fb9f1087a2f8889194d0debeeafa789c88" 4257 | dependencies = [ 4258 | "proc-macro2", 4259 | "syn 1.0.109", 4260 | "wit-bindgen-gen-core", 4261 | "wit-bindgen-gen-wasmtime", 4262 | ] 4263 | 4264 | [[package]] 4265 | name = "wit-parser" 4266 | version = "0.1.0" 4267 | source = "git+https://github.com/bytecodealliance/wit-bindgen?rev=f5eed0fb9f1087a2f8889194d0debeeafa789c88#f5eed0fb9f1087a2f8889194d0debeeafa789c88" 4268 | dependencies = [ 4269 | "anyhow", 4270 | "id-arena", 4271 | "pulldown-cmark", 4272 | "unicode-normalization", 4273 | "unicode-xid", 4274 | ] 4275 | 4276 | [[package]] 4277 | name = "witx" 4278 | version = "0.9.1" 4279 | source = "registry+https://github.com/rust-lang/crates.io-index" 4280 | checksum = "e366f27a5cabcddb2706a78296a40b8fcc451e1a6aba2fc1d94b4a01bdaaef4b" 4281 | dependencies = [ 4282 | "anyhow", 4283 | "log", 4284 | "thiserror", 4285 | "wast 35.0.2", 4286 | ] 4287 | 4288 | [[package]] 4289 | name = "www-authenticate" 4290 | version = "0.4.0" 4291 | source = "registry+https://github.com/rust-lang/crates.io-index" 4292 | checksum = "02fd1970505d8d9842104b229ba0c6b6331c0897677d0fc0517ea657e77428d0" 4293 | dependencies = [ 4294 | "hyperx", 4295 | "unicase 1.4.2", 4296 | "url 1.7.2", 4297 | ] 4298 | 4299 | [[package]] 4300 | name = "x509-parser" 4301 | version = "0.12.0" 4302 | source = "registry+https://github.com/rust-lang/crates.io-index" 4303 | checksum = "ffc90836a84cb72e6934137b1504d0cae304ef5d83904beb0c8d773bbfe256ed" 4304 | dependencies = [ 4305 | "base64 0.13.1", 4306 | "chrono", 4307 | "data-encoding", 4308 | "der-parser", 4309 | "lazy_static", 4310 | "nom", 4311 | "oid-registry", 4312 | "ring", 4313 | "rusticata-macros", 4314 | "thiserror", 4315 | ] 4316 | 4317 | [[package]] 4318 | name = "yaml-rust" 4319 | version = "0.4.5" 4320 | source = "registry+https://github.com/rust-lang/crates.io-index" 4321 | checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" 4322 | dependencies = [ 4323 | "linked-hash-map", 4324 | ] 4325 | 4326 | [[package]] 4327 | name = "zeroize" 4328 | version = "1.6.0" 4329 | source = "registry+https://github.com/rust-lang/crates.io-index" 4330 | checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" 4331 | 4332 | [[package]] 4333 | name = "zstd" 4334 | version = "0.10.2+zstd.1.5.2" 4335 | source = "registry+https://github.com/rust-lang/crates.io-index" 4336 | checksum = "5f4a6bd64f22b5e3e94b4e238669ff9f10815c27a5180108b849d24174a83847" 4337 | dependencies = [ 4338 | "zstd-safe", 4339 | ] 4340 | 4341 | [[package]] 4342 | name = "zstd-safe" 4343 | version = "4.1.6+zstd.1.5.2" 4344 | source = "registry+https://github.com/rust-lang/crates.io-index" 4345 | checksum = "94b61c51bb270702d6167b8ce67340d2754b088d0c091b06e593aa772c3ee9bb" 4346 | dependencies = [ 4347 | "libc", 4348 | "zstd-sys", 4349 | ] 4350 | 4351 | [[package]] 4352 | name = "zstd-sys" 4353 | version = "1.6.3+zstd.1.5.2" 4354 | source = "registry+https://github.com/rust-lang/crates.io-index" 4355 | checksum = "fc49afa5c8d634e75761feda8c592051e7eeb4683ba827211eb0d731d3402ea8" 4356 | dependencies = [ 4357 | "cc", 4358 | "libc", 4359 | ] 4360 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "krew-wasm" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [features] 7 | default = ["rustls-tls"] 8 | native-tls = ["wasi-outbound-http-wasmtime-kube/native-tls"] 9 | rustls-tls = ["wasi-outbound-http-wasmtime-kube/rustls-tls"] 10 | 11 | [workspace] 12 | members = [ 13 | "crates/http-wasmtime-kube", 14 | ] 15 | 16 | [dependencies] 17 | anyhow = "1.0" 18 | clap = { version = "4.4", features = [ "derive", "env" ] } 19 | directories = "5.0" 20 | kube-conf = "0.2" 21 | lazy_static = "1.4" 22 | pathdiff = "0.2" 23 | policy-fetcher = { git = "https://github.com/kubewarden/policy-fetcher", tag = "v0.6.1" } 24 | regex = "1" 25 | term-table = "1.3" 26 | thiserror = "1.0" 27 | tokio = "1.35" 28 | tracing = "0.1" 29 | tracing-futures = "0.2" 30 | tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] } 31 | wasmtime = { version = "0.34", features = [ "cache" ] } 32 | wasmtime-wasi = "0.34" 33 | wasi-common = "0.34" 34 | wasi-cap-std-sync = "0.34" 35 | wasi-outbound-http-wasmtime-kube = { path = "crates/http-wasmtime-kube", default_features = false } 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # krew-wasm 2 | 3 | krew-wasm is an experimental project that demonstrates how kubectl plugins could 4 | be written using WebAssembly and WASI. 5 | 6 | krew-wasm takes inspiration from the [Krew](https://krew.sigs.k8s.io/) project, 7 | the official plugin manager for kubectl. However, on top of being a completely 8 | different codebase, krew-wasm **does not** aim to replace Krew. It's a complementary 9 | tool that can be used alongside with Krew. 10 | 11 | The sole purpose of krew-wasm is to manage kubectl plugins written using 12 | [WebAssembly](https://webassembly.org/) 13 | and [WASI](https://wasi.dev/). 14 | 15 | ## How it works 16 | 17 | kubectl plugins are simple binaries that follow this naming convention: 18 | `kubectl-`. 19 | Once placed in a known `$PATH`, the plugin becames available by just invoking 20 | `kubectl `. 21 | 22 | krew-wasm can download kubectl WebAssembly plugins and make them discoverable 23 | to the kubectl tool. 24 | This is achieved by creating a symbolic link for each managed plugin. This symbolic 25 | link is named `kubectl-` but, instead of pointing to the 26 | WebAssembly module, it points to the `krew-wasm` executable. 27 | 28 | Once invoked, `krew-wasm` determines its usage mode which could either be a 29 | "direct invocation" (when the user invokes the `krew-wasm` binary to manage plugins) 30 | or it could be a "wrapper invocation" done via `kubectl`. 31 | 32 | When invoked in "wrapper mode", krew-wasm takes care of loading the WebAssembly 33 | plugin and invoking it. krew-wasm works as a WebAssembly host, and takes care of 34 | setting up the WASI environment used by the plugin. 35 | 36 | ### The WebAssembly runtime 37 | 38 | Thanks to WASI, the plugins are granted access to the following portions of the host: 39 | 40 | * Standard input, output and error 41 | * Environment variables 42 | * The whole home directory of the user, with read and write privileges 43 | 44 | Because of that, the plugins can read the default kubeconfig file, or the one 45 | referenced by the `KUBECONFIG` environment variable (as long as it's located 46 | inside of the user home directory). 47 | 48 | The plugins can also interact with the user like any regular cli application. 49 | 50 | #### Network access 51 | 52 | Currently, the WebAssembly WASI specification doesn't cover network access for 53 | guest modules. However, kubectl plugins need to interact with the Kubernetes API 54 | server. 55 | 56 | Network access is granted via an experimental interface provided by 57 | the krew-wasm runtime. 58 | 59 | The interface is defined via the [`WIT`](https://github.com/bytecodealliance/wit-bindgen/blob/c9b113be144ba8418fb4a86a5993e0c44a7d64b3/WIT.md) 60 | format and can be found 61 | [here](https://github.com/flavio/wasi-experimental-toolkit/tree/wasi-outbount-http-add-request-config/crates/wasi-outbound-http-defs/wit). 62 | 63 | Currently, plugins are allowed to make http requests **only** against the 64 | Kubernetes API server that is defined inside of the default kubeconfig file. 65 | 66 | ## Why? 67 | 68 | > Why would someone be interested in writing kubectl plugins in this way? 69 | 70 | That's a legitimate question. I think the main advantages are: 71 | 72 | * WebAssembly is portable: you don't have to build your plugin for all the 73 | possible operating systems and architectures the end users might want. 74 | Portability remains a problem of krew-wasm maintainers, not of plugin authors. 75 | * Security: WebAssembly modules are executed inside of a dedicated sandbox. They 76 | cannot see other processes running on the host nor have access to the host 77 | filesystem. 78 | Note well: currently this POC gives access to the whole user home directory 79 | to each plugin. We have plans to change that and give access only to the 80 | kubeconfig file and all the resources referenced by it. 81 | * Size: the majority of kubectl plugins are written using Go, which produces 82 | big binaries (the average size of a kubectl plugin is around ~9Mb). A Rust 83 | plugin compiled into WebAssembly is almost half the size of it (~4.2 Mb). 84 | This can be even trimmed down a bit by running a WebAssembly binary optimizer 85 | like `wasm-opt`. 86 | 87 | Last but not least, this was fun! We have high expectations for WebAssembly and 88 | WASI, this is just another way to prove that to the world 🤓 89 | 90 | ## Limitations 91 | 92 | Currently the biggest pain point is network access. The network interface introduced 93 | by krew-wasm kinda solves the problem, but there are some limitations. 94 | 95 | Regular Kubernetes client libraries cannot be used. With Rust the [`k8s-openapi`](https://crates.io/crates/k8s-openapi) 96 | can be used, but just because it uses a [sans-io](https://sans-io.readthedocs.io/) 97 | approach. 98 | We don't think other languages feature a library similar to `k8s-openapi`. 99 | 100 | Finally, all the long polling requests issued via `k8s-openapi` (like all the `watch` 101 | operations) are not going to work because of limitations with how data 102 | is exchanged between the WebAssembly host and the guest. 103 | 104 | All these limitations should be solved once WASI implements the [socket proposal](https://github.com/WebAssembly/wasi-sockets). 105 | That, among other things, should allow the usage of regular Kubernetes clients. 106 | 107 | ## Installation 108 | 109 | Download the right pre-built binary from the GitHub Releases page and 110 | install it in your `$PATH`. 111 | 112 | ## Usage 113 | 114 | ### List plugins 115 | 116 | The list of installed plugins can be listed with this command: 117 | 118 | ```console 119 | krew-wasm list 120 | ``` 121 | 122 | ### Download and install a plugin 123 | 124 | Plugins are distributed via OCI registries, the same infrastructure used to distribute 125 | container images. 126 | 127 | Plugins can be downloaded and made available with this command: 128 | 129 | ```console 130 | krew-wasm pull 131 | ``` 132 | 133 | For example: 134 | 135 | ```console 136 | krew-wasm pull ghcr.io/flavio/krew-wasm-plugins/kubewarden:latest 137 | ``` 138 | 139 | This command downloads and installs the `latest` version of the `kubectl-kubewarden` 140 | that is published inside of the `ghcr.io/flavio/krew-wasm-plugins/kubewarden` 141 | registry. 142 | 143 | ### Uninstall plugins 144 | 145 | Plugins can be removed from the system by using the following command: 146 | 147 | ```console 148 | krew-wasm rm 149 | ``` 150 | 151 | The name of the plugin can be obtained by using the `list` command. 152 | 153 | ## Writing a plugin 154 | 155 | > Note well: this is still a POC, the documentation is limited, but will be 156 | > improved in the future 157 | 158 | Plugins are written as regular WebAssembly modules leveraging the WASI interface. 159 | 160 | [This](https://wasmbyexample.dev/examples/wasi-hello-world/wasi-hello-world.rust.en-us.html) 161 | website has many examples about "Hello World" WASI programs. 162 | 163 | A demo policy, that interacts with the API server, can be found [here](https://github.com/flavio/kubectl-kubewarden/). 164 | 165 | ## Examples 166 | 167 | These are some kubectl plugins written using WebAssembly and WASI: 168 | 169 | * [kubectl-decoder](https://github.com/flavio/kubectl-decoder): decode Kubernetes `Secret`s, provide detailed information about x509 certificates found inside of the `Secret` 170 | * [kubectl-kubewarden](https://github.com/flavio/kubectl-kubewarden): display information about the [kubewarden](https://kubewarden.io) stack 171 | 172 | Do you have other plugins made with WebAssembly and WASI? Open a PR! 173 | 174 | ## Acknowledgements 175 | 176 | The idea about writing kubectl plugins using WebAssembly 177 | was born by [Rafael Fernández López](https://github.com/ereslibre) 178 | during a brain storming session with 179 | [Flavio Castelli](https://github.com/flavio). 180 | -------------------------------------------------------------------------------- /crates/http-wasmtime-kube/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /crates/http-wasmtime-kube/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "wasi-outbound-http-wasmtime-kube" 3 | version = "0.1.0" 4 | edition = "2021" 5 | authors = [ 6 | "Radu Matei ", 7 | "Flavio Castelli ", 8 | ] 9 | 10 | [lib] 11 | doctest = false 12 | 13 | [features] 14 | default = [ "native-tls" ] 15 | native-tls = [ "openssl", "reqwest/native-tls" ] 16 | rustls-tls = [ "reqwest/rustls-tls" ] 17 | 18 | [dependencies] 19 | anyhow = "1.0" 20 | bytes = "1" 21 | cfg-if = "1.0" 22 | futures = "0.3" 23 | http = "0.2" 24 | openssl = { version = "0.10", optional = true } 25 | # need a upstream to tag a new release with this patch https://github.com/seanmonstar/reqwest/pull/1526 26 | reqwest = { git = "https://github.com/seanmonstar/reqwest.git", rev = "2e5debe24832d4a28a90dbe0eb092eea27386d41", default_features = false, features = [ "json", "blocking" ] } 27 | tokio = { version = "1", features = [ "full" ] } 28 | tracing = "0.1" 29 | url = "2.2" 30 | uuid = { version = "1.6", features = [ "v4" ] } 31 | wit-bindgen-wasmtime = { git = "https://github.com/bytecodealliance/wit-bindgen", rev = "f5eed0fb9f1087a2f8889194d0debeeafa789c88" } 32 | 33 | [build-dependencies] 34 | wasi-outbound-http-defs = { git = "https://github.com/flavio/wasi-experimental-toolkit", branch = "wasi-outbount-http-add-request-config", default_features = false } 35 | -------------------------------------------------------------------------------- /crates/http-wasmtime-kube/README.md: -------------------------------------------------------------------------------- 1 | This crate implements the WIT definitions provided by [this repository](https://github.com/flavio/wasi-experimental-toolkit/tree/wasi-outbount-http-add-request-config/crates/wasi-outbound-http-defs). 2 | 3 | The exporter implementation is done differently compared to the [upstream one](https://github.com/flavio/wasi-experimental-toolkit/tree/wasi-outbount-http-add-request-config/crates/http-wasmtime), because it takes into account some "quirks" required when interacting with a Kubernetes API server: 4 | 5 | * Connect to API server by IP address. Some kubernetes distributions like minikube and k3d generate a kubeconfig file that expresses the API server as an IP address. When rustls is being used, the certificate used by the API address cannot be verified because of a long standing issue with the WebPKI crate. This crate implements a workaround for this bug 6 | -------------------------------------------------------------------------------- /crates/http-wasmtime-kube/build.rs: -------------------------------------------------------------------------------- 1 | use std::{fs, path::Path}; 2 | 3 | use wasi_outbound_http_defs::WIT_FILES; 4 | 5 | fn main() { 6 | for (name, contents) in WIT_FILES.iter() { 7 | let target = Path::new("wit").join("ephemeral").join(name); 8 | println!("cargo:rerun-if-changed={}", target.to_str().unwrap()); 9 | if !target.exists() { 10 | fs::write(target, contents).unwrap(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /crates/http-wasmtime-kube/src/lib.rs: -------------------------------------------------------------------------------- 1 | use futures::executor::block_on; 2 | use http::HeaderMap; 3 | use reqwest::{Client, Url}; 4 | use std::collections::HashMap; 5 | use std::{ 6 | convert::TryFrom, 7 | str::FromStr, 8 | sync::{Arc, RwLock}, 9 | }; 10 | use tokio::runtime::Handle; 11 | use tracing::{debug, error}; 12 | use wasi_outbound_http::*; 13 | 14 | mod request_config; 15 | use request_config::*; 16 | 17 | mod url_rewrite; 18 | use url_rewrite::url_rewrite_workaround; 19 | 20 | pub use wasi_outbound_http::add_to_linker; 21 | 22 | wit_bindgen_wasmtime::export!("wit/ephemeral/wasi-outbound-http.wit"); 23 | 24 | /// A very simple implementation for outbound HTTP requests. 25 | #[derive(Default, Clone)] 26 | pub struct OutboundHttp { 27 | /// List of hosts guest modules are allowed to make requests to. 28 | pub allowed_hosts: Arc>>, 29 | request_configs: Arc>>, 30 | } 31 | 32 | impl OutboundHttp { 33 | pub fn new(allowed_hosts: Option>) -> Self { 34 | let allowed_hosts = Arc::new(allowed_hosts); 35 | let cfg: HashMap = HashMap::new(); 36 | let request_configs = Arc::new(RwLock::new(cfg)); 37 | Self { 38 | allowed_hosts, 39 | request_configs, 40 | } 41 | } 42 | 43 | /// Check if guest module is allowed to send request to URL, based on the list of 44 | /// allowed hosts defined by the runtime. 45 | /// If `None` is passed, the guest module is not allowed to send the request. 46 | fn is_allowed(url: &str, allowed_hosts: Arc>>) -> Result { 47 | let url_host = Url::parse(url) 48 | .map_err(|_| HttpError::InvalidUrl)? 49 | .host_str() 50 | .ok_or(HttpError::InvalidUrl)? 51 | .to_owned(); 52 | match allowed_hosts.as_deref() { 53 | Some(domains) => { 54 | let allowed: Result, _> = domains.iter().map(|d| Url::parse(d)).collect(); 55 | let allowed = allowed.map_err(|_| HttpError::InvalidUrl)?; 56 | Ok(allowed 57 | .iter() 58 | .map(|u| u.host_str().unwrap()) 59 | .any(|x| x == url_host.as_str())) 60 | } 61 | None => { 62 | error!("allowed_hosts is empty, blocking the request"); 63 | Ok(false) 64 | } 65 | } 66 | } 67 | } 68 | 69 | impl wasi_outbound_http::WasiOutboundHttp for OutboundHttp { 70 | fn register_request_config( 71 | &mut self, 72 | config: RequestConfig, 73 | id: Option<&str>, 74 | ) -> Result { 75 | let id = id.map_or_else(|| uuid::Uuid::new_v4().to_string(), |i| i.to_string()); 76 | let mut hash = self.request_configs.write().unwrap(); 77 | 78 | let cfg: ReqwestConfig = config.try_into().map_err(|e| { 79 | error!(error =? e, "cannot convert request config"); 80 | HttpError::InvalidCfg 81 | })?; 82 | 83 | hash.insert(id.clone(), cfg); 84 | 85 | Ok(id) 86 | } 87 | 88 | fn request(&mut self, req: Request, config: Option<&str>) -> Result { 89 | if !Self::is_allowed(req.uri, self.allowed_hosts.clone())? { 90 | return Err(HttpError::DestinationNotAllowed); 91 | } 92 | 93 | let reqwest_config = config 94 | .map(|id| { 95 | let hash = self.request_configs.read().unwrap(); 96 | hash.get(id).cloned().ok_or_else(|| { 97 | error!(?id, "cannot find request config"); 98 | HttpError::InvalidCfg 99 | }) 100 | }) 101 | .transpose()?; 102 | 103 | let method = http::Method::from(req.method); 104 | 105 | cfg_if::cfg_if! { 106 | if #[cfg(feature = "native-tls")] { 107 | let url = Url::parse(req.uri).map_err(|_| HttpError::InvalidUrl)?; 108 | } else { 109 | let uri = req.uri.parse::().map_err(|_| HttpError::InvalidUrl)?; 110 | // TODO: right now this rewrite is done for any request issued against an IP 111 | // address, we should introduce a check to ensure the IP address is the one of 112 | // the server defined inside of the current kubeconfig 113 | let (uri, socket_addr) = url_rewrite_workaround(&uri)?; 114 | let url = Url::parse(&uri.to_string()).map_err(|_| HttpError::InvalidUrl)?; 115 | } 116 | }; 117 | 118 | let headers = headers(req.headers)?; 119 | let body = req.body.unwrap_or_default().to_vec(); 120 | 121 | // TODO (@radu-matei) 122 | // Ensure all HTTP request and response objects are handled properly (query parameters, headers). 123 | 124 | match Handle::try_current() { 125 | // If running in a Tokio runtime, spawn a new blocking executor 126 | // that will send the HTTP request, and block on its execution. 127 | // This attempts to avoid any deadlocks from other operations 128 | // already executing on the same executor (compared with just 129 | // blocking on the current one). 130 | Ok(r) => block_on(r.spawn_blocking(move || -> Result { 131 | debug!("running request inside of new blocking executor"); 132 | let mut client_builder = Client::builder(); 133 | if let Some(rc) = reqwest_config { 134 | debug!(request_config = ?rc, "using request config"); 135 | client_builder = 136 | client_builder.danger_accept_invalid_certs(rc.accept_invalid_certificates); 137 | 138 | cfg_if::cfg_if! { 139 | if #[cfg(feature = "native-tls")] { 140 | client_builder = client_builder 141 | .danger_accept_invalid_hostnames(rc.accept_invalid_hostnames); 142 | } else { 143 | if rc.accept_invalid_hostnames { 144 | tracing::info!("request config: accept_invalid_hostnames cannot be enabled when rustls is used"); 145 | } 146 | if let Some(saddr) = socket_addr { 147 | tracing::debug!("request config: enable DNS resolver workaround"); 148 | let domain = url.host_str().unwrap(); 149 | client_builder = client_builder.resolve(domain, saddr); 150 | } 151 | } 152 | } 153 | 154 | if let Some(identity) = rc.identity { 155 | client_builder = client_builder.identity(identity); 156 | } 157 | 158 | for cert in rc.extra_root_certificates { 159 | client_builder = client_builder.add_root_certificate(cert); 160 | } 161 | } 162 | let client = client_builder.build().unwrap(); 163 | let res = block_on( 164 | client 165 | .request(method, url) 166 | .headers(headers) 167 | .body(body) 168 | .send(), 169 | ); 170 | if let Err(e) = &res { 171 | error!(error =? e, "http request failure"); 172 | } 173 | Response::try_from(res?) 174 | })) 175 | .map_err(|_| HttpError::RuntimeError)?, 176 | Err(_) => { 177 | debug!("running request using blocking client"); 178 | let mut client_builder = reqwest::blocking::Client::builder(); 179 | if let Some(rc) = reqwest_config { 180 | debug!(request_config = ?rc, "using request config"); 181 | client_builder = 182 | client_builder.danger_accept_invalid_certs(rc.accept_invalid_certificates); 183 | 184 | cfg_if::cfg_if! { 185 | if #[cfg(feature = "native-tls")] { 186 | client_builder = client_builder 187 | .danger_accept_invalid_hostnames(rc.accept_invalid_hostnames); 188 | } else { 189 | if rc.accept_invalid_hostnames { 190 | tracing::info!("request config: accept_invalid_hostnames cannot be enabled when rustls is used"); 191 | } 192 | } 193 | } 194 | 195 | if let Some(identity) = rc.identity { 196 | client_builder = client_builder.identity(identity); 197 | } 198 | 199 | for cert in rc.extra_root_certificates { 200 | client_builder = client_builder.add_root_certificate(cert); 201 | } 202 | } 203 | let client = client_builder.build().unwrap(); 204 | let res = client 205 | .request(method, url) 206 | .headers(headers) 207 | .body(body) 208 | .send(); 209 | if let Err(e) = &res { 210 | error!(error =? e, "http request failure"); 211 | } 212 | Ok(Response::try_from(res?)?) 213 | } 214 | } 215 | } 216 | } 217 | 218 | impl From for http::Method { 219 | fn from(m: Method) -> Self { 220 | match m { 221 | Method::Get => http::Method::GET, 222 | Method::Post => http::Method::POST, 223 | Method::Put => http::Method::PUT, 224 | Method::Delete => http::Method::DELETE, 225 | Method::Patch => http::Method::PATCH, 226 | Method::Head => http::Method::HEAD, 227 | Method::Options => http::Method::OPTIONS, 228 | } 229 | } 230 | } 231 | 232 | impl TryFrom for Response { 233 | type Error = HttpError; 234 | 235 | fn try_from(res: reqwest::Response) -> Result { 236 | let status = res.status().as_u16(); 237 | // TODO (@radu-matei) 238 | let headers = Some(Vec::new()); 239 | let body = Some(block_on(res.bytes())?.to_vec()); 240 | 241 | Ok(Response { 242 | status, 243 | headers, 244 | body, 245 | }) 246 | } 247 | } 248 | 249 | impl TryFrom for Response { 250 | type Error = HttpError; 251 | 252 | fn try_from(res: reqwest::blocking::Response) -> Result { 253 | let status = res.status().as_u16(); 254 | // TODO (@radu-matei) 255 | let headers = Some(Vec::new()); 256 | let body = Some(res.bytes()?.to_vec()); 257 | 258 | Ok(Response { 259 | status, 260 | headers, 261 | body, 262 | }) 263 | } 264 | } 265 | 266 | fn headers(h: HeadersParam) -> anyhow::Result { 267 | let mut res = HeaderMap::new(); 268 | for (k, v) in h { 269 | res.insert( 270 | http::header::HeaderName::from_str(k)?, 271 | http::header::HeaderValue::from_str(v)?, 272 | ); 273 | } 274 | Ok(res) 275 | } 276 | 277 | impl From for HttpError { 278 | fn from(_: anyhow::Error) -> Self { 279 | Self::RuntimeError 280 | } 281 | } 282 | 283 | impl From for HttpError { 284 | fn from(_: reqwest::Error) -> Self { 285 | Self::RequestError 286 | } 287 | } 288 | -------------------------------------------------------------------------------- /crates/http-wasmtime-kube/src/request_config.rs: -------------------------------------------------------------------------------- 1 | use crate::wasi_outbound_http::*; 2 | 3 | #[derive(Clone, Debug)] 4 | pub(crate) struct ReqwestConfig { 5 | pub accept_invalid_hostnames: bool, 6 | pub accept_invalid_certificates: bool, 7 | pub extra_root_certificates: Vec, 8 | pub identity: Option, 9 | } 10 | 11 | impl TryFrom> for reqwest::Identity { 12 | type Error = String; 13 | 14 | fn try_from(identity: Identity) -> Result { 15 | cfg_if::cfg_if! { 16 | if #[cfg(feature = "native-tls")] { 17 | let pkey = openssl::pkey::PKey::private_key_from_pem(&identity.key) 18 | .map_err(|e| format!("Cannot convert identity: {}", e))?; 19 | let cert = openssl::x509::X509::from_pem(&identity.cert) 20 | .map_err(|e| format!("Cannot convert identity: {}", e))?; 21 | let pkcs12 = openssl::pkcs12::Pkcs12::builder().build("", "", &pkey, &cert) 22 | .map_err(|e| format!("Cannot convert identity: {}", e))?; 23 | let pkcs12_der = pkcs12.to_der() 24 | .map_err(|e| format!("Cannot convert identity: {}", e))?; 25 | reqwest::Identity::from_pkcs12_der(&pkcs12_der, "") 26 | .map_err(|e| format!("Cannot convert identity: {}", e)) 27 | } else if #[cfg(feature = "rustls-tls")] { 28 | let mut pem_bundle: Vec = identity.key.into(); 29 | if pem_bundle[pem_bundle.len() - 1] != b'\n' { 30 | pem_bundle.insert(pem_bundle.len(), b'\n'); 31 | } 32 | pem_bundle.extend_from_slice(identity.cert); 33 | reqwest::Identity::from_pem(&pem_bundle) 34 | .map_err(|e| format!("Cannot create identity: {:?}", e)) 35 | } else { 36 | Err("Cannot create reqwest identity, neither 'native-tls' feature nor '__rusttls' one are enabled".to_string()) 37 | } 38 | } 39 | } 40 | } 41 | 42 | impl TryFrom> for ReqwestConfig { 43 | type Error = String; 44 | 45 | fn try_from(cfg: RequestConfig) -> Result { 46 | let mut extra_root_certificates: Vec = vec![]; 47 | 48 | for c in cfg.extra_root_certificates { 49 | let cert = match c.encoding { 50 | CertificateEncoding::Pem => reqwest::Certificate::from_pem(c.data), 51 | CertificateEncoding::Der => reqwest::Certificate::from_der(c.data), 52 | } 53 | .map_err(|e| format!("Cannot convert certificate: {}", e))?; 54 | extra_root_certificates.push(cert); 55 | } 56 | 57 | let identity = match cfg.identity { 58 | Some(id) => Some(id.try_into()?), 59 | None => None, 60 | }; 61 | 62 | Ok(ReqwestConfig { 63 | accept_invalid_certificates: cfg.accept_invalid_certificates, 64 | accept_invalid_hostnames: cfg.accept_invalid_hostnames, 65 | extra_root_certificates, 66 | identity, 67 | }) 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /crates/http-wasmtime-kube/src/url_rewrite.rs: -------------------------------------------------------------------------------- 1 | use anyhow::{anyhow, Result}; 2 | use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; 3 | 4 | const KUBERNETES_INTERNAL_SVC_FQDN: &str = "kubernetes.default.svc"; 5 | 6 | pub(crate) fn url_rewrite_workaround( 7 | server_url: &http::uri::Uri, 8 | ) -> Result<(http::uri::Uri, Option)> { 9 | let host = server_url.host().expect("request doesn't have an host"); 10 | let port = server_url 11 | .port_u16() 12 | .or_else(|| { 13 | match server_url 14 | .scheme() 15 | .unwrap_or(&http::uri::Scheme::HTTP) 16 | .as_str() 17 | { 18 | "http" => Some(80), 19 | "https" => Some(443), 20 | _ => None, 21 | } 22 | }) 23 | .ok_or_else(|| anyhow!("url doesn't use a known schema"))?; 24 | 25 | let socket_addr = if let Ok(ipv4_addr) = host.parse::() { 26 | Some(SocketAddr::new(IpAddr::V4(ipv4_addr), port)) 27 | } else if let Ok(ipv6_addr) = host.parse::() { 28 | Some(SocketAddr::new(IpAddr::V6(ipv6_addr), port)) 29 | } else { 30 | None 31 | }; 32 | 33 | if socket_addr.is_some() { 34 | let authority = server_url 35 | .authority() 36 | .unwrap() 37 | .as_str() 38 | .replace(host, KUBERNETES_INTERNAL_SVC_FQDN); 39 | 40 | let uri = http::uri::Builder::new() 41 | .scheme(server_url.scheme_str().unwrap()) 42 | .authority(authority.as_str()) 43 | .path_and_query(server_url.path_and_query().unwrap().to_string()) 44 | .build()?; 45 | Ok((uri, socket_addr)) 46 | } else { 47 | Ok((server_url.clone(), None)) 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /crates/http-wasmtime-kube/wit/ephemeral/.gitignore: -------------------------------------------------------------------------------- 1 | *.wit 2 | -------------------------------------------------------------------------------- /src/cli.rs: -------------------------------------------------------------------------------- 1 | use clap::{Parser, Subcommand}; 2 | 3 | pub const BINARY_NAME: &str = "krew-wasm"; 4 | pub const KREW_WASM_VERBOSE_ENV: &str = "KREW_WASM_VERBOSE"; 5 | 6 | #[derive(Parser, Debug)] 7 | #[clap( 8 | name = BINARY_NAME, 9 | author, 10 | version, 11 | about, 12 | long_about = None, 13 | )] 14 | pub(crate) struct Native { 15 | #[clap(subcommand)] 16 | pub command: NativeCommands, 17 | 18 | /// Enable verbose mode 19 | #[clap(short, long, env = KREW_WASM_VERBOSE_ENV)] 20 | pub verbose: bool, 21 | } 22 | 23 | #[derive(Debug, Subcommand)] 24 | pub(crate) enum NativeCommands { 25 | /// List 26 | List, 27 | /// Pull 28 | #[clap(arg_required_else_help = true)] 29 | Pull { 30 | /// URI for the WebAssembly module to pull 31 | uri: String, 32 | /// Remove an existing module with the same name, if any 33 | #[clap(short, long)] 34 | force: bool, 35 | }, 36 | /// Rm 37 | #[clap(arg_required_else_help = true)] 38 | Rm { 39 | /// Name of the WebAssembly module to remove 40 | module: String, 41 | }, 42 | /// Run 43 | #[clap(arg_required_else_help = true)] 44 | Run { 45 | /// Path to the WebAssembly module to execute 46 | module: String, 47 | 48 | #[clap(last = true)] 49 | wasm_args: Vec, 50 | }, 51 | } 52 | -------------------------------------------------------------------------------- /src/errors.rs: -------------------------------------------------------------------------------- 1 | use thiserror::Error; 2 | 3 | pub type Result = std::result::Result; 4 | 5 | #[derive(Error, Debug)] 6 | pub enum KrewWapcError { 7 | #[error("Plugin exited with code {code:?}")] 8 | PluginExitError { code: i32 }, 9 | 10 | #[error("wasm evaluation error: {0}")] 11 | GenericWasmEvalError(String), 12 | 13 | #[error("{0}")] 14 | GenericError(String), 15 | 16 | #[error(transparent)] 17 | Other(#[from] anyhow::Error), 18 | } 19 | -------------------------------------------------------------------------------- /src/ls.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Result; 2 | use pathdiff::diff_paths; 3 | use std::{fs, path::Path}; 4 | use term_table::{row::Row, Table, TableStyle}; 5 | 6 | use crate::store::{ALL_MODULES_STORE_ROOT, STORE_ROOT}; 7 | 8 | pub(crate) fn ls() { 9 | let mut table = Table::new(); 10 | table.style = TableStyle::simple(); 11 | table.add_row(Row::new(vec!["Name", "Location"])); 12 | for module in fs::read_dir(ALL_MODULES_STORE_ROOT.as_path()) 13 | .expect("could not read store root") 14 | .flatten() 15 | { 16 | if let Some(module_name) = module.file_name().to_str() { 17 | table.add_row(Row::new(vec![ 18 | module_name, 19 | &module_store_location(&module.path()).expect("invalid filename"), 20 | ])); 21 | } 22 | } 23 | println!("{}", table.render()); 24 | } 25 | 26 | // Given a module location in the directory where symlinks to all 27 | // modules are located, give back the URI resembling where this module 28 | // was pulled from, or the path to the local filesystem where this 29 | // module is located if it wasn't pulled from a remote location 30 | fn module_store_location(module_path: &Path) -> Result { 31 | let module_path = std::fs::read_link(module_path)?; 32 | // If this module was added from somehwere in the filesystem 33 | // (outside of the store), just return it as it is 34 | if !module_path.starts_with(STORE_ROOT.as_path()) { 35 | return Ok(format!( 36 | "{} (not in the store)", 37 | module_path.to_str().expect("invalid path") 38 | )); 39 | } 40 | let path = diff_paths(module_path, STORE_ROOT.as_path()).expect("failed to diff paths"); 41 | let mut component_iterator = path.components(); 42 | let scheme = component_iterator.next().expect("invalid path"); 43 | Ok(component_iterator.fold( 44 | format!("{}:/", scheme.as_os_str().to_str().expect("invalid path")), 45 | |acc, element| { 46 | format!( 47 | "{}/{}", 48 | acc, 49 | element.as_os_str().to_str().expect("invalid path") 50 | ) 51 | }, 52 | )) 53 | } 54 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use lazy_static::lazy_static; 2 | use std::collections::HashSet; 3 | use std::env; 4 | use std::path::Path; 5 | use std::process; 6 | use tracing_subscriber::prelude::*; 7 | use tracing_subscriber::{fmt, EnvFilter}; 8 | 9 | mod cli; 10 | mod errors; 11 | mod store; 12 | mod wasm_host; 13 | 14 | mod ls; 15 | mod pull; 16 | mod rm; 17 | mod run; 18 | 19 | use clap::Parser; 20 | use cli::{NativeCommands, BINARY_NAME, KREW_WASM_VERBOSE_ENV}; 21 | 22 | use errors::KrewWapcError; 23 | 24 | use store::ALL_MODULES_STORE_ROOT; 25 | 26 | lazy_static! { 27 | // Useful when developing the project: `cargo run` leads to a 28 | // different argv[0] 29 | static ref BINARY_NAMES: HashSet = { 30 | let mut set = HashSet::new(); 31 | set.insert(format!("target/debug/{}", BINARY_NAME)); 32 | set.insert(format!("target/release/{}", BINARY_NAME)); 33 | set.insert(format!("./{}", BINARY_NAME)); 34 | set.insert(BINARY_NAME.to_string()); 35 | set 36 | }; 37 | } 38 | 39 | fn setup_logging(verbose: bool) { 40 | let level_filter = if verbose { "debug" } else { "info" }; 41 | let filter_layer = EnvFilter::new(level_filter) 42 | .add_directive("cranelift_codegen=off".parse().unwrap()) // this crate generates lots of tracing events we don't care about 43 | .add_directive("cranelift_wasm=off".parse().unwrap()) // this crate generates lots of tracing events we don't care about 44 | .add_directive("wasmtime_cranelift=off".parse().unwrap()) // this crate generates lots of tracing events we don't care about 45 | .add_directive("hyper=off".parse().unwrap()) // this crate generates lots of tracing events we don't care about 46 | .add_directive("regalloc=off".parse().unwrap()); // this crate generates lots of tracing events we don't care about 47 | tracing_subscriber::registry() 48 | .with(filter_layer) 49 | .with(fmt::layer().with_writer(std::io::stderr)) 50 | .init(); 51 | } 52 | 53 | #[tokio::main] 54 | async fn main() { 55 | // setup logging 56 | 57 | store::ensure(); 58 | 59 | let args: Vec = env::args().collect(); 60 | if BINARY_NAMES.contains(&args[0]) { 61 | // native mode 62 | let cli = cli::Native::parse(); 63 | setup_logging(cli.verbose); 64 | run_native(cli).await; 65 | } else { 66 | // wrapper mode 67 | let verbose = match std::env::var_os(KREW_WASM_VERBOSE_ENV) { 68 | Some(v) => v == "1", 69 | None => false, 70 | }; 71 | setup_logging(verbose); 72 | 73 | let invocation = Path::new(&args[0]).file_name().unwrap().to_str().unwrap(); 74 | let wasm_module_name = match invocation.strip_prefix("kubectl-") { 75 | Some(n) => n, 76 | None => args[0].as_str(), 77 | }; 78 | 79 | let wasm_module_path = ALL_MODULES_STORE_ROOT.join(wasm_module_name); 80 | if wasm_module_path.exists() { 81 | let wasi_args = wasm_host::WasiArgs::Inherit; 82 | match wasm_host::run_plugin(wasm_module_path, &wasi_args) { 83 | Err(e) => match e { 84 | KrewWapcError::PluginExitError { code } => { 85 | println!(); 86 | process::exit(code) 87 | } 88 | _ => { 89 | eprintln!("{:?}", e); 90 | process::exit(1) 91 | } 92 | }, 93 | Ok(_) => process::exit(0), 94 | } 95 | } else { 96 | eprintln!( 97 | "Cannot find wasm plugin {} at {}. Use `krew-wasm pull` to pull it to the store from an OCI registry", 98 | wasm_module_name, 99 | wasm_module_path.to_str().unwrap(), 100 | ); 101 | process::exit(1); 102 | } 103 | } 104 | } 105 | 106 | async fn run_native(cli: cli::Native) { 107 | match cli.command { 108 | NativeCommands::List => ls::ls(), 109 | NativeCommands::Pull { uri, force } => { 110 | let force_pull = if force { 111 | pull::ForcePull::ForcePull 112 | } else { 113 | pull::ForcePull::DoNotForcePull 114 | }; 115 | pull::pull(&uri, force_pull).await 116 | } 117 | NativeCommands::Rm { module } => rm::rm(&module), 118 | NativeCommands::Run { module, wasm_args } => run::run(module, wasm_args), 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /src/pull.rs: -------------------------------------------------------------------------------- 1 | use directories::BaseDirs; 2 | use lazy_static::lazy_static; 3 | use policy_fetcher::registry::config::{read_docker_config_json_file, DockerConfig}; 4 | use policy_fetcher::{fetch_policy, PullDestination}; 5 | use regex::Regex; 6 | use std::{path::Path, process}; 7 | use tracing::debug; 8 | 9 | use crate::store::{ALL_MODULES_STORE_ROOT, BIN_ROOT, STORE_ROOT}; 10 | 11 | lazy_static! { 12 | static ref TAG_REMOVER: Regex = Regex::new(r":[^:]+$").unwrap(); 13 | } 14 | 15 | #[derive(PartialEq)] 16 | pub(crate) enum ForcePull { 17 | ForcePull, 18 | DoNotForcePull, 19 | } 20 | 21 | fn default_docker_config() -> Option { 22 | let docker_config_path = 23 | BaseDirs::new().map(|bd| bd.home_dir().join(".docker").join("config.json")); 24 | if let Some(dcp) = docker_config_path { 25 | if dcp.exists() { 26 | debug!(file = dcp.to_str(), "loading docker config file"); 27 | Some(read_docker_config_json_file(&dcp).expect("Error reading docker config file")) 28 | } else { 29 | debug!("docker config file not found"); 30 | None 31 | } 32 | } else { 33 | debug!("cannot infer location of docker config file"); 34 | None 35 | } 36 | } 37 | 38 | pub(crate) async fn pull(uri: &str, force_pull: ForcePull) { 39 | let docker_config = default_docker_config(); 40 | 41 | // Fetch the wasm module 42 | let module = fetch_policy( 43 | uri, 44 | PullDestination::Store(STORE_ROOT.clone()), 45 | docker_config.as_ref(), 46 | None, 47 | ) 48 | .await 49 | .expect("failed pulling module"); 50 | 51 | let module_store_path = module.local_path; 52 | let module_name = TAG_REMOVER 53 | .replace( 54 | module_store_path 55 | .file_name() 56 | .expect("missing filename") 57 | .to_str() 58 | .expect("bad filename"), 59 | "", 60 | ) 61 | .to_string(); 62 | let module_name = module_name.strip_suffix(".wasm").unwrap_or(&module_name); 63 | 64 | if Path::exists(&ALL_MODULES_STORE_ROOT.join(module_name)) { 65 | if force_pull == ForcePull::DoNotForcePull { 66 | eprintln!("there is already a module with this name ({}). You can pull with the `-f` flag to overwrite the existing module", module_name); 67 | process::exit(1); 68 | } 69 | // When forcing the pull, rm the module name, so all the 70 | // cleaning logic of the store is triggered. Then, fetch the 71 | // module again. This is not neat, and the policy fetcher 72 | // could be improved to provide the path where the module 73 | // would have been placed to know before pulling if something 74 | // existed on the path already. Given force pulling does not 75 | // happen so often, just pull the policy again. 76 | crate::rm::rm(module_name); 77 | fetch_policy(uri, PullDestination::Store(STORE_ROOT.clone()), None, None) 78 | .await 79 | .expect("failed pulling module"); 80 | } 81 | 82 | // Create the webassembly module symlink in the "all modules" root 83 | // TODO(ereslibre): figure out Windows behavior 84 | std::os::unix::fs::symlink(&module_store_path, ALL_MODULES_STORE_ROOT.join(module_name)) 85 | .expect("error symlinking top level module"); 86 | 87 | // Create the kubectl plugin symlink pointing to ourselves 88 | let kubectl_plugin_name = format!("kubectl-{}", &module_name,); 89 | // TODO(ereslibre): figure out Windows behavior 90 | std::os::unix::fs::symlink( 91 | std::env::current_exe().expect("cannot find current executable"), 92 | BIN_ROOT.join(&kubectl_plugin_name), 93 | ) 94 | .expect("error symlinking kubectl plugin"); 95 | 96 | println!("module was pulled successfully. Make sure to add {} to your $PATH so that `kubectl` can find the {} plugin", BIN_ROOT.display(), kubectl_plugin_name); 97 | } 98 | -------------------------------------------------------------------------------- /src/rm.rs: -------------------------------------------------------------------------------- 1 | use crate::store::STORE_ROOT; 2 | 3 | use std::path::PathBuf; 4 | 5 | // This removes the module from the store, and then removes both 6 | // links, the `all` toplevel link of the module itself, and the 7 | // kubectl-plugin link to `krew-wasm`. When the module is removed from 8 | // the store, it also cleans up the structure up to the root of the 9 | // store, so no empty folders are kept around in the store 10 | pub(crate) fn rm(module: &str) { 11 | let (module_paths, module_store_path) = 12 | crate::store::all_module_paths(module).expect("failed to get module paths for module"); 13 | 14 | // Unlink files that can be directly removed without any extra 15 | // cleanup: the toplevel "all" module and the symlink for the 16 | // kubectl-plugin 17 | for path in module_paths { 18 | #[allow(unused_must_use)] 19 | { 20 | std::fs::remove_file(path); 21 | } 22 | } 23 | 24 | if !module_store_path.starts_with(STORE_ROOT.as_path()) { 25 | // Nothing to clean in the store itself, given this module 26 | // comes from another part of the filesystem. Just return. 27 | return; 28 | } 29 | 30 | #[allow(unused_must_use)] 31 | { 32 | std::fs::remove_file(&module_store_path); 33 | } 34 | 35 | // Clean up parent directories in the store up to its root 36 | { 37 | let mut prefix = STORE_ROOT.clone(); 38 | let module_leading_store_components = module_store_path 39 | .iter() 40 | .map(|component| { 41 | prefix = prefix.join(component); 42 | prefix.clone() 43 | }) 44 | .collect::>(); 45 | 46 | module_leading_store_components 47 | .iter() 48 | .rev() 49 | .skip(1) // module file -- already unlinked 50 | .take(module_store_path.components().count() - STORE_ROOT.components().count() - 1 /* krew-wasm-store */) 51 | .for_each(|component| { 52 | #[allow(unused_must_use)] 53 | { 54 | // try to clean up empty dirs. Ignore errors. 55 | std::fs::remove_dir(component); 56 | } 57 | }) 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/run.rs: -------------------------------------------------------------------------------- 1 | use std::path::Path; 2 | use std::process; 3 | 4 | use crate::errors::KrewWapcError; 5 | use crate::wasm_host; 6 | 7 | pub(crate) fn run(module: String, wasm_args: Vec) { 8 | let wasm_module_path = Path::new(module.as_str()); 9 | let wasm_filename = wasm_module_path.file_name().unwrap().to_string_lossy(); 10 | let plugin_name = wasm_filename 11 | .strip_suffix(".wasm") 12 | .map(|s| s.to_string()) 13 | .unwrap_or_else(|| wasm_filename.to_string()); 14 | let kubectl_plugin_name = if plugin_name.starts_with("kubectl-") { 15 | plugin_name 16 | } else { 17 | format!("kubectl-{}", plugin_name) 18 | }; 19 | 20 | let mut wasm_args = wasm_args; 21 | wasm_args.insert(0, kubectl_plugin_name); 22 | let wasi_args = wasm_host::WasiArgs::UserProvided(wasm_args); 23 | 24 | match wasm_host::run_plugin(wasm_module_path.to_path_buf(), &wasi_args) { 25 | Err(e) => match e { 26 | KrewWapcError::PluginExitError { code } => { 27 | println!(); 28 | process::exit(code) 29 | } 30 | _ => { 31 | eprintln!("{:?}", e); 32 | process::exit(1) 33 | } 34 | }, 35 | Ok(_) => process::exit(0), 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/store.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Result; 2 | use directories::{ProjectDirs, UserDirs}; 3 | use lazy_static::lazy_static; 4 | use std::path::PathBuf; 5 | 6 | lazy_static! { 7 | pub(crate) static ref BIN_ROOT: PathBuf = UserDirs::new() 8 | .expect("cannot find home directory for user") 9 | .home_dir() 10 | .join(".krew-wasm") 11 | .join("bin"); 12 | pub(crate) static ref STORE_ROOT: PathBuf = ProjectDirs::from("io.krew-wasm", "", "krew-wasm") 13 | .expect("cannot find project dirs") 14 | .cache_dir() 15 | .join("krew-wasm-store"); 16 | pub(crate) static ref ALL_MODULES_STORE_ROOT: PathBuf = STORE_ROOT.join("all"); 17 | } 18 | 19 | // Given a module name, return a tuple with elements that can be 20 | // unlinked directly in the first component of the tuple, and a second 21 | // argument with the full path to the location in the store. In order 22 | // to leave nothing behind in the store, we need to clean up every 23 | // directory until the root of the store after unlinking the module 24 | // from the store. 25 | pub(crate) fn all_module_paths(module_name: &str) -> Result<(Vec, PathBuf)> { 26 | let module_bin = BIN_ROOT.join(format!("kubectl-{}", module_name)); 27 | let module_root = ALL_MODULES_STORE_ROOT.join(module_name); 28 | let module_path = std::fs::read_link(&module_root)?; 29 | Ok((vec![module_bin, module_root], module_path)) 30 | } 31 | 32 | pub(crate) fn ensure() { 33 | // Try to create the kubectl plugin bin path. 34 | std::fs::create_dir_all(BIN_ROOT.as_path()).unwrap_or_else(|err| { 35 | panic!( 36 | "could not create alias binary root at {}: {}", 37 | BIN_ROOT.display(), 38 | err 39 | ) 40 | }); 41 | // Try to create the "all modules" root on the store. Used 42 | // to look for modules given a name. 43 | std::fs::create_dir_all(ALL_MODULES_STORE_ROOT.as_path()) 44 | .expect("could not create top level store path for all modules"); 45 | } 46 | -------------------------------------------------------------------------------- /src/wasm_host.rs: -------------------------------------------------------------------------------- 1 | use directories::UserDirs; 2 | use std::path::PathBuf; 3 | use wasi_cap_std_sync::WasiCtxBuilder; 4 | use wasi_common::WasiCtx; 5 | use wasi_outbound_http_wasmtime_kube::OutboundHttp; 6 | use wasmtime::{Config, Engine, Linker, Module, Store}; 7 | use wasmtime_wasi::*; 8 | 9 | use crate::errors::{KrewWapcError, Result}; 10 | 11 | struct Context { 12 | pub wasi: WasiCtx, 13 | pub runtime_data: Option, 14 | } 15 | 16 | fn build_ctx(runtime_data: Option, wasi_args: &WasiArgs) -> Context { 17 | let wasi = build_wasi_ctx(wasi_args); 18 | Context { wasi, runtime_data } 19 | } 20 | 21 | fn build_wasi_ctx(args: &WasiArgs) -> WasiCtx { 22 | let user_dirs = UserDirs::new().expect("cannot find user dirs"); 23 | let home_dir = user_dirs.home_dir(); 24 | let mut ctx = WasiCtxBuilder::new().inherit_stdio().inherit_stdout(); 25 | ctx = match &args { 26 | WasiArgs::Inherit => ctx.inherit_args().unwrap(), 27 | WasiArgs::UserProvided(args) => ctx.args(args).unwrap(), 28 | }; 29 | ctx = ctx.inherit_env().unwrap(); 30 | ctx = ctx 31 | .preopened_dir( 32 | Dir::open_ambient_dir(home_dir, ambient_authority()).unwrap(), 33 | home_dir, 34 | ) 35 | .unwrap(); 36 | 37 | ctx.build() 38 | } 39 | 40 | fn kube_api_server_url() -> anyhow::Result { 41 | let config = kube_conf::Config::load_default() 42 | .map_err(|e| anyhow::anyhow!("kubeconf: cannot read config: {:?}", e))?; 43 | 44 | let kube_ctx = config 45 | .get_current_context() 46 | .ok_or_else(|| anyhow::anyhow!("kubeconf: no default kubernetes context"))?; 47 | 48 | let cluster = kube_ctx 49 | .get_cluster(&config) 50 | .ok_or_else(|| anyhow::anyhow!("kubeconf: cannot find cluster definition"))?; 51 | 52 | Ok(cluster.server) 53 | } 54 | 55 | pub(crate) enum WasiArgs { 56 | Inherit, 57 | UserProvided(Vec), 58 | } 59 | 60 | pub(crate) fn run_plugin(wasm_module_path: PathBuf, wasi_args: &WasiArgs) -> Result<()> { 61 | if !wasm_module_path.exists() { 62 | return Err(KrewWapcError::GenericError(format!( 63 | "Cannot find {}", 64 | wasm_module_path.to_str().unwrap() 65 | ))); 66 | } 67 | 68 | let allowed_hosts = vec![kube_api_server_url()?]; 69 | let outbound_http = OutboundHttp::new(Some(allowed_hosts)); 70 | let ctx = build_ctx(Some(outbound_http), wasi_args); 71 | 72 | // Modules can be compiled through either the text or binary format 73 | let mut config = Config::new(); 74 | config.wasm_backtrace_details(wasmtime::WasmBacktraceDetails::Enable); 75 | config.wasm_multi_memory(true); 76 | config.wasm_module_linking(true); 77 | config.cache_config_load_default()?; 78 | 79 | let engine = Engine::new(&config).unwrap(); 80 | let module = Module::from_file(&engine, wasm_module_path)?; 81 | let mut linker = Linker::::new(&engine); 82 | wasmtime_wasi::add_to_linker(&mut linker, |cx: &mut Context| &mut cx.wasi)?; 83 | let mut store = Store::new(&engine, ctx); 84 | 85 | wasi_outbound_http_wasmtime_kube::add_to_linker(&mut linker, |ctx| -> &mut OutboundHttp { 86 | ctx.runtime_data.as_mut().unwrap() 87 | })?; 88 | 89 | let instance = linker.instantiate(&mut store, &module)?; 90 | // Instantiation of a module requires specifying its imports and then 91 | // afterwards we can fetch exports by name, as well as asserting the 92 | // type signature of the function with `get_typed_func`. 93 | let start = instance.get_typed_func::<(), (), _>(&mut store, "_start")?; 94 | 95 | // And finally we can call the wasm! 96 | start.call(&mut store, ()).map_err(|e| { 97 | if let Some(exit_code) = e.i32_exit_status() { 98 | KrewWapcError::PluginExitError { code: exit_code } 99 | } else { 100 | KrewWapcError::GenericWasmEvalError(e.display_reason().to_string()) 101 | } 102 | })?; 103 | 104 | Ok(()) 105 | } 106 | --------------------------------------------------------------------------------