From 604a0b871c29db09bb097c03d470d74f37560d83 Mon Sep 17 00:00:00 2001 From: Aviram Hassan Date: Wed, 4 May 2022 15:28:02 +0300 Subject: [PATCH 01/40] monorepo --- .devcontainer/Dockerfile | 7 + .devcontainer/devcontainer.json | 46 + .github/dependabot.yml | 10 + .github/workflows/ci.yaml | 76 +- .github/workflows/release.yaml | 19 + .gitignore | 5 +- .vscode/launch.json | 46 + CHANGELOG.md | 7 +- Cargo.lock | 1489 +++++++++ Cargo.toml | 7 + cli/.eslintrc.json | 24 - cli/CHANGELOG.md | 19 - cli/README.md | 79 - cli/package-lock.json | 5467 ------------------------------- cli/package.json | 42 - cli/src/index.ts | 93 - cli/tsconfig.json | 16 - core/.eslintrc.json | 24 - core/CHANGELOG.md | 21 - core/package-lock.json | 4611 -------------------------- core/package.json | 29 - core/src/index.ts | 1 - core/src/mirrord.ts | 251 -- core/tsconfig.json | 20 - mirrord-agent/CHANGELOG.md | 28 + mirrord-agent/Cargo.lock | 1491 +++++++++ mirrord-agent/Cargo.toml | 27 + mirrord-agent/Dockerfile | 12 + {cli => mirrord-agent}/LICENSE | 0 mirrord-agent/README.md | 21 + mirrord-agent/src/cli.rs | 25 + mirrord-agent/src/main.rs | 290 ++ mirrord-agent/src/runtime.rs | 68 + mirrord-agent/src/sniffer.rs | 296 ++ mirrord-agent/src/util.rs | 192 ++ mirrord-agent/tests/blackbox.rs | 132 + mirrord-layer/Cargo.lock | 2682 +++++++++++++++ mirrord-layer/Cargo.toml | 39 + {core => mirrord-layer}/LICENSE | 0 mirrord-layer/README.md | 19 + mirrord-layer/src/lib.rs | 420 +++ mirrord-protocol/CHANGELOG.md | 14 + mirrord-protocol/Cargo.lock | 200 ++ mirrord-protocol/Cargo.toml | 15 + mirrord-protocol/LICENSE | 7 + mirrord-protocol/README.md | 16 + mirrord-protocol/src/codec.rs | 235 ++ mirrord-protocol/src/lib.rs | 3 + rustfmt.toml | 6 + sample/app.js | 24 + 50 files changed, 7949 insertions(+), 10722 deletions(-) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/release.yaml create mode 100644 .vscode/launch.json create mode 100644 Cargo.lock create mode 100644 Cargo.toml delete mode 100644 cli/.eslintrc.json delete mode 100644 cli/CHANGELOG.md delete mode 100644 cli/README.md delete mode 100644 cli/package-lock.json delete mode 100644 cli/package.json delete mode 100755 cli/src/index.ts delete mode 100644 cli/tsconfig.json delete mode 100644 core/.eslintrc.json delete mode 100644 core/CHANGELOG.md delete mode 100644 core/package-lock.json delete mode 100644 core/package.json delete mode 100644 core/src/index.ts delete mode 100644 core/src/mirrord.ts delete mode 100644 core/tsconfig.json create mode 100644 mirrord-agent/CHANGELOG.md create mode 100644 mirrord-agent/Cargo.lock create mode 100644 mirrord-agent/Cargo.toml create mode 100644 mirrord-agent/Dockerfile rename {cli => mirrord-agent}/LICENSE (100%) create mode 100644 mirrord-agent/README.md create mode 100644 mirrord-agent/src/cli.rs create mode 100644 mirrord-agent/src/main.rs create mode 100644 mirrord-agent/src/runtime.rs create mode 100644 mirrord-agent/src/sniffer.rs create mode 100644 mirrord-agent/src/util.rs create mode 100644 mirrord-agent/tests/blackbox.rs create mode 100644 mirrord-layer/Cargo.lock create mode 100644 mirrord-layer/Cargo.toml rename {core => mirrord-layer}/LICENSE (100%) create mode 100644 mirrord-layer/README.md create mode 100644 mirrord-layer/src/lib.rs create mode 100644 mirrord-protocol/CHANGELOG.md create mode 100644 mirrord-protocol/Cargo.lock create mode 100644 mirrord-protocol/Cargo.toml create mode 100644 mirrord-protocol/LICENSE create mode 100644 mirrord-protocol/README.md create mode 100644 mirrord-protocol/src/codec.rs create mode 100644 mirrord-protocol/src/lib.rs create mode 100644 rustfmt.toml create mode 100644 sample/app.js diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000000..36cb7009b4f --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,7 @@ +# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.224.2/containers/rust/.devcontainer/base.Dockerfile + +# [Choice] Debian OS version (use bullseye on local arm64/Apple Silicon): buster, bullseye +ARG VARIANT="buster" +FROM mcr.microsoft.com/vscode/devcontainers/rust:0-${VARIANT} + +RUN apt update && apt install -y libpcap-dev cmake \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000000..52dbf5e1433 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,46 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: +// https://github.com/microsoft/vscode-dev-containers/tree/v0.209.6/containers/rust +{ + "name": "Rust", + "build": { + "args": { + "VARIANT": "bullseye" + }, + "dockerfile": "Dockerfile" + }, + "runArgs": [ + "--cap-add=SYS_PTRACE", + "--security-opt", + "seccomp=unconfined", + "--cap-add=SYS_PTRACE", + "--security-opt", + "seccomp=unconfined" + ], + + // Set *default* container specific settings.json values on container create. + "settings": { + "lldb.executable": "/usr/bin/lldb", + "files.watcherExclude": { + "**/target/**": true + }, + "rust-analyzer.checkOnSave.command": "clippy" + }, + + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "vadimcn.vscode-lldb", + "mutantdino.resourcemonitor", + "matklad.rust-analyzer", + "tamasfe.even-better-toml", + "serayuzgur.crates" + ], + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "rustc --version", + + // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. + // "remoteUser": "vscode" +} diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..5bca2b29bca --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +# Basic set up for three package managers + +version: 2 +updates: + + # Maintain dependencies for GitHub Actions + - package-ecosystem: "cargo" + directory: "/mirrord-protocol" + schedule: + interval: "daily" \ No newline at end of file diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 44ad0caf975..3fb207c97c5 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,35 +1,69 @@ -name: Lint +name: CI on: - # Trigger the workflow on push or pull request, - # but only for the main branch + workflow_dispatch: push: - branches: - - main + branches: [ main, v2.0 ] pull_request: - branches: - - main + branches: [ main, v2.0 ] jobs: lint: - name: Lint runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + components: rustfmt, clippy + # Needed for agent + - run: sudo apt install libpcap-dev cmake + - run: cargo +nightly fmt --all -- --check + - run: cargo +nightly clippy -- -D warnings + + test_mirrord_protocol: strategy: matrix: - project: ["cli", "vscode-ext", "core"] + os: [ubuntu-latest, ubuntu-18.04, macos-12, macos-11, macos-10.15] + runs-on: ${{ matrix.os }} steps: - - name: Check out Git repository - uses: actions/checkout@v2 + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + - run: cd mirrord-protocol && cargo test - - name: Set up Node.js - uses: actions/setup-node@v1 - with: - node-version: 12 + test_agent: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + - run: sudo apt install -y libpcap-dev cmake + - run: sudo PATH=/home/runner/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin:/usr/bin:/usr/sbin /home/runner/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin/cargo test --manifest-path mirrord-agent/Cargo.toml - - name: Install Node.js dependencies - working-directory: ./${{ matrix.project }} - run: npm ci + test_agent_image: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build image + run: docker build . --file mirrord-agent/Dockerfile - - name: Lint - working-directory: ./${{ matrix.project }} - run: npm run lint + + test_mirrord_layer: + strategy: + matrix: + os: [ubuntu-latest, ubuntu-18.04, macos-12, macos-11, macos-10.15] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + # For now, just evrify it compiles. + - run: cargo +nightly build --manifest-path=mirrord-layer/Cargo.toml \ No newline at end of file diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 00000000000..583c589fffe --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,19 @@ +name: Release +on: + push: + tags: + - "*.*.*" + +jobs: + release_crates: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + - uses: katyo/publish-crates@v1 + with: + registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }} + # add publish docker image \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5e5299f5d2b..eab8d9e47b9 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,7 @@ dist node_modules .vscode-test/ *.vsix -.vscode/ \ No newline at end of file +.vscode/ +.DS_Store +**/.DS_Store +target diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000000..fafe61981c2 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,46 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch index.ts", + "type": "pwa-node", + "request": "launch", + "runtimeArgs": [ + "-r", + "ts-node/register" + ], + "args": [ + "${workspaceFolder}/cli/src/index.ts", + "nginx-deployment-66b6c48dd5-zshg9" + ], + "cwd": "${workspaceFolder}/cli" + }, + { + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "name": "Launch Extension", + "outFiles": [ + "${workspaceFolder}/vscode-ext/out/**/*.js" + ], + "request": "launch", + "type": "pwa-extensionHost" + }, + { + "type": "lldb", + "request": "launch", + "name": "Debug mirrord-layer with app.js", + "program": "node", + "args": ["${workspaceFolder}/sample/app.js"], + + "env": { + "DYLD_INSERT_LIBRARIES": "${workspaceFolder}/target/debug/libmirrord.dylib", + "LD_PRELOAD": "${workspaceFolder}/target/debug/libmirrord.so", + "RUST_LOG": "trace" + }, + } + ] +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index eb79127d6d6..4ed3cf226f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ See respective changelogs for each module. -* [VS Code Extension](./vscode-ext/CHANGELOG.md) -* [CLI](./cli/CHANGELOG.md) -* [Node Library](./core/CHANGELOG.md) \ No newline at end of file +* [mirrord-protocol](./mirrord-protocol/CHANGELOG.md) +* [mirrord-agent](./mirrord-agent/CHANGELOG.md) +* [mirrord-layer](./mirrord-layer/CHANGELOG.md) +* [VS Code Extension](./vscode-ext/CHANGELOG.md) \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000000..c64b4cf2a0f --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1489 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "actix-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-sink", + "log", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util 0.7.1", +] + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "anyhow" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" + +[[package]] +name = "async-stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e" +dependencies = [ + "async-stream-impl", + "futures-core", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-trait" +version = "0.1.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bincode" +version = "2.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f609ceb2c41b0d0277314a789ef0e7eb14593d5485f7c67320bed3924ebb1b33" +dependencies = [ + "bincode_derive", +] + +[[package]] +name = "bincode_derive" +version = "2.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913287a8f3e00db4c7ae1b87e9b9b8cebd6b89217eaadfc281fa5c897da35dc3" +dependencies = [ + "virtue", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "3.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a35a599b11c089a7f49105658d089b8f2cf0882993c17daf6de15285c2c35d" +dependencies = [ + "atty", + "bitflags", + "clap_derive", + "clap_lex", + "indexmap", + "lazy_static", + "strsim", + "termcolor", + "textwrap", +] + +[[package]] +name = "clap_derive" +version = "3.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1" +dependencies = [ + "heck 0.4.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "containerd-client" +version = "0.2.0" +source = "git+https://github.com/containerd/rust-extensions?rev=6bc49c007cf93869e7d83fca4818b6aae1145b45#6bc49c007cf93869e7d83fca4818b6aae1145b45" +dependencies = [ + "prost", + "prost-types", + "tokio", + "tonic", + "tonic-build", + "tower", +] + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "env_logger" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fastrand" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +dependencies = [ + "instant", +] + +[[package]] +name = "fixedbitset" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + +[[package]] +name = "futures-executor" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" + +[[package]] +name = "futures-macro" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "futures-task" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" + +[[package]] +name = "futures-util" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", +] + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "h2" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util 0.7.1", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "http" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "indexmap" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnetwork" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4088d739b183546b239688ddbc79891831df421773df95e236daf7867866d355" +dependencies = [ + "serde", +] + +[[package]] +name = "itertools" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" + +[[package]] +name = "libloading" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "lock_api" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mio" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "wasi 0.11.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "mirrord-agent" +version = "2.0.0-alpha-3" +dependencies = [ + "actix-codec", + "anyhow", + "clap", + "containerd-client", + "env_logger", + "futures", + "mirrord-protocol", + "nix", + "num-traits", + "pcap", + "pnet", + "serde", + "serde_json", + "test_bin", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "mirrord-protocol" +version = "0.2.0" +dependencies = [ + "actix-codec", + "bincode", + "bytes", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "nix" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "ntapi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" +dependencies = [ + "winapi", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" + +[[package]] +name = "os_str_bytes" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" + +[[package]] +name = "parking_lot" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + +[[package]] +name = "pcap" +version = "0.9.2" +source = "git+https://github.com/aviramha/pcap.git?branch=make_codec_public#df1b99fdff9cb1b30d6a360f69ddd6c6791f1c37" +dependencies = [ + "errno", + "futures", + "libc", + "libloading", + "regex", + "tokio", + "winapi", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "petgraph" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pnet" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8750e073f82219c01e771133c64718d7685aef922da8a0d430a46aed05b6341a" +dependencies = [ + "ipnetwork", + "pnet_base", + "pnet_datalink", + "pnet_packet", + "pnet_sys", + "pnet_transport", +] + +[[package]] +name = "pnet_base" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8205fe084bd43a3af79b3155c19feddd62e733640498842e631a2ffe107d1538" + +[[package]] +name = "pnet_datalink" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f85aef5e52e22ff06b1b11f2eb6d52959a9e0ecad3cb3f5cc2d78cadc077f0e" +dependencies = [ + "ipnetwork", + "libc", + "pnet_base", + "pnet_sys", + "winapi", +] + +[[package]] +name = "pnet_macros" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98cc3af95fed6dc318dfede3e81320f96ad5e237c6f7c4688108b19c8e67432d" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn", +] + +[[package]] +name = "pnet_macros_support" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feaba58ba96abb218ec584d6caf0d3ff48922df05dbbeb1560553c197091b29e" +dependencies = [ + "pnet_base", +] + +[[package]] +name = "pnet_packet" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f246edaaf1aaf82072d4cd38ee18bcc5dfc0464093f9ca39e4ac5962d68cf9d4" +dependencies = [ + "glob", + "pnet_base", + "pnet_macros", + "pnet_macros_support", +] + +[[package]] +name = "pnet_sys" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028c87a5e3a48fc07df099a2025f2ef16add5993712e1494ba69a6707ee7ed06" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "pnet_transport" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950f2a7961e19d22e19e84ff0a6e0955013185fe149673499662633d02b41b7a" +dependencies = [ + "libc", + "pnet_base", + "pnet_packet", + "pnet_sys", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "prost" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5" +dependencies = [ + "bytes", + "heck 0.3.3", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prost", + "prost-types", + "regex", + "tempfile", + "which", +] + +[[package]] +name = "prost-derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "prost-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a" +dependencies = [ + "bytes", + "prost", +] + +[[package]] +name = "quote" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "serde" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" + +[[package]] +name = "smallvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" + +[[package]] +name = "socket2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "test_bin" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e7a7de15468c6e65dd7db81cf3822c1ec94c71b2a3c1a976ea8e4696c91115c" + +[[package]] +name = "textwrap" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" + +[[package]] +name = "tokio" +version = "1.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce653fb475565de9f6fb0614b28bca8df2c430c0cf84bcd9c843f15de5414cc" +dependencies = [ + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "once_cell", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-stream" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tonic" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff08f4649d10a70ffa3522ca559031285d8e421d727ac85c60825761818f5d0a" +dependencies = [ + "async-stream", + "async-trait", + "base64", + "bytes", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "prost-derive", + "tokio", + "tokio-stream", + "tokio-util 0.6.9", + "tower", + "tower-layer", + "tower-service", + "tracing", + "tracing-futures", +] + +[[package]] +name = "tonic-build" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9403f1bafde247186684b230dc6f38b5cd514584e8bec1dd32514be4745fa757" +dependencies = [ + "proc-macro2", + "prost-build", + "quote", + "syn", +] + +[[package]] +name = "tower" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a89fd63ad6adf737582df5db40d286574513c69a11dac5214dc3b5603d6713e" +dependencies = [ + "futures-core", + "futures-util", + "indexmap", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util 0.7.1", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62" + +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + +[[package]] +name = "tracing" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + +[[package]] +name = "unicode-segmentation" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" + +[[package]] +name = "unicode-xid" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "virtue" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "757cfbfe0d17ee6f22fe97e536d463047d451b47cf9d11e2b7d1398b0ef274dd" + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "which" +version = "4.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae" +dependencies = [ + "either", + "lazy_static", + "libc", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 00000000000..27380f391cc --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,7 @@ +[workspace] + +members = [ + "mirrord-protocol", + "mirrord-agent", + "mirrord-layer", +] \ No newline at end of file diff --git a/cli/.eslintrc.json b/cli/.eslintrc.json deleted file mode 100644 index f9b22b793c2..00000000000 --- a/cli/.eslintrc.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint" - ], - "rules": { - "@typescript-eslint/naming-convention": "warn", - "@typescript-eslint/semi": "warn", - "curly": "warn", - "eqeqeq": "warn", - "no-throw-literal": "warn", - "semi": "off" - }, - "ignorePatterns": [ - "out", - "dist", - "**/*.d.ts" - ] -} diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md deleted file mode 100644 index 843ecd7cfa0..00000000000 --- a/cli/CHANGELOG.md +++ /dev/null @@ -1,19 +0,0 @@ -# Change Log -Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. - -## [Unreleased] - -## 1.0.4 - 12/03/2022 -### Fixed -- CLI couldn't run on some Linux distros (Arch) [#15](https://github.com/metalbear-co/mirrord/issues/14]). - -## 1.0.3 - 07/03/2022 -### Added -- Keywords - -## 1.0.2 - 06/03/2022 -### Added -- README - -## 1.0.1 - 06/03/2022 -- Initial release diff --git a/cli/README.md b/cli/README.md deleted file mode 100644 index a0395cc2d2a..00000000000 --- a/cli/README.md +++ /dev/null @@ -1,79 +0,0 @@ -

- -

-

mirrord

- -mirrord lets you easily mirror traffic from your Kubernetes cluster to your development environment. It comes as both [Visual Studio Code](https://code.visualstudio.com/) extension and a CLI tool. - - -## Getting Started -- [VSCode Extension](#vscode-extension) -- [CLI Tool](#cli-tool) -> mirrord uses your machine's default kubeconfig for access to the Kubernetes API. ---- -## VSCode Extension -### Installation -Get the extension [here](https://marketplace.visualstudio.com/items?itemName=MetalBear.mirrord). - -### How to use - -* Start debugging your project -* Click "Start mirrord" on the status bar -* Choose pod to mirror traffic from -* To stop mirroring, click "Stop mirrord" (or stop debugging) - -

- -

- -The extension listens on the remote port 80, and uses the k8s namespace 'default', but both of those are configurable through the settings button. The extension automatically detects which local port your debugged process listens on and directs the mirrored traffic to it. -If you prefer to direct traffic to a different local port, edit launch.json: - -`{ - "mirrord": { - "port": "" - } -}` - ---- -## CLI Tool -### Installation -`npm install -g mirrord` - -### How to use -`mirrord ` - -

- -

- -For more options, run: - -`mirrord --help` - ---- -## How it works -mirrord works by letting you select a pod to mirror traffic from. It launches a privileged pod on the same nodewhich enters the namespace of the selected pod and captures traffic from it. - - - -For more technical information, see [TECHNICAL.md](./TECHNICAL.md) - -### Caveats -* mirrord currently supports Kubernetes clusters using containerd runtime only. Support for more runtimes will be added if there's demand. - - - - -## Contributing -Contributions are welcome via PRs. - - -## Help & Community 🎉✉️ - -Join our [Discord Server](https://discord.gg/J5YSrStDKD) for questions, support and fun. - ---- - - -Icon Credit: flaticon.com diff --git a/cli/package-lock.json b/cli/package-lock.json deleted file mode 100644 index fb77ba36147..00000000000 --- a/cli/package-lock.json +++ /dev/null @@ -1,5467 +0,0 @@ -{ - "name": "mirrord", - "version": "1.0.4", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "mirrord", - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "@metalbear/mirrord-core": "^1.0.0", - "commander": "^9.0.0" - }, - "bin": { - "mirrord": "out/index.js" - }, - "devDependencies": { - "@types/node": "^17.0.21", - "@typescript-eslint/eslint-plugin": "^5.9.1", - "@typescript-eslint/parser": "^5.9.1", - "eslint": "^8.6.0", - "ts-node": "^10.5.0", - "tslib": "^2.3.1", - "tslint": "^6.1.3", - "typescript": "^4.5.5" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-consumer": "0.8.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@kubernetes/client-node": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.16.3.tgz", - "integrity": "sha512-L7IckuyuPfhd+/Urib8MRas9D6sfKEq8IaITYcaE6LlU+Y8MeD7MTbuW6Yb2WdeRuFN8HPSS47mxPnOUNYBXEg==", - "dependencies": { - "@types/js-yaml": "^4.0.1", - "@types/node": "^10.12.0", - "@types/request": "^2.47.1", - "@types/stream-buffers": "^3.0.3", - "@types/tar": "^4.0.3", - "@types/underscore": "^1.8.9", - "@types/ws": "^6.0.1", - "byline": "^5.0.0", - "execa": "5.0.0", - "isomorphic-ws": "^4.0.1", - "js-yaml": "^4.1.0", - "jsonpath-plus": "^0.19.0", - "openid-client": "^4.1.1", - "request": "^2.88.0", - "rfc4648": "^1.3.0", - "shelljs": "^0.8.5", - "stream-buffers": "^3.0.2", - "tar": "^6.1.11", - "tmp-promise": "^3.0.2", - "tslib": "^1.9.3", - "underscore": "^1.9.1", - "ws": "^7.3.1" - } - }, - "node_modules/@kubernetes/client-node/node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - }, - "node_modules/@kubernetes/client-node/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@metalbear/mirrord-core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@metalbear/mirrord-core/-/mirrord-core-1.1.0.tgz", - "integrity": "sha512-SOLM54ASStANgcjpNwTGsq1nzjwYc2vWFEMQJWr3zF8TTAnIk/m7zSR1I+WpyAjbDtxxQLW52f6uBKT64Pgxsg==", - "dependencies": { - "@kubernetes/client-node": "^0.16.3", - "net": "^1.0.2", - "short-uuid": "^4.2.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@panva/asn1.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", - "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "node_modules/@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "node_modules/@types/js-yaml": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" - }, - "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/minipass": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/minipass/-/minipass-3.1.2.tgz", - "integrity": "sha512-foLGjgrJkUjLG/o2t2ymlZGEoBNBa/TfoUZ7oCTkOjP1T43UGBJspovJou/l3ZuHvye2ewR5cZNtp2zyWgILMA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" - }, - "node_modules/@types/request": { - "version": "2.48.8", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", - "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", - "dependencies": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/stream-buffers": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/stream-buffers/-/stream-buffers-3.0.4.tgz", - "integrity": "sha512-qU/K1tb2yUdhXkLIATzsIPwbtX6BpZk0l3dPW6xqWyhfzzM1ECaQ/8faEnu3CNraLiQ9LHyQQPBGp7N9Fbs25w==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/tar": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tar/-/tar-4.0.5.tgz", - "integrity": "sha512-cgwPhNEabHaZcYIy5xeMtux2EmYBitfqEceBUi2t5+ETy4dW6kswt6WX4+HqLeiiKOo42EXbGiDmVJ2x+vi37Q==", - "dependencies": { - "@types/minipass": "*", - "@types/node": "*" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==" - }, - "node_modules/@types/underscore": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz", - "integrity": "sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg==" - }, - "node_modules/@types/ws": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.4.tgz", - "integrity": "sha512-PpPrX7SZW9re6+Ha8ojZG4Se8AZXgf0GK6zmfqEuCsY49LFDNXO3SByp44X3dFEqtB73lkCDAdUazhAjVPiNwg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", - "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/type-utils": "5.14.0", - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", - "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", - "debug": "^4.3.2" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", - "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", - "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", - "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", - "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", - "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", - "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.14.0", - "eslint-visitor-keys": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz", - "integrity": "sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", - "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dev": true, - "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "node_modules/jose": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.5.tgz", - "integrity": "sha512-BAiDNeDKTMgk4tvD0BbxJ8xHEHBZgpeRZ1zGPPsitSyMgjoMWiLGYAE7H7NpP5h0lPppQajQs871E8NHUrzVPA==", - "dependencies": { - "@panva/asn1.js": "^1.0.0" - }, - "engines": { - "node": ">=10.13.0 < 13 || >=13.7.0" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "node_modules/jsonpath-plus": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-0.19.0.tgz", - "integrity": "sha512-GSVwsrzW9LsA5lzsqe4CkuZ9wp+kxBb2GwNniaWzI2YFn5Ig42rSW8ZxVpWXaAfakXNrx5pgY5AbQq7kzX29kg==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/keyv": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", - "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dependencies": { - "mime-db": "1.51.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/net": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", - "integrity": "sha1-0XV+yaf7I3HYPPR1XOPifhCCk4g=" - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/oidc-token-hash": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", - "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==", - "engines": { - "node": "^10.13.0 || >=12.0.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/openid-client": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-4.9.1.tgz", - "integrity": "sha512-DYUF07AHjI3QDKqKbn2F7RqozT4hyi4JvmpodLrq0HHoNP7t/AjeG/uqiBK1/N2PZSAQEThVjDLHSmJN4iqu/w==", - "dependencies": { - "aggregate-error": "^3.1.0", - "got": "^11.8.0", - "jose": "^2.0.5", - "lru-cache": "^6.0.0", - "make-error": "^1.3.6", - "object-hash": "^2.0.1", - "oidc-token-hash": "^5.0.1" - }, - "engines": { - "node": "^10.19.0 || >=12.0.0 < 13 || >=13.7.0 < 14 || >= 14.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfc4648": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.1.tgz", - "integrity": "sha512-60e/YWs2/D3MV1ErdjhJHcmlgnyLUiG4X/14dgsfm9/zmCWLN16xI6YqJYSCd/OANM7bUNzJqPY5B8/02S9Ibw==" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/short-uuid": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/short-uuid/-/short-uuid-4.2.0.tgz", - "integrity": "sha512-r3cxuPPZSuF0QkKsK9bBR7u+7cwuCRzWzgjPh07F5N2iIUNgblnMHepBY16xgj5t1lG9iOP9k/TEafY1qhRzaw==", - "dependencies": { - "any-base": "^1.1.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/short-uuid/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-buffers": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", - "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ts-node": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", - "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.0", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, - "node_modules/tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" - } - }, - "node_modules/tslint/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/tslint/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/tslint/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/tslint/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/tslint/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/tslint/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/tslint/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/tslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/tslint/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tslint/node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz", - "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==", - "dev": true - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", - "dev": true, - "requires": { - "@cspotcode/source-map-consumer": "0.8.0" - } - }, - "@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@kubernetes/client-node": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.16.3.tgz", - "integrity": "sha512-L7IckuyuPfhd+/Urib8MRas9D6sfKEq8IaITYcaE6LlU+Y8MeD7MTbuW6Yb2WdeRuFN8HPSS47mxPnOUNYBXEg==", - "requires": { - "@types/js-yaml": "^4.0.1", - "@types/node": "^10.12.0", - "@types/request": "^2.47.1", - "@types/stream-buffers": "^3.0.3", - "@types/tar": "^4.0.3", - "@types/underscore": "^1.8.9", - "@types/ws": "^6.0.1", - "byline": "^5.0.0", - "execa": "5.0.0", - "isomorphic-ws": "^4.0.1", - "js-yaml": "^4.1.0", - "jsonpath-plus": "^0.19.0", - "openid-client": "^4.1.1", - "request": "^2.88.0", - "rfc4648": "^1.3.0", - "shelljs": "^0.8.5", - "stream-buffers": "^3.0.2", - "tar": "^6.1.11", - "tmp-promise": "^3.0.2", - "tslib": "^1.9.3", - "underscore": "^1.9.1", - "ws": "^7.3.1" - }, - "dependencies": { - "@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@metalbear/mirrord-core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@metalbear/mirrord-core/-/mirrord-core-1.1.0.tgz", - "integrity": "sha512-SOLM54ASStANgcjpNwTGsq1nzjwYc2vWFEMQJWr3zF8TTAnIk/m7zSR1I+WpyAjbDtxxQLW52f6uBKT64Pgxsg==", - "requires": { - "@kubernetes/client-node": "^0.16.3", - "net": "^1.0.2", - "short-uuid": "^4.2.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@panva/asn1.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", - "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==" - }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "@types/js-yaml": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", - "requires": { - "@types/node": "*" - } - }, - "@types/minipass": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/minipass/-/minipass-3.1.2.tgz", - "integrity": "sha512-foLGjgrJkUjLG/o2t2ymlZGEoBNBa/TfoUZ7oCTkOjP1T43UGBJspovJou/l3ZuHvye2ewR5cZNtp2zyWgILMA==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" - }, - "@types/request": { - "version": "2.48.8", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", - "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", - "requires": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "requires": { - "@types/node": "*" - } - }, - "@types/stream-buffers": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/stream-buffers/-/stream-buffers-3.0.4.tgz", - "integrity": "sha512-qU/K1tb2yUdhXkLIATzsIPwbtX6BpZk0l3dPW6xqWyhfzzM1ECaQ/8faEnu3CNraLiQ9LHyQQPBGp7N9Fbs25w==", - "requires": { - "@types/node": "*" - } - }, - "@types/tar": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tar/-/tar-4.0.5.tgz", - "integrity": "sha512-cgwPhNEabHaZcYIy5xeMtux2EmYBitfqEceBUi2t5+ETy4dW6kswt6WX4+HqLeiiKOo42EXbGiDmVJ2x+vi37Q==", - "requires": { - "@types/minipass": "*", - "@types/node": "*" - } - }, - "@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==" - }, - "@types/underscore": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz", - "integrity": "sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg==" - }, - "@types/ws": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.4.tgz", - "integrity": "sha512-PpPrX7SZW9re6+Ha8ojZG4Se8AZXgf0GK6zmfqEuCsY49LFDNXO3SByp44X3dFEqtB73lkCDAdUazhAjVPiNwg==", - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", - "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/type-utils": "5.14.0", - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", - "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", - "debug": "^4.3.2" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", - "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", - "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", - "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", - "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", - "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", - "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.14.0", - "eslint-visitor-keys": "^3.0.0" - } - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" - }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz", - "integrity": "sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - } - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", - "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dev": true, - "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" - }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "requires": {} - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jose": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.5.tgz", - "integrity": "sha512-BAiDNeDKTMgk4tvD0BbxJ8xHEHBZgpeRZ1zGPPsitSyMgjoMWiLGYAE7H7NpP5h0lPppQajQs871E8NHUrzVPA==", - "requires": { - "@panva/asn1.js": "^1.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonpath-plus": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-0.19.0.tgz", - "integrity": "sha512-GSVwsrzW9LsA5lzsqe4CkuZ9wp+kxBb2GwNniaWzI2YFn5Ig42rSW8ZxVpWXaAfakXNrx5pgY5AbQq7kzX29kg==" - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "keyv": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", - "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", - "requires": { - "json-buffer": "3.0.1" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "requires": { - "mime-db": "1.51.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "net": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", - "integrity": "sha1-0XV+yaf7I3HYPPR1XOPifhCCk4g=" - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" - }, - "oidc-token-hash": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", - "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "openid-client": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-4.9.1.tgz", - "integrity": "sha512-DYUF07AHjI3QDKqKbn2F7RqozT4hyi4JvmpodLrq0HHoNP7t/AjeG/uqiBK1/N2PZSAQEThVjDLHSmJN4iqu/w==", - "requires": { - "aggregate-error": "^3.1.0", - "got": "^11.8.0", - "jose": "^2.0.5", - "lru-cache": "^6.0.0", - "make-error": "^1.3.6", - "object-hash": "^2.0.1", - "oidc-token-hash": "^5.0.1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "^1.1.6" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - } - } - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rfc4648": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.1.tgz", - "integrity": "sha512-60e/YWs2/D3MV1ErdjhJHcmlgnyLUiG4X/14dgsfm9/zmCWLN16xI6YqJYSCd/OANM7bUNzJqPY5B8/02S9Ibw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "short-uuid": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/short-uuid/-/short-uuid-4.2.0.tgz", - "integrity": "sha512-r3cxuPPZSuF0QkKsK9bBR7u+7cwuCRzWzgjPh07F5N2iIUNgblnMHepBY16xgj5t1lG9iOP9k/TEafY1qhRzaw==", - "requires": { - "any-base": "^1.1.0", - "uuid": "^8.3.2" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - } - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stream-buffers": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", - "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "requires": { - "rimraf": "^3.0.0" - } - }, - "tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "requires": { - "tmp": "^0.2.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "ts-node": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", - "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.0", - "yn": "3.1.1" - } - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", - "dev": true - }, - "underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==" - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz", - "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "requires": {} - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } -} diff --git a/cli/package.json b/cli/package.json deleted file mode 100644 index e6bd5e13244..00000000000 --- a/cli/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "mirrord", - "bin": "out/index.js", - "version": "1.0.4", - "main": "out/index.js", - "author": "MetalBear", - "description": "Mirror live traffic from your Kubernetes cluster to your local debugged process.", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/metalbear-co/mirrord" - }, - "keywords": [ - "kubernetes", - "debugging", - "cloud", - "cli", - "mirroring", - "traffic", - "sniffer", - "api", - "local" - ], - "scripts": { - "lint": "eslint src --ext ts" - }, - "homepage": "https://github.com/metalbear-co/mirrord#readme", - "devDependencies": { - "@types/node": "^17.0.21", - "ts-node": "^10.5.0", - "tslib": "^2.3.1", - "tslint": "^6.1.3", - "typescript": "^4.5.5", - "eslint": "^8.6.0", - "@typescript-eslint/eslint-plugin": "^5.9.1", - "@typescript-eslint/parser": "^5.9.1" - }, - "dependencies": { - "@metalbear/mirrord-core": "^1.0.0", - "commander": "^9.0.0" - } -} diff --git a/cli/src/index.ts b/cli/src/index.ts deleted file mode 100755 index 6b40da3f388..00000000000 --- a/cli/src/index.ts +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env -S npx ts-node -const { program } = require('commander'); -import { PortSpec, MirrorD, MirrorEvent, K8SAPI } from '@metalbear/mirrord-core'; - -function sleep(ms: number) { - return new Promise(resolve => setTimeout(resolve, ms)); -} - -interface Arguments { - podName: string; - ports: PortSpec[]; - namespace: string -} - - -let mirror: MirrorD | null = null; -let run = true; - - -function parseArgs(): Arguments { - program - .name("mirrord") - .description('Mirror traffic from specified pod to localhost') - .argument('', 'Name of pod to mirror') - .option('-p, --port [localport:remoteport...]', 'Local port to send to and remote port to capture from', ['8000:80']) - .option('-n, --namespace [namespace]', 'Namespace to use', 'default'); - - let args = program.parse(process.argv); - let options = args.opts(); - let ports = options.port.map((p: String) => { - let [localPort, remotePort] = p.split(':'); - return { - localPort: parseInt(localPort), - remotePort: parseInt(remotePort) - }; - }); - return { - podName: args.args[0], - ports: ports, - namespace: options.namespace - }; -} - -function updateCallback(event: MirrorEvent, data: any) { - switch (event) { - case MirrorEvent.newConnection: - console.log('New connection to port ' + data.toString()); - break; - case MirrorEvent.packetReceived: - console.log('Packet received'); - break; - case MirrorEvent.connectionClosed: - console.log('Connection closed'); - break; - } -} - -async function exitHandler() { - run = false; -} - -process.on('SIGINT', exitHandler); - -async function main() { - const args = parseArgs(); - let api = new K8SAPI(); - let podData: any; - try { - podData = await api.getPodData(args.podName, args.namespace); - } - catch (e: any) { - if (e.body) { - console.log(e.body.message); - } else { - console.log(e); - } - return; - } - mirror = new MirrorD(podData.nodeName, podData.containerID, args.ports, args.namespace, api, updateCallback); - await mirror.start(); - console.log("To terminate, press Ctrl+C"); - while (run) { - await sleep(1000); - } - - if (mirror) { - await mirror.stop(); - mirror = null; - } - -} - -main(); \ No newline at end of file diff --git a/cli/tsconfig.json b/cli/tsconfig.json deleted file mode 100644 index fc8ab823519..00000000000 --- a/cli/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - /* Language and Environment */ - "target": "es2020", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - - "module": "commonjs", /* Specify what module code is generated. */ - "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */ - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ - - /* Type Checking */ - "strict": true, /* Enable all strict type-checking options. */ - "outDir": "out", - "sourceMap": true - } -} diff --git a/core/.eslintrc.json b/core/.eslintrc.json deleted file mode 100644 index f9b22b793c2..00000000000 --- a/core/.eslintrc.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint" - ], - "rules": { - "@typescript-eslint/naming-convention": "warn", - "@typescript-eslint/semi": "warn", - "curly": "warn", - "eqeqeq": "warn", - "no-throw-literal": "warn", - "semi": "off" - }, - "ignorePatterns": [ - "out", - "dist", - "**/*.d.ts" - ] -} diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md deleted file mode 100644 index 50ea67420af..00000000000 --- a/core/CHANGELOG.md +++ /dev/null @@ -1,21 +0,0 @@ -# Change Log -Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. - -## [Unreleased] - -## 1.1.0 - 12/03/2022 -### Added -- Add listNamespaces function -### Changed -- Pin `mirrord-agent` container image version. - -## 1.0.3 - 06/03/2022 -### Fixed -- Fix issue with publishing to npm - -## 1.0.2 - 06/03/2022 -### Fixed -- Fix linting errors - -## 1.0.1 - 06/03/2022 -- Initial release diff --git a/core/package-lock.json b/core/package-lock.json deleted file mode 100644 index a0e6e511d5e..00000000000 --- a/core/package-lock.json +++ /dev/null @@ -1,4611 +0,0 @@ -{ - "name": "@metalbear/mirrord-core", - "version": "1.1.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@metalbear/mirrord-core", - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@kubernetes/client-node": "^0.16.3", - "net": "^1.0.2", - "short-uuid": "^4.2.0" - }, - "devDependencies": { - "@types/node": "^17.0.21", - "@typescript-eslint/eslint-plugin": "^5.9.1", - "@typescript-eslint/parser": "^5.9.1", - "eslint": "^8.6.0", - "typescript": "^4.5.4" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@kubernetes/client-node": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.16.3.tgz", - "integrity": "sha512-L7IckuyuPfhd+/Urib8MRas9D6sfKEq8IaITYcaE6LlU+Y8MeD7MTbuW6Yb2WdeRuFN8HPSS47mxPnOUNYBXEg==", - "dependencies": { - "@types/js-yaml": "^4.0.1", - "@types/node": "^10.12.0", - "@types/request": "^2.47.1", - "@types/stream-buffers": "^3.0.3", - "@types/tar": "^4.0.3", - "@types/underscore": "^1.8.9", - "@types/ws": "^6.0.1", - "byline": "^5.0.0", - "execa": "5.0.0", - "isomorphic-ws": "^4.0.1", - "js-yaml": "^4.1.0", - "jsonpath-plus": "^0.19.0", - "openid-client": "^4.1.1", - "request": "^2.88.0", - "rfc4648": "^1.3.0", - "shelljs": "^0.8.5", - "stream-buffers": "^3.0.2", - "tar": "^6.1.11", - "tmp-promise": "^3.0.2", - "tslib": "^1.9.3", - "underscore": "^1.9.1", - "ws": "^7.3.1" - } - }, - "node_modules/@kubernetes/client-node/node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@panva/asn1.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", - "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "node_modules/@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "node_modules/@types/js-yaml": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" - }, - "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/minipass": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/minipass/-/minipass-3.1.2.tgz", - "integrity": "sha512-foLGjgrJkUjLG/o2t2ymlZGEoBNBa/TfoUZ7oCTkOjP1T43UGBJspovJou/l3ZuHvye2ewR5cZNtp2zyWgILMA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" - }, - "node_modules/@types/request": { - "version": "2.48.8", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", - "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", - "dependencies": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/stream-buffers": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/stream-buffers/-/stream-buffers-3.0.4.tgz", - "integrity": "sha512-qU/K1tb2yUdhXkLIATzsIPwbtX6BpZk0l3dPW6xqWyhfzzM1ECaQ/8faEnu3CNraLiQ9LHyQQPBGp7N9Fbs25w==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/tar": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tar/-/tar-4.0.5.tgz", - "integrity": "sha512-cgwPhNEabHaZcYIy5xeMtux2EmYBitfqEceBUi2t5+ETy4dW6kswt6WX4+HqLeiiKOo42EXbGiDmVJ2x+vi37Q==", - "dependencies": { - "@types/minipass": "*", - "@types/node": "*" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==" - }, - "node_modules/@types/underscore": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz", - "integrity": "sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg==" - }, - "node_modules/@types/ws": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.4.tgz", - "integrity": "sha512-PpPrX7SZW9re6+Ha8ojZG4Se8AZXgf0GK6zmfqEuCsY49LFDNXO3SByp44X3dFEqtB73lkCDAdUazhAjVPiNwg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", - "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/type-utils": "5.14.0", - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", - "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", - "debug": "^4.3.2" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", - "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", - "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", - "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", - "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", - "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", - "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.14.0", - "eslint-visitor-keys": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", - "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dev": true, - "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "node_modules/jose": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.5.tgz", - "integrity": "sha512-BAiDNeDKTMgk4tvD0BbxJ8xHEHBZgpeRZ1zGPPsitSyMgjoMWiLGYAE7H7NpP5h0lPppQajQs871E8NHUrzVPA==", - "dependencies": { - "@panva/asn1.js": "^1.0.0" - }, - "engines": { - "node": ">=10.13.0 < 13 || >=13.7.0" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "node_modules/jsonpath-plus": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-0.19.0.tgz", - "integrity": "sha512-GSVwsrzW9LsA5lzsqe4CkuZ9wp+kxBb2GwNniaWzI2YFn5Ig42rSW8ZxVpWXaAfakXNrx5pgY5AbQq7kzX29kg==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/keyv": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", - "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dependencies": { - "mime-db": "1.51.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/net": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", - "integrity": "sha1-0XV+yaf7I3HYPPR1XOPifhCCk4g=" - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/oidc-token-hash": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", - "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==", - "engines": { - "node": "^10.13.0 || >=12.0.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/openid-client": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-4.9.1.tgz", - "integrity": "sha512-DYUF07AHjI3QDKqKbn2F7RqozT4hyi4JvmpodLrq0HHoNP7t/AjeG/uqiBK1/N2PZSAQEThVjDLHSmJN4iqu/w==", - "dependencies": { - "aggregate-error": "^3.1.0", - "got": "^11.8.0", - "jose": "^2.0.5", - "lru-cache": "^6.0.0", - "make-error": "^1.3.6", - "object-hash": "^2.0.1", - "oidc-token-hash": "^5.0.1" - }, - "engines": { - "node": "^10.19.0 || >=12.0.0 < 13 || >=13.7.0 < 14 || >= 14.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfc4648": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.1.tgz", - "integrity": "sha512-60e/YWs2/D3MV1ErdjhJHcmlgnyLUiG4X/14dgsfm9/zmCWLN16xI6YqJYSCd/OANM7bUNzJqPY5B8/02S9Ibw==" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/short-uuid": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/short-uuid/-/short-uuid-4.2.0.tgz", - "integrity": "sha512-r3cxuPPZSuF0QkKsK9bBR7u+7cwuCRzWzgjPh07F5N2iIUNgblnMHepBY16xgj5t1lG9iOP9k/TEafY1qhRzaw==", - "dependencies": { - "any-base": "^1.1.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/short-uuid/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-buffers": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", - "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - }, - "dependencies": { - "@eslint/eslintrc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz", - "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@kubernetes/client-node": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.16.3.tgz", - "integrity": "sha512-L7IckuyuPfhd+/Urib8MRas9D6sfKEq8IaITYcaE6LlU+Y8MeD7MTbuW6Yb2WdeRuFN8HPSS47mxPnOUNYBXEg==", - "requires": { - "@types/js-yaml": "^4.0.1", - "@types/node": "^10.12.0", - "@types/request": "^2.47.1", - "@types/stream-buffers": "^3.0.3", - "@types/tar": "^4.0.3", - "@types/underscore": "^1.8.9", - "@types/ws": "^6.0.1", - "byline": "^5.0.0", - "execa": "5.0.0", - "isomorphic-ws": "^4.0.1", - "js-yaml": "^4.1.0", - "jsonpath-plus": "^0.19.0", - "openid-client": "^4.1.1", - "request": "^2.88.0", - "rfc4648": "^1.3.0", - "shelljs": "^0.8.5", - "stream-buffers": "^3.0.2", - "tar": "^6.1.11", - "tmp-promise": "^3.0.2", - "tslib": "^1.9.3", - "underscore": "^1.9.1", - "ws": "^7.3.1" - }, - "dependencies": { - "@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@panva/asn1.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", - "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==" - }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "@types/js-yaml": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", - "requires": { - "@types/node": "*" - } - }, - "@types/minipass": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/minipass/-/minipass-3.1.2.tgz", - "integrity": "sha512-foLGjgrJkUjLG/o2t2ymlZGEoBNBa/TfoUZ7oCTkOjP1T43UGBJspovJou/l3ZuHvye2ewR5cZNtp2zyWgILMA==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" - }, - "@types/request": { - "version": "2.48.8", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", - "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", - "requires": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "requires": { - "@types/node": "*" - } - }, - "@types/stream-buffers": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/stream-buffers/-/stream-buffers-3.0.4.tgz", - "integrity": "sha512-qU/K1tb2yUdhXkLIATzsIPwbtX6BpZk0l3dPW6xqWyhfzzM1ECaQ/8faEnu3CNraLiQ9LHyQQPBGp7N9Fbs25w==", - "requires": { - "@types/node": "*" - } - }, - "@types/tar": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tar/-/tar-4.0.5.tgz", - "integrity": "sha512-cgwPhNEabHaZcYIy5xeMtux2EmYBitfqEceBUi2t5+ETy4dW6kswt6WX4+HqLeiiKOo42EXbGiDmVJ2x+vi37Q==", - "requires": { - "@types/minipass": "*", - "@types/node": "*" - } - }, - "@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==" - }, - "@types/underscore": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz", - "integrity": "sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg==" - }, - "@types/ws": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.4.tgz", - "integrity": "sha512-PpPrX7SZW9re6+Ha8ojZG4Se8AZXgf0GK6zmfqEuCsY49LFDNXO3SByp44X3dFEqtB73lkCDAdUazhAjVPiNwg==", - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz", - "integrity": "sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/type-utils": "5.14.0", - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.14.0.tgz", - "integrity": "sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", - "debug": "^4.3.2" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz", - "integrity": "sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz", - "integrity": "sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "5.14.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.14.0.tgz", - "integrity": "sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz", - "integrity": "sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/visitor-keys": "5.14.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.14.0.tgz", - "integrity": "sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.14.0", - "@typescript-eslint/types": "5.14.0", - "@typescript-eslint/typescript-estree": "5.14.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz", - "integrity": "sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.14.0", - "eslint-visitor-keys": "^3.0.0" - } - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" - }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - } - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz", - "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.2.1", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", - "dev": true, - "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" - }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "requires": {} - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jose": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.5.tgz", - "integrity": "sha512-BAiDNeDKTMgk4tvD0BbxJ8xHEHBZgpeRZ1zGPPsitSyMgjoMWiLGYAE7H7NpP5h0lPppQajQs871E8NHUrzVPA==", - "requires": { - "@panva/asn1.js": "^1.0.0" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonpath-plus": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-0.19.0.tgz", - "integrity": "sha512-GSVwsrzW9LsA5lzsqe4CkuZ9wp+kxBb2GwNniaWzI2YFn5Ig42rSW8ZxVpWXaAfakXNrx5pgY5AbQq7kzX29kg==" - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "keyv": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", - "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", - "requires": { - "json-buffer": "3.0.1" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "requires": { - "mime-db": "1.51.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "net": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", - "integrity": "sha1-0XV+yaf7I3HYPPR1XOPifhCCk4g=" - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" - }, - "oidc-token-hash": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.1.tgz", - "integrity": "sha512-EvoOtz6FIEBzE+9q253HsLCVRiK/0doEJ2HCvvqMQb3dHZrP3WlJKYtJ55CRTw4jmYomzH4wkPuCj/I3ZvpKxQ==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "openid-client": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-4.9.1.tgz", - "integrity": "sha512-DYUF07AHjI3QDKqKbn2F7RqozT4hyi4JvmpodLrq0HHoNP7t/AjeG/uqiBK1/N2PZSAQEThVjDLHSmJN4iqu/w==", - "requires": { - "aggregate-error": "^3.1.0", - "got": "^11.8.0", - "jose": "^2.0.5", - "lru-cache": "^6.0.0", - "make-error": "^1.3.6", - "object-hash": "^2.0.1", - "oidc-token-hash": "^5.0.1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "^1.1.6" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - } - } - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rfc4648": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.1.tgz", - "integrity": "sha512-60e/YWs2/D3MV1ErdjhJHcmlgnyLUiG4X/14dgsfm9/zmCWLN16xI6YqJYSCd/OANM7bUNzJqPY5B8/02S9Ibw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "short-uuid": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/short-uuid/-/short-uuid-4.2.0.tgz", - "integrity": "sha512-r3cxuPPZSuF0QkKsK9bBR7u+7cwuCRzWzgjPh07F5N2iIUNgblnMHepBY16xgj5t1lG9iOP9k/TEafY1qhRzaw==", - "requires": { - "any-base": "^1.1.0", - "uuid": "^8.3.2" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - } - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stream-buffers": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", - "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "requires": { - "rimraf": "^3.0.0" - } - }, - "tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "requires": { - "tmp": "^0.2.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.2.tgz", - "integrity": "sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==", - "dev": true - }, - "underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==" - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "requires": {} - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } -} diff --git a/core/package.json b/core/package.json deleted file mode 100644 index 86b6e1e01fc..00000000000 --- a/core/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "@metalbear/mirrord-core", - "version": "1.1.0", - "description": "Core functionality for running mirrord", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "files": [ - "/dist" - ], - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "lint": "eslint src --ext ts" - }, - "keywords": [], - "author": "MetalBear", - "license": "MIT", - "devDependencies": { - "@types/node": "^17.0.21", - "eslint": "^8.6.0", - "@typescript-eslint/eslint-plugin": "^5.9.1", - "@typescript-eslint/parser": "^5.9.1", - "typescript": "^4.5.4" - }, - "dependencies": { - "@kubernetes/client-node": "^0.16.3", - "net": "^1.0.2", - "short-uuid": "^4.2.0" - } -} diff --git a/core/src/index.ts b/core/src/index.ts deleted file mode 100644 index 8a78c89038a..00000000000 --- a/core/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export {MirrorD, MirrorEvent, PortSpec, K8SAPI} from './mirrord'; \ No newline at end of file diff --git a/core/src/mirrord.ts b/core/src/mirrord.ts deleted file mode 100644 index 96f0cb0a4c8..00000000000 --- a/core/src/mirrord.ts +++ /dev/null @@ -1,251 +0,0 @@ -const k8s = require('@kubernetes/client-node'); -const shortid = require('short-uuid'); -const net = require('net'); -const stream = require('stream'); - -export interface PortSpec { - localPort: number, - remotePort: number, -} - - -export interface PodData { - nodeName: string; - containerID: string; -} - -function sleep(ms: number) { - return new Promise(resolve => setTimeout(resolve, ms)); -} - - -function createMirrordPodDefinition(agentPodName: String, nodeName: String, containerID: String, ports: number[]): any { - let portArguments = ports.map((p: number) => { - return ['--ports', p.toString()]; - }).flat(); - - return { - metadata: { name: agentPodName }, - spec: { - hostPID: true, - nodeName: nodeName, - restartPolicy: 'Never', - volumes: [ - { - name: 'containerd', - hostPath: { path: '/run/containerd/containerd.sock' } - } - ], - containers: [ - { - name: 'mirrord-agent', - image: 'ghcr.io/metalbear-co/mirrord-agent:1.0.1', - imagePullPolicy: 'Always', - securityContext: { privileged: true }, - volumeMounts: [ - { - mountPath: '/run/containerd/containerd.sock', - name: 'containerd' - } - ], - command: [ - "./mirrord-agent", - "--container-id", - containerID, - ...portArguments - ] - } - ] - } - - }; -} - -export class K8SAPI { - api: any; - config: any; - - constructor() { - const kc = new k8s.KubeConfig(); - kc.loadFromDefault(); - this.config = kc; - this.api = kc.makeApiClient(k8s.CoreV1Api); - } - - getLog() { - return new k8s.Log(this.config); - } - - async listNamespaces(): Promise { - return await this.api.listNamespace(); - } - - async listPods(namespace: string): Promise { - return await this.api.listNamespacedPod(namespace); - } - - async getPodData(podName: String, namespace: String): Promise { - const rawData = (await this.api.readNamespacedPod(podName, namespace)).body; - return { - nodeName: rawData.spec.nodeName, - containerID: rawData.status.containerStatuses[0].containerID.split('//')[1] - }; - } - - async createAgentPod(podname: String, nodeName: String, containerID: String, namespace: String, ports: number[]): Promise { - const agentPod = createMirrordPodDefinition(podname, nodeName, containerID, ports); - await this.api.createNamespacedPod(namespace, agentPod); - } - - /* - Waits for a specific pod to be running. Returns false if pod is not running after timeout. - */ - async waitForPodReady(podName: String, namespace: String): Promise { - let attempts = 0; - while (attempts < 100) { //TODO: Must be a good way to do this - let status = await this.api.readNamespacedPodStatus(podName, namespace); - if (status.body.status.phase === "Running") { - return true; - } - attempts += 1; - await sleep(100); - } - return false; - } - - async deletePod(podName: string, namespace: String) { - await this.api.deleteNamespacedPod(podName, namespace); - } -} - -export enum MirrorEvent { - newConnection, - packetReceived, - connectionClosed -} - -export class Tunnel { - // Figure how to get type of net.Socket - connections: Map; - portsMap: { [port: number]: number }; - eventCallback?: (event: MirrorEvent, data?: any) => void; - - constructor(portsMap: { [port: number]: number }, - eventCallback?: (event: MirrorEvent, data: any) => void) { - this.connections = new Map(); - this.portsMap = portsMap; - this.eventCallback = eventCallback; - } - - close() { - for (let value of this.connections.values()) { - value.end(); - } - this.connections = new Map(); - } - async newDataCallback(data: Buffer) { - data.toString().split('\n').forEach(this.handleMessage.bind(this)); - } - - updateEvent(event: MirrorEvent, data?: any) { - if (this.eventCallback) { - this.eventCallback(event, data); - } - } - - async handleMessage(rawJson: string) { - if (!rawJson) { - return; - } - let parsed = JSON.parse(rawJson); - if (parsed['type'] === 'Error') { - console.error('Agent error' + parsed.content.msg); - return; - } - else if (parsed['type'] === 'Connected') { - let socket = new net.Socket(); - socket.connect(this.portsMap[parsed.content.port], '127.0.0.1'); - this.connections.set(parsed.content.connectionID, socket); - this.updateEvent(MirrorEvent.newConnection, parsed.content.port); - } - else if (parsed['type'] === 'Data') { - let socket = this.connections.get(parsed.content.connectionID); - socket.write(Buffer.from(parsed.content.data, 'base64')); - this.updateEvent(MirrorEvent.packetReceived); - } - else if (parsed['type'] === 'TCPEnded') { - let socket = this.connections.get(parsed.content.connectionID); - socket.end(); - this.connections.delete(parsed.content.connectionID); - this.updateEvent(MirrorEvent.connectionClosed); - } - } -} - -export class MirrorD { - k8sApi: K8SAPI; - nodeName: string; - containerID: string; - namespace: string; - ports: PortSpec[]; - agentPodName: string; - tunnel?: Tunnel; - logRequest?: any; - updateCallback?: (event: MirrorEvent, data: any) => void; - - - constructor(nodeName: string, containerID: string, ports: PortSpec[], namespace: string, - k8sApi?: K8SAPI, - updateCallback?: (event: MirrorEvent, data: any) => void) { - this.k8sApi = k8sApi || new K8SAPI(); - this.nodeName = nodeName; - this.containerID = containerID; - this.ports = ports; - this.namespace = namespace; - this.agentPodName = 'mirrord-' + shortid.generate().toLowerCase(); - this.updateCallback = updateCallback; - } - - - async start() { - await this.k8sApi.createAgentPod(this.agentPodName, this.nodeName, this.containerID, this.namespace, this.ports.map(p => p.remotePort)); - const ready = await this.k8sApi.waitForPodReady(this.agentPodName, this.namespace); - if (!ready) { - console.error("Pod isn't ready after timeout"); - return; - } - await this.tunnelTraffic(); - } - - async tunnelTraffic() { - let log = this.k8sApi.getLog(); - let logStream = new stream.PassThrough(); - this.tunnel = new Tunnel(Object.assign({}, ...this.ports.map(p => ({ [p.remotePort]: p.localPort }))), this.updateCallback); - logStream.on('data', this.tunnel.newDataCallback.bind(this.tunnel)); - this.logRequest = await log.log(this.namespace, this.agentPodName, '', logStream, (err: any) => { - if (err) { - console.log(err); - } - }, { follow: true, tailLines: 0, pretty: false, timestamps: false }); - } - - async stop() { - if (this.logRequest) { - try { - await this.logRequest.end(); - } - catch (err) { - console.error(err); - } - - } - if (this.tunnel) { - try { - await this.tunnel.close(); - } catch (err) { - console.error(err); - } - } - await this.k8sApi.deletePod(this.agentPodName, this.namespace); - } -} \ No newline at end of file diff --git a/core/tsconfig.json b/core/tsconfig.json deleted file mode 100644 index 7c6f3cb824b..00000000000 --- a/core/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - /* Language and Environment */ - "target": "es2020", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - - "module": "commonjs", /* Specify what module code is generated. */ - "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */ - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ - - /* Type Checking */ - "strict": true, /* Enable all strict type-checking options. */ - "outDir": "dist", - "sourceMap": true, - "declaration": true - }, - "include": [ - "src/**/*" - ] -} \ No newline at end of file diff --git a/mirrord-agent/CHANGELOG.md b/mirrord-agent/CHANGELOG.md new file mode 100644 index 00000000000..d3e11afedee --- /dev/null +++ b/mirrord-agent/CHANGELOG.md @@ -0,0 +1,28 @@ +## [Unreleased] +## 2.0.0-alpha-3 - 1/5/2022 +### Changed +* Change behavior of namespace change - set the namespace only in the packet sniffing, in a new thread so "command" socket will listen on the original network namespace +## 2.0.0-alpha-2 - 30/4/2022 +### Fixed +* Fixed obtaining namespace & setting it using container id (seems to be a bug in new containerd-client version?) +### Misc +* Add manual image build and push workflow +* Add docker image build sanity +## 2.0.0-alpha-1 - 28/4/2022 +### Misc +* Fix image build lacks cmake + +## 2.0.0-alpha - 27/4/2022 +### Refactor +* The code was refactored to support new upcoming features. +* The agent support multiple connections at once. +* Protocol is now binary for better performance (bincode). +* Changed the command line interface. +* Port and connections subscription is done when connecting. + +## 1.0.1 - 10/3/2022 +### Changed +* Update dependencies +* CI now builds from tag also. +## 1.0.0 - 21/02/2022 +Initial release \ No newline at end of file diff --git a/mirrord-agent/Cargo.lock b/mirrord-agent/Cargo.lock new file mode 100644 index 00000000000..2f8618bd9e0 --- /dev/null +++ b/mirrord-agent/Cargo.lock @@ -0,0 +1,1491 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "actix-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-sink", + "log", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util 0.7.1", +] + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "anyhow" +version = "1.0.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc" + +[[package]] +name = "async-stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e" +dependencies = [ + "async-stream-impl", + "futures-core", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-trait" +version = "0.1.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bincode" +version = "2.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f609ceb2c41b0d0277314a789ef0e7eb14593d5485f7c67320bed3924ebb1b33" +dependencies = [ + "bincode_derive", +] + +[[package]] +name = "bincode_derive" +version = "2.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913287a8f3e00db4c7ae1b87e9b9b8cebd6b89217eaadfc281fa5c897da35dc3" +dependencies = [ + "virtue", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clap" +version = "3.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "535434c063ced786eb04aaf529308092c5ab60889e8fe24275d15de07b01fa97" +dependencies = [ + "atty", + "bitflags", + "clap_derive", + "clap_lex", + "indexmap", + "lazy_static", + "strsim", + "termcolor", + "textwrap", +] + +[[package]] +name = "clap_derive" +version = "3.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1" +dependencies = [ + "heck 0.4.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "containerd-client" +version = "0.2.0" +source = "git+https://github.com/containerd/rust-extensions?rev=6bc49c007cf93869e7d83fca4818b6aae1145b45#6bc49c007cf93869e7d83fca4818b6aae1145b45" +dependencies = [ + "prost", + "prost-types", + "tokio", + "tonic", + "tonic-build", + "tower", +] + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "env_logger" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fastrand" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +dependencies = [ + "instant", +] + +[[package]] +name = "fixedbitset" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + +[[package]] +name = "futures-executor" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" + +[[package]] +name = "futures-macro" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "futures-task" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" + +[[package]] +name = "futures-util" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", +] + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "h2" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util 0.7.1", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "http" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "indexmap" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnetwork" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4088d739b183546b239688ddbc79891831df421773df95e236daf7867866d355" +dependencies = [ + "serde", +] + +[[package]] +name = "itertools" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.125" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" + +[[package]] +name = "libloading" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "lock_api" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mio" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "wasi 0.11.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "mirrord-agent" +version = "2.0.0-alpha-3" +dependencies = [ + "actix-codec", + "anyhow", + "clap", + "containerd-client", + "env_logger", + "futures", + "mirrord-protocol", + "nix", + "num-traits", + "pcap", + "pnet", + "serde", + "serde_json", + "test_bin", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "mirrord-protocol" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfe7bbae9865f066c1816d2389e299be202adc406979b3baba579bf157dc821" +dependencies = [ + "actix-codec", + "bincode", + "bytes", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "nix" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "ntapi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" +dependencies = [ + "winapi", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" + +[[package]] +name = "os_str_bytes" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" + +[[package]] +name = "parking_lot" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + +[[package]] +name = "pcap" +version = "0.9.2" +source = "git+https://github.com/aviramha/pcap.git?branch=make_codec_public#df1b99fdff9cb1b30d6a360f69ddd6c6791f1c37" +dependencies = [ + "errno", + "futures", + "libc", + "libloading", + "regex", + "tokio", + "winapi", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "petgraph" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pnet" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8750e073f82219c01e771133c64718d7685aef922da8a0d430a46aed05b6341a" +dependencies = [ + "ipnetwork", + "pnet_base", + "pnet_datalink", + "pnet_packet", + "pnet_sys", + "pnet_transport", +] + +[[package]] +name = "pnet_base" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8205fe084bd43a3af79b3155c19feddd62e733640498842e631a2ffe107d1538" + +[[package]] +name = "pnet_datalink" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f85aef5e52e22ff06b1b11f2eb6d52959a9e0ecad3cb3f5cc2d78cadc077f0e" +dependencies = [ + "ipnetwork", + "libc", + "pnet_base", + "pnet_sys", + "winapi", +] + +[[package]] +name = "pnet_macros" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98cc3af95fed6dc318dfede3e81320f96ad5e237c6f7c4688108b19c8e67432d" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn", +] + +[[package]] +name = "pnet_macros_support" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feaba58ba96abb218ec584d6caf0d3ff48922df05dbbeb1560553c197091b29e" +dependencies = [ + "pnet_base", +] + +[[package]] +name = "pnet_packet" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f246edaaf1aaf82072d4cd38ee18bcc5dfc0464093f9ca39e4ac5962d68cf9d4" +dependencies = [ + "glob", + "pnet_base", + "pnet_macros", + "pnet_macros_support", +] + +[[package]] +name = "pnet_sys" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028c87a5e3a48fc07df099a2025f2ef16add5993712e1494ba69a6707ee7ed06" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "pnet_transport" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950f2a7961e19d22e19e84ff0a6e0955013185fe149673499662633d02b41b7a" +dependencies = [ + "libc", + "pnet_base", + "pnet_packet", + "pnet_sys", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "prost" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5" +dependencies = [ + "bytes", + "heck 0.3.3", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prost", + "prost-types", + "regex", + "tempfile", + "which", +] + +[[package]] +name = "prost-derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "prost-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a" +dependencies = [ + "bytes", + "prost", +] + +[[package]] +name = "quote" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "serde" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f972498cf015f7c0746cac89ebe1d6ef10c293b94175a243a2d9442c163d9944" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" + +[[package]] +name = "smallvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" + +[[package]] +name = "socket2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "test_bin" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e7a7de15468c6e65dd7db81cf3822c1ec94c71b2a3c1a976ea8e4696c91115c" + +[[package]] +name = "textwrap" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" + +[[package]] +name = "tokio" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f48b6d60512a392e34dbf7fd456249fd2de3c83669ab642e021903f4015185b" +dependencies = [ + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "once_cell", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-stream" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tonic" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff08f4649d10a70ffa3522ca559031285d8e421d727ac85c60825761818f5d0a" +dependencies = [ + "async-stream", + "async-trait", + "base64", + "bytes", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "prost-derive", + "tokio", + "tokio-stream", + "tokio-util 0.6.9", + "tower", + "tower-layer", + "tower-service", + "tracing", + "tracing-futures", +] + +[[package]] +name = "tonic-build" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9403f1bafde247186684b230dc6f38b5cd514584e8bec1dd32514be4745fa757" +dependencies = [ + "proc-macro2", + "prost-build", + "quote", + "syn", +] + +[[package]] +name = "tower" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a89fd63ad6adf737582df5db40d286574513c69a11dac5214dc3b5603d6713e" +dependencies = [ + "futures-core", + "futures-util", + "indexmap", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util 0.7.1", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62" + +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + +[[package]] +name = "tracing" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + +[[package]] +name = "unicode-segmentation" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "virtue" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "757cfbfe0d17ee6f22fe97e536d463047d451b47cf9d11e2b7d1398b0ef274dd" + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "which" +version = "4.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae" +dependencies = [ + "either", + "lazy_static", + "libc", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" diff --git a/mirrord-agent/Cargo.toml b/mirrord-agent/Cargo.toml new file mode 100644 index 00000000000..3974c2352c4 --- /dev/null +++ b/mirrord-agent/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "mirrord-agent" +version = "2.0.0-alpha-3" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +containerd-client = {git = "https://github.com/containerd/rust-extensions", rev="6bc49c007cf93869e7d83fca4818b6aae1145b45"} +tokio = { version = "1", features = ["full"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +pcap = { git = "https://github.com/aviramha/pcap.git", branch="make_codec_public", features =["capture-stream"] } +pnet = "0.29.0" +nix = "0.23.1" +anyhow = "1" +clap = { version = "3.1.2", features = ["derive"] } +mirrord-protocol = { path = "../mirrord-protocol", version = "*"} +env_logger = "0.9" +actix-codec = "0.5" +futures = "0.3.21" +tracing = "0.1.32" +tokio-stream = "0.1.8" +num-traits = "0.2.14" + +[dev-dependencies] +test_bin = "0.4.0" \ No newline at end of file diff --git a/mirrord-agent/Dockerfile b/mirrord-agent/Dockerfile new file mode 100644 index 00000000000..d1502a6db7d --- /dev/null +++ b/mirrord-agent/Dockerfile @@ -0,0 +1,12 @@ +FROM rust:latest as build-env +RUN apt update && apt install -y libpcap-dev cmake +RUN rustup component add rustfmt +WORKDIR /app +COPY . /app +RUN cargo build --manifest-path mirrord-agent/Cargo.toml --release + +FROM debian:stable +RUN apt update && apt install -y libpcap-dev +COPY --from=build-env /app/target/release/mirrord-agent / + +CMD ["./mirrord-agent"] \ No newline at end of file diff --git a/cli/LICENSE b/mirrord-agent/LICENSE similarity index 100% rename from cli/LICENSE rename to mirrord-agent/LICENSE diff --git a/mirrord-agent/README.md b/mirrord-agent/README.md new file mode 100644 index 00000000000..38d329918bb --- /dev/null +++ b/mirrord-agent/README.md @@ -0,0 +1,21 @@ +# mirrord-agent +[![CI](https://github.com/metalbear-co/mirrord-agent/actions/workflows/ci.yaml/badge.svg)](https://github.com/metalbear-co/mirrord-agent/actions/workflows/ci.yaml) + +Agent part of [mirrord](https://github.com/metalbear-co/mirrord) responsible for running on the same node as the debugee, entering it's namespace and collecting traffic. + +mirrord-agent is written in Rust for safety, low memory consumption and performance. + +mirrord-agent is distributed as a container image (currently only x86) that is published on [GitHub Packages publicly](https://github.com/metalbear-co/mirrord-agent/pkgs/container/mirrord-agent). + +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Contributing +Anyone is welcome to contribute. Please feel free to create PRs with proper documentation, formatting and changelog record. + +## License + +mirrord-agent is MIT licensed. \ No newline at end of file diff --git a/mirrord-agent/src/cli.rs b/mirrord-agent/src/cli.rs new file mode 100644 index 00000000000..db8a0dbb584 --- /dev/null +++ b/mirrord-agent/src/cli.rs @@ -0,0 +1,25 @@ +use clap::Parser; + +#[derive(Parser, Debug)] +#[clap(author, version, about, long_about = None)] +pub struct Args { + /// Container id to get traffic from + #[clap(short, long)] + pub container_id: Option, + + /// Port to use for communication + #[clap(short = 'l', long, default_value_t = 61337)] + pub communicate_port: u16, + + /// Commuication timeout in seconds + #[clap(short = 't', long, default_value_t = 30)] + pub communication_timeout: u16, + + /// Interface to use + #[clap(short = 'i', long, default_value = "eth0")] + pub interface: String, +} + +pub fn parse_args() -> Args { + Args::parse() +} diff --git a/mirrord-agent/src/main.rs b/mirrord-agent/src/main.rs new file mode 100644 index 00000000000..9f9a3a174e2 --- /dev/null +++ b/mirrord-agent/src/main.rs @@ -0,0 +1,290 @@ +use std::{ + borrow::Borrow, + collections::HashSet, + hash::{Hash, Hasher}, + net::{Ipv4Addr, SocketAddrV4}, +}; + +use anyhow::Result; +use futures::SinkExt; +use mirrord_protocol::{ClientMessage, ConnectionID, DaemonCodec, DaemonMessage, Port}; +use tokio::{ + net::{TcpListener, TcpStream}, + select, + sync::mpsc::{self}, +}; +use tokio_stream::StreamExt; +use tracing::{debug, error, info}; + +mod cli; +mod runtime; +mod sniffer; +mod util; + +use cli::parse_args; +use sniffer::{packet_worker, SnifferCommand, SnifferOutput}; +use util::{IndexAllocator, Subscriptions}; + +type PeerID = u32; + +#[derive(Debug)] +struct Peer { + id: PeerID, + channel: mpsc::Sender, +} + +impl Peer { + pub fn new(id: PeerID, channel: mpsc::Sender) -> Peer { + Peer { id, channel } + } +} +impl Eq for Peer {} + +impl PartialEq for Peer { + fn eq(&self, other: &Peer) -> bool { + self.id == other.id + } +} + +impl Hash for Peer { + fn hash(&self, state: &mut H) { + self.id.hash(state); + } +} + +impl Borrow for Peer { + fn borrow(&self) -> &PeerID { + &self.id + } +} + +#[derive(Debug)] +struct State { + pub peers: HashSet, + index_allocator: IndexAllocator, + pub port_subscriptions: Subscriptions, + pub connections_subscriptions: Subscriptions, +} + +impl State { + pub fn new() -> State { + State { + peers: HashSet::new(), + index_allocator: IndexAllocator::new(), + port_subscriptions: Subscriptions::new(), + connections_subscriptions: Subscriptions::new(), + } + } + + pub fn generate_id(&mut self) -> Option { + self.index_allocator.next_index() + } + + pub fn remove_peer(&mut self, peer_id: PeerID) { + self.peers.remove(&peer_id); + self.port_subscriptions.remove_client(peer_id); + self.connections_subscriptions.remove_client(peer_id); + self.index_allocator.free_index(peer_id) + } +} + +#[derive(Debug)] +struct PeerMessage { + msg: ClientMessage, + peer_id: PeerID, +} + +async fn peer_handler( + mut rx: mpsc::Receiver, + tx: mpsc::Sender, + stream: TcpStream, + peer_id: PeerID, +) -> Result<()> { + let mut stream = actix_codec::Framed::new(stream, DaemonCodec::new()); + loop { + select! { + message = stream.next() => { + match message { + Some(message) => { + let message = PeerMessage { + msg: message?, + peer_id + }; + debug!("client sent message {:?}", &message); + tx.send(message).await?; + } + None => break + } + + }, + message = rx.recv() => { + match message { + Some(message) => { + debug!("send message to client {:?}", &message); + stream.send(message).await?; + } + None => break + } + + } + } + } + tx.send(PeerMessage { + msg: ClientMessage::Close, + peer_id, + }) + .await?; + Ok(()) +} + +async fn start() -> Result<()> { + let args = parse_args(); + debug!("mirrord-agent starting with args {:?}", args); + + let listener = TcpListener::bind(SocketAddrV4::new( + Ipv4Addr::new(0, 0, 0, 0), + args.communicate_port, + )) + .await?; + + let mut state = State::new(); + let (peers_tx, mut peers_rx) = mpsc::channel::(1000); + let (packet_sniffer_tx, mut packet_sniffer_rx) = mpsc::channel::(1000); + let (packet_command_tx, packet_command_rx) = mpsc::channel::(1000); + // We use tokio spawn so it'll create another thread. + let packet_task = tokio::spawn(packet_worker( + packet_sniffer_tx, + packet_command_rx, + args.interface.clone(), + args.container_id.clone(), + )); + loop { + select! { + Ok((stream, addr)) = listener.accept() => { + debug!("Connection accepeted from {:?}", addr); + if let Some(id) = state.generate_id() { + let (tx, rx) = mpsc::channel::(1000); + state.peers.insert(Peer::new(id, tx)); + let worker_tx = peers_tx.clone(); + tokio::spawn(async move { + match peer_handler(rx, worker_tx, stream, id).await { + Ok(()) => {debug!("Peer closed")}, + Err(err) => {error!("Peer encountered error {}", err.to_string());} + }; + }); + } + else { + error!("ran out of connections, dropping new connection"); + } + + }, + Some(message) = peers_rx.recv() => { + match message.msg { + ClientMessage::PortSubscribe(ports) => { + debug!("peer id {:?} asked to subscribe to {:?}", message.peer_id, ports); + state.port_subscriptions.subscribe_many(message.peer_id, ports); + let ports = state.port_subscriptions.get_subscribed_topics(); + packet_command_tx.send(SnifferCommand::SetPorts(ports)).await?; + } + ClientMessage::Close => { + debug!("peer id {:?} sent close", &message.peer_id); + state.remove_peer(message.peer_id); + let ports = state.port_subscriptions.get_subscribed_topics(); + packet_command_tx.send(SnifferCommand::SetPorts(ports)).await?; + }, + ClientMessage::ConnectionUnsubscribe(connection_id) => { + state.connections_subscriptions.unsubscribe(message.peer_id, connection_id); + } + + + } + }, + message = packet_sniffer_rx.recv() => { + match message { + Some(message) => { + match message { + SnifferOutput::NewTCPConnection(conn) => { + let peer_ids = state.port_subscriptions.get_topic_subscribers(conn.port); + for peer_id in peer_ids { + state.connections_subscriptions.subscribe(peer_id, conn.connection_id); + if let Some(peer) = state.peers.get(&peer_id) { + match peer.channel.send(DaemonMessage::NewTCPConnection(conn.clone())).await { + Ok(_) => {}, + Err(err) => { + error!("error sending message {:?}", err); + } + } + } + } + debug!("new tcp connection {:?}", conn); + }, + SnifferOutput::TCPClose(close) => { + let peer_ids = state.connections_subscriptions.get_topic_subscribers(close.connection_id); + for peer_id in peer_ids { + if let Some(peer) = state.peers.get(&peer_id) { + match peer.channel.send(DaemonMessage::TCPClose(close.clone())).await { + Ok(_) => {}, + Err(err) => { + error!("error sending message {:?}", err); + } + } + } + } + state.connections_subscriptions.remove_topic(close.connection_id); + debug!("tcp close {:?}", close); + }, + SnifferOutput::TCPData(data) => { + let peer_ids = state.connections_subscriptions.get_topic_subscribers(data.connection_id); + for peer_id in peer_ids { + if let Some(peer) = state.peers.get(&peer_id) { + match peer.channel.send(DaemonMessage::TCPData(data.clone())).await { + Ok(_) => {}, + Err(err) => { + error!("error sending message {:?}", err); + } + } + } + } + debug!("new data {:?}", data); + }, + } + } + None => { + info!("sniffer died, exiting"); + break; + } + } + + }, + _ = tokio::time::sleep(std::time::Duration::from_secs(args.communication_timeout.into())) => { + if state.peers.is_empty() { + debug!("main thread timeout, no peers connected"); + break; + } + } + } + } + debug!("shutting down start"); + if !packet_command_tx.is_closed() { + packet_command_tx.send(SnifferCommand::Close).await?; + }; + drop(packet_command_tx); + drop(packet_sniffer_rx); + tokio::time::timeout(std::time::Duration::from_secs(10), packet_task).await???; + + Ok(()) +} + +#[tokio::main] +async fn main() -> Result<()> { + env_logger::init(); + match start().await { + Ok(_) => { + info!("Exiting successfuly") + } + Err(err) => { + error!("error occured: {:?}", err.to_string()) + } + } + Ok(()) +} diff --git a/mirrord-agent/src/runtime.rs b/mirrord-agent/src/runtime.rs new file mode 100644 index 00000000000..14bb49d1949 --- /dev/null +++ b/mirrord-agent/src/runtime.rs @@ -0,0 +1,68 @@ +use std::{ + fs::File, + os::unix::io::{IntoRawFd, RawFd}, +}; + +use anyhow::{anyhow, Result}; +use containerd_client::{ + connect, + services::v1::{containers_client::ContainersClient, GetContainerRequest}, + tonic::Request, + with_namespace, +}; +use nix::sched::setns; +use serde::{Deserialize, Serialize}; + +const CONTAINERD_SOCK_PATH: &str = "/run/containerd/containerd.sock"; +const DEFAULT_CONTAINERD_NAMESPACE: &str = "k8s.io"; + +#[derive(Serialize, Deserialize, Debug)] +struct Namespace { + #[serde(rename = "type")] + ns_type: String, + path: Option, +} + +#[derive(Serialize, Deserialize, Debug)] +struct LinuxInfo { + namespaces: Vec, +} + +#[derive(Serialize, Deserialize, Debug)] +struct Spec { + linux: LinuxInfo, +} + +pub fn set_namespace(ns_path: &str) -> Result<()> { + let fd: RawFd = File::open(ns_path)?.into_raw_fd(); + setns(fd, nix::sched::CloneFlags::CLONE_NEWNET)?; + Ok(()) +} + +pub async fn get_container_namespace(container_id: String) -> Result { + let channel = connect(CONTAINERD_SOCK_PATH).await?; + let mut client = ContainersClient::new(channel); + let request = GetContainerRequest { id: container_id }; + let request = with_namespace!(request, DEFAULT_CONTAINERD_NAMESPACE); + let resp = client.get(request).await?; + let resp = resp.into_inner(); + let container = resp + .container + .ok_or_else(|| anyhow!("container not found"))?; + let spec: Spec = serde_json::from_slice( + &container + .spec + .ok_or_else(|| anyhow!("invalid data from containerd"))? + .value, + )?; + let ns_path = spec + .linux + .namespaces + .iter() + .find(|ns| ns.ns_type == "network") + .ok_or_else(|| anyhow!("network namespace not found"))? + .path + .as_ref() + .ok_or_else(|| anyhow!("no network namespace path"))?; + Ok(ns_path.to_owned()) +} diff --git a/mirrord-agent/src/sniffer.rs b/mirrord-agent/src/sniffer.rs new file mode 100644 index 00000000000..805a6707e51 --- /dev/null +++ b/mirrord-agent/src/sniffer.rs @@ -0,0 +1,296 @@ +use std::{ + collections::{HashMap, HashSet}, + hash::{Hash, Hasher}, + net::{IpAddr, Ipv4Addr}, +}; + +use anyhow::{anyhow, Result}; +use futures::StreamExt; +use mirrord_protocol::{NewTCPConnection, TCPClose, TCPData}; +use pcap::{stream::PacketCodec, Active, Capture, Device, Linktype}; +use pnet::packet::{ + ethernet::{EtherTypes, EthernetPacket}, + ip::IpNextHeaderProtocols, + ipv4::Ipv4Packet, + tcp::{TcpFlags, TcpPacket}, + Packet, +}; +use tokio::{ + select, + sync::mpsc::{Receiver, Sender}, +}; +use tracing::{debug, error}; + +use crate::{ + runtime::{get_container_namespace, set_namespace}, + util::IndexAllocator, +}; + +const DUMMY_BPF: &str = + "tcp dst port 1 and tcp src port 1 and dst host 8.1.2.3 and src host 8.1.2.3"; + +type ConnectionID = u16; + +#[derive(Debug)] +pub enum SnifferCommand { + SetPorts(Vec), + Close, +} + +#[derive(Debug)] +pub enum SnifferOutput { + NewTCPConnection(NewTCPConnection), + TCPClose(TCPClose), + TCPData(TCPData), +} + +#[derive(Debug, Eq, Copy, Clone)] +pub struct TCPSessionIdentifier { + source_addr: Ipv4Addr, + dest_addr: Ipv4Addr, + source_port: u16, + dest_port: u16, +} + +impl PartialEq for TCPSessionIdentifier { + /// It's the same session if 4 tuple is same/opposite. + fn eq(&self, other: &TCPSessionIdentifier) -> bool { + self.source_addr == other.source_addr + && self.dest_addr == other.dest_addr + && self.source_port == other.source_port + && self.dest_port == other.dest_port + || self.source_addr == other.dest_addr + && self.dest_addr == other.source_addr + && self.source_port == other.dest_port + && self.dest_port == other.source_port + } +} + +impl Hash for TCPSessionIdentifier { + fn hash(&self, state: &mut H) { + if self.source_addr > self.dest_addr { + self.source_addr.hash(state); + self.dest_addr.hash(state); + } else { + self.dest_addr.hash(state); + self.source_addr.hash(state); + } + if self.source_port > self.dest_port { + self.source_port.hash(state); + self.dest_port.hash(state); + } else { + self.dest_port.hash(state); + self.source_port.hash(state); + } + } +} + +type Session = ConnectionID; +type SessionMap = HashMap; + +fn is_new_connection(flags: u16) -> bool { + flags == TcpFlags::SYN +} + +fn is_closed_connection(flags: u16) -> bool { + 0 != (flags & (TcpFlags::FIN | TcpFlags::RST)) +} + +struct ConnectionManager { + sessions: SessionMap, + index_allocator: IndexAllocator, + ports: HashSet, +} + +/// Build a filter of format: "tcp port (80 or 443 or 50 or 90)" +fn format_bpf(ports: &[u16]) -> String { + format!( + "tcp port ({})", + ports + .iter() + .map(|p| p.to_string()) + .collect::>() + .join(" or ") + ) +} + +impl ConnectionManager { + fn new() -> Self { + ConnectionManager { + sessions: HashMap::new(), + index_allocator: IndexAllocator::new(), + ports: HashSet::new(), + } + } + + fn qualified_port(&self, port: u16) -> bool { + self.ports.contains(&port) + } + + fn set_ports(&mut self, ports: &[u16]) { + self.ports = HashSet::from_iter(ports.iter().cloned()) + } + + fn handle_packet(&mut self, eth_packet: &EthernetPacket) -> Option> { + let mut messages = vec![]; + let ip_packet = match eth_packet.get_ethertype() { + EtherTypes::Ipv4 => Ipv4Packet::new(eth_packet.payload())?, + _ => return None, + }; + let tcp_packet = match ip_packet.get_next_level_protocol() { + IpNextHeaderProtocols::Tcp => TcpPacket::new(ip_packet.payload())?, + _ => return None, + }; + let dest_port = tcp_packet.get_destination(); + let tcp_flags = tcp_packet.get_flags(); + let identifier = TCPSessionIdentifier { + source_addr: ip_packet.get_source(), + dest_addr: ip_packet.get_destination(), + source_port: tcp_packet.get_source(), + dest_port, + }; + let is_client_packet = self.qualified_port(dest_port); + let session = match self.sessions.remove(&identifier) { + Some(session) => session, + None => { + if !is_new_connection(tcp_flags) { + return None; + } + if !is_client_packet { + return None; + } + + let id = self.index_allocator.next_index().or_else(|| { + error!("connection index exhausted, dropping new connection"); + None + })?; + messages.push(SnifferOutput::NewTCPConnection(NewTCPConnection { + port: dest_port, + connection_id: id, + address: IpAddr::V4(identifier.source_addr), + })); + id + } + }; + if is_client_packet { + let data = tcp_packet.payload(); + if !data.is_empty() { + messages.push(SnifferOutput::TCPData(TCPData { + data: data.to_vec(), + connection_id: session, + })); + } + } + if is_closed_connection(tcp_flags) { + self.index_allocator.free_index(session); + messages.push(SnifferOutput::TCPClose(TCPClose { + connection_id: session, + })); + } else { + self.sessions.insert(identifier, session); + } + Some(messages) + } +} + +pub struct TCPManagerCodec {} + +impl PacketCodec for TCPManagerCodec { + type Type = Vec; + + fn decode(&mut self, packet: pcap::Packet) -> Result { + Ok(packet.data.to_vec()) + // let res = match EthernetPacket::new(packet.data) { + // Some(packet) => self + // .connection_manager + // .handle_packet(&packet) + // .unwrap_or(vec![]), + // _ => vec![], + // }; + // Ok(res) + } +} + +fn prepare_sniffer(interface: String) -> Result> { + let interface_names_match = |iface: &Device| iface.name == interface; + let interfaces = Device::list()?; + let interface = interfaces + .into_iter() + .find(interface_names_match) + .ok_or_else(|| anyhow!("Interface not found"))?; + + let mut cap = Capture::from_device(interface)? + .immediate_mode(true) + .open()?; + cap.set_datalink(Linktype::ETHERNET)?; + // Set a dummy filter that shouldn't capture anything. This makes the code easier. + cap.filter(DUMMY_BPF, true)?; + cap = cap.setnonblock()?; + Ok(cap) +} + +pub async fn packet_worker( + tx: Sender, + mut rx: Receiver, + interface: String, + container_id: Option, +) -> Result<()> { + debug!("setting namespace"); + if let Some(container_id) = container_id { + let namespace = get_container_namespace(container_id).await?; + debug!("Found namespace to attach to {:?}", &namespace); + set_namespace(&namespace)?; + } + debug!("preparing sniffer"); + let sniffer = prepare_sniffer(interface)?; + debug!("done prepare sniffer"); + let codec = TCPManagerCodec {}; + let mut connection_manager = ConnectionManager::new(); + let mut stream = sniffer.stream(codec)?; + loop { + select! { + Some(Ok(packet)) = stream.next() => { + let messages = match EthernetPacket::new(&packet) { + Some(packet) => + connection_manager + .handle_packet(&packet) + .unwrap_or_default(), + _ => vec![], + }; + for message in messages.into_iter() { + tx.send(message).await?; + } + + }, + message = rx.recv() => { + match message { + Some(SnifferCommand::SetPorts(ports)) => { + debug!("setting ports {:?}", &ports); + connection_manager.set_ports(&ports); + let sniffer = stream.inner_mut(); + if ports.is_empty() { + debug!("empty ports, setting dummy bpf"); + sniffer.filter(DUMMY_BPF, true)? + } else { + let bpf = format_bpf(&ports); + debug!("setting bpf to {:?}", &bpf); + sniffer.filter(&bpf, true)? + }; + + }, + Some(SnifferCommand::Close) | None => { + debug!("sniffer closed"); + break; + } + } + }, + _ = tx.closed() => { + debug!("closing due to tx closed"); + break; + }, + + } + } + debug!("end of packet_worker"); + Ok(()) +} diff --git a/mirrord-agent/src/util.rs b/mirrord-agent/src/util.rs new file mode 100644 index 00000000000..70caa065b10 --- /dev/null +++ b/mirrord-agent/src/util.rs @@ -0,0 +1,192 @@ +use std::{ + clone::Clone, + collections::{HashMap, HashSet}, + hash::Hash, +}; + +use num_traits::{zero, CheckedAdd, Num}; + +/// Struct that helps you manage topic -> subscribers +/// When a topip has no subscribers, it is removed. +#[derive(Debug)] +pub struct Subscriptions { + _inner: HashMap>, +} + +impl Subscriptions +where + T: Eq + Hash + Clone + Copy, + C: Eq + Hash + Clone + Copy, +{ + pub fn new() -> Subscriptions { + Subscriptions { + _inner: HashMap::new(), + } + } + + /// Add a new subscription to a topic for a given client. + pub fn subscribe(&mut self, client: C, topic: T) { + self._inner + .entry(topic) + .or_insert_with(HashSet::new) + .insert(client); + } + + /// Subscribe many topics at once + pub fn subscribe_many(&mut self, client: C, topics: impl IntoIterator) { + for topic in topics { + self.subscribe(client, topic); + } + } + + /// Remove a subscription of given client from the topic. + /// topic is removed if no subscribers left. + pub fn unsubscribe(&mut self, client: C, topic: T) { + if let Some(set) = self._inner.get_mut(&topic) { + set.remove(&client); + if set.is_empty() { + self._inner.remove(&topic); + } + } + } + + /// Get a vector of clients subscribed to a specific topic + pub fn get_topic_subscribers(&self, topic: T) -> Vec { + match self._inner.get(&topic) { + Some(clients_set) => clients_set.iter().cloned().collect(), + None => Vec::new(), + } + } + + /// Get subscribed topics + pub fn get_subscribed_topics(&self) -> Vec { + self._inner.keys().cloned().collect() + } + + /// Get topics subscribed by a client + pub fn get_client_topics(&self, client: C) -> Vec { + let mut result = Vec::new(); + for (topic, client_set) in self._inner.iter() { + if client_set.contains(&client) { + result.push(*topic) + } + } + result + } + + /// Remove all subscriptions of a client + pub fn remove_client(&mut self, client: C) { + let topics = self.get_client_topics(client); + for topic in topics { + self.unsubscribe(client, topic) + } + } + + /// Removes a topic and all of it's clients + pub fn remove_topic(&mut self, topic: T) { + self._inner.remove(&topic); + } +} + +#[derive(Debug)] +pub struct IndexAllocator +where + T: Num, +{ + index: T, + vacant_indices: Vec, +} + +impl IndexAllocator +where + T: Num + CheckedAdd + Clone, +{ + pub fn new() -> IndexAllocator { + IndexAllocator { + index: zero(), + vacant_indices: Vec::new(), + } + } + + /// Returns the next available index, returns None if not available (reached max) + pub fn next_index(&mut self) -> Option { + if let Some(i) = self.vacant_indices.pop() { + return Some(i); + } + match self.index.checked_add(&T::one()) { + Some(new_index) => { + let res = self.index.clone(); + self.index = new_index; + Some(res) + } + None => None, + } + } + + pub fn free_index(&mut self, index: T) { + self.vacant_indices.push(index) + } +} + +#[cfg(test)] +mod subscription_tests { + use super::Subscriptions; + use crate::Port; + + #[test] + fn sanity() { + let mut subscriptions = Subscriptions::::new(); + subscriptions.subscribe_many(3, vec![3, 2]); + subscriptions.subscribe(3, 1); + subscriptions.subscribe(1, 4); + subscriptions.subscribe(2, 1); + subscriptions.subscribe(2, 1); + subscriptions.subscribe(3, 1); + let mut subscribers = subscriptions.get_topic_subscribers(1); + subscribers.sort(); + assert_eq!(subscribers, vec![2, 3]); + + assert_eq!(subscriptions.get_topic_subscribers(4), vec![1]); + assert_eq!(subscriptions.get_topic_subscribers(10), Vec::::new()); + let mut topics = subscriptions.get_subscribed_topics(); + topics.sort(); + assert_eq!(topics, vec![1, 2, 3, 4]); + topics = subscriptions.get_client_topics(3); + topics.sort(); + assert_eq!(topics, vec![1, 2, 3]); + subscriptions.unsubscribe(3, 1); + assert_eq!(subscriptions.get_topic_subscribers(1), vec![2]); + subscriptions.unsubscribe(1, 4); + assert_eq!(subscriptions.get_topic_subscribers(4), Vec::::new()); + subscriptions.remove_client(3); + assert_eq!(subscriptions.get_client_topics(3), Vec::::new()); + subscriptions.remove_topic(1); + assert_eq!(subscriptions.get_subscribed_topics(), Vec::::new()); + } +} + +#[cfg(test)] +mod indexallocator_tests { + use super::IndexAllocator; + + #[test] + fn sanity() { + let mut index_allocator = IndexAllocator::::new(); + let index = index_allocator.next_index().unwrap(); + assert_eq!(0, index); + let index = index_allocator.next_index().unwrap(); + assert_eq!(1, index); + index_allocator.free_index(0); + let index = index_allocator.next_index().unwrap(); + assert_eq!(0, index); + } + + #[test] + fn check_max() { + let mut index_allocator = IndexAllocator::::new(); + for _ in 0..=u8::MAX - 1 { + index_allocator.next_index().unwrap(); + } + assert!(index_allocator.next_index().is_none()); + } +} diff --git a/mirrord-agent/tests/blackbox.rs b/mirrord-agent/tests/blackbox.rs new file mode 100644 index 00000000000..bd7c63eaf3a --- /dev/null +++ b/mirrord-agent/tests/blackbox.rs @@ -0,0 +1,132 @@ +#[cfg(test)] +mod tests { + use std::{io::ErrorKind, net::IpAddr, process::Stdio, sync::Arc}; + + use actix_codec::Framed; + use futures::SinkExt; + use mirrord_protocol::{ + ClientCodec, ClientMessage, DaemonMessage, NewTCPConnection, TCPClose, TCPData, + }; + use test_bin::get_test_bin; + use tokio::{ + io::AsyncWriteExt, + net::{TcpListener, TcpStream}, + select, + sync::Mutex, + time::{sleep, Duration}, + }; + use tokio_stream::StreamExt; + + #[tokio::test] + async fn sanity() { + let mut bin = get_test_bin("mirrord-agent"); + let child = bin + .arg("-t") + .arg("2") + .arg("-i") + .arg("lo") + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .expect("mirrord-agent failed to start"); + // Wait for agent to listen + sleep(Duration::from_millis(2000)).await; + let stream = TcpStream::connect("127.0.0.1:61337") + .await + .expect("connection to agent failed"); + let mutex = Arc::new(Mutex::new(0)); + let task_mutex = Arc::clone(&mutex); + let guard = mutex.lock().await; + let task = tokio::spawn(async move { + let listener = TcpListener::bind("127.0.0.1:1337") + .await + .expect("couldn't bind socket"); + loop { + select! { + Ok((socket, _)) = listener.accept() => { + let mut buf = [0; 4096]; + loop { + match socket.try_read(&mut buf) { + Ok(0) => break, + Ok(_) => {} + Err(ref e) if e.kind() == ErrorKind::WouldBlock => { + sleep(Duration::from_millis(10)).await; + } + Err(e) => panic!("socket error {:?}", e) + } + } + }, + _ = task_mutex.lock() => { + break + } + } + } + }); + + let mut codec = Framed::new(stream, ClientCodec::new()); + + codec + .send(ClientMessage::PortSubscribe(vec![1337, 1338])) + .await + .expect("port subscribe failed"); + // Let message be acknowledged and dummy socket to start listening + sleep(Duration::from_millis(2000)).await; + let mut test_conn = TcpStream::connect("127.0.0.1:1337") + .await + .expect("connection to dummy failed"); + let test_data = [0, 3, 5]; + test_conn + .write(&test_data) + .await + .expect("couldn't write test data"); + drop(test_conn); + let new_conn_msg = codec + .next() + .await + .expect("couldn't get next message") + .expect("got invalid message"); + let data_msg = codec + .next() + .await + .expect("couldn't get next message") + .expect("got invalid message"); + let close_msg = codec + .next() + .await + .expect("couldn't get next message") + .expect("got invalid message"); + assert_eq!( + new_conn_msg, + DaemonMessage::NewTCPConnection(NewTCPConnection { + connection_id: 0, + address: IpAddr::V4("127.0.0.1".parse().unwrap()), + port: 1337 + }) + ); + + assert_eq!( + data_msg, + DaemonMessage::TCPData(TCPData { + connection_id: 0, + data: test_data.to_vec() + }) + ); + + assert_eq!( + close_msg, + DaemonMessage::TCPClose(TCPClose { connection_id: 0 }) + ); + drop(codec); + drop(guard); + drop(mutex); + task.await.unwrap(); + let result = child.wait_with_output().unwrap(); + assert!(result.status.success()); + let stderr = String::from_utf8_lossy(&result.stderr); + print!("{:?}", stderr); + assert!(!stderr.to_ascii_lowercase().contains("error")); + assert!(!String::from_utf8_lossy(&result.stdout) + .to_ascii_lowercase() + .contains("error")); + } +} diff --git a/mirrord-layer/Cargo.lock b/mirrord-layer/Cargo.lock new file mode 100644 index 00000000000..7e7e8c74973 --- /dev/null +++ b/mirrord-layer/Cargo.lock @@ -0,0 +1,2682 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "actix-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-sink", + "log", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "getrandom", + "instant", + "rand 0.8.5", +] + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bincode" +version = "2.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f609ceb2c41b0d0277314a789ef0e7eb14593d5485f7c67320bed3924ebb1b33" +dependencies = [ + "bincode_derive", +] + +[[package]] +name = "bincode_derive" +version = "2.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913287a8f3e00db4c7ae1b87e9b9b8cebd6b89217eaadfc281fa5c897da35dc3" +dependencies = [ + "virtue", +] + +[[package]] +name = "bindgen" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd4865004a46a0aafb2a0a5eb19d3c9fc46ee5f063a6cfc605c69ac9ecf5263d" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "clap 2.34.0", + "env_logger 0.8.4", + "lazy_static", + "lazycell", + "log", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "which", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block-buffer" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "capstone" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b5d1f14c3539b6ff22fcb602fea5f1c4416148c8b7965a2e74860aa169b7b5" +dependencies = [ + "capstone-sys", + "libc", +] + +[[package]] +name = "capstone-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df653a22d0ad34b0d91cc92a6289d96e44aac1c9a96250a094c9aeec4a91084f" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cexpr" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "serde", + "winapi", +] + +[[package]] +name = "clang-sys" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cc00842eed744b858222c4c9faf7243aafc6d33f92f96935263ef4d8a41ce21" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim 0.8.0", + "textwrap 0.11.0", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clap" +version = "3.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c167e37342afc5f33fd87bbc870cedd020d2a6dffa05d45ccd9241fbdd146db" +dependencies = [ + "atty", + "bitflags", + "clap_derive", + "clap_lex", + "indexmap", + "lazy_static", + "strsim 0.10.0", + "termcolor", + "textwrap 0.15.0", +] + +[[package]] +name = "clap_derive" +version = "3.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189ddd3b5d32a70b35e7686054371742a937b0d99128e76dde6340210e966669" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "cpufeatures" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctor" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dyn-clone" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e50f3adc76d6a43f5ed73b698a87d0760ca74617f60f7c3b879003536fdd28" + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "encoding_rs" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "env_logger" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "env_logger" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fastrand" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +dependencies = [ + "instant", +] + +[[package]] +name = "filetime" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "winapi", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "frida-build" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c4d5d5eedcceaae76eae494338aee0b8fceab952934568287b834d555e01a0a" +dependencies = [ + "reqwest", + "tar", + "xz", +] + +[[package]] +name = "frida-gum" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e2d59d3b7986689332e52cee912200c79ed7db1ab5085b0f109987f3c239e8" +dependencies = [ + "capstone", + "capstone-sys", + "frida-gum-sys", + "num", + "num-derive", + "num-traits", + "paste", + "thiserror", +] + +[[package]] +name = "frida-gum-sys" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1783513909bdc7b7699b8bac67c92c835ab78d3c86fde514f161eb5b88264a66" +dependencies = [ + "bindgen", + "frida-build", +] + +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + +[[package]] +name = "futures" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + +[[package]] +name = "futures-executor" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" + +[[package]] +name = "futures-macro" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "futures-task" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" + +[[package]] +name = "futures-util" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", +] + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "h2" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "http" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "http-range-header" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" + +[[package]] +name = "httparse" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6330e8a36bd8c859f3fa6d9382911fbb7147ec39807f63b923933a247240b9ba" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-openssl" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ee5d7a8f718585d1c3c61dfde28ef5b0bb14734b4db13f5ada856cdc6c612b" +dependencies = [ + "http", + "hyper", + "linked_hash_set", + "once_cell", + "openssl", + "openssl-sys", + "parking_lot", + "tokio", + "tokio-openssl", + "tower-layer", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-extras" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c90f9c8f5bda269ce32e960d433de3fc932ab8f347500e866da45ec70f67e0d2" +dependencies = [ + "io-lifetimes", + "winapi", +] + +[[package]] +name = "io-lifetimes" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9448015e586b611e5d322f6703812bbca2f1e709d5773ecd38ddb4e3bb649504" + +[[package]] +name = "ipnet" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" + +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "js-sys" +version = "0.3.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f995a3c8f2bc3dd52a18a583e90f9ec109c047fa1603a853e46bcda14d2e279d" +dependencies = [ + "serde", + "serde_json", + "treediff", +] + +[[package]] +name = "jsonpath_lib" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaa63191d68230cccb81c5aa23abd53ed64d83337cacbb25a7b8c7979523774f" +dependencies = [ + "log", + "serde", + "serde_json", +] + +[[package]] +name = "k8s-openapi" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0489fc937cc7616a9abfa61bf39c250d7e32e1325ef028c8d9278dd24ea395b3" +dependencies = [ + "base64", + "bytes", + "chrono", + "http", + "percent-encoding", + "serde", + "serde-value", + "serde_json", + "url", +] + +[[package]] +name = "kube" +version = "0.71.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "342744dfeb81fe186b84f485b33f12c6a15d3396987d933b06a566a3db52ca38" +dependencies = [ + "k8s-openapi", + "kube-client", + "kube-core", + "kube-derive", + "kube-runtime", +] + +[[package]] +name = "kube-client" +version = "0.71.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f69a504997799340408635d6e351afb8aab2c34ca3165e162f41b3b34a69a79" +dependencies = [ + "base64", + "bytes", + "chrono", + "dirs-next", + "either", + "futures", + "http", + "http-body", + "hyper", + "hyper-openssl", + "hyper-timeout", + "jsonpath_lib", + "k8s-openapi", + "kube-core", + "openssl", + "pem", + "pin-project", + "rand 0.8.5", + "secrecy", + "serde", + "serde_json", + "serde_yaml", + "thiserror", + "tokio", + "tokio-tungstenite", + "tokio-util", + "tower", + "tower-http", + "tracing", +] + +[[package]] +name = "kube-core" +version = "0.71.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a247487699941baaf93438d65b12d4e32450bea849d619d19ed394e8a4a645" +dependencies = [ + "chrono", + "form_urlencoded", + "http", + "json-patch", + "k8s-openapi", + "once_cell", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "kube-derive" +version = "0.71.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "203f7c5acf9d0dfb0b08d44ec1d66ace3d1dfe0cdd82e65e274f3f96615d666c" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "serde_json", + "syn", +] + +[[package]] +name = "kube-runtime" +version = "0.71.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02ea50e6ed56578e1d1d02548901b12fe6d3edbf110269a396955e285d487973" +dependencies = [ + "ahash", + "backoff", + "derivative", + "futures", + "json-patch", + "k8s-openapi", + "kube-client", + "parking_lot", + "pin-project", + "serde", + "serde_json", + "smallvec", + "thiserror", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.124" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a41fed9d98f27ab1c6d161da622a4fa35e8a54a8adc24bbf3ddd0ef70b0e50" + +[[package]] +name = "libloading" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" + +[[package]] +name = "linked_hash_set" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47186c6da4d81ca383c7c47c1bfc80f4b95f4720514d860a5407aaf4233f9588" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "linux-raw-sys" +version = "0.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5284f00d480e1c39af34e72f8ad60b94f47007e3481cd3b731c1d67190ddc7b7" + +[[package]] +name = "lock_api" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "lzma-sys" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb4b7c3eddad11d3af9e86c487607d2d2442d185d848575365c4856ba96d619" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "mio" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "wasi 0.11.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "mirrord-layer" +version = "0.1.0" +dependencies = [ + "actix-codec", + "bytes", + "clap 3.1.12", + "ctor", + "env_logger 0.9.0", + "frida-gum", + "futures", + "k8s-openapi", + "kube", + "lazy_static", + "libc", + "mirrord-protocol", + "multi-map", + "nanoid", + "nix", + "os_socketaddr", + "queues", + "rand 0.8.5", + "redhook", + "serde_json", + "socketpair", + "tempdir", + "tokio", + "tokio-stream", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "mirrord-protocol" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfe7bbae9865f066c1816d2389e299be202adc406979b3baba579bf157dc821" +dependencies = [ + "actix-codec", + "bincode", + "bytes", +] + +[[package]] +name = "multi-map" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bba551d6d795f74a01767577ea8339560bf0a65354e0417b7e915ed608443d46" + +[[package]] +name = "nanoid" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "native-tls" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nix" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f866317acbd3a240710c63f065ffb1e4fd466259045ccb504130b7f668f35c6" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "nom" +version = "5.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" +dependencies = [ + "memchr", + "version_check", +] + +[[package]] +name = "ntapi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" +dependencies = [ + "winapi", +] + +[[package]] +name = "num" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" + +[[package]] +name = "openssl" +version = "0.10.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-sys", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "ordered-float" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" +dependencies = [ + "num-traits", +] + +[[package]] +name = "os_socketaddr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ff86dee67903f9ffcc3f09712b934761ace77cd34021848a474e7ed7199bd2" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "os_str_bytes" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" + +[[package]] +name = "parking_lot" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "995f667a6c822200b0433ac218e05582f0e2efa1b922a3fd2fbaadc5f87bab37" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + +[[package]] +name = "paste" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" + +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + +[[package]] +name = "pem" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9a3b09a20e374558580a4914d3b7d89bd61b954a5a5e1dcbea98753addb1947" +dependencies = [ + "base64", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pin-project" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "queues" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1475abae4f8ad4998590fe3acfe20104f0a5d48fc420c817cd2c09c3f56151f0" + +[[package]] +name = "quote" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +dependencies = [ + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "rdrand", + "winapi", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.3", +] + +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +dependencies = [ + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "redhook" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6e109b8469dbbe6d7cbe18e5ebd65d4a134e2f4b91304ad9213984cad1d70a6" +dependencies = [ + "libc", +] + +[[package]] +name = "redox_syscall" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "reqwest" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.34.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f5d1c6ed6d1c6915aa64749b809fc1bafff49d160f5d927463658093d7d62ab" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "winapi", +] + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "schannel" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +dependencies = [ + "lazy_static", + "winapi", +] + +[[package]] +name = "schemars" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6b5a3c80cea1ab61f4260238409510e814e38b4b563c06044edf91e7dc070e3" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ae4dce13e8614c46ac3c38ef1c0d668b101df6ac39817aebdaa26642ddae9b" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "serde", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_derive_internals" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_yaml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0" +dependencies = [ + "indexmap", + "ryu", + "serde", + "yaml-rust", +] + +[[package]] +name = "sha-1" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" + +[[package]] +name = "smallvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" + +[[package]] +name = "socket2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socketpair" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4a66c5734072f44d758e9dbd4f1f0f041687c782535ce7a5428228c752b1a4" +dependencies = [ + "io-extras", + "io-lifetimes", + "rustix", + "uuid", + "winapi", +] + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tar" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tempdir" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" +dependencies = [ + "rand 0.4.6", + "remove_dir_all", +] + +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "textwrap" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" + +[[package]] +name = "thiserror" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +dependencies = [ + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "once_cell", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-openssl" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08f9ffb7809f1b20c1b398d92acf4cc719874b3b2b2d9ea2f09b4a80350878a" +dependencies = [ + "futures-util", + "openssl", + "openssl-sys", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06cda1232a49558c46f8a504d5b93101d42c0bf7f911f12a105ba48168f821ae" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "slab", + "tokio", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a89fd63ad6adf737582df5db40d286574513c69a11dac5214dc3b5603d6713e" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8" +dependencies = [ + "base64", + "bitflags", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-range-header", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62" + +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + +[[package]] +name = "tracing" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" +dependencies = [ + "lazy_static", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596" +dependencies = [ + "ansi_term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "treediff" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761e8d5ad7ce14bb82b7e61ccc0ca961005a275a060b9644a2431aa11553c2ff" +dependencies = [ + "serde_json", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + +[[package]] +name = "tungstenite" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96a2dea40e7570482f28eb57afbe42d97551905da6a9400acc5c328d24004f5" +dependencies = [ + "base64", + "byteorder", + "bytes", + "http", + "httparse", + "log", + "rand 0.8.5", + "sha-1", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "unicode-bidi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "virtue" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "757cfbfe0d17ee6f22fe97e536d463047d451b47cf9d11e2b7d1398b0ef274dd" + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" + +[[package]] +name = "web-sys" +version = "0.3.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "which" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724" +dependencies = [ + "libc", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5acdd78cb4ba54c0045ac14f62d8f94a03d10047904ae2a40afa1e99d8f70825" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" + +[[package]] +name = "windows_i686_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" + +[[package]] +name = "windows_i686_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" + +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + +[[package]] +name = "xattr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" +dependencies = [ + "libc", +] + +[[package]] +name = "xz" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c887690ff2a2e233e8e49633461521f98ec57fbff9d59a884c9a4f04ec1da34" +dependencies = [ + "xz2", +] + +[[package]] +name = "xz2" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c179869f34fc7c01830d3ce7ea2086bc3a07e0d35289b667d0a8bf910258926c" +dependencies = [ + "lzma-sys", +] + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "zeroize" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb5728b8afd3f280a869ce1d4c554ffaed35f45c231fc41bfbd0381bef50317" diff --git a/mirrord-layer/Cargo.toml b/mirrord-layer/Cargo.toml new file mode 100644 index 00000000000..16e95080134 --- /dev/null +++ b/mirrord-layer/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "mirrord-layer" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +ctor = "0.1.22" +lazy_static = "1.4.0" +libc = "0.2.121" +nix = "0.23.1" +os_socketaddr = "0.2.0" +redhook = "2.0.0" +socketpair = "0.15.0" +tempdir = "0.3.7" +tracing = "0.1" +env_logger = "0.9" +tracing-subscriber = "0.3" +frida-gum = {version = "0.6.5", features = ["auto-download"]} +futures = "0.3.21" +clap = { version = "3.1.12", features = ["derive"] } +k8s-openapi = { version = "0.14.0", features = ["v1_22"] } +kube = { version = "0.71.0", features = ["runtime", "derive", "client", "ws"] } + +tokio = { version = "1", features = ["full"] } +serde_json = "1.0.79" +nanoid = "0.4.0" +mirrord-protocol = { path = "../mirrord-protocol", version = "*"} +actix-codec = "0.5.0" +bytes = "1.1.0" +tokio-stream = "0.1.8" +queues = "1.1.0" +rand = "0.8.5" +multi-map = "1.3.0" + +[lib] +name = "mirrord" +crate_type = ["dylib"] diff --git a/core/LICENSE b/mirrord-layer/LICENSE similarity index 100% rename from core/LICENSE rename to mirrord-layer/LICENSE diff --git a/mirrord-layer/README.md b/mirrord-layer/README.md new file mode 100644 index 00000000000..be9f3de097a --- /dev/null +++ b/mirrord-layer/README.md @@ -0,0 +1,19 @@ +# mirrord-layer + +This part of [mirrord](https://github.com/metalbear-co/mirrord) is preloaded into a process and hooks libc functions, making them work with [mirrord-agent](https://github.com/metalbear-co/mirrord-agent) rather than locally. + +To preload mirrord-layer into a process: +* On Linux, run `LD_PRELOAD=/mirrord-layer.so ` +* On macOS, run `DYLD_INSERT_LIBRARIES=/mirrord-layer.dylib ` + +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Contributing +Anyone is welcome to contribute. Please feel free to create PRs with proper documentation, formatting and changelog record. + +## License +mirrord-layer is MIT licensed. \ No newline at end of file diff --git a/mirrord-layer/src/lib.rs b/mirrord-layer/src/lib.rs new file mode 100644 index 00000000000..427e2cbde36 --- /dev/null +++ b/mirrord-layer/src/lib.rs @@ -0,0 +1,420 @@ +#![feature(c_variadic)] + +use std::{ + collections::HashMap, + io::{Read, Write}, + net::{IpAddr, Ipv4Addr, SocketAddr}, + os::unix::io::AsRawFd, + sync::Mutex, + thread, + time::Duration, +}; + +use ctor::ctor; +use frida_gum::{interceptor::Interceptor, Gum, Module, NativePointer}; +use futures::{SinkExt, StreamExt}; +use k8s_openapi::api::core::v1::Pod; +use kube::{ + api::{Api, Portforwarder, PostParams}, + runtime::wait::{await_condition, conditions::is_pod_running}, + Client, +}; +use lazy_static::lazy_static; +use libc::{c_char, c_void, sockaddr, socklen_t}; +use mirrord_protocol::{ClientCodec, ClientMessage, DaemonMessage}; +use multi_map::MultiMap; +use os_socketaddr::OsSocketAddr; +use queues::{IsQueue, Queue}; +use rand::distributions::{Alphanumeric, DistString}; +use serde_json::json; +use socketpair::{socketpair_stream, SocketpairStream}; +use tokio::{ + runtime::Runtime, + select, + sync::mpsc::{channel, Receiver, Sender}, +}; +use tracing::{debug, error}; + +struct ConnectionSocket { + read_fd: i32, + read_socket: SocketpairStream, + real_read_socket_fd: i32, + write_socket: SocketpairStream, + port: u16, +} + +struct DataSocket { + connection_id: u16, + #[allow(dead_code)] + read_socket: SocketpairStream, // Though this is unread, it's necessary to keep the socket open + write_socket: SocketpairStream, +} + +lazy_static! { + static ref GUM: Gum = unsafe { Gum::obtain() }; + static ref RUNTIME: Runtime = Runtime::new().unwrap(); + static ref CONNECTION_SOCKETS: Mutex> = + Mutex::new(MultiMap::new()); + static ref DATA_SOCKETS_BY_CONNECTION_ID: Mutex> = Mutex::new(HashMap::new()); + static ref CONNECTION_QUEUE: Mutex> = Mutex::new(Queue::new()); + static ref SENDER: Mutex>> = Mutex::new(None); // TODO: Check OnceCell + static ref PENDING_DATA: Mutex>> = Mutex::new(HashMap::new()); +} + +unsafe extern "C" fn socket_detour(domain: i32, socket_type: i32, protocol: i32) -> i32 { + debug!("socket called"); + let (write_socket, read_socket) = socketpair_stream().unwrap(); + let read_fd = read_socket.as_raw_fd(); + let socket = ConnectionSocket { + read_fd, + read_socket, + real_read_socket_fd: libc::socket(domain, socket_type, protocol), + write_socket, + port: 0, + }; + + CONNECTION_SOCKETS + .lock() + .unwrap() + .insert(read_fd, 0, socket); + + read_fd +} + +unsafe extern "C" fn bind_detour(sockfd: i32, addr: *const sockaddr, addrlen: socklen_t) -> i32 { + debug!("bind called"); + let parsed_addr = OsSocketAddr::from_raw_parts(addr as *const u8, addrlen as usize) + .into_addr() + .unwrap(); + let port = parsed_addr.port(); + + let mut sockets = CONNECTION_SOCKETS.lock().unwrap(); + if let Some(mut socket) = sockets.remove(&sockfd) { + socket.port = port; + sockets.insert(sockfd, port, socket); + + 0 + } else { + error!("No socket found for fd: {}", sockfd); + -1 + } +} + +unsafe extern "C" fn connect_detour(sockfd: i32, addr: *const sockaddr, addrlen: socklen_t) -> i32 { + // Map port to fd + debug!("Called connect"); + let real_fd = match CONNECTION_SOCKETS.lock().unwrap().get(&sockfd) { + Some(s) => s.real_read_socket_fd, + None => { + println!("No socket found for fd: {}", sockfd); + return -1; + } + }; + + libc::connect(real_fd, addr, addrlen) +} + +unsafe extern "C" fn listen_detour(sockfd: i32, _backlog: i32) -> i32 { + debug!("listen called"); + + let mut sockets = CONNECTION_SOCKETS.lock().unwrap(); + + if let Some(socket) = sockets.remove(&sockfd) { + let lock = SENDER.lock().unwrap(); + let send = lock.as_ref(); + send.unwrap().blocking_send(socket.port).unwrap(); + sockets.insert(sockfd, socket.port, socket); + 0 + } else { + error!("No socket found for fd: {}", sockfd); + -1 + } +} + +unsafe extern "C" fn getpeername_detour( + _sockfd: i32, + addr: *mut sockaddr, + addrlen: *mut socklen_t, +) -> i32 { + let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080); + let os_addr: OsSocketAddr = socket_addr.into(); + let len = std::cmp::min(*addrlen as usize, os_addr.len() as usize); + std::ptr::copy_nonoverlapping(os_addr.as_ptr() as *const u8, addr as *mut u8, len); + + *addrlen = os_addr.len(); + 0 +} + +unsafe extern "C" fn setsockopt_detour( + _sockfd: i32, + _level: i32, + _optname: i32, + _optval: *mut c_char, + _optlen: socklen_t, +) -> i32 { + 0 +} + +unsafe extern "C" fn accept_detour( + sockfd: i32, + addr: *mut sockaddr, + addrlen: *mut socklen_t, +) -> i32 { + debug!( + "Accept called with sockfd {:?}, addr {:?}, addrlen {:?}", + &sockfd, &addr, &addrlen + ); + + if !addr.is_null() { + debug!("received non-null address in accept"); + let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080); + let os_addr: OsSocketAddr = socket_addr.into(); + std::ptr::copy_nonoverlapping(os_addr.as_ptr(), addr, os_addr.len() as usize); + } + let connection_id; + let mut sockets = CONNECTION_SOCKETS.lock().unwrap(); + + if let Some(mut socket) = sockets.remove(&sockfd) { + let mut buffer = [0; 1]; + socket.read_socket.read_exact(&mut buffer).unwrap(); + connection_id = CONNECTION_QUEUE.lock().unwrap().remove().unwrap(); + sockets.insert(sockfd, socket.port, socket); + } else { + error!("No socket found for fd: {}", sockfd); + return -1; + } + + let (read_socket, mut write_socket) = socketpair_stream().unwrap(); + let read_fd = read_socket.as_raw_fd(); + debug!( + "Accepted connection from read_fd:{:?}, write_sock:{:?}", + read_fd, write_socket + ); + + if let Some(data) = PENDING_DATA.lock().unwrap().remove(&connection_id) { + debug!("writing pending data for connection_id: {}", connection_id); + write_socket.write_all(&data).unwrap(); + } + + let data_socket = DataSocket { + connection_id, + read_socket, + write_socket, + }; + DATA_SOCKETS_BY_CONNECTION_ID + .lock() + .unwrap() + .insert(connection_id, data_socket); + + read_fd +} + +async fn create_agent() -> Portforwarder { + // Create Agent + let client = Client::try_default().await.unwrap(); + let pods: Api = Api::namespaced(client, "default"); + let agent_pod_name = format!( + "mirrord-agent-{}", + Alphanumeric + .sample_string(&mut rand::thread_rng(), 10) + .to_lowercase() + ); + let debug_pod: Pod = serde_json::from_value( + json!({ // TODO: Make nodename, image configurable, container-id + "metadata": { + "name": agent_pod_name + }, + "spec": { + "hostPID": true, + "nodeName": "aks-agentpool-11071180-vmss000000", + "restartPolicy": "Never", + "volumes": [ + { + "name": "containerd", + "hostPath": { + "path": "/run/containerd/containerd.sock" + } + } + ], + "containers": [ + { + "name": "mirrord-agent", + "image": "ghcr.io/metalbear-co/mirrord-agent:2.0.0-alpha-3", + "imagePullPolicy": "Always", + "securityContext": { + "privileged": true + }, + "volumeMounts": [ + { + "mountPath": "/run/containerd/containerd.sock", + "name": "containerd" + } + ], + "command": [ + "./mirrord-agent", + "--container-id", + "af14a5800124573a93d17d9302a57bdda320d15bfdebd1995e6b1cc3fdb4fee7", + "-t", + "60" + ], + "env": [{"name": "RUST_LOG", "value": "trace"}], + } + ] + } + }), + ) + .unwrap(); + pods.create(&PostParams::default(), &debug_pod) + .await + .unwrap(); + + // Wait until the pod is running, otherwise we get 500 error. + let running = await_condition(pods.clone(), &agent_pod_name, is_pod_running()); + let _ = tokio::time::timeout(std::time::Duration::from_secs(15), running) + .await + .unwrap(); + let pf = pods.portforward(&agent_pod_name, &[61337]).await.unwrap(); + + pf +} + +async fn poll_agent(mut pf: Portforwarder, mut receiver: Receiver) { + let port = pf.take_stream(61337).unwrap(); // TODO: Make port configurable + let mut codec = actix_codec::Framed::new(port, ClientCodec::new()); + thread::sleep(Duration::from_millis(5000)); + loop { + select! { + message = receiver.recv() => { + match message { + Some(message) => { + debug!("send message to client {:?}", &message); + codec.send(ClientMessage::PortSubscribe(vec![message])).await.unwrap(); + } + None => { + debug!("NONE in recv"); + break + } + } + } + message = codec.next() => { + match message { + Some(Ok(DaemonMessage::NewTCPConnection(conn))) => { + let mut sockets = CONNECTION_SOCKETS.lock().unwrap(); + if let Some(mut socket) = sockets.remove_alt(&conn.port) { + debug!("new connection id: {:?}", &conn.connection_id); + write!(socket.write_socket, "a").unwrap(); + CONNECTION_QUEUE.lock().unwrap().add(conn.connection_id).unwrap(); + sockets.insert(socket.read_fd, socket.port, socket); + } + else + { + error!("No socket found for port: {}", conn.port); + break + } + } + Some(Ok(DaemonMessage::TCPData(d))) => { + // Write to socket - need to find it in OPEN_CONNECTION_SOCKETS by conn_id + let mut sockets = DATA_SOCKETS_BY_CONNECTION_ID.lock().unwrap(); + if let Some(mut socket) = sockets.remove(&d.connection_id) { + socket.write_socket.write_all(&d.data).unwrap(); + sockets.insert(socket.connection_id, socket); + } + else + { + // Not necessarily an error - sometime the TCPData message is handled before NewTcpConnection + debug!("No socket found for connection_id: {}", d.connection_id); + PENDING_DATA.lock().unwrap().insert(d.connection_id, d.data); + continue + } + } + Some(Ok(DaemonMessage::TCPClose(d))) => { + DATA_SOCKETS_BY_CONNECTION_ID.lock().unwrap().remove(&d.connection_id).unwrap(); + } + Some(_) => { + debug!("NONE in some"); + break + }, + None => { + thread::sleep(Duration::from_millis(2000)); + debug!("NONE in none"); + continue + } + } + } + } + } +} + +#[ctor] +fn init() { + tracing_subscriber::fmt() + .with_max_level(tracing::Level::DEBUG) + .init(); + debug!("init called"); + + let pf = RUNTIME.block_on(create_agent()); + let (sender, receiver) = channel::(1000); + *SENDER.lock().unwrap() = Some(sender); + enable_hooks(); + RUNTIME.spawn(poll_agent(pf, receiver)); +} + +fn enable_hooks() { + let mut interceptor = Interceptor::obtain(&GUM); + + interceptor + .replace( + Module::find_export_by_name(None, "socket").unwrap(), + NativePointer(socket_detour as *mut c_void), + NativePointer(std::ptr::null_mut::()), + ) + .unwrap(); + + interceptor + .replace( + Module::find_export_by_name(None, "bind").unwrap(), + NativePointer(bind_detour as *mut c_void), + NativePointer(std::ptr::null_mut::()), + ) + .unwrap(); + + interceptor + .replace( + Module::find_export_by_name(None, "connect").unwrap(), + NativePointer(connect_detour as *mut c_void), + NativePointer(std::ptr::null_mut::()), + ) + .unwrap(); + + interceptor + .replace( + Module::find_export_by_name(None, "listen").unwrap(), + NativePointer(listen_detour as *mut c_void), + NativePointer(std::ptr::null_mut::()), + ) + .unwrap(); + + interceptor + .replace( + Module::find_export_by_name(None, "getpeername").unwrap(), + NativePointer(getpeername_detour as *mut c_void), + NativePointer(std::ptr::null_mut::()), + ) + .unwrap(); + + interceptor + .replace( + Module::find_export_by_name(None, "setsockopt").unwrap(), + NativePointer(setsockopt_detour as *mut c_void), + NativePointer(std::ptr::null_mut::()), + ) + .unwrap(); + + interceptor + .replace( + Module::find_export_by_name(None, "accept").unwrap(), + NativePointer(accept_detour as *mut c_void), + NativePointer(std::ptr::null_mut::()), + ) + .unwrap(); +} diff --git a/mirrord-protocol/CHANGELOG.md b/mirrord-protocol/CHANGELOG.md new file mode 100644 index 00000000000..99347e644b5 --- /dev/null +++ b/mirrord-protocol/CHANGELOG.md @@ -0,0 +1,14 @@ +## [Unreleased] + +## 0.2.0 - 25/04/2022 +### Changed +- Change `ConnectionUnsubscribe` data from `Port` to `ConnectionID` + +## 0.1.0 - 25/04/2022 +### Changed +- Split messages into Client messages and Daemon messages. +- There's now codec for each side. +- Added new message types + +## 0.0.1 - 14/3/2022 +Initial release \ No newline at end of file diff --git a/mirrord-protocol/Cargo.lock b/mirrord-protocol/Cargo.lock new file mode 100644 index 00000000000..09581cf7382 --- /dev/null +++ b/mirrord-protocol/Cargo.lock @@ -0,0 +1,200 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "actix-codec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a7559404a7f3573127aab53c08ce37a6c6a315c374a31070f3c91cd1b4a7fe" +dependencies = [ + "bitflags", + "bytes", + "futures-core", + "futures-sink", + "log", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "bincode" +version = "2.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f609ceb2c41b0d0277314a789ef0e7eb14593d5485f7c67320bed3924ebb1b33" +dependencies = [ + "bincode_derive", +] + +[[package]] +name = "bincode_derive" +version = "2.0.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913287a8f3e00db4c7ae1b87e9b9b8cebd6b89217eaadfc281fa5c897da35dc3" +dependencies = [ + "virtue", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "futures-core" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" + +[[package]] +name = "futures-sink" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "log" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "mirrord-protocol" +version = "0.2.0" +dependencies = [ + "actix-codec", + "bincode", + "bytes", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" + +[[package]] +name = "proc-macro2" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "1.0.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tokio" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee" +dependencies = [ + "pin-project-lite", +] + +[[package]] +name = "tokio-util" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tracing" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "virtue" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "757cfbfe0d17ee6f22fe97e536d463047d451b47cf9d11e2b7d1398b0ef274dd" diff --git a/mirrord-protocol/Cargo.toml b/mirrord-protocol/Cargo.toml new file mode 100644 index 00000000000..849c1cc9a89 --- /dev/null +++ b/mirrord-protocol/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "mirrord-protocol" +version = "0.2.0" +edition = "2021" +license = "MIT" +readme = "README.md" +repository = "https://github.com/metalbear/mirrord" +authors = ["Aviram ", "Eyal "] +description = "Mirrord protocol crate, used by mirrord client and agent to communicate." +homepage = "https://mirrord.metalbear.co" + +[dependencies] +actix-codec = "0.5" +bincode = "2.0.0-rc.1" +bytes = "1" \ No newline at end of file diff --git a/mirrord-protocol/LICENSE b/mirrord-protocol/LICENSE new file mode 100644 index 00000000000..52b758d77b9 --- /dev/null +++ b/mirrord-protocol/LICENSE @@ -0,0 +1,7 @@ +Copyright 2022 Metalbear.co + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/mirrord-protocol/README.md b/mirrord-protocol/README.md new file mode 100644 index 00000000000..7749bccf908 --- /dev/null +++ b/mirrord-protocol/README.md @@ -0,0 +1,16 @@ +# mirrord-protocol + +This is a cargo library that implements the mirrord-protocol between the [agent](https://github.com/metalbear-co/mirrord-agent) and [client](https://github.com/metalbear-co/mirrord). + +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Contributing +Anyone is welcome to contribute. Please feel free to create PRs with proper documentation, formatting and changelog record. + +## License + +mirrord-protocol is MIT licensed. \ No newline at end of file diff --git a/mirrord-protocol/src/codec.rs b/mirrord-protocol/src/codec.rs new file mode 100644 index 00000000000..25cf4513008 --- /dev/null +++ b/mirrord-protocol/src/codec.rs @@ -0,0 +1,235 @@ +use std::{io, net::IpAddr}; + +use actix_codec::{Decoder, Encoder}; +use bincode::{error::DecodeError, Decode, Encode}; +use bytes::{Buf, BufMut, BytesMut}; + +pub type ConnectionID = u16; +pub type Port = u16; + +#[derive(Encode, Decode, Debug, PartialEq, Clone)] +pub struct NewTCPConnection { + pub connection_id: ConnectionID, + pub address: IpAddr, + pub port: Port, +} + +#[derive(Encode, Decode, Debug, PartialEq, Clone)] +pub struct TCPData { + pub connection_id: ConnectionID, + pub data: Vec, +} + +#[derive(Encode, Decode, Debug, PartialEq, Clone)] +pub struct TCPClose { + pub connection_id: ConnectionID, +} + +#[derive(Encode, Decode, Debug, PartialEq, Clone)] +pub struct LogMessage { + pub message: String, +} + +#[derive(Encode, Decode, Debug, PartialEq, Clone)] +pub enum ClientMessage { + PortSubscribe(Vec), + Close, + ConnectionUnsubscribe(ConnectionID), +} + +#[derive(Encode, Decode, Debug, PartialEq, Clone)] +pub enum DaemonMessage { + Close, + NewTCPConnection(NewTCPConnection), + TCPData(TCPData), + TCPClose(TCPClose), + LogMessage(LogMessage), +} + +pub struct ClientCodec { + config: bincode::config::Configuration, +} + +impl ClientCodec { + pub fn new() -> Self { + ClientCodec { + config: bincode::config::standard(), + } + } +} + +impl Default for ClientCodec { + fn default() -> Self { + ClientCodec::new() + } +} + +impl Decoder for ClientCodec { + type Item = DaemonMessage; + type Error = io::Error; + + fn decode(&mut self, src: &mut BytesMut) -> io::Result> { + match bincode::decode_from_slice(&src[..], self.config) { + Ok((message, read)) => { + src.advance(read); + Ok(Some(message)) + } + Err(DecodeError::UnexpectedEnd) => Ok(None), + Err(err) => Err(io::Error::new(io::ErrorKind::Other, err.to_string())), + } + } +} + +impl Encoder for ClientCodec { + type Error = io::Error; + + fn encode(&mut self, msg: ClientMessage, dst: &mut BytesMut) -> Result<(), Self::Error> { + let encoded = match bincode::encode_to_vec(msg, self.config) { + Ok(encoded) => encoded, + Err(err) => { + return Err(io::Error::new(io::ErrorKind::Other, err.to_string())); + } + }; + dst.reserve(encoded.len()); + dst.put(&encoded[..]); + + Ok(()) + } +} + +pub struct DaemonCodec { + config: bincode::config::Configuration, +} + +impl DaemonCodec { + pub fn new() -> Self { + DaemonCodec { + config: bincode::config::standard(), + } + } +} + +impl Default for DaemonCodec { + fn default() -> Self { + DaemonCodec::new() + } +} + +impl Decoder for DaemonCodec { + type Item = ClientMessage; + type Error = io::Error; + + fn decode(&mut self, src: &mut BytesMut) -> io::Result> { + match bincode::decode_from_slice(&src[..], self.config) { + Ok((message, read)) => { + src.advance(read); + Ok(Some(message)) + } + Err(DecodeError::UnexpectedEnd) => Ok(None), + Err(err) => Err(io::Error::new(io::ErrorKind::Other, err.to_string())), + } + } +} + +impl Encoder for DaemonCodec { + type Error = io::Error; + + fn encode(&mut self, msg: DaemonMessage, dst: &mut BytesMut) -> Result<(), Self::Error> { + let encoded = match bincode::encode_to_vec(msg, self.config) { + Ok(encoded) => encoded, + Err(err) => { + return Err(io::Error::new(io::ErrorKind::Other, err.to_string())); + } + }; + dst.reserve(encoded.len()); + dst.put(&encoded[..]); + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use bytes::BytesMut; + + use super::*; + + #[test] + fn sanity_client_encode_decode() { + let mut client_codec = ClientCodec::new(); + let mut daemon_codec = DaemonCodec::new(); + let mut buf = BytesMut::new(); + + let msg = ClientMessage::PortSubscribe(vec![1, 2, 3]); + + client_codec.encode(msg.clone(), &mut buf).unwrap(); + + let decoded = daemon_codec.decode(&mut buf).unwrap().unwrap(); + + assert_eq!(decoded, msg); + assert!(buf.is_empty()); + } + + #[test] + fn sanity_daemon_encode_decode() { + let mut client_codec = ClientCodec::new(); + let mut daemon_codec = DaemonCodec::new(); + let mut buf = BytesMut::new(); + + let msg = DaemonMessage::TCPData(TCPData { + connection_id: 1, + data: vec![1, 2, 3], + }); + + daemon_codec.encode(msg.clone(), &mut buf).unwrap(); + + let decoded = client_codec.decode(&mut buf).unwrap().unwrap(); + + assert_eq!(decoded, msg); + assert!(buf.is_empty()); + } + + #[test] + fn decode_client_invalid_data() { + let mut codec = ClientCodec::new(); + let mut buf = BytesMut::new(); + buf.put_u8(254); + + let res = codec.decode(&mut buf); + match res { + Ok(_) => panic!("Should have failed"), + Err(err) => assert_eq!(err.kind(), io::ErrorKind::Other), + } + } + + #[test] + fn decode_client_partial_data() { + let mut codec = ClientCodec::new(); + let mut buf = BytesMut::new(); + buf.put_u8(1); + + assert!(codec.decode(&mut buf).unwrap().is_none()); + } + + #[test] + fn decode_daemon_invalid_data() { + let mut codec = DaemonCodec::new(); + let mut buf = BytesMut::new(); + buf.put_u8(254); + + let res = codec.decode(&mut buf); + match res { + Ok(_) => panic!("Should have failed"), + Err(err) => assert_eq!(err.kind(), io::ErrorKind::Other), + } + } + + #[test] + fn decode_daemon_partial_data() { + let mut codec = DaemonCodec::new(); + let mut buf = BytesMut::new(); + buf.put_u8(0); + + assert!(codec.decode(&mut buf).unwrap().is_none()); + } +} diff --git a/mirrord-protocol/src/lib.rs b/mirrord-protocol/src/lib.rs new file mode 100644 index 00000000000..89fb4d08236 --- /dev/null +++ b/mirrord-protocol/src/lib.rs @@ -0,0 +1,3 @@ +pub mod codec; + +pub use codec::*; diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 00000000000..6acc072dc4b --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,6 @@ +group_imports = "StdExternalCrate" +comment_width = 100 +wrap_comments = true +format_code_in_doc_comments = true +imports_granularity = "Crate" +newline_style = "Unix" diff --git a/sample/app.js b/sample/app.js new file mode 100644 index 00000000000..9a52dda889f --- /dev/null +++ b/sample/app.js @@ -0,0 +1,24 @@ +var net = require('net'); +var server = net.createServer(); +server.on('connection', handleConnection); +server.listen(80, function () { + console.log('server listening to %j', server.address()); +}); +function handleConnection(conn) { + var remoteAddress = conn.remoteAddress + ':' + conn.remotePort; + console.log('new client connection from %s', remoteAddress); + conn.on('data', onConnData); + conn.once('close', onConnClose); + conn.on('error', onConnError); + + function onConnData(d) { + console.log('connection data from %s: %j', remoteAddress, d); + conn.write(d); + } + function onConnClose() { + console.log('connection from %s closed', remoteAddress); + } + function onConnError(err) { + console.log('Connection %s error: %s', remoteAddress, err.message); + } +} From d8b4de6f5c5907d4d682f018d42455cd41551eb2 Mon Sep 17 00:00:00 2001 From: Eyal Bukchin Date: Wed, 4 May 2022 17:10:30 +0100 Subject: [PATCH 02/40] Container/node inference, and get layer to work under monorepo --- .gitignore | 8 +- .vscode/launch.json | 3 +- .vscode/tasks.json | 20 + Cargo.lock | 1614 +++++++++++++++++++++++++++++++++++++- mirrord-layer/src/lib.rs | 103 +-- 5 files changed, 1687 insertions(+), 61 deletions(-) create mode 100644 .vscode/tasks.json diff --git a/.gitignore b/.gitignore index eab8d9e47b9..160f0255de7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,13 @@ dist node_modules .vscode-test/ *.vsix -.vscode/ .DS_Store **/.DS_Store target + +### VSCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json diff --git a/.vscode/launch.json b/.vscode/launch.json index fafe61981c2..97bf9031b0d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -39,7 +39,8 @@ "env": { "DYLD_INSERT_LIBRARIES": "${workspaceFolder}/target/debug/libmirrord.dylib", "LD_PRELOAD": "${workspaceFolder}/target/debug/libmirrord.so", - "RUST_LOG": "trace" + "RUST_LOG": "trace", + "MIRRORD_IMPERSONATED_POD_NAME": "nginx-deployment-66b6c48dd5-xg4rq" }, } ] diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000000..df3a44f5f19 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,20 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "cargo", + "command": "build", + "options": { + "cwd": "mirrord-layer/" + }, + "problemMatcher": [ + "$rustc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "label": "rust: cargo build" + } + ] +} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index c64b4cf2a0f..597b81b15f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,6 +19,17 @@ dependencies = [ "tokio-util 0.7.1", ] +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + [[package]] name = "aho-corasick" version = "0.7.18" @@ -28,6 +39,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + [[package]] name = "anyhow" version = "1.0.57" @@ -83,6 +103,17 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "getrandom", + "instant", + "rand 0.8.5", +] + [[package]] name = "base64" version = "0.13.0" @@ -107,30 +138,142 @@ dependencies = [ "virtue", ] +[[package]] +name = "bindgen" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd4865004a46a0aafb2a0a5eb19d3c9fc46ee5f063a6cfc605c69ac9ecf5263d" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "clap 2.34.0", + "env_logger 0.8.4", + "lazy_static", + "lazycell", + "log", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "which 3.1.1", +] + [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "block-buffer" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + [[package]] name = "bytes" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +[[package]] +name = "capstone" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b5d1f14c3539b6ff22fcb602fea5f1c4416148c8b7965a2e74860aa169b7b5" +dependencies = [ + "capstone-sys", + "libc", +] + +[[package]] +name = "capstone-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df653a22d0ad34b0d91cc92a6289d96e44aac1c9a96250a094c9aeec4a91084f" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "cc" version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +[[package]] +name = "cexpr" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "serde", + "winapi", +] + +[[package]] +name = "clang-sys" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cc00842eed744b858222c4c9faf7243aafc6d33f92f96935263ef4d8a41ce21" +dependencies = [ + "glob", + "libc", + "libloading 0.7.3", +] + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim 0.8.0", + "textwrap 0.11.0", + "unicode-width", + "vec_map", +] + [[package]] name = "clap" version = "3.1.15" @@ -143,9 +286,9 @@ dependencies = [ "clap_lex", "indexmap", "lazy_static", - "strsim", + "strsim 0.10.0", "termcolor", - "textwrap", + "textwrap 0.15.0", ] [[package]] @@ -183,12 +326,162 @@ dependencies = [ "tower", ] +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "cpufeatures" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctor" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dyn-clone" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e50f3adc76d6a43f5ed73b698a87d0760ca74617f60f7c3b879003536fdd28" + [[package]] name = "either" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +[[package]] +name = "encoding_rs" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "env_logger" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + [[package]] name = "env_logger" version = "0.9.0" @@ -232,6 +525,18 @@ dependencies = [ "instant", ] +[[package]] +name = "filetime" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "winapi", +] + [[package]] name = "fixedbitset" version = "0.4.1" @@ -244,6 +549,74 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "frida-build" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c4d5d5eedcceaae76eae494338aee0b8fceab952934568287b834d555e01a0a" +dependencies = [ + "reqwest", + "tar", + "xz", +] + +[[package]] +name = "frida-gum" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e2d59d3b7986689332e52cee912200c79ed7db1ab5085b0f109987f3c239e8" +dependencies = [ + "capstone", + "capstone-sys", + "frida-gum-sys", + "num", + "num-derive", + "num-traits", + "paste", + "thiserror", +] + +[[package]] +name = "frida-gum-sys" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1783513909bdc7b7699b8bac67c92c835ab78d3c86fde514f161eb5b88264a66" +dependencies = [ + "bindgen", + "frida-build", +] + +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + [[package]] name = "futures" version = "0.3.21" @@ -333,6 +706,16 @@ dependencies = [ "slab", ] +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.6" @@ -421,6 +804,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-range-header" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" + [[package]] name = "httparse" version = "1.7.1" @@ -463,6 +852,24 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-openssl" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ee5d7a8f718585d1c3c61dfde28ef5b0bb14734b4db13f5ada856cdc6c612b" +dependencies = [ + "http", + "hyper", + "linked_hash_set", + "once_cell", + "openssl", + "openssl-sys", + "parking_lot", + "tokio", + "tokio-openssl", + "tower-layer", +] + [[package]] name = "hyper-timeout" version = "0.4.1" @@ -476,8 +883,38 @@ dependencies = [ ] [[package]] -name = "indexmap" -version = "1.8.1" +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" dependencies = [ @@ -494,6 +931,28 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-extras" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c90f9c8f5bda269ce32e960d433de3fc932ab8f347500e866da45ec70f67e0d2" +dependencies = [ + "io-lifetimes", + "winapi", +] + +[[package]] +name = "io-lifetimes" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9448015e586b611e5d322f6703812bbca2f1e709d5773ecd38ddb4e3bb649504" + +[[package]] +name = "ipnet" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" + [[package]] name = "ipnetwork" version = "0.18.0" @@ -518,12 +977,171 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +[[package]] +name = "js-sys" +version = "0.3.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f995a3c8f2bc3dd52a18a583e90f9ec109c047fa1603a853e46bcda14d2e279d" +dependencies = [ + "serde", + "serde_json", + "treediff", +] + +[[package]] +name = "jsonpath_lib" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaa63191d68230cccb81c5aa23abd53ed64d83337cacbb25a7b8c7979523774f" +dependencies = [ + "log", + "serde", + "serde_json", +] + +[[package]] +name = "k8s-openapi" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0489fc937cc7616a9abfa61bf39c250d7e32e1325ef028c8d9278dd24ea395b3" +dependencies = [ + "base64", + "bytes", + "chrono", + "http", + "percent-encoding", + "serde", + "serde-value", + "serde_json", + "url", +] + +[[package]] +name = "kube" +version = "0.71.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "342744dfeb81fe186b84f485b33f12c6a15d3396987d933b06a566a3db52ca38" +dependencies = [ + "k8s-openapi", + "kube-client", + "kube-core", + "kube-derive", + "kube-runtime", +] + +[[package]] +name = "kube-client" +version = "0.71.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f69a504997799340408635d6e351afb8aab2c34ca3165e162f41b3b34a69a79" +dependencies = [ + "base64", + "bytes", + "chrono", + "dirs-next", + "either", + "futures", + "http", + "http-body", + "hyper", + "hyper-openssl", + "hyper-timeout", + "jsonpath_lib", + "k8s-openapi", + "kube-core", + "openssl", + "pem", + "pin-project", + "rand 0.8.5", + "secrecy", + "serde", + "serde_json", + "serde_yaml", + "thiserror", + "tokio", + "tokio-tungstenite", + "tokio-util 0.7.1", + "tower", + "tower-http", + "tracing", +] + +[[package]] +name = "kube-core" +version = "0.71.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a247487699941baaf93438d65b12d4e32450bea849d619d19ed394e8a4a645" +dependencies = [ + "chrono", + "form_urlencoded", + "http", + "json-patch", + "k8s-openapi", + "once_cell", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "kube-derive" +version = "0.71.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "203f7c5acf9d0dfb0b08d44ec1d66ace3d1dfe0cdd82e65e274f3f96615d666c" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "serde_json", + "syn", +] + +[[package]] +name = "kube-runtime" +version = "0.71.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02ea50e6ed56578e1d1d02548901b12fe6d3edbf110269a396955e285d487973" +dependencies = [ + "ahash", + "backoff", + "derivative", + "futures", + "json-patch", + "k8s-openapi", + "kube-client", + "parking_lot", + "pin-project", + "serde", + "serde_json", + "smallvec", + "thiserror", + "tokio", + "tokio-util 0.7.1", + "tracing", +] + [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "libc" version = "0.2.125" @@ -540,6 +1158,37 @@ dependencies = [ "winapi", ] +[[package]] +name = "libloading" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" + +[[package]] +name = "linked_hash_set" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47186c6da4d81ca383c7c47c1bfc80f4b95f4720514d860a5407aaf4233f9588" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "linux-raw-sys" +version = "0.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d" + [[package]] name = "lock_api" version = "0.4.7" @@ -559,6 +1208,23 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "lzma-sys" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb4b7c3eddad11d3af9e86c487607d2d2442d185d848575365c4856ba96d619" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + [[package]] name = "memchr" version = "2.5.0" @@ -574,6 +1240,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + [[package]] name = "mio" version = "0.8.2" @@ -603,9 +1275,9 @@ version = "2.0.0-alpha-3" dependencies = [ "actix-codec", "anyhow", - "clap", + "clap 3.1.15", "containerd-client", - "env_logger", + "env_logger 0.9.0", "futures", "mirrord-protocol", "nix", @@ -620,6 +1292,38 @@ dependencies = [ "tracing", ] +[[package]] +name = "mirrord-layer" +version = "0.1.0" +dependencies = [ + "actix-codec", + "bytes", + "clap 3.1.15", + "ctor", + "env_logger 0.9.0", + "frida-gum", + "futures", + "k8s-openapi", + "kube", + "lazy_static", + "libc", + "mirrord-protocol", + "multi-map", + "nanoid", + "nix", + "os_socketaddr", + "queues", + "rand 0.8.5", + "redhook", + "serde_json", + "socketpair", + "tempdir", + "tokio", + "tokio-stream", + "tracing", + "tracing-subscriber", +] + [[package]] name = "mirrord-protocol" version = "0.2.0" @@ -629,12 +1333,45 @@ dependencies = [ "bytes", ] +[[package]] +name = "multi-map" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bba551d6d795f74a01767577ea8339560bf0a65354e0417b7e915ed608443d46" + [[package]] name = "multimap" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" +[[package]] +name = "nanoid" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "native-tls" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "nix" version = "0.23.1" @@ -648,6 +1385,16 @@ dependencies = [ "memoffset", ] +[[package]] +name = "nom" +version = "5.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" +dependencies = [ + "memchr", + "version_check", +] + [[package]] name = "ntapi" version = "0.3.7" @@ -657,6 +1404,84 @@ dependencies = [ "winapi", ] +[[package]] +name = "num" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.15" @@ -682,6 +1507,70 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" +[[package]] +name = "openssl" +version = "0.10.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5fd19fb3e0a8191c1e34935718976a3e70c112ab9a24af6d7cadccd9d90bc0" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "ordered-float" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" +dependencies = [ + "num-traits", +] + +[[package]] +name = "os_socketaddr" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2090877fe9aa15a914d863207ea6d2062d94c1178a854b1571374f9be1a045fb" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "os_str_bytes" version = "6.0.0" @@ -711,6 +1600,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "paste" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" + [[package]] name = "pcap" version = "0.9.2" @@ -719,12 +1614,27 @@ dependencies = [ "errno", "futures", "libc", - "libloading", + "libloading 0.6.7", "regex", "tokio", "winapi", ] +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + +[[package]] +name = "pem" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9a3b09a20e374558580a4914d3b7d89bd61b954a5a5e1dcbea98753addb1947" +dependencies = [ + "base64", +] + [[package]] name = "percent-encoding" version = "2.1.0" @@ -773,6 +1683,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" + [[package]] name = "pnet" version = "0.29.0" @@ -927,7 +1843,7 @@ dependencies = [ "prost-types", "regex", "tempfile", - "which", + "which 4.2.5", ] [[package]] @@ -953,6 +1869,12 @@ dependencies = [ "prost", ] +[[package]] +name = "queues" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1475abae4f8ad4998590fe3acfe20104f0a5d48fc420c817cd2c09c3f56151f0" + [[package]] name = "quote" version = "1.0.18" @@ -962,6 +1884,19 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +dependencies = [ + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "rdrand", + "winapi", +] + [[package]] name = "rand" version = "0.8.5" @@ -970,7 +1905,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", - "rand_core", + "rand_core 0.6.3", ] [[package]] @@ -980,9 +1915,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.3", ] +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +dependencies = [ + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + [[package]] name = "rand_core" version = "0.6.3" @@ -992,6 +1942,24 @@ dependencies = [ "getrandom", ] +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "redhook" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6e109b8469dbbe6d7cbe18e5ebd65d4a134e2f4b91304ad9213984cad1d70a6" +dependencies = [ + "libc", +] + [[package]] name = "redox_syscall" version = "0.2.13" @@ -1001,6 +1969,17 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall", + "thiserror", +] + [[package]] name = "regex" version = "1.5.5" @@ -1027,18 +2006,141 @@ dependencies = [ "winapi", ] +[[package]] +name = "reqwest" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.34.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3e74b3f02f2b6eb33790923756784614f456de79d821d6b2670dc7d5fbea807" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "winapi", +] + [[package]] name = "ryu" version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +[[package]] +name = "schannel" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +dependencies = [ + "lazy_static", + "winapi", +] + +[[package]] +name = "schemars" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6b5a3c80cea1ab61f4260238409510e814e38b4b563c06044edf91e7dc070e3" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ae4dce13e8614c46ac3c38ef1c0d668b101df6ac39817aebdaa26642ddae9b" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn", +] + [[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "serde", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" version = "1.0.137" @@ -1048,6 +2150,16 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + [[package]] name = "serde_derive" version = "1.0.137" @@ -1059,17 +2171,79 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_derive_internals" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "serde_json" version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" dependencies = [ + "indexmap", "itoa", "ryu", "serde", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_yaml" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707d15895415db6628332b737c838b88c598522e4dc70647e59b72312924aebc" +dependencies = [ + "indexmap", + "ryu", + "serde", + "yaml-rust", +] + +[[package]] +name = "sha-1" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" + [[package]] name = "signal-hook-registry" version = "1.4.0" @@ -1092,15 +2266,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" [[package]] -name = "socket2" -version = "0.4.4" +name = "socket2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socketpair" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +checksum = "5f4a66c5734072f44d758e9dbd4f1f0f041687c782535ce7a5428228c752b1a4" dependencies = [ - "libc", + "io-extras", + "io-lifetimes", + "rustix", + "uuid", "winapi", ] +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + [[package]] name = "strsim" version = "0.10.0" @@ -1118,6 +2311,27 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "tar" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tempdir" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" +dependencies = [ + "rand 0.4.6", + "remove_dir_all", +] + [[package]] name = "tempfile" version = "3.3.0" @@ -1147,12 +2361,65 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e7a7de15468c6e65dd7db81cf3822c1ec94c71b2a3c1a976ea8e4696c91115c" +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + [[package]] name = "textwrap" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" +[[package]] +name = "thiserror" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + [[package]] name = "tokio" version = "1.18.1" @@ -1194,6 +2461,28 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-openssl" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08f9ffb7809f1b20c1b398d92acf4cc719874b3b2b2d9ea2f09b4a80350878a" +dependencies = [ + "futures-util", + "openssl", + "openssl-sys", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.8" @@ -1205,6 +2494,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-tungstenite" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06cda1232a49558c46f8a504d5b93101d42c0bf7f911f12a105ba48168f821ae" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + [[package]] name = "tokio-util" version = "0.6.9" @@ -1229,6 +2530,7 @@ dependencies = [ "futures-core", "futures-sink", "pin-project-lite", + "slab", "tokio", "tracing", ] @@ -1287,7 +2589,7 @@ dependencies = [ "indexmap", "pin-project", "pin-project-lite", - "rand", + "rand 0.8.5", "slab", "tokio", "tokio-util 0.7.1", @@ -1296,6 +2598,26 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8" +dependencies = [ + "base64", + "bitflags", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-range-header", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower-layer" version = "0.3.1" @@ -1339,6 +2661,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" dependencies = [ "lazy_static", + "valuable", ] [[package]] @@ -1351,24 +2674,149 @@ dependencies = [ "tracing", ] +[[package]] +name = "tracing-log" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +dependencies = [ + "lazy_static", + "log", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596" +dependencies = [ + "ansi_term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "treediff" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761e8d5ad7ce14bb82b7e61ccc0ca961005a275a060b9644a2431aa11553c2ff" +dependencies = [ + "serde_json", +] + [[package]] name = "try-lock" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +[[package]] +name = "tungstenite" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96a2dea40e7570482f28eb57afbe42d97551905da6a9400acc5c328d24004f5" +dependencies = [ + "base64", + "byteorder", + "bytes", + "http", + "httparse", + "log", + "rand 0.8.5", + "sha-1", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + [[package]] name = "unicode-xid" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "version_check" version = "0.9.4" @@ -1403,6 +2851,91 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasm-bindgen" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" + +[[package]] +name = "web-sys" +version = "0.3.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "which" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724" +dependencies = [ + "libc", +] + [[package]] name = "which" version = "4.2.5" @@ -1487,3 +3020,54 @@ name = "windows_x86_64_msvc" version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + +[[package]] +name = "xattr" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +dependencies = [ + "libc", +] + +[[package]] +name = "xz" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c887690ff2a2e233e8e49633461521f98ec57fbff9d59a884c9a4f04ec1da34" +dependencies = [ + "xz2", +] + +[[package]] +name = "xz2" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c179869f34fc7c01830d3ce7ea2086bc3a07e0d35289b667d0a8bf910258926c" +dependencies = [ + "lzma-sys", +] + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "zeroize" +version = "1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94693807d016b2f2d2e14420eb3bfcca689311ff775dcf113d74ea624b7cdf07" diff --git a/mirrord-layer/src/lib.rs b/mirrord-layer/src/lib.rs index 427e2cbde36..253a44141c7 100644 --- a/mirrord-layer/src/lib.rs +++ b/mirrord-layer/src/lib.rs @@ -2,6 +2,7 @@ use std::{ collections::HashMap, + env, io::{Read, Write}, net::{IpAddr, Ipv4Addr, SocketAddr}, os::unix::io::AsRawFd, @@ -213,58 +214,72 @@ async fn create_agent() -> Portforwarder { // Create Agent let client = Client::try_default().await.unwrap(); let pods: Api = Api::namespaced(client, "default"); + let pod = pods + .get(&env::var("MIRRORD_IMPERSONATED_POD_NAME").unwrap()) + .await + .unwrap(); + let node_name = &pod.spec.unwrap().node_name; + let container_statuses = pod.status.unwrap().container_statuses.unwrap(); + let container_id = container_statuses + .first() + .unwrap() + .container_id + .as_ref() + .unwrap() + .split("//") + .last() + .unwrap(); let agent_pod_name = format!( "mirrord-agent-{}", Alphanumeric .sample_string(&mut rand::thread_rng(), 10) .to_lowercase() ); - let debug_pod: Pod = serde_json::from_value( - json!({ // TODO: Make nodename, image configurable, container-id - "metadata": { - "name": agent_pod_name - }, - "spec": { - "hostPID": true, - "nodeName": "aks-agentpool-11071180-vmss000000", - "restartPolicy": "Never", - "volumes": [ - { - "name": "containerd", - "hostPath": { - "path": "/run/containerd/containerd.sock" - } - } - ], - "containers": [ - { - "name": "mirrord-agent", - "image": "ghcr.io/metalbear-co/mirrord-agent:2.0.0-alpha-3", - "imagePullPolicy": "Always", - "securityContext": { - "privileged": true - }, - "volumeMounts": [ - { - "mountPath": "/run/containerd/containerd.sock", - "name": "containerd" - } - ], - "command": [ - "./mirrord-agent", - "--container-id", - "af14a5800124573a93d17d9302a57bdda320d15bfdebd1995e6b1cc3fdb4fee7", - "-t", - "60" - ], - "env": [{"name": "RUST_LOG", "value": "trace"}], + + let agent_pod: Pod = serde_json::from_value(json!({ + "metadata": { + "name": agent_pod_name + }, + "spec": { + "hostPID": true, + "nodeName": node_name, + "restartPolicy": "Never", + "volumes": [ + { + "name": "containerd", + "hostPath": { + "path": "/run/containerd/containerd.sock" } - ] - } - }), - ) + } + ], + "containers": [ + { + "name": "mirrord-agent", + "image": "ghcr.io/metalbear-co/mirrord-agent:2.0.0-alpha-3", + "imagePullPolicy": "Always", + "securityContext": { + "privileged": true + }, + "volumeMounts": [ + { + "mountPath": "/run/containerd/containerd.sock", + "name": "containerd" + } + ], + "command": [ + "./mirrord-agent", + "--container-id", + container_id, + "-t", + "60" + ], + "env": [{"name": "RUST_LOG", "value": "trace"}], + } + ] + } + })) .unwrap(); - pods.create(&PostParams::default(), &debug_pod) + pods.create(&PostParams::default(), &agent_pod) .await .unwrap(); From a20e6e5981c19bbd328c7e8943cf585acafbee4c Mon Sep 17 00:00:00 2001 From: Mehul Arora Date: Fri, 6 May 2022 15:27:02 -0400 Subject: [PATCH 03/40] handle accept4 --- mirrord-layer/src/lib.rs | 110 +++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 57 deletions(-) diff --git a/mirrord-layer/src/lib.rs b/mirrord-layer/src/lib.rs index 253a44141c7..d482ebf85df 100644 --- a/mirrord-layer/src/lib.rs +++ b/mirrord-layer/src/lib.rs @@ -12,7 +12,7 @@ use std::{ }; use ctor::ctor; -use frida_gum::{interceptor::Interceptor, Gum, Module, NativePointer}; +use frida_gum::{interceptor::Interceptor, Error, Gum, Module, NativePointer}; use futures::{SinkExt, StreamExt}; use k8s_openapi::api::core::v1::Pod; use kube::{ @@ -210,6 +210,15 @@ unsafe extern "C" fn accept_detour( read_fd } +unsafe extern "C" fn accept4_detour( + sockfd: i32, + addr: *mut sockaddr, + addrlen: *mut socklen_t, + _flags: i32, +) -> i32 { + accept_detour(sockfd, addr, addrlen) +} + async fn create_agent() -> Portforwarder { // Create Agent let client = Client::try_default().await.unwrap(); @@ -374,62 +383,49 @@ fn init() { RUNTIME.spawn(poll_agent(pf, receiver)); } -fn enable_hooks() { - let mut interceptor = Interceptor::obtain(&GUM); - - interceptor - .replace( - Module::find_export_by_name(None, "socket").unwrap(), - NativePointer(socket_detour as *mut c_void), - NativePointer(std::ptr::null_mut::()), - ) - .unwrap(); - - interceptor - .replace( - Module::find_export_by_name(None, "bind").unwrap(), - NativePointer(bind_detour as *mut c_void), - NativePointer(std::ptr::null_mut::()), - ) - .unwrap(); - - interceptor - .replace( - Module::find_export_by_name(None, "connect").unwrap(), - NativePointer(connect_detour as *mut c_void), - NativePointer(std::ptr::null_mut::()), - ) - .unwrap(); - - interceptor - .replace( - Module::find_export_by_name(None, "listen").unwrap(), - NativePointer(listen_detour as *mut c_void), - NativePointer(std::ptr::null_mut::()), - ) - .unwrap(); - - interceptor - .replace( - Module::find_export_by_name(None, "getpeername").unwrap(), - NativePointer(getpeername_detour as *mut c_void), - NativePointer(std::ptr::null_mut::()), - ) - .unwrap(); +macro_rules! hook { + ($interceptor:expr, $func:expr, $detour_name:expr) => { + $interceptor + .replace( + Module::find_export_by_name(None, $func).unwrap(), + NativePointer($detour_name as *mut c_void), + NativePointer(std::ptr::null_mut::()), + ) + .unwrap(); + }; +} - interceptor - .replace( - Module::find_export_by_name(None, "setsockopt").unwrap(), - NativePointer(setsockopt_detour as *mut c_void), - NativePointer(std::ptr::null_mut::()), - ) - .unwrap(); +macro_rules! try_hook { + ($interceptor:expr, $func:expr, $detour_name:expr) => { + if let Some(addr) = Module::find_export_by_name(None, $func) { + match $interceptor.replace( + addr, + NativePointer($detour_name as *mut c_void), + NativePointer(std::ptr::null_mut::()), + ) { + Err(Error::InterceptorAlreadyReplaced) => { + debug!("{} already replaced", $func); + } + Err(e) => { + debug!("{} error: {:?}", $func, e); + } + Ok(_) => { + debug!("{} hooked", $func); + } + } + } + }; +} - interceptor - .replace( - Module::find_export_by_name(None, "accept").unwrap(), - NativePointer(accept_detour as *mut c_void), - NativePointer(std::ptr::null_mut::()), - ) - .unwrap(); +fn enable_hooks() { + let mut interceptor = Interceptor::obtain(&GUM); + hook!(interceptor, "socket", socket_detour); + hook!(interceptor, "bind", bind_detour); + hook!(interceptor, "connect", connect_detour); + hook!(interceptor, "listen", listen_detour); + hook!(interceptor, "getpeername", getpeername_detour); + hook!(interceptor, "setsockopt", setsockopt_detour); + try_hook!(interceptor, "uv__accept4", accept4_detour); + try_hook!(interceptor, "accept4", accept4_detour); + try_hook!(interceptor, "accept", accept_detour); } From 39d313dc7ca74a36d70f1a5aea729033fb45c881 Mon Sep 17 00:00:00 2001 From: Aviram Date: Sat, 7 May 2022 21:40:32 +0300 Subject: [PATCH 04/40] use rustls to avoid openSSL conflict on node --- Cargo.lock | 131 +++++++++++++++++++++++++++++++-------- mirrord-layer/Cargo.toml | 2 +- 2 files changed, 105 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 597b81b15f6..a4b36cefcf1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -853,21 +853,18 @@ dependencies = [ ] [[package]] -name = "hyper-openssl" -version = "0.9.2" +name = "hyper-rustls" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ee5d7a8f718585d1c3c61dfde28ef5b0bb14734b4db13f5ada856cdc6c612b" +checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac" dependencies = [ "http", "hyper", - "linked_hash_set", - "once_cell", - "openssl", - "openssl-sys", - "parking_lot", + "log", + "rustls", + "rustls-native-certs", "tokio", - "tokio-openssl", - "tower-layer", + "tokio-rustls", ] [[package]] @@ -1053,15 +1050,16 @@ dependencies = [ "http", "http-body", "hyper", - "hyper-openssl", + "hyper-rustls", "hyper-timeout", "jsonpath_lib", "k8s-openapi", "kube-core", - "openssl", "pem", "pin-project", "rand 0.8.5", + "rustls", + "rustls-pemfile 0.3.0", "secrecy", "serde", "serde_json", @@ -1174,15 +1172,6 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" -[[package]] -name = "linked_hash_set" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47186c6da4d81ca383c7c47c1bfc80f4b95f4720514d860a5407aaf4233f9588" -dependencies = [ - "linked-hash-map", -] - [[package]] name = "linux-raw-sys" version = "0.0.46" @@ -2042,6 +2031,21 @@ dependencies = [ "winreg", ] +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + [[package]] name = "rustc-hash" version = "1.1.0" @@ -2062,6 +2066,48 @@ dependencies = [ "winapi", ] +[[package]] +name = "rustls" +version = "0.20.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fbfeb8d0ddb84706bc597a5574ab8912817c52a397f819e5b614e2265206921" +dependencies = [ + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" +dependencies = [ + "openssl-probe", + "rustls-pemfile 1.0.0", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee86d63972a7c661d1536fefe8c3c8407321c3df668891286de28abcd087360" +dependencies = [ + "base64", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7522c9de787ff061458fe9a829dc790a3f5b22dc571694fc5883f448b94d9a9" +dependencies = [ + "base64", +] + [[package]] name = "ryu" version = "1.0.9" @@ -2108,6 +2154,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "secrecy" version = "0.8.0" @@ -2288,6 +2344,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + [[package]] name = "strsim" version = "0.8.0" @@ -2472,15 +2534,14 @@ dependencies = [ ] [[package]] -name = "tokio-openssl" -version = "0.6.3" +name = "tokio-rustls" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08f9ffb7809f1b20c1b398d92acf4cc719874b3b2b2d9ea2f09b4a80350878a" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "futures-util", - "openssl", - "openssl-sys", + "rustls", "tokio", + "webpki", ] [[package]] @@ -2772,6 +2833,12 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + [[package]] name = "url" version = "2.2.2" @@ -2927,6 +2994,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "which" version = "3.1.1" diff --git a/mirrord-layer/Cargo.toml b/mirrord-layer/Cargo.toml index 16e95080134..ef4c3a745bb 100644 --- a/mirrord-layer/Cargo.toml +++ b/mirrord-layer/Cargo.toml @@ -21,7 +21,7 @@ frida-gum = {version = "0.6.5", features = ["auto-download"]} futures = "0.3.21" clap = { version = "3.1.12", features = ["derive"] } k8s-openapi = { version = "0.14.0", features = ["v1_22"] } -kube = { version = "0.71.0", features = ["runtime", "derive", "client", "ws"] } +kube = { version = "0.71.0", default-features = false, features = ["runtime", "derive", "client", "ws", "rustls-tls"] } tokio = { version = "1", features = ["full"] } serde_json = "1.0.79" From 8cad54038980f5f43639665ed083ffcc60d64ad7 Mon Sep 17 00:00:00 2001 From: Eyal Bukchin Date: Sun, 8 May 2022 18:34:04 +0100 Subject: [PATCH 05/40] Move some functionality to separate files (#31) --- .github/workflows/ci.yaml | 6 +- .vscode/launch.json | 3 +- Cargo.lock | 21 +++ mirrord-layer/Cargo.toml | 1 + mirrord-layer/src/config.rs | 15 ++ mirrord-layer/src/lib.rs | 307 ++++++----------------------------- mirrord-layer/src/pod_api.rs | 91 +++++++++++ mirrord-layer/src/sockets.rs | 240 +++++++++++++++++++++++++++ sample/app.js | 2 +- 9 files changed, 421 insertions(+), 265 deletions(-) create mode 100644 mirrord-layer/src/config.rs create mode 100644 mirrord-layer/src/pod_api.rs create mode 100644 mirrord-layer/src/sockets.rs diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3fb207c97c5..f81f7b674e4 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -15,12 +15,12 @@ jobs: - uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: nightly + toolchain: stable components: rustfmt, clippy # Needed for agent - run: sudo apt install libpcap-dev cmake - - run: cargo +nightly fmt --all -- --check - - run: cargo +nightly clippy -- -D warnings + - run: cargo fmt --all -- --check + - run: cargo clippy -- -D warnings test_mirrord_protocol: strategy: diff --git a/.vscode/launch.json b/.vscode/launch.json index 97bf9031b0d..7f6acbda039 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -40,7 +40,8 @@ "DYLD_INSERT_LIBRARIES": "${workspaceFolder}/target/debug/libmirrord.dylib", "LD_PRELOAD": "${workspaceFolder}/target/debug/libmirrord.so", "RUST_LOG": "trace", - "MIRRORD_IMPERSONATED_POD_NAME": "nginx-deployment-66b6c48dd5-xg4rq" + "MIRRORD_AGENT_IMPERSONATED_POD_NAME": "nginx-deployment-66b6c48dd5-xg4rq", + "MIRRORD_AGENT_RUST_LOG": "trace", }, } ] diff --git a/Cargo.lock b/Cargo.lock index a4b36cefcf1..536d724b702 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -495,6 +495,26 @@ dependencies = [ "termcolor", ] +[[package]] +name = "envconfig" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea81cc7e21f55a9d9b1efb6816904978d0bfbe31a50347cb24b2e75564bcac9b" +dependencies = [ + "envconfig_derive", +] + +[[package]] +name = "envconfig_derive" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dfca278e5f84b45519acaaff758ebfa01f18e96998bc24b8f1b722dd804b9bf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "errno" version = "0.2.8" @@ -1290,6 +1310,7 @@ dependencies = [ "clap 3.1.15", "ctor", "env_logger 0.9.0", + "envconfig", "frida-gum", "futures", "k8s-openapi", diff --git a/mirrord-layer/Cargo.toml b/mirrord-layer/Cargo.toml index ef4c3a745bb..db06e12e5a1 100644 --- a/mirrord-layer/Cargo.toml +++ b/mirrord-layer/Cargo.toml @@ -33,6 +33,7 @@ tokio-stream = "0.1.8" queues = "1.1.0" rand = "0.8.5" multi-map = "1.3.0" +envconfig = "0.10.0" [lib] name = "mirrord" diff --git a/mirrord-layer/src/config.rs b/mirrord-layer/src/config.rs new file mode 100644 index 00000000000..20189493c2c --- /dev/null +++ b/mirrord-layer/src/config.rs @@ -0,0 +1,15 @@ +use envconfig::Envconfig; +use lazy_static::lazy_static; + +#[derive(Envconfig)] +pub struct Config { + #[envconfig(from = "MIRRORD_AGENT_RUST_LOG", default = "info")] + pub agent_rust_log: String, + + #[envconfig(from = "MIRRORD_AGENT_IMPERSONATED_POD_NAME")] + pub impersonated_pod_name: String, +} + +lazy_static! { + pub static ref CONFIG: Config = Config::init_from_env().unwrap(); +} diff --git a/mirrord-layer/src/lib.rs b/mirrord-layer/src/lib.rs index d482ebf85df..d8108867bff 100644 --- a/mirrord-layer/src/lib.rs +++ b/mirrord-layer/src/lib.rs @@ -1,34 +1,15 @@ -#![feature(c_variadic)] +// #![feature(c_variadic)] -use std::{ - collections::HashMap, - env, - io::{Read, Write}, - net::{IpAddr, Ipv4Addr, SocketAddr}, - os::unix::io::AsRawFd, - sync::Mutex, - thread, - time::Duration, -}; +use std::{sync::Mutex, thread, time::Duration}; use ctor::ctor; use frida_gum::{interceptor::Interceptor, Error, Gum, Module, NativePointer}; use futures::{SinkExt, StreamExt}; -use k8s_openapi::api::core::v1::Pod; -use kube::{ - api::{Api, Portforwarder, PostParams}, - runtime::wait::{await_condition, conditions::is_pod_running}, - Client, -}; +use kube::api::Portforwarder; use lazy_static::lazy_static; use libc::{c_char, c_void, sockaddr, socklen_t}; use mirrord_protocol::{ClientCodec, ClientMessage, DaemonMessage}; -use multi_map::MultiMap; use os_socketaddr::OsSocketAddr; -use queues::{IsQueue, Queue}; -use rand::distributions::{Alphanumeric, DistString}; -use serde_json::json; -use socketpair::{socketpair_stream, SocketpairStream}; use tokio::{ runtime::Runtime, select, @@ -36,50 +17,33 @@ use tokio::{ }; use tracing::{debug, error}; -struct ConnectionSocket { - read_fd: i32, - read_socket: SocketpairStream, - real_read_socket_fd: i32, - write_socket: SocketpairStream, - port: u16, -} - -struct DataSocket { - connection_id: u16, - #[allow(dead_code)] - read_socket: SocketpairStream, // Though this is unread, it's necessary to keep the socket open - write_socket: SocketpairStream, -} +mod pod_api; +mod sockets; lazy_static! { static ref GUM: Gum = unsafe { Gum::obtain() }; static ref RUNTIME: Runtime = Runtime::new().unwrap(); - static ref CONNECTION_SOCKETS: Mutex> = - Mutex::new(MultiMap::new()); - static ref DATA_SOCKETS_BY_CONNECTION_ID: Mutex> = Mutex::new(HashMap::new()); - static ref CONNECTION_QUEUE: Mutex> = Mutex::new(Queue::new()); - static ref SENDER: Mutex>> = Mutex::new(None); // TODO: Check OnceCell - static ref PENDING_DATA: Mutex>> = Mutex::new(HashMap::new()); + static ref SOCKETS: sockets::Sockets = sockets::Sockets::default(); + static ref NEW_CONNECTION_SENDER: Mutex>> = Mutex::new(None); } -unsafe extern "C" fn socket_detour(domain: i32, socket_type: i32, protocol: i32) -> i32 { - debug!("socket called"); - let (write_socket, read_socket) = socketpair_stream().unwrap(); - let read_fd = read_socket.as_raw_fd(); - let socket = ConnectionSocket { - read_fd, - read_socket, - real_read_socket_fd: libc::socket(domain, socket_type, protocol), - write_socket, - port: 0, - }; +#[ctor] +fn init() { + tracing_subscriber::fmt() + .with_max_level(tracing::Level::DEBUG) + .init(); + debug!("init called"); - CONNECTION_SOCKETS - .lock() - .unwrap() - .insert(read_fd, 0, socket); + let pf = RUNTIME.block_on(pod_api::create_agent()); + let (sender, receiver) = channel::(1000); + *NEW_CONNECTION_SENDER.lock().unwrap() = Some(sender); + enable_hooks(); + RUNTIME.spawn(poll_agent(pf, receiver)); +} - read_fd +unsafe extern "C" fn socket_detour(_domain: i32, _socket_type: i32, _protocol: i32) -> i32 { + debug!("socket called"); + SOCKETS.create_socket() } unsafe extern "C" fn bind_detour(sockfd: i32, addr: *const sockaddr, addrlen: socklen_t) -> i32 { @@ -87,57 +51,33 @@ unsafe extern "C" fn bind_detour(sockfd: i32, addr: *const sockaddr, addrlen: so let parsed_addr = OsSocketAddr::from_raw_parts(addr as *const u8, addrlen as usize) .into_addr() .unwrap(); - let port = parsed_addr.port(); - let mut sockets = CONNECTION_SOCKETS.lock().unwrap(); - if let Some(mut socket) = sockets.remove(&sockfd) { - socket.port = port; - sockets.insert(sockfd, port, socket); - - 0 - } else { - error!("No socket found for fd: {}", sockfd); - -1 - } -} - -unsafe extern "C" fn connect_detour(sockfd: i32, addr: *const sockaddr, addrlen: socklen_t) -> i32 { - // Map port to fd - debug!("Called connect"); - let real_fd = match CONNECTION_SOCKETS.lock().unwrap().get(&sockfd) { - Some(s) => s.real_read_socket_fd, - None => { - println!("No socket found for fd: {}", sockfd); - return -1; - } - }; - - libc::connect(real_fd, addr, addrlen) + SOCKETS.convert_to_connection_socket(sockfd, parsed_addr); + 0 } unsafe extern "C" fn listen_detour(sockfd: i32, _backlog: i32) -> i32 { debug!("listen called"); - let mut sockets = CONNECTION_SOCKETS.lock().unwrap(); - - if let Some(socket) = sockets.remove(&sockfd) { - let lock = SENDER.lock().unwrap(); - let send = lock.as_ref(); - send.unwrap().blocking_send(socket.port).unwrap(); - sockets.insert(sockfd, socket.port, socket); - 0 - } else { - error!("No socket found for fd: {}", sockfd); - -1 + match SOCKETS.set_connection_state(sockfd, sockets::ConnectionState::Listening) { + Ok(()) => { + let sender = NEW_CONNECTION_SENDER.lock().unwrap(); + sender.as_ref().unwrap().blocking_send(sockfd).unwrap(); // Tell main thread to subscribe to agent + 0 + } + Err(()) => { + error!("Failed to set connection state to listening"); + -1 + } } } unsafe extern "C" fn getpeername_detour( - _sockfd: i32, + sockfd: i32, addr: *mut sockaddr, addrlen: *mut socklen_t, ) -> i32 { - let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080); + let socket_addr = SOCKETS.get_data_socket_address(sockfd).unwrap(); let os_addr: OsSocketAddr = socket_addr.into(); let len = std::cmp::min(*addrlen as usize, os_addr.len() as usize); std::ptr::copy_nonoverlapping(os_addr.as_ptr() as *const u8, addr as *mut u8, len); @@ -165,49 +105,16 @@ unsafe extern "C" fn accept_detour( "Accept called with sockfd {:?}, addr {:?}, addrlen {:?}", &sockfd, &addr, &addrlen ); + let socket_addr = SOCKETS.get_connection_socket_address(sockfd).unwrap(); if !addr.is_null() { debug!("received non-null address in accept"); - let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080); let os_addr: OsSocketAddr = socket_addr.into(); std::ptr::copy_nonoverlapping(os_addr.as_ptr(), addr, os_addr.len() as usize); } - let connection_id; - let mut sockets = CONNECTION_SOCKETS.lock().unwrap(); - - if let Some(mut socket) = sockets.remove(&sockfd) { - let mut buffer = [0; 1]; - socket.read_socket.read_exact(&mut buffer).unwrap(); - connection_id = CONNECTION_QUEUE.lock().unwrap().remove().unwrap(); - sockets.insert(sockfd, socket.port, socket); - } else { - error!("No socket found for fd: {}", sockfd); - return -1; - } - let (read_socket, mut write_socket) = socketpair_stream().unwrap(); - let read_fd = read_socket.as_raw_fd(); - debug!( - "Accepted connection from read_fd:{:?}, write_sock:{:?}", - read_fd, write_socket - ); - - if let Some(data) = PENDING_DATA.lock().unwrap().remove(&connection_id) { - debug!("writing pending data for connection_id: {}", connection_id); - write_socket.write_all(&data).unwrap(); - } - - let data_socket = DataSocket { - connection_id, - read_socket, - write_socket, - }; - DATA_SOCKETS_BY_CONNECTION_ID - .lock() - .unwrap() - .insert(connection_id, data_socket); - - read_fd + let connection_id = SOCKETS.read_single_connection(sockfd); + SOCKETS.create_data_socket(connection_id, socket_addr) } unsafe extern "C" fn accept4_detour( @@ -219,100 +126,17 @@ unsafe extern "C" fn accept4_detour( accept_detour(sockfd, addr, addrlen) } -async fn create_agent() -> Portforwarder { - // Create Agent - let client = Client::try_default().await.unwrap(); - let pods: Api = Api::namespaced(client, "default"); - let pod = pods - .get(&env::var("MIRRORD_IMPERSONATED_POD_NAME").unwrap()) - .await - .unwrap(); - let node_name = &pod.spec.unwrap().node_name; - let container_statuses = pod.status.unwrap().container_statuses.unwrap(); - let container_id = container_statuses - .first() - .unwrap() - .container_id - .as_ref() - .unwrap() - .split("//") - .last() - .unwrap(); - let agent_pod_name = format!( - "mirrord-agent-{}", - Alphanumeric - .sample_string(&mut rand::thread_rng(), 10) - .to_lowercase() - ); - - let agent_pod: Pod = serde_json::from_value(json!({ - "metadata": { - "name": agent_pod_name - }, - "spec": { - "hostPID": true, - "nodeName": node_name, - "restartPolicy": "Never", - "volumes": [ - { - "name": "containerd", - "hostPath": { - "path": "/run/containerd/containerd.sock" - } - } - ], - "containers": [ - { - "name": "mirrord-agent", - "image": "ghcr.io/metalbear-co/mirrord-agent:2.0.0-alpha-3", - "imagePullPolicy": "Always", - "securityContext": { - "privileged": true - }, - "volumeMounts": [ - { - "mountPath": "/run/containerd/containerd.sock", - "name": "containerd" - } - ], - "command": [ - "./mirrord-agent", - "--container-id", - container_id, - "-t", - "60" - ], - "env": [{"name": "RUST_LOG", "value": "trace"}], - } - ] - } - })) - .unwrap(); - pods.create(&PostParams::default(), &agent_pod) - .await - .unwrap(); - - // Wait until the pod is running, otherwise we get 500 error. - let running = await_condition(pods.clone(), &agent_pod_name, is_pod_running()); - let _ = tokio::time::timeout(std::time::Duration::from_secs(15), running) - .await - .unwrap(); - let pf = pods.portforward(&agent_pod_name, &[61337]).await.unwrap(); - - pf -} - -async fn poll_agent(mut pf: Portforwarder, mut receiver: Receiver) { +async fn poll_agent(mut pf: Portforwarder, mut receiver: Receiver) { let port = pf.take_stream(61337).unwrap(); // TODO: Make port configurable let mut codec = actix_codec::Framed::new(port, ClientCodec::new()); - thread::sleep(Duration::from_millis(5000)); loop { select! { message = receiver.recv() => { match message { - Some(message) => { - debug!("send message to client {:?}", &message); - codec.send(ClientMessage::PortSubscribe(vec![message])).await.unwrap(); + Some(sockfd) => { + let port = SOCKETS.get_connection_socket_address(sockfd).unwrap().port(); + debug!("send message to client {:?}", port); + codec.send(ClientMessage::PortSubscribe(vec![port])).await.unwrap(); } None => { debug!("NONE in recv"); @@ -323,36 +147,14 @@ async fn poll_agent(mut pf: Portforwarder, mut receiver: Receiver) { message = codec.next() => { match message { Some(Ok(DaemonMessage::NewTCPConnection(conn))) => { - let mut sockets = CONNECTION_SOCKETS.lock().unwrap(); - if let Some(mut socket) = sockets.remove_alt(&conn.port) { - debug!("new connection id: {:?}", &conn.connection_id); - write!(socket.write_socket, "a").unwrap(); - CONNECTION_QUEUE.lock().unwrap().add(conn.connection_id).unwrap(); - sockets.insert(socket.read_fd, socket.port, socket); - } - else - { - error!("No socket found for port: {}", conn.port); - break - } + SOCKETS.open_connection(conn.connection_id, conn.port); } Some(Ok(DaemonMessage::TCPData(d))) => { // Write to socket - need to find it in OPEN_CONNECTION_SOCKETS by conn_id - let mut sockets = DATA_SOCKETS_BY_CONNECTION_ID.lock().unwrap(); - if let Some(mut socket) = sockets.remove(&d.connection_id) { - socket.write_socket.write_all(&d.data).unwrap(); - sockets.insert(socket.connection_id, socket); - } - else - { - // Not necessarily an error - sometime the TCPData message is handled before NewTcpConnection - debug!("No socket found for connection_id: {}", d.connection_id); - PENDING_DATA.lock().unwrap().insert(d.connection_id, d.data); - continue - } + SOCKETS.write_data(d.connection_id, d.data); } Some(Ok(DaemonMessage::TCPClose(d))) => { - DATA_SOCKETS_BY_CONNECTION_ID.lock().unwrap().remove(&d.connection_id).unwrap(); + SOCKETS.close_connection(d.connection_id) } Some(_) => { debug!("NONE in some"); @@ -369,20 +171,6 @@ async fn poll_agent(mut pf: Portforwarder, mut receiver: Receiver) { } } -#[ctor] -fn init() { - tracing_subscriber::fmt() - .with_max_level(tracing::Level::DEBUG) - .init(); - debug!("init called"); - - let pf = RUNTIME.block_on(create_agent()); - let (sender, receiver) = channel::(1000); - *SENDER.lock().unwrap() = Some(sender); - enable_hooks(); - RUNTIME.spawn(poll_agent(pf, receiver)); -} - macro_rules! hook { ($interceptor:expr, $func:expr, $detour_name:expr) => { $interceptor @@ -421,7 +209,6 @@ fn enable_hooks() { let mut interceptor = Interceptor::obtain(&GUM); hook!(interceptor, "socket", socket_detour); hook!(interceptor, "bind", bind_detour); - hook!(interceptor, "connect", connect_detour); hook!(interceptor, "listen", listen_detour); hook!(interceptor, "getpeername", getpeername_detour); hook!(interceptor, "setsockopt", setsockopt_detour); diff --git a/mirrord-layer/src/pod_api.rs b/mirrord-layer/src/pod_api.rs new file mode 100644 index 00000000000..9d17aef6ddb --- /dev/null +++ b/mirrord-layer/src/pod_api.rs @@ -0,0 +1,91 @@ +use k8s_openapi::api::core::v1::Pod; +use kube::{ + api::{Api, Portforwarder, PostParams}, + runtime::wait::{await_condition, conditions::is_pod_running}, + Client, +}; +use rand::distributions::{Alphanumeric, DistString}; +use serde_json::json; +#[path = "config.rs"] +mod config; +use config::CONFIG; + +pub async fn create_agent() -> Portforwarder { + // Create Agent + let client = Client::try_default().await.unwrap(); + let pods: Api = Api::namespaced(client, "default"); + let pod = pods.get(&CONFIG.impersonated_pod_name).await.unwrap(); + let node_name = &pod.spec.unwrap().node_name; + let container_statuses = pod.status.unwrap().container_statuses.unwrap(); + let container_id = container_statuses + .first() + .unwrap() + .container_id + .as_ref() + .unwrap() + .split("//") + .last() + .unwrap(); + let agent_pod_name = format!( + "mirrord-agent-{}", + Alphanumeric + .sample_string(&mut rand::thread_rng(), 10) + .to_lowercase() + ); + + let agent_pod: Pod = serde_json::from_value(json!({ + "metadata": { + "name": agent_pod_name + }, + "spec": { + "hostPID": true, + "nodeName": node_name, + "restartPolicy": "Never", + "volumes": [ + { + "name": "containerd", + "hostPath": { + "path": "/run/containerd/containerd.sock" + } + } + ], + "containers": [ + { + "name": "mirrord-agent", + "image": "ghcr.io/metalbear-co/mirrord-agent:2.0.0-alpha-3", + "imagePullPolicy": "Always", + "securityContext": { + "privileged": true + }, + "volumeMounts": [ + { + "mountPath": "/run/containerd/containerd.sock", + "name": "containerd" + } + ], + "command": [ + "./mirrord-agent", + "--container-id", + container_id, + "-t", + "60" + ], + "env": [{"name": "RUST_LOG", "value": CONFIG.agent_rust_log}], + } + ] + } + })) + .unwrap(); + pods.create(&PostParams::default(), &agent_pod) + .await + .unwrap(); + + // Wait until the pod is running, otherwise we get 500 error. + let running = await_condition(pods.clone(), &agent_pod_name, is_pod_running()); + let _ = tokio::time::timeout(std::time::Duration::from_secs(15), running) + .await + .unwrap(); + let pf = pods.portforward(&agent_pod_name, &[61337]).await.unwrap(); + + pf +} diff --git a/mirrord-layer/src/sockets.rs b/mirrord-layer/src/sockets.rs new file mode 100644 index 00000000000..686dbbe4594 --- /dev/null +++ b/mirrord-layer/src/sockets.rs @@ -0,0 +1,240 @@ +use std::{ + collections::HashMap, + io::{Read, Write}, + net::SocketAddr, + os::unix::io::AsRawFd, + sync::Mutex, +}; + +use multi_map::MultiMap; +use queues::{IsQueue, Queue}; +use socketpair::{socketpair_stream, SocketpairStream}; +use tracing::{debug, error}; + +pub struct Socket { + pub read_fd: SockFd, + pub read_socket: SocketpairStream, + pub write_socket: SocketpairStream, +} + +pub struct ConnectionSocket { + pub read_fd: SockFd, + pub read_socket: SocketpairStream, + pub write_socket: SocketpairStream, + pub address: SocketAddr, + pub state: ConnectionState, +} + +#[derive(PartialEq)] +pub enum ConnectionState { + Bound, + Listening, +} + +pub struct DataSocket { + pub connection_id: ConnectionId, + #[allow(dead_code)] + pub read_socket: SocketpairStream, /* Though this is unread, it's necessary to keep the + * socket open */ + pub write_socket: SocketpairStream, + pub address: SocketAddr, +} + +type SockFd = i32; +type Port = u16; +type ConnectionId = u16; +type TCPBuffer = Vec; + +pub struct Sockets { + new_sockets: Mutex>, + connections: Mutex>, + data: Mutex>, + connection_queues: Mutex>>, /* Used to enqueue incoming + * connection + * ids from the + * agent, to be read in the + * 'accept' + * call */ + pending_data: Mutex>, /* Used to store data that arrived + * before its + * connection was opened. When the + * connection is + * later opened, pending_data is read + * and + * emptied. */ +} + +impl Default for Sockets { + fn default() -> Self { + Self { + new_sockets: Mutex::new(HashMap::new()), + connections: Mutex::new(MultiMap::new()), + data: Mutex::new(MultiMap::new()), + connection_queues: Mutex::new(HashMap::new()), + pending_data: Mutex::new(HashMap::new()), + } + } +} + +impl Sockets { + pub fn create_socket(&self) -> SockFd { + let (write_socket, read_socket) = socketpair_stream().unwrap(); + let read_fd = read_socket.as_raw_fd(); + let socket = Socket { + read_fd, + read_socket, + write_socket, + }; + + self.new_sockets.lock().unwrap().insert(read_fd, socket); + + read_fd + } + + pub fn convert_to_connection_socket(&self, sockfd: SockFd, address: SocketAddr) { + let mut sockets = self.new_sockets.lock().unwrap(); + + // let mut sockets = self.connections.lock().unwrap(); + if let Some(socket) = sockets.remove(&sockfd) { + // socket.port = port; + self.connections.lock().unwrap().insert( + sockfd, + address.port(), + ConnectionSocket { + read_fd: socket.read_fd, + read_socket: socket.read_socket, + write_socket: socket.write_socket, + address, + state: ConnectionState::Bound, + }, + ); + } else { + error!("No socket found for fd: {}", sockfd); + } + } + + pub fn set_connection_state(&self, sockfd: SockFd, state: ConnectionState) -> Result<(), ()> { + let mut connections = self.connections.lock().unwrap(); + if let Some(connection) = connections.get_mut(&sockfd) { + if connection.state != state { + connection.state = state; + Ok(()) + } else { + error!("No connection found for fd: {}", sockfd); + Err(()) + } + } else { + error!("No connection found for fd: {}", sockfd); + Err(()) + } + } + + pub fn get_connection_socket_address(&self, sockfd: SockFd) -> Option { + let sockets = self.connections.lock().unwrap(); + sockets.get(&sockfd).map(|socket| socket.address) + } + + pub fn get_data_socket_address(&self, sockfd: SockFd) -> Option { + let sockets = self.data.lock().unwrap(); + sockets.get(&sockfd).map(|socket| socket.address) + } + + pub fn read_single_connection(&self, sockfd: SockFd) -> ConnectionId { + let mut sockets = self.connections.lock().unwrap(); + + if let Some(mut socket) = sockets.remove(&sockfd) { + let mut buffer = [0; 1]; + socket.read_socket.read_exact(&mut buffer).unwrap(); + sockets.insert(sockfd, socket.address.port(), socket); + let mut queues = self.connection_queues.lock().unwrap(); + let queue = queues.get_mut(&sockfd).unwrap(); + queue.remove().unwrap() + } else { + error!("No socket found for fd: {}", sockfd); + 0 + } + } + + pub fn open_connection(&self, connection_id: ConnectionId, port: Port) { + let mut connections = self.connections.lock().unwrap(); + if let Some(mut socket) = connections.remove_alt(&port) { + debug!("new connection id: {:?}", connection_id); + let mut queues = self.connection_queues.lock().unwrap(); + match queues.get_mut(&socket.read_fd) { + Some(queue) => { + queue.add(connection_id).unwrap(); + } + None => { + let mut queue = Queue::new(); + queue.add(connection_id).unwrap(); + queues.insert(socket.read_fd, queue); + } + } + + write!(socket.write_socket, "a").unwrap(); // Need to write one byte per incoming connection, hence "a" + connections.insert(socket.read_fd, socket.address.port(), socket); + } else { + error!("No socket found for port: {}", port); + } + } + + pub fn create_data_socket(&self, connection_id: ConnectionId, address: SocketAddr) -> SockFd { + let (read_socket, mut write_socket) = socketpair_stream().unwrap(); + let read_fd = read_socket.as_raw_fd(); + debug!( + "Accepted connection from read_fd:{:?}, write_sock:{:?}", + read_fd, write_socket + ); + + if let Some(data) = self.pending_data.lock().unwrap().remove(&connection_id) { + debug!("writing pending data for connection_id: {}", connection_id); + write_socket.write_all(&data).unwrap(); + } + let read_fd = read_socket.as_raw_fd(); + let data_socket = DataSocket { + connection_id, + read_socket, + write_socket, + address, + }; + self.data + .lock() + .unwrap() + .insert(read_fd, connection_id, data_socket); + read_fd + } + + pub fn write_data(&self, connection_id: ConnectionId, data: TCPBuffer) { + let mut sockets = self.data.lock().unwrap(); + if let Some(mut socket) = sockets.remove_alt(&connection_id) { + socket.write_socket.write_all(&data).unwrap(); + clear_data(&mut socket.write_socket); // clear HTTP response data that the app wrote to this socket + sockets.insert(socket.read_socket.as_raw_fd(), socket.connection_id, socket); + } else { + // Not necessarily an error - sometime the TCPData message is handled before + // NewTcpConnection + debug!("No socket found for connection_id: {}", connection_id); + self.pending_data + .lock() + .unwrap() + .insert(connection_id, data); + } + } + + pub fn close_connection(&self, connection_id: ConnectionId) { + self.data + .lock() + .unwrap() + .remove_alt(&connection_id) + .unwrap(); + } +} + +fn clear_data(socket: &mut SocketpairStream) { + let num_ready_bytes = socket.num_ready_bytes().unwrap(); + let mut buffer = Vec::with_capacity(num_ready_bytes as usize); + socket + .take(num_ready_bytes) + .read_to_end(&mut buffer) + .unwrap(); +} diff --git a/sample/app.js b/sample/app.js index 9a52dda889f..52999fcde66 100644 --- a/sample/app.js +++ b/sample/app.js @@ -12,7 +12,7 @@ function handleConnection(conn) { conn.on('error', onConnError); function onConnData(d) { - console.log('connection data from %s: %j', remoteAddress, d); + console.log('connection data from %s: %j', remoteAddress, d.toString()); conn.write(d); } function onConnClose() { From 6efa11f64daadd053f4a9d8cb775294cd9b838da Mon Sep 17 00:00:00 2001 From: Aviram Hassan Date: Thu, 5 May 2022 21:49:10 +0300 Subject: [PATCH 06/40] add mirrord-cli add .cargo/config.toml to allow cargo tools to run after bindeps feature --- .cargo/config.toml | 2 + Cargo.lock | 44 +++++++++++++++++ Cargo.toml | 1 + mirrord-cli/CHANGELOG.md | 1 + mirrord-cli/Cargo.toml | 14 ++++++ mirrord-cli/LICENSE | 7 +++ mirrord-cli/README.md | 36 ++++++++++++++ mirrord-cli/src/main.rs | 103 +++++++++++++++++++++++++++++++++++++++ mirrord-layer/Cargo.toml | 3 +- rust-toolchain.toml | 2 + 10 files changed, 211 insertions(+), 2 deletions(-) create mode 100644 .cargo/config.toml create mode 100644 mirrord-cli/CHANGELOG.md create mode 100644 mirrord-cli/Cargo.toml create mode 100644 mirrord-cli/LICENSE create mode 100644 mirrord-cli/README.md create mode 100644 mirrord-cli/src/main.rs create mode 100644 rust-toolchain.toml diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 00000000000..9585a2a0fec --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[unstable] +bindeps = true \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 536d724b702..db9e0ab1c83 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -536,6 +536,16 @@ dependencies = [ "libc", ] +[[package]] +name = "exec" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "886b70328cba8871bfc025858e1de4be16b1d5088f2ba50b57816f4210672615" +dependencies = [ + "errno", + "libc", +] + [[package]] name = "fastrand" version = "1.7.0" @@ -1228,6 +1238,15 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata", +] + [[package]] name = "matches" version = "0.1.9" @@ -1278,6 +1297,18 @@ dependencies = [ "winapi", ] +[[package]] +name = "mirrord" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap 3.1.15", + "exec", + "mirrord-layer", + "tracing", + "tracing-subscriber", +] + [[package]] name = "mirrord-agent" version = "2.0.0-alpha-3" @@ -2001,6 +2032,15 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax", +] + [[package]] name = "regex-syntax" version = "0.6.25" @@ -2774,9 +2814,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596" dependencies = [ "ansi_term", + "lazy_static", + "matchers", + "regex", "sharded-slab", "smallvec", "thread_local", + "tracing", "tracing-core", "tracing-log", ] diff --git a/Cargo.toml b/Cargo.toml index 27380f391cc..6b741c6de78 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,4 +4,5 @@ members = [ "mirrord-protocol", "mirrord-agent", "mirrord-layer", + "mirrord-cli", ] \ No newline at end of file diff --git a/mirrord-cli/CHANGELOG.md b/mirrord-cli/CHANGELOG.md new file mode 100644 index 00000000000..701cd4c90c5 --- /dev/null +++ b/mirrord-cli/CHANGELOG.md @@ -0,0 +1 @@ +## [Unreleased] diff --git a/mirrord-cli/Cargo.toml b/mirrord-cli/Cargo.toml new file mode 100644 index 00000000000..a0414adf8b7 --- /dev/null +++ b/mirrord-cli/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "mirrord" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +clap = { version = "3", features = ["derive"] } +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } +mirrord-layer = { artifact = "cdylib", version = "0.1", path="../mirrord-layer" } +exec = "0.3" +anyhow = "1" \ No newline at end of file diff --git a/mirrord-cli/LICENSE b/mirrord-cli/LICENSE new file mode 100644 index 00000000000..52b758d77b9 --- /dev/null +++ b/mirrord-cli/LICENSE @@ -0,0 +1,7 @@ +Copyright 2022 Metalbear.co + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/mirrord-cli/README.md b/mirrord-cli/README.md new file mode 100644 index 00000000000..2107048cf1b --- /dev/null +++ b/mirrord-cli/README.md @@ -0,0 +1,36 @@ +# mirrord-cli +mirrord-cli is the actual binary that users use to run mirrord. The client helps you execute processes with mirrord injected to it. +Right now injection is done using `LD_PRELOAD` on Linux and `DYLD_INSERT_LIBRARIES` on macOS. + +## Usage +`mirrord exec --pod-name [BINARY_ARGS..]` + +## Compatibility +### Linux +`LD_PRELOAD` works only on dynamically linked binaries, so static binaries won't work. Most development use cases are dynamic binaries, so it should be okay. +We do have plan to support static binaries, so let us know if you encountered a use case that isn't covered. + +### macOS +`DYLD_INSERT_LIBRARIES` works on "unprotected" binaries, which are most development binaries anyway. To be more specific, the following use cases won't work: + +* setuid and/or setgid bits are set +* restricted by entitlements +* restricted segment + +[Source](https://theevilbit.github.io/posts/dyld_insert_libraries_dylib_injection_in_macos_osx_deep_dive/) + +Please let us know if you encountered a use case where it doesn't work for you, of whether it's documented that it isn't supported, so we know there's demand to implement that use case. + + +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Contributing +Anyone is welcome to contribute. Please feel free to create PRs with proper documentation, formatting and changelog record. + +## License + +mirrord-cli is MIT licensed. \ No newline at end of file diff --git a/mirrord-cli/src/main.rs b/mirrord-cli/src/main.rs new file mode 100644 index 00000000000..bd5f1ce0b38 --- /dev/null +++ b/mirrord-cli/src/main.rs @@ -0,0 +1,103 @@ +use std::{env::temp_dir, fs::File, io::Write}; + +use anyhow::{anyhow, Result}; +use clap::{Args, Parser, Subcommand}; +use exec::execvp; +use tracing::{debug, error, info}; +use tracing_subscriber::{fmt, prelude::*, registry, EnvFilter}; + +#[derive(Parser)] +#[clap(author, version, about, long_about = None)] +struct Cli { + #[clap(subcommand)] + commands: Commands, +} + +#[derive(Subcommand)] +enum Commands { + Exec(ExecArgs), + Extract { path: String }, +} + +#[derive(Args, Debug)] +struct ExecArgs { + /// Pod name to mirror. + #[clap(short, long)] + pub pod_name: String, + + /// Binary to execute and mirror traffic into. + #[clap()] + pub binary: String, + + /// Arguments to pass to the binary. + #[clap()] + binary_args: Vec, +} + +#[cfg(target_os = "linux")] +const INJECTION_ENV_VAR: &str = "LD_PRELOAD"; + +#[cfg(target_os = "macos")] +const INJECTION_ENV_VAR: &str = "DYLD_INSERT_LIBRARIES"; + +fn extract_library(dest_dir: Option) -> String { + let library_file = env!("CARGO_CDYLIB_FILE_MIRRORD_LAYER"); + let library_path = std::path::Path::new(library_file); + let file_name = library_path.components().last().unwrap(); + let file_path = match dest_dir { + Some(dest_dir) => std::path::Path::new(&dest_dir).join(file_name), + None => temp_dir().as_path().join(file_name), + }; + let mut file = File::create(file_path.clone()).unwrap(); + let bytes = include_bytes!(env!("CARGO_CDYLIB_FILE_MIRRORD_LAYER")); + file.write_all(bytes).unwrap(); + debug!("Extracted library file to {:?}", &file_path); + file_path.to_str().unwrap().to_string() +} + +fn add_to_preload(path: &str) -> Result<()> { + match std::env::var(INJECTION_ENV_VAR) { + Ok(value) => { + let new_value = format!("{}:{}", value, path); + std::env::set_var(INJECTION_ENV_VAR, new_value); + Ok(()) + } + Err(std::env::VarError::NotPresent) => { + std::env::set_var(INJECTION_ENV_VAR, path); + Ok(()) + } + Err(e) => { + error!("Failed to set environment variable with error {:?}", e); + Err(anyhow!("Failed to set environment variable")) + } + } +} + +fn exec(args: &ExecArgs) -> Result<()> { + info!( + "Launching {:?} with arguments {:?}", + args.binary, args.binary_args + ); + std::env::set_var("MIRRORD_IMPERSONATED_POD_NAME", args.pod_name.clone()); + let library_path = extract_library(None); + add_to_preload(&library_path).unwrap(); + let mut binary_args = args.binary_args.clone(); + binary_args.insert(0, args.binary.clone()); + let err = execvp(args.binary.clone(), binary_args); + error!("Couldn't execute {:?}", err); + Err(anyhow!("Failed to execute binary")) +} + +fn main() { + registry() + .with(fmt::layer()) + .with(EnvFilter::from_default_env()) + .init(); + let cli = Cli::parse(); + match cli.commands { + Commands::Exec(args) => exec(&args).unwrap(), + Commands::Extract { path } => { + extract_library(Some(path)); + } + } +} diff --git a/mirrord-layer/Cargo.toml b/mirrord-layer/Cargo.toml index db06e12e5a1..1cc68cf8959 100644 --- a/mirrord-layer/Cargo.toml +++ b/mirrord-layer/Cargo.toml @@ -36,5 +36,4 @@ multi-map = "1.3.0" envconfig = "0.10.0" [lib] -name = "mirrord" -crate_type = ["dylib"] +crate_type = ["cdylib"] diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 00000000000..271800cb2f3 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "nightly" \ No newline at end of file From eeaf019ffcfdaa8a5bcb77f2047f798fc7210d12 Mon Sep 17 00:00:00 2001 From: Aviram Date: Sun, 8 May 2022 10:34:15 +0300 Subject: [PATCH 07/40] mirrord-agent: Dockerfile use nightly fix --- mirrord-agent/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mirrord-agent/Dockerfile b/mirrord-agent/Dockerfile index d1502a6db7d..6a3b2049c88 100644 --- a/mirrord-agent/Dockerfile +++ b/mirrord-agent/Dockerfile @@ -1,6 +1,6 @@ FROM rust:latest as build-env RUN apt update && apt install -y libpcap-dev cmake -RUN rustup component add rustfmt +RUN rustup toolchain install nightly --component rustfmt WORKDIR /app COPY . /app RUN cargo build --manifest-path mirrord-agent/Cargo.toml --release From aca7d88ecee8ca5812a6842a4600b20353ff66e5 Mon Sep 17 00:00:00 2001 From: Aviram Date: Mon, 9 May 2022 13:39:11 +0300 Subject: [PATCH 08/40] switch to nightly --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f81f7b674e4..5ae7ab15531 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -15,7 +15,7 @@ jobs: - uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: stable + toolchain: nightly components: rustfmt, clippy # Needed for agent - run: sudo apt install libpcap-dev cmake From a16967ca1e2a170518745eb3fbfa921fa10dc5a7 Mon Sep 17 00:00:00 2001 From: Aviram Date: Mon, 9 May 2022 14:43:02 +0300 Subject: [PATCH 09/40] mirrord-cli + layer: support different namespace than default for agent pod and impersonated pod --- mirrord-cli/src/main.rs | 24 +++++++++++++ mirrord-layer/src/config.rs | 9 ++--- mirrord-layer/src/lib.rs | 12 +++++-- mirrord-layer/src/pod_api.rs | 70 +++++++++++++++++++++++------------- 4 files changed, 85 insertions(+), 30 deletions(-) diff --git a/mirrord-cli/src/main.rs b/mirrord-cli/src/main.rs index bd5f1ce0b38..86462730ab4 100644 --- a/mirrord-cli/src/main.rs +++ b/mirrord-cli/src/main.rs @@ -25,6 +25,18 @@ struct ExecArgs { #[clap(short, long)] pub pod_name: String, + /// Namespace of the pod to mirror. Defaults to "default". + #[clap(short = 'n', long)] + pub pod_namespace: Option, + + /// Namespace to place agent in. + #[clap(short = 'a', long)] + pub agent_namespace: Option, + + /// Agent log level + #[clap(short = 'l', long)] + pub agent_log_level: Option, + /// Binary to execute and mirror traffic into. #[clap()] pub binary: String, @@ -79,6 +91,18 @@ fn exec(args: &ExecArgs) -> Result<()> { args.binary, args.binary_args ); std::env::set_var("MIRRORD_IMPERSONATED_POD_NAME", args.pod_name.clone()); + if let Some(namespace) = &args.pod_namespace { + std::env::set_var( + "MIRRORD_AGENT_IMPERSONATED_POD_NAMESPACE", + namespace.clone(), + ); + } + if let Some(namespace) = &args.agent_namespace { + std::env::set_var("MIRRORD_AGENT_NAMESPACE", namespace.clone()); + } + if let Some(log_level) = &args.agent_log_level { + std::env::set_var("MIRRORD_AGENT_RUST_LOG", log_level.clone()); + } let library_path = extract_library(None); add_to_preload(&library_path).unwrap(); let mut binary_args = args.binary_args.clone(); diff --git a/mirrord-layer/src/config.rs b/mirrord-layer/src/config.rs index 20189493c2c..e998b5473e6 100644 --- a/mirrord-layer/src/config.rs +++ b/mirrord-layer/src/config.rs @@ -1,15 +1,16 @@ use envconfig::Envconfig; -use lazy_static::lazy_static; #[derive(Envconfig)] pub struct Config { #[envconfig(from = "MIRRORD_AGENT_RUST_LOG", default = "info")] pub agent_rust_log: String, + #[envconfig(from = "MIRRORD_AGENT_NAMESPACE", default = "default")] + pub agent_namespace: String, + #[envconfig(from = "MIRRORD_AGENT_IMPERSONATED_POD_NAME")] pub impersonated_pod_name: String, -} -lazy_static! { - pub static ref CONFIG: Config = Config::init_from_env().unwrap(); + #[envconfig(from = "MIRRORD_AGENT_IMPERSONATED_POD_NAMESPACE", default = "default")] + pub impersonated_pod_namespace: String, } diff --git a/mirrord-layer/src/lib.rs b/mirrord-layer/src/lib.rs index d8108867bff..f687892fb76 100644 --- a/mirrord-layer/src/lib.rs +++ b/mirrord-layer/src/lib.rs @@ -3,6 +3,7 @@ use std::{sync::Mutex, thread, time::Duration}; use ctor::ctor; +use envconfig::Envconfig; use frida_gum::{interceptor::Interceptor, Error, Gum, Module, NativePointer}; use futures::{SinkExt, StreamExt}; use kube::api::Portforwarder; @@ -17,8 +18,10 @@ use tokio::{ }; use tracing::{debug, error}; +mod config; mod pod_api; mod sockets; +use config::Config; lazy_static! { static ref GUM: Gum = unsafe { Gum::obtain() }; @@ -33,8 +36,13 @@ fn init() { .with_max_level(tracing::Level::DEBUG) .init(); debug!("init called"); - - let pf = RUNTIME.block_on(pod_api::create_agent()); + let config = Config::init_from_env().unwrap(); + let pf = RUNTIME.block_on(pod_api::create_agent( + &config.impersonated_pod_name, + &config.impersonated_pod_namespace, + &config.agent_namespace, + config.agent_rust_log, + )); let (sender, receiver) = channel::(1000); *NEW_CONNECTION_SENDER.lock().unwrap() = Some(sender); enable_hooks(); diff --git a/mirrord-layer/src/pod_api.rs b/mirrord-layer/src/pod_api.rs index 9d17aef6ddb..0013a8b0700 100644 --- a/mirrord-layer/src/pod_api.rs +++ b/mirrord-layer/src/pod_api.rs @@ -6,26 +6,42 @@ use kube::{ }; use rand::distributions::{Alphanumeric, DistString}; use serde_json::json; -#[path = "config.rs"] -mod config; -use config::CONFIG; -pub async fn create_agent() -> Portforwarder { - // Create Agent +struct RuntimeData { + container_id: String, + node_name: String, +} + +impl RuntimeData { + async fn from_k8s(client: Client, pod_name: &str, pod_namespace: &str) -> Self { + let pods_api: Api = Api::namespaced(client, pod_namespace); + let pod = pods_api.get(pod_name).await.unwrap(); + let node_name = &pod.spec.unwrap().node_name; + let container_statuses = pod.status.unwrap().container_statuses.unwrap(); + let container_id = container_statuses + .first() + .unwrap() + .container_id + .as_ref() + .unwrap() + .split("//") + .last() + .unwrap(); + RuntimeData { + container_id: container_id.to_string(), + node_name: node_name.as_ref().unwrap().to_string(), + } + } +} + +pub async fn create_agent( + pod_name: &str, + pod_namespace: &str, + agent_namespace: &str, + log_level: String, +) -> Portforwarder { let client = Client::try_default().await.unwrap(); - let pods: Api = Api::namespaced(client, "default"); - let pod = pods.get(&CONFIG.impersonated_pod_name).await.unwrap(); - let node_name = &pod.spec.unwrap().node_name; - let container_statuses = pod.status.unwrap().container_statuses.unwrap(); - let container_id = container_statuses - .first() - .unwrap() - .container_id - .as_ref() - .unwrap() - .split("//") - .last() - .unwrap(); + let runtime_data = RuntimeData::from_k8s(client.clone(), pod_name, pod_namespace).await; let agent_pod_name = format!( "mirrord-agent-{}", Alphanumeric @@ -39,7 +55,7 @@ pub async fn create_agent() -> Portforwarder { }, "spec": { "hostPID": true, - "nodeName": node_name, + "nodeName": runtime_data.node_name, "restartPolicy": "Never", "volumes": [ { @@ -66,26 +82,32 @@ pub async fn create_agent() -> Portforwarder { "command": [ "./mirrord-agent", "--container-id", - container_id, + runtime_data.container_id, "-t", "60" ], - "env": [{"name": "RUST_LOG", "value": CONFIG.agent_rust_log}], + "env": [{"name": "RUST_LOG", "value": log_level}], } ] } })) .unwrap(); - pods.create(&PostParams::default(), &agent_pod) + + let pods_api: Api = Api::namespaced(client, agent_namespace); + pods_api + .create(&PostParams::default(), &agent_pod) .await .unwrap(); // Wait until the pod is running, otherwise we get 500 error. - let running = await_condition(pods.clone(), &agent_pod_name, is_pod_running()); + let running = await_condition(pods_api.clone(), &agent_pod_name, is_pod_running()); let _ = tokio::time::timeout(std::time::Duration::from_secs(15), running) .await .unwrap(); - let pf = pods.portforward(&agent_pod_name, &[61337]).await.unwrap(); + let pf = pods_api + .portforward(&agent_pod_name, &[61337]) + .await + .unwrap(); pf } From 6b7f9500601cf18559228030034ccf8f7c24e797 Mon Sep 17 00:00:00 2001 From: Mehul Arora Date: Mon, 9 May 2022 10:21:35 -0400 Subject: [PATCH 10/40] fix env var name --- mirrord-cli/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mirrord-cli/src/main.rs b/mirrord-cli/src/main.rs index 86462730ab4..d4a9e472bcc 100644 --- a/mirrord-cli/src/main.rs +++ b/mirrord-cli/src/main.rs @@ -90,7 +90,7 @@ fn exec(args: &ExecArgs) -> Result<()> { "Launching {:?} with arguments {:?}", args.binary, args.binary_args ); - std::env::set_var("MIRRORD_IMPERSONATED_POD_NAME", args.pod_name.clone()); + std::env::set_var("MIRRORD_AGENT_IMPERSONATED_POD_NAME", args.pod_name.clone()); if let Some(namespace) = &args.pod_namespace { std::env::set_var( "MIRRORD_AGENT_IMPERSONATED_POD_NAMESPACE", From 5de62b2efa9f3df27553c76ecc3391d3e26e8ec1 Mon Sep 17 00:00:00 2001 From: Aviram Date: Mon, 9 May 2022 17:42:31 +0300 Subject: [PATCH 11/40] add cli arg to support setting of agent image --- mirrord-cli/src/main.rs | 7 +++++++ mirrord-layer/src/config.rs | 6 ++++++ mirrord-layer/src/lib.rs | 1 + mirrord-layer/src/pod_api.rs | 3 ++- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/mirrord-cli/src/main.rs b/mirrord-cli/src/main.rs index d4a9e472bcc..229eacb7a78 100644 --- a/mirrord-cli/src/main.rs +++ b/mirrord-cli/src/main.rs @@ -37,6 +37,10 @@ struct ExecArgs { #[clap(short = 'l', long)] pub agent_log_level: Option, + /// Agent log level + #[clap(short = 'i', long)] + pub agent_image: Option, + /// Binary to execute and mirror traffic into. #[clap()] pub binary: String, @@ -103,6 +107,9 @@ fn exec(args: &ExecArgs) -> Result<()> { if let Some(log_level) = &args.agent_log_level { std::env::set_var("MIRRORD_AGENT_RUST_LOG", log_level.clone()); } + if let Some(image) = &args.agent_image { + std::env::set_var("MIRRORD_AGENT_IMAGE", image.clone()); + } let library_path = extract_library(None); add_to_preload(&library_path).unwrap(); let mut binary_args = args.binary_args.clone(); diff --git a/mirrord-layer/src/config.rs b/mirrord-layer/src/config.rs index e998b5473e6..db4fe6d3236 100644 --- a/mirrord-layer/src/config.rs +++ b/mirrord-layer/src/config.rs @@ -8,6 +8,12 @@ pub struct Config { #[envconfig(from = "MIRRORD_AGENT_NAMESPACE", default = "default")] pub agent_namespace: String, + #[envconfig( + from = "MIRRORD_AGENT_IMAGE", + default = "ghcr.io/metalbear-co/mirrord-agent:2.0.0-alpha-3" + )] + pub agent_image: String, + #[envconfig(from = "MIRRORD_AGENT_IMPERSONATED_POD_NAME")] pub impersonated_pod_name: String, diff --git a/mirrord-layer/src/lib.rs b/mirrord-layer/src/lib.rs index f687892fb76..3e62c3fae1b 100644 --- a/mirrord-layer/src/lib.rs +++ b/mirrord-layer/src/lib.rs @@ -42,6 +42,7 @@ fn init() { &config.impersonated_pod_namespace, &config.agent_namespace, config.agent_rust_log, + config.agent_image, )); let (sender, receiver) = channel::(1000); *NEW_CONNECTION_SENDER.lock().unwrap() = Some(sender); diff --git a/mirrord-layer/src/pod_api.rs b/mirrord-layer/src/pod_api.rs index 0013a8b0700..0f466c578b8 100644 --- a/mirrord-layer/src/pod_api.rs +++ b/mirrord-layer/src/pod_api.rs @@ -39,6 +39,7 @@ pub async fn create_agent( pod_namespace: &str, agent_namespace: &str, log_level: String, + agent_image: String, ) -> Portforwarder { let client = Client::try_default().await.unwrap(); let runtime_data = RuntimeData::from_k8s(client.clone(), pod_name, pod_namespace).await; @@ -68,7 +69,7 @@ pub async fn create_agent( "containers": [ { "name": "mirrord-agent", - "image": "ghcr.io/metalbear-co/mirrord-agent:2.0.0-alpha-3", + "image": agent_image, "imagePullPolicy": "Always", "securityContext": { "privileged": true From 34eb497db60a95bfb79c533a8027ab72bbf577da Mon Sep 17 00:00:00 2001 From: Mehul Arora Date: Wed, 11 May 2022 10:31:45 +0000 Subject: [PATCH 12/40] accept invalid certificates optionally --- Cargo.lock | 3 +-- Cargo.toml | 10 +++++++++- mirrord-cli/src/main.rs | 9 +++++++++ mirrord-layer/src/config.rs | 3 +++ mirrord-layer/src/pod_api.rs | 15 +++++++++++++-- 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index db9e0ab1c83..943ed03eb63 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2130,8 +2130,7 @@ dependencies = [ [[package]] name = "rustls" version = "0.20.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fbfeb8d0ddb84706bc597a5574ab8912817c52a397f819e5b614e2265206921" +source = "git+https://github.com/rustls/rustls#093e88e7e180d44eb94b6f2c30b92a89f9f0cdbe" dependencies = [ "log", "ring", diff --git a/Cargo.toml b/Cargo.toml index 6b741c6de78..836a7078c32 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,4 +5,12 @@ members = [ "mirrord-agent", "mirrord-layer", "mirrord-cli", -] \ No newline at end of file +] + +# latest commits on rustls suppress certificate verification +# https://github.com/rustls/rustls/pull/1032 +# so we patch crates.io to use the latest commits from rustls +# this should be changed once a newer version of rustls is out + +[patch.crates-io] +rustls = { git = 'https://github.com/rustls/rustls' } \ No newline at end of file diff --git a/mirrord-cli/src/main.rs b/mirrord-cli/src/main.rs index 229eacb7a78..2d994487938 100644 --- a/mirrord-cli/src/main.rs +++ b/mirrord-cli/src/main.rs @@ -45,6 +45,9 @@ struct ExecArgs { #[clap()] pub binary: String, + /// Accept/reject invalid certificates. + #[clap(parse(try_from_str), short = 'c', long)] + pub accept_invalid_certificates: Option, /// Arguments to pass to the binary. #[clap()] binary_args: Vec, @@ -110,6 +113,12 @@ fn exec(args: &ExecArgs) -> Result<()> { if let Some(image) = &args.agent_image { std::env::set_var("MIRRORD_AGENT_IMAGE", image.clone()); } + if let Some(accept_invalid_certificates) = &args.accept_invalid_certificates { + std::env::set_var( + "MIRRORD_ACCEPT_INVALID_CERTIFICATES", + accept_invalid_certificates.to_string(), + ); + } let library_path = extract_library(None); add_to_preload(&library_path).unwrap(); let mut binary_args = args.binary_args.clone(); diff --git a/mirrord-layer/src/config.rs b/mirrord-layer/src/config.rs index db4fe6d3236..6199e89e74e 100644 --- a/mirrord-layer/src/config.rs +++ b/mirrord-layer/src/config.rs @@ -19,4 +19,7 @@ pub struct Config { #[envconfig(from = "MIRRORD_AGENT_IMPERSONATED_POD_NAMESPACE", default = "default")] pub impersonated_pod_namespace: String, + + #[envconfig(from = "MIRRORD_ACCEPT_INVALID_CERTIFICATES", default = "false")] + pub accept_invalid_certificates: bool, } diff --git a/mirrord-layer/src/pod_api.rs b/mirrord-layer/src/pod_api.rs index 0f466c578b8..ee32f4a59e1 100644 --- a/mirrord-layer/src/pod_api.rs +++ b/mirrord-layer/src/pod_api.rs @@ -1,12 +1,15 @@ +use envconfig::Envconfig; use k8s_openapi::api::core::v1::Pod; use kube::{ api::{Api, Portforwarder, PostParams}, runtime::wait::{await_condition, conditions::is_pod_running}, - Client, + Client, Config, }; use rand::distributions::{Alphanumeric, DistString}; use serde_json::json; +use tracing::warn; +use crate::config; struct RuntimeData { container_id: String, node_name: String, @@ -41,7 +44,15 @@ pub async fn create_agent( log_level: String, agent_image: String, ) -> Portforwarder { - let client = Client::try_default().await.unwrap(); + let env_config = config::Config::init_from_env().unwrap(); + let client = if env_config.accept_invalid_certificates { + let mut config = Config::infer().await.unwrap(); + config.accept_invalid_certs = true; + warn!("Accepting invalid certificates"); + Client::try_from(config).unwrap() + } else { + Client::try_default().await.unwrap() + }; let runtime_data = RuntimeData::from_k8s(client.clone(), pod_name, pod_namespace).await; let agent_pod_name = format!( "mirrord-agent-{}", From cc96fefcb67dac3d28bec1be79d9cb5fd8835ed1 Mon Sep 17 00:00:00 2001 From: meowjesty Date: Tue, 10 May 2022 17:44:18 -0300 Subject: [PATCH 13/40] Use tracing_subscriber::EnvFilter to have better control over logs from env variables. Correct pod in launch.json. Fix LD_PRELOAD env variable. Empty env var for agent pod name. --- .vscode/launch.json | 8 ++++---- mirrord-layer/Cargo.toml | 2 +- mirrord-layer/src/lib.rs | 7 +++++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 7f6acbda039..e29bf84493a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -37,10 +37,10 @@ "args": ["${workspaceFolder}/sample/app.js"], "env": { - "DYLD_INSERT_LIBRARIES": "${workspaceFolder}/target/debug/libmirrord.dylib", - "LD_PRELOAD": "${workspaceFolder}/target/debug/libmirrord.so", - "RUST_LOG": "trace", - "MIRRORD_AGENT_IMPERSONATED_POD_NAME": "nginx-deployment-66b6c48dd5-xg4rq", + "DYLD_INSERT_LIBRARIES": "${workspaceFolder}/target/debug/libmirrord_layer.dylib", + "LD_PRELOAD": "${workspaceFolder}/target/debug/libmirrord_layer.so", + "RUST_LOG": "warn,mirrord=trace", + "MIRRORD_AGENT_IMPERSONATED_POD_NAME": "", "MIRRORD_AGENT_RUST_LOG": "trace", }, } diff --git a/mirrord-layer/Cargo.toml b/mirrord-layer/Cargo.toml index 1cc68cf8959..55b8d1a0423 100644 --- a/mirrord-layer/Cargo.toml +++ b/mirrord-layer/Cargo.toml @@ -16,7 +16,7 @@ socketpair = "0.15.0" tempdir = "0.3.7" tracing = "0.1" env_logger = "0.9" -tracing-subscriber = "0.3" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } frida-gum = {version = "0.6.5", features = ["auto-download"]} futures = "0.3.21" clap = { version = "3.1.12", features = ["derive"] } diff --git a/mirrord-layer/src/lib.rs b/mirrord-layer/src/lib.rs index 3e62c3fae1b..7c2ee18279b 100644 --- a/mirrord-layer/src/lib.rs +++ b/mirrord-layer/src/lib.rs @@ -22,6 +22,7 @@ mod config; mod pod_api; mod sockets; use config::Config; +use tracing_subscriber::prelude::*; lazy_static! { static ref GUM: Gum = unsafe { Gum::obtain() }; @@ -32,9 +33,11 @@ lazy_static! { #[ctor] fn init() { - tracing_subscriber::fmt() - .with_max_level(tracing::Level::DEBUG) + tracing_subscriber::registry() + .with(tracing_subscriber::fmt::layer()) + .with(tracing_subscriber::EnvFilter::from_default_env()) .init(); + debug!("init called"); let config = Config::init_from_env().unwrap(); let pf = RUNTIME.block_on(pod_api::create_agent( From 3beb0ce035dcdc66a5f9d3de392019f8db3726cc Mon Sep 17 00:00:00 2001 From: Aviram Date: Tue, 10 May 2022 11:35:05 +0300 Subject: [PATCH 14/40] refactor layout --- mirrord-layer/src/lib.rs | 131 +---------------------------------- mirrord-layer/src/macros.rs | 36 ++++++++++ mirrord-layer/src/sockets.rs | 104 +++++++++++++++++++++++++++ 3 files changed, 142 insertions(+), 129 deletions(-) create mode 100644 mirrord-layer/src/macros.rs diff --git a/mirrord-layer/src/lib.rs b/mirrord-layer/src/lib.rs index 7c2ee18279b..1bb36de0a77 100644 --- a/mirrord-layer/src/lib.rs +++ b/mirrord-layer/src/lib.rs @@ -8,9 +8,7 @@ use frida_gum::{interceptor::Interceptor, Error, Gum, Module, NativePointer}; use futures::{SinkExt, StreamExt}; use kube::api::Portforwarder; use lazy_static::lazy_static; -use libc::{c_char, c_void, sockaddr, socklen_t}; use mirrord_protocol::{ClientCodec, ClientMessage, DaemonMessage}; -use os_socketaddr::OsSocketAddr; use tokio::{ runtime::Runtime, select, @@ -19,6 +17,7 @@ use tokio::{ use tracing::{debug, error}; mod config; +mod macros; mod pod_api; mod sockets; use config::Config; @@ -53,91 +52,6 @@ fn init() { RUNTIME.spawn(poll_agent(pf, receiver)); } -unsafe extern "C" fn socket_detour(_domain: i32, _socket_type: i32, _protocol: i32) -> i32 { - debug!("socket called"); - SOCKETS.create_socket() -} - -unsafe extern "C" fn bind_detour(sockfd: i32, addr: *const sockaddr, addrlen: socklen_t) -> i32 { - debug!("bind called"); - let parsed_addr = OsSocketAddr::from_raw_parts(addr as *const u8, addrlen as usize) - .into_addr() - .unwrap(); - - SOCKETS.convert_to_connection_socket(sockfd, parsed_addr); - 0 -} - -unsafe extern "C" fn listen_detour(sockfd: i32, _backlog: i32) -> i32 { - debug!("listen called"); - - match SOCKETS.set_connection_state(sockfd, sockets::ConnectionState::Listening) { - Ok(()) => { - let sender = NEW_CONNECTION_SENDER.lock().unwrap(); - sender.as_ref().unwrap().blocking_send(sockfd).unwrap(); // Tell main thread to subscribe to agent - 0 - } - Err(()) => { - error!("Failed to set connection state to listening"); - -1 - } - } -} - -unsafe extern "C" fn getpeername_detour( - sockfd: i32, - addr: *mut sockaddr, - addrlen: *mut socklen_t, -) -> i32 { - let socket_addr = SOCKETS.get_data_socket_address(sockfd).unwrap(); - let os_addr: OsSocketAddr = socket_addr.into(); - let len = std::cmp::min(*addrlen as usize, os_addr.len() as usize); - std::ptr::copy_nonoverlapping(os_addr.as_ptr() as *const u8, addr as *mut u8, len); - - *addrlen = os_addr.len(); - 0 -} - -unsafe extern "C" fn setsockopt_detour( - _sockfd: i32, - _level: i32, - _optname: i32, - _optval: *mut c_char, - _optlen: socklen_t, -) -> i32 { - 0 -} - -unsafe extern "C" fn accept_detour( - sockfd: i32, - addr: *mut sockaddr, - addrlen: *mut socklen_t, -) -> i32 { - debug!( - "Accept called with sockfd {:?}, addr {:?}, addrlen {:?}", - &sockfd, &addr, &addrlen - ); - let socket_addr = SOCKETS.get_connection_socket_address(sockfd).unwrap(); - - if !addr.is_null() { - debug!("received non-null address in accept"); - let os_addr: OsSocketAddr = socket_addr.into(); - std::ptr::copy_nonoverlapping(os_addr.as_ptr(), addr, os_addr.len() as usize); - } - - let connection_id = SOCKETS.read_single_connection(sockfd); - SOCKETS.create_data_socket(connection_id, socket_addr) -} - -unsafe extern "C" fn accept4_detour( - sockfd: i32, - addr: *mut sockaddr, - addrlen: *mut socklen_t, - _flags: i32, -) -> i32 { - accept_detour(sockfd, addr, addrlen) -} - async fn poll_agent(mut pf: Portforwarder, mut receiver: Receiver) { let port = pf.take_stream(61337).unwrap(); // TODO: Make port configurable let mut codec = actix_codec::Framed::new(port, ClientCodec::new()); @@ -183,48 +97,7 @@ async fn poll_agent(mut pf: Portforwarder, mut receiver: Receiver) { } } -macro_rules! hook { - ($interceptor:expr, $func:expr, $detour_name:expr) => { - $interceptor - .replace( - Module::find_export_by_name(None, $func).unwrap(), - NativePointer($detour_name as *mut c_void), - NativePointer(std::ptr::null_mut::()), - ) - .unwrap(); - }; -} - -macro_rules! try_hook { - ($interceptor:expr, $func:expr, $detour_name:expr) => { - if let Some(addr) = Module::find_export_by_name(None, $func) { - match $interceptor.replace( - addr, - NativePointer($detour_name as *mut c_void), - NativePointer(std::ptr::null_mut::()), - ) { - Err(Error::InterceptorAlreadyReplaced) => { - debug!("{} already replaced", $func); - } - Err(e) => { - debug!("{} error: {:?}", $func, e); - } - Ok(_) => { - debug!("{} hooked", $func); - } - } - } - }; -} - fn enable_hooks() { let mut interceptor = Interceptor::obtain(&GUM); - hook!(interceptor, "socket", socket_detour); - hook!(interceptor, "bind", bind_detour); - hook!(interceptor, "listen", listen_detour); - hook!(interceptor, "getpeername", getpeername_detour); - hook!(interceptor, "setsockopt", setsockopt_detour); - try_hook!(interceptor, "uv__accept4", accept4_detour); - try_hook!(interceptor, "accept4", accept4_detour); - try_hook!(interceptor, "accept", accept_detour); + sockets::enable_hooks(interceptor) } diff --git a/mirrord-layer/src/macros.rs b/mirrord-layer/src/macros.rs new file mode 100644 index 00000000000..836ec346bd2 --- /dev/null +++ b/mirrord-layer/src/macros.rs @@ -0,0 +1,36 @@ +macro_rules! hook { + ($interceptor:expr, $func:expr, $detour_name:expr) => { + $interceptor + .replace( + frida_gum::Module::find_export_by_name(None, $func).unwrap(), + frida_gum::NativePointer($detour_name as *mut libc::c_void), + frida_gum::NativePointer(std::ptr::null_mut::()), + ) + .unwrap(); + }; +} + +macro_rules! try_hook { + ($interceptor:expr, $func:expr, $detour_name:expr) => { + if let Some(addr) = frida_gum::Module::find_export_by_name(None, $func) { + match $interceptor.replace( + addr, + frida_gum::NativePointer($detour_name as *mut libc::c_void), + frida_gum::NativePointer(std::ptr::null_mut::()), + ) { + Err(frida_gum::Error::InterceptorAlreadyReplaced) => { + debug!("{} already replaced", $func); + } + Err(e) => { + debug!("{} error: {:?}", $func, e); + } + Ok(_) => { + debug!("{} hooked", $func); + } + } + } + }; +} + +pub(crate) use hook; +pub(crate) use try_hook; diff --git a/mirrord-layer/src/sockets.rs b/mirrord-layer/src/sockets.rs index 686dbbe4594..5e568f7a9df 100644 --- a/mirrord-layer/src/sockets.rs +++ b/mirrord-layer/src/sockets.rs @@ -6,11 +6,19 @@ use std::{ sync::Mutex, }; +use frida_gum::interceptor::Interceptor; +use libc::{c_char, sockaddr, socklen_t}; use multi_map::MultiMap; +use os_socketaddr::OsSocketAddr; use queues::{IsQueue, Queue}; use socketpair::{socketpair_stream, SocketpairStream}; use tracing::{debug, error}; +use crate::{ + macros::{hook, try_hook}, + NEW_CONNECTION_SENDER, SOCKETS, +}; + pub struct Socket { pub read_fd: SockFd, pub read_socket: SocketpairStream, @@ -238,3 +246,99 @@ fn clear_data(socket: &mut SocketpairStream) { .read_to_end(&mut buffer) .unwrap(); } + +unsafe extern "C" fn socket_detour(_domain: i32, _socket_type: i32, _protocol: i32) -> i32 { + debug!("socket called"); + SOCKETS.create_socket() +} + +unsafe extern "C" fn bind_detour(sockfd: i32, addr: *const sockaddr, addrlen: socklen_t) -> i32 { + debug!("bind called"); + let parsed_addr = OsSocketAddr::from_raw_parts(addr as *const u8, addrlen as usize) + .into_addr() + .unwrap(); + + SOCKETS.convert_to_connection_socket(sockfd, parsed_addr); + 0 +} + +unsafe extern "C" fn listen_detour(sockfd: i32, _backlog: i32) -> i32 { + debug!("listen called"); + + match SOCKETS.set_connection_state(sockfd, ConnectionState::Listening) { + Ok(()) => { + let sender = NEW_CONNECTION_SENDER.lock().unwrap(); + sender.as_ref().unwrap().blocking_send(sockfd).unwrap(); // Tell main thread to subscribe to agent + 0 + } + Err(()) => { + error!("Failed to set connection state to listening"); + -1 + } + } +} + +unsafe extern "C" fn getpeername_detour( + sockfd: i32, + addr: *mut sockaddr, + addrlen: *mut socklen_t, +) -> i32 { + let socket_addr = SOCKETS.get_data_socket_address(sockfd).unwrap(); + let os_addr: OsSocketAddr = socket_addr.into(); + let len = std::cmp::min(*addrlen as usize, os_addr.len() as usize); + std::ptr::copy_nonoverlapping(os_addr.as_ptr() as *const u8, addr as *mut u8, len); + + *addrlen = os_addr.len(); + 0 +} + +unsafe extern "C" fn setsockopt_detour( + _sockfd: i32, + _level: i32, + _optname: i32, + _optval: *mut c_char, + _optlen: socklen_t, +) -> i32 { + 0 +} + +unsafe extern "C" fn accept_detour( + sockfd: i32, + addr: *mut sockaddr, + addrlen: *mut socklen_t, +) -> i32 { + debug!( + "Accept called with sockfd {:?}, addr {:?}, addrlen {:?}", + &sockfd, &addr, &addrlen + ); + let socket_addr = SOCKETS.get_connection_socket_address(sockfd).unwrap(); + + if !addr.is_null() { + debug!("received non-null address in accept"); + let os_addr: OsSocketAddr = socket_addr.into(); + std::ptr::copy_nonoverlapping(os_addr.as_ptr(), addr, os_addr.len() as usize); + } + + let connection_id = SOCKETS.read_single_connection(sockfd); + SOCKETS.create_data_socket(connection_id, socket_addr) +} + +unsafe extern "C" fn accept4_detour( + sockfd: i32, + addr: *mut sockaddr, + addrlen: *mut socklen_t, + _flags: i32, +) -> i32 { + accept_detour(sockfd, addr, addrlen) +} + +pub fn enable_hooks(mut interceptor: Interceptor) { + hook!(interceptor, "socket", socket_detour); + hook!(interceptor, "bind", bind_detour); + hook!(interceptor, "listen", listen_detour); + hook!(interceptor, "getpeername", getpeername_detour); + hook!(interceptor, "setsockopt", setsockopt_detour); + try_hook!(interceptor, "uv__accept4", accept4_detour); + try_hook!(interceptor, "accept4", accept4_detour); + try_hook!(interceptor, "accept", accept_detour); +} From 7750cd5f109dff0ed7030cbb24505956b96c65f2 Mon Sep 17 00:00:00 2001 From: Aviram Date: Tue, 10 May 2022 14:11:12 +0300 Subject: [PATCH 15/40] refactor sockets don't replace each socket with socketpair on creation, rather track the socket different syscalls and states and act accordingly add source_port to protocol, getpeername support getsockname --- .dockerignore | 5 + Cargo.lock | 13 +- mirrord-agent/.dockerignore | 5 + mirrord-agent/CHANGELOG.md | 3 + mirrord-agent/Cargo.toml | 2 +- mirrord-agent/Dockerfile | 9 +- mirrord-agent/src/main.rs | 2 +- mirrord-agent/src/sniffer.rs | 6 +- mirrord-agent/tests/blackbox.rs | 4 +- mirrord-layer/Cargo.toml | 2 +- mirrord-layer/src/common.rs | 16 + mirrord-layer/src/config.rs | 2 +- mirrord-layer/src/lib.rs | 149 ++++++- mirrord-layer/src/sockets.rs | 730 +++++++++++++++++++++----------- mirrord-protocol/src/codec.rs | 3 +- 15 files changed, 651 insertions(+), 300 deletions(-) create mode 100644 .dockerignore create mode 100644 mirrord-agent/.dockerignore create mode 100644 mirrord-layer/src/common.rs diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000000..c6bd5ff378c --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +*/target* +*/.vscode* +*/.git* +*/.github* +*/.devcontainer* \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 943ed03eb63..c0294e7b216 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1311,7 +1311,7 @@ dependencies = [ [[package]] name = "mirrord-agent" -version = "2.0.0-alpha-3" +version = "2.0.0-alpha-4" dependencies = [ "actix-codec", "anyhow", @@ -1342,6 +1342,7 @@ dependencies = [ "ctor", "env_logger 0.9.0", "envconfig", + "errno", "frida-gum", "futures", "k8s-openapi", @@ -1355,7 +1356,6 @@ dependencies = [ "os_socketaddr", "queues", "rand 0.8.5", - "redhook", "serde_json", "socketpair", "tempdir", @@ -1992,15 +1992,6 @@ dependencies = [ "rand_core 0.3.1", ] -[[package]] -name = "redhook" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6e109b8469dbbe6d7cbe18e5ebd65d4a134e2f4b91304ad9213984cad1d70a6" -dependencies = [ - "libc", -] - [[package]] name = "redox_syscall" version = "0.2.13" diff --git a/mirrord-agent/.dockerignore b/mirrord-agent/.dockerignore new file mode 100644 index 00000000000..c6bd5ff378c --- /dev/null +++ b/mirrord-agent/.dockerignore @@ -0,0 +1,5 @@ +*/target* +*/.vscode* +*/.git* +*/.github* +*/.devcontainer* \ No newline at end of file diff --git a/mirrord-agent/CHANGELOG.md b/mirrord-agent/CHANGELOG.md index d3e11afedee..dfbcd1d3767 100644 --- a/mirrord-agent/CHANGELOG.md +++ b/mirrord-agent/CHANGELOG.md @@ -1,4 +1,7 @@ ## [Unreleased] +## 2.0.0-alpha-4 - 5/11/2022 +### Changed +* Add `source_port` to `NewTCPConnection` and change `port` to `destination_port` ## 2.0.0-alpha-3 - 1/5/2022 ### Changed * Change behavior of namespace change - set the namespace only in the packet sniffing, in a new thread so "command" socket will listen on the original network namespace diff --git a/mirrord-agent/Cargo.toml b/mirrord-agent/Cargo.toml index 3974c2352c4..a2d3e4ff24a 100644 --- a/mirrord-agent/Cargo.toml +++ b/mirrord-agent/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mirrord-agent" -version = "2.0.0-alpha-3" +version = "2.0.0-alpha-4" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/mirrord-agent/Dockerfile b/mirrord-agent/Dockerfile index 6a3b2049c88..06e9b4359d8 100644 --- a/mirrord-agent/Dockerfile +++ b/mirrord-agent/Dockerfile @@ -2,8 +2,13 @@ FROM rust:latest as build-env RUN apt update && apt install -y libpcap-dev cmake RUN rustup toolchain install nightly --component rustfmt WORKDIR /app -COPY . /app -RUN cargo build --manifest-path mirrord-agent/Cargo.toml --release +COPY Cargo.toml Cargo.lock CHANGELOG.md README.md LICENSE rust-toolchain.toml /app/ +COPY mirrord-protocol /app/mirrord-protocol +COPY mirrord-agent /app/mirrord-agent +COPY mirrord-layer /app/mirrord-layer +COPY mirrord-cli /app/mirrord-cli +COPY .cargo /app/.cargo +RUN cargo +nightly build -Z bindeps --manifest-path /app/mirrord-agent/Cargo.toml --release FROM debian:stable RUN apt update && apt install -y libpcap-dev diff --git a/mirrord-agent/src/main.rs b/mirrord-agent/src/main.rs index 9f9a3a174e2..897ca21aa37 100644 --- a/mirrord-agent/src/main.rs +++ b/mirrord-agent/src/main.rs @@ -204,7 +204,7 @@ async fn start() -> Result<()> { Some(message) => { match message { SnifferOutput::NewTCPConnection(conn) => { - let peer_ids = state.port_subscriptions.get_topic_subscribers(conn.port); + let peer_ids = state.port_subscriptions.get_topic_subscribers(conn.destination_port); for peer_id in peer_ids { state.connections_subscriptions.subscribe(peer_id, conn.connection_id); if let Some(peer) = state.peers.get(&peer_id) { diff --git a/mirrord-agent/src/sniffer.rs b/mirrord-agent/src/sniffer.rs index 805a6707e51..447fb33b8c7 100644 --- a/mirrord-agent/src/sniffer.rs +++ b/mirrord-agent/src/sniffer.rs @@ -143,10 +143,11 @@ impl ConnectionManager { }; let dest_port = tcp_packet.get_destination(); let tcp_flags = tcp_packet.get_flags(); + let source_port = tcp_packet.get_source(); let identifier = TCPSessionIdentifier { source_addr: ip_packet.get_source(), dest_addr: ip_packet.get_destination(), - source_port: tcp_packet.get_source(), + source_port, dest_port, }; let is_client_packet = self.qualified_port(dest_port); @@ -165,7 +166,8 @@ impl ConnectionManager { None })?; messages.push(SnifferOutput::NewTCPConnection(NewTCPConnection { - port: dest_port, + destination_port: dest_port, + source_port, connection_id: id, address: IpAddr::V4(identifier.source_addr), })); diff --git a/mirrord-agent/tests/blackbox.rs b/mirrord-agent/tests/blackbox.rs index bd7c63eaf3a..b8d24621185 100644 --- a/mirrord-agent/tests/blackbox.rs +++ b/mirrord-agent/tests/blackbox.rs @@ -74,6 +74,7 @@ mod tests { let mut test_conn = TcpStream::connect("127.0.0.1:1337") .await .expect("connection to dummy failed"); + let port = test_conn.local_addr().unwrap().port(); let test_data = [0, 3, 5]; test_conn .write(&test_data) @@ -100,7 +101,8 @@ mod tests { DaemonMessage::NewTCPConnection(NewTCPConnection { connection_id: 0, address: IpAddr::V4("127.0.0.1".parse().unwrap()), - port: 1337 + destination_port: 1337, + source_port: port }) ); diff --git a/mirrord-layer/Cargo.toml b/mirrord-layer/Cargo.toml index 55b8d1a0423..ea328c64b9a 100644 --- a/mirrord-layer/Cargo.toml +++ b/mirrord-layer/Cargo.toml @@ -11,7 +11,6 @@ lazy_static = "1.4.0" libc = "0.2.121" nix = "0.23.1" os_socketaddr = "0.2.0" -redhook = "2.0.0" socketpair = "0.15.0" tempdir = "0.3.7" tracing = "0.1" @@ -34,6 +33,7 @@ queues = "1.1.0" rand = "0.8.5" multi-map = "1.3.0" envconfig = "0.10.0" +errno = "0.2.8" [lib] crate_type = ["cdylib"] diff --git a/mirrord-layer/src/common.rs b/mirrord-layer/src/common.rs new file mode 100644 index 00000000000..ac266d79581 --- /dev/null +++ b/mirrord-layer/src/common.rs @@ -0,0 +1,16 @@ +use std::os::unix::io::RawFd; + +pub type Port = u16; + +#[derive(Debug)] +pub struct Listen { + pub fake_port: Port, + pub real_port: Port, + pub ipv6: bool, + pub fd: RawFd, +} + +#[derive(Debug)] +pub enum HookMessage { + Listen(Listen), +} diff --git a/mirrord-layer/src/config.rs b/mirrord-layer/src/config.rs index 6199e89e74e..b74ffbe1875 100644 --- a/mirrord-layer/src/config.rs +++ b/mirrord-layer/src/config.rs @@ -10,7 +10,7 @@ pub struct Config { #[envconfig( from = "MIRRORD_AGENT_IMAGE", - default = "ghcr.io/metalbear-co/mirrord-agent:2.0.0-alpha-3" + default = "ghcr.io/metalbear-co/mirrord:2.0.0-alpha-4" )] pub agent_image: String, diff --git a/mirrord-layer/src/lib.rs b/mirrord-layer/src/lib.rs index 1bb36de0a77..99bbd7e20ff 100644 --- a/mirrord-layer/src/lib.rs +++ b/mirrord-layer/src/lib.rs @@ -1,33 +1,93 @@ // #![feature(c_variadic)] -use std::{sync::Mutex, thread, time::Duration}; +use std::{ + collections::HashMap, + net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, + os::unix::io::RawFd, + thread, + time::Duration, +}; use ctor::ctor; use envconfig::Envconfig; -use frida_gum::{interceptor::Interceptor, Error, Gum, Module, NativePointer}; +use frida_gum::{interceptor::Interceptor, Gum}; use futures::{SinkExt, StreamExt}; use kube::api::Portforwarder; use lazy_static::lazy_static; use mirrord_protocol::{ClientCodec, ClientMessage, DaemonMessage}; use tokio::{ + io::AsyncWriteExt, + net::TcpStream, runtime::Runtime, select, sync::mpsc::{channel, Receiver, Sender}, + task, }; use tracing::{debug, error}; +mod common; mod config; mod macros; mod pod_api; mod sockets; -use config::Config; use tracing_subscriber::prelude::*; +use crate::{ + common::{HookMessage, Port}, + config::Config, + sockets::{SocketInformation, CONNECTION_QUEUE}, +}; + lazy_static! { static ref GUM: Gum = unsafe { Gum::obtain() }; static ref RUNTIME: Runtime = Runtime::new().unwrap(); - static ref SOCKETS: sockets::Sockets = sockets::Sockets::default(); - static ref NEW_CONNECTION_SENDER: Mutex>> = Mutex::new(None); +} + +pub static mut HOOK_SENDER: Option> = None; + +#[derive(Debug)] +enum TcpTunnelMessages { + Data(Vec), + Close, +} + +#[derive(Debug, Clone)] +struct ListenData { + ipv6: bool, + port: Port, + fd: RawFd, +} + +async fn tcp_tunnel(mut local_stream: TcpStream, mut receiver: Receiver) { + loop { + select! { + message = receiver.recv() => { + match message { + Some(TcpTunnelMessages::Data(data)) => { + local_stream.write_all(&data).await.unwrap() + }, + Some(TcpTunnelMessages::Close) => break, + None => break + }; + }, + _ = local_stream.readable() => { + let mut data = vec![0; 1024]; + match local_stream.try_read(&mut data) { + Err(ref err) if err.kind() == std::io::ErrorKind::WouldBlock => { + continue + }, + Err(err) => { + debug!("local stream ended with err {:?}", err); + break; + } + Ok(n) if n == 0 => break, + Ok(_) => {} + } + + } + } + } + debug!("exiting tcp tunnel"); } #[ctor] @@ -46,23 +106,27 @@ fn init() { config.agent_rust_log, config.agent_image, )); - let (sender, receiver) = channel::(1000); - *NEW_CONNECTION_SENDER.lock().unwrap() = Some(sender); + let (sender, receiver) = channel::(1000); + unsafe { + HOOK_SENDER = Some(sender); + }; enable_hooks(); RUNTIME.spawn(poll_agent(pf, receiver)); } -async fn poll_agent(mut pf: Portforwarder, mut receiver: Receiver) { +async fn poll_agent(mut pf: Portforwarder, mut receiver: Receiver) { let port = pf.take_stream(61337).unwrap(); // TODO: Make port configurable let mut codec = actix_codec::Framed::new(port, ClientCodec::new()); + let mut port_mapping: HashMap = HashMap::new(); + let mut active_connections = HashMap::new(); loop { select! { message = receiver.recv() => { match message { - Some(sockfd) => { - let port = SOCKETS.get_connection_socket_address(sockfd).unwrap().port(); - debug!("send message to client {:?}", port); - codec.send(ClientMessage::PortSubscribe(vec![port])).await.unwrap(); + Some(HookMessage::Listen(msg)) => { + debug!("received message from hook {:?}", msg); + codec.send(ClientMessage::PortSubscribe(vec![msg.real_port])).await.unwrap(); + port_mapping.insert(msg.real_port, ListenData{port: msg.fake_port, ipv6: msg.ipv6, fd: msg.fd}); } None => { debug!("NONE in recv"); @@ -73,14 +137,59 @@ async fn poll_agent(mut pf: Portforwarder, mut receiver: Receiver) { message = codec.next() => { match message { Some(Ok(DaemonMessage::NewTCPConnection(conn))) => { - SOCKETS.open_connection(conn.connection_id, conn.port); - } - Some(Ok(DaemonMessage::TCPData(d))) => { - // Write to socket - need to find it in OPEN_CONNECTION_SOCKETS by conn_id - SOCKETS.write_data(d.connection_id, d.data); + debug!("new connection {:?}", conn); + let listen_data = match port_mapping.get(&conn.destination_port) { + Some(listen_data) => (*listen_data).clone(), + None => { + debug!("no listen_data for {:?}", conn.destination_port); + continue; + } + }; + let addr = match listen_data.ipv6 { + false => SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), listen_data.port), + true => SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), listen_data.port), + }; + let info = SocketInformation::new(SocketAddr::new(conn.address, conn.source_port)); + { + CONNECTION_QUEUE.lock().unwrap().add(&listen_data.fd, info); + } + let stream = match TcpStream::connect(addr).await { + Ok(stream) => stream, + Err(err) => { + error!("failed to connect to port {:?}", err); + continue; + } + }; + let (sender, receiver) = channel::(1000); + active_connections.insert(conn.connection_id, sender); + task::spawn(async move { + tcp_tunnel(stream, receiver).await + }); } - Some(Ok(DaemonMessage::TCPClose(d))) => { - SOCKETS.close_connection(d.connection_id) + Some(Ok(DaemonMessage::TCPData(msg))) => { + let sender = match active_connections.get(&msg.connection_id) { + Some(sender) => sender, + None => { + debug!("no sender for {:?}", msg.connection_id); + continue; + } + }; + if let Err(err) = sender.send(TcpTunnelMessages::Data(msg.data)).await { + debug!("sender error {:?}", err); + active_connections.remove(&msg.connection_id); + } + }, + Some(Ok(DaemonMessage::TCPClose(msg))) => { + let sender = match active_connections.remove(&msg.connection_id) { + Some(sender) => sender, + None => { + debug!("no sender for {:?}", msg.connection_id); + continue; + } + }; + if let Err(err) = sender.send(TcpTunnelMessages::Close).await { + debug!("sender error {:?}", err); + } } Some(_) => { debug!("NONE in some"); @@ -98,6 +207,6 @@ async fn poll_agent(mut pf: Portforwarder, mut receiver: Receiver) { } fn enable_hooks() { - let mut interceptor = Interceptor::obtain(&GUM); + let interceptor = Interceptor::obtain(&GUM); sockets::enable_hooks(interceptor) } diff --git a/mirrord-layer/src/sockets.rs b/mirrord-layer/src/sockets.rs index 5e568f7a9df..ca79003fd84 100644 --- a/mirrord-layer/src/sockets.rs +++ b/mirrord-layer/src/sockets.rs @@ -1,344 +1,556 @@ +//! We implement each hook function in a safe function as much as possible, having the unsafe do the +//! absolute minimum use std::{ - collections::HashMap, - io::{Read, Write}, - net::SocketAddr, - os::unix::io::AsRawFd, + borrow::Borrow, + collections::{HashMap, HashSet, VecDeque}, + hash::{Hash, Hasher}, + net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, + os::unix::io::RawFd, sync::Mutex, }; +use errno::{errno, set_errno, Errno}; use frida_gum::interceptor::Interceptor; -use libc::{c_char, sockaddr, socklen_t}; -use multi_map::MultiMap; +use lazy_static::lazy_static; +use libc::{c_int, sockaddr, socklen_t}; use os_socketaddr::OsSocketAddr; -use queues::{IsQueue, Queue}; -use socketpair::{socketpair_stream, SocketpairStream}; use tracing::{debug, error}; use crate::{ + common::{HookMessage, Listen, Port}, macros::{hook, try_hook}, - NEW_CONNECTION_SENDER, SOCKETS, + HOOK_SENDER, }; -pub struct Socket { - pub read_fd: SockFd, - pub read_socket: SocketpairStream, - pub write_socket: SocketpairStream, +lazy_static! { + static ref SOCKETS: Mutex> = Mutex::new(HashSet::new()); + pub static ref CONNECTION_QUEUE: Mutex = + Mutex::new(ConnectionQueue::default()); } -pub struct ConnectionSocket { - pub read_fd: SockFd, - pub read_socket: SocketpairStream, - pub write_socket: SocketpairStream, +/// Struct sent over the socket once created to pass metadata to the hook +#[derive(Debug)] +pub struct SocketInformation { pub address: SocketAddr, - pub state: ConnectionState, } -#[derive(PartialEq)] -pub enum ConnectionState { - Bound, - Listening, +/// poll_agent loop inserts connection data into this queue, and accept reads it. +#[derive(Debug, Default)] +pub struct ConnectionQueue { + connections: HashMap>, } -pub struct DataSocket { - pub connection_id: ConnectionId, - #[allow(dead_code)] - pub read_socket: SocketpairStream, /* Though this is unread, it's necessary to keep the - * socket open */ - pub write_socket: SocketpairStream, - pub address: SocketAddr, +impl ConnectionQueue { + pub fn add(&mut self, fd: &RawFd, info: SocketInformation) { + self.connections.entry(*fd).or_default().push_back(info); + } + pub fn get(&mut self, fd: &RawFd) -> Option { + let mut queue = self.connections.remove(fd)?; + if let Some(info) = queue.pop_front() { + if !queue.is_empty() { + self.connections.insert(*fd, queue); + } + Some(info) + } else { + None + } + } } -type SockFd = i32; -type Port = u16; -type ConnectionId = u16; -type TCPBuffer = Vec; - -pub struct Sockets { - new_sockets: Mutex>, - connections: Mutex>, - data: Mutex>, - connection_queues: Mutex>>, /* Used to enqueue incoming - * connection - * ids from the - * agent, to be read in the - * 'accept' - * call */ - pending_data: Mutex>, /* Used to store data that arrived - * before its - * connection was opened. When the - * connection is - * later opened, pending_data is read - * and - * emptied. */ -} - -impl Default for Sockets { - fn default() -> Self { - Self { - new_sockets: Mutex::new(HashMap::new()), - connections: Mutex::new(MultiMap::new()), - data: Mutex::new(MultiMap::new()), - connection_queues: Mutex::new(HashMap::new()), - pending_data: Mutex::new(HashMap::new()), - } +impl SocketInformation { + pub fn new(address: SocketAddr) -> Self { + Self { address } } } -impl Sockets { - pub fn create_socket(&self) -> SockFd { - let (write_socket, read_socket) = socketpair_stream().unwrap(); - let read_fd = read_socket.as_raw_fd(); - let socket = Socket { - read_fd, - read_socket, - write_socket, - }; +trait GetPeerName { + fn get_peer_name(&self) -> SocketAddr; +} + +#[derive(Debug)] +pub struct Connected { + /// Remote address we're connected to + remote_address: SocketAddr, + /// Local address it's connected from + local_address: SocketAddr, +} + +#[derive(Debug, Clone)] +pub struct Bound { + address: SocketAddr, +} - self.new_sockets.lock().unwrap().insert(read_fd, socket); +#[derive(Debug)] +pub enum SocketState { + Initialized, + Bound(Bound), + Listening(Bound), + Connected(Connected), +} - read_fd +impl Default for SocketState { + fn default() -> Self { + SocketState::Initialized } +} - pub fn convert_to_connection_socket(&self, sockfd: SockFd, address: SocketAddr) { - let mut sockets = self.new_sockets.lock().unwrap(); - - // let mut sockets = self.connections.lock().unwrap(); - if let Some(socket) = sockets.remove(&sockfd) { - // socket.port = port; - self.connections.lock().unwrap().insert( - sockfd, - address.port(), - ConnectionSocket { - read_fd: socket.read_fd, - read_socket: socket.read_socket, - write_socket: socket.write_socket, - address, - state: ConnectionState::Bound, - }, - ); - } else { - error!("No socket found for fd: {}", sockfd); - } +#[derive(Debug)] +#[allow(dead_code)] +struct Socket { + fd: RawFd, + domain: c_int, + type_: c_int, + protocol: c_int, + pub state: SocketState, +} + +impl PartialEq for Socket { + fn eq(&self, other: &Self) -> bool { + self.fd == other.fd } +} - pub fn set_connection_state(&self, sockfd: SockFd, state: ConnectionState) -> Result<(), ()> { - let mut connections = self.connections.lock().unwrap(); - if let Some(connection) = connections.get_mut(&sockfd) { - if connection.state != state { - connection.state = state; - Ok(()) - } else { - error!("No connection found for fd: {}", sockfd); - Err(()) - } - } else { - error!("No connection found for fd: {}", sockfd); - Err(()) - } +impl Eq for Socket {} + +impl Hash for Socket { + fn hash(&self, state: &mut H) { + self.fd.hash(state); } +} - pub fn get_connection_socket_address(&self, sockfd: SockFd) -> Option { - let sockets = self.connections.lock().unwrap(); - sockets.get(&sockfd).map(|socket| socket.address) +impl Borrow for Socket { + fn borrow(&self) -> &RawFd { + &self.fd } +} - pub fn get_data_socket_address(&self, sockfd: SockFd) -> Option { - let sockets = self.data.lock().unwrap(); - sockets.get(&sockfd).map(|socket| socket.address) +#[inline] +fn is_ignored_port(port: Port) -> bool { + port == 0 || (port > 50000 && port < 60000) +} + +/// Create the socket, add it to SOCKETS if sucesssful and matching protocol and domain (TCPv4/v6) +fn socket(domain: c_int, type_: c_int, protocol: c_int) -> RawFd { + debug!("socket called domain:{:?}, type:{:?}", domain, type_); + let fd = unsafe { libc::socket(domain, type_, protocol) }; + if fd == -1 { + error!("socket failed"); + return fd; + } + // We don't handle non TCPv4 sockets + if !((domain == libc::AF_INET) || (domain == libc::AF_INET6) && (type_ & libc::SOCK_STREAM) > 0) + { + debug!("non TCP socket domain:{:?}, type:{:?}", domain, type_); + return fd; } + let mut sockets = SOCKETS.lock().unwrap(); + sockets.insert(Socket { + fd, + domain, + type_, + protocol, + state: SocketState::default(), + }); + fd +} - pub fn read_single_connection(&self, sockfd: SockFd) -> ConnectionId { - let mut sockets = self.connections.lock().unwrap(); +unsafe extern "C" fn socket_detour(domain: c_int, type_: c_int, protocol: c_int) -> c_int { + socket(domain, type_, protocol) +} - if let Some(mut socket) = sockets.remove(&sockfd) { - let mut buffer = [0; 1]; - socket.read_socket.read_exact(&mut buffer).unwrap(); - sockets.insert(sockfd, socket.address.port(), socket); - let mut queues = self.connection_queues.lock().unwrap(); - let queue = queues.get_mut(&sockfd).unwrap(); - queue.remove().unwrap() - } else { - error!("No socket found for fd: {}", sockfd); - 0 +/// Check if the socket is managed by us, if it's managed by us and it's not an ignored port, +/// update the socket state and don't call bind (will be called later). In any other case, we call +/// regular bind. +fn bind(sockfd: c_int, addr: *const sockaddr, addrlen: socklen_t) -> c_int { + debug!("bind called sockfd: {:?}", sockfd); + let mut socket = { + let mut sockets = SOCKETS.lock().unwrap(); + match sockets.take(&sockfd) { + Some(socket) if !matches!(socket.state, SocketState::Initialized) => { + error!("socket is in invalid state for bind {:?}", socket.state); + return libc::EINVAL; + } + Some(socket) => socket, + None => { + debug!("bind: no socket found for fd: {}", &sockfd); + return unsafe { libc::bind(sockfd, addr, addrlen) }; + } + } + }; + + let raw_addr = unsafe { OsSocketAddr::from_raw_parts(addr as *const u8, addrlen as usize) }; + let parsed_addr = match raw_addr.into_addr() { + Some(addr) => addr, + None => { + error!("bind: failed to parse addr"); + return libc::EINVAL; } + }; + + debug!("bind:port: {}", parsed_addr.port()); + if is_ignored_port(parsed_addr.port()) { + debug!("bind: ignoring port: {}", parsed_addr.port()); + return unsafe { libc::bind(sockfd, addr, addrlen) }; } - pub fn open_connection(&self, connection_id: ConnectionId, port: Port) { - let mut connections = self.connections.lock().unwrap(); - if let Some(mut socket) = connections.remove_alt(&port) { - debug!("new connection id: {:?}", connection_id); - let mut queues = self.connection_queues.lock().unwrap(); - match queues.get_mut(&socket.read_fd) { - Some(queue) => { - queue.add(connection_id).unwrap(); + socket.state = SocketState::Bound(Bound { + address: parsed_addr, + }); + + let mut sockets = SOCKETS.lock().unwrap(); + sockets.insert(socket); + 0 +} + +unsafe extern "C" fn bind_detour( + sockfd: c_int, + addr: *const sockaddr, + addrlen: socklen_t, +) -> c_int { + bind(sockfd, addr, addrlen) +} + +/// Bind the socket to a fake, local port, and subscribe to the agent on the real port. +/// Messages received from the agent on the real port will later be routed to the fake local port. +fn listen(sockfd: RawFd, _backlog: c_int) -> c_int { + debug!("listen called"); + let mut socket = { + let mut sockets = SOCKETS.lock().unwrap(); + match sockets.take(&sockfd) { + Some(socket) => socket, + None => { + debug!("listen: no socket found for fd: {}", &sockfd); + return unsafe { libc::listen(sockfd, _backlog) }; + } + } + }; + match socket.state { + SocketState::Bound(bound) => { + let real_port = bound.address.port(); + socket.state = SocketState::Listening(bound); + let mut os_addr = match socket.domain { + libc::AF_INET => { + OsSocketAddr::from(SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 0)) } + libc::AF_INET6 => { + OsSocketAddr::from(SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), 0)) + } + _ => { + // shouldn't happen + debug!("unsupported domain"); + return libc::EINVAL; + } + }; + + let ret = unsafe { libc::bind(sockfd, os_addr.as_ptr(), os_addr.len()) }; + if ret != 0 { + error!( + "listen: failed to bind socket ret: {:?}, addr: {:?}, sockfd: {:?}, errno: {:?}", + ret, os_addr, sockfd, errno() + ); + return ret; + } + let mut addr_len = os_addr.len(); + // We need to find out what's the port we bound to, that'll be used by `poll_agent` to + // connect to. + let ret = unsafe { libc::getsockname(sockfd, os_addr.as_mut_ptr(), &mut addr_len) }; + if ret != 0 { + error!( + "listen: failed to get sockname ret: {:?}, addr: {:?}, sockfd: {:?}", + ret, os_addr, sockfd + ); + return ret; + } + let result_addr = match os_addr.into_addr() { + Some(addr) => addr, None => { - let mut queue = Queue::new(); - queue.add(connection_id).unwrap(); - queues.insert(socket.read_fd, queue); + error!("listen: failed to parse addr"); + return libc::EINVAL; } + }; + let ret = unsafe { libc::listen(sockfd, _backlog) }; + if ret != 0 { + error!( + "listen: failed to listen ret: {:?}, addr: {:?}, sockfd: {:?}", + ret, result_addr, sockfd + ); + return ret; } - - write!(socket.write_socket, "a").unwrap(); // Need to write one byte per incoming connection, hence "a" - connections.insert(socket.read_fd, socket.address.port(), socket); - } else { - error!("No socket found for port: {}", port); - } - } - - pub fn create_data_socket(&self, connection_id: ConnectionId, address: SocketAddr) -> SockFd { - let (read_socket, mut write_socket) = socketpair_stream().unwrap(); - let read_fd = read_socket.as_raw_fd(); - debug!( - "Accepted connection from read_fd:{:?}, write_sock:{:?}", - read_fd, write_socket - ); - - if let Some(data) = self.pending_data.lock().unwrap().remove(&connection_id) { - debug!("writing pending data for connection_id: {}", connection_id); - write_socket.write_all(&data).unwrap(); + let sender = unsafe { HOOK_SENDER.as_ref().unwrap() }; + match sender.blocking_send(HookMessage::Listen(Listen { + fake_port: result_addr.port(), + real_port, + ipv6: result_addr.is_ipv6(), + fd: sockfd, + })) { + Ok(_) => {} + Err(e) => { + error!("listen: failed to send listen message: {:?}", e); + return libc::EFAULT; + } + }; } - let read_fd = read_socket.as_raw_fd(); - let data_socket = DataSocket { - connection_id, - read_socket, - write_socket, - address, - }; - self.data - .lock() - .unwrap() - .insert(read_fd, connection_id, data_socket); - read_fd - } - - pub fn write_data(&self, connection_id: ConnectionId, data: TCPBuffer) { - let mut sockets = self.data.lock().unwrap(); - if let Some(mut socket) = sockets.remove_alt(&connection_id) { - socket.write_socket.write_all(&data).unwrap(); - clear_data(&mut socket.write_socket); // clear HTTP response data that the app wrote to this socket - sockets.insert(socket.read_socket.as_raw_fd(), socket.connection_id, socket); - } else { - // Not necessarily an error - sometime the TCPData message is handled before - // NewTcpConnection - debug!("No socket found for connection_id: {}", connection_id); - self.pending_data - .lock() - .unwrap() - .insert(connection_id, data); + _ => { + error!( + "listen: socket is not bound or already listening, state: {:?}", + socket.state + ); + return libc::EINVAL; } } - - pub fn close_connection(&self, connection_id: ConnectionId) { - self.data - .lock() - .unwrap() - .remove_alt(&connection_id) - .unwrap(); - } -} - -fn clear_data(socket: &mut SocketpairStream) { - let num_ready_bytes = socket.num_ready_bytes().unwrap(); - let mut buffer = Vec::with_capacity(num_ready_bytes as usize); - socket - .take(num_ready_bytes) - .read_to_end(&mut buffer) - .unwrap(); + debug!("listen: success"); + let mut sockets = SOCKETS.lock().unwrap(); + sockets.insert(socket); + 0 } -unsafe extern "C" fn socket_detour(_domain: i32, _socket_type: i32, _protocol: i32) -> i32 { - debug!("socket called"); - SOCKETS.create_socket() +unsafe extern "C" fn listen_detour(sockfd: RawFd, backlog: c_int) -> c_int { + listen(sockfd, backlog) } -unsafe extern "C" fn bind_detour(sockfd: i32, addr: *const sockaddr, addrlen: socklen_t) -> i32 { - debug!("bind called"); - let parsed_addr = OsSocketAddr::from_raw_parts(addr as *const u8, addrlen as usize) - .into_addr() - .unwrap(); +fn connect(sockfd: RawFd, address: *const sockaddr, len: socklen_t) -> c_int { + debug!("connect called"); - SOCKETS.convert_to_connection_socket(sockfd, parsed_addr); - 0 + let socket = { + let mut sockets = SOCKETS.lock().unwrap(); + match sockets.take(&sockfd) { + Some(socket) => socket, + None => { + debug!("connect: no socket found for fd: {}", &sockfd); + return unsafe { libc::connect(sockfd, address, len) }; + } + } + }; + + // We don't handle this socket, so restore state if there was any. (delay execute bind) + if let SocketState::Bound(bound) = socket.state { + let os_addr = OsSocketAddr::from(bound.address); + let ret = unsafe { libc::bind(sockfd, os_addr.as_ptr(), os_addr.len()) }; + if ret != 0 { + error!( + "connect: failed to bind socket ret: {:?}, addr: {:?}, sockfd: {:?}", + ret, os_addr, sockfd + ); + return ret; + } + }; + unsafe { libc::connect(sockfd, address, len) } } -unsafe extern "C" fn listen_detour(sockfd: i32, _backlog: i32) -> i32 { - debug!("listen called"); +unsafe extern "C" fn connect_detour( + sockfd: RawFd, + address: *const sockaddr, + len: socklen_t, +) -> c_int { + connect(sockfd, address, len) +} - match SOCKETS.set_connection_state(sockfd, ConnectionState::Listening) { - Ok(()) => { - let sender = NEW_CONNECTION_SENDER.lock().unwrap(); - sender.as_ref().unwrap().blocking_send(sockfd).unwrap(); // Tell main thread to subscribe to agent - 0 - } - Err(()) => { - error!("Failed to set connection state to listening"); - -1 +/// Resolve fake local address to real remote address. (IP & port of incoming traffic on the +/// cluster) +fn getpeername(sockfd: RawFd, address: *mut sockaddr, address_len: *mut socklen_t) -> c_int { + debug!("getpeername called"); + let remote_address = { + let sockets = SOCKETS.lock().unwrap(); + match sockets.get(&sockfd) { + Some(socket) => match &socket.state { + SocketState::Connected(connected) => connected.remote_address, + _ => { + debug!( + "getpeername: socket is not connected, state: {:?}", + socket.state + ); + set_errno(Errno(libc::ENOTCONN)); + return -1; + } + }, + None => { + debug!("getpeername: no socket found for fd: {}", &sockfd); + return unsafe { libc::getpeername(sockfd, address, address_len) }; + } } - } + }; + debug!("remote_address: {:?}", remote_address); + fill_address(address, address_len, remote_address) } unsafe extern "C" fn getpeername_detour( - sockfd: i32, - addr: *mut sockaddr, - addrlen: *mut socklen_t, + sockfd: RawFd, + address: *mut sockaddr, + address_len: *mut socklen_t, ) -> i32 { - let socket_addr = SOCKETS.get_data_socket_address(sockfd).unwrap(); - let os_addr: OsSocketAddr = socket_addr.into(); - let len = std::cmp::min(*addrlen as usize, os_addr.len() as usize); - std::ptr::copy_nonoverlapping(os_addr.as_ptr() as *const u8, addr as *mut u8, len); + getpeername(sockfd, address, address_len) +} - *addrlen = os_addr.len(); - 0 +/// Resolve the fake local address to the real local address. +fn getsockname(sockfd: RawFd, address: *mut sockaddr, address_len: *mut socklen_t) -> c_int { + debug!("getsockname called"); + let local_address = { + let sockets = SOCKETS.lock().unwrap(); + match sockets.get(&sockfd) { + Some(socket) => match &socket.state { + SocketState::Connected(connected) => connected.local_address, + SocketState::Bound(bound) => bound.address, + SocketState::Listening(bound) => bound.address, + _ => { + debug!( + "getsockname: socket is not bound or connected, state: {:?}", + socket.state + ); + return unsafe { libc::getsockname(sockfd, address, address_len) }; + } + }, + None => { + debug!("getsockname: no socket found for fd: {}", &sockfd); + return unsafe { libc::getsockname(sockfd, address, address_len) }; + } + } + }; + debug!("local_address: {:?}", local_address); + fill_address(address, address_len, local_address) } -unsafe extern "C" fn setsockopt_detour( - _sockfd: i32, - _level: i32, - _optname: i32, - _optval: *mut c_char, - _optlen: socklen_t, +unsafe extern "C" fn getsockname_detour( + sockfd: RawFd, + address: *mut sockaddr, + address_len: *mut socklen_t, ) -> i32 { + getsockname(sockfd, address, address_len) +} + +// unsafe extern "C" fn setsockopt_detour( +// _sockfd: i32, +// _level: i32, +// _optname: i32, +// _optval: *mut c_char, +// _optlen: socklen_t, +// ) -> i32 { +// 0 +// } + +/// Fill in the sockaddr structure for the given address. +#[inline] +fn fill_address( + address: *mut sockaddr, + address_len: *mut socklen_t, + new_address: SocketAddr, +) -> c_int { + if address.is_null() { + return 0; + } + if address_len.is_null() { + set_errno(Errno(libc::EINVAL)); + return -1; + } + let os_address: OsSocketAddr = new_address.into(); + unsafe { + let len = std::cmp::min(*address_len as usize, os_address.len() as usize); + std::ptr::copy_nonoverlapping(os_address.as_ptr() as *const u8, address as *mut u8, len); + *address_len = os_address.len(); + } 0 } +/// When the fd is "ours", we accept and recv the first bytes that contain metadata on the +/// connection to be set in our lock This enables us to have a safe way to get "remote" information +/// (remote ip, port, etc). +fn accept( + sockfd: RawFd, + address: *mut sockaddr, + address_len: *mut socklen_t, + new_fd: RawFd, +) -> RawFd { + let (origin_fd, local_address, domain, protocol, type_) = { + if let Some(socket) = SOCKETS.lock().unwrap().get(&sockfd) { + if let SocketState::Listening(bound) = &socket.state { + ( + socket.fd, + bound.address, + socket.domain, + socket.protocol, + socket.type_, + ) + } else { + error!("original socket is not listening"); + return new_fd; + } + } else { + debug!("origin socket not found"); + return new_fd; + } + }; + let socket_info = { CONNECTION_QUEUE.lock().unwrap().get(&origin_fd) }; + let remote_address = match socket_info { + Some(socket_info) => socket_info, + None => { + debug!("accept: socketinformation not found, probably not ours"); + return new_fd; + } + } + .address; + let new_socket = Socket { + fd: new_fd, + domain, + protocol, + type_, + state: SocketState::Connected(Connected { + remote_address, + local_address, + }), + }; + fill_address(address, address_len, remote_address); + + SOCKETS.lock().unwrap().insert(new_socket); + new_fd +} + unsafe extern "C" fn accept_detour( - sockfd: i32, - addr: *mut sockaddr, - addrlen: *mut socklen_t, + sockfd: c_int, + address: *mut sockaddr, + address_len: *mut socklen_t, ) -> i32 { - debug!( - "Accept called with sockfd {:?}, addr {:?}, addrlen {:?}", - &sockfd, &addr, &addrlen - ); - let socket_addr = SOCKETS.get_connection_socket_address(sockfd).unwrap(); - - if !addr.is_null() { - debug!("received non-null address in accept"); - let os_addr: OsSocketAddr = socket_addr.into(); - std::ptr::copy_nonoverlapping(os_addr.as_ptr(), addr, os_addr.len() as usize); + let res = libc::accept(sockfd, address, address_len); + if res < 0 { + return res; } + accept(sockfd, address, address_len, res) + // let socket_addr = SOCKETS.get_connection_socket_address(sockfd).unwrap(); - let connection_id = SOCKETS.read_single_connection(sockfd); - SOCKETS.create_data_socket(connection_id, socket_addr) + // if !addr.is_null() { + // debug!("received non-null address in accept"); + // let os_addr: OsSocketAddr = socket_addr.into(); + // std::ptr::copy_nonoverlapping(os_addr.as_ptr(), addr, os_addr.len() as usize); + // } + + // let connection_id = SOCKETS.read_single_connection(sockfd); + // SOCKETS.create_data_socket(connection_id, socket_addr) } +#[cfg(target_os = "linux")] unsafe extern "C" fn accept4_detour( sockfd: i32, - addr: *mut sockaddr, - addrlen: *mut socklen_t, - _flags: i32, + address: *mut sockaddr, + address_len: *mut socklen_t, + flags: i32, ) -> i32 { - accept_detour(sockfd, addr, addrlen) + let res = libc::accept4(sockfd, address, address_len, flags); + if res < 0 { + return res; + } + accept(sockfd, address, address_len, res) } pub fn enable_hooks(mut interceptor: Interceptor) { hook!(interceptor, "socket", socket_detour); hook!(interceptor, "bind", bind_detour); hook!(interceptor, "listen", listen_detour); + hook!(interceptor, "connect", connect_detour); hook!(interceptor, "getpeername", getpeername_detour); - hook!(interceptor, "setsockopt", setsockopt_detour); - try_hook!(interceptor, "uv__accept4", accept4_detour); - try_hook!(interceptor, "accept4", accept4_detour); + hook!(interceptor, "getsockname", getsockname_detour); + // hook!(interceptor, "setsockopt", setsockopt_detour); + #[cfg(target_os = "linux")] + { + try_hook!(interceptor, "uv__accept4", accept4_detour); + try_hook!(interceptor, "accept4", accept4_detour); + } try_hook!(interceptor, "accept", accept_detour); } diff --git a/mirrord-protocol/src/codec.rs b/mirrord-protocol/src/codec.rs index 25cf4513008..786839a5778 100644 --- a/mirrord-protocol/src/codec.rs +++ b/mirrord-protocol/src/codec.rs @@ -11,7 +11,8 @@ pub type Port = u16; pub struct NewTCPConnection { pub connection_id: ConnectionID, pub address: IpAddr, - pub port: Port, + pub destination_port: Port, + pub source_port: Port, } #[derive(Encode, Decode, Debug, PartialEq, Clone)] From 8be7cbf801484221b94000f106c9b28b48a2cce2 Mon Sep 17 00:00:00 2001 From: Eyal Bukchin Date: Thu, 12 May 2022 17:07:06 +0100 Subject: [PATCH 16/40] Create mirrord agent as job instead of pod (#48) --- mirrord-layer/src/config.rs | 3 + mirrord-layer/src/pod_api.rs | 108 +++++++++++++++++++---------------- 2 files changed, 62 insertions(+), 49 deletions(-) diff --git a/mirrord-layer/src/config.rs b/mirrord-layer/src/config.rs index b74ffbe1875..870f0f24862 100644 --- a/mirrord-layer/src/config.rs +++ b/mirrord-layer/src/config.rs @@ -22,4 +22,7 @@ pub struct Config { #[envconfig(from = "MIRRORD_ACCEPT_INVALID_CERTIFICATES", default = "false")] pub accept_invalid_certificates: bool, + + #[envconfig(from = "MIRRORD_AGENT_TTL", default = "0")] + pub agent_ttl: u16, } diff --git a/mirrord-layer/src/pod_api.rs b/mirrord-layer/src/pod_api.rs index ee32f4a59e1..f56f04887ec 100644 --- a/mirrord-layer/src/pod_api.rs +++ b/mirrord-layer/src/pod_api.rs @@ -1,7 +1,7 @@ use envconfig::Envconfig; -use k8s_openapi::api::core::v1::Pod; +use k8s_openapi::api::{batch::v1::Job, core::v1::Pod}; use kube::{ - api::{Api, Portforwarder, PostParams}, + api::{Api, ListParams, Portforwarder, PostParams}, runtime::wait::{await_condition, conditions::is_pod_running}, Client, Config, }; @@ -54,72 +54,82 @@ pub async fn create_agent( Client::try_default().await.unwrap() }; let runtime_data = RuntimeData::from_k8s(client.clone(), pod_name, pod_namespace).await; - let agent_pod_name = format!( + let agent_job_name = format!( "mirrord-agent-{}", Alphanumeric .sample_string(&mut rand::thread_rng(), 10) .to_lowercase() ); - let agent_pod: Pod = serde_json::from_value(json!({ - "metadata": { - "name": agent_pod_name - }, - "spec": { - "hostPID": true, - "nodeName": runtime_data.node_name, - "restartPolicy": "Never", - "volumes": [ - { - "name": "containerd", - "hostPath": { - "path": "/run/containerd/containerd.sock" - } - } - ], - "containers": [ - { - "name": "mirrord-agent", - "image": agent_image, - "imagePullPolicy": "Always", - "securityContext": { - "privileged": true - }, - "volumeMounts": [ + let agent_pod: Job = + serde_json::from_value(json!({ // Only Jobs support self deletion after completion + "metadata": { + "name": agent_job_name + }, + "spec": { + "ttlSecondsAfterFinished": env_config.agent_ttl, + + "template": { + "spec": { + "hostPID": true, + "nodeName": runtime_data.node_name, + "restartPolicy": "Never", + "volumes": [ { - "mountPath": "/run/containerd/containerd.sock", - "name": "containerd" + "name": "containerd", + "hostPath": { + "path": "/run/containerd/containerd.sock" + } } ], - "command": [ - "./mirrord-agent", - "--container-id", - runtime_data.container_id, - "-t", - "60" - ], - "env": [{"name": "RUST_LOG", "value": log_level}], + "containers": [ + { + "name": "mirrord-agent", + "image": agent_image, + "imagePullPolicy": "Always", + "securityContext": { + "privileged": true + }, + "volumeMounts": [ + { + "mountPath": "/run/containerd/containerd.sock", + "name": "containerd" + } + ], + "command": [ + "./mirrord-agent", + "--container-id", + runtime_data.container_id, + "-t", + "30" + ], + "env": [{"name": "RUST_LOG", "value": log_level}], + } + ] } - ] + } } - })) - .unwrap(); + } + )) + .unwrap(); - let pods_api: Api = Api::namespaced(client, agent_namespace); - pods_api + let jobs_api: Api = Api::namespaced(client.clone(), agent_namespace); + jobs_api .create(&PostParams::default(), &agent_pod) .await .unwrap(); - // Wait until the pod is running, otherwise we get 500 error. - let running = await_condition(pods_api.clone(), &agent_pod_name, is_pod_running()); - let _ = tokio::time::timeout(std::time::Duration::from_secs(15), running) + let pods_api: Api = Api::namespaced(client.clone(), agent_namespace); + let pods = pods_api + .list(&ListParams::default().labels(&format!("job-name={}", agent_job_name))) .await .unwrap(); - let pf = pods_api - .portforward(&agent_pod_name, &[61337]) + let pod = pods.items.first().unwrap(); + let pod_name = pod.metadata.name.clone().unwrap(); + let running = await_condition(pods_api.clone(), &pod_name, is_pod_running()); + let _ = tokio::time::timeout(std::time::Duration::from_secs(15), running) .await .unwrap(); - + let pf = pods_api.portforward(&pod_name, &[61337]).await.unwrap(); pf } From 43d34ce80fe973d3d78eadb5f8cefb7f62107854 Mon Sep 17 00:00:00 2001 From: Aviram Date: Fri, 13 May 2022 22:26:07 +0300 Subject: [PATCH 17/40] change accept_invalid_certificates to be a flag argument and not require a value --- mirrord-cli/src/main.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/mirrord-cli/src/main.rs b/mirrord-cli/src/main.rs index 2d994487938..3cef19ee5da 100644 --- a/mirrord-cli/src/main.rs +++ b/mirrord-cli/src/main.rs @@ -46,8 +46,8 @@ struct ExecArgs { pub binary: String, /// Accept/reject invalid certificates. - #[clap(parse(try_from_str), short = 'c', long)] - pub accept_invalid_certificates: Option, + #[clap(short = 'c', long)] + pub accept_invalid_certificates: bool, /// Arguments to pass to the binary. #[clap()] binary_args: Vec, @@ -113,11 +113,8 @@ fn exec(args: &ExecArgs) -> Result<()> { if let Some(image) = &args.agent_image { std::env::set_var("MIRRORD_AGENT_IMAGE", image.clone()); } - if let Some(accept_invalid_certificates) = &args.accept_invalid_certificates { - std::env::set_var( - "MIRRORD_ACCEPT_INVALID_CERTIFICATES", - accept_invalid_certificates.to_string(), - ); + if args.accept_invalid_certificates { + std::env::set_var("MIRRORD_ACCEPT_INVALID_CERTIFICATES", "true"); } let library_path = extract_library(None); add_to_preload(&library_path).unwrap(); From 3bcb6155cc2f49a1287b964976bb9dd9f92bc9b0 Mon Sep 17 00:00:00 2001 From: Mehul Arora Date: Mon, 16 May 2022 18:29:25 +0000 Subject: [PATCH 18/40] add watch on pod creation --- mirrord-layer/src/pod_api.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/mirrord-layer/src/pod_api.rs b/mirrord-layer/src/pod_api.rs index f56f04887ec..c6dcdba4add 100644 --- a/mirrord-layer/src/pod_api.rs +++ b/mirrord-layer/src/pod_api.rs @@ -1,13 +1,15 @@ use envconfig::Envconfig; +use futures::{StreamExt, TryStreamExt}; use k8s_openapi::api::{batch::v1::Job, core::v1::Pod}; use kube::{ api::{Api, ListParams, Portforwarder, PostParams}, + core::WatchEvent, runtime::wait::{await_condition, conditions::is_pod_running}, Client, Config, }; use rand::distributions::{Alphanumeric, DistString}; use serde_json::json; -use tracing::warn; +use tracing::{error, warn}; use crate::config; struct RuntimeData { @@ -120,6 +122,21 @@ pub async fn create_agent( .unwrap(); let pods_api: Api = Api::namespaced(client.clone(), agent_namespace); + let params = ListParams::default() + .labels(&format!("job-name={}", agent_job_name)) + .timeout(10); + let mut stream = pods_api.watch(¶ms, "0").await.unwrap().boxed(); + while let Some(status) = stream.try_next().await.unwrap() { + match status { + WatchEvent::Added(_) => break, + WatchEvent::Error(s) => { + error!("Error watching pods: {:?}", s); + break; + } + _ => {} + } + } + let pods = pods_api .list(&ListParams::default().labels(&format!("job-name={}", agent_job_name))) .await From d85f6edebb8be277cd03eb7d81bd995228cedb6e Mon Sep 17 00:00:00 2001 From: Eyal Bukchin Date: Thu, 19 May 2022 09:34:32 +0100 Subject: [PATCH 19/40] Adapt VSCode extension to v2.0 (#57) --- vscode-ext/libmirrord_layer.dylib | 1 + vscode-ext/libmirrord_layer.so | 1 + vscode-ext/package-lock.json | 159 ++++++++------------ vscode-ext/package.json | 8 +- vscode-ext/src/extension.ts | 237 +++++++++++------------------- 5 files changed, 148 insertions(+), 258 deletions(-) create mode 120000 vscode-ext/libmirrord_layer.dylib create mode 120000 vscode-ext/libmirrord_layer.so diff --git a/vscode-ext/libmirrord_layer.dylib b/vscode-ext/libmirrord_layer.dylib new file mode 120000 index 00000000000..11d4caf29e5 --- /dev/null +++ b/vscode-ext/libmirrord_layer.dylib @@ -0,0 +1 @@ +../target/debug/libmirrord_layer.dylib \ No newline at end of file diff --git a/vscode-ext/libmirrord_layer.so b/vscode-ext/libmirrord_layer.so new file mode 120000 index 00000000000..9bc07a3b548 --- /dev/null +++ b/vscode-ext/libmirrord_layer.so @@ -0,0 +1 @@ +../target/debug/libmirrord_layer.so \ No newline at end of file diff --git a/vscode-ext/package-lock.json b/vscode-ext/package-lock.json index 698be1fcd9f..76763fa2a79 100644 --- a/vscode-ext/package-lock.json +++ b/vscode-ext/package-lock.json @@ -8,7 +8,7 @@ "name": "mirrord", "version": "1.1.0", "dependencies": { - "@metalbear/mirrord-core": "^1.1.0", + "@kubernetes/client-node": "^0.16.3", "ffi-napi": "^4.0.3", "nan": "^2.15.0", "node-go-require": "^2.0.0", @@ -111,16 +111,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" }, - "node_modules/@metalbear/mirrord-core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@metalbear/mirrord-core/-/mirrord-core-1.1.0.tgz", - "integrity": "sha512-SOLM54ASStANgcjpNwTGsq1nzjwYc2vWFEMQJWr3zF8TTAnIk/m7zSR1I+WpyAjbDtxxQLW52f6uBKT64Pgxsg==", - "dependencies": { - "@kubernetes/client-node": "^0.16.3", - "net": "^1.0.2", - "short-uuid": "^4.2.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -231,6 +221,11 @@ "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" }, + "node_modules/@types/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==" + }, "node_modules/@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -238,9 +233,9 @@ "dev": true }, "node_modules/@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dependencies": { "@types/node": "*" } @@ -628,11 +623,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" - }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -1018,6 +1008,18 @@ "node": ">= 0.8" } }, + "node_modules/compress-brotli": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", + "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", + "dependencies": { + "@types/json-buffer": "~3.0.0", + "json-buffer": "~3.0.1" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2442,9 +2444,9 @@ } }, "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dependencies": { "has": "^1.0.3" }, @@ -2639,10 +2641,11 @@ } }, "node_modules/keyv": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", - "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.8.tgz", + "integrity": "sha512-IZZo6krhHWPhgsP5mBkEdPopVPN/stgCnBVuqi6dda/Nm5mDTOSVTrFMkWqlJsDum+B0YSe887tNxdjDWkO7aQ==", "dependencies": { + "compress-brotli": "^1.3.8", "json-buffer": "3.0.1" } }, @@ -2943,11 +2946,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "node_modules/net": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", - "integrity": "sha1-0XV+yaf7I3HYPPR1XOPifhCCk4g=" - }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", @@ -3709,26 +3707,6 @@ "node": ">=4" } }, - "node_modules/short-uuid": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/short-uuid/-/short-uuid-4.2.0.tgz", - "integrity": "sha512-r3cxuPPZSuF0QkKsK9bBR7u+7cwuCRzWzgjPh07F5N2iIUNgblnMHepBY16xgj5t1lG9iOP9k/TEafY1qhRzaw==", - "dependencies": { - "any-base": "^1.1.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/short-uuid/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -4012,9 +3990,9 @@ } }, "node_modules/underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==" + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.3.tgz", + "integrity": "sha512-QvjkYpiD+dJJraRA8+dGAU4i7aBbb2s0S3jA45TFOvg2VgqvdCDd/3N6CqA8gluk1W91GLoXg5enMUx560QzuA==" }, "node_modules/unzipper": { "version": "0.10.11", @@ -4292,16 +4270,6 @@ } } }, - "@metalbear/mirrord-core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@metalbear/mirrord-core/-/mirrord-core-1.1.0.tgz", - "integrity": "sha512-SOLM54ASStANgcjpNwTGsq1nzjwYc2vWFEMQJWr3zF8TTAnIk/m7zSR1I+WpyAjbDtxxQLW52f6uBKT64Pgxsg==", - "requires": { - "@kubernetes/client-node": "^0.16.3", - "net": "^1.0.2", - "short-uuid": "^4.2.0" - } - }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4388,6 +4356,11 @@ "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" }, + "@types/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==" + }, "@types/json-schema": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", @@ -4395,9 +4368,9 @@ "dev": true }, "@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "requires": { "@types/node": "*" } @@ -4663,11 +4636,6 @@ "color-convert": "^2.0.1" } }, - "any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" - }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -4967,6 +4935,15 @@ "delayed-stream": "~1.0.0" } }, + "compress-brotli": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", + "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", + "requires": { + "@types/json-buffer": "~3.0.0", + "json-buffer": "~3.0.1" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5949,9 +5926,9 @@ } }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "requires": { "has": "^1.0.3" } @@ -6096,10 +6073,11 @@ } }, "keyv": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.1.1.tgz", - "integrity": "sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.8.tgz", + "integrity": "sha512-IZZo6krhHWPhgsP5mBkEdPopVPN/stgCnBVuqi6dda/Nm5mDTOSVTrFMkWqlJsDum+B0YSe887tNxdjDWkO7aQ==", "requires": { + "compress-brotli": "^1.3.8", "json-buffer": "3.0.1" } }, @@ -6322,11 +6300,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "net": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", - "integrity": "sha1-0XV+yaf7I3HYPPR1XOPifhCCk4g=" - }, "next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", @@ -6890,22 +6863,6 @@ "rechoir": "^0.6.2" } }, - "short-uuid": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/short-uuid/-/short-uuid-4.2.0.tgz", - "integrity": "sha512-r3cxuPPZSuF0QkKsK9bBR7u+7cwuCRzWzgjPh07F5N2iIUNgblnMHepBY16xgj5t1lG9iOP9k/TEafY1qhRzaw==", - "requires": { - "any-base": "^1.1.0", - "uuid": "^8.3.2" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - } - } - }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -7113,9 +7070,9 @@ "dev": true }, "underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==" + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.3.tgz", + "integrity": "sha512-QvjkYpiD+dJJraRA8+dGAU4i7aBbb2s0S3jA45TFOvg2VgqvdCDd/3N6CqA8gluk1W91GLoXg5enMUx560QzuA==" }, "unzipper": { "version": "0.10.11", diff --git a/vscode-ext/package.json b/vscode-ext/package.json index a866874b133..41f157a1105 100644 --- a/vscode-ext/package.json +++ b/vscode-ext/package.json @@ -17,7 +17,7 @@ ], "icon": "images/icon.png", "activationEvents": [ - "onDebug" + "*" ], "contributes": { "commands": [ @@ -53,8 +53,8 @@ "@types/glob": "^7.2.0", "@types/mocha": "^9.0.0", "@types/node": "14.x", - "@types/vscode": "^1.63.0", "@types/request": "^2.48.0", + "@types/vscode": "^1.63.0", "@typescript-eslint/eslint-plugin": "^5.9.1", "@typescript-eslint/parser": "^5.9.1", "@vscode/test-electron": "^2.0.3", @@ -66,13 +66,13 @@ "typescript": "^4.5.4" }, "dependencies": { + "@kubernetes/client-node": "^0.16.3", "ffi-napi": "^4.0.3", "nan": "^2.15.0", "node-go-require": "^2.0.0", "node-netstat": "^1.8.0", "ref-array-napi": "^1.2.2", "ref-napi": "^3.0.3", - "ref-struct-napi": "^1.1.1", - "@metalbear/mirrord-core": "^1.1.0" + "ref-struct-napi": "^1.1.1" } } diff --git a/vscode-ext/src/extension.ts b/vscode-ext/src/extension.ts index 0abaaa86f6f..c22b80b5ab8 100644 --- a/vscode-ext/src/extension.ts +++ b/vscode-ext/src/extension.ts @@ -1,174 +1,77 @@ import * as vscode from 'vscode'; -import { MirrorD, MirrorEvent, K8SAPI } from '@metalbear/mirrord-core'; -class ProcessCapturer implements vscode.DebugAdapterTracker { - static pid: number; - - onDidSendMessage(m: any) { - if (m.event === 'process' && m.body.systemProcessId) { - ProcessCapturer.pid = m.body.systemProcessId; - } - } -} +const k8s = require('@kubernetes/client-node'); +const path = require('path'); +const os = require('os'); +const LIBRARIES: {[platform: string] : string} = { + 'darwin' : 'libmirrord_layer.dylib', + 'linux' : 'libmirrord_layer.so' +}; -let running = false; let buttons: { toggle: vscode.StatusBarItem, settings: vscode.StatusBarItem }; let globalContext: vscode.ExtensionContext; - -let openedPods = new Map(); -let k8sApi: K8SAPI | null = null; - - - -async function cleanup(sessionId?: string, hideButtons: boolean = true) { - vscode.commands.executeCommand('setContext', 'mirrord.activated', false); - if (sessionId) { - const mirror = openedPods.get(sessionId); - await mirror?.stop(); - } - else { - for (const mirror of openedPods.values()) { - try { await mirror.stop(); } - catch (e) { console.error(e); } - } - } - if (hideButtons) { - for (const button of Object.values(buttons)) { - button.hide(); - } - } - buttons.toggle.text = "Start mirrord"; - running = false; -} - -async function runMirrorD() { - let session = vscode.debug.activeDebugSession; - if (session === undefined) { - return; - } - if (k8sApi === null) { - return; - } - - if (running) { - cleanup(session.id, false); - } else { - running = true; - buttons.toggle.text = 'Stop mirrord (loading)'; - - const namespace = globalContext.workspaceState.get('namespace', 'default'); - // Get pods from kubectl and let user select one to mirror - let pods = await k8sApi.listPods(namespace); - let podNames = pods.body.items.map((pod: { metadata: { name: any; }; }) => { return pod.metadata.name; }); - - vscode.window.showQuickPick(podNames, { placeHolder: 'Select pod to mirror' }).then(async podName => { - if (session === undefined || podName === undefined || k8sApi === null) { - return; - } - // Infer container id from pod name - let selectedPod = pods.body.items.find((pod: { metadata: { name: any; }; }) => pod.metadata.name === podName); - let containerID = selectedPod.status.containerStatuses[0].containerID.split('//')[1]; - let nodeName = selectedPod.spec.nodeName; - - // Infer port from process ID - let port: string = ''; - if (session.configuration.mirrord && session.configuration.mirrord.port) { - port = session.configuration.mirrord.port; - } else { - var netstat = require('node-netstat'); - netstat.commands['darwin'].args.push('-a'); // The default args don't list LISTEN ports on OSX - // TODO: Check on other linux, windows - netstat({ - filter: { - pid: ProcessCapturer.pid, - protocol: 'tcp', - }, - sync: true, - limit: 5, - }, (data: { state: string; local: { port: string; }; }) => { - if (data.state === 'LISTEN') { - port = data.local.port; - } - }); - } - - if (!port) { - throw new Error("Could not find the debugged process' port"); - } - - let packetCount = 0; - - - function updateCallback(event: MirrorEvent, data: any) { - switch (event) { - case MirrorEvent.packetReceived: - packetCount++; - buttons.toggle.text = 'Stop mirrord (packets mirrored: ' + packetCount + ')'; - break; - } - } - - if (k8sApi === null) { - return; - } - let remotePort = globalContext.workspaceState.get('remotePort', 80); - let mirrord = new MirrorD(nodeName, containerID, [{ remotePort: remotePort, localPort: parseInt(port) }], namespace, k8sApi, updateCallback); - openedPods.set(session.id, mirrord); - await mirrord.start(); - buttons.toggle.text = 'Stop mirrord'; - }); - } -}; +let k8sApi: any; async function changeSettings() { - let namespace = globalContext.workspaceState.get('namespace', 'default'); - let remotePort = globalContext.workspaceState.get('remotePort', 80); + let agentNamespace = globalContext.workspaceState.get('agentNamespace', 'default'); + let impersonatedPodNamespace = globalContext.workspaceState.get('impersonatedPodNamespace', 'default'); - const options = ['Change namespace (current: ' + namespace + ')', 'Change remote port (current: ' + remotePort + ')']; + const options = ['Change namespace for mirrord agent (current: ' + agentNamespace + ')', + 'Change namespace for impersonated pod (current: ' + impersonatedPodNamespace + ')']; vscode.window.showQuickPick(options).then(async setting => { if (setting === undefined) { return; } if (setting.startsWith('Change namespace')) { - let namespaces = await k8sApi?.api.listNamespace(); + let namespaces = await k8sApi.listNamespace(); let namespaceNames = namespaces.body.items.map((namespace: { metadata: { name: any; }; }) => { return namespace.metadata.name; }); vscode.window.showQuickPick(namespaceNames, { placeHolder: 'Select namespace' }).then(async namespaceName => { if (namespaceName === undefined) { return; } - globalContext.workspaceState.update('namespace', namespaceName); - }); - - } else if (setting.startsWith('Change remote port')) { - vscode.window.showInputBox({ prompt: 'Enter new remote port' }).then(async port => { - if (port === undefined) { - return; + if (setting.startsWith('Change namespace for mirrord agent')) { + globalContext.workspaceState.update('agentNamespace', namespaceName); + } else if (setting.startsWith('Change namespace for impersonated pod')) { + globalContext.workspaceState.update('impersonatedPodNamespace', namespaceName); } - globalContext.workspaceState.update('remotePort', parseInt(port)); }); + } }); } +async function toggle(state: vscode.Memento, button: vscode.StatusBarItem) { + if (state.get('enabled')) { + // vscode.debug.registerDebugConfigurationProvider('*', new ConfigurationProvider(), 2); + state.update('enabled', false); + button.text = 'Enable mirrord'; + } else { + state.update('enabled', true); + button.text = 'Disable mirrord'; + } +} + // this method is called when your extension is activated // your extension is activated the very first time the command is executed export async function activate(context: vscode.ExtensionContext) { + // TODO: Download mirrord according to platform + globalContext = context; - k8sApi = new K8SAPI(); - openedPods = new Map(); - let trackerDisposable = vscode.debug.registerDebugAdapterTrackerFactory('*', { - createDebugAdapterTracker(_session: vscode.DebugSession) { - return new ProcessCapturer(); - } - }); - context.subscriptions.push(trackerDisposable); + let k8sConfig = new k8s.KubeConfig(); + k8sConfig.loadFromDefault(); + k8sApi = k8sConfig.makeApiClient(k8s.CoreV1Api); - buttons = {toggle: vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 1), settings: vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 0)}; + context.globalState.update('enabled', false); + vscode.debug.registerDebugConfigurationProvider('*', new ConfigurationProvider(), 2); + buttons = { toggle: vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 0), settings: vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 0) }; const toggleCommandId = 'mirrord.toggleMirroring'; - context.subscriptions.push(vscode.commands.registerCommand(toggleCommandId, runMirrorD)); - buttons.toggle.text = 'Start mirrord'; + context.subscriptions.push(vscode.commands.registerCommand(toggleCommandId, async function () { + toggle(context.globalState, buttons.toggle); + })); + + buttons.toggle.text = 'Enable mirrord'; buttons.toggle.command = toggleCommandId; const settingsCommandId = 'mirrord.changeSettings'; @@ -178,27 +81,55 @@ export async function activate(context: vscode.ExtensionContext) { for (const button of Object.values(buttons)) { context.subscriptions.push(button); + button.show(); }; + // vscode.commands.executeCommand('setContext', 'mirrord.activated', true); +} + - let debugDisposable = vscode.debug.onDidStartDebugSession(async _session => { - for (const button of Object.values(buttons)) { - button.show(); +class ConfigurationProvider implements vscode.DebugConfigurationProvider { + async resolveDebugConfiguration(folder: vscode.WorkspaceFolder | undefined, config: vscode.DebugConfiguration, token: vscode.CancellationToken): Promise { + if (!globalContext.globalState.get('enabled')) { + return new Promise(resolve => { resolve(config) }); + } + if (config.runtimeExecutable === undefined) { // For some reason resolveDebugConfiguration runs twice. runTimeExecutable is undefined the second time. + return new Promise(resolve => { + return resolve(config); + }); } - }); - context.subscriptions.push(debugDisposable); - let debugEndedDisposable = vscode.debug.onDidTerminateDebugSession(async (session: vscode.DebugSession) => { - cleanup(session.id); + const namespace = globalContext.workspaceState.get('namespace', 'default'); + // Get pods from kubectl and let user select one to mirror + let pods = await k8sApi.listNamespacedPod(namespace); + let podNames = pods.body.items.map((pod: { metadata: { name: any; }; }) => { return pod.metadata.name; }); - }); + return await vscode.window.showQuickPick(podNames, { placeHolder: 'Select pod to mirror' }).then(async podName => { + return new Promise(resolve => { + console.log(config); + const namespace = globalContext.workspaceState.get('namespace', 'default'); + // Get pods from kubectl and let user select one to mirror + if (k8sApi === null) { + return; + } - context.subscriptions.push(debugEndedDisposable); - vscode.commands.executeCommand('setContext', 'mirrord.activated', true); + let libraryPath; + if (globalContext.extensionMode === vscode.ExtensionMode.Development) { + libraryPath = path.join(path.dirname(globalContext.extensionPath), "target", "debug"); + } else { + libraryPath = globalContext.extensionPath; + } + + config.env = { + // eslint-disable-next-line @typescript-eslint/naming-convention + 'DYLD_INSERT_LIBRARIES': path.join(libraryPath, LIBRARIES[os.platform()]), + // eslint-disable-next-line @typescript-eslint/naming-convention + 'MIRRORD_AGENT_IMPERSONATED_POD_NAME': podName + }; + return resolve(config); + }); + }); + } } -// this method is called when your extension is deactivated -export function deactivate() { - cleanup(); -} From fcd78f6858abcb63bb454417c9b488aa3666210a Mon Sep 17 00:00:00 2001 From: Eyal Bukchin Date: Thu, 19 May 2022 18:32:59 +0100 Subject: [PATCH 20/40] Make getpeername and getsockame optional (#60) --- mirrord-layer/src/sockets.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mirrord-layer/src/sockets.rs b/mirrord-layer/src/sockets.rs index ca79003fd84..4aec550d23a 100644 --- a/mirrord-layer/src/sockets.rs +++ b/mirrord-layer/src/sockets.rs @@ -544,8 +544,8 @@ pub fn enable_hooks(mut interceptor: Interceptor) { hook!(interceptor, "bind", bind_detour); hook!(interceptor, "listen", listen_detour); hook!(interceptor, "connect", connect_detour); - hook!(interceptor, "getpeername", getpeername_detour); - hook!(interceptor, "getsockname", getsockname_detour); + try_hook!(interceptor, "getpeername", getpeername_detour); + try_hook!(interceptor, "getsockname", getsockname_detour); // hook!(interceptor, "setsockopt", setsockopt_detour); #[cfg(target_os = "linux")] { From 0c709d39050c266cc5c2ac1180472944c49afc5d Mon Sep 17 00:00:00 2001 From: meowjesty <43983236+meowjesty@users.noreply.github.com> Date: Thu, 19 May 2022 17:14:41 -0300 Subject: [PATCH 21/40] Refactoring `mirrord-layer` `select!` body into functions. (#58) * Refactor poll_agent select! body into two separate functions, 1 handles HookMessage and 2 handles DaemonMessage. * Add inline to handle_x functions. --- mirrord-layer/src/lib.rs | 188 +++++++++++++++++++++------------------ 1 file changed, 103 insertions(+), 85 deletions(-) diff --git a/mirrord-layer/src/lib.rs b/mirrord-layer/src/lib.rs index 99bbd7e20ff..9d55cd3f7f3 100644 --- a/mirrord-layer/src/lib.rs +++ b/mirrord-layer/src/lib.rs @@ -1,13 +1,10 @@ -// #![feature(c_variadic)] - use std::{ collections::HashMap, net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, os::unix::io::RawFd, - thread, - time::Duration, }; +use actix_codec::{AsyncRead, AsyncWrite}; use ctor::ctor; use envconfig::Envconfig; use frida_gum::{interceptor::Interceptor, Gum}; @@ -23,7 +20,7 @@ use tokio::{ sync::mpsc::{channel, Receiver, Sender}, task, }; -use tracing::{debug, error}; +use tracing::{debug, error, info}; mod common; mod config; @@ -97,8 +94,10 @@ fn init() { .with(tracing_subscriber::EnvFilter::from_default_env()) .init(); - debug!("init called"); + info!("Initializing mirrord-layer!"); + let config = Config::init_from_env().unwrap(); + let pf = RUNTIME.block_on(pod_api::create_agent( &config.impersonated_pod_name, &config.impersonated_pod_namespace, @@ -106,101 +105,120 @@ fn init() { config.agent_rust_log, config.agent_image, )); + let (sender, receiver) = channel::(1000); unsafe { HOOK_SENDER = Some(sender); }; + enable_hooks(); + RUNTIME.spawn(poll_agent(pf, receiver)); } +#[inline] +async fn handle_hook_message( + hook_message: HookMessage, + port_mapping: &mut HashMap, + codec: &mut actix_codec::Framed, +) { + match hook_message { + HookMessage::Listen(listen_message) => { + debug!("HookMessage::Listen {:?}", listen_message); + + let _listen_data = codec + .send(ClientMessage::PortSubscribe(vec![listen_message.real_port])) + .await + .map(|()| { + port_mapping.insert( + listen_message.real_port, + ListenData { + port: listen_message.fake_port, + ipv6: listen_message.ipv6, + fd: listen_message.fd, + }, + ) + }); + } + } +} + +#[inline] +async fn handle_daemon_message( + daemon_message: DaemonMessage, + port_mapping: &mut HashMap, + active_connections: &mut HashMap>, +) { + match daemon_message { + DaemonMessage::NewTCPConnection(conn) => { + debug!("DaemonMessage::NewTCPConnection {conn:#?}"); + + let _ = port_mapping + .get(&conn.destination_port) + .map(|listen_data| { + let addr = match listen_data.ipv6 { + false => SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), listen_data.port), + true => SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), listen_data.port), + }; + + let info = + SocketInformation::new(SocketAddr::new(conn.address, conn.source_port)); + { + CONNECTION_QUEUE.lock().unwrap().add(&listen_data.fd, info); + } + + TcpStream::connect(addr) + }) + .map(|stream| { + let (sender, receiver) = channel::(1000); + + active_connections.insert(conn.connection_id, sender); + + task::spawn(async move { tcp_tunnel(stream.await.unwrap(), receiver).await }) + }); + } + DaemonMessage::TCPData(msg) => { + if let Err(fail) = active_connections + .get(&msg.connection_id) + .map(|sender| sender.send(TcpTunnelMessages::Data(msg.data))) + .unwrap() + .await + { + error!("DaemonMessage::TCPData error {fail:#?}"); + active_connections.remove(&msg.connection_id); + } + } + DaemonMessage::TCPClose(msg) => { + if let Err(fail) = active_connections + .get(&msg.connection_id) + .map(|sender| sender.send(TcpTunnelMessages::Close)) + .unwrap() + .await + { + error!("DaemonMessage::TCPClose error {fail:#?}"); + active_connections.remove(&msg.connection_id); + } + } + DaemonMessage::Close => todo!(), + DaemonMessage::LogMessage(_) => todo!(), + } +} + async fn poll_agent(mut pf: Portforwarder, mut receiver: Receiver) { let port = pf.take_stream(61337).unwrap(); // TODO: Make port configurable + + // `codec` is used to retrieve messages from the daemon (messages that are sent from -agent to + // -layer) let mut codec = actix_codec::Framed::new(port, ClientCodec::new()); let mut port_mapping: HashMap = HashMap::new(); let mut active_connections = HashMap::new(); loop { select! { - message = receiver.recv() => { - match message { - Some(HookMessage::Listen(msg)) => { - debug!("received message from hook {:?}", msg); - codec.send(ClientMessage::PortSubscribe(vec![msg.real_port])).await.unwrap(); - port_mapping.insert(msg.real_port, ListenData{port: msg.fake_port, ipv6: msg.ipv6, fd: msg.fd}); - } - None => { - debug!("NONE in recv"); - break - } - } + hook_message = receiver.recv() => { + handle_hook_message(hook_message.unwrap(), &mut port_mapping, &mut codec).await; } - message = codec.next() => { - match message { - Some(Ok(DaemonMessage::NewTCPConnection(conn))) => { - debug!("new connection {:?}", conn); - let listen_data = match port_mapping.get(&conn.destination_port) { - Some(listen_data) => (*listen_data).clone(), - None => { - debug!("no listen_data for {:?}", conn.destination_port); - continue; - } - }; - let addr = match listen_data.ipv6 { - false => SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), listen_data.port), - true => SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), listen_data.port), - }; - let info = SocketInformation::new(SocketAddr::new(conn.address, conn.source_port)); - { - CONNECTION_QUEUE.lock().unwrap().add(&listen_data.fd, info); - } - let stream = match TcpStream::connect(addr).await { - Ok(stream) => stream, - Err(err) => { - error!("failed to connect to port {:?}", err); - continue; - } - }; - let (sender, receiver) = channel::(1000); - active_connections.insert(conn.connection_id, sender); - task::spawn(async move { - tcp_tunnel(stream, receiver).await - }); - } - Some(Ok(DaemonMessage::TCPData(msg))) => { - let sender = match active_connections.get(&msg.connection_id) { - Some(sender) => sender, - None => { - debug!("no sender for {:?}", msg.connection_id); - continue; - } - }; - if let Err(err) = sender.send(TcpTunnelMessages::Data(msg.data)).await { - debug!("sender error {:?}", err); - active_connections.remove(&msg.connection_id); - } - }, - Some(Ok(DaemonMessage::TCPClose(msg))) => { - let sender = match active_connections.remove(&msg.connection_id) { - Some(sender) => sender, - None => { - debug!("no sender for {:?}", msg.connection_id); - continue; - } - }; - if let Err(err) = sender.send(TcpTunnelMessages::Close).await { - debug!("sender error {:?}", err); - } - } - Some(_) => { - debug!("NONE in some"); - break - }, - None => { - thread::sleep(Duration::from_millis(2000)); - debug!("NONE in none"); - continue - } - } + daemon_message = codec.next() => { + handle_daemon_message(daemon_message.unwrap().unwrap(), &mut port_mapping, &mut active_connections).await; } } } From 5156368336c5c31c9498d5245c70dc2441875e8f Mon Sep 17 00:00:00 2001 From: Eyal Bukchin Date: Sun, 22 May 2022 21:45:55 +0100 Subject: [PATCH 22/40] Fix clippy errors (#71) --- mirrord-protocol/src/codec.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mirrord-protocol/src/codec.rs b/mirrord-protocol/src/codec.rs index 786839a5778..9206d8178d4 100644 --- a/mirrord-protocol/src/codec.rs +++ b/mirrord-protocol/src/codec.rs @@ -7,7 +7,7 @@ use bytes::{Buf, BufMut, BytesMut}; pub type ConnectionID = u16; pub type Port = u16; -#[derive(Encode, Decode, Debug, PartialEq, Clone)] +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone)] pub struct NewTCPConnection { pub connection_id: ConnectionID, pub address: IpAddr, @@ -15,30 +15,30 @@ pub struct NewTCPConnection { pub source_port: Port, } -#[derive(Encode, Decode, Debug, PartialEq, Clone)] +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone)] pub struct TCPData { pub connection_id: ConnectionID, pub data: Vec, } -#[derive(Encode, Decode, Debug, PartialEq, Clone)] +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone)] pub struct TCPClose { pub connection_id: ConnectionID, } -#[derive(Encode, Decode, Debug, PartialEq, Clone)] +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone)] pub struct LogMessage { pub message: String, } -#[derive(Encode, Decode, Debug, PartialEq, Clone)] +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone)] pub enum ClientMessage { PortSubscribe(Vec), Close, ConnectionUnsubscribe(ConnectionID), } -#[derive(Encode, Decode, Debug, PartialEq, Clone)] +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone)] pub enum DaemonMessage { Close, NewTCPConnection(NewTCPConnection), From efb6f1aac3934a0d4ad5470112817d817aa0976c Mon Sep 17 00:00:00 2001 From: Eyal Bukchin Date: Mon, 23 May 2022 10:38:16 +0100 Subject: [PATCH 23/40] Publish ext in ci (#70) * Add workflow to publish VSCode extension --- .github/workflows/release.yaml | 44 ++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 583c589fffe..048238eb7fb 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -1,5 +1,11 @@ name: Release -on: +on: + workflow_dispatch: + inputs: + version: + type: string + description: Version to release + required: true push: tags: - "*.*.*" @@ -16,4 +22,38 @@ jobs: - uses: katyo/publish-crates@v1 with: registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }} - # add publish docker image \ No newline at end of file + # add publish docker image + release_vscode_ext: + strategy: + matrix: + include: + - os: ubuntu-18.04 + extension: so + target: x86_64-unknown-linux-gnu + code-target: linux-x64 + - os: ubuntu-18.04 + extension: so + target: aarch64-unknown-linux-gnu + code-target: linux-arm64 + - os: macos-11 + extension: dylib + target: x86_64-apple-darwin + code-target: darwin-x64 + - os: macos-11 + extension: dylib + target: aarch64-apple-darwin + code-target: darwin-arm64 + runs-on: ${{matrix.os}} + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + target: ${{matrix.target}} + - run: npm install -g vsce typescript esbuild + - run: cargo +nightly build --release --manifest-path=mirrord-layer/Cargo.toml --target=${{matrix.target}} + - run: mv target/release/libmirrord_layer.${{matrix.extension}} vscode-ext/ + - run: cd vscode-ext && npm install && tsc && vsce publish {{github.event.inputs.version}} --allow-star-activation --target ${{matrix.code-target}} --pre-release + env: + VSCE_PAT: ${{ secrets.VSCE_PAT }} From a768e892f1e1ac7eac1c19b6b83c097617f6cea4 Mon Sep 17 00:00:00 2001 From: Aviram Hassan Date: Mon, 23 May 2022 20:13:22 +0300 Subject: [PATCH 24/40] Fix fd leak (#72) * add hook to close, fix fd leak --- mirrord-layer/src/sockets.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mirrord-layer/src/sockets.rs b/mirrord-layer/src/sockets.rs index 4aec550d23a..95c6f80695e 100644 --- a/mirrord-layer/src/sockets.rs +++ b/mirrord-layer/src/sockets.rs @@ -539,7 +539,17 @@ unsafe extern "C" fn accept4_detour( accept(sockfd, address, address_len, res) } +fn close(fd: c_int) { + SOCKETS.lock().unwrap().remove(&fd); +} + +unsafe extern "C" fn close_detour(fd: c_int) -> c_int { + close(fd); + libc::close(fd) +} + pub fn enable_hooks(mut interceptor: Interceptor) { + hook!(interceptor, "close", close_detour); hook!(interceptor, "socket", socket_detour); hook!(interceptor, "bind", bind_detour); hook!(interceptor, "listen", listen_detour); From 4d31949336e8238bf83805cfd7d6fc66ab1a7a3a Mon Sep 17 00:00:00 2001 From: Aviram Hassan Date: Mon, 23 May 2022 21:52:25 +0300 Subject: [PATCH 25/40] =?UTF-8?q?enable=20use=20of=20workspace=20inheritan?= =?UTF-8?q?ce,=20so=20versions=20and=20more=20info=20will=20m=E2=80=A6=20(?= =?UTF-8?q?#73)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * enable use of workspace inheritance, so versions and more info will match workspace settings. remove unused deps --- .github/workflows/ci.yaml | 3 +- Cargo.lock | 309 ++++++++++-------------------------- Cargo.toml | 30 +++- mirrord-agent/Cargo.toml | 39 +++-- mirrord-agent/src/main.rs | 6 +- mirrord-cli/Cargo.toml | 26 ++- mirrord-layer/Cargo.toml | 44 +++-- mirrord-protocol/Cargo.toml | 26 +-- 8 files changed, 203 insertions(+), 280 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5ae7ab15531..0b250ce409a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -43,8 +43,9 @@ jobs: with: profile: minimal toolchain: nightly + components: rustfmt - run: sudo apt install -y libpcap-dev cmake - - run: sudo PATH=/home/runner/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin:/usr/bin:/usr/sbin /home/runner/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin/cargo test --manifest-path mirrord-agent/Cargo.toml + - run: sudo PATH=/home/runner/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin:/usr/bin:/usr/sbin /home/runner/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/cargo test -p mirrord-agent test_agent_image: runs-on: ubuntu-latest diff --git a/Cargo.lock b/Cargo.lock index c0294e7b216..9ba757ac5c9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16,7 +16,7 @@ dependencies = [ "memchr", "pin-project-lite", "tokio", - "tokio-util 0.7.1", + "tokio-util 0.7.2", ] [[package]] @@ -111,7 +111,7 @@ checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" dependencies = [ "getrandom", "instant", - "rand 0.8.5", + "rand", ] [[package]] @@ -148,7 +148,7 @@ dependencies = [ "cexpr", "clang-sys", "clap 2.34.0", - "env_logger 0.8.4", + "env_logger", "lazy_static", "lazycell", "log", @@ -250,9 +250,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cc00842eed744b858222c4c9faf7243aafc6d33f92f96935263ef4d8a41ce21" +checksum = "bf6b561dcf059c85bbe388e0a7b0a1469acb3934cc0cfa148613a830629e3049" dependencies = [ "glob", "libc", @@ -276,9 +276,9 @@ dependencies = [ [[package]] name = "clap" -version = "3.1.15" +version = "3.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a35a599b11c089a7f49105658d089b8f2cf0882993c17daf6de15285c2c35d" +checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" dependencies = [ "atty", "bitflags", @@ -293,9 +293,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.1.7" +version = "3.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3aab4734e083b809aaf5794e14e756d1c798d2c69c7f7de7a09a2f5214993c1" +checksum = "25320346e922cffe59c0bbc5410c8d8784509efb321488971081313cb1e1a33c" dependencies = [ "heck 0.4.0", "proc-macro-error", @@ -482,19 +482,6 @@ dependencies = [ "termcolor", ] -[[package]] -name = "env_logger" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - [[package]] name = "envconfig" version = "0.10.0" @@ -641,12 +628,6 @@ dependencies = [ "frida-build", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - [[package]] name = "futures" version = "0.3.21" @@ -778,7 +759,7 @@ dependencies = [ "indexmap", "slab", "tokio", - "tokio-util 0.7.1", + "tokio-util 0.7.2", "tracing", ] @@ -825,9 +806,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", "http", @@ -941,9 +922,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.8.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" dependencies = [ "autocfg", "hashbrown", @@ -958,22 +939,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "io-extras" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c90f9c8f5bda269ce32e960d433de3fc932ab8f347500e866da45ec70f67e0d2" -dependencies = [ - "io-lifetimes", - "winapi", -] - -[[package]] -name = "io-lifetimes" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9448015e586b611e5d322f6703812bbca2f1e709d5773ecd38ddb4e3bb649504" - [[package]] name = "ipnet" version = "2.5.0" @@ -1000,9 +965,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" [[package]] name = "js-sys" @@ -1087,7 +1052,7 @@ dependencies = [ "kube-core", "pem", "pin-project", - "rand 0.8.5", + "rand", "rustls", "rustls-pemfile 0.3.0", "secrecy", @@ -1097,7 +1062,7 @@ dependencies = [ "thiserror", "tokio", "tokio-tungstenite", - "tokio-util 0.7.1", + "tokio-util 0.7.2", "tower", "tower-http", "tracing", @@ -1154,7 +1119,7 @@ dependencies = [ "smallvec", "thiserror", "tokio", - "tokio-util 0.7.1", + "tokio-util 0.7.2", "tracing", ] @@ -1172,9 +1137,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.125" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" +checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" [[package]] name = "libloading" @@ -1202,12 +1167,6 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" -[[package]] -name = "linux-raw-sys" -version = "0.0.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d" - [[package]] name = "lock_api" version = "0.4.7" @@ -1276,33 +1235,22 @@ checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" [[package]] name = "mio" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" +checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799" dependencies = [ "libc", "log", - "miow", - "ntapi", "wasi 0.11.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi", + "windows-sys", ] [[package]] name = "mirrord" -version = "0.1.0" +version = "2.0.0-rc.1" dependencies = [ "anyhow", - "clap 3.1.15", + "clap 3.1.18", "exec", "mirrord-layer", "tracing", @@ -1311,13 +1259,12 @@ dependencies = [ [[package]] name = "mirrord-agent" -version = "2.0.0-alpha-4" +version = "2.0.0-rc.1" dependencies = [ "actix-codec", "anyhow", - "clap 3.1.15", + "clap 3.1.18", "containerd-client", - "env_logger 0.9.0", "futures", "mirrord-protocol", "nix", @@ -1330,17 +1277,17 @@ dependencies = [ "tokio", "tokio-stream", "tracing", + "tracing-subscriber", ] [[package]] name = "mirrord-layer" -version = "0.1.0" +version = "2.0.0-rc.1" dependencies = [ "actix-codec", "bytes", - "clap 3.1.15", + "clap 3.1.18", "ctor", - "env_logger 0.9.0", "envconfig", "errno", "frida-gum", @@ -1355,10 +1302,8 @@ dependencies = [ "nix", "os_socketaddr", "queues", - "rand 0.8.5", + "rand", "serde_json", - "socketpair", - "tempdir", "tokio", "tokio-stream", "tracing", @@ -1367,7 +1312,7 @@ dependencies = [ [[package]] name = "mirrord-protocol" -version = "0.2.0" +version = "2.0.0-rc.1" dependencies = [ "actix-codec", "bincode", @@ -1392,7 +1337,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ffa00dec017b5b1a8b7cf5e2c008bfda1aa7e0697ac1508b491fdf2622fb4d8" dependencies = [ - "rand 0.8.5", + "rand", ] [[package]] @@ -1436,15 +1381,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "ntapi" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" -dependencies = [ - "winapi", -] - [[package]] name = "num" version = "0.3.1" @@ -1544,9 +1480,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" +checksum = "7b10983b38c53aebdf33f542c6275b0f58a238129d00c4ae0e6fb59738d783ca" [[package]] name = "openssl" @@ -1614,9 +1550,9 @@ dependencies = [ [[package]] name = "os_str_bytes" -version = "6.0.0" +version = "6.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" +checksum = "029d8d0b2f198229de29dca79676f2738ff952edf3fde542eb8bf94d8c21b435" [[package]] name = "parking_lot" @@ -1684,9 +1620,9 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "petgraph" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f" +checksum = "51b305cc4569dd4e8765bab46261f67ef5d4d11a4b6e745100ee5dad8948b46c" dependencies = [ "fixedbitset", "indexmap", @@ -1850,11 +1786,11 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.37" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" +checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] @@ -1925,19 +1861,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" -dependencies = [ - "fuchsia-cprng", - "libc", - "rand_core 0.3.1", - "rdrand", - "winapi", -] - [[package]] name = "rand" version = "0.8.5" @@ -1946,7 +1869,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", - "rand_core 0.6.3", + "rand_core", ] [[package]] @@ -1956,24 +1879,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.3", + "rand_core", ] -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.2", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - [[package]] name = "rand_core" version = "0.6.3" @@ -1983,15 +1891,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", -] - [[package]] name = "redox_syscall" version = "0.2.13" @@ -2014,9 +1913,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.5.5" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" +checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" dependencies = [ "aho-corasick", "memchr", @@ -2034,9 +1933,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" [[package]] name = "remove_dir_all" @@ -2104,24 +2003,10 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustix" -version = "0.34.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e74b3f02f2b6eb33790923756784614f456de79d821d6b2670dc7d5fbea807" -dependencies = [ - "bitflags", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys", - "winapi", -] - [[package]] name = "rustls" -version = "0.20.4" -source = "git+https://github.com/rustls/rustls#093e88e7e180d44eb94b6f2c30b92a89f9f0cdbe" +version = "0.20.6" +source = "git+https://github.com/rustls/rustls#c6dcb4c0c63caf503bff80f07182ded0426107ed" dependencies = [ "log", "ring", @@ -2161,25 +2046,25 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" [[package]] name = "schannel" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" dependencies = [ "lazy_static", - "winapi", + "windows-sys", ] [[package]] name = "schemars" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6b5a3c80cea1ab61f4260238409510e814e38b4b563c06044edf91e7dc070e3" +checksum = "1847b767a3d62d95cbf3d8a9f0e421cf57a0d8aa4f411d4b16525afb0284d4ed" dependencies = [ "dyn-clone", "schemars_derive", @@ -2189,9 +2074,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ae4dce13e8614c46ac3c38ef1c0d668b101df6ac39817aebdaa26642ddae9b" +checksum = "af4d7e1b012cb3d9129567661a63755ea4b8a7386d339dc945ae187e403c6743" dependencies = [ "proc-macro2", "quote", @@ -2280,9 +2165,9 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.25.0" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ "proc-macro2", "quote", @@ -2382,19 +2267,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "socketpair" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4a66c5734072f44d758e9dbd4f1f0f041687c782535ce7a5428228c752b1a4" -dependencies = [ - "io-extras", - "io-lifetimes", - "rustix", - "uuid", - "winapi", -] - [[package]] name = "spin" version = "0.5.2" @@ -2415,13 +2287,13 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.92" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" +checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -2435,16 +2307,6 @@ dependencies = [ "xattr", ] -[[package]] -name = "tempdir" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" -dependencies = [ - "rand 0.4.6", - "remove_dir_all", -] - [[package]] name = "tempfile" version = "3.3.0" @@ -2535,9 +2397,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.18.1" +version = "1.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce653fb475565de9f6fb0614b28bca8df2c430c0cf84bcd9c843f15de5414cc" +checksum = "4903bf0427cf68dddd5aa6a93220756f8be0c34fcfa9f5e6191e103e15a31395" dependencies = [ "bytes", "libc", @@ -2620,9 +2482,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.9" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" dependencies = [ "bytes", "futures-core", @@ -2634,9 +2496,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" +checksum = "f988a1a1adc2fb21f9c12aa96441da33a1728193ae0b95d2be22dbd17fcb4e5c" dependencies = [ "bytes", "futures-core", @@ -2670,7 +2532,7 @@ dependencies = [ "prost-derive", "tokio", "tokio-stream", - "tokio-util 0.6.9", + "tokio-util 0.6.10", "tower", "tower-layer", "tower-service", @@ -2701,10 +2563,10 @@ dependencies = [ "indexmap", "pin-project", "pin-project-lite", - "rand 0.8.5", + "rand", "slab", "tokio", - "tokio-util 0.7.1", + "tokio-util 0.7.2", "tower-layer", "tower-service", "tracing", @@ -2842,7 +2704,7 @@ dependencies = [ "http", "httparse", "log", - "rand 0.8.5", + "rand", "sha-1", "thiserror", "url", @@ -2861,6 +2723,12 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +[[package]] +name = "unicode-ident" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" + [[package]] name = "unicode-normalization" version = "0.1.19" @@ -2882,12 +2750,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" -[[package]] -name = "unicode-xid" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" - [[package]] name = "untrusted" version = "0.7.1" @@ -2912,15 +2774,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom", -] - [[package]] name = "valuable" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 836a7078c32..bccc4b38def 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,10 +7,36 @@ members = [ "mirrord-cli", ] +[workspace.package] +version = "2.0.0-rc.1" +edition = "2021" +license = "MIT" +readme = "README.md" +repository = "https://github.com/metalbear/mirrord" +documentation = "https://mirrord.dev/docs" +authors = ["MetalBear "] +description = "run a local process in the context of a remote environment" +homepage = "https://mirrord.dev" +publish = false +keywords = ["cli", "backend", "debug", "test", "kubernetes", "cloud", "native", "local", "ide", "devtool", "developer", "tool"] +categories = ["development-tools", "backend", "devtool"] + +[workspace.dependencies] +actix-codec = "0.5" +bytes = "1" +tokio = { version = "1", features = ["full"] } +tokio-stream = "0.1.8" +serde_json = "1" +anyhow = "1" +nix = "0.23.1" +clap = { version = "3.1.2", features = ["derive"] } +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } +futures = "0.3.21" + # latest commits on rustls suppress certificate verification # https://github.com/rustls/rustls/pull/1032 # so we patch crates.io to use the latest commits from rustls -# this should be changed once a newer version of rustls is out - +# this should be changed once a newer version of rustls is ou [patch.crates-io] rustls = { git = 'https://github.com/rustls/rustls' } \ No newline at end of file diff --git a/mirrord-agent/Cargo.toml b/mirrord-agent/Cargo.toml index a2d3e4ff24a..d600244974e 100644 --- a/mirrord-agent/Cargo.toml +++ b/mirrord-agent/Cargo.toml @@ -1,26 +1,37 @@ +cargo-features = ["workspace-inheritance"] + [package] name = "mirrord-agent" -version = "2.0.0-alpha-4" -edition = "2021" - +version.workspace = true +authors.workspace = true +description.workspace = true +documentation.workspace = true +readme.workspace = true +homepage.workspace = true +repository.workspace = true +license.workspace = true +keywords.workspace = true +categories.workspace = true +publish.workspace = true +edition.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] containerd-client = {git = "https://github.com/containerd/rust-extensions", rev="6bc49c007cf93869e7d83fca4818b6aae1145b45"} -tokio = { version = "1", features = ["full"] } +tokio.workspace = true serde = { version = "1", features = ["derive"] } -serde_json = "1" +serde_json.workspace = true pcap = { git = "https://github.com/aviramha/pcap.git", branch="make_codec_public", features =["capture-stream"] } pnet = "0.29.0" -nix = "0.23.1" -anyhow = "1" -clap = { version = "3.1.2", features = ["derive"] } -mirrord-protocol = { path = "../mirrord-protocol", version = "*"} -env_logger = "0.9" -actix-codec = "0.5" -futures = "0.3.21" -tracing = "0.1.32" -tokio-stream = "0.1.8" +nix.workspace = true +anyhow.workspace = true +clap.workspace = true +mirrord-protocol = { path = "../mirrord-protocol"} +actix-codec.workspace = true +futures.workspace = true +tracing.workspace = true +tracing-subscriber.workspace = true +tokio-stream.workspace = true num-traits = "0.2.14" [dev-dependencies] diff --git a/mirrord-agent/src/main.rs b/mirrord-agent/src/main.rs index 897ca21aa37..78a7db6034f 100644 --- a/mirrord-agent/src/main.rs +++ b/mirrord-agent/src/main.rs @@ -15,6 +15,7 @@ use tokio::{ }; use tokio_stream::StreamExt; use tracing::{debug, error, info}; +use tracing_subscriber::prelude::*; mod cli; mod runtime; @@ -277,7 +278,10 @@ async fn start() -> Result<()> { #[tokio::main] async fn main() -> Result<()> { - env_logger::init(); + tracing_subscriber::registry() + .with(tracing_subscriber::fmt::layer()) + .with(tracing_subscriber::EnvFilter::from_default_env()) + .init(); match start().await { Ok(_) => { info!("Exiting successfuly") diff --git a/mirrord-cli/Cargo.toml b/mirrord-cli/Cargo.toml index a0414adf8b7..229ef764344 100644 --- a/mirrord-cli/Cargo.toml +++ b/mirrord-cli/Cargo.toml @@ -1,14 +1,26 @@ +cargo-features = ["workspace-inheritance"] + [package] name = "mirrord" -version = "0.1.0" -edition = "2021" +version.workspace = true +authors.workspace = true +description.workspace = true +documentation.workspace = true +readme.workspace = true +homepage.workspace = true +repository.workspace = true +license.workspace = true +keywords.workspace = true +categories.workspace = true +publish.workspace = true +edition.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = { version = "3", features = ["derive"] } -tracing = "0.1" -tracing-subscriber = { version = "0.3", features = ["env-filter"] } -mirrord-layer = { artifact = "cdylib", version = "0.1", path="../mirrord-layer" } +clap.workspace = true +tracing.workspace = true +tracing-subscriber.workspace = true +mirrord-layer = { artifact = "cdylib", path="../mirrord-layer" } exec = "0.3" -anyhow = "1" \ No newline at end of file +anyhow.workspace = true \ No newline at end of file diff --git a/mirrord-layer/Cargo.toml b/mirrord-layer/Cargo.toml index ea328c64b9a..779417d7510 100644 --- a/mirrord-layer/Cargo.toml +++ b/mirrord-layer/Cargo.toml @@ -1,39 +1,49 @@ +cargo-features = ["workspace-inheritance"] + [package] name = "mirrord-layer" -version = "0.1.0" -edition = "2021" - +version.workspace = true +authors.workspace = true +description.workspace = true +documentation.workspace = true +readme.workspace = true +homepage.workspace = true +repository.workspace = true +license.workspace = true +keywords.workspace = true +categories.workspace = true +publish.workspace = true +edition.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] ctor = "0.1.22" lazy_static = "1.4.0" libc = "0.2.121" -nix = "0.23.1" +nix.workspace = true os_socketaddr = "0.2.0" -socketpair = "0.15.0" -tempdir = "0.3.7" -tracing = "0.1" -env_logger = "0.9" -tracing-subscriber = { version = "0.3", features = ["env-filter"] } +tracing.workspace = true +tracing-subscriber.workspace = true frida-gum = {version = "0.6.5", features = ["auto-download"]} -futures = "0.3.21" -clap = { version = "3.1.12", features = ["derive"] } +futures.workspace = true +clap.workspace = true k8s-openapi = { version = "0.14.0", features = ["v1_22"] } kube = { version = "0.71.0", default-features = false, features = ["runtime", "derive", "client", "ws", "rustls-tls"] } -tokio = { version = "1", features = ["full"] } -serde_json = "1.0.79" +tokio.workspace = true +serde_json.workspace = true + nanoid = "0.4.0" -mirrord-protocol = { path = "../mirrord-protocol", version = "*"} -actix-codec = "0.5.0" -bytes = "1.1.0" -tokio-stream = "0.1.8" +mirrord-protocol = { path = "../mirrord-protocol"} +actix-codec.workspace = true +bytes.workspace = true +tokio-stream.workspace = true queues = "1.1.0" rand = "0.8.5" multi-map = "1.3.0" envconfig = "0.10.0" errno = "0.2.8" + [lib] crate_type = ["cdylib"] diff --git a/mirrord-protocol/Cargo.toml b/mirrord-protocol/Cargo.toml index 849c1cc9a89..85dbd158ee4 100644 --- a/mirrord-protocol/Cargo.toml +++ b/mirrord-protocol/Cargo.toml @@ -1,15 +1,21 @@ +cargo-features = ["workspace-inheritance"] + [package] name = "mirrord-protocol" -version = "0.2.0" -edition = "2021" -license = "MIT" -readme = "README.md" -repository = "https://github.com/metalbear/mirrord" -authors = ["Aviram ", "Eyal "] -description = "Mirrord protocol crate, used by mirrord client and agent to communicate." -homepage = "https://mirrord.metalbear.co" +version.workspace = true +authors.workspace = true +description.workspace = true +documentation.workspace = true +readme.workspace = true +homepage.workspace = true +repository.workspace = true +license.workspace = true +keywords.workspace = true +categories.workspace = true +publish.workspace = true +edition.workspace = true [dependencies] -actix-codec = "0.5" +actix-codec.workspace = true +bytes.workspace = true bincode = "2.0.0-rc.1" -bytes = "1" \ No newline at end of file From e3307e94172d6d828e51a34351ac0def02b17830 Mon Sep 17 00:00:00 2001 From: Eyal Bukchin Date: Tue, 24 May 2022 18:50:58 +0100 Subject: [PATCH 26/40] Release workflow (#78) * Add release workflow (#75) * Build & Push docker image * Publish VS Code Extension * Create GitHub Release * change agent image to be same as crate version by default Co-authored-by: Aviram Hassan --- .github/workflows/ci.yaml | 4 + .github/workflows/release.yaml | 155 ++++++++++++++++++++++++--------- mirrord-layer/src/config.rs | 7 +- mirrord-layer/src/lib.rs | 4 +- 4 files changed, 121 insertions(+), 49 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0b250ce409a..0fb7557f631 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -17,6 +17,7 @@ jobs: profile: minimal toolchain: nightly components: rustfmt, clippy + - uses: Swatinem/rust-cache@v1 # Needed for agent - run: sudo apt install libpcap-dev cmake - run: cargo fmt --all -- --check @@ -33,6 +34,7 @@ jobs: with: profile: minimal toolchain: nightly + - uses: Swatinem/rust-cache@v1 - run: cd mirrord-protocol && cargo test test_agent: @@ -44,6 +46,7 @@ jobs: profile: minimal toolchain: nightly components: rustfmt + - uses: Swatinem/rust-cache@v1 - run: sudo apt install -y libpcap-dev cmake - run: sudo PATH=/home/runner/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin:/usr/bin:/usr/sbin /home/runner/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/cargo test -p mirrord-agent @@ -66,5 +69,6 @@ jobs: with: profile: minimal toolchain: nightly + - uses: Swatinem/rust-cache@v1 # For now, just evrify it compiles. - run: cargo +nightly build --manifest-path=mirrord-layer/Cargo.toml \ No newline at end of file diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 048238eb7fb..a080570506f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -1,59 +1,128 @@ name: Release -on: - workflow_dispatch: - inputs: - version: - type: string - description: Version to release - required: true - push: - tags: - - "*.*.*" +on: workflow_dispatch jobs: - release_crates: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - override: true - - uses: katyo/publish-crates@v1 - with: - registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }} - # add publish docker image - release_vscode_ext: + build_binaries: strategy: matrix: include: - os: ubuntu-18.04 extension: so target: x86_64-unknown-linux-gnu - code-target: linux-x64 - - os: ubuntu-18.04 - extension: so - target: aarch64-unknown-linux-gnu - code-target: linux-arm64 - os: macos-11 extension: dylib target: x86_64-apple-darwin - code-target: darwin-x64 - os: macos-11 extension: dylib target: aarch64-apple-darwin - code-target: darwin-arm64 + code-target: darwin-arm64 runs-on: ${{matrix.os}} - steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: nightly - target: ${{matrix.target}} - - run: npm install -g vsce typescript esbuild - - run: cargo +nightly build --release --manifest-path=mirrord-layer/Cargo.toml --target=${{matrix.target}} - - run: mv target/release/libmirrord_layer.${{matrix.extension}} vscode-ext/ - - run: cd vscode-ext && npm install && tsc && vsce publish {{github.event.inputs.version}} --allow-star-activation --target ${{matrix.code-target}} --pre-release - env: - VSCE_PAT: ${{ secrets.VSCE_PAT }} + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + target: ${{matrix.target}} + - uses: Swatinem/rust-cache@v1 + with: + key: ${{matrix.target}} + + - name: build mirrord-layer and cli + run: cargo +nightly build --release -p mirrord -p mirrord-layer --target=${{matrix.target}} + - uses: actions/upload-artifact@v3 + with: + name: ${{matrix.target}} + path: | + target/${{matrix.target}}/release/mirrord + target/${{matrix.target}}/release/libmirrord_layer.${{matrix.extension}} + if-no-files-found: error + + release_docker_image: + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Get release version + run: | + echo "::set-output name=version::$(grep -m 1 version Cargo.toml | cut -d' ' -f3 | tr -d '\"')" + id: version + - name: Build and push + uses: docker/build-push-action@v3 + with: + context: . + file: mirrord-agent/Dockerfile + platforms: linux/amd64 # linux/arm64 arm64 is too slow on github, try to make it work later? + push: true + tags: | + ghcr.io/metalbear-co/mirrord:latest + ghcr.io/metalbear-co/mirrord:${{ steps.version.outputs.version }} + + release_vscode_ext: + needs: [build_binaries, release_docker_image] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v3 + with: + node-version: 17 + cache: "npm" + # This downloads all artifacts of the job + - uses: actions/download-artifact@v3 + with: + path: /tmp/artifacts + - name: for debug + run: find /tmp/artifacts + - name: Get release version + run: | + echo "::set-output name=version::$(grep -m 1 version Cargo.toml | cut -d' ' -f3 | tr -d '\"')" + id: version + - run: npm install -g vsce typescript esbuild + - run: mv /tmp/artifacts/x86_64-unknown-linux-gnu/target/x86_64-unknown-linux-gnu/release/libmirrord_layer.so vscode-ext/ + - run: cd vscode-ext && npm install && tsc && vsce publish ${{ steps.version.outputs.version }} --allow-star-activation --target linux-x64 --pre-release + env: + VSCE_PAT: ${{ secrets.VSCE_PAT }} + - run: rm vscode-ext/libmirrord_layer.so + - run: mv /tmp/artifacts/x86_64-apple-darwin/target/x86_64-apple-darwin/release/libmirrord_layer.dylib vscode-ext/ + - run: cd vscode-ext && npm install && tsc && vsce publish ${{ steps.version.outputs.version }} --allow-star-activation --target darwin-x64 --pre-release + env: + VSCE_PAT: ${{ secrets.VSCE_PAT }} + - run: rm vscode-ext/libmirrord_layer.dylib + - run: mv /tmp/artifacts/aarch64-apple-darwin/target/aarch64-apple-darwin/release/libmirrord_layer.dylib vscode-ext/ + - run: cd vscode-ext && npm install && tsc && vsce publish ${{ steps.version.outputs.version }} --allow-star-activation --target darwin-arm64 --pre-release + env: + VSCE_PAT: ${{ secrets.VSCE_PAT }} + + release_gh: + needs: [build_binaries, release_docker_image, release_vscode_ext] + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - uses: actions/download-artifact@v3 + with: + path: /tmp/artifacts + # Consider to add changelog generation.. + - name: Release + uses: softprops/action-gh-release@v1 + with: + files: | + /tmp/artifacts/x86_64-unknown-linux-gnu/target/x86_64-unknown-linux-gnu/release/libmirrord_layer.so + /tmp/artifacts/x86_64-apple-darwin/target/x86_64-apple-darwin/release/libmirrord_layer.so + /tmp/artifacts/aarch64-apple-darwin/target/aarch64-apple-darwin/release/libmirrord_layer.so + /tmp/artifacts/x86_64-unknown-linux-gnu/target/x86_64-unknown-linux-gnu/release/mirrord + /tmp/artifacts/x86_64-apple-darwin/target/x86_64-apple-darwin/release/mirrord + /tmp/artifacts/aarch64-apple-darwin/target/aarch64-apple-darwin/release/mirrord diff --git a/mirrord-layer/src/config.rs b/mirrord-layer/src/config.rs index 870f0f24862..ae661424d17 100644 --- a/mirrord-layer/src/config.rs +++ b/mirrord-layer/src/config.rs @@ -8,11 +8,8 @@ pub struct Config { #[envconfig(from = "MIRRORD_AGENT_NAMESPACE", default = "default")] pub agent_namespace: String, - #[envconfig( - from = "MIRRORD_AGENT_IMAGE", - default = "ghcr.io/metalbear-co/mirrord:2.0.0-alpha-4" - )] - pub agent_image: String, + #[envconfig(from = "MIRRORD_AGENT_IMAGE")] + pub agent_image: Option, #[envconfig(from = "MIRRORD_AGENT_IMPERSONATED_POD_NAME")] pub impersonated_pod_name: String, diff --git a/mirrord-layer/src/lib.rs b/mirrord-layer/src/lib.rs index 9d55cd3f7f3..41f847389fb 100644 --- a/mirrord-layer/src/lib.rs +++ b/mirrord-layer/src/lib.rs @@ -103,7 +103,9 @@ fn init() { &config.impersonated_pod_namespace, &config.agent_namespace, config.agent_rust_log, - config.agent_image, + config.agent_image.unwrap_or_else(|| { + concat!("ghcr.io/metalbear-co/mirrord:", env!("CARGO_PKG_VERSION")).to_string() + }), )); let (sender, receiver) = channel::(1000); From 231ef5b412ed04ce1fa0a7cfcb14749add914838 Mon Sep 17 00:00:00 2001 From: Mehul <65443164+infiniteregrets@users.noreply.github.com> Date: Wed, 25 May 2022 00:53:40 -0400 Subject: [PATCH 27/40] Use local agent images (#79) switch `imagePullPolicy` of agent to `IfNotPresent` instead of `Always` --- mirrord-layer/src/pod_api.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mirrord-layer/src/pod_api.rs b/mirrord-layer/src/pod_api.rs index c6dcdba4add..a642cd46ad3 100644 --- a/mirrord-layer/src/pod_api.rs +++ b/mirrord-layer/src/pod_api.rs @@ -88,7 +88,7 @@ pub async fn create_agent( { "name": "mirrord-agent", "image": agent_image, - "imagePullPolicy": "Always", + "imagePullPolicy": "IfNotPresent", "securityContext": { "privileged": true }, From 010df3a53f5415a5ffa52c93ce4125a45186e356 Mon Sep 17 00:00:00 2001 From: Aviram Hassan Date: Wed, 25 May 2022 10:29:38 +0300 Subject: [PATCH 28/40] ci: rust-cache add a key to avoid mixed glibc causing failed ci runs (#81) --- .github/workflows/ci.yaml | 85 ++++++++++++++++++---------------- .github/workflows/release.yaml | 3 +- 2 files changed, 45 insertions(+), 43 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0fb7557f631..92bc9c652e1 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -3,25 +3,25 @@ name: CI on: workflow_dispatch: push: - branches: [ main, v2.0 ] + branches: [main, v2.0] pull_request: - branches: [ main, v2.0 ] + branches: [main, v2.0] jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: nightly - components: rustfmt, clippy - - uses: Swatinem/rust-cache@v1 - # Needed for agent - - run: sudo apt install libpcap-dev cmake - - run: cargo fmt --all -- --check - - run: cargo clippy -- -D warnings + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + components: rustfmt, clippy + - uses: Swatinem/rust-cache@v1 + # Needed for agent + - run: sudo apt install libpcap-dev cmake + - run: cargo fmt --all -- --check + - run: cargo clippy -- -D warnings test_mirrord_protocol: strategy: @@ -29,46 +29,49 @@ jobs: os: [ubuntu-latest, ubuntu-18.04, macos-12, macos-11, macos-10.15] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: nightly - - uses: Swatinem/rust-cache@v1 - - run: cd mirrord-protocol && cargo test + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + - uses: Swatinem/rust-cache@v1 + with: + key: ${{matrix.os}} + - run: cd mirrord-protocol && cargo test test_agent: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: nightly - components: rustfmt - - uses: Swatinem/rust-cache@v1 - - run: sudo apt install -y libpcap-dev cmake - - run: sudo PATH=/home/runner/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin:/usr/bin:/usr/sbin /home/runner/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/cargo test -p mirrord-agent + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + components: rustfmt + - uses: Swatinem/rust-cache@v1 + - run: sudo apt install -y libpcap-dev cmake + - run: sudo PATH=/home/runner/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin:/usr/bin:/usr/sbin /home/runner/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/cargo test -p mirrord-agent test_agent_image: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Build image - run: docker build . --file mirrord-agent/Dockerfile + - uses: actions/checkout@v2 + - name: Build image + run: docker build . --file mirrord-agent/Dockerfile - test_mirrord_layer: strategy: matrix: os: [ubuntu-latest, ubuntu-18.04, macos-12, macos-11, macos-10.15] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: nightly - - uses: Swatinem/rust-cache@v1 - # For now, just evrify it compiles. - - run: cargo +nightly build --manifest-path=mirrord-layer/Cargo.toml \ No newline at end of file + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly + - uses: Swatinem/rust-cache@v1 + with: + key: ${{matrix.os}} + # For now, just evrify it compiles. + - run: cargo +nightly build --manifest-path=mirrord-layer/Cargo.toml diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index a080570506f..677716539ea 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -26,8 +26,7 @@ jobs: target: ${{matrix.target}} - uses: Swatinem/rust-cache@v1 with: - key: ${{matrix.target}} - + key: ${{matrix.target}}-${{matrix.os}} - name: build mirrord-layer and cli run: cargo +nightly build --release -p mirrord -p mirrord-layer --target=${{matrix.target}} - uses: actions/upload-artifact@v3 From 1c660aad0053acdf155da34901a9ac520460f7dd Mon Sep 17 00:00:00 2001 From: Aviram Hassan Date: Wed, 25 May 2022 10:47:45 +0300 Subject: [PATCH 29/40] fix vs code extension publish (#80) fix artifact paths --- .github/workflows/release.yaml | 29 ++++++++++++++++------------- vscode-ext/libmirrord_layer.dylib | 1 - vscode-ext/libmirrord_layer.so | 1 - 3 files changed, 16 insertions(+), 15 deletions(-) delete mode 120000 vscode-ext/libmirrord_layer.dylib delete mode 120000 vscode-ext/libmirrord_layer.so diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 677716539ea..e1db42cd4a9 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -1,5 +1,8 @@ name: Release -on: workflow_dispatch +on: + push: + tags: + - "*.*.*" jobs: build_binaries: @@ -79,28 +82,28 @@ jobs: with: node-version: 17 cache: "npm" + cache-dependency-path: vscode-ext/package-lock.json # This downloads all artifacts of the job - uses: actions/download-artifact@v3 with: path: /tmp/artifacts - - name: for debug - run: find /tmp/artifacts - name: Get release version + # VSCode doesn't support pre release versions https://github.com/microsoft/vsmarketplace/issues/50#issuecomment-990764201 run: | - echo "::set-output name=version::$(grep -m 1 version Cargo.toml | cut -d' ' -f3 | tr -d '\"')" + echo "::set-output name=version::$(grep -m 1 version Cargo.toml | cut -d' ' -f3 | tr -d '\"' | cut -d'-' -f1)" id: version - run: npm install -g vsce typescript esbuild - - run: mv /tmp/artifacts/x86_64-unknown-linux-gnu/target/x86_64-unknown-linux-gnu/release/libmirrord_layer.so vscode-ext/ + - run: mv /tmp/artifacts/x86_64-unknown-linux-gnu/libmirrord_layer.so vscode-ext/ - run: cd vscode-ext && npm install && tsc && vsce publish ${{ steps.version.outputs.version }} --allow-star-activation --target linux-x64 --pre-release env: VSCE_PAT: ${{ secrets.VSCE_PAT }} - run: rm vscode-ext/libmirrord_layer.so - - run: mv /tmp/artifacts/x86_64-apple-darwin/target/x86_64-apple-darwin/release/libmirrord_layer.dylib vscode-ext/ + - run: mv /tmp/artifacts/x86_64-apple-darwin/libmirrord_layer.dylib vscode-ext/ - run: cd vscode-ext && npm install && tsc && vsce publish ${{ steps.version.outputs.version }} --allow-star-activation --target darwin-x64 --pre-release env: VSCE_PAT: ${{ secrets.VSCE_PAT }} - run: rm vscode-ext/libmirrord_layer.dylib - - run: mv /tmp/artifacts/aarch64-apple-darwin/target/aarch64-apple-darwin/release/libmirrord_layer.dylib vscode-ext/ + - run: mv /tmp/artifacts/aarch64-apple-darwin/libmirrord_layer.dylib vscode-ext/ - run: cd vscode-ext && npm install && tsc && vsce publish ${{ steps.version.outputs.version }} --allow-star-activation --target darwin-arm64 --pre-release env: VSCE_PAT: ${{ secrets.VSCE_PAT }} @@ -119,9 +122,9 @@ jobs: uses: softprops/action-gh-release@v1 with: files: | - /tmp/artifacts/x86_64-unknown-linux-gnu/target/x86_64-unknown-linux-gnu/release/libmirrord_layer.so - /tmp/artifacts/x86_64-apple-darwin/target/x86_64-apple-darwin/release/libmirrord_layer.so - /tmp/artifacts/aarch64-apple-darwin/target/aarch64-apple-darwin/release/libmirrord_layer.so - /tmp/artifacts/x86_64-unknown-linux-gnu/target/x86_64-unknown-linux-gnu/release/mirrord - /tmp/artifacts/x86_64-apple-darwin/target/x86_64-apple-darwin/release/mirrord - /tmp/artifacts/aarch64-apple-darwin/target/aarch64-apple-darwin/release/mirrord + /tmp/artifacts/x86_64-unknown-linux-gnu/libmirrord_layer.so + /tmp/artifacts/x86_64-apple-darwin/libmirrord_layer.so + /tmp/artifacts/aarch64-apple-darwin/libmirrord_layer.so + /tmp/artifacts/x86_64-unknown-linux-gnu/mirrord + /tmp/artifacts/x86_64-apple-darwin/mirrord + /tmp/artifacts/aarch64-apple-darwin/mirrord diff --git a/vscode-ext/libmirrord_layer.dylib b/vscode-ext/libmirrord_layer.dylib deleted file mode 120000 index 11d4caf29e5..00000000000 --- a/vscode-ext/libmirrord_layer.dylib +++ /dev/null @@ -1 +0,0 @@ -../target/debug/libmirrord_layer.dylib \ No newline at end of file diff --git a/vscode-ext/libmirrord_layer.so b/vscode-ext/libmirrord_layer.so deleted file mode 120000 index 9bc07a3b548..00000000000 --- a/vscode-ext/libmirrord_layer.so +++ /dev/null @@ -1 +0,0 @@ -../target/debug/libmirrord_layer.so \ No newline at end of file From 5ba32f3e2ac8d14ce35b806afa35e3860d9dadb9 Mon Sep 17 00:00:00 2001 From: Aviram Hassan Date: Wed, 25 May 2022 11:18:44 +0300 Subject: [PATCH 30/40] Cosmetics (#82) * Remove CHANGELOG of each crate/sub directory, alter READMEs to reflect new repository layout, update logos --- .github/workflows/release.yaml | 1 + CHANGELOG.md | 19 +++++++++++++------ images/icon.png | Bin 14039 -> 8235 bytes mirrord-agent/CHANGELOG.md | 31 ------------------------------- mirrord-agent/LICENSE | 7 ------- mirrord-agent/README.md | 13 ------------- mirrord-cli/CHANGELOG.md | 1 - mirrord-cli/LICENSE | 7 ------- mirrord-cli/README.md | 16 +--------------- mirrord-layer/LICENSE | 7 ------- mirrord-layer/README.md | 14 +------------- mirrord-protocol/CHANGELOG.md | 14 -------------- mirrord-protocol/README.md | 15 +-------------- vscode-ext/CHANGELOG.md | 22 ---------------------- vscode-ext/LICENSE | 7 ------- vscode-ext/README.md | 5 +---- vscode-ext/images/icon.png | Bin 14039 -> 8235 bytes 17 files changed, 18 insertions(+), 161 deletions(-) delete mode 100644 mirrord-agent/CHANGELOG.md delete mode 100644 mirrord-agent/LICENSE delete mode 100644 mirrord-cli/CHANGELOG.md delete mode 100644 mirrord-cli/LICENSE delete mode 100644 mirrord-layer/LICENSE delete mode 100644 mirrord-protocol/CHANGELOG.md delete mode 100644 vscode-ext/CHANGELOG.md delete mode 100644 vscode-ext/LICENSE diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index e1db42cd4a9..687df89580f 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -93,6 +93,7 @@ jobs: echo "::set-output name=version::$(grep -m 1 version Cargo.toml | cut -d' ' -f3 | tr -d '\"' | cut -d'-' -f1)" id: version - run: npm install -g vsce typescript esbuild + - run: cp CHANGELOG.md LICENSE vscode-ext/ - run: mv /tmp/artifacts/x86_64-unknown-linux-gnu/libmirrord_layer.so vscode-ext/ - run: cd vscode-ext && npm install && tsc && vsce publish ${{ steps.version.outputs.version }} --allow-star-activation --target linux-x64 --pre-release env: diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ed3cf226f8..ad11aa5d78e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,15 @@ -# Changelog +# Change Log -See respective changelogs for each module. +All notable changes to the mirrord's cli, agent, protocol, extensions will be documented in this file. +Previous versions had CHANGELOG per component, we decided to combine all repositories to a mono-repo with one CHANGELOG. -* [mirrord-protocol](./mirrord-protocol/CHANGELOG.md) -* [mirrord-agent](./mirrord-agent/CHANGELOG.md) -* [mirrord-layer](./mirrord-layer/CHANGELOG.md) -* [VS Code Extension](./vscode-ext/CHANGELOG.md) \ No newline at end of file +Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. + +## [Unreleased] + +## 2.0.0 + +Complete refactor and re-write of everything. +- The CLI/VSCode extension now use `mirrord-layer` which loads into debugged process using `LD_PRELOAD`/`DYLD_INSERT_LIBRARIES`. + It hooks some of the syscalls in order to proxy incoming traffic into the process as if it was running in the remote pod. +- Mono repo diff --git a/images/icon.png b/images/icon.png index f5f4def9eb1ca527d0b81c23c6b31ff725d42c53..6b298a72b2612004b66b0bfe330062a2f702b1c2 100644 GIT binary patch literal 8235 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 MX=;rrMZ1#z2UgV^-v9sr literal 14039 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/mirrord-layer.so ` -* On macOS, run `DYLD_INSERT_LIBRARIES=/mirrord-layer.dylib ` - -# Changelog -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## Contributing -Anyone is welcome to contribute. Please feel free to create PRs with proper documentation, formatting and changelog record. - -## License -mirrord-layer is MIT licensed. \ No newline at end of file +* On macOS, run `DYLD_INSERT_LIBRARIES=/mirrord-layer.dylib ` \ No newline at end of file diff --git a/mirrord-protocol/CHANGELOG.md b/mirrord-protocol/CHANGELOG.md deleted file mode 100644 index 99347e644b5..00000000000 --- a/mirrord-protocol/CHANGELOG.md +++ /dev/null @@ -1,14 +0,0 @@ -## [Unreleased] - -## 0.2.0 - 25/04/2022 -### Changed -- Change `ConnectionUnsubscribe` data from `Port` to `ConnectionID` - -## 0.1.0 - 25/04/2022 -### Changed -- Split messages into Client messages and Daemon messages. -- There's now codec for each side. -- Added new message types - -## 0.0.1 - 14/3/2022 -Initial release \ No newline at end of file diff --git a/mirrord-protocol/README.md b/mirrord-protocol/README.md index 7749bccf908..0d22229830c 100644 --- a/mirrord-protocol/README.md +++ b/mirrord-protocol/README.md @@ -1,16 +1,3 @@ # mirrord-protocol -This is a cargo library that implements the mirrord-protocol between the [agent](https://github.com/metalbear-co/mirrord-agent) and [client](https://github.com/metalbear-co/mirrord). - -# Changelog -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## Contributing -Anyone is welcome to contribute. Please feel free to create PRs with proper documentation, formatting and changelog record. - -## License - -mirrord-protocol is MIT licensed. \ No newline at end of file +This is a cargo library that implements the mirrord-protocol between the [agent](../mirrord-agent) and [client](../mirrord-cli). \ No newline at end of file diff --git a/vscode-ext/CHANGELOG.md b/vscode-ext/CHANGELOG.md deleted file mode 100644 index b65ef012b07..00000000000 --- a/vscode-ext/CHANGELOG.md +++ /dev/null @@ -1,22 +0,0 @@ -# Change Log - -All notable changes to the "mirrord" extension will be documented in this file. - -Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. - -## [Unreleased] - -## 1.1.0 - 12/03/2022 -### Added -- Let user change the namespace and remote port through a new settings menu - -## 1.0.1 - 06/03/2022 -### Changed -- Fix README location - -## 1.0.0 - 06/03/2022 -### Changed -- Use same logic as the cli by leveraging the node library. - -## 0.0.1 - 25/02/2022 -- Initial release diff --git a/vscode-ext/LICENSE b/vscode-ext/LICENSE deleted file mode 100644 index 52b758d77b9..00000000000 --- a/vscode-ext/LICENSE +++ /dev/null @@ -1,7 +0,0 @@ -Copyright 2022 Metalbear.co - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vscode-ext/README.md b/vscode-ext/README.md index a0395cc2d2a..65d813c300a 100644 --- a/vscode-ext/README.md +++ b/vscode-ext/README.md @@ -73,7 +73,4 @@ Contributions are welcome via PRs. Join our [Discord Server](https://discord.gg/J5YSrStDKD) for questions, support and fun. ---- - - -Icon Credit: flaticon.com +--- \ No newline at end of file diff --git a/vscode-ext/images/icon.png b/vscode-ext/images/icon.png index f5f4def9eb1ca527d0b81c23c6b31ff725d42c53..6b298a72b2612004b66b0bfe330062a2f702b1c2 100644 GIT binary patch literal 8235 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 MX=;rrMZ1#z2UgV^-v9sr literal 14039 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 Date: Wed, 25 May 2022 08:44:14 +0000 Subject: [PATCH 31/40] 2.0.01-rc.1 for vscode (can't unpublish, have to increase patch.. --- Cargo.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9ba757ac5c9..b4b56bb1746 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1247,7 +1247,7 @@ dependencies = [ [[package]] name = "mirrord" -version = "2.0.0-rc.1" +version = "2.0.1-rc.1" dependencies = [ "anyhow", "clap 3.1.18", @@ -1259,7 +1259,7 @@ dependencies = [ [[package]] name = "mirrord-agent" -version = "2.0.0-rc.1" +version = "2.0.1-rc.1" dependencies = [ "actix-codec", "anyhow", @@ -1282,7 +1282,7 @@ dependencies = [ [[package]] name = "mirrord-layer" -version = "2.0.0-rc.1" +version = "2.0.1-rc.1" dependencies = [ "actix-codec", "bytes", @@ -1312,7 +1312,7 @@ dependencies = [ [[package]] name = "mirrord-protocol" -version = "2.0.0-rc.1" +version = "2.0.1-rc.1" dependencies = [ "actix-codec", "bincode", @@ -1480,9 +1480,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b10983b38c53aebdf33f542c6275b0f58a238129d00c4ae0e6fb59738d783ca" +checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" [[package]] name = "openssl" From 513839c49de9b43a084f7c550aedfa84ce6cb3a0 Mon Sep 17 00:00:00 2001 From: Aviram Hassan Date: Wed, 25 May 2022 09:30:12 +0000 Subject: [PATCH 32/40] forgot to commit version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index bccc4b38def..7f1498e6ea7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ members = [ ] [workspace.package] -version = "2.0.0-rc.1" +version = "2.0.1-rc.1" edition = "2021" license = "MIT" readme = "README.md" From b96d345bcde6798c5e72ddaf8f4a63ff748e1078 Mon Sep 17 00:00:00 2001 From: Aviram Hassan Date: Wed, 25 May 2022 09:44:24 +0000 Subject: [PATCH 33/40] release workflow: fix assets name typo (so->dylib) --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 687df89580f..4b26cd02751 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -124,8 +124,8 @@ jobs: with: files: | /tmp/artifacts/x86_64-unknown-linux-gnu/libmirrord_layer.so - /tmp/artifacts/x86_64-apple-darwin/libmirrord_layer.so - /tmp/artifacts/aarch64-apple-darwin/libmirrord_layer.so + /tmp/artifacts/x86_64-apple-darwin/libmirrord_layer.dylib + /tmp/artifacts/aarch64-apple-darwin/libmirrord_layer.dylib /tmp/artifacts/x86_64-unknown-linux-gnu/mirrord /tmp/artifacts/x86_64-apple-darwin/mirrord /tmp/artifacts/aarch64-apple-darwin/mirrord From 2a3aea40495b76209fdd5561a1e7843e5c523d4d Mon Sep 17 00:00:00 2001 From: Aviram Hassan Date: Wed, 25 May 2022 09:45:15 +0000 Subject: [PATCH 34/40] 2.0.2-rc.1 --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b4b56bb1746..1aa747f17b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1247,7 +1247,7 @@ dependencies = [ [[package]] name = "mirrord" -version = "2.0.1-rc.1" +version = "2.0.2-rc.1" dependencies = [ "anyhow", "clap 3.1.18", @@ -1259,7 +1259,7 @@ dependencies = [ [[package]] name = "mirrord-agent" -version = "2.0.1-rc.1" +version = "2.0.2-rc.1" dependencies = [ "actix-codec", "anyhow", @@ -1282,7 +1282,7 @@ dependencies = [ [[package]] name = "mirrord-layer" -version = "2.0.1-rc.1" +version = "2.0.2-rc.1" dependencies = [ "actix-codec", "bytes", @@ -1312,7 +1312,7 @@ dependencies = [ [[package]] name = "mirrord-protocol" -version = "2.0.1-rc.1" +version = "2.0.2-rc.1" dependencies = [ "actix-codec", "bincode", diff --git a/Cargo.toml b/Cargo.toml index 7f1498e6ea7..62f80e39e55 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ members = [ ] [workspace.package] -version = "2.0.1-rc.1" +version = "2.0.2-rc.1" edition = "2021" license = "MIT" readme = "README.md" From f193bf93dda9fae042276c1afca586e9dff2f0e2 Mon Sep 17 00:00:00 2001 From: Aviram Hassan Date: Wed, 25 May 2022 10:38:53 +0000 Subject: [PATCH 35/40] fix release assets upload --- .github/workflows/release.yaml | 21 ++++++++++++++------- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 4b26cd02751..d7401d5734a 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -112,20 +112,27 @@ jobs: release_gh: needs: [build_binaries, release_docker_image, release_vscode_ext] runs-on: ubuntu-latest + permissions: + packages: write + contents: write + deployments: write steps: - name: Checkout uses: actions/checkout@v2 - uses: actions/download-artifact@v3 with: path: /tmp/artifacts + - name: Prepare binaries for upload + run: | + mkdir /tmp/release + mv /tmp/artifacts/x86_64-unknown-linux-gnu/libmirrord_layer.so /tmp/release/libmirrord_layer_linux_x86_64.so + mv /tmp/artifacts/x86_64-unknown-linux-gnu/mirrord /tmp/release/mirrord_linux_x86_64 + mv /tmp/artifacts/x86_64-apple-darwin/libmirrord_layer.dylib /tmp/release/libmirrord_layer_mac_x86_64.dylib + mv /tmp/artifacts/x86_64-apple-darwin/mirrord /tmp/release/mirrord_mac_x86_64 + mv /tmp/artifacts/aarch64-apple-darwin/libmirrord_layer.dylib /tmp/release/libmirrord_layer_mac_aarch64.dylib + mv /tmp/artifacts/aarch64-apple-darwin/mirrord /tmp/release/mirrord_mac_aarch64 # Consider to add changelog generation.. - name: Release uses: softprops/action-gh-release@v1 with: - files: | - /tmp/artifacts/x86_64-unknown-linux-gnu/libmirrord_layer.so - /tmp/artifacts/x86_64-apple-darwin/libmirrord_layer.dylib - /tmp/artifacts/aarch64-apple-darwin/libmirrord_layer.dylib - /tmp/artifacts/x86_64-unknown-linux-gnu/mirrord - /tmp/artifacts/x86_64-apple-darwin/mirrord - /tmp/artifacts/aarch64-apple-darwin/mirrord + files: /tmp/release/** diff --git a/Cargo.lock b/Cargo.lock index 1aa747f17b1..49d7528287d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1247,7 +1247,7 @@ dependencies = [ [[package]] name = "mirrord" -version = "2.0.2-rc.1" +version = "2.0.3-rc.1" dependencies = [ "anyhow", "clap 3.1.18", @@ -1259,7 +1259,7 @@ dependencies = [ [[package]] name = "mirrord-agent" -version = "2.0.2-rc.1" +version = "2.0.3-rc.1" dependencies = [ "actix-codec", "anyhow", @@ -1282,7 +1282,7 @@ dependencies = [ [[package]] name = "mirrord-layer" -version = "2.0.2-rc.1" +version = "2.0.3-rc.1" dependencies = [ "actix-codec", "bytes", @@ -1312,7 +1312,7 @@ dependencies = [ [[package]] name = "mirrord-protocol" -version = "2.0.2-rc.1" +version = "2.0.3-rc.1" dependencies = [ "actix-codec", "bincode", diff --git a/Cargo.toml b/Cargo.toml index 62f80e39e55..7985f11b826 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ members = [ ] [workspace.package] -version = "2.0.2-rc.1" +version = "2.0.3-rc.1" edition = "2021" license = "MIT" readme = "README.md" From 7691af37ecf24fa85ec3c4c8d5ab714151d280f1 Mon Sep 17 00:00:00 2001 From: Eyal Bukchin Date: Wed, 25 May 2022 15:52:55 +0100 Subject: [PATCH 36/40] Fix the node double resolve patch (#83) --- vscode-ext/src/extension.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vscode-ext/src/extension.ts b/vscode-ext/src/extension.ts index c22b80b5ab8..74d0e8975c0 100644 --- a/vscode-ext/src/extension.ts +++ b/vscode-ext/src/extension.ts @@ -93,7 +93,8 @@ class ConfigurationProvider implements vscode.DebugConfigurationProvider { if (!globalContext.globalState.get('enabled')) { return new Promise(resolve => { resolve(config) }); } - if (config.runtimeExecutable === undefined) { // For some reason resolveDebugConfiguration runs twice. runTimeExecutable is undefined the second time. + + if (config.__parentId) { // For some reason resolveDebugConfiguration runs twice for Node projects. __parentId is populated. return new Promise(resolve => { return resolve(config); }); From 174c6252f0e1812ddaa4991afba4f90510f52d92 Mon Sep 17 00:00:00 2001 From: Eyal Bukchin Date: Wed, 25 May 2022 16:53:48 +0100 Subject: [PATCH 37/40] Fix env vars (#85) --- vscode-ext/src/extension.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vscode-ext/src/extension.ts b/vscode-ext/src/extension.ts index 74d0e8975c0..6bb1b634674 100644 --- a/vscode-ext/src/extension.ts +++ b/vscode-ext/src/extension.ts @@ -121,12 +121,12 @@ class ConfigurationProvider implements vscode.DebugConfigurationProvider { libraryPath = globalContext.extensionPath; } - config.env = { + config.env = {...config.env, ...{ // eslint-disable-next-line @typescript-eslint/naming-convention - 'DYLD_INSERT_LIBRARIES': path.join(libraryPath, LIBRARIES[os.platform()]), + 'DYLD_INSERT_LIBRARIES': path.join(libraryPath, LIBRARIES[os.platform()]), // eslint-disable-next-line @typescript-eslint/naming-convention 'MIRRORD_AGENT_IMPERSONATED_POD_NAME': podName - }; + }}; return resolve(config); }); }); From c55ecac95100872f17ac7f1f279c9ab50c00ef3f Mon Sep 17 00:00:00 2001 From: Eyal Bukchin Date: Thu, 26 May 2022 10:16:19 +0100 Subject: [PATCH 38/40] Ignore connections closed by the application (#86) * Ignore connections closed by the application --- mirrord-layer/src/lib.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mirrord-layer/src/lib.rs b/mirrord-layer/src/lib.rs index 41f847389fb..d9f385e863b 100644 --- a/mirrord-layer/src/lib.rs +++ b/mirrord-layer/src/lib.rs @@ -180,8 +180,13 @@ async fn handle_daemon_message( }); } DaemonMessage::TCPData(msg) => { - if let Err(fail) = active_connections - .get(&msg.connection_id) + debug!("Received data from connection id {}", msg.connection_id); + let connection = active_connections.get(&msg.connection_id); + if connection.is_none() { + debug!("Connection {} not found", msg.connection_id); + return; + } + if let Err(fail) = connection .map(|sender| sender.send(TcpTunnelMessages::Data(msg.data))) .unwrap() .await @@ -191,6 +196,7 @@ async fn handle_daemon_message( } } DaemonMessage::TCPClose(msg) => { + debug!("Closing connection {}", msg.connection_id); if let Err(fail) = active_connections .get(&msg.connection_id) .map(|sender| sender.send(TcpTunnelMessages::Close)) From 081502ed633d036a99709205a44898d8308cd0d3 Mon Sep 17 00:00:00 2001 From: Eyal Bukchin Date: Thu, 26 May 2022 10:54:52 +0100 Subject: [PATCH 39/40] Add support for linux (#87) --- vscode-ext/src/extension.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/vscode-ext/src/extension.ts b/vscode-ext/src/extension.ts index 6bb1b634674..03e1e5ce3e4 100644 --- a/vscode-ext/src/extension.ts +++ b/vscode-ext/src/extension.ts @@ -3,9 +3,10 @@ import * as vscode from 'vscode'; const k8s = require('@kubernetes/client-node'); const path = require('path'); const os = require('os'); -const LIBRARIES: {[platform: string] : string} = { - 'darwin' : 'libmirrord_layer.dylib', - 'linux' : 'libmirrord_layer.so' + +const LIBRARIES: {[platform: string] : [var_name: string, lib_name: string]} = { + 'darwin': ['DYLD_INSERT_LIBRARIES', 'libmirrord_layer.dylib'], + 'linux': ['LD_PRELOAD', 'libmirrord_layer.so'] }; let buttons: { toggle: vscode.StatusBarItem, settings: vscode.StatusBarItem }; @@ -120,13 +121,12 @@ class ConfigurationProvider implements vscode.DebugConfigurationProvider { } else { libraryPath = globalContext.extensionPath; } - + let [environmentVariableName, libraryName] = LIBRARIES[os.platform()]; config.env = {...config.env, ...{ // eslint-disable-next-line @typescript-eslint/naming-convention - 'DYLD_INSERT_LIBRARIES': path.join(libraryPath, LIBRARIES[os.platform()]), - // eslint-disable-next-line @typescript-eslint/naming-convention 'MIRRORD_AGENT_IMPERSONATED_POD_NAME': podName }}; + config.env[environmentVariableName] = path.join(libraryPath, libraryName); return resolve(config); }); }); From ca2faacca81864d61a7c7841d33f66c39b581c2a Mon Sep 17 00:00:00 2001 From: Aviram Hassan Date: Thu, 26 May 2022 14:59:22 +0300 Subject: [PATCH 40/40] Last release preparations (#84) * change to 2.0.0, remove pre release opt from vs code publishing as preparation for release * update READMEs * add demo, add code of conduct Co-authored-by: Eyal Bukchin --- .github/workflows/release.yaml | 6 +-- CODE_OF_CONDUCT.md | 78 +++++++++++++++++++++++++++++++++ Cargo.lock | 8 ++-- Cargo.toml | 2 +- README.md | 73 ++++++++++++++---------------- images/demo.gif | Bin 1291515 -> 298772 bytes images/logo_dark.png | Bin 0 -> 16061 bytes images/logo_light.png | Bin 0 -> 18010 bytes vscode-ext/README.md | 73 +++++------------------------- 9 files changed, 131 insertions(+), 109 deletions(-) create mode 100644 CODE_OF_CONDUCT.md create mode 100644 images/logo_dark.png create mode 100644 images/logo_light.png diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index d7401d5734a..187834e1cb9 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -95,17 +95,17 @@ jobs: - run: npm install -g vsce typescript esbuild - run: cp CHANGELOG.md LICENSE vscode-ext/ - run: mv /tmp/artifacts/x86_64-unknown-linux-gnu/libmirrord_layer.so vscode-ext/ - - run: cd vscode-ext && npm install && tsc && vsce publish ${{ steps.version.outputs.version }} --allow-star-activation --target linux-x64 --pre-release + - run: cd vscode-ext && npm install && tsc && vsce publish ${{ steps.version.outputs.version }} --allow-star-activation --target linux-x64 env: VSCE_PAT: ${{ secrets.VSCE_PAT }} - run: rm vscode-ext/libmirrord_layer.so - run: mv /tmp/artifacts/x86_64-apple-darwin/libmirrord_layer.dylib vscode-ext/ - - run: cd vscode-ext && npm install && tsc && vsce publish ${{ steps.version.outputs.version }} --allow-star-activation --target darwin-x64 --pre-release + - run: cd vscode-ext && npm install && tsc && vsce publish ${{ steps.version.outputs.version }} --allow-star-activation --target darwin-x64 env: VSCE_PAT: ${{ secrets.VSCE_PAT }} - run: rm vscode-ext/libmirrord_layer.dylib - run: mv /tmp/artifacts/aarch64-apple-darwin/libmirrord_layer.dylib vscode-ext/ - - run: cd vscode-ext && npm install && tsc && vsce publish ${{ steps.version.outputs.version }} --allow-star-activation --target darwin-arm64 --pre-release + - run: cd vscode-ext && npm install && tsc && vsce publish ${{ steps.version.outputs.version }} --allow-star-activation --target darwin-arm64 env: VSCE_PAT: ${{ secrets.VSCE_PAT }} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000..38ee6e292fa --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,78 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to make participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, and it also applies when +an individual is representing the project or its community in public spaces. +Examples of representing a project or community include using an official +project e-mail address, posting via an official social media account, or acting +as an appointed representative at an online or offline event. Representation of +a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at hi@metalbear.co. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq + diff --git a/Cargo.lock b/Cargo.lock index 49d7528287d..72146ec8534 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1247,7 +1247,7 @@ dependencies = [ [[package]] name = "mirrord" -version = "2.0.3-rc.1" +version = "2.0.0" dependencies = [ "anyhow", "clap 3.1.18", @@ -1259,7 +1259,7 @@ dependencies = [ [[package]] name = "mirrord-agent" -version = "2.0.3-rc.1" +version = "2.0.0" dependencies = [ "actix-codec", "anyhow", @@ -1282,7 +1282,7 @@ dependencies = [ [[package]] name = "mirrord-layer" -version = "2.0.3-rc.1" +version = "2.0.0" dependencies = [ "actix-codec", "bytes", @@ -1312,7 +1312,7 @@ dependencies = [ [[package]] name = "mirrord-protocol" -version = "2.0.3-rc.1" +version = "2.0.0" dependencies = [ "actix-codec", "bincode", diff --git a/Cargo.toml b/Cargo.toml index 7985f11b826..e1a0532cf07 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ members = [ ] [workspace.package] -version = "2.0.3-rc.1" +version = "2.0.0" edition = "2021" license = "MIT" readme = "README.md" diff --git a/README.md b/README.md index a0395cc2d2a..453593549a4 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,23 @@ -

- -

-

mirrord

+
-mirrord lets you easily mirror traffic from your Kubernetes cluster to your development environment. It comes as both [Visual Studio Code](https://code.visualstudio.com/) extension and a CLI tool. +![mirrord logo dark](./images/logo_dark.png#gh-dark-mode-only) + +
+
+ +![mirrord logo light](./images/logo_light.png#gh-light-mode-only) + +
+ +mirrord lets you easily mirror traffic from your Kubernetes cluster to your development environment. It comes as both [Visual Studio Code](https://code.visualstudio.com/) extension and a CLI tool. ## Getting Started - [VSCode Extension](#vscode-extension) - [CLI Tool](#cli-tool) > mirrord uses your machine's default kubeconfig for access to the Kubernetes API. + +> Make sure your local process is listening on the same port as the remote pod. --- ## VSCode Extension ### Installation @@ -17,54 +25,39 @@ Get the extension [here](https://marketplace.visualstudio.com/items?itemName=Met ### How to use +* Click "Enable mirrord" on the status bar * Start debugging your project -* Click "Start mirrord" on the status bar * Choose pod to mirror traffic from -* To stop mirroring, click "Stop mirrord" (or stop debugging) +* The debugged process will start with mirrord, and receive traffic

- +

-The extension listens on the remote port 80, and uses the k8s namespace 'default', but both of those are configurable through the settings button. The extension automatically detects which local port your debugged process listens on and directs the mirrored traffic to it. -If you prefer to direct traffic to a different local port, edit launch.json: - -`{ - "mirrord": { - "port": "" - } -}` - --- ## CLI Tool ### Installation -`npm install -g mirrord` - -### How to use -`mirrord ` +```sh +curl -fsSL https://raw.githubusercontent.com/metalbear-co/mirrord/main/scripts/install.sh | bash +``` -

- -

+* Windows isn't supported currently (you can use WSL) -For more options, run: +### How to use +```sh +mirrord exec --pod-name +``` +e.g. -`mirrord --help` +```sh +mirrord exec node app.js --pod-name my-pod +``` --- + ## How it works mirrord works by letting you select a pod to mirror traffic from. It launches a privileged pod on the same nodewhich enters the namespace of the selected pod and captures traffic from it. - - -For more technical information, see [TECHNICAL.md](./TECHNICAL.md) - -### Caveats -* mirrord currently supports Kubernetes clusters using containerd runtime only. Support for more runtimes will be added if there's demand. - - - - ## Contributing Contributions are welcome via PRs. @@ -73,7 +66,9 @@ Contributions are welcome via PRs. Join our [Discord Server](https://discord.gg/J5YSrStDKD) for questions, support and fun. ---- - +## Code of Conduct +We take our community seriously and we are dedicated to providing a safe and welcoming environment for everyone. +Please take a few minutes to review our [Code of Conduct](./CODE_OF_CONDUCT.md). -Icon Credit: flaticon.com +## License +[MIT](./LICENSE) \ No newline at end of file diff --git a/images/demo.gif b/images/demo.gif index 1e1eb42af007aa95199e6d437b3dac4e837f96d6..acd7f28841a15006f5e6d7f2c5b61fadf60a05e6 100644 GIT binary patch literal 298772 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%0At0 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

Di6&nQf|7LS|;*zpGSc0dM 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 Ro`dO&BQ;|qGyve}{{x!B`4|8I literal 1291515 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ⅇ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

M-fG5 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 i7;2iQ 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

-W^r{HtG=?$Z6vi!tuz5Kw!$TWQ` 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