diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fbace0e06..672bb521a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -5,6 +5,7 @@ on: branches: - main - release-v* + - release-next pull_request: workflow_dispatch: @@ -28,6 +29,8 @@ env: jobs: mac-os-build: name: Build Mac OS binaries + # allow fors to opt-out of time-consuming macOS builds + if: vars.ZITI_SKIP_MACOS_BUILD != 'true' runs-on: macos-11 steps: - name: Git Checkout @@ -41,7 +44,7 @@ jobs: go-version: '1.20.x' - name: Install Ziti CI - uses: netfoundry/ziti-ci@v1 + uses: openziti/ziti-ci@v1 - name: Build and Test run: | @@ -58,6 +61,8 @@ jobs: windows-build: name: Build Windows binaries + # allow fors to opt-out of time-consuming Windows builds + if: vars.ZITI_SKIP_WINDOWS_BUILD != 'true' runs-on: windows-2019 steps: - name: Git Checkout @@ -71,7 +76,7 @@ jobs: go-version: '1.20.x' - name: Install Ziti CI - uses: netfoundry/ziti-ci@v1 + uses: openziti/ziti-ci@v1 - name: Build and Test shell: bash @@ -89,6 +94,7 @@ jobs: fablab-smoketest: name: Fablab Smoketest + # not applicable to forks if: github.repository_owner == 'openziti' runs-on: ubuntu-20.04 steps: @@ -103,7 +109,7 @@ jobs: go-version: '1.20.x' - name: Install Ziti CI - uses: netfoundry/ziti-ci@v1 + uses: openziti/ziti-ci@v1 - name: Build and Test env: @@ -111,12 +117,10 @@ jobs: ziti_ci_gpg_key: ${{ secrets.ZITI_CI_GPG_KEY }} ziti_ci_gpg_key_id: ${{ secrets.ZITI_CI_GPG_KEY_ID }} run: | - mkdir -p dist/bin $(go env GOPATH)/bin/ziti-ci configure-git $(go env GOPATH)/bin/ziti-ci generate-build-info common/version/info_generated.go version pushd network-tests && go install ./... && popd - pushd network-tests && go build -o ../dist/bin/ ./utils/... && popd - go build -tags=all,tests -o dist/bin/ ./... + go install -tags=all,tests ./... - name: Create Zitilab Bindings run: | @@ -134,19 +138,22 @@ jobs: echo "ziti_version: $($(go env GOPATH)/bin/ziti-ci -q get-current-version)" >> ~/.fablab/bindings.yml cat ~/.fablab/bindings.yml - - name: Test Ziti Command - env: - ZITI_ROOT: dist/bin/ + - name: Create Test Environment run: | + echo "ZITI_ROOT=$(go env GOPATH)/bin" >> "$GITHUB_ENV" $(go env GOPATH)/bin/simple-transfer create $(go env GOPATH)/bin/simple-transfer up + + - name: Test Ziti Command + run: | + echo "ZITI_ROOT=$(go env GOPATH)/bin" >> "$GITHUB_ENV" $(go env GOPATH)/bin/simple-transfer run + pushd network-tests && go test -v ./tests/... && popd - name: Test Ziti Command Teardown if: always() - env: - ZITI_ROOT: dist/bin/ run: | + echo "ZITI_ROOT=$(go env GOPATH)/bin" >> "$GITHUB_ENV" $(go env GOPATH)/bin/simple-transfer dispose $(go env GOPATH)/bin/simple-transfer clean @@ -154,6 +161,13 @@ jobs: publish: name: Publish Binaries + # - always() allows evaluating further conditional expressions even if + # needed jobs were skipped + if: | + always() + && (needs.mac-os-build.result == 'success' || needs.mac-os-build.result == 'skipped') + && (needs.windows-build.result == 'success' || needs.windows-build.result == 'skipped') + && (needs.fablab-smoketest.result == 'success' || needs.fablab-smoketest.result == 'skipped') runs-on: ubuntu-20.04 needs: [ mac-os-build, windows-build, fablab-smoketest ] outputs: @@ -175,7 +189,7 @@ jobs: python-version: '3.7' - name: Install Ziti CI - uses: netfoundry/ziti-ci@v1 + uses: openziti/ziti-ci@v1 - name: Build and Test env: @@ -201,19 +215,21 @@ jobs: retention-days: 5 - name: Download darwin release artifact + if: needs.mac-os-build.result == 'success' uses: actions/download-artifact@v3 with: name: darwin-release-${{ github.run_id }} path: release/ - name: Download windows release artifact + if: needs.windows-build.result == 'success' uses: actions/download-artifact@v3 with: name: windows-release-${{ github.run_id }} path: release/ - name: Install Jfrog CLI - uses: jfrog/setup-jfrog-cli@v2 + uses: jfrog/setup-jfrog-cli@v3 with: version: 1.51.1 @@ -276,9 +292,28 @@ jobs: with: ziti-version: ${{ needs.publish.outputs.ZITI_VERSION }} - call-publish-docker-images: - if: github.ref == 'refs/heads/main' - name: Publish Docker Images + call-publish-prerelease-docker-images: + # always() re-enables evaluating conditionals in forks even if Windows or + # macOS builds were skipped + if: | + always() + && needs.publish.result == 'success' + && github.ref == 'refs/heads/release-next' + name: Publish Pre-Release Docker Images + needs: publish + uses: ./.github/workflows/publish-docker-images.yml + secrets: inherit + with: + ziti-version: release-next + + call-publish-release-docker-images: + # always() re-enables evaluating conditionals in forks even if Windows or + # macOS builds were skipped + if: | + always() + && needs.publish.result == 'success' + && github.ref == 'refs/heads/main' + name: Publish Release Docker Images needs: publish uses: ./.github/workflows/publish-docker-images.yml secrets: inherit diff --git a/.github/workflows/publish-docker-images.yml b/.github/workflows/publish-docker-images.yml index 5e572a429..fc9fce4c2 100644 --- a/.github/workflows/publish-docker-images.yml +++ b/.github/workflows/publish-docker-images.yml @@ -4,7 +4,7 @@ on: workflow_call: inputs: ziti-version: - description: 'Ziti Release Version' + description: 'Tag or Branch Ref to Publish' type: string required: true @@ -13,6 +13,10 @@ jobs: runs-on: ubuntu-latest env: ZITI_VERSION: ${{ inputs.ziti-version || github.event.inputs.ziti-version }} + ZITI_CLI_IMAGE: ${{ vars.ZITI_CLI_IMAGE || 'docker.io/openziti/ziti-cli' }} + ZITI_CONTROLLER_IMAGE: ${{ vars.ZITI_CONTROLLER_IMAGE || 'docker.io/openziti/ziti-controller' }} + ZITI_ROUTER_IMAGE: ${{ vars.ZITI_ROUTER_IMAGE || 'docker.io/openziti/ziti-router' }} + ZITI_TUNNEL_IMAGE: ${{ vars.ZITI_TUNNEL_IMAGE || 'docker.io/openziti/ziti-tunnel' }} steps: - name: Checkout Workspace uses: actions/checkout@v3 @@ -35,16 +39,21 @@ jobs: - name: Login to Docker Hub uses: docker/login-action@v2 with: - username: ${{ secrets.DOCKER_HUB_API_USER }} + # it is preferable to obtain the username from a var so that + # recurrences of the same string are not masked in CI output + username: ${{ vars.DOCKER_HUB_API_USER || secrets.DOCKER_HUB_API_USER }} password: ${{ secrets.DOCKER_HUB_API_TOKEN }} - name: Set Up Container Image Tags for Base CLI Container env: - RELEASE_REPO: openziti/ziti-cli + IMAGE_REPO: ${{ env.ZITI_CLI_IMAGE }} id: tagprep_cli run: | DOCKER_TAGS="" - DOCKER_TAGS="${RELEASE_REPO}:${ZITI_VERSION},${RELEASE_REPO}:latest" + DOCKER_TAGS="${IMAGE_REPO}:${ZITI_VERSION}" + if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then + DOCKER_TAGS+=",${IMAGE_REPO}:latest" + fi echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}" echo DOCKER_TAGS="${DOCKER_TAGS}" >> $GITHUB_OUTPUT @@ -65,11 +74,14 @@ jobs: - name: Set Up Container Image Tags for Controller Container env: - RELEASE_REPO: openziti/ziti-controller + IMAGE_REPO: ${{ env. ZITI_CONTROLLER_IMAGE }} id: tagprep_ctrl run: | DOCKER_TAGS="" - DOCKER_TAGS="${RELEASE_REPO}:${ZITI_VERSION},${RELEASE_REPO}:latest" + DOCKER_TAGS="${IMAGE_REPO}:${ZITI_VERSION}" + if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then + DOCKER_TAGS+=",${IMAGE_REPO}:latest" + fi echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}" echo DOCKER_TAGS="${DOCKER_TAGS}" >> $GITHUB_OUTPUT @@ -85,15 +97,19 @@ jobs: tags: ${{ steps.tagprep_ctrl.outputs.DOCKER_TAGS }} build-args: | ZITI_VERSION=${{ env.ZITI_VERSION }} + ZITI_CLI_IMAGE=${{ env.ZITI_CLI_IMAGE }} push: true - name: Set Up Container Image Tags for Router Container env: - RELEASE_REPO: openziti/ziti-router + IMAGE_REPO: ${{ env.ZITI_ROUTER_IMAGE }} id: tagprep_router run: | DOCKER_TAGS="" - DOCKER_TAGS="${RELEASE_REPO}:${ZITI_VERSION},${RELEASE_REPO}:latest" + DOCKER_TAGS="${IMAGE_REPO}:${ZITI_VERSION}" + if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then + DOCKER_TAGS+=",${IMAGE_REPO}:latest" + fi echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}" echo DOCKER_TAGS="${DOCKER_TAGS}" >> $GITHUB_OUTPUT @@ -106,17 +122,21 @@ jobs: tags: ${{ steps.tagprep_router.outputs.DOCKER_TAGS }} build-args: | ZITI_VERSION=${{ env.ZITI_VERSION }} + ZITI_CLI_IMAGE=${{ env.ZITI_CLI_IMAGE }} push: true - name: Set Up Container Image Tags for Go Tunneler Container env: - SNAPSHOT_REPO: netfoundry/ziti-tunnel - RELEASE_REPO: openziti/ziti-tunnel + IMAGE_REPO: ${{ env.ZITI_TUNNEL_IMAGE }} + LEGACY_REPO: netfoundry/ziti-tunnel id: tagprep_tun run: | DOCKER_TAGS="" - for REPO in ${SNAPSHOT_REPO} ${RELEASE_REPO}; do - DOCKER_TAGS+=",${REPO}:${ZITI_VERSION},${REPO}:latest" + for REPO in ${LEGACY_REPO} ${IMAGE_REPO}; do + DOCKER_TAGS="${IMAGE_REPO}:${ZITI_VERSION}" + if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then + DOCKER_TAGS+=",${IMAGE_REPO}:latest" + fi done DOCKER_TAGS=${DOCKER_TAGS#,} # drop leading comma char echo "DEBUG: DOCKER_TAGS=${DOCKER_TAGS}" @@ -131,4 +151,5 @@ jobs: tags: ${{ steps.tagprep_tun.outputs.DOCKER_TAGS }} build-args: | ZITI_VERSION=${{ env.ZITI_VERSION }} + ZITI_CLI_IMAGE=${{ env.ZITI_CLI_IMAGE }} push: true diff --git a/.github/workflows/push-quickstart.yml b/.github/workflows/push-quickstart.yml index a17d8bcb4..9cebda1ea 100644 --- a/.github/workflows/push-quickstart.yml +++ b/.github/workflows/push-quickstart.yml @@ -8,9 +8,9 @@ jobs: steps: - uses: actions/checkout@v3 - name: Login to Docker Hub - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: - username: ${{ secrets.DOCKER_HUB_API_USER }} + username: ${{ vars.DOCKER_HUB_API_USER || secrets.DOCKER_HUB_API_USER }} password: ${{ secrets.DOCKER_HUB_API_TOKEN }} - name: Push to Docker run: ./quickstart/docker/pushLatestDocker.sh diff --git a/ADOPTERS.md b/ADOPTERS.md index ecc6b584d..8720ae692 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -18,9 +18,12 @@ If you're interested in getting your project added to the list either: Here's the list of projects using and adopting OpenZiti -| Project Name | Project Link | Logo | Description | -|---------------------------|-----------------------------------------------|----------|-----------------| -| NetFoundry | https://nfconsole.io/signup | | NetFoundry SaaS provides management, orchestrations, support, and SLAs for OpenZiti networks. | -| HackBunker | https://www.hackbunker.com/ | | To open up a Zero Trust conversation in the C-Suite and Boardrooms of Blue-chip companies with a suite of products. | -| DeltaSecure GmbH | https://deltasecure.de/ | | To provide Managed Security Operations Center services for small and medium-sized enterprises. Ziti overlay forms the basis for secure data transmission of customer data and within the SOC infrastructure. | -| Resulticks | https://www.resulticks.com/ | | Resulticks Zero Trust API delivery network which forms the core of Resulticks' omnichannel marketing automation platform is built on OpenZiti to form a private dark mesh network. | +| Project Name | Project Link | Logo | Description | +|----------------------------------|-----------------------------------------------|----------|-----------------| +| NetFoundry | https://nfconsole.io/signup | | NetFoundry SaaS provides management, orchestrations, support, and SLAs for OpenZiti networks. | +| HackBunker | https://www.hackbunker.com/ | | To open up a Zero Trust conversation in the C-Suite and Boardrooms of Blue-chip companies with a suite of products. | +| DeltaSecure GmbH | https://deltasecure.de/ | | To provide Managed Security Operations Center services for small and medium-sized enterprises. Ziti overlay forms the basis for secure data transmission of customer data and within the SOC infrastructure. | +| Resulticks | https://www.resulticks.com/ | | Resulticks Zero Trust API delivery network which forms the core of Resulticks' omnichannel marketing automation platform is built on OpenZiti to form a private dark mesh network. | +| KubeZT - Zero Trust Kubernetes | https://KubeZT.com/ | | KubeZT is an on-demand Kubernetes environment that enables developers to build and deploy highly secure applications for high-compliance organizations. | +| Analytics HQ | https://AnalyticsHQ.com/ | | Analytics HQ is a next-generation unified platform built for modern data management and advanced analytics. | +| PITS Global Data Recovery Services | https://www.pitsdatarecovery.net/ | | PITS Global Data Recovery Services is a data recovery company in the United States that offers services for recovering data from hard drives, SSDs, flash drives, RAID arrays and more. | diff --git a/CHANGELOG.md b/CHANGELOG.md index 6be2fda5d..881899f4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,308 +1,246 @@ -# Release 0.27.9 +# Release 0.28.0 ## What's New -* Refactored the websocket transport to fix a concurrency issue -* v0.27.6 changed delete behaviors to error if the entity was not found. This release reverts that behavior. +* Event changes + * Added AMQP event writter for events + * Add entity change events for auditing or external integration + * Add usage event filtering + * Add annotations to circuit events +* CLI additions for `ziti` to login with certificates or external-jwt-signers +* NOTE: ziti edge login flag changes: + * `-c` flag has been changed to map to `--client-cert` + * `--cert` is now `--ca` and has no short flag representation + * `-e/--ext-jwt` allows a user to supply a file containing a jwt used with ext-jwt-signers to login + * `-c/--client-cert` allows a certificate to be supplied to login (used with `-k/--client-key`) + * `-k/--client-key` allows a key to be supplied to login (used with `-c/--client-cert`) +* Config type changes + * address fields in `intercept.v1`, `host.v1`, and `host.v2` config types now permit hostnames with underscores. +* Edge Router/Tunneler now supports setting default UDP idle timeout/check interval + +## Event Changes + +### AMPQ Event Writer +Previously events could only be emitted to a file. They can now also be emitted to an AMQP endpoint. + +Example configuration: +``` +events: + jsonLogger: + subscriptions: + - type: fabric.circuits + handler: + type: amqp + format: json + url: "amqp://localhost:5672" + queue: ziti + durable: true //default:true + autoDelete: false //default:false + exclusive: false //default:false + noWait: false //default:false +``` + +### Entity Change Events +OpenZiti can now be configured to emit entity change events. These events describe the changes when entities stored in the +bbolt database are created, updated or deleted. + +Note that events are emitted during the transaction. They are emitted at the end, so it's unlikely, but possible that an event will be emitted for a change which is rolled back. For this reason a following event will emitted when the change is committed. If a system crashes after commit, but before the committed event can be emitted, it will be emitted on the next startup. + +Example configuration: + +``` +events: + jsonLogger: + subscriptions: + - type: entityChange + include: + - services + - identities + handler: + type: file + format: json + path: /tmp/ziti-events.log +``` + +See the related issue for discussion: https://github.com/openziti/fabric/issues/562 + +Example output: + +``` +{ + "namespace": "entityChange", + "eventId": "326faf6c-8123-42ae-9ed8-6fd9560eb567", + "eventType": "created", + "timestamp": "2023-05-11T21:41:47.128588927-04:00", + "metadata": { + "author": { + "type": "identity", + "id": "ji2Rt8KJ4", + "name": "Default Admin" + }, + "source": { + "type": "rest", + "auth": "edge", + "localAddr": "localhost:1280", + "remoteAddr": "127.0.0.1:37578", + "method": "POST" + }, + "version": "v0.0.0" + }, + "entityType": "services", + "isParentEvent": false, + "initialState": null, + "finalState": { + "id": "6S0bCGWb6yrAutXwSQaLiv", + "createdAt": "2023-05-12T01:41:47.128138887Z", + "updatedAt": "2023-05-12T01:41:47.128138887Z", + "tags": {}, + "isSystem": false, + "name": "test", + "terminatorStrategy": "smartrouting", + "roleAttributes": [ + "goodbye", + "hello" + ], + "configs": null, + "encryptionRequired": true + } +} + +{ + "namespace": "entityChange", + "eventId": "326faf6c-8123-42ae-9ed8-6fd9560eb567", + "eventType": "committed", + "timestamp": "2023-05-11T21:41:47.129235443-04:00" +} +``` + +### Usage Event Filtering +Usage events, version 3, can now be filtered based on type. + +The valid types include: + +* ingress.rx +* ingress.tx +* egress.rx +* egress.tx +* fabric.rx +* fabric.tx + +Example configuration: + +``` +events: + jsonLogger: + subscriptions: + - type: fabric.usage + version: 3 + include: + - ingress.rx + - egress.rx +``` + +### Circuit Event Annotations +Circuit events initiated from the edge are now annotated with clientId, hostId and serviceId, to match usage events. The client and host ids are identity ids. + +Example output: + +``` + { + "namespace": "fabric.circuits", + "version": 2, + "event_type": "created", + "circuit_id": "0CEjWYiw6", + "timestamp": "2023-05-05T11:44:03.242399585-04:00", + "client_id": "clhaq7u7600o4ucgdpxy9i4t1", + "service_id": "QARLLTKjqfLZytmSsIqba", + "terminator_id": "7ddcd421-2b00-4b49-9ac0-8c78fe388c30", + "instance_id": "", + "creation_timespan": 1014280, + "path": { + "nodes": [ + "U7OwPtfjg", + "a4rC9DrZ3" + ], + "links": [ + "7Ru3hoxsssZzUNOyvd8Jcb" + ], + "ingress_id": "K9lD", + "egress_id": "rQLK", + "initiator_local_addr": "100.64.0.1:1234", + "initiator_remote_addr": "100.64.0.1:37640", + "terminator_local_addr": "127.0.0.1:45566", + "terminator_remote_addr": "127.0.0.1:1234" + }, + "link_count": 1, + "path_cost": 392151, + "tags": { + "clientId": "U7OwPtfjg", + "hostId": "a4rC9DrZ3", + "serviceId": "QARLLTKjqfLZytmSsIqba" + } +} +``` + +## ER/T UDP Settings + +The edge router tunneler now allows configuring a timeout and check interval for tproxy UDP intercepts. By default intercepted UDP +connections will be closed after five minutes of no traffic, checking every thirty seconds. The configuration is done in the router +config file, in the options for the tunnel module. Note that these configuration options only apply to tproxy intercepts, not to +proxy or host side UDP connections. + +Example configuration: + +```yaml +listeners: + - binding: tunnel + options: + mode: tproxy + udpIdleTimeout: 10s + udpCheckInterval: 5s +``` ## Component Updates and Bug Fixes +* github.com/openziti/agent: [v1.0.10 -> v1.0.13](https://github.com/openziti/agent/compare/v1.0.10...v1.0.13) +* github.com/openziti/channel/v2: [v2.0.58 -> v2.0.78](https://github.com/openziti/channel/compare/v2.0.58...v2.0.78) + * [Issue #98](https://github.com/openziti/channel/issues/98) - Set default connect timeout to 5 seconds + +* github.com/openziti/edge: [v0.24.239 -> v0.24.309](https://github.com/openziti/edge/compare/v0.24.239...v0.24.309) + * [Issue #1503](https://github.com/openziti/edge/issues/1503) - Support configurable UDP idle timeout and check interval for tproxy in edge router tunneler + * [Issue #1471](https://github.com/openziti/edge/issues/1471) - UDP intercept connections report incorrect local/remote addresses, making confusing events + * [Issue #629](https://github.com/openziti/edge/issues/629) - emit entity change events + * [Issue #1295](https://github.com/openziti/edge/issues/1295) - Ensure DB migrations work properly in a clustered setup (edge) + * [Issue #1418](https://github.com/openziti/edge/issues/1418) - Checks for session edge router availablility are inefficient + +* github.com/openziti/edge-api: [v0.25.11 -> v0.25.24](https://github.com/openziti/edge-api/compare/v0.25.11...v0.25.24) +* github.com/openziti/fabric: [v0.22.87 -> v0.23.29](https://github.com/openziti/fabric/compare/v0.22.87...v0.23.29) + * [Issue #724](https://github.com/openziti/fabric/issues/724) - Controller should be notified of forwarding faults on links + * [Issue #725](https://github.com/openziti/fabric/issues/725) - If reroute fails, circuit should be torn down + * [Issue #706](https://github.com/openziti/fabric/issues/706) - Fix panic in link close + * [Issue #700](https://github.com/openziti/fabric/issues/700) - Additional Health Checks exposed on Edge Router + * [Issue #595](https://github.com/openziti/fabric/issues/595) - Add include filtering for V3 usage metrics + * [Issue #684](https://github.com/openziti/fabric/issues/684) - Add tag annotations to circuit events, similar to usage events + * [Issue #562](https://github.com/openziti/fabric/issues/562) - Add entity change events + * [Issue #677](https://github.com/openziti/fabric/issues/677) - Rework raft startup + * [Issue #582](https://github.com/openziti/fabric/issues/582) - Ensure DB migrations work properly in a clustered setup (fabric) + * [Issue #668](https://github.com/openziti/fabric/issues/668) - Add network.Run watchdog, to warn if processing is delayed + +* github.com/openziti/foundation/v2: [v2.0.21 -> v2.0.24](https://github.com/openziti/foundation/compare/v2.0.21...v2.0.24) +* github.com/openziti/identity: [v1.0.45 -> v1.0.54](https://github.com/openziti/identity/compare/v1.0.45...v1.0.54) +* github.com/openziti/runzmd: [v1.0.20 -> v1.0.24](https://github.com/openziti/runzmd/compare/v1.0.20...v1.0.24) +* github.com/openziti/sdk-golang: [v0.18.76 -> v0.20.51](https://github.com/openziti/sdk-golang/compare/v0.18.76...v0.20.51) + * [Issue #407](https://github.com/openziti/sdk-golang/issues/407) - Allowing filtering which edge router urls the sdk uses + * [Issue #394](https://github.com/openziti/sdk-golang/issues/394) - SDK does not recover from API session expiration (during app/computer suspend) + +* github.com/openziti/storage: [v0.1.49 -> v0.2.6](https://github.com/openziti/storage/compare/v0.1.49...v0.2.6) +* github.com/openziti/transport/v2: [v2.0.72 -> v2.0.88](https://github.com/openziti/transport/compare/v2.0.72...v2.0.88) +* github.com/openziti/metrics: [v1.2.19 -> v1.2.25](https://github.com/openziti/metrics/compare/v1.2.19...v1.2.25) +* github.com/openziti/secretstream: v0.1.8 (new) +* github.com/openziti/ziti: [v0.27.9 -> v0.28.0](https://github.com/openziti/ziti/compare/v0.27.9...v0.28.0) + * [Issue #1112](https://github.com/openziti/ziti/issues/1112) - `ziti pki create` creates CA's and intermediates w/ the same DN + * [Issue #1087](https://github.com/openziti/ziti/issues/1087) - re-enable CI in forks + * [Issue #1013](https://github.com/openziti/ziti/issues/1013) - docker env password is renewed at each `docker-compose up` + * [Issue #1077](https://github.com/openziti/ziti/issues/1077) - Show auth-policy name on identity list instead of id + * [Issue #1119](https://github.com/openziti/ziti/issues/1119) - intercept.v1 config should permit underscores in the address + * [Issue #1123](https://github.com/openziti/ziti/issues/1123) - cannot update config types with ziti cli -* github.com/openziti/channel/v2: [v2.0.53 -> v2.0.58](https://github.com/openziti/channel/compare/v2.0.53...v2.0.58) -* github.com/openziti/edge: [v0.24.228 -> v0.24.239](https://github.com/openziti/edge/compare/v0.24.228...v0.24.239) - * [Issue #1391](https://github.com/openziti/edge/issues/1391) - AuthPolicies for identities is missing a reference link - -* github.com/openziti/edge-api: [v0.25.9 -> v0.25.11](https://github.com/openziti/edge-api/compare/v0.25.9...v0.25.11) -* github.com/openziti/fabric: [v0.22.77 -> v0.22.87](https://github.com/openziti/fabric/compare/v0.22.77...v0.22.87) -* github.com/openziti/foundation/v2: [v2.0.18 -> v2.0.21](https://github.com/openziti/foundation/compare/v2.0.18...v2.0.21) -* github.com/openziti/identity: [v1.0.42 -> v1.0.45](https://github.com/openziti/identity/compare/v1.0.42...v1.0.45) -* github.com/openziti/runzmd: [v1.0.18 -> v1.0.20](https://github.com/openziti/runzmd/compare/v1.0.18...v1.0.20) -* github.com/openziti/storage: [v0.1.46 -> v0.1.49](https://github.com/openziti/storage/compare/v0.1.46...v0.1.49) -* github.com/openziti/transport/v2: [v2.0.68 -> v2.0.72](https://github.com/openziti/transport/compare/v2.0.68...v2.0.72) -* github.com/openziti/metrics: [v1.2.16 -> v1.2.19](https://github.com/openziti/metrics/compare/v1.2.16...v1.2.19) -* github.com/openziti/ziti: [v0.27.8 -> v0.27.9](https://github.com/openziti/ziti/compare/v0.27.8...v0.27.9) - -# Release 0.27.8 - -## What's New - -* CLI additions for auth policies and external JWT signers -* Performance improvements for listing services - -## Component Updates and Bug Fixes - -* github.com/openziti/edge: [v0.24.224 -> v0.24.228](https://github.com/openziti/edge/compare/v0.24.224...v0.24.228) - * [Issue #1388](https://github.com/openziti/edge/issues/1388) - Make better use of identity service indexes for service list - * [Issue #1386](https://github.com/openziti/edge/issues/1386) - PUT on identities results in an error and internal PANIC - -* github.com/openziti/fabric: [v0.22.76 -> v0.22.77](https://github.com/openziti/fabric/compare/v0.22.76...v0.22.77) -* github.com/openziti/storage: [v0.1.45 -> v0.1.46](https://github.com/openziti/storage/compare/v0.1.45...v0.1.46) -* github.com/openziti/ziti: [v0.27.7 -> v0.27.8](https://github.com/openziti/ziti/compare/v0.27.7...v0.27.8) - * [Issue #1064](https://github.com/openziti/ziti/issues/1064) - Support auth-policy assignments on identities via the CLI - * [Issue #1058](https://github.com/openziti/ziti/issues/1058) - Allow Auth Policy Create/Update/Delete via CLI - * [Issue #1059](https://github.com/openziti/ziti/issues/1059) - Expose Delete for Ext JWT Signers in CLI - -# Release 0.27.7 - -## What's New - -* This release updates the build to use Go 1.20 - -# Release 0.27.6 - -## What's New - -* Makes inspect CLI more discoverable by adding subcommands for inspectable values -* Adds new inspection allowing configs to be retrieved: `ziti fabric inspect config` -* Many improvements to edge-router/tunneler hosting performance with large numbers of hosted services - * Routers should no longer overwhelm controller while setting up or reestablishing hosting -* Adds ability to disable router -* Adds CLI command to compact offline bbolt database: `ziti ops db compact ` -* Adds CLI command to re-enroll edge routers: `ziti edge re-enroll edge-router` -* Routers can now be disabled. Connections to the controller from disabled routers will be rejected. - * Disable with: `ziti fabric update router --disabled` - * Enable with: `ziti fabric update router --disabled=false` - -## Component Updates and Bug Fixes - -* github.com/openziti/agent: [v1.0.8 -> v1.0.10](https://github.com/openziti/agent/compare/v1.0.8...v1.0.10) -* github.com/openziti/channel/v2: [v2.0.27 -> v2.0.53](https://github.com/openziti/channel/compare/v2.0.27...v2.0.53) - * [Issue #83](https://github.com/openziti/channel/issues/83) - Improve protocol mismatch error(s) - * [Issue #93](https://github.com/openziti/channel/issues/93) - Fix atomic 64-bit alignment error on arm devices - -* github.com/openziti/edge: [v0.24.125 -> v0.24.224](https://github.com/openziti/edge/compare/v0.24.125...v0.24.224) - * [Issue #1373](https://github.com/openziti/edge/issues/1373) - Add support for disabled flag to edge and transit routers - * [Issue #1374](https://github.com/openziti/edge/issues/1374) - Multiple MFA enrollments cannot be cleaned up by administrators - * [Issue #1336](https://github.com/openziti/edge/issues/1336) - xgress_edge_tunnel shouldn't stop/start host on control channel reconnect - * [Issue #1369](https://github.com/openziti/edge/issues/1369) - Add missing entity type id for TransitRouter - * [Issue #1366](https://github.com/openziti/edge/issues/1366) - Error message incorrectly state 'invalid api session' when it's an invalid session - * [Issue #1364](https://github.com/openziti/edge/issues/1364) - Cache api-sessions for tunneler router so we don't need to unnecessarily create new sessions - * [Issue #1362](https://github.com/openziti/edge/issues/1362) - Rate limit terminator creates for router/tunneler - * [Issue #1359](https://github.com/openziti/edge/issues/1359) - Sessions creates should be idempotent - * [Issue #1355](https://github.com/openziti/edge/issues/1355) - Handle duplicate create terminator requests if create terminator fails - * [Issue #1350](https://github.com/openziti/edge/issues/1350) - Router event processing can deadlock - * [Issue #1329](https://github.com/openziti/edge/issues/1329) - UDP connections can drop data if datagrams are > 10k in size - * [Issue #1310](https://github.com/openziti/edge/issues/1310) - Creating a cert backed ext-jwt-signer causes nil dereference - -* github.com/openziti/edge-api: [v0.25.6 -> v0.25.9](https://github.com/openziti/edge-api/compare/v0.25.6...v0.25.9) -* github.com/openziti/fabric: [v0.22.24 -> v0.22.76](https://github.com/openziti/fabric/compare/v0.22.24...v0.22.76) - * [Issue #651](https://github.com/openziti/fabric/issues/651) - Add router enable/disable mechanism - * [Issue #648](https://github.com/openziti/fabric/issues/648) - Add rate limiter pool to router for operations with potential to flood the controller - * [Issue #610](https://github.com/openziti/fabric/issues/610) - Fix router disconnect when endpoint removed from cluster - * [Issue #622](https://github.com/openziti/fabric/issues/622) - fatal error: concurrent map iteration and map write in logContext.WireEntry - * [Issue #507](https://github.com/openziti/fabric/issues/507) - Add configuration for control channel heartbeat - * [Issue #584](https://github.com/openziti/fabric/issues/584) - Add cluster events - * [Issue #599](https://github.com/openziti/fabric/issues/599) - Add release and transfer leadership commands - * [Issue #606](https://github.com/openziti/fabric/issues/606) - Ensure consistent use of peer address - * [Issue #598](https://github.com/openziti/fabric/issues/598) - Add support to fabric inspect to propagate inspect to other controllers - * [Issue #597](https://github.com/openziti/fabric/issues/597) - Make raft settings configurable - * [Issue #604](https://github.com/openziti/fabric/issues/604) - Don't create link dropped msg metric until channel bind time - * [Issue #638](https://github.com/openziti/fabric/issues/638) - Fix atomic 64-bit alignment error on arm devices - -* github.com/openziti/foundation/v2: [v2.0.10 -> v2.0.18](https://github.com/openziti/foundation/compare/v2.0.10...v2.0.18) -* github.com/openziti/identity: [v1.0.30 -> v1.0.42](https://github.com/openziti/identity/compare/v1.0.30...v1.0.42) -* github.com/openziti/runzmd: [v1.0.9 -> v1.0.18](https://github.com/openziti/runzmd/compare/v1.0.9...v1.0.18) -* github.com/openziti/sdk-golang: [v0.18.28 -> v0.18.76](https://github.com/openziti/sdk-golang/compare/v0.18.28...v0.18.76) - * [Issue #356](https://github.com/openziti/sdk-golang/issues/356) - sdk connections should respect net.Conn deadline related API specifications - -* github.com/openziti/storage: [v0.1.34 -> v0.1.45](https://github.com/openziti/storage/compare/v0.1.34...v0.1.45) -* github.com/openziti/transport/v2: [v2.0.51 -> v2.0.68](https://github.com/openziti/transport/compare/v2.0.51...v2.0.68) -* github.com/openziti/jwks: [v1.0.2 -> v1.0.3](https://github.com/openziti/jwks/compare/v1.0.2...v1.0.3) -* github.com/openziti/metrics: [v1.2.3 -> v1.2.16](https://github.com/openziti/metrics/compare/v1.2.3...v1.2.16) -* github.com/openziti/ziti: [v0.27.5 -> v0.27.6](https://github.com/openziti/ziti/compare/v0.27.5...v0.27.6) - * [Issue #1041](https://github.com/openziti/ziti/issues/1041) - Add ziti compact command to CLI - * [Issue #1032](https://github.com/openziti/ziti/issues/1032) - ziti edge create service fails silently if config names don't exist - * [Issue #1031](https://github.com/openziti/ziti/issues/1031) - Fixed quickstart bug with arm and arm64 ambiguity when running quickstart on arm architecture - -# Release 0.27.5 - -## What's New - -* Fixes an issue with `ziti` CLI when using a globally trusted CA -* Fixes bug where `ziti agent stack` was calling `ziti agent stats` -* ziti controller/router no longer compare the running version with - the latest from github by default. Set ZITI_CHECK_VERSION=true to - enable this behavior - -## Component Updates and Bug Fixes - -* github.com/openziti/edge: [v0.24.121 -> v0.24.125](https://github.com/openziti/edge/compare/v0.24.121...v0.24.125) -* github.com/openziti/fabric: [v0.22.20 -> v0.22.24](https://github.com/openziti/fabric/compare/v0.22.20...v0.22.24) - * [Issue #601](https://github.com/openziti/fabric/issues/601) - Only use endpoints file in router once endpoints have changed - * [Issue #583](https://github.com/openziti/fabric/issues/583) - Compress raft snapshots - -* github.com/openziti/sdk-golang: [v0.18.27 -> v0.18.28](https://github.com/openziti/sdk-golang/compare/v0.18.27...v0.18.28) -* github.com/openziti/storage: [v0.1.33 -> v0.1.34](https://github.com/openziti/storage/compare/v0.1.33...v0.1.34) -* github.com/openziti/ziti: [v0.27.4 -> v0.27.5](https://github.com/openziti/ziti/compare/v0.27.4...v0.27.5) - -# Release 0.27.4 - -## What's New - -This release contains a fix for a controller deadlock - -## Component Updates and Bug Fixes - -* github.com/openziti/channel/v2: [v2.0.26 -> v2.0.27](https://github.com/openziti/channel/compare/v2.0.26...v2.0.27) -* github.com/openziti/edge: [v0.24.115 -> v0.24.121](https://github.com/openziti/edge/compare/v0.24.115...v0.24.121) - * [Issue #1303](https://github.com/openziti/edge/issues/1303) - Fix deadlock when flushing api session heartbeats - -* github.com/openziti/fabric: [v0.22.19 -> v0.22.20](https://github.com/openziti/fabric/compare/v0.22.19...v0.22.20) -* github.com/openziti/sdk-golang: [v0.18.26 -> v0.18.27](https://github.com/openziti/sdk-golang/compare/v0.18.26...v0.18.27) -* github.com/openziti/transport/v2: [v2.0.50 -> v2.0.51](https://github.com/openziti/transport/compare/v2.0.50...v2.0.51) -* github.com/openziti/ziti: [v0.27.3 -> v0.27.4](https://github.com/openziti/ziti/compare/v0.27.3...v0.27.4) - -# Release 0.27.3 - -## What's New - -* Docker images for `ziti` CLI - -* New Raft interaction commands - * `raft-leave` allows removal of controllers from the raft cluster - * `raft-list` lists all connected controllers and their version/connected status - * `fabric raft list-members` same info as the agent command, but over rest - -## Component Updates and Bug Fixes - -* github.com/openziti/agent: [v1.0.7 -> v1.0.8](https://github.com/openziti/agent/compare/v1.0.7...v1.0.8) -* github.com/openziti/channel/v2: [v2.0.25 -> v2.0.26](https://github.com/openziti/channel/compare/v2.0.25...v2.0.26) -* github.com/openziti/edge: [v0.24.95 -> v0.24.115](https://github.com/openziti/edge/compare/v0.24.95...v0.24.115) - * [Issue #1292](https://github.com/openziti/edge/issues/1292) - Support alternative tproxy configuration methods - -* github.com/openziti/edge-api: v0.25.6 (new) -* github.com/openziti/fabric: [v0.22.7 -> v0.22.19](https://github.com/openziti/fabric/compare/v0.22.7...v0.22.19) - * [Issue #592](https://github.com/openziti/fabric/issues/592) - Incoming "gateway" connections should be logged at a socket level - * [Issue #588](https://github.com/openziti/fabric/issues/588) - Make service events more consistent - * [Issue #589](https://github.com/openziti/fabric/issues/589) - Add duration to circuit updated and deleted events - * [Issue #508](https://github.com/openziti/fabric/issues/508) - Refactor router debug ops for multiple controllers - -* github.com/openziti/identity: [v1.0.29 -> v1.0.30](https://github.com/openziti/identity/compare/v1.0.29...v1.0.30) -* github.com/openziti/runzmd: [v1.0.7 -> v1.0.9](https://github.com/openziti/runzmd/compare/v1.0.7...v1.0.9) -* github.com/openziti/sdk-golang: [v0.18.21 -> v0.18.26](https://github.com/openziti/sdk-golang/compare/v0.18.21...v0.18.26) -* github.com/openziti/storage: [v0.1.31 -> v0.1.33](https://github.com/openziti/storage/compare/v0.1.31...v0.1.33) -* github.com/openziti/transport/v2: [v2.0.49 -> v2.0.50](https://github.com/openziti/transport/compare/v2.0.49...v2.0.50) -* github.com/openziti/ziti: [v0.27.2 -> v0.27.3](https://github.com/openziti/ziti/compare/v0.27.2...v0.27.3) - * [Issue #974](https://github.com/openziti/ziti/issues/974) - tunnel "host" and "proxy" modes shouldn't run the nameserver - * [Issue #972](https://github.com/openziti/ziti/issues/972) - tunnel segfault - -# Release 0.27.2 - -## What's New - -* Bug fixes - -## Component Updates and Bug Fixes - -* github.com/openziti/channel/v2: [v2.0.24 -> v2.0.25](https://github.com/openziti/channel/compare/v2.0.24...v2.0.25) -* github.com/openziti/edge: [v0.24.86 -> v0.24.95](https://github.com/openziti/edge/compare/v0.24.86...v0.24.95) - * [Issue #1282](https://github.com/openziti/edge/issues/1282) - Ensure entity count events can be configured to only be emitted on the leader - * [Issue #1279](https://github.com/openziti/edge/issues/1279) - Constrain config-type schema to accept only object types - -* github.com/openziti/fabric: [v0.22.1 -> v0.22.7](https://github.com/openziti/fabric/compare/v0.22.1...v0.22.7) - * [Issue #573](https://github.com/openziti/fabric/issues/573) - Ensure specific events aren't duplicated in raft cluster - * [Issue #577](https://github.com/openziti/fabric/issues/577) - JSON Event formatter isn't putting events on their own line - * [Issue #571](https://github.com/openziti/fabric/issues/571) - Move raft.advertiseAddress to ctrl for consistency - * [Issue #569](https://github.com/openziti/fabric/issues/569) - Support automatic migration and agent based migration - * [Issue #567](https://github.com/openziti/fabric/issues/567) - Remove link dropped_msg metrics for closed links - * [Issue #566](https://github.com/openziti/fabric/issues/566) - Link listeners aren't properly configuring channel out queue size - -* github.com/openziti/foundation/v2: [v2.0.9 -> v2.0.10](https://github.com/openziti/foundation/compare/v2.0.9...v2.0.10) -* github.com/openziti/identity: [v1.0.28 -> v1.0.29](https://github.com/openziti/identity/compare/v1.0.28...v1.0.29) -* github.com/openziti/sdk-golang: [v0.18.19 -> v0.18.21](https://github.com/openziti/sdk-golang/compare/v0.18.19...v0.18.21) -* github.com/openziti/storage: [v0.1.30 -> v0.1.31](https://github.com/openziti/storage/compare/v0.1.30...v0.1.31) -* github.com/openziti/transport/v2: [v2.0.48 -> v2.0.49](https://github.com/openziti/transport/compare/v2.0.48...v2.0.49) -* github.com/openziti/metrics: [v1.2.2 -> v1.2.3](https://github.com/openziti/metrics/compare/v1.2.2...v1.2.3) -* github.com/openziti/ziti: [v0.27.1 -> v0.27.2](https://github.com/openziti/ziti/compare/v0.27.1...v0.27.2) - * [Issue #916](https://github.com/openziti/ziti/issues/916) - Allow defining resource tags via json in the cli - - -# Release 0.27.1 - -## What's New - -* Event streaming over websocket - * `ziti fabric stream events` - * Events use same JSON formatting as the file based streaming - * Plain Text formatting removed - * Individual streaming of metrics/circuits removed in favor of unified events streaming -* Improvements to router/tunneler terminator creation - * Create terminator requests are now idempotent, so repeated requests will not result in multiple terminators - * Create terminator requests are now asynchronous, so responses will no longer get timed out - * There is new timer metric from routers, timing how long terminator creates take: `xgress_edge_tunnel.terminator.create_timer` - -## Component Updates and Bug Fixes - -* github.com/openziti/edge: [v0.24.75 -> v0.24.86](https://github.com/openziti/edge/compare/v0.24.75...v0.24.86) - * [Issue #1272](https://github.com/openziti/edge/issues/1272) - Mark xgress_edge and xgress_edge_tunnel created terminators as system entity - * [Issue #1270](https://github.com/openziti/edge/issues/1270) - Make xgress_edge_tunnel service hosting more scalabe - * [Issue #1268](https://github.com/openziti/edge/issues/1268) - session deletion can get stalled by restarts - -* github.com/openziti/fabric: [v0.21.36 -> v0.22.1](https://github.com/openziti/fabric/compare/v0.21.36...v0.22.1) - * [Issue #563](https://github.com/openziti/fabric/issues/563) - Allow streaming events over webscocket, replacing stream circuits and stream metrics - * [Issue #552](https://github.com/openziti/fabric/issues/552) - Add minimum cost delta for smart routing - * [Issue #558](https://github.com/openziti/fabric/issues/558) - Allow terminators to be marked as system entities - -* github.com/openziti/ziti: [v0.27.0 -> v0.27.1](https://github.com/openziti/ziti/compare/v0.27.0...v0.27.1) - * [Issue #928](https://github.com/openziti/ziti/issues/928) - ziti fabric update terminator should not require setting router - * [Issue #929](https://github.com/openziti/ziti/issues/929) - zit fabric list terminators isn't showing cost or dynamic cost - -# Release 0.27.0 - -## What's New - -* Ziti CLI - * The CLI has been cleaned up and unused, unusable and underused components have been removed or hidden - * Add create/delete transit-router CLI commands - * [Issue-706](https://github.com/openziti/ziti/issues/706) - Add port check to quickstart - -## Ziti CLI - -* The update command has been removed. It was non-functional, so this should not affect anyone -* The adhoc, ping and playbook commands have been removed. These were ansible and vagrant commands that were not widely used. -* Make the art command hidden, doesn't need to be removed, leave it as an easter egg -* Move ziti ps command under ziti agent. Remove all ziti ps subcommands, as they already exist as ziti agent subcommands -* Add `ziti controller` and `ziti router` commands - * They should work exactly the same as `ziti-controller` and `ziti router` - * The standalone binaries for `ziti-controller` and `ziti-router` are deprecated and will be removed in a future release -* Add hidden `ziti tunnel` command - * Should work exactly the same as `ziti-tunnel` - * Is hidden as `ziti-edge-tunnel` is the preferred tunnelling application - * The standalone binary `ziti-tunnel` is deprecated and will be removed in a future release -* The db, log-format and unwrap commands have been moved under a new ops command -* ziti executable download management has been deprecated - * The init and uninstall commands have been removed - * The install, upgrade, use and version commands have been hidden and will be hidden once tests using them are updated or replaced -* The demo and tutorial commands have been moved under the new learn subcommand -* `ziti edge enroll` now has a verbose option for additional debugging -* The `ziti edge` CLI now support create/delete transit-router. This allows transit/fabric routers to be provisioned using an enrollment process, rather than requiring certs to be created externally. Note that this requires that the fabric router config file has a `csr` section. - -## Component Updates and Bug Fixes - -* github.com/openziti/agent: [v1.0.5 -> v1.0.7](https://github.com/openziti/agent/compare/v1.0.5...v1.0.7) -* github.com/openziti/channel/v2: [v2.0.12 -> v2.0.24](https://github.com/openziti/channel/compare/v2.0.12...v2.0.24) -* github.com/openziti/edge: [v0.24.36 -> v0.24.75](https://github.com/openziti/edge/compare/v0.24.36...v0.24.75) - * [Issue #1253](https://github.com/openziti/edge/issues/1253) - Panic in controller getting hello from edge router - * [Issue #1233](https://github.com/openziti/edge/issues/1233) - edge-routers ref link in identities endpoint is incorrectly keyed - * [Issue #1234](https://github.com/openziti/edge/issues/1234) - identities missing service-config link ref - * [Issue #1232](https://github.com/openziti/edge/issues/1232) - edge management api identity-types endpoint produces incorrect links - -* github.com/openziti/fabric: [v0.21.17 -> v0.21.36](https://github.com/openziti/fabric/compare/v0.21.17...v0.21.36) - * [Issue #525](https://github.com/openziti/fabric/issues/525) - Update metrics message propagation from router to controller for HA - -* github.com/openziti/foundation/v2: [v2.0.7 -> v2.0.9](https://github.com/openziti/foundation/compare/v2.0.7...v2.0.9) -* github.com/openziti/identity: [v1.0.20 -> v1.0.28](https://github.com/openziti/identity/compare/v1.0.20...v1.0.28) -* github.com/openziti/runzmd: [v1.0.3 -> v1.0.7](https://github.com/openziti/runzmd/compare/v1.0.3...v1.0.7) -* github.com/openziti/sdk-golang: [v0.16.146 -> v0.18.19](https://github.com/openziti/sdk-golang/compare/v0.16.146...v0.18.19) -* github.com/openziti/storage: [v0.1.26 -> v0.1.30](https://github.com/openziti/storage/compare/v0.1.26...v0.1.30) -* github.com/openziti/transport/v2: [v2.0.38 -> v2.0.48](https://github.com/openziti/transport/compare/v2.0.38...v2.0.48) -* github.com/openziti/metrics: [v1.1.5 -> v1.2.2](https://github.com/openziti/metrics/compare/v1.1.5...v1.2.2) -* github.com/openziti/ziti: [v0.26.11 -> v0.26.12](https://github.com/openziti/ziti/compare/v0.26.11...v0.26.12) - * [Issue #892](https://github.com/openziti/ziti/issues/892) - Add timeout to ziti agent controller snapshot-db command - * [Issue #917](https://github.com/openziti/ziti/issues/917) - ZITI_BIN_ROOT is incorrect in docker env - * [Issue #912](https://github.com/openziti/ziti/issues/912) - Binaries not updated in docker-compose env with new image - * [Issue #897](https://github.com/openziti/ziti/issues/897) - Add CLI options to manage /edge/v1/transit-routers - * [Issue #706](https://github.com/openziti/ziti/issues/706) - Add port check to quickstart - -# Older Changelogs - -Changelogs for previous releases can be found in [changelogs](./changelogs). diff --git a/changelogs/CHANGELOG.0.27.md b/changelogs/CHANGELOG.0.27.md new file mode 100644 index 000000000..6be2fda5d --- /dev/null +++ b/changelogs/CHANGELOG.0.27.md @@ -0,0 +1,308 @@ +# Release 0.27.9 + +## What's New + +* Refactored the websocket transport to fix a concurrency issue +* v0.27.6 changed delete behaviors to error if the entity was not found. This release reverts that behavior. + +## Component Updates and Bug Fixes + +* github.com/openziti/channel/v2: [v2.0.53 -> v2.0.58](https://github.com/openziti/channel/compare/v2.0.53...v2.0.58) +* github.com/openziti/edge: [v0.24.228 -> v0.24.239](https://github.com/openziti/edge/compare/v0.24.228...v0.24.239) + * [Issue #1391](https://github.com/openziti/edge/issues/1391) - AuthPolicies for identities is missing a reference link + +* github.com/openziti/edge-api: [v0.25.9 -> v0.25.11](https://github.com/openziti/edge-api/compare/v0.25.9...v0.25.11) +* github.com/openziti/fabric: [v0.22.77 -> v0.22.87](https://github.com/openziti/fabric/compare/v0.22.77...v0.22.87) +* github.com/openziti/foundation/v2: [v2.0.18 -> v2.0.21](https://github.com/openziti/foundation/compare/v2.0.18...v2.0.21) +* github.com/openziti/identity: [v1.0.42 -> v1.0.45](https://github.com/openziti/identity/compare/v1.0.42...v1.0.45) +* github.com/openziti/runzmd: [v1.0.18 -> v1.0.20](https://github.com/openziti/runzmd/compare/v1.0.18...v1.0.20) +* github.com/openziti/storage: [v0.1.46 -> v0.1.49](https://github.com/openziti/storage/compare/v0.1.46...v0.1.49) +* github.com/openziti/transport/v2: [v2.0.68 -> v2.0.72](https://github.com/openziti/transport/compare/v2.0.68...v2.0.72) +* github.com/openziti/metrics: [v1.2.16 -> v1.2.19](https://github.com/openziti/metrics/compare/v1.2.16...v1.2.19) +* github.com/openziti/ziti: [v0.27.8 -> v0.27.9](https://github.com/openziti/ziti/compare/v0.27.8...v0.27.9) + +# Release 0.27.8 + +## What's New + +* CLI additions for auth policies and external JWT signers +* Performance improvements for listing services + +## Component Updates and Bug Fixes + +* github.com/openziti/edge: [v0.24.224 -> v0.24.228](https://github.com/openziti/edge/compare/v0.24.224...v0.24.228) + * [Issue #1388](https://github.com/openziti/edge/issues/1388) - Make better use of identity service indexes for service list + * [Issue #1386](https://github.com/openziti/edge/issues/1386) - PUT on identities results in an error and internal PANIC + +* github.com/openziti/fabric: [v0.22.76 -> v0.22.77](https://github.com/openziti/fabric/compare/v0.22.76...v0.22.77) +* github.com/openziti/storage: [v0.1.45 -> v0.1.46](https://github.com/openziti/storage/compare/v0.1.45...v0.1.46) +* github.com/openziti/ziti: [v0.27.7 -> v0.27.8](https://github.com/openziti/ziti/compare/v0.27.7...v0.27.8) + * [Issue #1064](https://github.com/openziti/ziti/issues/1064) - Support auth-policy assignments on identities via the CLI + * [Issue #1058](https://github.com/openziti/ziti/issues/1058) - Allow Auth Policy Create/Update/Delete via CLI + * [Issue #1059](https://github.com/openziti/ziti/issues/1059) - Expose Delete for Ext JWT Signers in CLI + +# Release 0.27.7 + +## What's New + +* This release updates the build to use Go 1.20 + +# Release 0.27.6 + +## What's New + +* Makes inspect CLI more discoverable by adding subcommands for inspectable values +* Adds new inspection allowing configs to be retrieved: `ziti fabric inspect config` +* Many improvements to edge-router/tunneler hosting performance with large numbers of hosted services + * Routers should no longer overwhelm controller while setting up or reestablishing hosting +* Adds ability to disable router +* Adds CLI command to compact offline bbolt database: `ziti ops db compact ` +* Adds CLI command to re-enroll edge routers: `ziti edge re-enroll edge-router` +* Routers can now be disabled. Connections to the controller from disabled routers will be rejected. + * Disable with: `ziti fabric update router --disabled` + * Enable with: `ziti fabric update router --disabled=false` + +## Component Updates and Bug Fixes + +* github.com/openziti/agent: [v1.0.8 -> v1.0.10](https://github.com/openziti/agent/compare/v1.0.8...v1.0.10) +* github.com/openziti/channel/v2: [v2.0.27 -> v2.0.53](https://github.com/openziti/channel/compare/v2.0.27...v2.0.53) + * [Issue #83](https://github.com/openziti/channel/issues/83) - Improve protocol mismatch error(s) + * [Issue #93](https://github.com/openziti/channel/issues/93) - Fix atomic 64-bit alignment error on arm devices + +* github.com/openziti/edge: [v0.24.125 -> v0.24.224](https://github.com/openziti/edge/compare/v0.24.125...v0.24.224) + * [Issue #1373](https://github.com/openziti/edge/issues/1373) - Add support for disabled flag to edge and transit routers + * [Issue #1374](https://github.com/openziti/edge/issues/1374) - Multiple MFA enrollments cannot be cleaned up by administrators + * [Issue #1336](https://github.com/openziti/edge/issues/1336) - xgress_edge_tunnel shouldn't stop/start host on control channel reconnect + * [Issue #1369](https://github.com/openziti/edge/issues/1369) - Add missing entity type id for TransitRouter + * [Issue #1366](https://github.com/openziti/edge/issues/1366) - Error message incorrectly state 'invalid api session' when it's an invalid session + * [Issue #1364](https://github.com/openziti/edge/issues/1364) - Cache api-sessions for tunneler router so we don't need to unnecessarily create new sessions + * [Issue #1362](https://github.com/openziti/edge/issues/1362) - Rate limit terminator creates for router/tunneler + * [Issue #1359](https://github.com/openziti/edge/issues/1359) - Sessions creates should be idempotent + * [Issue #1355](https://github.com/openziti/edge/issues/1355) - Handle duplicate create terminator requests if create terminator fails + * [Issue #1350](https://github.com/openziti/edge/issues/1350) - Router event processing can deadlock + * [Issue #1329](https://github.com/openziti/edge/issues/1329) - UDP connections can drop data if datagrams are > 10k in size + * [Issue #1310](https://github.com/openziti/edge/issues/1310) - Creating a cert backed ext-jwt-signer causes nil dereference + +* github.com/openziti/edge-api: [v0.25.6 -> v0.25.9](https://github.com/openziti/edge-api/compare/v0.25.6...v0.25.9) +* github.com/openziti/fabric: [v0.22.24 -> v0.22.76](https://github.com/openziti/fabric/compare/v0.22.24...v0.22.76) + * [Issue #651](https://github.com/openziti/fabric/issues/651) - Add router enable/disable mechanism + * [Issue #648](https://github.com/openziti/fabric/issues/648) - Add rate limiter pool to router for operations with potential to flood the controller + * [Issue #610](https://github.com/openziti/fabric/issues/610) - Fix router disconnect when endpoint removed from cluster + * [Issue #622](https://github.com/openziti/fabric/issues/622) - fatal error: concurrent map iteration and map write in logContext.WireEntry + * [Issue #507](https://github.com/openziti/fabric/issues/507) - Add configuration for control channel heartbeat + * [Issue #584](https://github.com/openziti/fabric/issues/584) - Add cluster events + * [Issue #599](https://github.com/openziti/fabric/issues/599) - Add release and transfer leadership commands + * [Issue #606](https://github.com/openziti/fabric/issues/606) - Ensure consistent use of peer address + * [Issue #598](https://github.com/openziti/fabric/issues/598) - Add support to fabric inspect to propagate inspect to other controllers + * [Issue #597](https://github.com/openziti/fabric/issues/597) - Make raft settings configurable + * [Issue #604](https://github.com/openziti/fabric/issues/604) - Don't create link dropped msg metric until channel bind time + * [Issue #638](https://github.com/openziti/fabric/issues/638) - Fix atomic 64-bit alignment error on arm devices + +* github.com/openziti/foundation/v2: [v2.0.10 -> v2.0.18](https://github.com/openziti/foundation/compare/v2.0.10...v2.0.18) +* github.com/openziti/identity: [v1.0.30 -> v1.0.42](https://github.com/openziti/identity/compare/v1.0.30...v1.0.42) +* github.com/openziti/runzmd: [v1.0.9 -> v1.0.18](https://github.com/openziti/runzmd/compare/v1.0.9...v1.0.18) +* github.com/openziti/sdk-golang: [v0.18.28 -> v0.18.76](https://github.com/openziti/sdk-golang/compare/v0.18.28...v0.18.76) + * [Issue #356](https://github.com/openziti/sdk-golang/issues/356) - sdk connections should respect net.Conn deadline related API specifications + +* github.com/openziti/storage: [v0.1.34 -> v0.1.45](https://github.com/openziti/storage/compare/v0.1.34...v0.1.45) +* github.com/openziti/transport/v2: [v2.0.51 -> v2.0.68](https://github.com/openziti/transport/compare/v2.0.51...v2.0.68) +* github.com/openziti/jwks: [v1.0.2 -> v1.0.3](https://github.com/openziti/jwks/compare/v1.0.2...v1.0.3) +* github.com/openziti/metrics: [v1.2.3 -> v1.2.16](https://github.com/openziti/metrics/compare/v1.2.3...v1.2.16) +* github.com/openziti/ziti: [v0.27.5 -> v0.27.6](https://github.com/openziti/ziti/compare/v0.27.5...v0.27.6) + * [Issue #1041](https://github.com/openziti/ziti/issues/1041) - Add ziti compact command to CLI + * [Issue #1032](https://github.com/openziti/ziti/issues/1032) - ziti edge create service fails silently if config names don't exist + * [Issue #1031](https://github.com/openziti/ziti/issues/1031) - Fixed quickstart bug with arm and arm64 ambiguity when running quickstart on arm architecture + +# Release 0.27.5 + +## What's New + +* Fixes an issue with `ziti` CLI when using a globally trusted CA +* Fixes bug where `ziti agent stack` was calling `ziti agent stats` +* ziti controller/router no longer compare the running version with + the latest from github by default. Set ZITI_CHECK_VERSION=true to + enable this behavior + +## Component Updates and Bug Fixes + +* github.com/openziti/edge: [v0.24.121 -> v0.24.125](https://github.com/openziti/edge/compare/v0.24.121...v0.24.125) +* github.com/openziti/fabric: [v0.22.20 -> v0.22.24](https://github.com/openziti/fabric/compare/v0.22.20...v0.22.24) + * [Issue #601](https://github.com/openziti/fabric/issues/601) - Only use endpoints file in router once endpoints have changed + * [Issue #583](https://github.com/openziti/fabric/issues/583) - Compress raft snapshots + +* github.com/openziti/sdk-golang: [v0.18.27 -> v0.18.28](https://github.com/openziti/sdk-golang/compare/v0.18.27...v0.18.28) +* github.com/openziti/storage: [v0.1.33 -> v0.1.34](https://github.com/openziti/storage/compare/v0.1.33...v0.1.34) +* github.com/openziti/ziti: [v0.27.4 -> v0.27.5](https://github.com/openziti/ziti/compare/v0.27.4...v0.27.5) + +# Release 0.27.4 + +## What's New + +This release contains a fix for a controller deadlock + +## Component Updates and Bug Fixes + +* github.com/openziti/channel/v2: [v2.0.26 -> v2.0.27](https://github.com/openziti/channel/compare/v2.0.26...v2.0.27) +* github.com/openziti/edge: [v0.24.115 -> v0.24.121](https://github.com/openziti/edge/compare/v0.24.115...v0.24.121) + * [Issue #1303](https://github.com/openziti/edge/issues/1303) - Fix deadlock when flushing api session heartbeats + +* github.com/openziti/fabric: [v0.22.19 -> v0.22.20](https://github.com/openziti/fabric/compare/v0.22.19...v0.22.20) +* github.com/openziti/sdk-golang: [v0.18.26 -> v0.18.27](https://github.com/openziti/sdk-golang/compare/v0.18.26...v0.18.27) +* github.com/openziti/transport/v2: [v2.0.50 -> v2.0.51](https://github.com/openziti/transport/compare/v2.0.50...v2.0.51) +* github.com/openziti/ziti: [v0.27.3 -> v0.27.4](https://github.com/openziti/ziti/compare/v0.27.3...v0.27.4) + +# Release 0.27.3 + +## What's New + +* Docker images for `ziti` CLI + +* New Raft interaction commands + * `raft-leave` allows removal of controllers from the raft cluster + * `raft-list` lists all connected controllers and their version/connected status + * `fabric raft list-members` same info as the agent command, but over rest + +## Component Updates and Bug Fixes + +* github.com/openziti/agent: [v1.0.7 -> v1.0.8](https://github.com/openziti/agent/compare/v1.0.7...v1.0.8) +* github.com/openziti/channel/v2: [v2.0.25 -> v2.0.26](https://github.com/openziti/channel/compare/v2.0.25...v2.0.26) +* github.com/openziti/edge: [v0.24.95 -> v0.24.115](https://github.com/openziti/edge/compare/v0.24.95...v0.24.115) + * [Issue #1292](https://github.com/openziti/edge/issues/1292) - Support alternative tproxy configuration methods + +* github.com/openziti/edge-api: v0.25.6 (new) +* github.com/openziti/fabric: [v0.22.7 -> v0.22.19](https://github.com/openziti/fabric/compare/v0.22.7...v0.22.19) + * [Issue #592](https://github.com/openziti/fabric/issues/592) - Incoming "gateway" connections should be logged at a socket level + * [Issue #588](https://github.com/openziti/fabric/issues/588) - Make service events more consistent + * [Issue #589](https://github.com/openziti/fabric/issues/589) - Add duration to circuit updated and deleted events + * [Issue #508](https://github.com/openziti/fabric/issues/508) - Refactor router debug ops for multiple controllers + +* github.com/openziti/identity: [v1.0.29 -> v1.0.30](https://github.com/openziti/identity/compare/v1.0.29...v1.0.30) +* github.com/openziti/runzmd: [v1.0.7 -> v1.0.9](https://github.com/openziti/runzmd/compare/v1.0.7...v1.0.9) +* github.com/openziti/sdk-golang: [v0.18.21 -> v0.18.26](https://github.com/openziti/sdk-golang/compare/v0.18.21...v0.18.26) +* github.com/openziti/storage: [v0.1.31 -> v0.1.33](https://github.com/openziti/storage/compare/v0.1.31...v0.1.33) +* github.com/openziti/transport/v2: [v2.0.49 -> v2.0.50](https://github.com/openziti/transport/compare/v2.0.49...v2.0.50) +* github.com/openziti/ziti: [v0.27.2 -> v0.27.3](https://github.com/openziti/ziti/compare/v0.27.2...v0.27.3) + * [Issue #974](https://github.com/openziti/ziti/issues/974) - tunnel "host" and "proxy" modes shouldn't run the nameserver + * [Issue #972](https://github.com/openziti/ziti/issues/972) - tunnel segfault + +# Release 0.27.2 + +## What's New + +* Bug fixes + +## Component Updates and Bug Fixes + +* github.com/openziti/channel/v2: [v2.0.24 -> v2.0.25](https://github.com/openziti/channel/compare/v2.0.24...v2.0.25) +* github.com/openziti/edge: [v0.24.86 -> v0.24.95](https://github.com/openziti/edge/compare/v0.24.86...v0.24.95) + * [Issue #1282](https://github.com/openziti/edge/issues/1282) - Ensure entity count events can be configured to only be emitted on the leader + * [Issue #1279](https://github.com/openziti/edge/issues/1279) - Constrain config-type schema to accept only object types + +* github.com/openziti/fabric: [v0.22.1 -> v0.22.7](https://github.com/openziti/fabric/compare/v0.22.1...v0.22.7) + * [Issue #573](https://github.com/openziti/fabric/issues/573) - Ensure specific events aren't duplicated in raft cluster + * [Issue #577](https://github.com/openziti/fabric/issues/577) - JSON Event formatter isn't putting events on their own line + * [Issue #571](https://github.com/openziti/fabric/issues/571) - Move raft.advertiseAddress to ctrl for consistency + * [Issue #569](https://github.com/openziti/fabric/issues/569) - Support automatic migration and agent based migration + * [Issue #567](https://github.com/openziti/fabric/issues/567) - Remove link dropped_msg metrics for closed links + * [Issue #566](https://github.com/openziti/fabric/issues/566) - Link listeners aren't properly configuring channel out queue size + +* github.com/openziti/foundation/v2: [v2.0.9 -> v2.0.10](https://github.com/openziti/foundation/compare/v2.0.9...v2.0.10) +* github.com/openziti/identity: [v1.0.28 -> v1.0.29](https://github.com/openziti/identity/compare/v1.0.28...v1.0.29) +* github.com/openziti/sdk-golang: [v0.18.19 -> v0.18.21](https://github.com/openziti/sdk-golang/compare/v0.18.19...v0.18.21) +* github.com/openziti/storage: [v0.1.30 -> v0.1.31](https://github.com/openziti/storage/compare/v0.1.30...v0.1.31) +* github.com/openziti/transport/v2: [v2.0.48 -> v2.0.49](https://github.com/openziti/transport/compare/v2.0.48...v2.0.49) +* github.com/openziti/metrics: [v1.2.2 -> v1.2.3](https://github.com/openziti/metrics/compare/v1.2.2...v1.2.3) +* github.com/openziti/ziti: [v0.27.1 -> v0.27.2](https://github.com/openziti/ziti/compare/v0.27.1...v0.27.2) + * [Issue #916](https://github.com/openziti/ziti/issues/916) - Allow defining resource tags via json in the cli + + +# Release 0.27.1 + +## What's New + +* Event streaming over websocket + * `ziti fabric stream events` + * Events use same JSON formatting as the file based streaming + * Plain Text formatting removed + * Individual streaming of metrics/circuits removed in favor of unified events streaming +* Improvements to router/tunneler terminator creation + * Create terminator requests are now idempotent, so repeated requests will not result in multiple terminators + * Create terminator requests are now asynchronous, so responses will no longer get timed out + * There is new timer metric from routers, timing how long terminator creates take: `xgress_edge_tunnel.terminator.create_timer` + +## Component Updates and Bug Fixes + +* github.com/openziti/edge: [v0.24.75 -> v0.24.86](https://github.com/openziti/edge/compare/v0.24.75...v0.24.86) + * [Issue #1272](https://github.com/openziti/edge/issues/1272) - Mark xgress_edge and xgress_edge_tunnel created terminators as system entity + * [Issue #1270](https://github.com/openziti/edge/issues/1270) - Make xgress_edge_tunnel service hosting more scalabe + * [Issue #1268](https://github.com/openziti/edge/issues/1268) - session deletion can get stalled by restarts + +* github.com/openziti/fabric: [v0.21.36 -> v0.22.1](https://github.com/openziti/fabric/compare/v0.21.36...v0.22.1) + * [Issue #563](https://github.com/openziti/fabric/issues/563) - Allow streaming events over webscocket, replacing stream circuits and stream metrics + * [Issue #552](https://github.com/openziti/fabric/issues/552) - Add minimum cost delta for smart routing + * [Issue #558](https://github.com/openziti/fabric/issues/558) - Allow terminators to be marked as system entities + +* github.com/openziti/ziti: [v0.27.0 -> v0.27.1](https://github.com/openziti/ziti/compare/v0.27.0...v0.27.1) + * [Issue #928](https://github.com/openziti/ziti/issues/928) - ziti fabric update terminator should not require setting router + * [Issue #929](https://github.com/openziti/ziti/issues/929) - zit fabric list terminators isn't showing cost or dynamic cost + +# Release 0.27.0 + +## What's New + +* Ziti CLI + * The CLI has been cleaned up and unused, unusable and underused components have been removed or hidden + * Add create/delete transit-router CLI commands + * [Issue-706](https://github.com/openziti/ziti/issues/706) - Add port check to quickstart + +## Ziti CLI + +* The update command has been removed. It was non-functional, so this should not affect anyone +* The adhoc, ping and playbook commands have been removed. These were ansible and vagrant commands that were not widely used. +* Make the art command hidden, doesn't need to be removed, leave it as an easter egg +* Move ziti ps command under ziti agent. Remove all ziti ps subcommands, as they already exist as ziti agent subcommands +* Add `ziti controller` and `ziti router` commands + * They should work exactly the same as `ziti-controller` and `ziti router` + * The standalone binaries for `ziti-controller` and `ziti-router` are deprecated and will be removed in a future release +* Add hidden `ziti tunnel` command + * Should work exactly the same as `ziti-tunnel` + * Is hidden as `ziti-edge-tunnel` is the preferred tunnelling application + * The standalone binary `ziti-tunnel` is deprecated and will be removed in a future release +* The db, log-format and unwrap commands have been moved under a new ops command +* ziti executable download management has been deprecated + * The init and uninstall commands have been removed + * The install, upgrade, use and version commands have been hidden and will be hidden once tests using them are updated or replaced +* The demo and tutorial commands have been moved under the new learn subcommand +* `ziti edge enroll` now has a verbose option for additional debugging +* The `ziti edge` CLI now support create/delete transit-router. This allows transit/fabric routers to be provisioned using an enrollment process, rather than requiring certs to be created externally. Note that this requires that the fabric router config file has a `csr` section. + +## Component Updates and Bug Fixes + +* github.com/openziti/agent: [v1.0.5 -> v1.0.7](https://github.com/openziti/agent/compare/v1.0.5...v1.0.7) +* github.com/openziti/channel/v2: [v2.0.12 -> v2.0.24](https://github.com/openziti/channel/compare/v2.0.12...v2.0.24) +* github.com/openziti/edge: [v0.24.36 -> v0.24.75](https://github.com/openziti/edge/compare/v0.24.36...v0.24.75) + * [Issue #1253](https://github.com/openziti/edge/issues/1253) - Panic in controller getting hello from edge router + * [Issue #1233](https://github.com/openziti/edge/issues/1233) - edge-routers ref link in identities endpoint is incorrectly keyed + * [Issue #1234](https://github.com/openziti/edge/issues/1234) - identities missing service-config link ref + * [Issue #1232](https://github.com/openziti/edge/issues/1232) - edge management api identity-types endpoint produces incorrect links + +* github.com/openziti/fabric: [v0.21.17 -> v0.21.36](https://github.com/openziti/fabric/compare/v0.21.17...v0.21.36) + * [Issue #525](https://github.com/openziti/fabric/issues/525) - Update metrics message propagation from router to controller for HA + +* github.com/openziti/foundation/v2: [v2.0.7 -> v2.0.9](https://github.com/openziti/foundation/compare/v2.0.7...v2.0.9) +* github.com/openziti/identity: [v1.0.20 -> v1.0.28](https://github.com/openziti/identity/compare/v1.0.20...v1.0.28) +* github.com/openziti/runzmd: [v1.0.3 -> v1.0.7](https://github.com/openziti/runzmd/compare/v1.0.3...v1.0.7) +* github.com/openziti/sdk-golang: [v0.16.146 -> v0.18.19](https://github.com/openziti/sdk-golang/compare/v0.16.146...v0.18.19) +* github.com/openziti/storage: [v0.1.26 -> v0.1.30](https://github.com/openziti/storage/compare/v0.1.26...v0.1.30) +* github.com/openziti/transport/v2: [v2.0.38 -> v2.0.48](https://github.com/openziti/transport/compare/v2.0.38...v2.0.48) +* github.com/openziti/metrics: [v1.1.5 -> v1.2.2](https://github.com/openziti/metrics/compare/v1.1.5...v1.2.2) +* github.com/openziti/ziti: [v0.26.11 -> v0.26.12](https://github.com/openziti/ziti/compare/v0.26.11...v0.26.12) + * [Issue #892](https://github.com/openziti/ziti/issues/892) - Add timeout to ziti agent controller snapshot-db command + * [Issue #917](https://github.com/openziti/ziti/issues/917) - ZITI_BIN_ROOT is incorrect in docker env + * [Issue #912](https://github.com/openziti/ziti/issues/912) - Binaries not updated in docker-compose env with new image + * [Issue #897](https://github.com/openziti/ziti/issues/897) - Add CLI options to manage /edge/v1/transit-routers + * [Issue #706](https://github.com/openziti/ziti/issues/706) - Add port check to quickstart + +# Older Changelogs + +Changelogs for previous releases can be found in [changelogs](./changelogs). diff --git a/common/enrollment/enroll.go b/common/enrollment/enroll.go index 8010f9fb4..1ba66d9f9 100644 --- a/common/enrollment/enroll.go +++ b/common/enrollment/enroll.go @@ -19,6 +19,8 @@ package enrollment import ( "encoding/json" "fmt" + "github.com/openziti/identity/engines" + "github.com/openziti/sdk-golang/ziti" "github.com/openziti/ziti/ziti/cmd/common" "io/ioutil" "os" @@ -26,8 +28,6 @@ import ( "github.com/michaelquigley/pfxlog" "github.com/openziti/foundation/v2/term" - "github.com/openziti/identity/certtools" - "github.com/openziti/sdk-golang/ziti/config" "github.com/openziti/sdk-golang/ziti/enroll" "github.com/pkg/errors" "github.com/sirupsen/logrus" @@ -48,7 +48,7 @@ const outFlag = "out" type EnrollOptions struct { common.CommonOptions RemoveJwt bool - KeyAlg config.KeyAlgVar + KeyAlg ziti.KeyAlgVar JwtPath string OutputPath string KeyPath string @@ -117,9 +117,9 @@ func NewEnrollCommand(p common.OptionsProvider) *cobra.Command { enrollSubCmd.Flags().VarP(&action.KeyAlg, "keyAlg", "a", "Crypto algorithm to use when generating private key") var keyDesc = "" - engines := certtools.ListEngines() - if len(engines) > 0 { - keyDesc = fmt.Sprintf("The key to use with the certificate. Optionally specify the engine to use. supported engines: %v", engines) + certEngines := engines.ListEngines() + if len(certEngines) > 0 { + keyDesc = fmt.Sprintf("The key to use with the certificate. Optionally specify the engine to use. supported engines: %v", certEngines) } else { keyDesc = "The key to use with the certificate." } diff --git a/common/getziti/github.go b/common/getziti/github.go new file mode 100644 index 000000000..aa56d9186 --- /dev/null +++ b/common/getziti/github.go @@ -0,0 +1,213 @@ +package getziti + +import ( + "fmt" + "github.com/blang/semver" + "github.com/go-resty/resty/v2" + "github.com/michaelquigley/pfxlog" + "github.com/pkg/errors" + "net/http" + "os" + "path/filepath" + "sort" + "strings" + "time" +) + +// GitHubReleasesData is used to parse the '/releases/latest' response from GitHub +type GitHubReleasesData struct { + Version string `json:"tag_name"` + SemVer semver.Version + Assets []struct { + BrowserDownloadURL string `json:"browser_download_url"` + } +} + +func (self *GitHubReleasesData) GetDownloadUrl(appName string, targetOS, targetArch string) (string, error) { + arches := []string{targetArch} + if strings.ToLower(targetArch) == "amd64" { + arches = append(arches, "x86_64") + } + + for _, asset := range self.Assets { + ok := false + for _, arch := range arches { + if strings.Contains(strings.ToLower(asset.BrowserDownloadURL), arch) { + ok = true + } + } + + ok = ok && strings.Contains(strings.ToLower(asset.BrowserDownloadURL), targetOS) + if ok { + return asset.BrowserDownloadURL, nil + } + } + + return "", errors.Errorf("no download URL found for os/arch %s/%s for '%s'", targetOS, targetArch, appName) +} + +func NewClient() *resty.Client { + // Use a 2-second timeout with a retry count of 5 + return resty. + New(). + SetTimeout(2 * time.Second). + SetRetryCount(5). + SetRedirectPolicy(resty.FlexibleRedirectPolicy(15)) +} + +func getRequest(verbose bool) *resty.Request { + return NewClient(). + SetDebug(verbose). + R() +} + +func GetLatestGitHubReleaseVersion(zitiApp string, verbose bool) (semver.Version, error) { + var result semver.Version + release, err := GetHighestVersionGitHubReleaseInfo(zitiApp, verbose) + if release != nil { + result = release.SemVer + } + return result, err +} + +func GetHighestVersionGitHubReleaseInfo(appName string, verbose bool) (*GitHubReleasesData, error) { + resp, err := getRequest(verbose). + SetQueryParams(map[string]string{}). + SetHeader("Accept", "application/vnd.github.v3+json"). + SetResult([]*GitHubReleasesData{}). + Get("https://api.github.com/repos/openziti/" + appName + "/releases") + + if err != nil { + return nil, errors.Wrapf(err, "unable to get latest version for '%s'", appName) + } + + if resp.StatusCode() == http.StatusNotFound { + return nil, errors.Errorf("unable to get latest version for '%s'; Not Found (invalid URL)", appName) + } + if resp.StatusCode() != http.StatusOK { + return nil, errors.Errorf("unable to get latest version for '%s'; return status=%s", appName, resp.Status()) + } + + result := *resp.Result().(*[]*GitHubReleasesData) + return GetHighestVersionRelease(appName, result) +} + +func GetHighestVersionRelease(appName string, releases []*GitHubReleasesData) (*GitHubReleasesData, error) { + for _, release := range releases { + v, err := semver.ParseTolerant(release.Version) + if err != nil { + return nil, errors.Wrapf(err, "unable to parse version %v for '%v'", release.Version, appName) + } + release.SemVer = v + } + sort.Slice(releases, func(i, j int) bool { + return releases[i].SemVer.GT(releases[j].SemVer) // sort in reverse order + }) + if len(releases) == 0 { + return nil, errors.Errorf("no releases found for '%v'", appName) + } + return releases[0], nil +} + +func GetLatestGitHubReleaseAsset(appName string, appGitHub string, version string, verbose bool) (*GitHubReleasesData, error) { + if version != "latest" { + if appName == "ziti-prox-c" { + version = strings.TrimPrefix(version, "v") + } + + if appName == "ziti-edge-tunnel" { + if !strings.HasPrefix(version, "v") { + version = "v" + version + } + } + } + + if version != "latest " { + version = "tags/" + version + } + + resp, err := getRequest(verbose). + SetQueryParams(map[string]string{}). + SetHeader("Accept", "application/vnd.github.v3+json"). + SetResult(&GitHubReleasesData{}). + Get("https://api.github.com/repos/openziti/" + appGitHub + "/releases/" + version) + + if err != nil { + return nil, fmt.Errorf("unable to get latest version for '%s'; %s", appName, err) + } + + if resp.StatusCode() == http.StatusNotFound { + return nil, fmt.Errorf("unable to get latest version for '%s'; Not Found", appName) + } + if resp.StatusCode() != http.StatusOK { + return nil, fmt.Errorf("unable to get latest version for '%s'; %s", appName, resp.Status()) + } + + result := resp.Result().(*GitHubReleasesData) + return result, nil +} + +// DownloadGitHubReleaseAsset will download a file from the given GitHUb release area +func DownloadGitHubReleaseAsset(fullUrl string, filepath string) (err error) { + resp, err := getRequest(false). + SetOutput(filepath). + Get(fullUrl) + + if err != nil { + return fmt.Errorf("unable to download '%s', %s", fullUrl, err) + } + + if resp.IsError() { + return fmt.Errorf("unable to download file, error HTTP status code [%d] returned for url [%s]", resp.StatusCode(), fullUrl) + } + + return nil +} + +func FindVersionAndInstallGitHubRelease(zitiApp string, zitiAppGitHub string, targetOS, targetArch string, binDir string, version string, verbose bool) error { + if version != "" { + if _, err := semver.Make(strings.TrimPrefix(version, "v")); err != nil { + return err + } + } else { + version = "latest" + } + + release, err := GetLatestGitHubReleaseAsset(zitiApp, zitiAppGitHub, version, verbose) + if err != nil { + return err + } + return InstallGitHubRelease(zitiApp, release, binDir, targetOS, targetArch) +} + +func InstallGitHubRelease(zitiApp string, release *GitHubReleasesData, binDir string, targetOS, targetArch string) error { + fileName := zitiApp + if targetOS == "windows" { + fileName += ".exe" + } + + fullPath := filepath.Join(binDir, fileName) + ext := ".zip" + zipFile := fullPath + ext + + releaseUrl, err := release.GetDownloadUrl(zitiApp, targetOS, targetArch) + if err != nil { + return err + } + + err = DownloadGitHubReleaseAsset(releaseUrl, zipFile) + if err != nil { + return err + } + + err = Unzip(zipFile, binDir) + if err != nil { + return err + } + err = os.Remove(zipFile) + if err != nil { + return err + } + pfxlog.Logger().Infof("Successfully installed '%s' version '%s'", zitiApp, release.Version) + return os.Chmod(fullPath, 0755) +} diff --git a/common/getziti/install_ziti_edge_tunnel.go b/common/getziti/install_ziti_edge_tunnel.go new file mode 100644 index 000000000..bf5770597 --- /dev/null +++ b/common/getziti/install_ziti_edge_tunnel.go @@ -0,0 +1,26 @@ +package getziti + +import ( + "fmt" + "github.com/blang/semver" + c "github.com/openziti/ziti/ziti/constants" + "strings" +) + +func InstallZitiEdgeTunnel(targetVersion, targetOS, targetArch, binDir string, verbose bool) error { + var newVersion semver.Version + + if targetVersion != "" { + newVersion = semver.MustParse(strings.TrimPrefix(targetVersion, "v")) + } else { + v, err := GetLatestGitHubReleaseVersion(c.ZITI_EDGE_TUNNEL_GITHUB, verbose) + if err != nil { + return err + } + newVersion = v + } + + fmt.Println("Attempting to install '" + c.ZITI_EDGE_TUNNEL + "' version: " + newVersion.String()) + return FindVersionAndInstallGitHubRelease( + c.ZITI_EDGE_TUNNEL, c.ZITI_EDGE_TUNNEL_GITHUB, targetOS, targetArch, binDir, newVersion.String(), verbose) +} diff --git a/common/getziti/unzip.go b/common/getziti/unzip.go new file mode 100644 index 000000000..7770442da --- /dev/null +++ b/common/getziti/unzip.go @@ -0,0 +1,74 @@ +package getziti + +import ( + "archive/zip" + "fmt" + "io" + "os" + "path/filepath" + "strings" +) + +func Unzip(src, dest string) error { + r, err := zip.OpenReader(src) + if err != nil { + return err + } + defer func() { + if err := r.Close(); err != nil { + panic(err) + } + }() + + os.MkdirAll(dest, 0755) + + // Closure to address file descriptors issue with all the deferred .Close() methods + extractAndWriteFile := func(f *zip.File) error { + rc, err := f.Open() + if err != nil { + return err + } + defer func() { + if err := rc.Close(); err != nil { + panic(err) + } + }() + + path := filepath.Join(dest, f.Name) + + // Check for ZipSlip (Directory traversal) + if !strings.HasPrefix(path, filepath.Clean(dest)+string(os.PathSeparator)) { + return fmt.Errorf("illegal file path: %s", path) + } + + if f.FileInfo().IsDir() { + os.MkdirAll(path, f.Mode()) + } else { + os.MkdirAll(filepath.Dir(path), f.Mode()) + f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) + if err != nil { + return err + } + defer func() { + if err := f.Close(); err != nil { + panic(err) + } + }() + + _, err = io.Copy(f, rc) + if err != nil { + return err + } + } + return nil + } + + for _, f := range r.File { + err := extractAndWriteFile(f) + if err != nil { + return err + } + } + + return nil +} diff --git a/docker-images/ziti-cli/Dockerfile b/docker-images/ziti-cli/Dockerfile index 1e0967260..0a006e7ce 100644 --- a/docker-images/ziti-cli/Dockerfile +++ b/docker-images/ziti-cli/Dockerfile @@ -18,6 +18,9 @@ ARG TARGETOS # e.g. arm64 ARG TARGETARCH +ARG ZUID=2171 +ARG ZGID=2171 + ### Required OpenShift Labels LABEL name="openziti/ziti-cli" \ maintainer="developers@openziti.org" \ @@ -28,7 +31,7 @@ LABEL name="openziti/ziti-cli" \ USER root ### install packages -RUN INSTALL_PKGS="python38 python38-pip tar" && \ +RUN INSTALL_PKGS="python38 python38-pip tar bash-completion vim-minimal less shadow-utils" && \ microdnf -y update --setopt=install_weak_deps=0 --setopt=tsflags=nodocs && \ microdnf -y install --setopt=install_weak_deps=0 --setopt=tsflags=nodocs ${INSTALL_PKGS} @@ -40,15 +43,23 @@ RUN INSTALL_PKGS="python38 python38-pip tar" && \ COPY --from=bitnami-kubectl /opt/bitnami/kubectl/bin/kubectl /usr/local/bin/ ### add license in the path prescribed by OpenShift -RUN mkdir -m0755 /licenses +RUN mkdir -p -m0755 /licenses COPY ./LICENSE /licenses/apache.txt +RUN groupadd --gid ${ZGID} ziggy \ + && adduser --uid ${ZUID} --gid ${ZGID} --system --home /home/ziggy --shell /bin/bash ziggy \ + && mkdir -p /home/ziggy \ + && chown -R ${ZUID}:${ZGID} /home/ziggy \ + && chmod -R g+rwX /home/ziggy RUN mkdir -p /usr/local/bin COPY ${ARTIFACTS_DIR}/${TARGETARCH}/${TARGETOS}/ziti /usr/local/bin/ RUN chmod 0755 /usr/local/bin/ziti +RUN /usr/local/bin/ziti completion bash > /etc/bash_completion.d/ziti_cli + COPY ${DOCKER_BUILD_DIR}/entrypoint.sh / RUN chmod +x /entrypoint.sh -USER nobody +USER ziggy +COPY ${DOCKER_BUILD_DIR}/bashrc /home/ziggy/.bashrc ENTRYPOINT [ "/entrypoint.sh" ] CMD [ "ziti" ] diff --git a/docker-images/ziti-cli/bashrc b/docker-images/ziti-cli/bashrc new file mode 100644 index 000000000..82f366d9e --- /dev/null +++ b/docker-images/ziti-cli/bashrc @@ -0,0 +1,21 @@ +# this script addresses the problem of /etc/profile not being sourced +# because ziggy's BASH shell is not a "login shell." /etc/profile is +# intended to be sourced only once by the first shell, but it never runs +# automatically upon login because the first shell isn't invoked as a login +# shell. .bashrc runs for all interactive shells, so we can use it to +# replace the current shell process with a login shell. + +set -euo pipefail +USER="${USER:-$( id -u )}" +SHELL="${SHELL:-$( getent passwd "${USER}" | cut -d : -f 7 )}" +if [ -z "${SHELL}" ] ; then + echo 1>&2 "${0}: can't set SHELL; giving up" + exit 1 +fi +HOME="${HOME:-$( getent passwd "${USER}" | cut -d : -f 6 )}" +if [ -z "${HOME}" ] ; then + echo 1>&2 "${0}: can't set HOME; giving up" + exit 1 +fi +cd "${HOME}" +SHELL="${SHELL}" exec -a "-${SHELL##*/}" "${SHELL}" diff --git a/docker-images/ziti-controller/Dockerfile b/docker-images/ziti-controller/Dockerfile index 900b59ab5..71fe158fd 100644 --- a/docker-images/ziti-controller/Dockerfile +++ b/docker-images/ziti-controller/Dockerfile @@ -1,6 +1,7 @@ ARG ZITI_VERSION="latest" +ARG ZITI_CLI_IMAGE="docker.io/openziti/ziti-cli" # this builds docker.io/openziti/ziti-controller -FROM docker.io/openziti/ziti-cli:${ZITI_VERSION} +FROM ${ZITI_CLI_IMAGE}:${ZITI_VERSION} # This build stage grabs artifacts that are copied into the final image. # It uses the same base as the final image to maximize docker cache hits. @@ -15,6 +16,6 @@ LABEL name="openziti/ziti-controller" \ USER root COPY ./entrypoint.sh / RUN chmod +x /entrypoint.sh -USER nobody +USER ziggy ENTRYPOINT [ "/entrypoint.sh" ] CMD [ "run" ] diff --git a/docker-images/ziti-router/Dockerfile b/docker-images/ziti-router/Dockerfile index 5dba0585f..eb6b1c682 100644 --- a/docker-images/ziti-router/Dockerfile +++ b/docker-images/ziti-router/Dockerfile @@ -1,6 +1,7 @@ ARG ZITI_VERSION="latest" +ARG ZITI_CLI_IMAGE="docker.io/openziti/ziti-cli" # this builds docker.io/openziti/ziti-router -FROM docker.io/openziti/ziti-cli:${ZITI_VERSION} +FROM ${ZITI_CLI_IMAGE}:${ZITI_VERSION} # This build stage grabs artifacts that are copied into the final image. # It uses the same base as the final image to maximize docker cache hits. @@ -15,6 +16,6 @@ LABEL name="openziti/ziti-router" \ USER root COPY ./entrypoint.sh / RUN chmod +x /entrypoint.sh -USER nobody +USER ziggy ENTRYPOINT [ "/entrypoint.sh" ] CMD [ "run" ] diff --git a/docker-images/ziti-tunnel/Dockerfile b/docker-images/ziti-tunnel/Dockerfile index f041bf102..a8139dee4 100644 --- a/docker-images/ziti-tunnel/Dockerfile +++ b/docker-images/ziti-tunnel/Dockerfile @@ -1,6 +1,8 @@ ARG ZITI_VERSION="latest" +ARG ZITI_CLI_IMAGE="docker.io/openziti/ziti-cli" # this builds docker.io/openziti/ziti-tunnel, the legacy tunneler. The preferred tunneler is openziti/ziti-edge-tunnel documented in https://docs.openziti.io/docs/reference/tunnelers/linux/container/ -FROM docker.io/openziti/ziti-cli:${ZITI_VERSION} +# this builds docker.io/openziti/ziti-router +FROM ${ZITI_CLI_IMAGE}:${ZITI_VERSION} # This build stage grabs artifacts that are copied into the final image. # It uses the same base as the final image to maximize docker cache hits. diff --git a/etc/ctrl.with.edge.yml b/etc/ctrl.with.edge.yml index db3c6d02f..fb4a90fe1 100644 --- a/etc/ctrl.with.edge.yml +++ b/etc/ctrl.with.edge.yml @@ -50,6 +50,10 @@ ctrl: #events: # jsonLogger: # subscriptions: +# - type: entityChange +# include: +# - services +# - identities # - type: fabric.circuits # - type: fabric.links # - type: fabric.routers @@ -60,6 +64,10 @@ ctrl: # - type: edge.sessions # - type: edge.apiSessions # - type: fabric.usage +# version: 3 +# include: +# - ingress.rx +# - egress.rx # - type: services # - type: edge.entityCounts # interval: 5s @@ -67,6 +75,19 @@ ctrl: # type: file # format: json # path: /tmp/ziti-events.log +# usageLogger: +# subscriptions: +# - type: fabric.usage +# interval: 5s +# handler: +# type: amqp +# format: json +# url: "amqp://localhost:5672" +# queue: ziti +# durable: true //default:true +# autoDelete: false //default:false +# exclusive: false //default:false +# noWait: false //default:false # xctrl_example # diff --git a/go.mod b/go.mod index 3a7d9d9e0..726e1bf45 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/openziti/ziti -go 1.19 +go 1.20 require ( github.com/Jeffail/gabs v1.4.0 @@ -11,39 +11,39 @@ require ( github.com/fatih/color v1.15.0 github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa github.com/go-acme/lego/v4 v4.2.0 - github.com/go-openapi/runtime v0.25.0 + github.com/go-openapi/runtime v0.26.0 github.com/go-openapi/strfmt v0.21.7 + github.com/go-resty/resty/v2 v2.7.0 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b github.com/golang/protobuf v1.5.2 github.com/google/go-cmp v0.5.9 github.com/gorilla/websocket v1.5.0 github.com/jedib0t/go-pretty/v6 v6.4.0 - github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 github.com/michaelquigley/pfxlog v0.6.10 - github.com/openziti/agent v1.0.10 - github.com/openziti/channel/v2 v2.0.58 - github.com/openziti/edge v0.24.239 - github.com/openziti/edge-api v0.25.11 - github.com/openziti/fabric v0.22.87 - github.com/openziti/foundation/v2 v2.0.21 - github.com/openziti/identity v1.0.45 - github.com/openziti/runzmd v1.0.20 - github.com/openziti/sdk-golang v0.18.76 - github.com/openziti/storage v0.1.49 - github.com/openziti/transport/v2 v2.0.72 + github.com/openziti/agent v1.0.13 + github.com/openziti/channel/v2 v2.0.78 + github.com/openziti/edge v0.24.309 + github.com/openziti/edge-api v0.25.24 + github.com/openziti/fabric v0.23.29 + github.com/openziti/foundation/v2 v2.0.24 + github.com/openziti/identity v1.0.54 + github.com/openziti/runzmd v1.0.24 + github.com/openziti/sdk-golang v0.20.51 + github.com/openziti/storage v0.2.6 + github.com/openziti/transport/v2 v2.0.88 github.com/openziti/xweb/v2 v2.0.2 github.com/openziti/ziti-db-explorer v1.1.1 github.com/pkg/errors v0.9.1 github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 github.com/russross/blackfriday v1.5.2 - github.com/shirou/gopsutil/v3 v3.23.3 - github.com/sirupsen/logrus v1.9.0 + github.com/shirou/gopsutil/v3 v3.23.4 + github.com/sirupsen/logrus v1.9.2 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.10.0 - github.com/stretchr/testify v1.8.2 + github.com/stretchr/testify v1.8.3 go.etcd.io/bbolt v1.3.7 - golang.org/x/net v0.9.0 + golang.org/x/net v0.10.0 google.golang.org/grpc v1.42.0 google.golang.org/protobuf v1.30.0 gopkg.in/AlecAivazis/survey.v1 v1.8.7 @@ -66,15 +66,15 @@ require ( github.com/biogo/store v0.0.0-20200525035639-8c94ae1e7c9c // indirect github.com/boltdb/bolt v1.3.1 // indirect github.com/c-bata/go-prompt v0.2.6 // indirect - github.com/cenkalti/backoff/v4 v4.2.0 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/coreos/go-iptables v0.6.0 // indirect github.com/creack/pty v1.1.11 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/dgoogauth v0.0.0-20190221195224-5a805980a5f3 // indirect github.com/dineshappavoo/basex v0.0.0-20170425072625-481a6f6dc663 // indirect github.com/disintegration/imaging v1.6.2 // indirect - github.com/dlclark/regexp2 v1.9.0 // indirect - github.com/docker/distribution v2.8.1+incompatible // indirect + github.com/dlclark/regexp2 v1.10.0 // indirect + github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/ef-ds/deque v1.0.4 // indirect @@ -90,10 +90,9 @@ require ( github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/loads v0.21.2 // indirect - github.com/go-openapi/spec v0.20.8 // indirect + github.com/go-openapi/spec v0.20.9 // indirect github.com/go-openapi/swag v0.22.3 // indirect github.com/go-openapi/validate v0.22.1 // indirect - github.com/go-resty/resty/v2 v2.7.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/gomarkdown/markdown v0.0.0-20230322041520-c84983bdbf2a // indirect @@ -106,15 +105,16 @@ require ( github.com/hashicorp/golang-lru v0.6.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/raft v1.4.0 // indirect + github.com/hashicorp/raft v1.5.0 // indirect github.com/hashicorp/raft-boltdb v0.0.0-20220329195025-15018e9b97e0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jessevdk/go-flags v1.5.0 // indirect github.com/jinzhu/copier v0.3.5 // indirect github.com/josharian/intern v1.0.0 // indirect - github.com/josharian/native v1.0.0 // indirect + github.com/josharian/native v1.1.0 // indirect github.com/kataras/go-events v0.0.3 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect + github.com/klauspost/compress v1.16.5 // indirect github.com/kr/pty v1.1.8 // indirect github.com/kyokomi/emoji/v2 v2.2.12 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect @@ -123,27 +123,27 @@ require ( github.com/magiconair/properties v1.8.5 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.18 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/mattn/go-tty v0.0.3 // indirect - github.com/mdlayher/netlink v1.7.1 // indirect - github.com/mdlayher/socket v0.4.0 // indirect + github.com/mdlayher/netlink v1.7.2 // indirect + github.com/mdlayher/socket v0.4.1 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect - github.com/miekg/dns v1.1.53 // indirect + github.com/miekg/dns v1.1.54 // indirect github.com/miekg/pkcs11 v1.1.1 // indirect github.com/mitchellh/go-ps v1.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/moby/term v0.0.0-20221120202655-abb19827d345 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/natefinch/lumberjack v2.0.0+incompatible // indirect - github.com/netfoundry/secretstream v0.1.5 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/openziti/dilithium v0.3.3 // indirect github.com/openziti/jwks v1.0.3 // indirect - github.com/openziti/metrics v1.2.19 // indirect + github.com/openziti/metrics v1.2.25 // indirect + github.com/openziti/secretstream v0.1.8 // indirect github.com/openziti/x509-claims v1.0.3 // indirect github.com/orcaman/concurrent-map/v2 v2.0.1 // indirect github.com/parallaxsecond/parsec-client-go v0.0.0-20221025095442-f0a77d263cf9 // indirect @@ -151,9 +151,10 @@ require ( github.com/pkg/term v1.2.0-beta.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect + github.com/rabbitmq/amqp091-go v1.8.1 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rodaine/table v1.0.1 // indirect - github.com/shoenig/go-m1cpu v0.1.5 // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect github.com/speps/go-hashids v2.0.0+incompatible // indirect github.com/spf13/afero v1.6.0 // indirect @@ -168,22 +169,24 @@ require ( github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect - github.com/yusufpapurcu/wmi v1.2.2 // indirect - go.mongodb.org/mongo-driver v1.11.4 // indirect + github.com/yusufpapurcu/wmi v1.2.3 // indirect + go.mongodb.org/mongo-driver v1.11.6 // indirect go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 // indirect - go.opentelemetry.io/otel v1.14.0 // indirect - go.opentelemetry.io/otel/trace v1.14.0 // indirect - golang.org/x/crypto v0.8.0 // indirect - golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect + go.opentelemetry.io/otel v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/otel/trace v1.16.0 // indirect + golang.org/x/crypto v0.9.0 // indirect + golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect golang.org/x/image v0.7.0 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/term v0.7.0 // indirect + golang.org/x/sync v0.2.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/term v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect golang.org/x/tools v0.6.0 // indirect google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa // indirect gopkg.in/ini.v1 v1.66.2 // indirect gopkg.in/square/go-jose.v2 v2.5.1 // indirect gotest.tools/v3 v3.4.0 // indirect + nhooyr.io/websocket v1.8.7 // indirect ) diff --git a/go.sum b/go.sum index 491946f31..8a255f275 100644 --- a/go.sum +++ b/go.sum @@ -135,8 +135,8 @@ github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7 github.com/c-bata/go-prompt v0.2.6 h1:POP+nrHE+DfLYx370bedwNhsqmpCUynWPxuHi0C5vZI= github.com/c-bata/go-prompt v0.2.6/go.mod h1:/LMAke8wD2FsNu9EXNdHxNLbd9MedkPnCdfpU9wwHfY= github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= -github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= -github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -191,11 +191,11 @@ github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1 github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dlclark/regexp2 v1.9.0 h1:pTK/l/3qYIKaRXuHnEnIf7Y5NxfRPfpb7dis6/gdlVI= -github.com/dlclark/regexp2 v1.9.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0= +github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dnsimple/dnsimple-go v0.63.0/go.mod h1:O5TJ0/U6r7AfT8niYNlmohpLbCSG+c71tQlGr9SeGrg= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v20.10.24+incompatible h1:Ugvxm7a8+Gz6vqQYQQ2W7GYq5EUPaAiuPgIfVyI3dYE= github.com/docker/docker v20.10.24+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= @@ -243,6 +243,10 @@ github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa h1:RDBNVkRviHZtvD github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/getkin/kin-openapi v0.13.0/go.mod h1:WGRs2ZMM1Q8LR1QBEwUxC6RJEfaBcD0s+pcEVXFuAjw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-acme/lego/v4 v4.2.0 h1:zEvpcDLqvzOlNUGBMA0MCKPpb9UBbnBzgWwCIbTEt2g= github.com/go-acme/lego/v4 v4.2.0/go.mod h1:jmhqxBaangB8txXZKjRLTPXFXUwPCTU2fU8S9/eQzBI= @@ -282,12 +286,12 @@ github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= github.com/go-openapi/loads v0.21.2 h1:r2a/xFIYeZ4Qd2TnGpWDIQNcP80dIaZgf704za8enro= github.com/go-openapi/loads v0.21.2/go.mod h1:Jq58Os6SSGz0rzh62ptiu8Z31I+OTHqmULx5e/gJbNw= -github.com/go-openapi/runtime v0.25.0 h1:7yQTCdRbWhX8vnIjdzU8S00tBYf7Sg71EBeorlPHvhc= -github.com/go-openapi/runtime v0.25.0/go.mod h1:Ux6fikcHXyyob6LNWxtE96hWwjBPYF0DXgVFuMTneOs= +github.com/go-openapi/runtime v0.26.0 h1:HYOFtG00FM1UvqrcxbEJg/SwvDRvYLQKGhw2zaQjTcc= +github.com/go-openapi/runtime v0.26.0/go.mod h1:QgRGeZwrUcSHdeh4Ka9Glvo0ug1LC5WyE+EV88plZrQ= github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= -github.com/go-openapi/spec v0.20.8 h1:ubHmXNY3FCIOinT8RNrrPfGc9t7I1qhPtdOGoG2AxRU= -github.com/go-openapi/spec v0.20.8/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= +github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8= +github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg= @@ -300,6 +304,13 @@ github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/ github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/validate v0.22.1 h1:G+c2ub6q47kfX1sOBLwIQwzBVt8qmOAARyo/9Fqs9NU= github.com/go-openapi/validate v0.22.1/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= @@ -329,6 +340,12 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -432,6 +449,7 @@ github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -480,8 +498,8 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/raft v1.1.0/go.mod h1:4Ak7FSPnuvmb0GV6vgIAJ4vYT4bek9bb6Q+7HVbyzqM= -github.com/hashicorp/raft v1.4.0 h1:tn28S/AWv0BtRQgwZv/1NELu8sCvI0FixqL8C8MYKeY= -github.com/hashicorp/raft v1.4.0/go.mod h1:nz64BIjXphDLATfKGG5RzHtNUPioLeKFsXEm88yTVew= +github.com/hashicorp/raft v1.5.0 h1:uNs9EfJ4FwiArZRxxfd/dQ5d33nV31/CdCHArH89hT8= +github.com/hashicorp/raft v1.5.0/go.mod h1:pKHB2mf/Y25u3AHNSXVRv+yT+WAnmeTX0BwVppVQV+M= github.com/hashicorp/raft-boltdb v0.0.0-20220329195025-15018e9b97e0 h1:CO8dBMLH6dvE1jTn/30ZZw3iuPsNfajshWoJTnVc5cc= github.com/hashicorp/raft-boltdb v0.0.0-20220329195025-15018e9b97e0/go.mod h1:nTakvJ4XYq45UXtn0DbwR4aU9ZdjlnIenpbs6Cd+FM0= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= @@ -509,13 +527,14 @@ github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqx github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/josharian/native v1.0.0 h1:Ts/E8zCSEsG17dUqv7joXJFybuMLjQfWE04tsBODTxk= -github.com/josharian/native v1.0.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= +github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA= +github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -526,12 +545,13 @@ github.com/kataras/go-events v0.0.3 h1:o5YK53uURXtrlg7qE/vovxd/yKOJcLuFtPQbf1rYM github.com/kataras/go-events v0.0.3/go.mod h1:bFBgtzwwzrag7kQmGuU1ZaVxhK2qseYPQomXoVEMsj4= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 h1:WjT3fLi9n8YWh/Ih8Q1LHAPsTqGddPcHqscN+PJ3i68= -github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19/go.mod h1:hY+WOq6m2FpbvyrI93sMaypsttvaIL5nhVR92dTMUcQ= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= +github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/kolo/xmlrpc v0.0.0-20200310150728-e0350524596b/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -556,6 +576,8 @@ github.com/labbsr0x/bindman-dns-webhook v1.0.2/go.mod h1:p6b+VCXIR8NYKpDr8/dg1HK github.com/labbsr0x/goh v1.0.1/go.mod h1:8K2UhVoaWXcCU7Lxoa2omWnC8gyW8px7/lmO61c027w= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/linode/linodego v0.21.0/go.mod h1:UTpq1JUZD0CZsJ8rt+0CRkqbzrp1MbGakVPt2DXY5Mk= github.com/liquidweb/liquidweb-go v1.6.1/go.mod h1:UDcVnAMDkZxpw4Y7NOHkqoeiGacVLEIG/i5J9cyixzQ= github.com/lucas-clemente/quic-go v0.18.0/go.mod h1:yXttHsSNxQi8AWijC/vLP+OJczXqzHSOcJrM5ITUlCg= @@ -603,8 +625,8 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= -github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -617,10 +639,10 @@ github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4f github.com/mattn/go-tty v0.0.3 h1:5OfyWorkyO7xP52Mq7tB36ajHDG5OHrmBGIS/DtakQI= github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mdlayher/netlink v1.7.1 h1:FdUaT/e33HjEXagwELR8R3/KL1Fq5x3G5jgHLp/BTmg= -github.com/mdlayher/netlink v1.7.1/go.mod h1:nKO5CSjE/DJjVhk/TNp6vCE1ktVxEA8VEh8drhZzxsQ= -github.com/mdlayher/socket v0.4.0 h1:280wsy40IC9M9q1uPGcLBwXpcTQDtoGwVt+BNoITxIw= -github.com/mdlayher/socket v0.4.0/go.mod h1:xxFqz5GRCUN3UEOm9CZqEJsAbe1C8OwSK46NlmWuVoc= +github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g= +github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw= +github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U= +github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= @@ -630,8 +652,8 @@ github.com/michaelquigley/pfxlog v0.6.10/go.mod h1:gEiNTfKEX6cJHSwRpOuqBpc8oYrlh github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.53 h1:ZBkuHr5dxHtB1caEOlZTLPo7D3L3TWckgUUs/RHfDxw= -github.com/miekg/dns v1.1.53/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/miekg/dns v1.1.54 h1:5jon9mWcb0sFJGpnI99tOMhCPyJ+RPVz5b63MQG0VWI= +github.com/miekg/dns v1.1.54/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -652,9 +674,11 @@ github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/moby/term v0.0.0-20221120202655-abb19827d345 h1:J9c53/kxIH+2nTKBEfZYFMlhghtHpIHSXpm5VRGHSnU= github.com/moby/term v0.0.0-20221120202655-abb19827d345/go.mod h1:15ce4BGCFxt7I5NQKT+HV0yEDxmf6fSysfEDiVo3zFM= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= @@ -665,8 +689,6 @@ github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6Yf github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/netfoundry/secretstream v0.1.5 h1:iQ4brqUeZO7xNlSpwZDhekPW8d5LlRyHwvvevBOP1IM= -github.com/netfoundry/secretstream v0.1.5/go.mod h1:N6Mvl9Lk8xs84hFS9qZfjcJWiXmpzqaXW/L9W0JYfXY= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nrdcg/auroradns v1.0.1/go.mod h1:y4pc0i9QXYlFCWrhWrUSIETnZgrf4KuwjDIWmmXo3JI= github.com/nrdcg/desec v0.5.0/go.mod h1:2ejvMazkav1VdDbv2HeQO7w+Ta1CGHqzQr27ZBYTuEQ= @@ -697,34 +719,36 @@ github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+ github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openziti/agent v1.0.10 h1:9oTmNXghlggD+O7BJdBp3PkD5kAZ1ssSC6IHZkMakzQ= -github.com/openziti/agent v1.0.10/go.mod h1:6APWgkPP6Uxf1/VyirdTVLAJxwam2vVyakrVw6yvs40= -github.com/openziti/channel/v2 v2.0.58 h1:j9baDM8nEAgHNhJ9n1h+WWbFSgCQCjvNB3KCr5x5q6c= -github.com/openziti/channel/v2 v2.0.58/go.mod h1:Wa3TS5o4pBFSGnDb9zRCGww29ZVXk0GnupwNpb/2DWE= +github.com/openziti/agent v1.0.13 h1:RptJCEANPb904cDqlP7IYfBI+he8EyosimYhG7bp9D0= +github.com/openziti/agent v1.0.13/go.mod h1:CRbwhhnpsoDw0BxZsCRyQUozoRnGzH7+wuQVp1h4qX8= +github.com/openziti/channel/v2 v2.0.78 h1:zY6olGzk0i7RdwnQQYV4J3aJmtuWqpTNUpbCKrghdFA= +github.com/openziti/channel/v2 v2.0.78/go.mod h1:yajD/OlGYESMURbogY+myEUZ49fWERPbIhU6kcDnQHE= github.com/openziti/dilithium v0.3.3 h1:PLgQ6PMNLSTzCFbX/h98cmudgz/cU6TmjdSv5NAPD8k= github.com/openziti/dilithium v0.3.3/go.mod h1:vsCjI2AU/hon9e+dLhUFbCNGesJDj2ASgkySOcpmvjo= -github.com/openziti/edge v0.24.239 h1:S7bAy/BfpGpKwXnfWuGgWpfjUEuJ5iwZojTxu9W8DO0= -github.com/openziti/edge v0.24.239/go.mod h1:G6PLbcyib36KH9hN6tMacr2UMin15EmZioSGPPptJ0U= -github.com/openziti/edge-api v0.25.11 h1:HHjDgoybPZGRZ+tM2udehI+U5Xv991iGED8E6CtDb9w= -github.com/openziti/edge-api v0.25.11/go.mod h1:PBFMYELgr7JUuaCqHobq1U+WESsutzgEDoELU/9qFOg= -github.com/openziti/fabric v0.22.87 h1:Vc71NOFGLQapr8YZjx4p+f9+HHKm63o4kpt4LMjXTY4= -github.com/openziti/fabric v0.22.87/go.mod h1:w/cleYmpE/coUjjCzoRbpO648QWwSee0V4H8mfyqCdg= -github.com/openziti/foundation/v2 v2.0.21 h1:3EDDmSunsbd2DlULuY/vqj12LHRZOknH/m3lf6Ws5Nw= -github.com/openziti/foundation/v2 v2.0.21/go.mod h1:02GW3jFSSlfLwYwuTIldP/S4w7eCKqlzL6ajFSGHNPA= -github.com/openziti/identity v1.0.45 h1:e2kXoMCPcaUXy+k6GwasuKeGSJwavFEr+eOvUA228UY= -github.com/openziti/identity v1.0.45/go.mod h1:fQ5bjNu4L1Yqk011xNB1QXvsmBRHnm5d498fi1bhl24= +github.com/openziti/edge v0.24.309 h1:EGZZ7GqI6/2y8zoNc0Tb11DpHtDG3YTNMUChulFTDL4= +github.com/openziti/edge v0.24.309/go.mod h1:UDlCvgpuzQ6FFugSK0Sim7214c1O+7ahiOX5tvhJaP4= +github.com/openziti/edge-api v0.25.24 h1:XrF3AtF9mnJXgG7rSV2M50Dj/EKUkBUaDdb9/n2TDHI= +github.com/openziti/edge-api v0.25.24/go.mod h1:rmEkj8jAkBTUhhgE/GFXije6bpFbd2P9TzdxTqZlXI8= +github.com/openziti/fabric v0.23.29 h1:FbAeUhfkNGYPNCYo3BFzRByvMTKhscxJEQxYU0BJJdA= +github.com/openziti/fabric v0.23.29/go.mod h1:/M8URo+qloi39qG0QWvXTgtpiPPneNYOjR+VvywS0cw= +github.com/openziti/foundation/v2 v2.0.24 h1:cNJCbh4o9E+7mtSUDo7ZBuMoPjJAilDWgr7X8ntRz/Q= +github.com/openziti/foundation/v2 v2.0.24/go.mod h1:H0w/ldKyE0ynwpIwt68k2rhMwt874IVxPQcimMuHJ3s= +github.com/openziti/identity v1.0.54 h1:1O/i3hnm5oCuHlOXesx4+aC2bXeTGoT+Rg1l2xZF14Y= +github.com/openziti/identity v1.0.54/go.mod h1:ZhMiSF9okmA781kFl0m4BkeyAmf3XA20h1Dh1oz480I= github.com/openziti/jwks v1.0.3 h1:hf8wkb+Cg4nH/HM0KROFd7u+C3DkRVcFZJ7tDV+4icc= github.com/openziti/jwks v1.0.3/go.mod h1:t4xxq8vlXGsPn29kiQVnZBBDDnEoOFqtJoHibkJunQQ= -github.com/openziti/metrics v1.2.19 h1:gQO3e2lUotRHBdGUXYBPWMIErIyyF5hw0EakwQbJzuM= -github.com/openziti/metrics v1.2.19/go.mod h1:ovvxTpDBxGLcVLHgPTFFvwT4ur8p4Z76BPUhIE5iwqc= -github.com/openziti/runzmd v1.0.20 h1:LzRPZRVO9AepAFzGTEsRGp2LRVtJp5vr+QOBl8KbN4w= -github.com/openziti/runzmd v1.0.20/go.mod h1:IXTk5dHAZxtqjg9WVHOiyXHqEHZdwaH5Wg80h5Ux3bQ= -github.com/openziti/sdk-golang v0.18.76 h1:D+UW1lpGHBBgfVrObpauq9RvJV/TFPdEEshfuPkiMcI= -github.com/openziti/sdk-golang v0.18.76/go.mod h1:kw/5rWDLwx52iwW/4a0VRQMUi7GPSI3aETx+G5TvdFQ= -github.com/openziti/storage v0.1.49 h1:luRsssYlGhpiJxjgc+FWF/yd2JLs9IKfeKID/5Hknrg= -github.com/openziti/storage v0.1.49/go.mod h1:Le2VFNL67YewLtaCnGNXPLH18Yrh/EMxeJ/eXxTOwak= -github.com/openziti/transport/v2 v2.0.72 h1:yjJtxy3Ckx5I4pDicmxILTdqQB6D18LSg2Zvsde0T00= -github.com/openziti/transport/v2 v2.0.72/go.mod h1:YuDvm+syZc9nfdhbdPZdtuL1Dfw+bELWhWVYAg73ups= +github.com/openziti/metrics v1.2.25 h1:acD/J/DcWgfbhmKS/s3HDvpt/1WS3QBZPeeGBZHbj94= +github.com/openziti/metrics v1.2.25/go.mod h1:s2r1FS+wUdJ3LXp1qJK6777iQ8gPWXE2HFfDsiJo1/Y= +github.com/openziti/runzmd v1.0.24 h1:jSwfqpA6SLCtpDUzdQl92gECc08itE8eFeHYdaJu4tY= +github.com/openziti/runzmd v1.0.24/go.mod h1:NX3EPWMDZPIPNUztDOkLrV6akqdC/P/X0UUeAL63V58= +github.com/openziti/sdk-golang v0.20.51 h1:oVqo9kyh8OKtAAX4yrJIJa5nn6qZDvpfUqOlBPnqb14= +github.com/openziti/sdk-golang v0.20.51/go.mod h1:Ecgf8vgPSLOP7EgQgb3juv2UwsKbu37G1NHSqioTUCs= +github.com/openziti/secretstream v0.1.8 h1:AgPHLDuXTiM1apHQmBvwvSW1vbQqAm7wUJDHqkQ/6Nk= +github.com/openziti/secretstream v0.1.8/go.mod h1:qcF8EmSX5SAT8k2pzsDI4bWugopv9AA+ltgWDrcAAEw= +github.com/openziti/storage v0.2.6 h1:/pbIRzDwrczMWRVkN75PfwAXFbArplIqhpRsUrsUOBc= +github.com/openziti/storage v0.2.6/go.mod h1:JnjCofrnPcajwn6VIB2CgI7pVVUFBL7evbezIsQ4AgA= +github.com/openziti/transport/v2 v2.0.88 h1:K2kIrDInbjFqXvzPg+EkyYZkUiy8rEkBnYRKshELuho= +github.com/openziti/transport/v2 v2.0.88/go.mod h1:1eh1lpeIvB3KgyEC+OykpLa8Dj2AUC5921iOd2ovkwE= github.com/openziti/x509-claims v1.0.3 h1:HNdQ8Nf1agB3lBs1gahcO6zfkeS4S5xoQ2/PkY4HRX0= github.com/openziti/x509-claims v1.0.3/go.mod h1:Z0WIpBm6c4ecrpRKrou6Gk2wrLWxJO/+tuUwKh8VewE= github.com/openziti/xweb/v2 v2.0.2 h1:XYlVFriTq/U1wcUrc+XPnWJGhXh9NJPhtQ7+r3aC0cU= @@ -793,6 +817,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rabbitmq/amqp091-go v1.8.1 h1:RejT1SBUim5doqcL6s7iN6SBmsQqyTgXb1xMlH0h1hA= +github.com/rabbitmq/amqp091-go v1.8.1/go.mod h1:+jPrT9iY2eLjRaMSRHUhc3z14E/l85kv/f+6luSD3pc= github.com/rainycape/memcache v0.0.0-20150622160815-1031fa0ce2f2/go.mod h1:7tZKcyumwBO6qip7RNQ5r77yrssm9bfCowcLEBcU5IA= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= @@ -816,13 +842,13 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/sacloud/libsacloud v1.36.2/go.mod h1:P7YAOVmnIn3DKHqCZcUKYUXmSwGBm3yS7IBEjKVSrjg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil/v3 v3.23.3 h1:Syt5vVZXUDXPEXpIBt5ziWsJ4LdSAAxF4l/xZeQgSEE= -github.com/shirou/gopsutil/v3 v3.23.3/go.mod h1:lSBNN6t3+D6W5e5nXTxc8KIMMVxAcS+6IJlffjRRlMU= -github.com/shoenig/go-m1cpu v0.1.4/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ= -github.com/shoenig/go-m1cpu v0.1.5 h1:LF57Z/Fpb/WdGLjt2HZilNnmZOxg/q2bSKTQhgbrLrQ= +github.com/shirou/gopsutil/v3 v3.23.4 h1:hZwmDxZs7Ewt75DV81r4pFMqbq+di2cbt9FsQBqLD2o= +github.com/shirou/gopsutil/v3 v3.23.4/go.mod h1:ZcGxyfzAMRevhUR2+cfhXDH6gQdFYE/t8j1nsU4mPI8= github.com/shoenig/go-m1cpu v0.1.5/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ= -github.com/shoenig/test v0.6.3 h1:GVXWJFk9PiOjN0KoJ7VrJGH6uLPnqxR7/fe3HUPfE0c= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.3/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= @@ -852,8 +878,8 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= +github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= @@ -906,8 +932,9 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= @@ -923,6 +950,10 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1 github.com/transip/gotransip/v6 v6.2.0/go.mod h1:pQZ36hWWRahCUXkFWlx9Hs711gLd8J4qdgLdRzmtY+g= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= @@ -952,8 +983,9 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= @@ -963,8 +995,8 @@ go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsX go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= -go.mongodb.org/mongo-driver v1.11.4 h1:4ayjakA013OdpGyL2K3ZqylTac/rMjrJOMZ1EHizXas= -go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= +go.mongodb.org/mongo-driver v1.11.6 h1:XM7G6PjiGAO5betLF13BIa5TlLUUE3uJ/2Ox3Lz1K+o= +go.mongodb.org/mongo-driver v1.11.6/go.mod h1:G9TgswdsWjX4tmDA5zfs2+6AEPpYJwqblyjsfuh8oXY= go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 h1:CCriYyAfq1Br1aIYettdHZTy8mBTIPo7We18TuO/bak= go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= @@ -977,15 +1009,19 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM= -go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU= -go.opentelemetry.io/otel/sdk v1.11.1 h1:F7KmQgoHljhUuJyA+9BiU+EkJfyX5nVVF4wyzWZpKxs= -go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M= -go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= +go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= +go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= +go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY= +go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= +go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/ratelimit v0.0.0-20180316092928-c15da0234277/go.mod h1:2X8KaoNd1J0lZV+PxJk/5+DGbO/tpwLR1m++a7FnB/Y= @@ -1018,8 +1054,8 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1030,8 +1066,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1121,8 +1157,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1151,8 +1187,9 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180606202747-9527bec2660b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180622082034-63fc586f45fe/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1241,14 +1278,15 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1517,6 +1555,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/goversion v1.2.0 h1:SPn+NLTiAG7w30IRK/DKp1BjvpWabYgxlLp/+kx5J8w= rsc.io/goversion v1.2.0/go.mod h1:Eih9y/uIBS3ulggl7KNJ09xGSLcuNaLgmvvqa07sgfo= diff --git a/network-tests/go.mod b/network-tests/go.mod index 5705fc89d..e4acc2949 100644 --- a/network-tests/go.mod +++ b/network-tests/go.mod @@ -3,25 +3,29 @@ module github.com/openziti/ziti/network-tests go 1.19 require ( - github.com/openziti/fablab v0.4.23 - github.com/openziti/sdk-golang v0.18.26 - github.com/openziti/zitilab v0.1.21 - github.com/sirupsen/logrus v1.9.0 - github.com/spf13/cobra v1.6.1 + github.com/michaelquigley/pfxlog v0.6.10 + github.com/openziti/edge v0.24.239 + github.com/openziti/fablab v0.4.52 + github.com/openziti/sdk-golang v0.18.76 + github.com/openziti/zitilab v0.1.60 + github.com/pkg/errors v0.9.1 + github.com/sirupsen/logrus v1.9.2 + github.com/spf13/cobra v1.7.0 + github.com/stretchr/testify v1.8.3 ) require ( github.com/AppsFlyer/go-sundheit v0.5.0 // indirect github.com/Jeffail/gabs v1.4.0 // indirect - github.com/Jeffail/gabs/v2 v2.6.1 // indirect + github.com/Jeffail/gabs/v2 v2.7.0 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/MichaelMure/go-term-markdown v0.1.4 // indirect github.com/MichaelMure/go-term-text v0.3.1 // indirect github.com/alecthomas/chroma v0.10.0 // indirect - github.com/andybalholm/brotli v1.0.4 // indirect + github.com/andybalholm/brotli v1.0.5 // indirect github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211106181442-e4c1a74c66bd // indirect - github.com/armon/go-metrics v0.3.10 // indirect - github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect + github.com/armon/go-metrics v0.4.1 // indirect + github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/aws/aws-sdk-go v1.44.118 // indirect github.com/biogo/store v0.0.0-20200525035639-8c94ae1e7c9c // indirect github.com/blang/semver v3.5.1+incompatible // indirect @@ -33,17 +37,17 @@ require ( github.com/dgryski/dgoogauth v0.0.0-20190221195224-5a805980a5f3 // indirect github.com/dineshappavoo/basex v0.0.0-20170425072625-481a6f6dc663 // indirect github.com/disintegration/imaging v1.6.2 // indirect - github.com/dlclark/regexp2 v1.8.0 // indirect + github.com/dlclark/regexp2 v1.9.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/ef-ds/deque v1.0.4 // indirect github.com/eliukblau/pixterm/pkg/ansimage v0.0.0-20191210081756-9fb6cf8c2f75 // indirect github.com/emirpasic/gods v1.18.1 // indirect - github.com/fatih/color v1.14.1 // indirect + github.com/fatih/color v1.15.0 // indirect github.com/felixge/httpsnoop v1.0.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa // indirect github.com/go-acme/lego/v4 v4.2.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/analysis v0.21.4 // indirect @@ -53,90 +57,89 @@ require ( github.com/go-openapi/loads v0.21.2 // indirect github.com/go-openapi/runtime v0.25.0 // indirect github.com/go-openapi/spec v0.20.8 // indirect - github.com/go-openapi/strfmt v0.21.3 // indirect + github.com/go-openapi/strfmt v0.21.7 // indirect github.com/go-openapi/swag v0.22.3 // indirect github.com/go-openapi/validate v0.22.1 // indirect github.com/go-resty/resty/v2 v2.7.0 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/gomarkdown/markdown v0.0.0-20221013030248-663e2500819c // indirect + github.com/gomarkdown/markdown v0.0.0-20230322041520-c84983bdbf2a // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/hashicorp/go-hclog v1.4.0 // indirect + github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect github.com/hashicorp/golang-lru v0.6.0 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.1 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/raft v1.3.11 // indirect + github.com/hashicorp/raft v1.4.0 // indirect github.com/hashicorp/raft-boltdb v0.0.0-20220329195025-15018e9b97e0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/jedib0t/go-pretty/v6 v6.4.4 // indirect + github.com/jedib0t/go-pretty/v6 v6.4.6 // indirect github.com/jessevdk/go-flags v1.5.0 // indirect github.com/jinzhu/copier v0.3.5 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/josharian/native v1.0.0 // indirect - github.com/kataras/go-events v0.0.3-0.20201007151548-c411dc70c0a6 // indirect + github.com/kataras/go-events v0.0.3 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 // indirect github.com/kr/fs v0.1.0 // indirect - github.com/kyokomi/emoji/v2 v2.2.11 // indirect + github.com/kyokomi/emoji/v2 v2.2.12 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/lucsky/cuid v1.2.1 // indirect - github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de // indirect + github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a // indirect github.com/magiconair/properties v1.8.5 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.18 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/mattn/go-tty v0.0.3 // indirect github.com/mdlayher/netlink v1.7.1 // indirect github.com/mdlayher/socket v0.4.0 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/michaelquigley/figlet v0.0.0-20191015203154-054d06db54b4 // indirect - github.com/michaelquigley/pfxlog v0.6.9 // indirect - github.com/miekg/dns v1.1.50 // indirect + github.com/miekg/dns v1.1.53 // indirect github.com/miekg/pkcs11 v1.1.1 // indirect github.com/mitchellh/go-ps v1.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/natefinch/lumberjack v2.0.0+incompatible // indirect github.com/natefinch/npipe v0.0.0-20160621034901-c1b8fa8bdcce // indirect - github.com/netfoundry/secretstream v0.1.2 // indirect + github.com/netfoundry/secretstream v0.1.5 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect - github.com/openziti/agent v1.0.8 // indirect - github.com/openziti/channel/v2 v2.0.26 // indirect - github.com/openziti/edge v0.24.95 // indirect - github.com/openziti/fabric v0.22.7 // indirect - github.com/openziti/foundation/v2 v2.0.10 // indirect - github.com/openziti/identity v1.0.30 // indirect - github.com/openziti/jwks v1.0.2 // indirect - github.com/openziti/metrics v1.2.3 // indirect - github.com/openziti/runzmd v1.0.9 // indirect - github.com/openziti/storage v0.1.33 // indirect - github.com/openziti/transport/v2 v2.0.50 // indirect + github.com/openziti/agent v1.0.10 // indirect + github.com/openziti/channel/v2 v2.0.58 // indirect + github.com/openziti/edge-api v0.25.11 // indirect + github.com/openziti/fabric v0.22.87 // indirect + github.com/openziti/foundation/v2 v2.0.24 // indirect + github.com/openziti/identity v1.0.45 // indirect + github.com/openziti/jwks v1.0.3 // indirect + github.com/openziti/metrics v1.2.19 // indirect + github.com/openziti/runzmd v1.0.20 // indirect + github.com/openziti/storage v0.1.49 // indirect + github.com/openziti/transport/v2 v2.0.72 // indirect github.com/openziti/x509-claims v1.0.3 // indirect github.com/openziti/xweb/v2 v2.0.2 // indirect - github.com/openziti/ziti v0.27.2 // indirect + github.com/openziti/ziti v0.27.9 // indirect github.com/openziti/ziti-db-explorer v1.1.1 // indirect github.com/orcaman/concurrent-map/v2 v2.0.1 // indirect github.com/parallaxsecond/parsec-client-go v0.0.0-20221025095442-f0a77d263cf9 // indirect github.com/pelletier/go-toml v1.9.4 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/pkg/sftp v1.13.5 // indirect github.com/pkg/term v1.2.0-beta.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rivo/uniseg v0.4.3 // indirect + github.com/rivo/uniseg v0.4.4 // indirect github.com/rodaine/table v1.0.1 // indirect github.com/russross/blackfriday v1.5.2 // indirect - github.com/shirou/gopsutil/v3 v3.23.1 // indirect + github.com/shirou/gopsutil/v3 v3.23.3 // indirect + github.com/shoenig/go-m1cpu v0.1.5 // indirect github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect github.com/speps/go-hashids v2.0.0+incompatible // indirect github.com/spf13/afero v1.6.0 // indirect @@ -144,7 +147,6 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.10.0 // indirect - github.com/stretchr/testify v1.8.1 // indirect github.com/subosito/gotenv v1.2.0 // indirect github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect @@ -156,21 +158,21 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect go.etcd.io/bbolt v1.3.7 // indirect - go.mongodb.org/mongo-driver v1.11.1 // indirect + go.mongodb.org/mongo-driver v1.11.4 // indirect go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 // indirect - go.opentelemetry.io/otel v1.11.2 // indirect - go.opentelemetry.io/otel/trace v1.11.2 // indirect - golang.org/x/crypto v0.5.0 // indirect - golang.org/x/exp v0.0.0-20230202163644-54bba9f4231b // indirect - golang.org/x/image v0.5.0 // indirect - golang.org/x/mod v0.6.0 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/term v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect - golang.org/x/tools v0.2.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + go.opentelemetry.io/otel v1.14.0 // indirect + go.opentelemetry.io/otel/trace v1.14.0 // indirect + golang.org/x/crypto v0.9.0 // indirect + golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect + golang.org/x/image v0.7.0 // indirect + golang.org/x/mod v0.8.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/sync v0.2.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/term v0.8.0 // indirect + golang.org/x/text v0.9.0 // indirect + golang.org/x/tools v0.6.0 // indirect + google.golang.org/protobuf v1.30.0 // indirect gopkg.in/AlecAivazis/survey.v1 v1.8.7 // indirect gopkg.in/ini.v1 v1.66.2 // indirect gopkg.in/resty.v1 v1.12.0 // indirect diff --git a/network-tests/go.sum b/network-tests/go.sum index 5146eb36f..45a9d74a8 100644 --- a/network-tests/go.sum +++ b/network-tests/go.sum @@ -60,8 +60,8 @@ github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3 github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Jeffail/gabs v1.4.0 h1://5fYRRTq1edjfIrQGvdkcd22pkYUrHZ5YC/H2GJVAo= github.com/Jeffail/gabs v1.4.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc= -github.com/Jeffail/gabs/v2 v2.6.1 h1:wwbE6nTQTwIMsMxzi6XFQQYRZ6wDc1mSdxoAN+9U4Gk= -github.com/Jeffail/gabs/v2 v2.6.1/go.mod h1:xCn81vdHKxFUuWWAaD5jCTQDNPBMh5pPs9IJ+NcziBI= +github.com/Jeffail/gabs/v2 v2.7.0 h1:Y2edYaTcE8ZpRsR2AtmPu5xQdFDIthFG0jYhu5PY8kg= +github.com/Jeffail/gabs/v2 v2.7.0/go.mod h1:dp5ocw1FvBBQYssgHsG7I1WYsiLRtkUaB1FEtSwvNUw= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/MichaelMure/go-term-markdown v0.1.4 h1:Ir3kBXDUtOX7dEv0EaQV8CNPpH+T7AfTh0eniMOtNcs= @@ -88,8 +88,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/aliyun/alibaba-cloud-sdk-go v1.61.458/go.mod h1:pUKYbK5JQ+1Dfxk80P0qxGqe5dkxDoabbZS7zOcouyA= -github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211106181442-e4c1a74c66bd h1:fjJY1LimH0wVCvOHLX35SCX/MbWomAglET1H2kvz7xc= github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211106181442-e4c1a74c66bd/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= @@ -98,12 +98,12 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= github.com/armon/go-metrics v0.3.8/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo= -github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.30.20/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.44.118 h1:FJOqIRTukf7+Ulp047/k7JB6eqMXNnj7eb+coORThHQ= github.com/aws/aws-sdk-go v1.44.118/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= @@ -161,8 +161,8 @@ github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1 github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dlclark/regexp2 v1.8.0 h1:rJD5HeGIT/2b5CDk63FVCwZA3qgYElfg+oQK7uH5pfE= -github.com/dlclark/regexp2 v1.8.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dlclark/regexp2 v1.9.0 h1:pTK/l/3qYIKaRXuHnEnIf7Y5NxfRPfpb7dis6/gdlVI= +github.com/dlclark/regexp2 v1.9.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dnsimple/dnsimple-go v0.63.0/go.mod h1:O5TJ0/U6r7AfT8niYNlmohpLbCSG+c71tQlGr9SeGrg= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -186,8 +186,8 @@ github.com/exoscale/egoscale v0.23.0/go.mod h1:hRo78jkjkCDKpivQdRBEpNYF5+cVpCJCP github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= -github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= @@ -212,8 +212,8 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= @@ -245,8 +245,9 @@ github.com/go-openapi/spec v0.20.8 h1:ubHmXNY3FCIOinT8RNrrPfGc9t7I1qhPtdOGoG2AxR github.com/go-openapi/spec v0.20.8/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= -github.com/go-openapi/strfmt v0.21.3 h1:xwhj5X6CjXEZZHMWy1zKJxvW9AfHC9pkyUjLvHtKG7o= github.com/go-openapi/strfmt v0.21.3/go.mod h1:k+RzNO0Da+k3FrrynSNN8F7n/peCmQQqbbXjtDfvmGg= +github.com/go-openapi/strfmt v0.21.7 h1:rspiXgNWgeUzhjo1YU01do6qsahtJNByjLVbPLNHb8k= +github.com/go-openapi/strfmt v0.21.7/go.mod h1:adeGTkxE44sPyLk0JV235VQAO/ZXUr8KAzYjclFs3ew= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= @@ -325,8 +326,8 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomarkdown/markdown v0.0.0-20191123064959-2c17d62f5098/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU= -github.com/gomarkdown/markdown v0.0.0-20221013030248-663e2500819c h1:iyaGYbCmcYK0Ja9a3OUa2Fo+EaN0cbLu0eKpBwPFzc8= -github.com/gomarkdown/markdown v0.0.0-20221013030248-663e2500819c/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= +github.com/gomarkdown/markdown v0.0.0-20230322041520-c84983bdbf2a h1:AWZzzFrqyjYlRloN6edwTLTUbKxf5flLXNuTBDm3Ews= +github.com/gomarkdown/markdown v0.0.0-20230322041520-c84983bdbf2a/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -387,8 +388,8 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v1.4.0 h1:ctuWFGrhFha8BnnzxqeRGidlEcQkDyL5u8J8t5eA11I= -github.com/hashicorp/go-hclog v1.4.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -409,16 +410,16 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.1 h1:5pv5N1lT1fjLg2VQ5KWc7kmucp2x/kvFOnxuVTqZ6x4= -github.com/hashicorp/golang-lru/v2 v2.0.1/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/golang-lru/v2 v2.0.2 h1:Dwmkdr5Nc/oBiXgJS3CDHNhJtIHkuZ3DZF5twqnfBdU= +github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/raft v1.1.0/go.mod h1:4Ak7FSPnuvmb0GV6vgIAJ4vYT4bek9bb6Q+7HVbyzqM= -github.com/hashicorp/raft v1.3.11 h1:p3v6gf6l3S797NnK5av3HcczOC1T5CLoaRvg0g9ys4A= -github.com/hashicorp/raft v1.3.11/go.mod h1:J8naEwc6XaaCfts7+28whSeRvCqTd6e20BlCU3LtEO4= +github.com/hashicorp/raft v1.4.0 h1:tn28S/AWv0BtRQgwZv/1NELu8sCvI0FixqL8C8MYKeY= +github.com/hashicorp/raft v1.4.0/go.mod h1:nz64BIjXphDLATfKGG5RzHtNUPioLeKFsXEm88yTVew= github.com/hashicorp/raft-boltdb v0.0.0-20220329195025-15018e9b97e0 h1:CO8dBMLH6dvE1jTn/30ZZw3iuPsNfajshWoJTnVc5cc= github.com/hashicorp/raft-boltdb v0.0.0-20220329195025-15018e9b97e0/go.mod h1:nTakvJ4XYq45UXtn0DbwR4aU9ZdjlnIenpbs6Cd+FM0= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= @@ -429,11 +430,10 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df/go.mod h1:QMZY7/J/KSQEhKWFeDesPjMj+wCHReeknARU3wqlyN4= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jedib0t/go-pretty/v6 v6.4.4 h1:N+gz6UngBPF4M288kiMURPHELDMIhF/Em35aYuKrsSc= -github.com/jedib0t/go-pretty/v6 v6.4.4/go.mod h1:MgmISkTWDSFu0xOqiZ0mKNntMQ2mDgOcwOkwBEkMDJI= +github.com/jedib0t/go-pretty/v6 v6.4.6 h1:v6aG9h6Uby3IusSSEjHaZNXpHFhzqMmjXcPq1Rjl9Jw= +github.com/jedib0t/go-pretty/v6 v6.4.6/go.mod h1:Ndk3ase2CkQbXLLNf5QDHoYb6J9WtVfmHZu9n8rk2xs= github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= @@ -460,8 +460,8 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kataras/go-events v0.0.3-0.20201007151548-c411dc70c0a6 h1:XXnySN8wVet8S4UlcXHjh8Oa7618Eu7z92HxU5cIfhA= -github.com/kataras/go-events v0.0.3-0.20201007151548-c411dc70c0a6/go.mod h1:6IxMW59VJdEIqj3bjFGJvGLRdb0WHtrlxPZy9qXctcg= +github.com/kataras/go-events v0.0.3 h1:o5YK53uURXtrlg7qE/vovxd/yKOJcLuFtPQbf1rYMC4= +github.com/kataras/go-events v0.0.3/go.mod h1:bFBgtzwwzrag7kQmGuU1ZaVxhK2qseYPQomXoVEMsj4= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/keybase/go-ps v0.0.0-20190827175125-91aafc93ba19 h1:WjT3fLi9n8YWh/Ih8Q1LHAPsTqGddPcHqscN+PJ3i68= @@ -485,8 +485,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kyokomi/emoji/v2 v2.2.8/go.mod h1:JUcn42DTdsXJo1SWanHh4HKDEyPaR5CqkmoirZZP9qE= -github.com/kyokomi/emoji/v2 v2.2.11 h1:Pf/ZWVTbnAVkHOLJLWjPxM/FmgyPe+d85cv/OLP5Yus= -github.com/kyokomi/emoji/v2 v2.2.11/go.mod h1:JUcn42DTdsXJo1SWanHh4HKDEyPaR5CqkmoirZZP9qE= +github.com/kyokomi/emoji/v2 v2.2.12 h1:sSVA5nH9ebR3Zji1o31wu3yOwD1zKXQA2z0zUyeit60= +github.com/kyokomi/emoji/v2 v2.2.12/go.mod h1:JUcn42DTdsXJo1SWanHh4HKDEyPaR5CqkmoirZZP9qE= github.com/labbsr0x/bindman-dns-webhook v1.0.2/go.mod h1:p6b+VCXIR8NYKpDr8/dg1HKfQoRHCdcsROXKvmoehKA= github.com/labbsr0x/goh v1.0.1/go.mod h1:8K2UhVoaWXcCU7Lxoa2omWnC8gyW8px7/lmO61c027w= github.com/linode/linodego v0.21.0/go.mod h1:UTpq1JUZD0CZsJ8rt+0CRkqbzrp1MbGakVPt2DXY5Mk= @@ -497,8 +497,8 @@ github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i github.com/lucsky/cuid v1.2.1 h1:MtJrL2OFhvYufUIn48d35QGXyeTC8tn0upumW9WwTHg= github.com/lucsky/cuid v1.2.1/go.mod h1:QaaJqckboimOmhRSJXSx/+IT+VTfxfPGSo/6mfgUfmE= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de h1:V53FWzU6KAZVi1tPp5UIsMoUWJ2/PNwYIDXnu7QuBCE= -github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= +github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a h1:N9zuLhTvBSRt0gWSiJswwQ2HqDmtX/ZCDJURnKUt1Ik= +github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -526,8 +526,8 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= +github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -549,12 +549,12 @@ github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQ github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/michaelquigley/figlet v0.0.0-20191015203154-054d06db54b4 h1:O0aAES+Hu4tySETys37Xd1wMcUohr5X7yM3qaRSHKRw= github.com/michaelquigley/figlet v0.0.0-20191015203154-054d06db54b4/go.mod h1:ZgenLagNkpruEGzNeXiQH9RtZedSLKw1WlDTJWPZzpk= -github.com/michaelquigley/pfxlog v0.6.9 h1:K/weH6ARu58aEDQi0ccinItvV958CeO6Ri4jqeFwd/w= -github.com/michaelquigley/pfxlog v0.6.9/go.mod h1:D2vg1tPyPdSXWWkSnGk6Fomwh5b3clwVJDUh71tq8Sk= +github.com/michaelquigley/pfxlog v0.6.10 h1:IbC/H3MmSDcPlQHF1UZPQU13Dkrs0+ycWRyQd2ihnjw= +github.com/michaelquigley/pfxlog v0.6.10/go.mod h1:gEiNTfKEX6cJHSwRpOuqBpc8oYrlhMiDK/xMk/gV7D0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= -github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/miekg/dns v1.1.53 h1:ZBkuHr5dxHtB1caEOlZTLPo7D3L3TWckgUUs/RHfDxw= +github.com/miekg/dns v1.1.53/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -584,8 +584,8 @@ github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6Yf github.com/natefinch/npipe v0.0.0-20160621034901-c1b8fa8bdcce h1:TqjP/BTDrwN7zP9xyXVuLsMBXYMt6LLYi55PlrIcq8U= github.com/natefinch/npipe v0.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:ifHPsLndGGzvgzcaXUvzmt6LxKT4pJ+uzEhtnMt+f7A= github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= -github.com/netfoundry/secretstream v0.1.2 h1:NgqrYytDnjKbOfWI29TT0SJM+RwB3yf9MIkJVJaU+J0= -github.com/netfoundry/secretstream v0.1.2/go.mod h1:uasYkYSp0MmNSlKOWJ2sVzxPms8e58TS4ENq4yro86k= +github.com/netfoundry/secretstream v0.1.5 h1:iQ4brqUeZO7xNlSpwZDhekPW8d5LlRyHwvvevBOP1IM= +github.com/netfoundry/secretstream v0.1.5/go.mod h1:N6Mvl9Lk8xs84hFS9qZfjcJWiXmpzqaXW/L9W0JYfXY= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nrdcg/auroradns v1.0.1/go.mod h1:y4pc0i9QXYlFCWrhWrUSIETnZgrf4KuwjDIWmmXo3JI= github.com/nrdcg/desec v0.5.0/go.mod h1:2ejvMazkav1VdDbv2HeQO7w+Ta1CGHqzQr27ZBYTuEQ= @@ -612,42 +612,44 @@ github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openziti/agent v1.0.8 h1:qB4zQO9dz3PL8qbeyzCWbwTrtHZPEZlYtjkJJ78SJPo= -github.com/openziti/agent v1.0.8/go.mod h1:6APWgkPP6Uxf1/VyirdTVLAJxwam2vVyakrVw6yvs40= -github.com/openziti/channel/v2 v2.0.26 h1:IIEnno26FuywcyCwCie1U7OHoB8HzuG95EzEnvtKmio= -github.com/openziti/channel/v2 v2.0.26/go.mod h1:zZO0bgVYY9FCDs2EMRakDl6wIfyOWuzgPzPL8EvQ5Ks= -github.com/openziti/edge v0.24.95 h1:Lj7ycWVOXbqt3TK6NSGPWXj5bp3/5rX7rA+bR5wA8Nc= -github.com/openziti/edge v0.24.95/go.mod h1:nVamtrBekK372q8bbKK/D6t0W7LBqQ+Miu0YE1u3od4= -github.com/openziti/fablab v0.4.23 h1:GKbSceX8hphBfY0RtYkrq7LTilnV61w4JCb4hh70Zio= -github.com/openziti/fablab v0.4.23/go.mod h1:ff6XCI4YryKcyhblK3zNVkiEH0JXDhO6ZkHQN4N0wDE= -github.com/openziti/fabric v0.22.7 h1:o0k/QnCpVZPiC77fh/NoUVCoeQNhfBm4oOICcJsdkWc= -github.com/openziti/fabric v0.22.7/go.mod h1:NITYnGTCeu0ENixTd7qXFzGyIDm5GkyJhxKYTnmFzjk= -github.com/openziti/foundation/v2 v2.0.10 h1:IeOkcPbgBpBTw4JrWz8s9Z76vO/m+i2uIE0cMZ0C2DM= -github.com/openziti/foundation/v2 v2.0.10/go.mod h1:Z0gnQsGJb/H/B+pixLtmCIpw1dBllD4QoT6LeD35WzA= -github.com/openziti/identity v1.0.30 h1:N2WDdK7MpeXuHCRjMo6N/QMtUXUkenUEqfKWXFNu2oE= -github.com/openziti/identity v1.0.30/go.mod h1:SPZAaqvDToS2jtae4D2fvO9IsR6G6FKNZ8WTqAwKKJE= -github.com/openziti/jwks v1.0.2 h1:32BGXIAnefS+v7uXKPb1x8/cQ7srek6Ai06dsrMTY4E= -github.com/openziti/jwks v1.0.2/go.mod h1:KwO0x9FBG0aoJS5f6nH5xeHoplyR1H143SMI9kF0mC8= -github.com/openziti/metrics v1.2.3 h1:h9+mSU673QLSMOb3YibD1vNgE0yIDZ5leiUqDwN5szE= -github.com/openziti/metrics v1.2.3/go.mod h1:jK8BfZ9nXMhO+LPcUPpN/sebrLfIeF4uaHlm5JIF7BY= -github.com/openziti/runzmd v1.0.9 h1:gQnZT5cACuVpcBBBHWIaN9Vmwv8KUNa7LBLG8Xi13/U= -github.com/openziti/runzmd v1.0.9/go.mod h1:s6amx7gbzewUqlnq8dcvJ50eb0ryjQtknPYubOHuIug= -github.com/openziti/sdk-golang v0.18.26 h1:Wk2s88R9b5SeP3D3uEpqE31ffY20Y1v2ZSyYfgud/BA= -github.com/openziti/sdk-golang v0.18.26/go.mod h1:QCoDwqjGm8qxcIDboY+jglfjZVdz8gREquRMpX7jz8I= -github.com/openziti/storage v0.1.33 h1:c3jdiJPIthYC51Ye2VOBGuz3g1DGVzmjGIlgPs1BcOg= -github.com/openziti/storage v0.1.33/go.mod h1:G4swa9DU8oG+B+tv4X7X5QjtI8nxbXhEUKlDbwNowBY= -github.com/openziti/transport/v2 v2.0.50 h1:bMk0CeQhg61vaCpAUANlu+hZTqyZSa7IFX3ZYFi1tns= -github.com/openziti/transport/v2 v2.0.50/go.mod h1:I3qtYJhHzEzydqqdIq8IZStwPV7ybynK0mJP17MB/q0= +github.com/openziti/agent v1.0.10 h1:9oTmNXghlggD+O7BJdBp3PkD5kAZ1ssSC6IHZkMakzQ= +github.com/openziti/agent v1.0.10/go.mod h1:6APWgkPP6Uxf1/VyirdTVLAJxwam2vVyakrVw6yvs40= +github.com/openziti/channel/v2 v2.0.58 h1:j9baDM8nEAgHNhJ9n1h+WWbFSgCQCjvNB3KCr5x5q6c= +github.com/openziti/channel/v2 v2.0.58/go.mod h1:Wa3TS5o4pBFSGnDb9zRCGww29ZVXk0GnupwNpb/2DWE= +github.com/openziti/edge v0.24.239 h1:S7bAy/BfpGpKwXnfWuGgWpfjUEuJ5iwZojTxu9W8DO0= +github.com/openziti/edge v0.24.239/go.mod h1:G6PLbcyib36KH9hN6tMacr2UMin15EmZioSGPPptJ0U= +github.com/openziti/edge-api v0.25.11 h1:HHjDgoybPZGRZ+tM2udehI+U5Xv991iGED8E6CtDb9w= +github.com/openziti/edge-api v0.25.11/go.mod h1:PBFMYELgr7JUuaCqHobq1U+WESsutzgEDoELU/9qFOg= +github.com/openziti/fablab v0.4.52 h1:X5+NaRnfPxbzhxUh9b4IQmVNVgYWFf8/Ck2sKNz77ho= +github.com/openziti/fablab v0.4.52/go.mod h1:aF8Fu3C8hnnaOJyAZz3AXGY4cMxQyBLhoIlSRJ/VVpc= +github.com/openziti/fabric v0.22.87 h1:Vc71NOFGLQapr8YZjx4p+f9+HHKm63o4kpt4LMjXTY4= +github.com/openziti/fabric v0.22.87/go.mod h1:w/cleYmpE/coUjjCzoRbpO648QWwSee0V4H8mfyqCdg= +github.com/openziti/foundation/v2 v2.0.24 h1:cNJCbh4o9E+7mtSUDo7ZBuMoPjJAilDWgr7X8ntRz/Q= +github.com/openziti/foundation/v2 v2.0.24/go.mod h1:H0w/ldKyE0ynwpIwt68k2rhMwt874IVxPQcimMuHJ3s= +github.com/openziti/identity v1.0.45 h1:e2kXoMCPcaUXy+k6GwasuKeGSJwavFEr+eOvUA228UY= +github.com/openziti/identity v1.0.45/go.mod h1:fQ5bjNu4L1Yqk011xNB1QXvsmBRHnm5d498fi1bhl24= +github.com/openziti/jwks v1.0.3 h1:hf8wkb+Cg4nH/HM0KROFd7u+C3DkRVcFZJ7tDV+4icc= +github.com/openziti/jwks v1.0.3/go.mod h1:t4xxq8vlXGsPn29kiQVnZBBDDnEoOFqtJoHibkJunQQ= +github.com/openziti/metrics v1.2.19 h1:gQO3e2lUotRHBdGUXYBPWMIErIyyF5hw0EakwQbJzuM= +github.com/openziti/metrics v1.2.19/go.mod h1:ovvxTpDBxGLcVLHgPTFFvwT4ur8p4Z76BPUhIE5iwqc= +github.com/openziti/runzmd v1.0.20 h1:LzRPZRVO9AepAFzGTEsRGp2LRVtJp5vr+QOBl8KbN4w= +github.com/openziti/runzmd v1.0.20/go.mod h1:IXTk5dHAZxtqjg9WVHOiyXHqEHZdwaH5Wg80h5Ux3bQ= +github.com/openziti/sdk-golang v0.18.76 h1:D+UW1lpGHBBgfVrObpauq9RvJV/TFPdEEshfuPkiMcI= +github.com/openziti/sdk-golang v0.18.76/go.mod h1:kw/5rWDLwx52iwW/4a0VRQMUi7GPSI3aETx+G5TvdFQ= +github.com/openziti/storage v0.1.49 h1:luRsssYlGhpiJxjgc+FWF/yd2JLs9IKfeKID/5Hknrg= +github.com/openziti/storage v0.1.49/go.mod h1:Le2VFNL67YewLtaCnGNXPLH18Yrh/EMxeJ/eXxTOwak= +github.com/openziti/transport/v2 v2.0.72 h1:yjJtxy3Ckx5I4pDicmxILTdqQB6D18LSg2Zvsde0T00= +github.com/openziti/transport/v2 v2.0.72/go.mod h1:YuDvm+syZc9nfdhbdPZdtuL1Dfw+bELWhWVYAg73ups= github.com/openziti/x509-claims v1.0.3 h1:HNdQ8Nf1agB3lBs1gahcO6zfkeS4S5xoQ2/PkY4HRX0= github.com/openziti/x509-claims v1.0.3/go.mod h1:Z0WIpBm6c4ecrpRKrou6Gk2wrLWxJO/+tuUwKh8VewE= github.com/openziti/xweb/v2 v2.0.2 h1:XYlVFriTq/U1wcUrc+XPnWJGhXh9NJPhtQ7+r3aC0cU= github.com/openziti/xweb/v2 v2.0.2/go.mod h1:KQOOlnJk08EZT3TWkvDj/pbIUEVbgG0IrrNzl8gsi40= -github.com/openziti/ziti v0.27.2 h1:OPNwVOy2OzucFrThOckWxr7GaD5CTBXsY2dZA23W5a4= -github.com/openziti/ziti v0.27.2/go.mod h1:ZnXzNonbbJPd+mmkeEY6moICdfNrdOs1DD8zdWDNMcc= +github.com/openziti/ziti v0.27.9 h1:GsPqGFpHLLrvx4G+nXs7gKDyeSwl46D4GOLNFBmNI9c= +github.com/openziti/ziti v0.27.9/go.mod h1:tSF7cciowQXna3O++xyUSq2S7hPZwYnH+WUwSr2NNsA= github.com/openziti/ziti-db-explorer v1.1.1 h1:G0eoTby+aIjjt5TxEfR+FMI2CWd4RvZFjzaIMX2lEBw= github.com/openziti/ziti-db-explorer v1.1.1/go.mod h1:h76h7Tsb+khb0v+CqYKL6ifUfJbUMjGBFU2IvupfBE4= -github.com/openziti/zitilab v0.1.21 h1:ZZEq86qMvOAtzcgL1b2CqmZDnGqBH8cZ1nXcHdd3I+E= -github.com/openziti/zitilab v0.1.21/go.mod h1:CwMY50NZENpbVuSZMq+n8OngRVtoVe7qnZB/dEbmvcE= +github.com/openziti/zitilab v0.1.60 h1:uyg/1KXA5+dhg3ibgPqqvxrTRP5YvplTaSHj2w4/3oQ= +github.com/openziti/zitilab v0.1.60/go.mod h1:lNk7ss0dpBnowHdd0LX7S688a+DKFQigX0FVhbcm5LY= github.com/oracle/oci-go-sdk v24.2.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= github.com/orcaman/concurrent-map/v2 v2.0.1 h1:jOJ5Pg2w1oeB6PeDurIYf6k9PQ+aTITr/6lP/L/zp6c= github.com/orcaman/concurrent-map/v2 v2.0.1/go.mod h1:9Eq3TG2oBe5FirmYWQfYO5iH1q0Jv47PLaNK++uCdOM= @@ -658,7 +660,6 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= @@ -709,8 +710,8 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rodaine/table v1.0.1 h1:U/VwCnUxlVYxw8+NJiLIuCxA/xa6jL38MY3FYysVWWQ= github.com/rodaine/table v1.0.1/go.mod h1:UVEtfBsflpeEcD56nF4F5AocNFta0ZuolpSVdPtlmP4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -726,16 +727,21 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/sacloud/libsacloud v1.36.2/go.mod h1:P7YAOVmnIn3DKHqCZcUKYUXmSwGBm3yS7IBEjKVSrjg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil/v3 v3.23.1 h1:a9KKO+kGLKEvcPIs4W62v0nu3sciVDOOOPUD0Hz7z/4= -github.com/shirou/gopsutil/v3 v3.23.1/go.mod h1:NN6mnm5/0k8jw4cBfCnJtr5L7ErOTg18tMNpgFkn0hA= +github.com/shirou/gopsutil/v3 v3.23.3 h1:Syt5vVZXUDXPEXpIBt5ziWsJ4LdSAAxF4l/xZeQgSEE= +github.com/shirou/gopsutil/v3 v3.23.3/go.mod h1:lSBNN6t3+D6W5e5nXTxc8KIMMVxAcS+6IJlffjRRlMU= +github.com/shoenig/go-m1cpu v0.1.4/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ= +github.com/shoenig/go-m1cpu v0.1.5 h1:LF57Z/Fpb/WdGLjt2HZilNnmZOxg/q2bSKTQhgbrLrQ= +github.com/shoenig/go-m1cpu v0.1.5/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ= +github.com/shoenig/test v0.6.3 h1:GVXWJFk9PiOjN0KoJ7VrJGH6uLPnqxR7/fe3HUPfE0c= +github.com/shoenig/test v0.6.3/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= +github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= @@ -751,8 +757,8 @@ github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -778,8 +784,10 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/teris-io/shortid v0.0.0-20201117134242-e59966efd125 h1:3SNcvBmEPE1YlB1JpVZouslJpI3GBNoiqW7+wb0Rz7w= @@ -827,8 +835,8 @@ go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsX go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= -go.mongodb.org/mongo-driver v1.11.1 h1:QP0znIRTuL0jf1oBQoAoM0C6ZJfBK4kx0Uumtv1A7w8= -go.mongodb.org/mongo-driver v1.11.1/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= +go.mongodb.org/mongo-driver v1.11.4 h1:4ayjakA013OdpGyL2K3ZqylTac/rMjrJOMZ1EHizXas= +go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352 h1:CCriYyAfq1Br1aIYettdHZTy8mBTIPo7We18TuO/bak= go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -840,11 +848,11 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/otel v1.11.2 h1:YBZcQlsVekzFsFbjygXMOXSs6pialIZxcjfO/mBDmR0= -go.opentelemetry.io/otel v1.11.2/go.mod h1:7p4EUV+AqgdlNV9gL97IgUZiVR3yrFXYo53f9BM3tRI= +go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM= +go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU= go.opentelemetry.io/otel/sdk v1.11.1 h1:F7KmQgoHljhUuJyA+9BiU+EkJfyX5nVVF4wyzWZpKxs= -go.opentelemetry.io/otel/trace v1.11.2 h1:Xf7hWSF2Glv0DE3MH7fBHvtpSBsjcBUe5MYAmZM/+y0= -go.opentelemetry.io/otel/trace v1.11.2/go.mod h1:4N+yC7QEz7TTsG9BSRLNAa63eg5E06ObSbKPmxQ/pKA= +go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M= +go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -863,15 +871,14 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= -golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -882,14 +889,14 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230202163644-54bba9f4231b h1:EqBVA+nNsObCwQoBEHy4wLU0pi7i8a4AL3pbItPdPkE= -golang.org/x/exp v0.0.0-20230202163644-54bba9f4231b/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= +golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20191206065243-da761ea9ff43/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI= -golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4= +golang.org/x/image v0.7.0 h1:gzS29xtG1J5ybQlv0PuyfE3nmc6R4qB73m6LUUmvFuw= +golang.org/x/image v0.7.0/go.mod h1:nd/q4ef1AKKYl/4kft7g+6UyGbdiqWqTP1ZAbRoV7Rg= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -914,8 +921,8 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -963,13 +970,14 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -995,8 +1003,9 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180606202747-9527bec2660b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180622082034-63fc586f45fe/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1076,14 +1085,18 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1093,8 +1106,10 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1158,10 +1173,9 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1271,8 +1285,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/AlecAivazis/survey.v1 v1.8.7 h1:oBJqtgsyBLg9K5FK9twNUbcPnbCPoh+R9a+7nag3qJM= gopkg.in/AlecAivazis/survey.v1 v1.8.7/go.mod h1:iBNOmqKz/NUbZx3bA+4hAGLRC7fSK7tgtVDT4tB22XA= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= diff --git a/network-tests/simple-transfer/actions/bootstrap.go b/network-tests/ha/actions/bootstrap.go similarity index 82% rename from network-tests/simple-transfer/actions/bootstrap.go rename to network-tests/ha/actions/bootstrap.go index d5936781b..0b853da87 100644 --- a/network-tests/simple-transfer/actions/bootstrap.go +++ b/network-tests/ha/actions/bootstrap.go @@ -23,13 +23,17 @@ func NewBootstrapAction() model.ActionBinder { func (a *bootstrapAction) bind(m *model.Model) model.Action { workflow := actions.Workflow() + workflow.AddAction(component.Stop(".ctrl")) workflow.AddAction(host.GroupExec("*", 25, "rm -f logs/*")) - workflow.AddAction(component.Stop("#ctrl")) - workflow.AddAction(edge.InitController("#ctrl")) - workflow.AddAction(component.Start("#ctrl")) + workflow.AddAction(host.GroupExec(".ctrl", 5, "rf -rf ./fablab/ctrldata")) + workflow.AddAction(component.Start(".ctrl")) workflow.AddAction(semaphore.Sleep(2 * time.Second)) + workflow.AddAction(edge.RaftJoin(".ctrl")) + workflow.AddAction(semaphore.Sleep(2 * time.Second)) + workflow.AddAction(edge.InitRaftController("#ctrl1")) + workflow.AddAction(semaphore.Sleep(time.Second)) - workflow.AddAction(edge.Login("#ctrl")) + workflow.AddAction(edge.Login("#ctrl1")) workflow.AddAction(component.StopInParallel(models.EdgeRouterTag, 25)) workflow.AddAction(edge.InitEdgeRouters(models.EdgeRouterTag, 2)) @@ -45,7 +49,5 @@ func (a *bootstrapAction) bind(m *model.Model) model.Action { workflow.AddAction(zitilib_actions.Edge("create", "service-edge-router-policy", "echo", "--semantic", "AnyOf", "--service-roles", "@echo", "--edge-router-roles", "#all")) - workflow.AddAction(component.Stop(models.ControllerTag)) - return workflow } diff --git a/network-tests/simple-transfer/actions/start.go b/network-tests/ha/actions/start.go similarity index 100% rename from network-tests/simple-transfer/actions/start.go rename to network-tests/ha/actions/start.go diff --git a/network-tests/simple-transfer/configs/consul.hcl b/network-tests/ha/configs/consul.hcl similarity index 100% rename from network-tests/simple-transfer/configs/consul.hcl rename to network-tests/ha/configs/consul.hcl diff --git a/network-tests/ha/configs/ctrl.yml.tmpl b/network-tests/ha/configs/ctrl.yml.tmpl new file mode 100644 index 000000000..b5add84e4 --- /dev/null +++ b/network-tests/ha/configs/ctrl.yml.tmpl @@ -0,0 +1,196 @@ +v: 3 + +raft: + minClusterSize: 3 + dataDir: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/ctrldata + +identity: + cert: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/{{ .Component.PublicIdentity }}/certs/{{ .Component.PublicIdentity }}-server.cert + key: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/{{ .Component.PublicIdentity }}/keys/{{ .Component.PublicIdentity }}-server.key + ca: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/{{ .Component.PublicIdentity }}/certs/{{ .Component.PublicIdentity }}-server.chain.pem + +# the endpoint that routers will connect to the controller over. +ctrl: + listener: tls:0.0.0.0:6262 + options: + advertiseAddress: tls:{{.Host.PublicIp}}:6262 + # (optional) settings + # set the maximum number of connect requests that are buffered and waiting to be acknowledged (1 to 5000, default 1000) + #maxQueuedConnects: 50 + + # the maximum number of connects that have begun hello synchronization (1 to 1000, default 16) + #maxOutstandingConnects: 100 + + # the number of milliseconds to wait before a hello synchronization fails and closes the connection (30ms to 60000ms, default: 1000ms) + #connectTimeoutMs: 3000 + + # Sets the control channel write timeout. A write timeout will close the control channel, so the router will reconnect + #writeTimeout: 15s + + # A listener address which will be sent to connecting routers in order to change their configured controller + # address. If defined, routers will update address configuration to immediately use the new address for future + # connections. The value of newListener must be resolvable both via DNS and validate via certificates + #newListener: tls:localhost:6262 + +#events: +# jsonLogger: +# subscriptions: +# - type: fabric.routers +# - type: fabric.terminators +# - type: metrics +# sourceFilter: .* +# metricFilter: .*egress.*m1_rate* +# - type: fabric.circuits +# include: +# - created +# - type: edge.sessions +# include: +# - created +# - type: edge.apiSessions +# - type: fabric.usage +# - type: services +# - type: fabric.usage +# - type: edge.entityCounts +# interval: 5s +# handler: +# type: file +# format: json +# path: /tmp/ziti-events.log + +healthChecks: + boltCheck: + # How often to try entering a bolt read tx. Defaults to 30 seconds + interval: 30s + # When to timeout the check. Defaults to 15 seconds + timeout: 15s + # How long to wait before starting the check. Defaults to 15 seconds + initialDelay: 15s + +# By having an 'edge' section defined, the ziti-controller will attempt to parse the edge configuration. Removing this +# section, commenting out, or altering the name of the section will cause the edge to not run. +edge: + # This section represents the configuration of the Edge API that is served over HTTPS + api: + #(optional, default 90s) Alters how frequently heartbeat and last activity values are persisted + # activityUpdateInterval: 90s + #(optional, default 250) The number of API Sessions updated for last activity per transaction + # activityUpdateBatchSize: 250 + # sessionTimeout - optional, default 10m + # The number of minutes before an Edge API session will timeout. Timeouts are reset by + # API requests and connections that are maintained to Edge Routers + sessionTimeout: 30m + # address - required + # The default address (host:port) to use for enrollment for the Client API. This value must match one of the addresses + # defined in a bind point's address field for the `edge-client` API in the web section. + address: {{.Host.PublicIp}}:1280 + # enrollment - required + # A section containing settings pertaining to enrollment. + enrollment: + # signingCert - required + # A Ziti Identity configuration section that specifically makes use of the cert and key fields to define + # a signing certificate from the PKI that the Ziti environment is using to sign certificates. The signingCert.cert + # will be added to the /.well-known CA store that is used to bootstrap trust with the Ziti Controller. + signingCert: + cert: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/{{ .Component.PublicIdentity }}/certs/{{ .Component.PublicIdentity }}.cert + key: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/{{ .Component.PublicIdentity }}/keys/{{ .Component.PublicIdentity }}.key + + # edgeIdentity - optional + # A section for identity enrollment specific settings + edgeIdentity: + # duration - optional, default 5m + # The length of time that a Ziti Edge Identity enrollment should remain valid. After + # this duration, the enrollment will expire and not longer be usable. + duration: 5m + # edgeRouter - Optional + # A section for edge router enrollment specific settings. + edgeRouter: + # duration - optional, default 5m + # The length of time that a Ziti Edge Router enrollment should remain valid. After + # this duration, the enrollment will expire and not longer be usable. + duration: 5m + + +# web - optional +# Defines webListeners that will be hosted by the controller. Each webListener can host many APIs and be bound to many +# bind points. +web: + # name - required + # Provides a name for this listener, used for logging output. Not required to be unique, but is highly suggested. + - name: all-apis-localhost + # bindPoints - required + # One or more bind points are required. A bind point specifies an interface (interface:port string) that defines + # where on the host machine the webListener will listen and the address (host:port) that should be used to + # publicly address the webListener(i.e. mydomain.com, localhost, 127.0.0.1). This public address may be used for + # incoming address resolution as well as used in responses in the API. + bindPoints: + #interface - required + # A host:port string on which network interface to listen on. 0.0.0.0 will listen on all interfaces + - interface: 0.0.0.0:1280 + + # address - required + # The public address that external incoming requests will be able to resolve. Used in request processing and + # response content that requires full host:port/path addresses. + address: {{.Host.PublicIp}}:1280 + + # newAddress - optional + # A host:port string which will be sent out as an HTTP header "ziti-new-address" if specified. If the header + # is present, clients should update location configuration to immediately use the new address for future + # connections. The value of newAddress must be resolvable both via DNS and validate via certificates + #newAddress: localhost:1280 + # identity - optional + # Allows the webListener to have a specific identity instead of defaulting to the root `identity` section. + # identity: + # cert: ${ZITI_SOURCE}/ziti/etc/ca/intermediate/certs/ctrl-client.cert.pem + # server_cert: ${ZITI_SOURCE}/ziti/etc/ca/intermediate/certs/ctrl-server.cert.pem + # key: ${ZITI_SOURCE}/ziti/etc/ca/intermediate/private/ctrl.key.pem + # ca: ${ZITI_SOURCE}/ziti/etc/ca/intermediate/certs/ca-chain.cert.pem + # options - optional + # Allows the specification of webListener level options - mainly dealing with HTTP/TLS settings. These options are + # used for all http servers started by the current webListener. + options: + # idleTimeout - optional, default 5000ms + # The maximum amount of idle time in milliseconds allowed for pipelined HTTP requests. Setting this too high + # can cause resources on the host to be consumed as clients remain connected and idle. Lowering this value + # will cause clients to reconnect on subsequent HTTPs requests. + idleTimeout: 5000ms #http timeouts, new + + # readTimeout - optional, default 5000ms + # The maximum amount of time in milliseconds http servers will wait to read the first incoming requests. A higher + # value risks consuming resources on the host with clients that are acting bad faith or suffering from high latency + # or packet loss. A lower value can risk losing connections to high latency/packet loss clients. + + readTimeout: 5000ms + # writeTimeout - optional, default 10000ms + # The total maximum time in milliseconds that the http server will wait for a single requests to be received and + # responded too. A higher value can allow long running requests to consume resources on the host. A lower value + # can risk ending requests before the server has a chance to respond. + + writeTimeout: 100000ms + # minTLSVersion - optional, default TSL1.2 + # The minimum version of TSL to support + + minTLSVersion: TLS1.2 + # maxTLSVersion - optional, default TSL1.3 + # The maximum version of TSL to support + + maxTLSVersion: TLS1.3 + # apis - required + # Allows one or more APIs to be bound to this webListener + apis: + # binding - required + # Specifies an API to bind to this webListener. Built-in APIs are + # - health-checks + # - edge-management + # - edge-client + # - fabric-management + - binding: health-checks + options: {} + - binding: fabric + - binding: edge-management + # options - variable optional/required + # This section is used to define values that are specified by the API they are associated with. + # These settings are per API. The example below is for the `edge-api` and contains both optional values and + # required values. + options: {} + - binding: edge-client + options: {} diff --git a/network-tests/simple-transfer/configs/metricbeat.yml b/network-tests/ha/configs/metricbeat.yml similarity index 100% rename from network-tests/simple-transfer/configs/metricbeat.yml rename to network-tests/ha/configs/metricbeat.yml diff --git a/network-tests/ha/configs/router.yml.tmpl b/network-tests/ha/configs/router.yml.tmpl new file mode 100644 index 000000000..4cb9afca5 --- /dev/null +++ b/network-tests/ha/configs/router.yml.tmpl @@ -0,0 +1,70 @@ +{{$ssh_username := .Model.MustVariable "credentials.ssh.username"}} +{{$identity := .Component.PublicIdentity}} +{{$router_ip := .Host.PublicIp}} + +v: 3 + +enableDebugOps: true + +identity: + cert: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}-client.cert + server_cert: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}-server.cert + key: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}.key + ca: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}-server.chain.pem + +ctrl: + endpoints: {{ range $host := .Model.MustSelectHosts "component.ctrl" 1 }} + - tls:{{ $host.PublicIp }}:6262{{end}} + +healthChecks: + ctrlPingCheck: + # How often to ping the controller over the control channel. Defaults to 30 seconds + interval: 30s + # When to timeout the ping. Defaults to 15 seconds + timeout: 15s + # How long to wait before pinging the controller. Defaults to 15 seconds + initialDelay: 15s + +metrics: + reportInterval: 15s + messageQueueSize: 10 + +link: + listeners: + - binding: transport + bind: tls:0.0.0.0:6000 + advertise: tls:{{$router_ip}}:6000 + dialers: + - binding: transport + +listeners: +{{if .Component.HasTag "tunneler"}} + - binding: tunnel + options: + mode: tproxy +{{end}} + - binding: edge + address: tls:0.0.0.0:6262 + options: + # (required) The public hostname and port combination that Ziti SDKs should connect on. Previously this was in the chanIngress section. + advertise: {{ .Host.PublicIp }}:6262 + +# By having an 'edge' section defined, the ziti-router will attempt to parse the edge configuration. Removing this +# section, commenting out, or altering the name of the section will cause the router to no longer operate as an Edge +# Router. +edge: + # (required) Information used to generate the initial registration CSR. For documentation on these fields please + # refer to the openssl documentation. These values MUST be supplied and have no defaults. + csr: + country: US + province: NC + locality: Charlotte + organization: NetFoundry + organizationalUnit: Ziti + + # (required) SANs that this Gateways certs should contain. At least one IP or DNS SAN should be defined that matches + # the edge listeners "advertise" value from the "listeners" section. + sans: + ip: + - {{ .Host.PublicIp }} + diff --git a/network-tests/simple-transfer/configs/ziti.hcl b/network-tests/ha/configs/ziti.hcl similarity index 100% rename from network-tests/simple-transfer/configs/ziti.hcl rename to network-tests/ha/configs/ziti.hcl diff --git a/network-tests/ha/main.go b/network-tests/ha/main.go new file mode 100644 index 000000000..3b78e4c8a --- /dev/null +++ b/network-tests/ha/main.go @@ -0,0 +1,298 @@ +/* + (c) Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package main + +import ( + "embed" + "fmt" + "github.com/openziti/fablab" + "github.com/openziti/fablab/kernel/lib/actions/component" + "github.com/openziti/fablab/kernel/lib/binding" + "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/aws_ssh_key" + semaphore0 "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/semaphore" + terraform_0 "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/terraform" + "github.com/openziti/fablab/kernel/lib/runlevel/1_configuration/config" + "github.com/openziti/fablab/kernel/lib/runlevel/2_kitting/devkit" + distribution "github.com/openziti/fablab/kernel/lib/runlevel/3_distribution" + "github.com/openziti/fablab/kernel/lib/runlevel/3_distribution/rsync" + aws_ssh_key2 "github.com/openziti/fablab/kernel/lib/runlevel/6_disposal/aws_ssh_key" + "github.com/openziti/fablab/kernel/lib/runlevel/6_disposal/terraform" + "github.com/openziti/fablab/kernel/model" + "github.com/openziti/fablab/resources" + "github.com/openziti/ziti/network-tests/ha/actions" + "github.com/openziti/ziti/network-tests/test_resources" + "github.com/openziti/zitilab" + "github.com/openziti/zitilab/actions/edge" + zitilib_runlevel_1_configuration "github.com/openziti/zitilab/runlevel/1_configuration" + "github.com/sirupsen/logrus" + "os" + "time" +) + +//go:embed configs +var configResource embed.FS + +func getConfigData(filePath string) []byte { + data, err := configResource.ReadFile(fmt.Sprintf("configs/%s", filePath)) + if err != nil { + logrus.Errorf("Unable to read config data from %s: [%s]", filePath, err) + } + return data +} + +var m = &model.Model{ + Id: "ha", + Scope: model.Scope{ + Defaults: model.Variables{ + "environment": "ha-smoketest", + "credentials": model.Variables{ + "ssh": model.Variables{ + "username": "ubuntu", + }, + "edge": model.Variables{ + "username": "admin", + "password": "admin", + }, + }, + }, + }, + + Resources: model.Resources{ + resources.Configs: resources.SubFolder(configResource, "configs"), + resources.Terraform: test_resources.TerraformResources(), + }, + + Regions: model.Regions{ + "us-east-1": { + Region: "us-east-1", + Site: "us-east-1a", + Hosts: model.Hosts{ + "ctrl1": { + InstanceType: "t3.micro", + Components: model.Components{ + "ctrl1": { + Scope: model.Scope{Tags: model.Tags{"ctrl", "spiffe:controller"}}, + BinaryName: "ziti controller", + ConfigSrc: "ctrl.yml.tmpl", + ConfigName: "ctrl1.yml", + PublicIdentity: "ctrl1", + }, + "consul": { + BinaryName: "consul", + }, + }, + }, + "ctrl2": { + InstanceType: "t3.micro", + Components: model.Components{ + "ctrl2": { + Scope: model.Scope{Tags: model.Tags{"ctrl", "spiffe:controller"}}, + BinaryName: "ziti controller", + ConfigSrc: "ctrl.yml.tmpl", + ConfigName: "ctrl2.yml", + PublicIdentity: "ctrl2", + }, + "consul": { + BinaryName: "consul", + }, + }, + }, + + "router-east": { + InstanceType: "t2.micro", + Components: model.Components{ + "router-east": { + Scope: model.Scope{Tags: model.Tags{"edge-router", "terminator"}}, + BinaryName: "ziti router", + ConfigSrc: "router.yml.tmpl", + ConfigName: "router-east.yml", + PublicIdentity: "router-east", + }, + "echo-server": { + Scope: model.Scope{Tags: model.Tags{"sdk-app", "service"}}, + BinaryName: "echo-server", + PublicIdentity: "echo-server", + }, + "consul": { + BinaryName: "consul", + }, + }, + }, + }, + }, + "us-west-2": { + Region: "us-west-2", + Site: "us-west-2b", + Hosts: model.Hosts{ + "ctrl3": { + InstanceType: "t3.micro", + Components: model.Components{ + "ctrl3": { + Scope: model.Scope{Tags: model.Tags{"ctrl", "spiffe:controller"}}, + BinaryName: "ziti controller", + ConfigSrc: "ctrl.yml.tmpl", + ConfigName: "ctrl3.yml", + PublicIdentity: "ctrl3", + }, + "consul": { + BinaryName: "consul", + }, + }, + }, + + "router-west": { + Scope: model.Scope{Tags: model.Tags{}}, + InstanceType: "t2.micro", + Components: model.Components{ + "router-west": { + Scope: model.Scope{Tags: model.Tags{"edge-router", "terminator"}}, + BinaryName: "ziti router", + ConfigSrc: "router.yml.tmpl", + ConfigName: "router-west.yml", + PublicIdentity: "router-west", + }, + "echo-client": { + Scope: model.Scope{Tags: model.Tags{"sdk-app", "client"}}, + BinaryName: "echo-client", + PublicIdentity: "echo-client", + }, + "consul": { + BinaryName: "consul", + }, + }, + }, + }, + }, + }, + + Actions: model.ActionBinders{ + "bootstrap": actions.NewBootstrapAction(), + "start": actions.NewStartAction(actions.MetricbeatConfig{ + ConfigPath: "metricbeat", + DataPath: "metricbeat/data", + LogPath: "metricbeat/logs", + }, + actions.ConsulConfig{ + ServerAddr: os.Getenv("CONSUL_ENDPOINT"), + ConfigDir: "consul", + DataPath: "consul/data", + LogPath: "consul/log.out", + }), + "stop": model.Bind(component.StopInParallel("*", 15)), + "login": model.Bind(edge.Login("#ctrl1")), + }, + + Infrastructure: model.InfrastructureStages{ + aws_ssh_key.Express(), + terraform_0.Express(), + semaphore0.Ready(time.Minute), + }, + + Configuration: model.ConfigurationStages{ + zitilib_runlevel_1_configuration.IfPkiNeedsRefresh( + zitilib_runlevel_1_configuration.Fabric("simple-transfer.test", ".ctrl"), + ), + config.Component(), + devkit.DevKitF(zitilab.ZitiRoot, []string{"ziti", "ziti-echo"}), + }, + + Distribution: model.DistributionStages{ + distribution.DistributeSshKey("*"), + distribution.Locations("*", "logs"), + distribution.DistributeDataWithReplaceCallbacks( + "*", + string(getConfigData("metricbeat.yml")), + "metricbeat/metricbeat.yml", + os.FileMode(0644), + map[string]func(*model.Host) string{ + "${host}": func(h *model.Host) string { + return os.Getenv("ELASTIC_ENDPOINT") + }, + "${user}": func(h *model.Host) string { + return os.Getenv("ELASTIC_USERNAME") + }, + "${password}": func(h *model.Host) string { + return os.Getenv("ELASTIC_PASSWORD") + }, + "${build_number}": func(h *model.Host) string { + return os.Getenv("BUILD_NUMBER") + }, + "${ziti_version}": func(h *model.Host) string { + return h.MustStringVariable("ziti_version") + }, + }, + ), + + distribution.DistributeDataWithReplaceCallbacks( + "*", + string(getConfigData("consul.hcl")), + "consul/consul.hcl", + os.FileMode(0644), + map[string]func(*model.Host) string{ + "${public_ip}": func(h *model.Host) string { + return h.PublicIp + }, + "${encryption_key}": func(h *model.Host) string { + return os.Getenv("CONSUL_ENCRYPTION_KEY") + }, + "${build_number}": func(h *model.Host) string { + return os.Getenv("BUILD_NUMBER") + }, + "${ziti_version}": func(h *model.Host) string { + return h.MustStringVariable("ziti_version") + }, + }, + ), + distribution.DistributeDataWithReplaceCallbacks( + "#ctrl", + string(getConfigData("ziti.hcl")), + "consul/ziti.hcl", + os.FileMode(0644), + map[string]func(*model.Host) string{ + "${build_number}": func(h *model.Host) string { + return os.Getenv("BUILD_NUMBER") + }, + "${ziti_version}": func(h *model.Host) string { + return h.MustStringVariable("ziti_version") + }, + }), + distribution.DistributeData( + "*", + []byte(os.Getenv("CONSUL_AGENT_CERT")), + "consul/consul-agent-ca.pem"), + rsync.RsyncStaged(), + }, + + Disposal: model.DisposalStages{ + terraform.Dispose(), + aws_ssh_key2.Dispose(), + }, +} + +func main() { + m.AddActivationActions("stop", "bootstrap", "start") + + model.AddBootstrapExtension( + zitilab.BootstrapWithFallbacks( + &zitilab.BootstrapFromEnv{}, + )) + model.AddBootstrapExtension(binding.AwsCredentialsLoader) + model.AddBootstrapExtension(aws_ssh_key.KeyManager) + + fablab.InitModel(m) + fablab.Run() +} diff --git a/network-tests/router-test/configs/ctrl.yml b/network-tests/router-test/configs/ctrl.yml new file mode 100644 index 000000000..093df1c1f --- /dev/null +++ b/network-tests/router-test/configs/ctrl.yml @@ -0,0 +1,194 @@ +v: 3 + +db: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/ctrl.db + +identity: + cert: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/ctrl/certs/{{ .Component.PublicIdentity }}-server.cert + key: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/ctrl/keys/{{ .Component.PublicIdentity }}-server.key + ca: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/ctrl/certs/{{ .Component.PublicIdentity }}-server.chain.pem + +# the endpoint that routers will connect to the controller over. +ctrl: + listener: tls:0.0.0.0:6262 + options: + advertiseAddress: tls:{{.Host.PublicIp}}:6262 + # (optional) settings + # set the maximum number of connect requests that are buffered and waiting to be acknowledged (1 to 5000, default 1000) + #maxQueuedConnects: 50 + + # the maximum number of connects that have begun hello synchronization (1 to 1000, default 16) + #maxOutstandingConnects: 100 + + # the number of milliseconds to wait before a hello synchronization fails and closes the connection (30ms to 60000ms, default: 1000ms) + #connectTimeoutMs: 3000 + + # Sets the control channel write timeout. A write timeout will close the control channel, so the router will reconnect + #writeTimeout: 15s + + # A listener address which will be sent to connecting routers in order to change their configured controller + # address. If defined, routers will update address configuration to immediately use the new address for future + # connections. The value of newListener must be resolvable both via DNS and validate via certificates + #newListener: tls:localhost:6262 + +#events: +# jsonLogger: +# subscriptions: +# - type: fabric.routers +# - type: fabric.terminators +# - type: metrics +# sourceFilter: .* +# metricFilter: .*egress.*m1_rate* +# - type: fabric.circuits +# include: +# - created +# - type: edge.sessions +# include: +# - created +# - type: edge.apiSessions +# - type: fabric.usage +# - type: services +# - type: fabric.usage +# - type: edge.entityCounts +# interval: 5s +# handler: +# type: file +# format: json +# path: /tmp/ziti-events.log + +healthChecks: + boltCheck: + # How often to try entering a bolt read tx. Defaults to 30 seconds + interval: 30s + # When to timeout the check. Defaults to 15 seconds + timeout: 15s + # How long to wait before starting the check. Defaults to 15 seconds + initialDelay: 15s + +# By having an 'edge' section defined, the ziti-controller will attempt to parse the edge configuration. Removing this +# section, commenting out, or altering the name of the section will cause the edge to not run. +edge: + # This section represents the configuration of the Edge API that is served over HTTPS + api: + #(optional, default 90s) Alters how frequently heartbeat and last activity values are persisted + # activityUpdateInterval: 90s + #(optional, default 250) The number of API Sessions updated for last activity per transaction + # activityUpdateBatchSize: 250 + # sessionTimeout - optional, default 10m + # The number of minutes before an Edge API session will timeout. Timeouts are reset by + # API requests and connections that are maintained to Edge Routers + sessionTimeout: 30m + # address - required + # The default address (host:port) to use for enrollment for the Client API. This value must match one of the addresses + # defined in a bind point's address field for the `edge-client` API in the web section. + address: {{.Host.PublicIp}}:1280 + # enrollment - required + # A section containing settings pertaining to enrollment. + enrollment: + # signingCert - required + # A Ziti Identity configuration section that specifically makes use of the cert and key fields to define + # a signing certificate from the PKI that the Ziti environment is using to sign certificates. The signingCert.cert + # will be added to the /.well-known CA store that is used to bootstrap trust with the Ziti Controller. + signingCert: + cert: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/ctrl/certs/ctrl.cert + key: /home/{{ .Model.MustVariable "credentials.ssh.username" }}/fablab/pki/ctrl/keys/ctrl.key + + # edgeIdentity - optional + # A section for identity enrollment specific settings + edgeIdentity: + # duration - optional, default 5m + # The length of time that a Ziti Edge Identity enrollment should remain valid. After + # this duration, the enrollment will expire and not longer be usable. + duration: 5m + # edgeRouter - Optional + # A section for edge router enrollment specific settings. + edgeRouter: + # duration - optional, default 5m + # The length of time that a Ziti Edge Router enrollment should remain valid. After + # this duration, the enrollment will expire and not longer be usable. + duration: 5m + + +# web - optional +# Defines webListeners that will be hosted by the controller. Each webListener can host many APIs and be bound to many +# bind points. +web: + # name - required + # Provides a name for this listener, used for logging output. Not required to be unique, but is highly suggested. + - name: all-apis-localhost + # bindPoints - required + # One or more bind points are required. A bind point specifies an interface (interface:port string) that defines + # where on the host machine the webListener will listen and the address (host:port) that should be used to + # publicly address the webListener(i.e. mydomain.com, localhost, 127.0.0.1). This public address may be used for + # incoming address resolution as well as used in responses in the API. + bindPoints: + #interface - required + # A host:port string on which network interface to listen on. 0.0.0.0 will listen on all interfaces + - interface: 0.0.0.0:1280 + + # address - required + # The public address that external incoming requests will be able to resolve. Used in request processing and + # response content that requires full host:port/path addresses. + address: {{.Host.PublicIp}}:1280 + + # newAddress - optional + # A host:port string which will be sent out as an HTTP header "ziti-new-address" if specified. If the header + # is present, clients should update location configuration to immediately use the new address for future + # connections. The value of newAddress must be resolvable both via DNS and validate via certificates + #newAddress: localhost:1280 + # identity - optional + # Allows the webListener to have a specific identity instead of defaulting to the root `identity` section. + # identity: + # cert: ${ZITI_SOURCE}/ziti/etc/ca/intermediate/certs/ctrl-client.cert.pem + # server_cert: ${ZITI_SOURCE}/ziti/etc/ca/intermediate/certs/ctrl-server.cert.pem + # key: ${ZITI_SOURCE}/ziti/etc/ca/intermediate/private/ctrl.key.pem + # ca: ${ZITI_SOURCE}/ziti/etc/ca/intermediate/certs/ca-chain.cert.pem + # options - optional + # Allows the specification of webListener level options - mainly dealing with HTTP/TLS settings. These options are + # used for all http servers started by the current webListener. + options: + # idleTimeout - optional, default 5000ms + # The maximum amount of idle time in milliseconds allowed for pipelined HTTP requests. Setting this too high + # can cause resources on the host to be consumed as clients remain connected and idle. Lowering this value + # will cause clients to reconnect on subsequent HTTPs requests. + idleTimeout: 5000ms #http timeouts, new + + # readTimeout - optional, default 5000ms + # The maximum amount of time in milliseconds http servers will wait to read the first incoming requests. A higher + # value risks consuming resources on the host with clients that are acting bad faith or suffering from high latency + # or packet loss. A lower value can risk losing connections to high latency/packet loss clients. + + readTimeout: 5000ms + # writeTimeout - optional, default 10000ms + # The total maximum time in milliseconds that the http server will wait for a single requests to be received and + # responded too. A higher value can allow long running requests to consume resources on the host. A lower value + # can risk ending requests before the server has a chance to respond. + + writeTimeout: 100000ms + # minTLSVersion - optional, default TSL1.2 + # The minimum version of TSL to support + + minTLSVersion: TLS1.2 + # maxTLSVersion - optional, default TSL1.3 + # The maximum version of TSL to support + + maxTLSVersion: TLS1.3 + # apis - required + # Allows one or more APIs to be bound to this webListener + apis: + # binding - required + # Specifies an API to bind to this webListener. Built-in APIs are + # - health-checks + # - edge-management + # - edge-client + # - fabric-management + - binding: health-checks + options: {} + - binding: fabric + - binding: edge-management + # options - variable optional/required + # This section is used to define values that are specified by the API they are associated with. + # These settings are per API. The example below is for the `edge-api` and contains both optional values and + # required values. + options: {} + - binding: edge-client + options: {} diff --git a/network-tests/router-test/configs/router.yml b/network-tests/router-test/configs/router.yml new file mode 100644 index 000000000..a2a203737 --- /dev/null +++ b/network-tests/router-test/configs/router.yml @@ -0,0 +1,70 @@ + {{$ssh_username := .Model.MustVariable "credentials.ssh.username"}} + {{$identity := .Component.PublicIdentity}} + {{$ctrl_ip := publicIp "component#ctrl"}} + {{$router_ip := .Host.PublicIp}} + + v: 3 + + enableDebugOps: true + + identity: + cert: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}-client.cert + server_cert: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}-server.cert + key: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}.key + ca: /home/{{$ssh_username}}/fablab/cfg/{{$identity}}-server.chain.pem + + ctrl: + endpoint: tls:{{$ctrl_ip}}:6262 + + healthChecks: + ctrlPingCheck: + # How often to ping the controller over the control channel. Defaults to 30 seconds + interval: 30s + # When to timeout the ping. Defaults to 15 seconds + timeout: 15s + # How long to wait before pinging the controller. Defaults to 15 seconds + initialDelay: 15s + + metrics: + reportInterval: 15s + messageQueueSize: 10 + + link: + listeners: + - binding: transport + bind: tls:0.0.0.0:6000 + advertise: tls:{{$router_ip}}:6000 + dialers: + - binding: transport + + listeners: + {{if .Component.HasTag "tunneler"}} + - binding: tunnel + options: + mode: tproxy + {{end}} + - binding: edge + address: tls:0.0.0.0:6262 + options: + # (required) The public hostname and port combination that Ziti SDKs should connect on. Previously this was in the chanIngress section. + advertise: {{.Host.PublicIp}}:6262 + + # By having an 'edge' section defined, the ziti-router will attempt to parse the edge configuration. Removing this + # section, commenting out, or altering the name of the section will cause the router to no longer operate as an Edge + # Router. + edge: + # (required) Information used to generate the initial registration CSR. For documentation on these fields please + # refer to the openssl documentation. These values MUST be supplied and have no defaults. + csr: + country: US + province: NC + locality: Charlotte + organization: NetFoundry + organizationalUnit: Ziti + + # (required) SANs that this Gateways certs should contain. At least one IP or DNS SAN should be defined that matches + # the edge listeners "advertise" value from the "listeners" section. + sans: + ip: + - {{.Host.PublicIp}} + diff --git a/network-tests/router-test/main.go b/network-tests/router-test/main.go new file mode 100644 index 000000000..1e73bd7bb --- /dev/null +++ b/network-tests/router-test/main.go @@ -0,0 +1,197 @@ +package main + +import ( + "embed" + _ "embed" + "github.com/michaelquigley/pfxlog" + "github.com/openziti/edge/controller/persistence" + "github.com/openziti/fablab" + "github.com/openziti/fablab/kernel/lib/actions" + "github.com/openziti/fablab/kernel/lib/actions/component" + "github.com/openziti/fablab/kernel/lib/actions/host" + "github.com/openziti/fablab/kernel/lib/actions/semaphore" + "github.com/openziti/fablab/kernel/lib/binding" + "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/aws_ssh_key" + "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/semaphore" + "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/terraform" + "github.com/openziti/fablab/kernel/lib/runlevel/1_configuration/config" + "github.com/openziti/fablab/kernel/lib/runlevel/2_kitting/devkit" + distribution "github.com/openziti/fablab/kernel/lib/runlevel/3_distribution" + "github.com/openziti/fablab/kernel/lib/runlevel/3_distribution/rsync" + aws_ssh_key2 "github.com/openziti/fablab/kernel/lib/runlevel/6_disposal/aws_ssh_key" + "github.com/openziti/fablab/kernel/lib/runlevel/6_disposal/terraform" + "github.com/openziti/fablab/kernel/model" + "github.com/openziti/fablab/resources" + "github.com/openziti/ziti/network-tests/test_resources" + "github.com/openziti/zitilab" + "github.com/openziti/zitilab/actions/edge" + "github.com/openziti/zitilab/models" + zitilib_runlevel_1_configuration "github.com/openziti/zitilab/runlevel/1_configuration" + "os" + "path" + "strings" + "time" +) + +func getDbFile() string { + dbFile := os.Getenv("ZITI_DB") + if dbFile == "" { + pfxlog.Logger().Fatal("required env var ZITI_DB not set") + } + return dbFile +} + +//go:embed configs +var configResource embed.FS + +type scaleStrategy struct{} + +func (self scaleStrategy) IsScaled(entity model.Entity) bool { + return entity.GetType() == model.EntityTypeHost && entity.GetScope().HasTag("scaled") +} + +func (self scaleStrategy) GetEntityCount(entity model.Entity) uint32 { + if entity.GetType() == model.EntityTypeHost && entity.GetScope().HasTag("scaled") { + return 4 + } + return 1 +} + +type dbStrategy struct{} + +func (d dbStrategy) GetDbFile() string { + return getDbFile() +} + +func (d dbStrategy) GetSite(router *persistence.EdgeRouter) (string, bool) { + for _, attr := range router.RoleAttributes { + if strings.Contains(attr, "Hosted") { + return "us-west-2b", true + } + } + return "us-west-1c", true +} + +func (d dbStrategy) PostProcess(router *persistence.EdgeRouter, c *model.Component) { + c.PublicIdentity = router.Id + if router.IsTunnelerEnabled { + c.Scope.Tags = append(c.Scope.Tags, "tunneler") + c.RunWithSudo = true + } + c.Scope.Tags = append(c.Scope.Tags, "edge-router") + c.Scope.Tags = append(c.Scope.Tags, "pre-created") + c.Host.InstanceType = "c5.large" +} + +var m = &model.Model{ + Id: "router-test", + Scope: model.Scope{ + Defaults: model.Variables{ + "environment": "router-test", + "credentials": model.Variables{ + "ssh": model.Variables{ + "username": "ubuntu", + }, + "edge": model.Variables{ + "username": "admin", + "password": "admin", + }, + }, + "metrics": model.Variables{ + "influxdb": model.Variables{ + "url": "http://localhost:8086", + "db": "ziti", + }, + }, + }, + }, + StructureFactories: []model.Factory{ + model.NewScaleFactoryWithDefaultEntityFactory(scaleStrategy{}), + &models.ZitiDbBuilder{Strategy: dbStrategy{}}, + }, + Resources: model.Resources{ + resources.Configs: resources.SubFolder(configResource, "configs"), + resources.Binaries: os.DirFS(path.Join(os.Getenv("GOPATH"), "bin")), + resources.Terraform: test_resources.TerraformResources(), + }, + Regions: model.Regions{ + "us-east-1": { + Region: "us-east-1", + Site: "us-east-1a", + Hosts: model.Hosts{ + "ctrl": { + InstanceType: "c5.large", + Components: model.Components{ + "ctrl": { + Scope: model.Scope{Tags: model.Tags{"ctrl"}}, + BinaryName: "ziti controller", + ConfigSrc: "ctrl.yml", + ConfigName: "ctrl.yml", + PublicIdentity: "ctrl", + }, + }, + }, + }, + }, + }, + + Actions: model.ActionBinders{ + "bootstrap": model.ActionBinder(func(m *model.Model) model.Action { + workflow := actions.Workflow() + + workflow.AddAction(component.Stop("*")) + workflow.AddAction(host.GroupExec("*", 25, "rm -f logs/*")) + + workflow.AddAction(component.Start("#ctrl")) + workflow.AddAction(semaphore.Sleep(2 * time.Second)) + + workflow.AddAction(edge.Login("#ctrl")) + + workflow.AddAction(edge.ReEnrollEdgeRouters(".pre-created", 2)) + return workflow + }), + "stop": model.Bind(component.StopInParallel("*", 15)), + "clean": model.Bind(actions.Workflow( + component.StopInParallel("*", 15), + host.GroupExec("*", 25, "rm -f logs/*"), + )), + "login": model.Bind(edge.Login("#ctrl")), + }, + + Infrastructure: model.InfrastructureStages{ + aws_ssh_key.Express(), + terraform_0.Express(), + semaphore_0.Ready(90 * time.Second), + }, + + Configuration: model.ConfigurationStages{ + zitilib_runlevel_1_configuration.IfPkiNeedsRefresh( + zitilib_runlevel_1_configuration.Fabric("router.test", ".ctrl"), + ), + config.Component(), + devkit.DevKitF(zitilab.ZitiRoot, []string{"ziti"}), + }, + + Distribution: model.DistributionStages{ + distribution.DistributeSshKey("*"), + distribution.Locations("*", "logs"), + rsync.RsyncStaged(), + rsync.NewRsyncHost("#ctrl", getDbFile(), "/home/ubuntu/fablab/ctrl.db"), + }, + + Disposal: model.DisposalStages{ + terraform.Dispose(), + aws_ssh_key2.Dispose(), + }, +} + +func main() { + m.AddActivationActions("stop", "bootstrap") + + model.AddBootstrapExtension(&zitilab.BootstrapFromEnv{}) + model.AddBootstrapExtension(binding.AwsCredentialsLoader) + model.AddBootstrapExtension(aws_ssh_key.KeyManager) + + fablab.InitModel(m) + fablab.Run() +} diff --git a/network-tests/simple-transfer/main.go b/network-tests/simple-transfer/main.go index 416cde24a..5c17bd8cc 100644 --- a/network-tests/simple-transfer/main.go +++ b/network-tests/simple-transfer/main.go @@ -1,271 +1,28 @@ -package main - -import ( - "embed" - "fmt" - "github.com/openziti/fablab" - "github.com/openziti/fablab/kernel/lib/actions/component" - "github.com/openziti/fablab/kernel/lib/binding" - "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/aws_ssh_key" - semaphore0 "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/semaphore" - terraform_0 "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/terraform" - "github.com/openziti/fablab/kernel/lib/runlevel/1_configuration/config" - "github.com/openziti/fablab/kernel/lib/runlevel/2_kitting/devkit" - distribution "github.com/openziti/fablab/kernel/lib/runlevel/3_distribution" - "github.com/openziti/fablab/kernel/lib/runlevel/3_distribution/rsync" - aws_ssh_key2 "github.com/openziti/fablab/kernel/lib/runlevel/6_disposal/aws_ssh_key" - "github.com/openziti/fablab/kernel/lib/runlevel/6_disposal/terraform" - "github.com/openziti/fablab/kernel/model" - "github.com/openziti/fablab/resources" - "github.com/openziti/ziti/network-tests/simple-transfer/actions" - "github.com/openziti/ziti/network-tests/test_resources" - "github.com/openziti/zitilab" - "github.com/openziti/zitilab/actions/edge" - zitilib_runlevel_1_configuration "github.com/openziti/zitilab/runlevel/1_configuration" - "github.com/sirupsen/logrus" - "os" - "time" -) - -//go:embed configs -var configResource embed.FS - -type scaleStrategy struct{} - -func (s scaleStrategy) IsScaled(entity model.Entity) bool { - return entity.GetType() == model.EntityTypeHost && entity.GetScope().HasTag("scaled") -} - -func (s scaleStrategy) GetEntityCount(entity model.Entity) uint32 { - if entity.GetType() == model.EntityTypeHost && entity.GetScope().HasTag("scaled") { - return 4 - } - return 1 -} - -func getConfigData(filePath string) []byte { - data, err := configResource.ReadFile(fmt.Sprintf("configs/%s", filePath)) - if err != nil { - logrus.Errorf("Unable to read config data from %s: [%s]", filePath, err) - } - return data -} +/* + (c) Copyright NetFoundry Inc. -var m = &model.Model{ - Id: "simple-transfer", - Scope: model.Scope{ - Defaults: model.Variables{ - "environment": "simple-transfer-smoketest", - "credentials": model.Variables{ - "ssh": model.Variables{ - "username": "ubuntu", - }, - "edge": model.Variables{ - "username": "admin", - "password": "admin", - }, - }, - }, - }, + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at - StructureFactories: []model.Factory{ - model.NewScaleFactoryWithDefaultEntityFactory(scaleStrategy{}), - }, + https://www.apache.org/licenses/LICENSE-2.0 - Factories: []model.Factory{ - newStageFactory(), - }, + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ - Resources: model.Resources{ - resources.Configs: resources.SubFolder(configResource, "configs"), - resources.Terraform: test_resources.TerraformResources(), - }, - - Regions: model.Regions{ - "us-east-1": { - Region: "us-east-1", - Site: "us-east-1a", - Hosts: model.Hosts{ - "ctrl": { - InstanceType: "t2.micro", - Components: model.Components{ - "ctrl": { - Scope: model.Scope{Tags: model.Tags{"ctrl"}}, - BinaryName: "ziti controller", - ConfigSrc: "ctrl.yml", - ConfigName: "ctrl.yml", - PublicIdentity: "ctrl", - }, - "consul": { - BinaryName: "consul", - }, - }, - }, - "router-east": { - InstanceType: "t2.micro", - Components: model.Components{ - "router-east": { - Scope: model.Scope{Tags: model.Tags{"edge-router", "terminator"}}, - BinaryName: "ziti router", - ConfigSrc: "router.yml", - ConfigName: "router-east.yml", - PublicIdentity: "router-east", - }, - "echo-server": { - Scope: model.Scope{Tags: model.Tags{"sdk-app", "service"}}, - BinaryName: "echo-server", - PublicIdentity: "echo-server", - }, - "consul": { - BinaryName: "consul", - }, - }, - }, - }, - }, - "us-west-2": { - Region: "us-west-2", - Site: "us-west-2b", - Hosts: model.Hosts{ - "router-west": { - Scope: model.Scope{Tags: model.Tags{}}, - InstanceType: "t2.micro", - Components: model.Components{ - "router-west": { - Scope: model.Scope{Tags: model.Tags{"edge-router", "terminator"}}, - BinaryName: "ziti router", - ConfigSrc: "router.yml", - ConfigName: "router-west.yml", - PublicIdentity: "router-west", - }, - "echo-client": { - Scope: model.Scope{Tags: model.Tags{"sdk-app", "client"}}, - BinaryName: "echo-client", - PublicIdentity: "echo-client", - }, - "consul": { - BinaryName: "consul", - }, - }, - }, - }, - }, - }, - - Actions: model.ActionBinders{ - "bootstrap": actions.NewBootstrapAction(), - "start": actions.NewStartAction(actions.MetricbeatConfig{ - ConfigPath: "metricbeat", - DataPath: "metricbeat/data", - LogPath: "metricbeat/logs", - }, - actions.ConsulConfig{ - ServerAddr: os.Getenv("CONSUL_ENDPOINT"), - ConfigDir: "consul", - DataPath: "consul/data", - LogPath: "consul/log.out", - }), - "stop": model.Bind(component.StopInParallel("*", 15)), - "login": model.Bind(edge.Login("#ctrl")), - }, - - Infrastructure: model.InfrastructureStages{ - aws_ssh_key.Express(), - terraform_0.Express(), - semaphore0.Ready(time.Minute), - }, - - Configuration: model.ConfigurationStages{ - zitilib_runlevel_1_configuration.IfPkiNeedsRefresh( - zitilib_runlevel_1_configuration.Fabric("simple-transfer.test", "#ctrl"), - ), - config.Component(), - devkit.DevKitF(zitilab.ZitiRoot, []string{"ziti", "ziti-echo"}), - }, - - Distribution: model.DistributionStages{ - distribution.DistributeSshKey("*"), - distribution.Locations("*", "logs"), - distribution.DistributeDataWithReplaceCallbacks( - "*", - string(getConfigData("metricbeat.yml")), - "metricbeat/metricbeat.yml", - os.FileMode(0644), - map[string]func(*model.Host) string{ - "${host}": func(h *model.Host) string { - return os.Getenv("ELASTIC_ENDPOINT") - }, - "${user}": func(h *model.Host) string { - return os.Getenv("ELASTIC_USERNAME") - }, - "${password}": func(h *model.Host) string { - return os.Getenv("ELASTIC_PASSWORD") - }, - "${build_number}": func(h *model.Host) string { - return os.Getenv("BUILD_NUMBER") - }, - "${ziti_version}": func(h *model.Host) string { - return h.MustStringVariable("ziti_version") - }, - }, - ), - - distribution.DistributeDataWithReplaceCallbacks( - "*", - string(getConfigData("consul.hcl")), - "consul/consul.hcl", - os.FileMode(0644), - map[string]func(*model.Host) string{ - "${public_ip}": func(h *model.Host) string { - return h.PublicIp - }, - "${encryption_key}": func(h *model.Host) string { - return os.Getenv("CONSUL_ENCRYPTION_KEY") - }, - "${build_number}": func(h *model.Host) string { - return os.Getenv("BUILD_NUMBER") - }, - "${ziti_version}": func(h *model.Host) string { - return h.MustStringVariable("ziti_version") - }, - }, - ), - distribution.DistributeDataWithReplaceCallbacks( - "#ctrl", - string(getConfigData("ziti.hcl")), - "consul/ziti.hcl", - os.FileMode(0644), - map[string]func(*model.Host) string{ - "${build_number}": func(h *model.Host) string { - return os.Getenv("BUILD_NUMBER") - }, - "${ziti_version}": func(h *model.Host) string { - return h.MustStringVariable("ziti_version") - }, - }), - distribution.DistributeData( - "*", - []byte(os.Getenv("CONSUL_AGENT_CERT")), - "consul/consul-agent-ca.pem"), - rsync.RsyncStaged(), - }, +package main - Disposal: model.DisposalStages{ - terraform.Dispose(), - aws_ssh_key2.Dispose(), - }, -} +import ( + "github.com/openziti/fablab" + "github.com/openziti/ziti/network-tests/simple" +) func main() { - m.AddActivationActions("stop", "bootstrap", "start") - - model.AddBootstrapExtension( - zitilab.BootstrapWithFallbacks( - &zitilab.BootstrapFromEnv{}, - )) - model.AddBootstrapExtension(binding.AwsCredentialsLoader) - model.AddBootstrapExtension(aws_ssh_key.KeyManager) - - fablab.InitModel(m) + simple.InitBootstrapExtensions() + fablab.InitModel(simple.Model) fablab.Run() } diff --git a/network-tests/simple-transfer/stages.go b/network-tests/simple-transfer/stages.go deleted file mode 100644 index 724ca93cb..000000000 --- a/network-tests/simple-transfer/stages.go +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "crypto/rand" - "net/url" - - "github.com/openziti/fablab/kernel/model" - runlevel_5_operation "github.com/openziti/ziti/network-tests/simple-transfer/stages/5_operation" -) - -type stageFactory struct{} - -func newStageFactory() model.Factory { - return &stageFactory{} -} - -func (sf *stageFactory) Build(m *model.Model) error { - //generate 10k random bytes - data := make([]byte, 10000) - rand.Read(data) - - m.AddOperatingStage(runlevel_5_operation.AssertEcho("#echo-client", url.QueryEscape(string(data)))) - - return nil -} diff --git a/network-tests/simple/actions/bootstrap.go b/network-tests/simple/actions/bootstrap.go new file mode 100644 index 000000000..8f8afd2f1 --- /dev/null +++ b/network-tests/simple/actions/bootstrap.go @@ -0,0 +1,115 @@ +/* + (c) Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package actions + +import ( + "time" + + "github.com/openziti/fablab/kernel/lib/actions" + "github.com/openziti/fablab/kernel/lib/actions/component" + "github.com/openziti/fablab/kernel/lib/actions/host" + "github.com/openziti/fablab/kernel/lib/actions/semaphore" + "github.com/openziti/fablab/kernel/model" + zitilib_actions "github.com/openziti/zitilab/actions" + "github.com/openziti/zitilab/actions/edge" + "github.com/openziti/zitilab/models" +) + +type bootstrapAction struct{} + +func NewBootstrapAction() model.ActionBinder { + action := &bootstrapAction{} + return action.bind +} + +func (a *bootstrapAction) bind(m *model.Model) model.Action { + workflow := actions.Workflow() + + workflow.AddAction(host.GroupExec("*", 25, "rm -f logs/*")) + workflow.AddAction(component.Stop("#ctrl")) + workflow.AddAction(edge.InitController("#ctrl")) + workflow.AddAction(component.Start("#ctrl")) + workflow.AddAction(semaphore.Sleep(2 * time.Second)) + + workflow.AddAction(edge.Login("#ctrl")) + + workflow.AddAction(component.StopInParallel(models.EdgeRouterTag, 25)) + workflow.AddAction(edge.InitEdgeRouters(models.EdgeRouterTag, 2)) + workflow.AddAction(edge.InitIdentities(models.SdkAppTag, 2)) + + workflow.AddAction(zitilib_actions.Edge("create", "service", "echo")) + + workflow.AddAction(zitilib_actions.Edge("create", "service-policy", "echo-servers", "Bind", "--service-roles", "@echo", "--identity-roles", "#service")) + workflow.AddAction(zitilib_actions.Edge("create", "service-policy", "echo-client", "Dial", "--service-roles", "@echo", "--identity-roles", "#client")) + + workflow.AddAction(zitilib_actions.Edge("create", "edge-router-policy", "echo-servers", "--edge-router-roles", "#host", "--identity-roles", "#service")) + workflow.AddAction(zitilib_actions.Edge("create", "edge-router-policy", "echo-clients", "--edge-router-roles", "#client", "--identity-roles", "#client")) + + workflow.AddAction(zitilib_actions.Edge("create", "service-edge-router-policy", "serp-all", "--service-roles", "#all", "--edge-router-roles", "#all")) + + workflow.AddAction(zitilib_actions.Edge("create", "config", "files-host", "host.v2", ` + { + "terminators" : [ + { "address" : "ziti-smoketest-files.s3-us-west-1.amazonaws.com", "port" : 443, "protocol" : "tcp" } + ] + }`)) + + workflow.AddAction(zitilib_actions.Edge("create", "config", "files-intercept-ert-unencrypted", "intercept.v1", ` + { + "addresses": ["ziti-files-ert-unencrypted.s3-us-west-1.amazonaws.ziti"], + "portRanges" : [ { "low": 443, "high": 443 } ], + "protocols": ["tcp"] + }`)) + + workflow.AddAction(zitilib_actions.Edge("create", "config", "files-intercept-ert", "intercept.v1", ` + { + "addresses": ["ziti-files-ert.s3-us-west-1.amazonaws.ziti"], + "portRanges" : [ { "low": 443, "high": 443 } ], + "protocols": ["tcp"] + }`)) + + workflow.AddAction(zitilib_actions.Edge("create", "config", "files-intercept-zet-unencrypted", "intercept.v1", ` + { + "addresses": ["ziti-files-zet-unencrypted.s3-us-west-1.amazonaws.ziti"], + "portRanges" : [ { "low": 443, "high": 443 } ], + "protocols": ["tcp"] + }`)) + + workflow.AddAction(zitilib_actions.Edge("create", "config", "files-intercept-zet", "intercept.v1", ` + { + "addresses": ["ziti-files-zet.s3-us-west-1.amazonaws.ziti"], + "portRanges" : [ { "low": 443, "high": 443 } ], + "protocols": ["tcp"] + }`)) + + workflow.AddAction(zitilib_actions.Edge("create", "service", "ert-files-unencrypted", "-c", "files-host,files-intercept-ert-unencrypted", "-e", "OFF", "-a", "ert")) + workflow.AddAction(zitilib_actions.Edge("create", "service", "ert-files", "-c", "files-host,files-intercept-ert", "-a", "ert")) + + workflow.AddAction(zitilib_actions.Edge("create", "service", "zet-files-unencrypted", "-c", "files-host,files-intercept-zet-unencrypted", "-e", "OFF", "-a", "zet")) + workflow.AddAction(zitilib_actions.Edge("create", "service", "zet-files", "-c", "files-host,files-intercept-zet", "-a", "zet")) + + workflow.AddAction(zitilib_actions.Edge("create", "service-policy", "ert-hosts", "Bind", "--service-roles", "#ert", "--identity-roles", "#ert-host")) + workflow.AddAction(zitilib_actions.Edge("create", "service-policy", "zet-hosts", "Bind", "--service-roles", "#zet", "--identity-roles", "#zet-host")) + workflow.AddAction(zitilib_actions.Edge("create", "service-policy", "client-tunnelers", "Dial", "--service-roles", "#all", "--identity-roles", "#client")) + + workflow.AddAction(zitilib_actions.Edge("create", "edge-router-policy", "client-routers", "--edge-router-roles", "#client", "--identity-roles", "#client")) + workflow.AddAction(zitilib_actions.Edge("create", "edge-router-policy", "host-routers", "--edge-router-roles", "#host", "--identity-roles", "#host")) + + workflow.AddAction(component.Stop(models.ControllerTag)) + + return workflow +} diff --git a/network-tests/simple/actions/start.go b/network-tests/simple/actions/start.go new file mode 100644 index 000000000..eb3aba464 --- /dev/null +++ b/network-tests/simple/actions/start.go @@ -0,0 +1,85 @@ +/* + (c) Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package actions + +import ( + "fmt" + "github.com/openziti/fablab/kernel/lib" + "time" + + "github.com/openziti/fablab/kernel/lib/actions" + "github.com/openziti/fablab/kernel/lib/actions/component" + "github.com/openziti/fablab/kernel/lib/actions/semaphore" + "github.com/openziti/fablab/kernel/model" + util_actions "github.com/openziti/ziti/network-tests/utils/actions" + zitilib_actions "github.com/openziti/zitilab/actions" + "github.com/openziti/zitilab/models" +) + +func NewStartAction(metricbeat MetricbeatConfig, consul ConsulConfig) model.ActionBinder { + action := &startAction{ + Metricbeat: metricbeat, + Consul: consul, + } + return action.bind +} + +func (a *startAction) bind(m *model.Model) model.Action { + workflow := actions.Workflow() + workflow.AddAction(component.Start("#ctrl")) + workflow.AddAction(semaphore.Sleep(2 * time.Second)) + workflow.AddAction(component.StartInParallel(models.EdgeRouterTag, 25)) + + workflow.AddAction(semaphore.Sleep(2 * time.Second)) + workflow.AddAction(zitilib_actions.StartMetricbeat("*", a.Metricbeat.ConfigPath, a.Metricbeat.DataPath, a.Metricbeat.LogPath)) + workflow.AddAction(zitilib_actions.StartConsul("*", a.Consul.ServerAddr, a.Consul.ConfigDir, a.Consul.DataPath, a.Consul.LogPath)) + workflow.AddAction(semaphore.Sleep(2 * time.Second)) + workflow.AddAction(util_actions.StartEchoServers("#echo-server")) + workflow.AddAction(semaphore.Sleep(2 * time.Second)) + + workflow.AddAction(model.ActionFunc(func(m *model.Model) error { + return m.ForEachComponent(".sdk-app", 5, func(c *model.Component) error { + factory := lib.NewSshConfigFactory(c.GetHost()) + + serviceCmd := fmt.Sprintf("nohup sudo /home/%s/fablab/bin/%s run -i /home/%s/fablab/cfg/%s > logs/%s.log 2>&1 &", + factory.User(), c.BinaryName, factory.User(), c.PublicIdentity+".json", c.PublicIdentity) + + _, err := lib.RemoteExec(factory, serviceCmd) + return err + }) + })) + + return workflow +} + +type startAction struct { + Metricbeat MetricbeatConfig + Consul ConsulConfig +} + +type MetricbeatConfig struct { + ConfigPath string + DataPath string + LogPath string +} + +type ConsulConfig struct { + ConfigDir string + ServerAddr string + DataPath string + LogPath string +} diff --git a/network-tests/simple/configs/consul.hcl b/network-tests/simple/configs/consul.hcl new file mode 100644 index 000000000..0f333bb3b --- /dev/null +++ b/network-tests/simple/configs/consul.hcl @@ -0,0 +1,24 @@ +datacenter = "ziti-build-metrics" +data_dir = "/opt/consul" +encrypt = "${encryption_key}" +advertise_addr="${public_ip}" + + +tls { + defaults { + verify_incoming = false + verify_outgoing = true + + ca_file="consul/consul-agent-ca.pem" + } +} + +auto_encrypt { + tls = true +} + +acl { + enabled = true + default_policy = "allow" + enable_token_persistence = true +} diff --git a/network-tests/simple-transfer/configs/ctrl.yml b/network-tests/simple/configs/ctrl.yml similarity index 100% rename from network-tests/simple-transfer/configs/ctrl.yml rename to network-tests/simple/configs/ctrl.yml diff --git a/network-tests/simple-transfer/configs/elasticsearch.repo b/network-tests/simple/configs/elasticsearch.repo similarity index 100% rename from network-tests/simple-transfer/configs/elasticsearch.repo rename to network-tests/simple/configs/elasticsearch.repo diff --git a/network-tests/simple/configs/metricbeat.yml b/network-tests/simple/configs/metricbeat.yml new file mode 100644 index 000000000..35c1cc9f6 --- /dev/null +++ b/network-tests/simple/configs/metricbeat.yml @@ -0,0 +1,53 @@ +fields_under_root: true +fields: + build_number: ${build_number} + ziti_version: ${ziti_version} + +processors: + - add_cloud_metadata: ~ + +metricbeat.modules: +- module: system + metricsets: + - cpu # CPU usage + - load # CPU load averages + - memory # Memory usage + - network # Network IO + enabled: true + period: 30s + cpu.metrics: ["percentages"] # The other available options are normalized_percentages and ticks. + core.metrics: ["percentages"] # The other available option is ticks. +#- module: docker +# metricsets: +# - "container" +# - "cpu" +# - "diskio" +# - "healthcheck" +# - "info" +# - "image" +# - "memory" +# - "network" +# hosts: ["unix:///var/run/docker.sock"] +# period: 30s +# enabled: true +# # If set to true, replace dots in labels with `_`. +# labels.dedot: true + + +output.elasticsearch: + # Array of hosts to connect to. + hosts: ["${host}"] + + # Optional protocol and basic auth credentials. + protocol: "https" + username: "${user}" + password: "${password}" + index: 'zt-%{[agent.version]}-%{+yyyy.MM.dd}' + +setup.template.enabled: true +setup.template.name: 'zt-%{[agent.version]}' +setup.template.pattern: 'zt-%{[agent.version]}-*' +setup.template.fields: "/etc/metricbeat/fields.yml" +setup.template.settings: + index.number_of_shards: 1 + index.codec: best_compression \ No newline at end of file diff --git a/network-tests/simple-transfer/configs/router.yml b/network-tests/simple/configs/router.yml similarity index 100% rename from network-tests/simple-transfer/configs/router.yml rename to network-tests/simple/configs/router.yml diff --git a/network-tests/simple/configs/ziti.hcl b/network-tests/simple/configs/ziti.hcl new file mode 100644 index 000000000..4af438cc0 --- /dev/null +++ b/network-tests/simple/configs/ziti.hcl @@ -0,0 +1,9 @@ +service { + name = "ziti" + id = "ziti" + port = 6262 + meta { + build_number= "${build_number}" + ziti_version= "${ziti_version}" + } +} \ No newline at end of file diff --git a/network-tests/simple/simple.go b/network-tests/simple/simple.go new file mode 100644 index 000000000..91a27688a --- /dev/null +++ b/network-tests/simple/simple.go @@ -0,0 +1,318 @@ +/* + (c) Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package simple + +import ( + "embed" + "fmt" + "github.com/openziti/fablab/kernel/lib/actions/component" + "github.com/openziti/fablab/kernel/lib/binding" + "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/aws_ssh_key" + semaphore0 "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/semaphore" + terraform_0 "github.com/openziti/fablab/kernel/lib/runlevel/0_infrastructure/terraform" + "github.com/openziti/fablab/kernel/lib/runlevel/1_configuration/config" + "github.com/openziti/fablab/kernel/lib/runlevel/2_kitting/devkit" + distribution "github.com/openziti/fablab/kernel/lib/runlevel/3_distribution" + "github.com/openziti/fablab/kernel/lib/runlevel/3_distribution/rsync" + aws_ssh_key2 "github.com/openziti/fablab/kernel/lib/runlevel/6_disposal/aws_ssh_key" + "github.com/openziti/fablab/kernel/lib/runlevel/6_disposal/terraform" + "github.com/openziti/fablab/kernel/model" + "github.com/openziti/fablab/resources" + actions2 "github.com/openziti/ziti/network-tests/simple/actions" + "github.com/openziti/ziti/network-tests/simple/stages/5_operation" + "github.com/openziti/ziti/network-tests/test_resources" + "github.com/openziti/zitilab" + "github.com/openziti/zitilab/actions/edge" + zitilib_runlevel_1_configuration "github.com/openziti/zitilab/runlevel/1_configuration" + "github.com/sirupsen/logrus" + "os" + "time" +) + +//go:embed configs +var configResource embed.FS + +func getConfigData(filePath string) []byte { + data, err := configResource.ReadFile(fmt.Sprintf("configs/%s", filePath)) + if err != nil { + logrus.Errorf("Unable to read config data from %s: [%s]", filePath, err) + } + return data +} + +var Model = &model.Model{ + Id: "simple-transfer", + Scope: model.Scope{ + Defaults: model.Variables{ + "environment": "simple-transfer-smoketest", + "credentials": model.Variables{ + "ssh": model.Variables{ + "username": "ubuntu", + }, + "edge": model.Variables{ + "username": "admin", + "password": "admin", + }, + }, + }, + }, + + Factories: []model.Factory{ + model.FactoryFunc(func(m *model.Model) error { + m.AddActivationActions("stop", "bootstrap", "start") + m.AddOperatingStage(runlevel_5_operation.AssertEcho("#echo-client")) + + return nil + }), + }, + + Resources: model.Resources{ + resources.Configs: resources.SubFolder(configResource, "configs"), + resources.Terraform: test_resources.TerraformResources(), + }, + + Regions: model.Regions{ + "us-east-1": { + Region: "us-east-1", + Site: "us-east-1a", + Hosts: model.Hosts{ + "ctrl": { + InstanceType: "t2.micro", + Components: model.Components{ + "ctrl": { + Scope: model.Scope{Tags: model.Tags{"ctrl"}}, + BinaryName: "ziti controller", + ConfigSrc: "ctrl.yml", + ConfigName: "ctrl.yml", + PublicIdentity: "ctrl", + }, + "consul": { + BinaryName: "consul", + }, + }, + }, + "router-east-1": { + Scope: model.Scope{Tags: model.Tags{"ert-client"}}, + InstanceType: "t2.micro", + Components: model.Components{ + "router-east-1": { + Scope: model.Scope{Tags: model.Tags{"edge-router", "terminator", "tunneler", "client"}}, + BinaryName: "ziti router", + ConfigSrc: "router.yml", + ConfigName: "router-east-1.yml", + PublicIdentity: "router-east-1", + RunWithSudo: true, + }, + "echo-client": { + Scope: model.Scope{Tags: model.Tags{"sdk-app", "client"}}, + BinaryName: "echo-client", + PublicIdentity: "echo-client", + }, + "consul": { + BinaryName: "consul", + }, + }, + }, + "router-east-2": { + InstanceType: "t2.micro", + Components: model.Components{ + "router-east-2": { + Scope: model.Scope{Tags: model.Tags{"edge-router", "initiator"}}, + BinaryName: "ziti router", + ConfigSrc: "router.yml", + ConfigName: "router-east-2.yml", + PublicIdentity: "router-east-2", + }, + "consul": { + BinaryName: "consul", + }, + }, + }, + "ziti-edge-tunnel-client": { + Scope: model.Scope{Tags: model.Tags{"zet-client"}}, + InstanceType: "t2.micro", + Components: model.Components{ + "ziti-edge-tunnel-client": { + Scope: model.Scope{Tags: model.Tags{"sdk-app", "client"}}, + BinaryName: "ziti-edge-tunnel", + PublicIdentity: "ziti-edge-tunnel-client", + RunWithSudo: true, + }, + "consul": { + BinaryName: "consul", + }, + }, + }, + }, + }, + "us-west-2": { + Region: "us-west-2", + Site: "us-west-2b", + Hosts: model.Hosts{ + "router-west": { + Scope: model.Scope{Tags: model.Tags{}}, + InstanceType: "t2.micro", + Components: model.Components{ + "router-west": { + Scope: model.Scope{Tags: model.Tags{"edge-router", "tunneler", "host", "ert-host"}}, + BinaryName: "ziti router", + ConfigSrc: "router.yml", + ConfigName: "router-west.yml", + PublicIdentity: "router-west", + RunWithSudo: true, + }, + "echo-server": { + Scope: model.Scope{Tags: model.Tags{"sdk-app", "service"}}, + BinaryName: "echo-server", + PublicIdentity: "echo-server", + }, + "consul": { + BinaryName: "consul", + }, + }, + }, + "ziti-edge-tunnel-host": { + InstanceType: "t2.micro", + Components: model.Components{ + "ziti-edge-tunnel-host": { + Scope: model.Scope{Tags: model.Tags{"sdk-app", "host", "zet-host"}}, + BinaryName: "ziti-edge-tunnel", + PublicIdentity: "ziti-edge-tunnel-host", + RunWithSudo: true, + }, + "consul": { + BinaryName: "consul", + }, + }, + }, + }, + }, + }, + + Actions: model.ActionBinders{ + "bootstrap": actions2.NewBootstrapAction(), + "start": actions2.NewStartAction(actions2.MetricbeatConfig{ + ConfigPath: "metricbeat", + DataPath: "metricbeat/data", + LogPath: "metricbeat/logs", + }, + actions2.ConsulConfig{ + ServerAddr: os.Getenv("CONSUL_ENDPOINT"), + ConfigDir: "consul", + DataPath: "consul/data", + LogPath: "consul/log.out", + }), + "stop": model.Bind(component.StopInParallel("*", 15)), + "login": model.Bind(edge.Login("#ctrl")), + }, + + Infrastructure: model.InfrastructureStages{ + aws_ssh_key.Express(), + terraform_0.Express(), + semaphore0.Ready(time.Minute), + }, + + Configuration: model.ConfigurationStages{ + zitilib_runlevel_1_configuration.IfPkiNeedsRefresh( + zitilib_runlevel_1_configuration.Fabric("simple-transfer.test", "#ctrl"), + ), + config.Component(), + devkit.DevKitF(zitilab.ZitiRoot, []string{"ziti", "ziti-echo"}), + //stageziti.FetchZitiEdgeTunnel("v0.21.4"), + }, + + Distribution: model.DistributionStages{ + distribution.DistributeSshKey("*"), + distribution.Locations("*", "logs"), + distribution.DistributeDataWithReplaceCallbacks( + "*", + string(getConfigData("metricbeat.yml")), + "metricbeat/metricbeat.yml", + os.FileMode(0644), + map[string]func(*model.Host) string{ + "${host}": func(h *model.Host) string { + return os.Getenv("ELASTIC_ENDPOINT") + }, + "${user}": func(h *model.Host) string { + return os.Getenv("ELASTIC_USERNAME") + }, + "${password}": func(h *model.Host) string { + return os.Getenv("ELASTIC_PASSWORD") + }, + "${build_number}": func(h *model.Host) string { + return os.Getenv("BUILD_NUMBER") + }, + "${ziti_version}": func(h *model.Host) string { + return h.MustStringVariable("ziti_version") + }, + }, + ), + + distribution.DistributeDataWithReplaceCallbacks( + "*", + string(getConfigData("consul.hcl")), + "consul/consul.hcl", + os.FileMode(0644), + map[string]func(*model.Host) string{ + "${public_ip}": func(h *model.Host) string { + return h.PublicIp + }, + "${encryption_key}": func(h *model.Host) string { + return os.Getenv("CONSUL_ENCRYPTION_KEY") + }, + "${build_number}": func(h *model.Host) string { + return os.Getenv("BUILD_NUMBER") + }, + "${ziti_version}": func(h *model.Host) string { + return h.MustStringVariable("ziti_version") + }, + }, + ), + distribution.DistributeDataWithReplaceCallbacks( + "#ctrl", + string(getConfigData("ziti.hcl")), + "consul/ziti.hcl", + os.FileMode(0644), + map[string]func(*model.Host) string{ + "${build_number}": func(h *model.Host) string { + return os.Getenv("BUILD_NUMBER") + }, + "${ziti_version}": func(h *model.Host) string { + return h.MustStringVariable("ziti_version") + }, + }), + distribution.DistributeData( + "*", + []byte(os.Getenv("CONSUL_AGENT_CERT")), + "consul/consul-agent-ca.pem"), + rsync.RsyncStaged(), + }, + + Disposal: model.DisposalStages{ + terraform.Dispose(), + aws_ssh_key2.Dispose(), + }, +} + +func InitBootstrapExtensions() { + model.AddBootstrapExtension( + zitilab.BootstrapWithFallbacks( + &zitilab.BootstrapFromEnv{}, + )) + model.AddBootstrapExtension(binding.AwsCredentialsLoader) + model.AddBootstrapExtension(aws_ssh_key.KeyManager) +} diff --git a/network-tests/simple-transfer/stages/5_operation/echo_client.go b/network-tests/simple/stages/5_operation/echo_client.go similarity index 80% rename from network-tests/simple-transfer/stages/5_operation/echo_client.go rename to network-tests/simple/stages/5_operation/echo_client.go index a753185af..4ae6f01aa 100644 --- a/network-tests/simple-transfer/stages/5_operation/echo_client.go +++ b/network-tests/simple/stages/5_operation/echo_client.go @@ -1,7 +1,9 @@ package runlevel_5_operation import ( + "crypto/rand" "fmt" + "net/url" "strings" "github.com/openziti/fablab/kernel/lib" @@ -14,10 +16,13 @@ type echoClient struct { message string } -func AssertEcho(componentSpec, message string) model.OperatingStage { +func AssertEcho(componentSpec string) model.OperatingStage { + data := make([]byte, 10000) + _, _ = rand.Read(data) + return &echoClient{ componentSpec: componentSpec, - message: message, + message: url.QueryEscape(string(data)), } } @@ -36,7 +41,7 @@ func (ec *echoClient) Operate(run model.Run) error { //trim the newline ssh added output = strings.TrimRight(output, "\n") if output != ec.message { - return fmt.Errorf("Got message [%s] expected [%s]", output, ec.message) + return fmt.Errorf("got message [%s] expected [%s]", output, ec.message) } } return nil diff --git a/network-tests/simple-transfer/stages/5_operation/echo_server.go b/network-tests/simple/stages/5_operation/echo_server.go similarity index 100% rename from network-tests/simple-transfer/stages/5_operation/echo_server.go rename to network-tests/simple/stages/5_operation/echo_server.go diff --git a/network-tests/tests/files_test.go b/network-tests/tests/files_test.go new file mode 100644 index 000000000..8d3559533 --- /dev/null +++ b/network-tests/tests/files_test.go @@ -0,0 +1,85 @@ +/* + (c) Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package tests + +import ( + "fmt" + "github.com/openziti/fablab/kernel/lib" + "github.com/openziti/fablab/kernel/model" + "github.com/stretchr/testify/require" + "testing" + "time" +) + +var hashes = map[string]string{ + "1KB": "0f343b0931126a20f133d67c2b018a3b", + "100KB": "4c6426ac7ef186464ecbb0d81cbfcb1e", + "20MB": "8f4e33f3dc3e414ff94e5fb6905cba8c", +} + +type httpClient string + +const ( + ClientCurl httpClient = "curl" + ClientWget httpClient = "wget" +) + +func TestCurlFiles(t *testing.T) { + for _, clientType := range []string{"ert"} { // add zet back + for _, hostType := range []string{"ert"} { // add zet back + for _, client := range []httpClient{ClientCurl, ClientWget} { + for _, encrypted := range []bool{true, false} { + for _, size := range []string{"1KB", "100KB", "20MB"} { + testFileDownload(t, clientType, client, hostType, encrypted, size, 20*time.Second) + } + } + } + } + } +} + +func testFileDownload(t *testing.T, hostSelector string, client httpClient, hostType string, encrypted bool, fileSize string, timeout time.Duration) { + encDesk := "encrypted" + if !encrypted { + encDesk = "unencrypted" + } + + t.Run(fmt.Sprintf("%v-(%s->%s)-%s-%v", client, hostSelector, hostType, fileSize, encDesk), func(t *testing.T) { + host, err := model.GetModel().SelectHost("." + hostSelector + "-client") + req := require.New(t) + req.NoError(err) + + urlExtra := "" + if !encrypted { + urlExtra = "-unencrypted" + } + + url := fmt.Sprintf("https://ziti-files-%s%s.s3-us-west-1.amazonaws.ziti/%s.zip", hostType, urlExtra, fileSize) + sshConfigFactory := lib.NewSshConfigFactory(host) + + var cmd string + if client == ClientCurl { + cmd = fmt.Sprintf(`set -o pipefail; curl -k --header "Host: ziti-smoketest-files.s3-us-west-1.amazonaws.com" -fSL -o - %s | md5sum`, url) + } else if client == ClientWget { + cmd = fmt.Sprintf(`set -o pipefail; wget --no-check-certificate --header "Host: ziti-smoketest-files.s3-us-west-1.amazonaws.com" -O - -t 5 -T 5 %s | md5sum`, url) + } + + o, err := lib.RemoteExecAllWithTimeout(sshConfigFactory, timeout, cmd) + req.NoError(err) + req.Equal(hashes[fileSize], o[0:32]) + }) +} diff --git a/network-tests/tests/matrix.md b/network-tests/tests/matrix.md new file mode 100644 index 000000000..66c2e9595 --- /dev/null +++ b/network-tests/tests/matrix.md @@ -0,0 +1,32 @@ +# Test Matrix + +## Services + +* File transfer +* IPerf +* Fortio +* ziti-fabric-test loop + +## Clients + +* File Transfer + * curl ER/T + * curl ziti-edge-tunnel + * sdk +* IPerf + * ER/T + * ziti-edge-tunnnel +* Fortio + * ER/T + * ziti-edge-tunnel + * sdk? +* ziti-fabric-test loop + * ziti-fabric-test loop + +## Hosting Options + +* Edge Router/Tunneler - encrypted and non-encrypted +* ziti-edge-tunnel - encrypted and non-encyrpted +* router + + diff --git a/network-tests/tests/model_test.go b/network-tests/tests/model_test.go new file mode 100644 index 000000000..ee3589479 --- /dev/null +++ b/network-tests/tests/model_test.go @@ -0,0 +1,48 @@ +/* + (c) Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package tests + +import ( + "github.com/openziti/fablab" + "github.com/openziti/fablab/kernel/model" + "github.com/openziti/ziti/network-tests/simple" + "github.com/pkg/errors" + "github.com/sirupsen/logrus" +) + +var run model.Run + +func init() { + cfg := model.GetConfig() + instance, found := cfg.Instances[cfg.GetSelectedInstanceId()] + if !found { + panic(errors.Errorf("no instance found for current instance id %v", cfg.GetSelectedInstanceId())) + } + + if instance.Model == simple.Model.Id { + simple.InitBootstrapExtensions() + fablab.InitModel(simple.Model) + } else { + panic(errors.Errorf("unsupported model for network tests [%v]", instance.Model)) + } + + if err := model.Bootstrap(); err != nil { + logrus.Fatalf("unable to bootstrap (%s)", err) + } + + run = model.NewRun() +} diff --git a/network-tests/utils/ziti-echo/cmd/client.go b/network-tests/utils/ziti-echo/cmd/client.go index b6e43b82b..36928b60b 100644 --- a/network-tests/utils/ziti-echo/cmd/client.go +++ b/network-tests/utils/ziti-echo/cmd/client.go @@ -3,6 +3,7 @@ package cmd import ( "context" "fmt" + "github.com/openziti/sdk-golang/ziti/config" "io" "log" "net" @@ -11,7 +12,6 @@ import ( "strings" "github.com/openziti/sdk-golang/ziti" - "github.com/openziti/sdk-golang/ziti/config" "github.com/spf13/cobra" ) @@ -34,6 +34,12 @@ func echoClient(cmd *cobra.Command, args []string) { } zitiContext := ziti.NewContextWithConfig(cfg) + /* + zitiContext, err := ziti.NewContextFromFile(identityFile) + if err != nil { + log.Fatal(err) + } + */ dial := func(_ context.Context, _, addr string) (net.Conn, error) { service := strings.Split(addr, ":")[0] diff --git a/network-tests/utils/ziti-echo/cmd/server.go b/network-tests/utils/ziti-echo/cmd/server.go index 8ae90af3d..05f9c1c88 100644 --- a/network-tests/utils/ziti-echo/cmd/server.go +++ b/network-tests/utils/ziti-echo/cmd/server.go @@ -1,6 +1,7 @@ package cmd import ( + "github.com/openziti/sdk-golang/ziti/config" "log" "net" "net/http" @@ -10,7 +11,6 @@ import ( "time" "github.com/openziti/sdk-golang/ziti" - "github.com/openziti/sdk-golang/ziti/config" "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) @@ -70,6 +70,12 @@ func (s *zitiEchoServer) run() (err error) { } zitiContext := ziti.NewContextWithConfig(config) + /* + zitiContext, err := ziti.NewContextFromFile(s.identityJson) + if err != nil { + return err + } + */ if s.listener, err = zitiContext.Listen("echo"); err != nil { return err } diff --git a/quickstart/docker/.env b/quickstart/docker/.env index af21b1eff..577d31807 100644 --- a/quickstart/docker/.env +++ b/quickstart/docker/.env @@ -12,6 +12,9 @@ ZITI_CONTROLLER_RAWNAME=ziti-controller #ZITI_CONTROLLER_HOSTNAME=advertised.address #ZITI_CTRL_PORT=8440 +# Leave password blank to have a unique value generated or set the password explicitly +ZITI_PWD= + ZITI_EDGE_CONTROLLER_RAWNAME=ziti-edge-controller #ZITI_EDGE_CONTROLLER_HOSTNAME=advertised.address #ZITI_EDGE_CONTROLLER_PORT=8441 diff --git a/quickstart/docker/docker-compose.yml b/quickstart/docker/docker-compose.yml index 7cff37dce..cdd600793 100644 --- a/quickstart/docker/docker-compose.yml +++ b/quickstart/docker/docker-compose.yml @@ -10,6 +10,7 @@ services: environment: - ZITI_EDGE_IDENTITY_ENROLLMENT_DURATION=${ZITI_EDGE_IDENTITY_ENROLLMENT_DURATION} - ZITI_EDGE_ROUTER_ENROLLMENT_DURATION=${ZITI_EDGE_ROUTER_ENROLLMENT_DURATION} + - ZITI_PWD=${ZITI_PWD} networks: zitiblue: aliases: diff --git a/quickstart/docker/image/run-controller.sh b/quickstart/docker/image/run-controller.sh index 21a0c34b3..93ec7bd60 100755 --- a/quickstart/docker/image/run-controller.sh +++ b/quickstart/docker/image/run-controller.sh @@ -7,8 +7,11 @@ export ZITI_EDGE_CONTROLLER_RAWNAME=ziti-edge-controller . "${ZITI_SCRIPTS}/ziti-cli-functions.sh" -generateEnvFile -. ${ZITI_HOME}/ziti.env +# access-control.init is created by ziti-controller-init-container after initial controller startup +if [ ! -f "${ZITI_HOME}/access-control.init" ]; then + generateEnvFile +fi +. "${ZITI_HOME}/ziti.env" # create pki createPki diff --git a/quickstart/docker/image/ziti-cli-functions.sh b/quickstart/docker/image/ziti-cli-functions.sh index 1520ba7bd..f408c7f48 100755 --- a/quickstart/docker/image/ziti-cli-functions.sh +++ b/quickstart/docker/image/ziti-cli-functions.sh @@ -2,14 +2,6 @@ set -uo pipefail -# the default ZITI_NETWORK (network name) is the short hostname -: "${DEFAULT_ZITI_NETWORK:="$(hostname -s)"}" - -# shellcheck disable=SC2155 -export DEFAULT_ZITI_HOME_LOCATION="${HOME}/.ziti/quickstart/${DEFAULT_ZITI_NETWORK}" - -export ZITI_QUICKSTART_ENVROOT="${HOME}/.ziti/quickstart" - ASCI_WHITE='\033[01;37m' ASCI_RESTORE='\033[0m' ASCI_RED='\033[00;31m' @@ -44,8 +36,40 @@ function BLUE { echo "${ASCI_BLUE}${1-}${ASCI_RESTORE}" } +function checkPrereqs { + commands_to_test=(curl jq tar hostname) + missing_requirements="" + # verify all the commands required in the automation exist before trying to run the full suite + for cmd in "${commands_to_test[@]}" + do + # checking all commands are on the path before continuing... + if ! [[ -x "$(command -v "${cmd}")" ]]; then + missing_requirements="${missing_requirements} * ${cmd} +" + fi + done + # are requirements ? if yes, stop here and help 'em out + if ! [[ "" = "${missing_requirements}" ]]; then + echo " " + echo "You're missing one or more commands that are used in this script." + echo "Please ensure the commands listed are on the path and then try again." + echo "${missing_requirements}" + echo " " + return 1 + fi +} + +checkPrereqs + +# the default ZITI_NETWORK (network name) is the short hostname +: "${DEFAULT_ZITI_NETWORK:="$(hostname -s)"}" + +# shellcheck disable=SC2155 +export DEFAULT_ZITI_HOME_LOCATION="${HOME}/.ziti/quickstart/${DEFAULT_ZITI_NETWORK}" +export ZITI_QUICKSTART_ENVROOT="${HOME}/.ziti/quickstart" + function zitiLogin { - "${ZITI_BIN_DIR-}/ziti" edge login "${ZITI_EDGE_CTRL_ADVERTISED}" -u "${ZITI_USER-}" -p "${ZITI_PWD}" -c "${ZITI_PKI_OS_SPECIFIC}/${ZITI_EDGE_CONTROLLER_ROOTCA_NAME}/certs/${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}.cert" + "${ZITI_BIN_DIR-}/ziti" edge login "${ZITI_EDGE_CTRL_ADVERTISED}" -u "${ZITI_USER-}" -p "${ZITI_PWD}" -y } function cleanZitiController { checkEnvVariable ZITI_HOME @@ -275,31 +299,6 @@ function getZiti { fi } -function checkPrereqs { - commands_to_test=(curl jq) - missing_requirements="" - # verify all the commands required in the automation exist before trying to run the full suite - for cmd in "${commands_to_test[@]}" - do - # checking all commands are on the path before continuing... - if ! [[ -x "$(command -v "${cmd}")" ]]; then - missing_requirements="${missing_requirements} * ${cmd}" - fi - done - # are requirements ? if yes, stop here and help 'em out - if ! [[ "" = "${missing_requirements}" ]]; then - echo " " - echo "You're missing one or more commands that are used in this script." - echo "Please ensure the commands listed are on the path and then try again." - echo "${missing_requirements}" - echo " " - echo " " - return 1 - else - echo -e "$(GREEN "Prerequisites confirmed")" - fi -} - function _portCheck { if [[ "${1-}" == "" ]] || [[ "${2-}" == "" ]]; then echo -e "_portCheck Usage: _portCheck " @@ -1146,8 +1145,7 @@ function ziti_createEnvFile { echo "export PFXLOG_NO_JSON=true" >> "${ENV_FILE}" echo "alias zec='ziti edge'" >> "${ENV_FILE}" - echo "alias zlogin='ziti edge login \"\${ZITI_EDGE_CTRL_ADVERTISED}\" -u \"\${ZITI_USER-}\" -p \"\${ZITI_PWD}\" -c \"\${ZITI_PKI}/\${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}/certs/\${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}.cert\"'" >> "${ENV_FILE}" - echo "alias zitiLogin='ziti edge login \"\${ZITI_EDGE_CTRL_ADVERTISED}\" -u \"\${ZITI_USER-}\" -p \"\${ZITI_PWD}\" -c \"\${ZITI_PKI}/\${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}/certs/\${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}.cert\"'" >> "${ENV_FILE}" + echo "alias zitiLogin='ziti edge login \"\${ZITI_EDGE_CTRL_ADVERTISED}\" -u \"\${ZITI_USER-}\" -p \"\${ZITI_PWD}\" -y'" >> "${ENV_FILE}" echo "alias psz='ps -ef | grep ziti'" >> "${ENV_FILE}" #when sourcing the emitted file add the bin folder to the path diff --git a/quickstart/docker/simplified-docker-compose.yml b/quickstart/docker/simplified-docker-compose.yml index 407beb3eb..bc9d20e13 100644 --- a/quickstart/docker/simplified-docker-compose.yml +++ b/quickstart/docker/simplified-docker-compose.yml @@ -10,6 +10,7 @@ services: environment: - ZITI_EDGE_IDENTITY_ENROLLMENT_DURATION=${ZITI_EDGE_IDENTITY_ENROLLMENT_DURATION} - ZITI_EDGE_ROUTER_ENROLLMENT_DURATION=${ZITI_EDGE_ROUTER_ENROLLMENT_DURATION} + - ZITI_PWD=${ZITI_PWD} networks: zitiblue: aliases: diff --git a/quickstart/local/add-zcat.sh b/quickstart/local/add-zcat.sh index 22cf2ecd7..0a159558a 100644 --- a/quickstart/local/add-zcat.sh +++ b/quickstart/local/add-zcat.sh @@ -1,4 +1,4 @@ -ziti edge login "${ZITI_EDGE_CONTROLLER_API}" -u "${ZITI_USER}" -p "${ZITI_PWD}" -c "${ZITI_PKI}/${ZITI_EDGE_CONTROLLER_ROOTCA_NAME}/certs/${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}.cert" +ziti edge login "${ZITI_EDGE_CONTROLLER_API}" -u "${ZITI_USER}" -p "${ZITI_PWD}" -y ziti edge delete service zcatsvc ziti edge delete config zcatconfig diff --git a/quickstart/local/newid.sh b/quickstart/local/newid.sh index 54f063ab1..52f318a9d 100755 --- a/quickstart/local/newid.sh +++ b/quickstart/local/newid.sh @@ -1,7 +1,7 @@ suffix=$(date +"%b-%d-%H%M") idname="User${suffix}" -ziti edge login "${ZITI_EDGE_CONTROLLER_API}" -u "${ZITI_USER}" -p "${ZITI_PWD}" -c "${ZITI_PKI}/${ZITI_EDGE_CONTROLLER_ROOTCA_NAME}/certs/${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}.cert" +ziti edge login "${ZITI_EDGE_CONTROLLER_API}" -u "${ZITI_USER}" -p "${ZITI_PWD}" -y ziti edge delete identity "${idname}" ziti edge create identity device "${idname}" -o "${ZITI_HOME}/test_identity".jwt diff --git a/quickstart/local/test-ziti.sh b/quickstart/local/test-ziti.sh index cb8ac4f9a..44f6b7935 100755 --- a/quickstart/local/test-ziti.sh +++ b/quickstart/local/test-ziti.sh @@ -1,4 +1,4 @@ -ziti edge controller login "${ZITI_EDGE_CONTROLLER_API}" -u "${ZITI_USER}" -p "${ZITI_PWD}" -c "${ZITI_PKI}/${ZITI_EDGE_CONTROLLER_ROOTCA_NAME}/certs/${ZITI_EDGE_CONTROLLER_INTERMEDIATE_NAME}.cert" +ziti edge controller login "${ZITI_EDGE_CONTROLLER_API}" -u "${ZITI_USER}" -p "${ZITI_PWD}" -y ziti edge delete service netcatsvc ziti edge delete service zcatsvc diff --git a/quickstart/test/quickstart_test.go b/quickstart/test/quickstart_test.go index f0e2a8883..12379cb2f 100644 --- a/quickstart/test/quickstart_test.go +++ b/quickstart/test/quickstart_test.go @@ -24,7 +24,6 @@ import ( "github.com/openziti/edge-api/rest_model" "github.com/openziti/edge-api/rest_util" "github.com/openziti/sdk-golang/ziti" - sdk_config "github.com/openziti/sdk-golang/ziti/config" "github.com/openziti/sdk-golang/ziti/enroll" "github.com/pkg/errors" log "github.com/sirupsen/logrus" @@ -407,7 +406,7 @@ func TestSimpleWebService(t *testing.T) { assert.Equal(t, 200, resp.StatusCode, fmt.Sprintf("Expected successful HTTP status code 200, received %d instead", resp.StatusCode)) } -func enrollIdentity(client *rest_management_api_client.ZitiEdgeManagement, identityID string) *sdk_config.Config { +func enrollIdentity(client *rest_management_api_client.ZitiEdgeManagement, identityID string) *ziti.Config { // Get the identity object params := &identity.DetailIdentityParams{ Context: context.Background(), @@ -447,11 +446,14 @@ func Dial(_ context.Context, _ string, addr string) (net.Conn, error) { } func createZitifiedHttpClient(idFile string) http.Client { - cfg, err := sdk_config.NewFromFile(idFile) + cfg, err := ziti.NewConfigFromFile(idFile) + if err != nil { + panic(err) + } + zitiContext, err = ziti.NewContext(cfg) if err != nil { panic(err) } - zitiContext = ziti.NewContextWithConfig(cfg) zitiTransport := http.DefaultTransport.(*http.Transport).Clone() // copy default transport zitiTransport.DialContext = Dial //zitiDialContext.Dial return http.Client{Transport: zitiTransport} diff --git a/version b/version index 5a9e6bda2..4950f07e4 100644 --- a/version +++ b/version @@ -1 +1 @@ -0.27 +0.28 diff --git a/ziti-fabric-test/subcmd/loop2/dialer.go b/ziti-fabric-test/subcmd/loop2/dialer.go index 0603f719c..19cea5dba 100644 --- a/ziti-fabric-test/subcmd/loop2/dialer.go +++ b/ziti-fabric-test/subcmd/loop2/dialer.go @@ -20,10 +20,9 @@ import ( "fmt" "github.com/michaelquigley/pfxlog" "github.com/openziti/fabric/router/xgress_transport" - "github.com/openziti/identity/dotziti" "github.com/openziti/identity" + "github.com/openziti/identity/dotziti" "github.com/openziti/sdk-golang/ziti" - "github.com/openziti/sdk-golang/ziti/config" "github.com/openziti/transport/v2" "github.com/openziti/ziti/ziti-fabric-test/subcmd/loop2/pb" "github.com/spf13/cobra" @@ -162,13 +161,17 @@ func (cmd *dialerCmd) connect() net.Conn { var context ziti.Context if cmd.edgeConfigFile != "" { - zitiCfg, err := config.NewFromFile(cmd.edgeConfigFile) + zitiCfg, err := ziti.NewConfigFromFile(cmd.edgeConfigFile) if err != nil { log.Fatalf("failed to load ziti configuration from %s: %v", cmd.edgeConfigFile, err) } - context = ziti.NewContextWithConfig(zitiCfg) + + context, err = ziti.NewContext(zitiCfg) + if err != nil { + log.Fatalf("failed to load ziti context fromt configuration: %v", err) + } } else { - context = ziti.NewContext() + log.Fatal("no configuration file provided") } service := strings.TrimPrefix(cmd.endpoint, "edge:") diff --git a/ziti-fabric-test/subcmd/loop2/listener.go b/ziti-fabric-test/subcmd/loop2/listener.go index 84e0daa95..f4487617e 100644 --- a/ziti-fabric-test/subcmd/loop2/listener.go +++ b/ziti-fabric-test/subcmd/loop2/listener.go @@ -18,10 +18,9 @@ package loop2 import ( "github.com/michaelquigley/pfxlog" - "github.com/openziti/identity/dotziti" "github.com/openziti/identity" + "github.com/openziti/identity/dotziti" "github.com/openziti/sdk-golang/ziti" - "github.com/openziti/sdk-golang/ziti/config" "github.com/openziti/transport/v2" "github.com/openziti/ziti/ziti-fabric-test/subcmd/loop2/pb" "github.com/spf13/cobra" @@ -85,13 +84,17 @@ func (cmd *listenerCmd) listenEdge() { var context ziti.Context if cmd.edgeConfigFile != "" { - zitiCfg, err := config.NewFromFile(cmd.edgeConfigFile) + zitiCfg, err := ziti.NewConfigFromFile(cmd.edgeConfigFile) if err != nil { log.Fatalf("failed to load ziti configuration from %s: %v", cmd.edgeConfigFile, err) } - context = ziti.NewContextWithConfig(zitiCfg) + + context, err = ziti.NewContext(zitiCfg) + if err != nil { + log.Fatalf("failed to load ziti context from cofnig: %v", err) + } } else { - context = ziti.NewContext() + log.Fatal("no configuration file provided") } service := strings.TrimPrefix(cmd.bindAddress, "edge:") diff --git a/ziti-fabric-test/subcmd/loop3/dialer.go b/ziti-fabric-test/subcmd/loop3/dialer.go index 0a1160ee9..ef47515c9 100644 --- a/ziti-fabric-test/subcmd/loop3/dialer.go +++ b/ziti-fabric-test/subcmd/loop3/dialer.go @@ -19,12 +19,11 @@ package loop3 import ( "fmt" "github.com/michaelquigley/pfxlog" - "github.com/openziti/fabric/router/xgress_transport" "github.com/openziti/agent" - "github.com/openziti/identity/dotziti" + "github.com/openziti/fabric/router/xgress_transport" "github.com/openziti/identity" + "github.com/openziti/identity/dotziti" "github.com/openziti/sdk-golang/ziti" - "github.com/openziti/sdk-golang/ziti/config" "github.com/openziti/transport/v2" "github.com/spf13/cobra" "net" @@ -158,13 +157,17 @@ func (cmd *dialerCmd) connect() net.Conn { if strings.HasPrefix(cmd.endpoint, "edge:") { var context ziti.Context if cmd.edgeConfigFile != "" { - zitiCfg, err := config.NewFromFile(cmd.edgeConfigFile) + zitiCfg, err := ziti.NewConfigFromFile(cmd.edgeConfigFile) if err != nil { log.Fatalf("failed to load ziti configuration from %s: %v", cmd.edgeConfigFile, err) } - context = ziti.NewContextWithConfig(zitiCfg) + context, err = ziti.NewContext(zitiCfg) + + if err != nil { + log.Fatalf("failed to load ziti context from config: %v", err) + } } else { - context = ziti.NewContext() + log.Fatal("no configuration provided") } service := strings.TrimPrefix(cmd.endpoint, "edge:") diff --git a/ziti-fabric-test/subcmd/loop3/listener.go b/ziti-fabric-test/subcmd/loop3/listener.go index e000fb09b..37cde75a9 100644 --- a/ziti-fabric-test/subcmd/loop3/listener.go +++ b/ziti-fabric-test/subcmd/loop3/listener.go @@ -20,10 +20,9 @@ import ( "errors" "github.com/michaelquigley/pfxlog" "github.com/openziti/agent" - "github.com/openziti/identity/dotziti" "github.com/openziti/identity" + "github.com/openziti/identity/dotziti" "github.com/openziti/sdk-golang/ziti" - "github.com/openziti/sdk-golang/ziti/config" "github.com/openziti/transport/v2" loop3_pb "github.com/openziti/ziti/ziti-fabric-test/subcmd/loop3/pb" "github.com/sirupsen/logrus" @@ -138,13 +137,17 @@ func (cmd *listenerCmd) listenEdge() { var context ziti.Context if cmd.edgeConfigFile != "" { - zitiCfg, err := config.NewFromFile(cmd.edgeConfigFile) + zitiCfg, err := ziti.NewConfigFromFile(cmd.edgeConfigFile) if err != nil { log.Fatalf("failed to load ziti configuration from %s: %v", cmd.edgeConfigFile, err) } - context = ziti.NewContextWithConfig(zitiCfg) + context, err = ziti.NewContext(zitiCfg) + + if err != nil { + log.Fatalf("failed to load ziti context from config: %v", err) + } } else { - context = ziti.NewContext() + log.Fatal("no configuration provided") } service := strings.TrimPrefix(cmd.bindAddress, "edge:") diff --git a/ziti-fabric-test/subcmd/loop3/metrics.go b/ziti-fabric-test/subcmd/loop3/metrics.go index b748746d3..b538fb48d 100644 --- a/ziti-fabric-test/subcmd/loop3/metrics.go +++ b/ziti-fabric-test/subcmd/loop3/metrics.go @@ -5,7 +5,6 @@ import ( "github.com/michaelquigley/pfxlog" "github.com/openziti/fabric/pb/mgmt_pb" "github.com/openziti/sdk-golang/ziti" - "github.com/openziti/sdk-golang/ziti/config" "github.com/pkg/errors" "github.com/rcrowley/go-metrics" "google.golang.org/protobuf/proto" @@ -69,13 +68,17 @@ func (r *zitiMetricsReporter) run(reportInterval time.Duration) { var client ziti.Context if r.configFile != "" { - sdkConfig, err := config.NewFromFile(r.configFile) + sdkConfig, err := ziti.NewConfigFromFile(r.configFile) + if err != nil { + panic(err) + } + client, err = ziti.NewContext(sdkConfig) + if err != nil { panic(err) } - client = ziti.NewContextWithConfig(sdkConfig) } else { - client = ziti.NewContext() + panic("no configuration file provided") } conn, err := client.Dial(r.service) diff --git a/ziti/cmd/agentcli/agent.go b/ziti/cmd/agentcli/agent.go index 57e11ee09..b18291a57 100644 --- a/ziti/cmd/agentcli/agent.go +++ b/ziti/cmd/agentcli/agent.go @@ -91,6 +91,7 @@ func NewAgentCmd(p common.OptionsProvider) *cobra.Command { agentCmd.AddCommand(routerCmd) routerCmd.AddCommand(NewRouteCmd(p)) + routerCmd.AddCommand(NewUnrouteCmd(p)) routerCmd.AddCommand(NewSimpleAgentCustomCmd("dump-api-sessions", AgentAppRouter, debugops.DumpApiSessions, p)) routerCmd.AddCommand(NewSimpleChAgentCustomCmd("dump-routes", AgentAppRouter, int32(mgmt_pb.ContentType_RouterDebugDumpForwarderTablesRequestType), p)) routerCmd.AddCommand(NewSimpleChAgentCustomCmd("dump-links", AgentAppRouter, int32(mgmt_pb.ContentType_RouterDebugDumpLinksRequestType), p)) @@ -202,15 +203,7 @@ func (self *AgentOptions) RunCopyOut(op byte, params []byte, out io.Writer) erro }) } - if len(self.Args) == 0 { - return self.MakeRequest(op, params, self.CopyToWriter(out)) - } - - addr, err := agent.ParseGopsAddress(self.Args) - if err != nil { - return err - } - return agent.MakeRequest(addr, op, params, os.Stdout) + return self.MakeRequest(op, params, self.CopyToWriter(out)) } func NewAgentChannel(conn net.Conn) (channel.Channel, error) { diff --git a/ziti/cmd/agentcli/agent_ps.go b/ziti/cmd/agentcli/agent_ps.go index f88bb48e0..71587e33b 100644 --- a/ziti/cmd/agentcli/agent_ps.go +++ b/ziti/cmd/agentcli/agent_ps.go @@ -19,20 +19,21 @@ package agentcli import ( "bytes" "fmt" - "github.com/keybase/go-ps" - "github.com/openziti/ziti/ziti/cmd/common" - cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers" - "github.com/pkg/errors" - "github.com/spf13/cobra" "os" "os/user" "path/filepath" "regexp" - goversion "rsc.io/goversion/version" "runtime" "strconv" "strings" "sync" + + "github.com/openziti/ziti/ziti/cmd/common" + cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers" + "github.com/pkg/errors" + "github.com/shirou/gopsutil/v3/process" + "github.com/spf13/cobra" + goversion "rsc.io/goversion/version" ) type AgentPsAction struct { @@ -149,7 +150,7 @@ type P struct { // FindAll returns all the Ziti processes currently running on this host. func FindAll() []P { - pss, err := ps.Processes() + pss, err := process.Processes() // fmt.Println("FindAll, err is: %s", err) if err != nil { @@ -172,11 +173,19 @@ func FindAll() []P { if !ok { return } + ppid, err := pr.Ppid() + if err != nil { + return + } + name, err := pr.Name() + if err != nil { + return + } if isZiti(pr) { found <- P{ - PID: pr.Pid(), - PPID: pr.PPid(), - Exec: pr.Executable(), + PID: int(pr.Pid), + PPID: int(ppid), + Exec: name, Path: path, BuildVersion: version, Agent: agent, @@ -199,12 +208,12 @@ func FindAll() []P { // in the process' binary and determines if the process // if a Go process or not. If the process is a Go process, // it reports PID, binary name and full path of the binary. -func isGo(pr ps.Process) (path, version string, agent, ok bool, err error) { - if pr.Pid() == 0 { +func isGo(pr *process.Process) (path, version string, agent, ok bool, err error) { + if pr.Pid == 0 { // ignore system process return } - path, err = pr.Path() + path, err = pr.Exe() if err != nil { return } @@ -215,7 +224,7 @@ func isGo(pr ps.Process) (path, version string, agent, ok bool, err error) { } ok = true version = versionInfo.Release - pidfile, err := PIDFile(pr.Pid()) + pidfile, err := PIDFile(int(pr.Pid)) if err == nil { _, err := os.Stat(pidfile) agent = err == nil @@ -256,6 +265,10 @@ func PIDFile(pid int) (string, error) { return fmt.Sprintf("%s/%d", gopsdir, pid), nil } -func isZiti(pr ps.Process) (ok bool) { - return strings.HasPrefix(pr.Executable(), "ziti") +func isZiti(pr *process.Process) (ok bool) { + name, err := pr.Name() + if err != nil { + return false + } + return strings.HasPrefix(name, "ziti") } diff --git a/ziti/cmd/agentcli/agent_router_add_route.go b/ziti/cmd/agentcli/agent_router_add_route.go index 71e338ed5..d88bcc11f 100644 --- a/ziti/cmd/agentcli/agent_router_add_route.go +++ b/ziti/cmd/agentcli/agent_router_add_route.go @@ -39,7 +39,7 @@ func NewRouteCmd(p common.OptionsProvider) *cobra.Command { } cmd := &cobra.Command{ - Args: cobra.RangeArgs(3, 4), + Args: cobra.ExactArgs(4), Use: "route ", RunE: func(cmd *cobra.Command, args []string) error { action.Cmd = cmd diff --git a/ziti/cmd/agentcli/agent_router_unroute.go b/ziti/cmd/agentcli/agent_router_unroute.go new file mode 100644 index 000000000..777ec5b3b --- /dev/null +++ b/ziti/cmd/agentcli/agent_router_unroute.go @@ -0,0 +1,88 @@ +/* + Copyright NetFoundry Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package agentcli + +import ( + "fmt" + "github.com/openziti/channel/v2" + "github.com/openziti/fabric/pb/ctrl_pb" + "github.com/openziti/fabric/pb/mgmt_pb" + "github.com/openziti/fabric/router" + "github.com/openziti/ziti/ziti/cmd/common" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" +) + +type AgentUnrouteAction struct { + AgentOptions +} + +func NewUnrouteCmd(p common.OptionsProvider) *cobra.Command { + action := &AgentUnrouteAction{ + AgentOptions: AgentOptions{ + CommonOptions: p(), + }, + } + + cmd := &cobra.Command{ + Args: cobra.ExactArgs(1), + Use: "unroute ", + RunE: func(cmd *cobra.Command, args []string) error { + action.Cmd = cmd + action.Args = args + return action.MakeChannelRequest(router.AgentAppId, action.makeRequest) + }, + } + + action.AddAgentOptions(cmd) + + return cmd +} + +func (self *AgentUnrouteAction) makeRequest(ch channel.Channel) error { + route := &ctrl_pb.Unroute{ + CircuitId: self.Args[0], + Now: true, + } + + buf, err := proto.Marshal(route) + if err != nil { + return err + } + + msg := channel.NewMessage(int32(mgmt_pb.ContentType_RouterDebugUnrouteRequestType), buf) + reply, err := msg.WithTimeout(self.timeout).SendForReply(ch) + if err != nil { + return err + } + + if reply.ContentType == channel.ContentTypeResultType { + result := channel.UnmarshalResult(reply) + if result.Success { + if len(result.Message) > 0 { + fmt.Printf("success: %v\n", result.Message) + } else { + fmt.Println("success") + } + } else { + fmt.Printf("error: %v\n", result.Message) + } + } else { + fmt.Printf("unexpected response type %v\n", reply.ContentType) + } + return nil +} diff --git a/ziti/cmd/agentcli/agent_set_channel_log_level.go b/ziti/cmd/agentcli/agent_set_channel_log_level.go index fe8ba3f71..0fb5a1d0d 100644 --- a/ziti/cmd/agentcli/agent_set_channel_log_level.go +++ b/ziti/cmd/agentcli/agent_set_channel_log_level.go @@ -43,9 +43,9 @@ func NewSetChannelLogLevelCmd(p common.OptionsProvider) *cobra.Command { } cmd := &cobra.Command{ - Use: "set-channel-log-level target channel log-level (panic, fatal, error, warn, info, debug, trace)", + Use: "set-channel-log-level channel log-level (panic, fatal, error, warn, info, debug, trace)", Short: "Sets a channel-specific log level in the target application", - Args: cobra.MinimumNArgs(2), + Args: cobra.ExactArgs(2), Run: func(cmd *cobra.Command, args []string) { action.Cmd = cmd action.Args = args @@ -68,15 +68,8 @@ func (self *AgentSetChannelLogLevelAction) Run() error { }) } - var channelArg string - var levelArg string - if len(self.Args) == 2 { - channelArg = self.Args[0] - levelArg = self.Args[1] - } else { - channelArg = self.Args[1] - levelArg = self.Args[2] - } + channelArg := self.Args[0] + levelArg := self.Args[1] var level logrus.Level var found bool @@ -98,13 +91,5 @@ func (self *AgentSetChannelLogLevelAction) Run() error { buf.Write([]byte(channelArg)) buf.WriteByte(byte(level)) - if len(self.Args) == 2 { - return self.MakeRequest(agent.SetChannelLogLevel, buf.Bytes(), self.CopyToWriter(os.Stdout)) - } - - addr, err := agent.ParseGopsAddress(self.Args) - if err != nil { - return err - } - return agent.MakeRequest(addr, agent.SetChannelLogLevel, buf.Bytes(), os.Stdout) + return self.MakeRequest(agent.SetChannelLogLevel, buf.Bytes(), self.CopyToWriter(os.Stdout)) } diff --git a/ziti/cmd/agentcli/agent_set_log_level.go b/ziti/cmd/agentcli/agent_set_log_level.go index 0c1d08bc5..9fe369417 100644 --- a/ziti/cmd/agentcli/agent_set_log_level.go +++ b/ziti/cmd/agentcli/agent_set_log_level.go @@ -41,9 +41,9 @@ func NewSetLogLevelCmd(p common.OptionsProvider) *cobra.Command { } cmd := &cobra.Command{ - Use: "set-log-level target log-level (panic, fatal, error, warn, info, debug, trace)", + Use: "set-log-level log-level (panic, fatal, error, warn, info, debug, trace)", Short: "Sets the global logrus logging level in the target application", - Args: cobra.MinimumNArgs(1), + Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { action.Cmd = cmd action.Args = args @@ -66,12 +66,7 @@ func (self *AgentSetLogLevelAction) Run() error { }) } - var levelArg string - if len(self.Args) == 1 { - levelArg = self.Args[0] - } else { - levelArg = self.Args[1] - } + levelArg := self.Args[0] var level logrus.Level var found bool @@ -87,14 +82,5 @@ func (self *AgentSetLogLevelAction) Run() error { } buf := []byte{byte(level)} - - if len(self.Args) == 1 { - return self.MakeRequest(agent.SetLogLevel, buf, self.CopyToWriter(os.Stdout)) - } - - addr, err := agent.ParseGopsAddress(self.Args) - if err != nil { - return err - } - return agent.MakeRequest(addr, agent.SetLogLevel, buf, os.Stdout) + return self.MakeRequest(agent.SetLogLevel, buf, self.CopyToWriter(os.Stdout)) } diff --git a/ziti/cmd/agentcli/agent_setgc.go b/ziti/cmd/agentcli/agent_setgc.go index 3d6176e53..824c8df52 100644 --- a/ziti/cmd/agentcli/agent_setgc.go +++ b/ziti/cmd/agentcli/agent_setgc.go @@ -40,9 +40,9 @@ func NewSetGcCmd(p common.OptionsProvider) *cobra.Command { } cmd := &cobra.Command{ - Use: "setgc target gc-percentage", + Use: "setgc gc-percentage", Short: "Sets the GC percentage in the target application", - Args: cobra.MinimumNArgs(1), + Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { action.Cmd = cmd action.Args = args @@ -65,12 +65,7 @@ func (self *AgentSetGcAction) Run() error { }) } - var pctArg string - if len(self.Args) == 1 { - pctArg = self.Args[0] - } else { - pctArg = self.Args[1] - } + pctArg := self.Args[0] perc, err := strconv.ParseInt(pctArg, 10, strconv.IntSize) if err != nil { @@ -79,14 +74,5 @@ func (self *AgentSetGcAction) Run() error { buf := make([]byte, binary.MaxVarintLen64) binary.PutVarint(buf, perc) - if len(self.Args) == 1 { - return self.MakeRequest(agent.SetGCPercent, buf, self.CopyToWriter(os.Stdout)) - } - - addr, err := agent.ParseGopsAddress(self.Args) - if err != nil { - return err - } - - return agent.MakeRequest(addr, agent.SetGCPercent, buf, os.Stdout) + return self.MakeRequest(agent.SetGCPercent, buf, self.CopyToWriter(os.Stdout)) } diff --git a/ziti/cmd/agentcli/agent_simple.go b/ziti/cmd/agentcli/agent_simple.go index ff8f0dc4c..35c9febe6 100644 --- a/ziti/cmd/agentcli/agent_simple.go +++ b/ziti/cmd/agentcli/agent_simple.go @@ -36,8 +36,8 @@ func NewSimpleAgentCmd(name string, op byte, p common.OptionsProvider, desc stri } cmd := &cobra.Command{ - Args: cobra.MaximumNArgs(1), - Use: name + " ", + Args: cobra.ExactArgs(0), + Use: name, Short: desc, RunE: func(cmd *cobra.Command, args []string) error { action.Cmd = cmd @@ -59,8 +59,8 @@ func NewSimpleAgentCustomCmd(name string, appId AgentAppId, op byte, p common.Op } cmd := &cobra.Command{ - Args: cobra.MaximumNArgs(1), - Use: name + " ", + Args: cobra.ExactArgs(0), + Use: name, Run: func(cmd *cobra.Command, args []string) { action.Cmd = cmd action.Args = args diff --git a/ziti/cmd/agentcli/agent_stack.go b/ziti/cmd/agentcli/agent_stack.go index afa1e3ffa..beccd997a 100644 --- a/ziti/cmd/agentcli/agent_stack.go +++ b/ziti/cmd/agentcli/agent_stack.go @@ -39,8 +39,8 @@ func NewStackCmd(p common.OptionsProvider) *cobra.Command { } cmd := &cobra.Command{ - Args: cobra.MaximumNArgs(1), - Use: "stack []", + Args: cobra.ExactArgs(0), + Use: "stack", Short: "Emits a go-routine stack dump from the target application", Run: func(cmd *cobra.Command, args []string) { action.Cmd = cmd diff --git a/ziti/cmd/demo/echo_server.go b/ziti/cmd/demo/echo_server.go index bfc304060..768b05606 100644 --- a/ziti/cmd/demo/echo_server.go +++ b/ziti/cmd/demo/echo_server.go @@ -24,7 +24,6 @@ import ( "github.com/openziti/channel/v2" "github.com/openziti/identity" "github.com/openziti/sdk-golang/ziti" - "github.com/openziti/sdk-golang/ziti/config" "github.com/openziti/sdk-golang/ziti/edge" "github.com/pkg/errors" "github.com/sirupsen/logrus" @@ -131,7 +130,7 @@ func (self *echoServer) run(*cobra.Command, []string) { } if self.configFile != "" { - zitiConfig, err := config.NewFromFile(self.configFile) + zitiConfig, err := ziti.NewConfigFromFile(self.configFile) if err != nil { log.WithError(err).Fatalf("ziti: unable to load ziti identity from [%v]", self.configFile) } @@ -140,7 +139,11 @@ func (self *echoServer) run(*cobra.Command, []string) { log.WithError(err).Fatalf("ziti: unable to create ziti identity from [%v]", self.configFile) } - zitiContext := ziti.NewContextWithConfig(zitiConfig) + zitiContext, err := ziti.NewContext(zitiConfig) + + if err != nil { + log.WithError(err).Fatal("unable to get create ziti context from config") + } zitiIdentity, err := zitiContext.GetCurrentIdentity() if err != nil { @@ -149,20 +152,20 @@ func (self *echoServer) run(*cobra.Command, []string) { listenOptions := ziti.DefaultListenOptions() listenOptions.BindUsingEdgeIdentity = self.bindWithIdentity - listenOptions.Cost = zitiIdentity.DefaultHostingCost - listenOptions.Precedence = ziti.GetPrecedenceForLabel(zitiIdentity.DefaultHostingPrecedence) + listenOptions.Cost = uint16(*zitiIdentity.DefaultHostingCost) + listenOptions.Precedence = ziti.GetPrecedenceForLabel(string(zitiIdentity.DefaultHostingPrecedence)) svc, found := zitiContext.GetService(self.service) if !found { log.WithError(err).Fatalf("ziti: unable to lookup service [%v]", self.service) } - if cost, found := zitiIdentity.ServiceHostingCosts[svc.Id]; found { - listenOptions.Cost = uint16(cost.(float64)) + if cost, found := zitiIdentity.ServiceHostingCosts[*svc.ID]; found { + listenOptions.Cost = uint16(*cost) } - if precedence, found := zitiIdentity.ServiceHostingPrecedences[svc.Id]; found { - listenOptions.Precedence = ziti.GetPrecedenceForLabel(precedence.(string)) + if precedence, found := zitiIdentity.ServiceHostingPrecedences[*svc.ID]; found { + listenOptions.Precedence = ziti.GetPrecedenceForLabel(string(precedence)) } log.Infof("ziti: hosting %v with addressable=%v, cost=%v, precedence=%v", diff --git a/ziti/cmd/demo/zcat.go b/ziti/cmd/demo/zcat.go index fda7d7ff9..3635cbc66 100644 --- a/ziti/cmd/demo/zcat.go +++ b/ziti/cmd/demo/zcat.go @@ -20,7 +20,6 @@ import ( "github.com/michaelquigley/pfxlog" "github.com/openziti/foundation/v2/info" "github.com/openziti/sdk-golang/ziti" - "github.com/openziti/sdk-golang/ziti/config" "github.com/sirupsen/logrus" "github.com/spf13/cobra" "io" @@ -97,7 +96,7 @@ func (self *zcatAction) run(_ *cobra.Command, args []string) { if network == "tcp" || network == "udp" { conn, err = net.Dial(network, addr) } else if network == "ziti" { - zitiConfig, cfgErr := config.NewFromFile(self.configFile) + zitiConfig, cfgErr := ziti.NewConfigFromFile(self.configFile) if cfgErr != nil { log.WithError(cfgErr).Fatalf("unable to load ziti identity from [%v]", self.configFile) } @@ -108,7 +107,11 @@ func (self *zcatAction) run(_ *cobra.Command, args []string) { addr = addr[atIdx+1:] } - zitiContext := ziti.NewContextWithConfig(zitiConfig) + zitiContext, ctxErr := ziti.NewContext(zitiConfig) + if ctxErr != nil { + pfxlog.Logger().WithError(err).Fatal("could not create sdk context from config") + } + dialOptions := &ziti.DialOptions{ ConnectTimeout: 5 * time.Second, Identity: dialIdentifier, diff --git a/ziti/cmd/edge/list.go b/ziti/cmd/edge/list.go index 623f2da7c..f5a7a28b8 100644 --- a/ziti/cmd/edge/list.go +++ b/ziti/cmd/edge/list.go @@ -983,12 +983,18 @@ func outputIdentities(o *api.Options, children []*gabs.Container, pagingInfo *ap for _, entity := range children { wrapper := api.Wrap(entity) + authPolicy := wrapper.String("authPolicy.name") + + if authPolicy == "" { + authPolicy = wrapper.String("authPolicyId") + } + t.AppendRow(table.Row{ wrapper.String("id"), wrapper.String("name"), wrapper.String("type.name"), strings.Join(wrapper.StringSlice("roleAttributes"), ","), - wrapper.String("authPolicyId")}) + authPolicy}) } api.RenderTable(o, t, pagingInfo) diff --git a/ziti/cmd/edge/login.go b/ziti/cmd/edge/login.go index 572a3970e..58cdfe428 100644 --- a/ziti/cmd/edge/login.go +++ b/ziti/cmd/edge/login.go @@ -17,6 +17,7 @@ package edge import ( + "crypto/tls" "fmt" "github.com/Jeffail/gabs" "github.com/openziti/foundation/v2/term" @@ -27,14 +28,16 @@ import ( "github.com/pkg/errors" "github.com/spf13/cobra" "io" + "net/http" "net/url" + "os" "path/filepath" "strings" "time" ) -// loginOptions are the flags for login commands -type loginOptions struct { +// LoginOptions are the flags for login commands +type LoginOptions struct { api.Options Username string Password string @@ -43,11 +46,14 @@ type loginOptions struct { ReadOnly bool Yes bool IgnoreConfig bool + ClientCert string + ClientKey string + ExtJwt string } // newLoginCmd creates the command func newLoginCmd(out io.Writer, errOut io.Writer) *cobra.Command { - options := &loginOptions{ + options := &LoginOptions{ Options: api.Options{ CommonOptions: common.CommonOptions{Out: out, Err: errOut}, }, @@ -73,17 +79,21 @@ func newLoginCmd(out io.Writer, errOut io.Writer) *cobra.Command { cmd.Flags().StringVarP(&options.Username, "username", "u", "", "username to use for authenticating to the Ziti Edge Controller ") cmd.Flags().StringVarP(&options.Password, "password", "p", "", "password to use for authenticating to the Ziti Edge Controller, if -u is supplied and -p is not, a value will be prompted for") cmd.Flags().StringVarP(&options.Token, "token", "t", "", "if an api token has already been acquired, it can be set in the config with this option. This will set the session to read only by default") - cmd.Flags().StringVarP(&options.CaCert, "cert", "c", "", "additional root certificates used by the Ziti Edge Controller") + cmd.Flags().StringVarP(&options.CaCert, "ca", "", "", "additional root certificates used by the Ziti Edge Controller") cmd.Flags().BoolVar(&options.ReadOnly, "read-only", false, "marks this login as read-only. Note: this is not a guarantee that nothing can be changed on the server. Care should still be taken!") cmd.Flags().BoolVarP(&options.Yes, "yes", "y", false, "If set, responds to prompts with yes. This will result in untrusted certs being accepted or updated.") cmd.Flags().BoolVar(&options.IgnoreConfig, "ignore-config", false, "If set, does not use value from the config file for hostname or username. Values must be entered or will be prompted for.") + cmd.Flags().StringVarP(&options.ClientCert, "client-cert", "c", "", "A certificate used to authenticate") + cmd.Flags().StringVarP(&options.ClientKey, "client-key", "k", "", "The key to use with certificate authentication") + cmd.Flags().StringVarP(&options.ExtJwt, "ext-jwt", "e", "", "A JWT from an external provider used to authenticate") + options.AddCommonFlags(cmd) return cmd } // Run implements this command -func (o *loginOptions) Run() error { +func (o *LoginOptions) Run() error { config, configFile, err := util.LoadRestClientConfig() if err != nil { return err @@ -140,7 +150,8 @@ func (o *loginOptions) Run() error { o.Println("NOTE: When using --token the saved identity will be marked as read-only unless --read-only=false is provided") } - if o.Token == "" { + body := "{}" + if o.Token == "" && o.ClientCert == "" && o.ExtJwt == "" { for o.Username == "" { if defaultId := config.EdgeIdentities[id]; defaultId != nil && defaultId.Username != "" && !o.IgnoreConfig { o.Username = defaultId.Username @@ -160,28 +171,28 @@ func (o *loginOptions) Run() error { _, _ = container.SetP(o.Username, "username") _, _ = container.SetP(o.Password, "password") - body := container.String() + body = container.String() + } - jsonParsed, err := util.EdgeControllerLogin(host, o.CaCert, body, o.Out, o.OutputJSONResponse, o.Options.Timeout, o.Options.Verbose) + jsonParsed, err := login(o, host, body) - if err != nil { - return err - } + if err != nil { + return err + } - if !jsonParsed.ExistsP("data.token") { - return fmt.Errorf("no session token returned from login request to %v. Received: %v", host, jsonParsed.String()) - } + if !jsonParsed.ExistsP("data.token") { + return fmt.Errorf("no session token returned from login request to %v. Received: %v", host, jsonParsed.String()) + } - var ok bool - o.Token, ok = jsonParsed.Path("data.token").Data().(string) + var ok bool + o.Token, ok = jsonParsed.Path("data.token").Data().(string) - if !ok { - return fmt.Errorf("session token returned from login request to %v is not in the expected format. Received: %v", host, jsonParsed.String()) - } + if !ok { + return fmt.Errorf("session token returned from login request to %v is not in the expected format. Received: %v", host, jsonParsed.String()) + } - if !o.OutputJSONResponse { - o.Printf("Token: %v\n", o.Token) - } + if !o.OutputJSONResponse { + o.Printf("Token: %v\n", o.Token) } loginIdentity := &util.RestClientEdgeIdentity{ @@ -201,7 +212,7 @@ func (o *loginOptions) Run() error { return err } -func (o *loginOptions) ConfigureCerts(host string, ctrlUrl *url.URL) error { +func (o *LoginOptions) ConfigureCerts(host string, ctrlUrl *url.URL) error { isServerTrusted, err := util.IsServerTrusted(host) if err != nil { return err @@ -275,7 +286,7 @@ func (o *loginOptions) ConfigureCerts(host string, ctrlUrl *url.URL) error { return nil } -func (o *loginOptions) askYesNo(prompt string) (bool, error) { +func (o *LoginOptions) askYesNo(prompt string) (bool, error) { filter := &yesNoFilter{} if _, err := o.ask(prompt, filter.Accept); err != nil { return false, err @@ -283,7 +294,7 @@ func (o *loginOptions) askYesNo(prompt string) (bool, error) { return filter.result, nil } -func (o *loginOptions) ask(prompt string, f func(string) bool) (string, error) { +func (o *LoginOptions) ask(prompt string, f func(string) bool) (string, error) { for { val, err := term.Prompt(prompt) if err != nil { @@ -314,3 +325,64 @@ func (self *yesNoFilter) Accept(s string) bool { return false } + +// EdgeControllerLogin will authenticate to the given Edge Controller +func login(o *LoginOptions, url string, authentication string) (*gabs.Container, error) { + client := util.NewClient() + cert := o.CaCert + out := o.Out + logJSON := o.OutputJSONResponse + timeout := o.Timeout + verbose := o.Verbose + method := "password" + if cert != "" { + client.SetRootCertificate(cert) + } + authHeader := "" + if o.ExtJwt != "" { + auth, err := os.ReadFile(o.ExtJwt) + if err != nil { + return nil, fmt.Errorf("couldn't load jwt file at %s: %v", o.ExtJwt, err) + } + method = "ext-jwt" + authHeader = "Bearer " + string(auth) + client.SetHeader("Authorization", authHeader) + } else { + if o.ClientCert != "" { + clientCert, err := tls.LoadX509KeyPair(o.ClientCert, o.ClientKey) + if err != nil { + return nil, fmt.Errorf("can't load client certificate: %s with key %s: %v", o.ClientCert, o.ClientKey, err) + } + client.SetCertificates(clientCert) + method = "cert" + } + } + + resp, err := client. + SetTimeout(time.Duration(time.Duration(timeout)*time.Second)). + SetDebug(verbose). + R(). + SetQueryParam("method", method). + SetHeader("Content-Type", "application/json"). + SetBody(authentication). + Post(url + "/authenticate") + + if err != nil { + return nil, fmt.Errorf("unable to authenticate to %v. Error: %v", url, err) + } + + if resp.StatusCode() != http.StatusOK { + return nil, fmt.Errorf("unable to authenticate to %v. Status code: %v, Server returned: %v", url, resp.Status(), util.PrettyPrintResponse(resp)) + } + + if logJSON { + util.OutputJson(out, resp.Body()) + } + + jsonParsed, err := gabs.ParseJSON(resp.Body()) + if err != nil { + return nil, fmt.Errorf("unable to parse response from %v. Server returned: %v", url, resp.String()) + } + + return jsonParsed, nil +} diff --git a/ziti/cmd/edge/traceroute.go b/ziti/cmd/edge/traceroute.go index 25fe33c5b..3ca982079 100644 --- a/ziti/cmd/edge/traceroute.go +++ b/ziti/cmd/edge/traceroute.go @@ -3,10 +3,10 @@ package edge import ( "fmt" "github.com/openziti/sdk-golang/ziti" - "github.com/openziti/sdk-golang/ziti/config" "github.com/openziti/ziti/ziti/cmd/api" "github.com/openziti/ziti/ziti/cmd/common" cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers" + "github.com/pkg/errors" "github.com/sirupsen/logrus" "github.com/spf13/cobra" "io" @@ -60,13 +60,16 @@ func newTraceRouteCmd(out io.Writer, errOut io.Writer) *cobra.Command { func (o *traceRouteOptions) Run() error { var ctx ziti.Context if o.configFile != "" { - cfg, err := config.NewFromFile(o.configFile) + cfg, err := ziti.NewConfigFromFile(o.configFile) + if err != nil { + return err + } + ctx, err = ziti.NewContext(cfg) if err != nil { return err } - ctx = ziti.NewContextWithConfig(cfg) } else { - ctx = ziti.NewContext() + return errors.New("invalid configuration file") } conn, err := ctx.Dial(o.Args[0]) diff --git a/ziti/cmd/edge/update_config_type.go b/ziti/cmd/edge/update_config_type.go index ab93d9a28..26323fc35 100644 --- a/ziti/cmd/edge/update_config_type.go +++ b/ziti/cmd/edge/update_config_type.go @@ -68,7 +68,7 @@ func newUpdateConfigTypeCmd(out io.Writer, errOut io.Writer) *cobra.Command { // runUpdateConfigType update a new config on the Ziti Edge Controller func (self *updateConfigTypeAction) run() error { - id, err := mapNameToID("configs", self.Args[0], self.Options) + id, err := mapNameToID("config-types", self.Args[0], self.Options) if err != nil { return err } @@ -108,7 +108,7 @@ func (self *updateConfigTypeAction) run() error { fmt.Printf("Failing parsing JSON: %+v\n", err) return errors.Errorf("unable to parse data as json: %v", err) } - api.SetJSONValue(entityData, dataMap, "data") + api.SetJSONValue(entityData, dataMap, "schema") change = true } @@ -116,7 +116,7 @@ func (self *updateConfigTypeAction) run() error { return errors.New("no change specified. must specify at least one attribute to change") } - _, err = patchEntityOfType(fmt.Sprintf("configs/%v", id), entityData.String(), &self.Options) + _, err = patchEntityOfType(fmt.Sprintf("config-types/%v", id), entityData.String(), &self.Options) return err } diff --git a/ziti/cmd/install/common_install.go b/ziti/cmd/install/common_install.go index bcc915817..c004079ef 100644 --- a/ziti/cmd/install/common_install.go +++ b/ziti/cmd/install/common_install.go @@ -19,6 +19,7 @@ package install import ( "fmt" "github.com/blang/semver" + "github.com/openziti/ziti/common/getziti" c "github.com/openziti/ziti/ziti/constants" "github.com/openziti/ziti/ziti/internal/log" "github.com/openziti/ziti/ziti/util" @@ -197,17 +198,13 @@ func (o *InstallOptions) getLatestTerraformProviderVersion(branch string, provid func (o *InstallOptions) getLatestGitHubReleaseVersion(zitiApp string) (semver.Version, error) { var result semver.Version - release, err := util.GetHighestVersionGitHubReleaseInfo(o.Verbose, zitiApp) + release, err := getziti.GetHighestVersionGitHubReleaseInfo(zitiApp, o.Verbose) if release != nil { result = release.SemVer } return result, err } -func (o *InstallOptions) getHighestVersionGitHubReleaseInfo(zitiApp string) (*util.GitHubReleasesData, error) { - return util.GetHighestVersionGitHubReleaseInfo(o.Verbose, zitiApp) -} - func (o *InstallOptions) getCurrentZitiSnapshotList() ([]string, error) { children, err := util.GetCurrentSnapshotListFromArtifactory(o.Verbose) @@ -330,70 +327,15 @@ func (o *InstallOptions) installTerraformProvider(branch string, provider string return os.Chmod(fileToChmod, 0755) } -func (o *InstallOptions) findVersionAndInstallGitHubRelease(zitiApp string, zitiAppGitHub string, upgrade bool, version string) error { - var latestVersion semver.Version - var err error - if version != "" { - if strings.Contains(version, "*") { - latestRelease, err := util.GetHighestVersionGitHubReleaseInfo(o.Verbose, zitiAppGitHub) - if err != nil { - return err - } - latestVersion = latestRelease.SemVer - version = latestVersion.String() - } else { - latestVersion, err = semver.Make(version) - if err != nil { - return err - } - } - } - - release, err := util.GetLatestGitHubReleaseAsset(o.Staging, zitiAppGitHub) - if err != nil { - return err - } - return o.installGitHubRelease(zitiApp, upgrade, release) -} - -func (o *InstallOptions) installGitHubRelease(zitiApp string, upgrade bool, release *util.GitHubReleasesData) error { +func (o *InstallOptions) FindVersionAndInstallGitHubRelease(upgrade bool, zitiApp string, zitiAppGitHub string, version string) error { binDir, err := util.BinaryLocation() if err != nil { return err } - binary := zitiApp - fileName := binary - if !upgrade { - f, flag, err := o.shouldInstallBinary(binDir, binary) - if err != nil || !flag { + if _, download, err := o.shouldInstallBinary(binDir, zitiApp); err != nil || !download { return err } - fileName = f - } - - fullPath := filepath.Join(binDir, fileName) - ext := ".zip" - zipFile := fullPath + ext - - releaseUrl, err := release.GetDownloadUrl(zitiApp) - if err != nil { - return err } - - err = util.DownloadGitHubReleaseAsset(releaseUrl, zipFile) - if err != nil { - return err - } - - err = util.Unzip(zipFile, binDir) - if err != nil { - return err - } - err = os.Remove(zipFile) - if err != nil { - return err - } - log.Infof("Successfully installed '%s' version '%s'\n", zitiApp, release.SemVer) - return os.Chmod(fullPath, 0755) + return getziti.FindVersionAndInstallGitHubRelease(zitiApp, zitiAppGitHub, runtime.GOOS, runtime.GOARCH, binDir, version, o.Verbose) } diff --git a/ziti/cmd/install/install_ziti_edge_tunnel.go b/ziti/cmd/install/install_ziti_edge_tunnel.go index bf42c6143..74725f3b3 100644 --- a/ziti/cmd/install/install_ziti_edge_tunnel.go +++ b/ziti/cmd/install/install_ziti_edge_tunnel.go @@ -17,15 +17,16 @@ package install import ( + "github.com/blang/semver" + "github.com/openziti/ziti/common/getziti" "github.com/openziti/ziti/ziti/cmd/common" cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers" "github.com/openziti/ziti/ziti/cmd/templates" - "io" - - "github.com/blang/semver" c "github.com/openziti/ziti/ziti/constants" "github.com/openziti/ziti/ziti/internal/log" "github.com/spf13/cobra" + "io" + "strings" ) var ( @@ -77,19 +78,20 @@ func NewCmdInstallZitiEdgeTunnel(out io.Writer, errOut io.Writer) *cobra.Command // Run implements the command func (o *InstallOptions) installZitiEdgeTunnel(targetVersion string) error { - newVersion, err := o.getLatestGitHubReleaseVersion(c.ZITI_EDGE_TUNNEL_GITHUB) - if err != nil { - return err - } + var newVersion semver.Version if targetVersion != "" { - newVersion, err = semver.Make(targetVersion) + newVersion = semver.MustParse(strings.TrimPrefix(targetVersion, "v")) + } else { + v, err := getziti.GetLatestGitHubReleaseVersion(c.ZITI_EDGE_TUNNEL_GITHUB, o.Verbose) + if err != nil { + return err + } + newVersion = v } log.Infoln("Attempting to install '" + c.ZITI_EDGE_TUNNEL + "' version: " + newVersion.String()) - - return o.findVersionAndInstallGitHubRelease(c.ZITI_EDGE_TUNNEL, c.ZITI_EDGE_TUNNEL_GITHUB, false, newVersion.String()) - + return o.FindVersionAndInstallGitHubRelease(false, c.ZITI_EDGE_TUNNEL, c.ZITI_EDGE_TUNNEL_GITHUB, newVersion.String()) } // Run implements the command diff --git a/ziti/cmd/install/install_ziti_prox_c.go b/ziti/cmd/install/install_ziti_prox_c.go index 50de6ff70..ec79a4bb2 100644 --- a/ziti/cmd/install/install_ziti_prox_c.go +++ b/ziti/cmd/install/install_ziti_prox_c.go @@ -17,15 +17,16 @@ package install import ( + "github.com/blang/semver" + "github.com/openziti/ziti/common/getziti" "github.com/openziti/ziti/ziti/cmd/common" cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers" "github.com/openziti/ziti/ziti/cmd/templates" c "github.com/openziti/ziti/ziti/constants" "github.com/openziti/ziti/ziti/internal/log" - "io" - - "github.com/blang/semver" "github.com/spf13/cobra" + "io" + "strings" ) var ( @@ -76,20 +77,20 @@ func NewCmdInstallZitiProxC(out io.Writer, errOut io.Writer) *cobra.Command { } func (o *InstallOptions) installZitiProxC(targetVersion string) error { + var newVersion semver.Version + if targetVersion != "" { - version, err := semver.Make(targetVersion) + newVersion = semver.MustParse(strings.TrimPrefix(targetVersion, "v")) + } else { + v, err := getziti.GetLatestGitHubReleaseVersion(c.ZITI_SDK_C_GITHUB, o.Verbose) if err != nil { return err } - return o.findVersionAndInstallGitHubRelease(c.ZITI_PROX_C, c.ZITI_SDK_C_GITHUB, false, version.String()) + newVersion = v } - release, err := o.getHighestVersionGitHubReleaseInfo(c.ZITI_SDK_C_GITHUB) - if err != nil { - return err - } - log.Infoln("Attempting to install '" + c.ZITI_PROX_C + "' version: " + release.SemVer.String()) - return o.installGitHubRelease(c.ZITI_PROX_C, false, release) + log.Infoln("Attempting to install '" + c.ZITI_PROX_C + "' version: " + newVersion.String()) + return o.FindVersionAndInstallGitHubRelease(false, c.ZITI_PROX_C, c.ZITI_SDK_C_GITHUB, newVersion.String()) } // Run implements the command diff --git a/ziti/cmd/install/upgrade_ziti_controller.go b/ziti/cmd/install/upgrade_ziti_controller.go index b42e3aa80..ed2a3720b 100644 --- a/ziti/cmd/install/upgrade_ziti_controller.go +++ b/ziti/cmd/install/upgrade_ziti_controller.go @@ -17,25 +17,8 @@ package install import ( - "github.com/openziti/ziti/ziti/cmd/common" - "io" - "github.com/openziti/ziti/common/version" - cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers" - "github.com/openziti/ziti/ziti/cmd/templates" c "github.com/openziti/ziti/ziti/constants" - "github.com/spf13/cobra" -) - -var ( - upgradeZitiControllerLong = templates.LongDesc(` - Upgrades the Ziti Controller app if there is a newer release -`) - - upgradeZitiControllerExample = templates.Examples(` - # Upgrades the Ziti Controller app - ziti upgrade ziti-controller - `) ) // UpgradeZitiControllerOptions the options for the upgrade ziti-controller command @@ -45,35 +28,6 @@ type UpgradeZitiControllerOptions struct { Version string } -// NewCmdUpgradeZitiController defines the command -func NewCmdUpgradeZitiController(out io.Writer, errOut io.Writer) *cobra.Command { - options := &UpgradeZitiControllerOptions{ - InstallOptions: InstallOptions{ - CommonOptions: common.CommonOptions{ - Out: out, - Err: errOut, - }, - }, - } - - cmd := &cobra.Command{ - Use: "ziti-controller", - Short: "Upgrades the Ziti Controller app - if there is a new version available", - Aliases: []string{"controller", "ctrl", "zc"}, - Long: upgradeZitiControllerLong, - Example: upgradeZitiControllerExample, - Run: func(cmd *cobra.Command, args []string) { - options.Cmd = cmd - options.Args = args - err := options.Run() - cmdhelper.CheckErr(err) - }, - } - cmd.Flags().StringVarP(&options.Version, "version", "v", "", "The specific version to upgrade to") - options.AddCommonFlags(cmd) - return cmd -} - // Run implements the command func (o *UpgradeZitiControllerOptions) Run() error { newVersion, err := o.getLatestZitiAppVersion(version.GetBranch(), c.ZITI_CONTROLLER) diff --git a/ziti/cmd/install/upgrade_ziti_edge_tunnel.go b/ziti/cmd/install/upgrade_ziti_edge_tunnel.go index 0bd73af45..1794669a1 100644 --- a/ziti/cmd/install/upgrade_ziti_edge_tunnel.go +++ b/ziti/cmd/install/upgrade_ziti_edge_tunnel.go @@ -17,24 +17,7 @@ package install import ( - "github.com/openziti/ziti/ziti/cmd/common" - "io" - - cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers" - "github.com/openziti/ziti/ziti/cmd/templates" c "github.com/openziti/ziti/ziti/constants" - "github.com/spf13/cobra" -) - -var ( - upgradeZitiEdgeTunnelLong = templates.LongDesc(` - Upgrades the Ziti Edge Tunnel app if there is a newer release -`) - - upgradeZitiEdgeTunnelExample = templates.Examples(` - # Upgrades the Ziti Edge Tunnel app - ziti upgrade ziti-edge-tunnel - `) ) // UpgradeZitiEdgeTunnelOptions the options for the upgrade ziti-edge-tunnel command @@ -44,35 +27,6 @@ type UpgradeZitiEdgeTunnelOptions struct { Version string } -// NewCmdUpgradeZitiEdgeTunnel defines the command -func NewCmdUpgradeZitiEdgeTunnel(out io.Writer, errOut io.Writer) *cobra.Command { - options := &UpgradeZitiEdgeTunnelOptions{ - InstallOptions: InstallOptions{ - CommonOptions: common.CommonOptions{ - Out: out, - Err: errOut, - }, - }, - } - - cmd := &cobra.Command{ - Use: "ziti-edge-tunnel", - Short: "Upgrades the Ziti Edge Tunnel app - if there is a new version available", - Aliases: []string{"edge-tunnel", "et"}, - Long: upgradeZitiEdgeTunnelLong, - Example: upgradeZitiEdgeTunnelExample, - Run: func(cmd *cobra.Command, args []string) { - options.Cmd = cmd - options.Args = args - err := options.Run() - cmdhelper.CheckErr(err) - }, - } - cmd.Flags().StringVarP(&options.Version, "version", "v", "", "The specific version to upgrade to") - options.AddCommonFlags(cmd) - return cmd -} - // Run implements the command func (o *UpgradeZitiEdgeTunnelOptions) Run() error { newVersion, err := o.getLatestGitHubReleaseVersion(c.ZITI_EDGE_TUNNEL_GITHUB) @@ -88,5 +42,5 @@ func (o *UpgradeZitiEdgeTunnelOptions) Run() error { o.deleteInstalledBinary(c.ZITI_EDGE_TUNNEL) - return o.findVersionAndInstallGitHubRelease(c.ZITI_EDGE_TUNNEL, c.ZITI_EDGE_TUNNEL_GITHUB, true, newVersionStr) + return o.FindVersionAndInstallGitHubRelease(true, c.ZITI_EDGE_TUNNEL, c.ZITI_EDGE_TUNNEL_GITHUB, newVersionStr) } diff --git a/ziti/cmd/install/upgrade_ziti_prox_c.go b/ziti/cmd/install/upgrade_ziti_prox_c.go index db6ae533f..620ac1cf3 100644 --- a/ziti/cmd/install/upgrade_ziti_prox_c.go +++ b/ziti/cmd/install/upgrade_ziti_prox_c.go @@ -17,24 +17,7 @@ package install import ( - "github.com/openziti/ziti/ziti/cmd/common" - "io" - - cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers" - "github.com/openziti/ziti/ziti/cmd/templates" c "github.com/openziti/ziti/ziti/constants" - "github.com/spf13/cobra" -) - -var ( - upgradeZitiProxCLong = templates.LongDesc(` - Upgrades the Ziti ProxC app if there is a newer release -`) - - upgradeZitiProxCExample = templates.Examples(` - # Upgrades the Ziti ProxC app - ziti upgrade ziti-prox-c - `) ) // UpgradeZitiProxCOptions the options for the upgrade ziti-prox-c command @@ -44,35 +27,6 @@ type UpgradeZitiProxCOptions struct { Version string } -// NewCmdUpgradeZitiProxC defines the command -func NewCmdUpgradeZitiProxC(out io.Writer, errOut io.Writer) *cobra.Command { - options := &UpgradeZitiProxCOptions{ - InstallOptions: InstallOptions{ - CommonOptions: common.CommonOptions{ - Out: out, - Err: errOut, - }, - }, - } - - cmd := &cobra.Command{ - Use: "ziti-prox-c", - Short: "Upgrades the Ziti ProxC app - if there is a new version available", - Aliases: []string{"proxc"}, - Long: upgradeZitiProxCLong, - Example: upgradeZitiProxCExample, - Run: func(cmd *cobra.Command, args []string) { - options.Cmd = cmd - options.Args = args - err := options.Run() - cmdhelper.CheckErr(err) - }, - } - cmd.Flags().StringVarP(&options.Version, "version", "v", "", "The specific version to upgrade to") - options.AddCommonFlags(cmd) - return cmd -} - // Run implements the command func (o *UpgradeZitiProxCOptions) Run() error { newVersion, err := o.getLatestGitHubReleaseVersion(c.ZITI_SDK_C_GITHUB) @@ -88,5 +42,5 @@ func (o *UpgradeZitiProxCOptions) Run() error { o.deleteInstalledBinary(c.ZITI_PROX_C) - return o.findVersionAndInstallGitHubRelease(c.ZITI_PROX_C, c.ZITI_SDK_C_GITHUB, true, newVersionStr) + return o.FindVersionAndInstallGitHubRelease(true, c.ZITI_PROX_C, c.ZITI_SDK_C_GITHUB, newVersionStr) } diff --git a/ziti/cmd/install/upgrade_ziti_router.go b/ziti/cmd/install/upgrade_ziti_router.go index 43aaabfc3..e584f694c 100644 --- a/ziti/cmd/install/upgrade_ziti_router.go +++ b/ziti/cmd/install/upgrade_ziti_router.go @@ -17,25 +17,8 @@ package install import ( - "github.com/openziti/ziti/ziti/cmd/common" - "io" - "github.com/openziti/ziti/common/version" - cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers" - "github.com/openziti/ziti/ziti/cmd/templates" c "github.com/openziti/ziti/ziti/constants" - "github.com/spf13/cobra" -) - -var ( - upgradeZitiRouterLong = templates.LongDesc(` - Upgrades the Ziti Router app if there is a newer release -`) - - upgradeZitiRouterExample = templates.Examples(` - # Upgrades the Ziti Router app - ziti upgrade ziti-router - `) ) // UpgradeZitiRouterOptions the options for the upgrade ziti-router command @@ -45,35 +28,6 @@ type UpgradeZitiRouterOptions struct { Version string } -// NewCmdUpgradeZitiRouter defines the command -func NewCmdUpgradeZitiRouter(out io.Writer, errOut io.Writer) *cobra.Command { - options := &UpgradeZitiRouterOptions{ - InstallOptions: InstallOptions{ - CommonOptions: common.CommonOptions{ - Out: out, - Err: errOut, - }, - }, - } - - cmd := &cobra.Command{ - Use: "ziti-router", - Short: "Upgrades the Ziti Router app - if there is a new version available", - Aliases: []string{"router", "rtr", "r"}, - Long: upgradeZitiRouterLong, - Example: upgradeZitiRouterExample, - Run: func(cmd *cobra.Command, args []string) { - options.Cmd = cmd - options.Args = args - err := options.Run() - cmdhelper.CheckErr(err) - }, - } - cmd.Flags().StringVarP(&options.Version, "version", "v", "", "The specific version to upgrade to") - options.AddCommonFlags(cmd) - return cmd -} - // Run implements the command func (o *UpgradeZitiRouterOptions) Run() error { newVersion, err := o.getLatestZitiAppVersion(version.GetBranch(), c.ZITI_ROUTER) diff --git a/ziti/cmd/install/upgrade_ziti_tunnel.go b/ziti/cmd/install/upgrade_ziti_tunnel.go index 6cd16cc35..254a2d27c 100644 --- a/ziti/cmd/install/upgrade_ziti_tunnel.go +++ b/ziti/cmd/install/upgrade_ziti_tunnel.go @@ -17,25 +17,8 @@ package install import ( - "github.com/openziti/ziti/ziti/cmd/common" - "io" - "github.com/openziti/ziti/common/version" - cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers" - "github.com/openziti/ziti/ziti/cmd/templates" c "github.com/openziti/ziti/ziti/constants" - "github.com/spf13/cobra" -) - -var ( - upgradeZitiTunnelLong = templates.LongDesc(` - Upgrades the Ziti Tunnel app if there is a newer release -`) - - upgradeZitiTunnelExample = templates.Examples(` - # Upgrades the Ziti Tunnel app - ziti upgrade ziti-tunnel - `) ) // UpgradeZitiTunnelOptions the options for the upgrade ziti-tunnel command @@ -45,35 +28,6 @@ type UpgradeZitiTunnelOptions struct { Version string } -// NewCmdUpgradeZitiTunnel defines the command -func NewCmdUpgradeZitiTunnel(out io.Writer, errOut io.Writer) *cobra.Command { - options := &UpgradeZitiTunnelOptions{ - InstallOptions: InstallOptions{ - CommonOptions: common.CommonOptions{ - Out: out, - Err: errOut, - }, - }, - } - - cmd := &cobra.Command{ - Use: "ziti-tunnel", - Short: "Upgrades the Ziti Tunnel app - if there is a new version available", - Aliases: []string{"tunnel", "rtr", "r"}, - Long: upgradeZitiTunnelLong, - Example: upgradeZitiTunnelExample, - Run: func(cmd *cobra.Command, args []string) { - options.Cmd = cmd - options.Args = args - err := options.Run() - cmdhelper.CheckErr(err) - }, - } - cmd.Flags().StringVarP(&options.Version, "version", "v", "", "The specific version to upgrade to") - options.AddCommonFlags(cmd) - return cmd -} - // Run implements the command func (o *UpgradeZitiTunnelOptions) Run() error { newVersion, err := o.getLatestZitiAppVersion(version.GetBranch(), c.ZITI_TUNNEL) diff --git a/ziti/cmd/pki_create_ca.go b/ziti/cmd/pki_create_ca.go index c263ef0ba..9f1f4e187 100644 --- a/ziti/cmd/pki_create_ca.go +++ b/ziti/cmd/pki_create_ca.go @@ -17,6 +17,7 @@ package cmd import ( + "github.com/openziti/fabric/controller/idgen" cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers" "github.com/openziti/ziti/ziti/internal/log" "github.com/openziti/ziti/ziti/pki/certificate" @@ -62,10 +63,12 @@ func NewCmdPKICreateCA(out io.Writer, errOut io.Writer) *cobra.Command { return cmd } +const FlagCaName = "ca-name" + func (o *PKICreateCAOptions) addPKICreateCAFlags(cmd *cobra.Command) { cmd.Flags().StringVarP(&o.Flags.PKIRoot, "pki-root", "", "", "Directory in which PKI resides") cmd.Flags().StringVarP(&o.Flags.CAFile, "ca-file", "", "", "Dir/File name (within PKI_ROOT) in which to store new CA") - cmd.Flags().StringVarP(&o.Flags.CAName, "ca-name", "", "NetFoundry Inc. Certificate Authority", "Name of CA") + cmd.Flags().StringVarP(&o.Flags.CAName, FlagCaName, "", "NetFoundry Inc. Certificate Authority", "Name of CA") cmd.Flags().IntVarP(&o.Flags.CAExpire, "expire-limit", "", 3650, "Expiration limit in days") cmd.Flags().IntVarP(&o.Flags.CAMaxpath, "max-path-len", "", -1, "Intermediate maximum path length") cmd.Flags().IntVarP(&o.Flags.CAPrivateKeySize, "private-key-size", "", 4096, "Size of the private key") @@ -88,6 +91,11 @@ func (o *PKICreateCAOptions) Run() error { return err } + if !o.Cmd.Flags().Changed(FlagCaName) { + //default name, ensure uniqueness by adding a random id + o.Flags.CAName = o.Flags.CAName + " " + idgen.New() + } + commonName := o.Flags.CAName filename := o.ObtainFileName(cafile, commonName) diff --git a/ziti/cmd/pki_create_client.go b/ziti/cmd/pki_create_client.go index 8ed3c145c..4d4f70aaf 100644 --- a/ziti/cmd/pki_create_client.go +++ b/ziti/cmd/pki_create_client.go @@ -17,6 +17,7 @@ package cmd import ( + "github.com/openziti/fabric/controller/idgen" cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers" "github.com/openziti/ziti/ziti/internal/log" "github.com/openziti/ziti/ziti/pki/certificate" @@ -62,12 +63,14 @@ func NewCmdPKICreateClient(out io.Writer, errOut io.Writer) *cobra.Command { return cmd } +const FlagCaClientName = "client-name" + func (o *PKICreateClientOptions) addPKICreateClientFlags(cmd *cobra.Command) { cmd.Flags().StringVarP(&o.Flags.PKIRoot, "pki-root", "", "", "Directory in which PKI resides") cmd.Flags().StringVarP(&o.Flags.CAName, "ca-name", "", "intermediate", "Name of Intermediate CA (within PKI_ROOT) to use to sign the new Client certificate") cmd.Flags().StringVarP(&o.Flags.ClientFile, "client-file", "", "client", "Name of file (under chosen CA) in which to store new Client certificate and private key") cmd.Flags().StringVarP(&o.Flags.KeyFile, "key-file", "", "", "Name of file (under chosen CA) containing private key to use when generating Client certificate") - cmd.Flags().StringVarP(&o.Flags.ClientName, "client-name", "", "NetFoundry Inc. Client", "Common Name (CN) to use for new Client certificate") + cmd.Flags().StringVarP(&o.Flags.ClientName, FlagCaClientName, "", "NetFoundry Inc. Client", "Common Name (CN) to use for new Client certificate") cmd.Flags().StringSliceVar(&o.Flags.Email, "email", []string{}, "Email addr(s) to add to Subject Alternate Name (SAN) for new Client certificate") cmd.Flags().IntVarP(&o.Flags.CAExpire, "expire-limit", "", 365, "Expiration limit in days") cmd.Flags().IntVarP(&o.Flags.CAMaxpath, "max-path-len", "", -1, "Intermediate maximum path length") @@ -86,6 +89,10 @@ func (o *PKICreateClientOptions) Run() error { local := o.Flags.PKI.Store.(*store.Local) local.Root = pkiroot + if !o.Cmd.Flags().Changed(FlagCaClientName) { + o.Flags.ClientName = o.Flags.ClientName + " " + idgen.New() + } + commonName := o.Flags.ClientName clientCertFile, err := o.ObtainClientCertFile() diff --git a/ziti/cmd/pki_create_intermediate.go b/ziti/cmd/pki_create_intermediate.go index eb921a6cf..0b1648204 100644 --- a/ziti/cmd/pki_create_intermediate.go +++ b/ziti/cmd/pki_create_intermediate.go @@ -17,6 +17,7 @@ package cmd import ( + "github.com/openziti/fabric/controller/idgen" cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers" "github.com/openziti/ziti/ziti/internal/log" "github.com/openziti/ziti/ziti/pki/certificate" @@ -61,11 +62,13 @@ func NewCmdPKICreateIntermediate(out io.Writer, errOut io.Writer) *cobra.Command return cmd } +const FlagCaIntermediateName = "intermediate-name" + func (o *PKICreateIntermediateOptions) addPKICreateIntermediateFlags(cmd *cobra.Command) { cmd.Flags().StringVarP(&o.Flags.PKIRoot, "pki-root", "", "", "Directory in which PKI resides") cmd.Flags().StringVarP(&o.Flags.CAName, "ca-name", "", "ca", "Name of CA (within PKI_ROOT) to use to sign the new Intermediate CA") cmd.Flags().StringVarP(&o.Flags.IntermediateFile, "intermediate-file", "", "intermediate", "Dir/File name (within PKI_ROOT) in which to store new Intermediate CA") - cmd.Flags().StringVarP(&o.Flags.IntermediateName, "intermediate-name", "", "NetFoundry Inc. Intermediate CA", "Common Name (CN) to use for new Intermediate CA") + cmd.Flags().StringVarP(&o.Flags.IntermediateName, FlagCaIntermediateName, "", "NetFoundry Inc. Intermediate CA", "Common Name (CN) to use for new Intermediate CA") cmd.Flags().IntVarP(&o.Flags.CAExpire, "expire-limit", "", 3650, "Expiration limit in days") cmd.Flags().IntVarP(&o.Flags.CAMaxpath, "max-path-len", "", 0, "Intermediate maximum path length") cmd.Flags().IntVarP(&o.Flags.CAPrivateKeySize, "private-key-size", "", 4096, "Size of the private key") @@ -87,6 +90,10 @@ func (o *PKICreateIntermediateOptions) Run() error { return err } + if !o.Cmd.Flags().Changed(FlagCaIntermediateName) { + o.Flags.IntermediateName = o.Flags.IntermediateName + " " + idgen.New() + } + commonName := o.Flags.IntermediateName filename := o.ObtainFileName(intermediatefile, commonName) diff --git a/ziti/cmd/pki_create_server.go b/ziti/cmd/pki_create_server.go index 59e959189..7a3e5995e 100644 --- a/ziti/cmd/pki_create_server.go +++ b/ziti/cmd/pki_create_server.go @@ -17,6 +17,7 @@ package cmd import ( + "github.com/openziti/fabric/controller/idgen" cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers" "github.com/openziti/ziti/ziti/internal/log" "github.com/openziti/ziti/ziti/pki/certificate" @@ -62,12 +63,14 @@ func NewCmdPKICreateServer(out io.Writer, errOut io.Writer) *cobra.Command { return cmd } +const FlagCaServerName = "server-name" + func (o *PKICreateServerOptions) addPKICreateServerFlags(cmd *cobra.Command) { cmd.Flags().StringVarP(&o.Flags.PKIRoot, "pki-root", "", "", "Directory in which PKI resides") cmd.Flags().StringVarP(&o.Flags.CAName, "ca-name", "", "intermediate", "Name of Intermediate CA (within PKI_ROOT) to use to sign the new Server certificate") cmd.Flags().StringVarP(&o.Flags.ServerFile, "server-file", "", "server", "Name of file (under chosen CA) in which to store new Server certificate and private key") cmd.Flags().StringVarP(&o.Flags.KeyFile, "key-file", "", "", "Name of file (under chosen CA) containing private key to use when generating Server certificate") - cmd.Flags().StringVarP(&o.Flags.ServerName, "server-name", "", "NetFoundry Inc. Server", "Common Name (CN) to use for new Server certificate") + cmd.Flags().StringVarP(&o.Flags.ServerName, FlagCaServerName, "", "NetFoundry Inc. Server", "Common Name (CN) to use for new Server certificate") cmd.Flags().StringSliceVar(&o.Flags.DNSName, "dns", []string{}, "DNS name(s) to add to Subject Alternate Name (SAN) for new Server certificate") cmd.Flags().StringSliceVar(&o.Flags.IP, "ip", []string{}, "IP addr(s) to add to Subject Alternate Name (SAN) for new Server certificate") cmd.Flags().IntVarP(&o.Flags.CAExpire, "expire-limit", "", 365, "Expiration limit in days") @@ -92,6 +95,10 @@ func (o *PKICreateServerOptions) Run() error { local := o.Flags.PKI.Store.(*store.Local) local.Root = pkiroot + if !o.Cmd.Flags().Changed(FlagCaServerName) { + o.Flags.ServerName = o.Flags.ServerName + " " + idgen.New() + } + commonName := o.Flags.ServerName serverCertFile, err := o.ObtainServerCertFile() diff --git a/ziti/cmd/tutorial/ziti_echo_client.go b/ziti/cmd/tutorial/ziti_echo_client.go index dca6c0fca..df698d7e1 100644 --- a/ziti/cmd/tutorial/ziti_echo_client.go +++ b/ziti/cmd/tutorial/ziti_echo_client.go @@ -21,7 +21,6 @@ import ( "fmt" "github.com/fatih/color" "github.com/openziti/sdk-golang/ziti" - "github.com/openziti/sdk-golang/ziti/config" "io" "net" "net/http" @@ -31,12 +30,16 @@ import ( ) func NewZitiEchoClient(identityJson string) (*zitiEchoClient, error) { - config, err := config.NewFromFile(identityJson) + config, err := ziti.NewConfigFromFile(identityJson) if err != nil { return nil, err } - zitiContext := ziti.NewContextWithConfig(config) + zitiContext, err := ziti.NewContext(config) + + if err != nil { + return nil, err + } dial := func(_ context.Context, _ string, addr string) (net.Conn, error) { service := strings.Split(addr, ":")[0] // assume host is service diff --git a/ziti/cmd/tutorial/ziti_echo_server.go b/ziti/cmd/tutorial/ziti_echo_server.go index a5d451e10..aa786d048 100644 --- a/ziti/cmd/tutorial/ziti_echo_server.go +++ b/ziti/cmd/tutorial/ziti_echo_server.go @@ -23,7 +23,6 @@ import ( "github.com/fatih/color" "github.com/openziti/sdk-golang/ziti" - "github.com/openziti/sdk-golang/ziti/config" ) type zitiEchoServer struct { @@ -43,12 +42,17 @@ func (s *zitiEchoServer) ServeHTTP(rw http.ResponseWriter, r *http.Request) { } func (s *zitiEchoServer) run() (err error) { - config, err := config.NewFromFile(s.identityJson) + config, err := ziti.NewConfigFromFile(s.identityJson) if err != nil { return err } - zitiContext := ziti.NewContextWithConfig(config) + zitiContext, err := ziti.NewContext(config) + + if err != nil { + panic(err) + } + if s.listener, err = zitiContext.Listen("echo"); err != nil { return err } diff --git a/ziti/controller/delete_sessions.go b/ziti/controller/delete_sessions.go index 6524f99c9..c88b8c389 100644 --- a/ziti/controller/delete_sessions.go +++ b/ziti/controller/delete_sessions.go @@ -181,10 +181,8 @@ func deleteSessions(db boltz.Db) { pfxlog.Logger().Errorf("could not read databse stats: %v", err) } - err = db.Update(func(tx *bbolt.Tx) error { - - root := tx.Bucket([]byte("ziti")) - + err = db.Update(nil, func(ctx boltz.MutateContext) error { + root := ctx.Tx().Bucket([]byte("ziti")) if root == nil { return errors.New("root 'ziti' bucket not found") } diff --git a/ziti/router/enrollgw.go b/ziti/router/enrollgw.go index 58b39b062..fd0175ff4 100644 --- a/ziti/router/enrollgw.go +++ b/ziti/router/enrollgw.go @@ -20,14 +20,14 @@ import ( "github.com/michaelquigley/pfxlog" "github.com/openziti/edge/router/enroll" "github.com/openziti/fabric/router" - "github.com/openziti/sdk-golang/ziti/config" + "github.com/openziti/sdk-golang/ziti" "github.com/spf13/cobra" "io/ioutil" ) var jwtPath *string var engine *string -var keyAlg config.KeyAlgVar +var keyAlg ziti.KeyAlgVar func NewEnrollGwCmd() *cobra.Command { var enrollEdgeRouterCmd = &cobra.Command{ diff --git a/ziti/tunnel/root.go b/ziti/tunnel/root.go index 5b0291f96..4f7d51b3b 100644 --- a/ziti/tunnel/root.go +++ b/ziti/tunnel/root.go @@ -17,11 +17,13 @@ package tunnel import ( + "github.com/openziti/sdk-golang/ziti/sdkinfo" "github.com/openziti/ziti/ziti/cmd/common" "github.com/openziti/ziti/ziti/constants" "github.com/openziti/ziti/ziti/util" "os" "path/filepath" + "strings" "time" "github.com/michaelquigley/pfxlog" @@ -31,7 +33,6 @@ import ( "github.com/openziti/edge/tunnel/entities" "github.com/openziti/edge/tunnel/intercept" "github.com/openziti/sdk-golang/ziti" - "github.com/openziti/sdk-golang/ziti/config" "github.com/openziti/ziti/common/enrollment" "github.com/openziti/ziti/common/version" "github.com/sirupsen/logrus" @@ -124,7 +125,7 @@ func rootPostRun(cmd *cobra.Command, _ []string) { } } - ziti.SetApplication("ziti-tunnel", version.GetVersion()) + sdkinfo.SetApplication("ziti-tunnel", version.GetVersion()) resolverConfig := cmd.Flag(resolverCfgFlag).Value.String() resolver := dns.NewResolver(resolverConfig) @@ -167,7 +168,7 @@ func startIdentity(cmd *cobra.Command, serviceListenerGroup *intercept.ServiceLi log := pfxlog.Logger() log.Infof("loading identity: %v", identityJson) - zitiCfg, err := config.NewFromFile(identityJson) + zitiCfg, err := ziti.NewConfigFromFile(identityJson) if err != nil { log.Fatalf("failed to load ziti configuration from %s: %v", identityJson, err) } @@ -188,9 +189,16 @@ func startIdentity(cmd *cobra.Command, serviceListenerGroup *intercept.ServiceLi serviceListener.HandleProviderReady(tunnel.NewContextProvider(ctx)) }, OnServiceUpdate: serviceListener.HandleServicesChange, + EdgeRouterUrlFilter: func(url string) bool { + return strings.HasPrefix(url, "tls:") + }, } - rootPrivateContext := ziti.NewContextWithOpts(zitiCfg, options) + rootPrivateContext, err := ziti.NewContextWithOpts(zitiCfg, options) + + if err != nil { + pfxlog.Logger().WithError(err).Fatal("could not create ziti sdk context") + } for { if err = rootPrivateContext.Authenticate(); err != nil { diff --git a/ziti/tunnel/run.go b/ziti/tunnel/run.go index 55a2841b7..2f544015a 100644 --- a/ziti/tunnel/run.go +++ b/ziti/tunnel/run.go @@ -50,7 +50,7 @@ func run(cmd *cobra.Command, args []string) { _ = cmd.Flag("identity").Value.Set(args[0]) } - tProxyInterceptor, err = tproxy.New("") + tProxyInterceptor, err = tproxy.New(tproxy.Config{}) if err != nil { log.Infof("tproxy initialization failed: %v", err) } else { diff --git a/ziti/tunnel/tproxy.go b/ziti/tunnel/tproxy.go index 0b6994df1..05842777d 100644 --- a/ziti/tunnel/tproxy.go +++ b/ziti/tunnel/tproxy.go @@ -48,7 +48,7 @@ func runTProxy(cmd *cobra.Command, _ []string) error { return err } - interceptor, err = tproxy.New(lanIf) + interceptor, err = tproxy.New(tproxy.Config{LanIf: lanIf}) if err != nil { return fmt.Errorf("failed to initialize tproxy interceptor: %v", err) } diff --git a/ziti/util/identities.go b/ziti/util/identities.go index b63b3da7c..22d233359 100644 --- a/ziti/util/identities.go +++ b/ziti/util/identities.go @@ -7,9 +7,9 @@ import ( "fmt" httptransport "github.com/go-openapi/runtime/client" "github.com/openziti/edge-api/rest_management_api_client" + "github.com/openziti/edge/controller/env" fabric_rest_client "github.com/openziti/fabric/rest_client" "github.com/openziti/identity" - "github.com/openziti/sdk-golang/ziti/constants" "github.com/openziti/ziti/ziti/cmd/common" "github.com/pkg/errors" "gopkg.in/resty.v1" @@ -102,7 +102,7 @@ func (self *RestClientEdgeIdentity) NewTlsClientConfig() (*tls.Config, error) { } func (self *RestClientEdgeIdentity) NewClient(timeout time.Duration, verbose bool) (*resty.Client, error) { - client := newClient() + client := NewClient() if self.CaCert != "" { client.SetRootCertificate(self.CaCert) } @@ -113,7 +113,7 @@ func (self *RestClientEdgeIdentity) NewClient(timeout time.Duration, verbose boo func (self *RestClientEdgeIdentity) NewRequest(client *resty.Client) *resty.Request { r := client.R() - r.SetHeader(constants.ZitiSession, self.Token) + r.SetHeader(env.ZitiSession, self.Token) return r } @@ -173,7 +173,7 @@ func (self *RestClientEdgeIdentity) NewFabricManagementClient(clientOpts ClientO func (self *RestClientEdgeIdentity) NewWsHeader() http.Header { result := http.Header{} - result.Set(constants.ZitiSession, self.Token) + result.Set(env.ZitiSession, self.Token) return result } @@ -198,7 +198,7 @@ func (self *RestClientFabricIdentity) NewClient(timeout time.Duration, verbose b if err != nil { return nil, errors.Wrap(err, "unable to load identity") } - client := newClient() + client := NewClient() client.SetTLSClientConfig(id.ClientTLSConfig()) client.SetTimeout(timeout) client.SetDebug(verbose) diff --git a/ziti/util/rest.go b/ziti/util/rest.go index a9aa17155..9d2416f7b 100644 --- a/ziti/util/rest.go +++ b/ziti/util/rest.go @@ -18,7 +18,6 @@ package util import ( "archive/tar" - "archive/zip" "bytes" "compress/gzip" "encoding/json" @@ -33,7 +32,6 @@ import ( "github.com/openziti/ziti/common/version" cmdhelper "github.com/openziti/ziti/ziti/cmd/helpers" c "github.com/openziti/ziti/ziti/constants" - "github.com/pkg/errors" "gopkg.in/resty.v1" "io" "net/http" @@ -42,7 +40,6 @@ import ( "path" "path/filepath" "runtime" - "sort" "strconv" "strings" "text/template" @@ -81,7 +78,7 @@ func DownloadFile(filepath string, url string) (err error) { } // Use a 2-second timeout with a retry count of 5 -func newClient() *resty.Client { +func NewClient() *resty.Client { return resty. New(). SetTimeout(2 * time.Second). @@ -90,7 +87,7 @@ func newClient() *resty.Client { } func getRequest(verbose bool) *resty.Request { - return newClient(). + return NewClient(). SetDebug(verbose). R() } @@ -154,116 +151,6 @@ func GetLatestVersionFromArtifactory(verbose bool, staging bool, branch string, return semver.Make(strings.TrimPrefix(result.Version, "v")) } -// Used to parse the '/releases/latest' response from GitHub -type GitHubReleasesData struct { - Version string `json:"tag_name"` - SemVer semver.Version - Assets []struct { - BrowserDownloadURL string `json:"browser_download_url"` - } -} - -func (self *GitHubReleasesData) GetDownloadUrl(appName string) (string, error) { - arches := []string{runtime.GOARCH} - if strings.ToLower(runtime.GOARCH) == "amd64" { - arches = append(arches, "x86_64") - } - - for _, asset := range self.Assets { - ok := false - for _, arch := range arches { - if strings.Contains(strings.ToLower(asset.BrowserDownloadURL), arch) { - ok = true - } - } - - ok = ok && strings.Contains(strings.ToLower(asset.BrowserDownloadURL), runtime.GOOS) - if ok { - return asset.BrowserDownloadURL, nil - } - } - - return "", errors.Errorf("no download URL found for os/arch %v/%v for '%v'", runtime.GOOS, runtime.GOARCH, appName) -} - -func GetHighestVersionGitHubReleaseInfo(verbose bool, appName string) (*GitHubReleasesData, error) { - resp, err := getRequest(verbose). - SetQueryParams(map[string]string{}). - SetHeader("Accept", "application/vnd.github.v3+json"). - SetResult([]*GitHubReleasesData{}). - Get("https://api.github.com/repos/openziti/" + appName + "/releases") - - if err != nil { - return nil, errors.Wrapf(err, "unable to get latest version for '%s'", appName) - } - - if resp.StatusCode() == http.StatusNotFound { - return nil, errors.Errorf("unable to get latest version for '%s'; Not Found (invalid URL)", appName) - } - if resp.StatusCode() != http.StatusOK { - return nil, errors.Errorf("unable to get latest version for '%s'; return status=%s", appName, resp.Status()) - } - - result := *resp.Result().(*[]*GitHubReleasesData) - return getHighestVersionRelease(appName, result) -} - -func getHighestVersionRelease(appName string, releases []*GitHubReleasesData) (*GitHubReleasesData, error) { - for _, release := range releases { - v, err := semver.ParseTolerant(release.Version) - if err != nil { - return nil, errors.Wrapf(err, "unable to parse version %v for '%v'", release.Version, appName) - } - release.SemVer = v - } - sort.Slice(releases, func(i, j int) bool { - return releases[i].SemVer.GT(releases[j].SemVer) // sort in reverse order - }) - if len(releases) == 0 { - return nil, errors.Errorf("no releases found for '%v'", appName) - } - return releases[0], nil -} - -func GetLatestGitHubReleaseAsset(verbose bool, appName string) (*GitHubReleasesData, error) { - resp, err := getRequest(verbose). - SetQueryParams(map[string]string{}). - SetHeader("Accept", "application/vnd.github.v3+json"). - SetResult(&GitHubReleasesData{}). - Get("https://api.github.com/repos/openziti/" + appName + "/releases/latest") - - if err != nil { - return nil, fmt.Errorf("unable to get latest version for '%s'; %s", appName, err) - } - - if resp.StatusCode() == http.StatusNotFound { - return nil, fmt.Errorf("unable to get latest version for '%s'; Not Found", appName) - } - if resp.StatusCode() != http.StatusOK { - return nil, fmt.Errorf("unable to get latest version for '%s'; %s", appName, resp.Status()) - } - - result := resp.Result().(*GitHubReleasesData) - return result, nil -} - -// DownloadGitHubReleaseAsset will download a file from the given GitHUb release area -func DownloadGitHubReleaseAsset(fullUrl string, filepath string) (err error) { - resp, err := getRequest(false). - SetOutput(filepath). - Get(fullUrl) - - if err != nil { - return fmt.Errorf("unable to download '%s', %s", fullUrl, err) - } - - if resp.IsError() { - return fmt.Errorf("unable to download file, error HTTP status code [%d] returned for url [%s]", resp.StatusCode(), fullUrl) - } - - return nil -} - // Used to parse the '/api/search/aql' response from Artifactory type AQLResult struct { Repo string @@ -505,108 +392,7 @@ func UnTargz(tarball, target string, onlyFiles []string) error { return nil } -func Unzip(src, dest string) error { - r, err := zip.OpenReader(src) - if err != nil { - return err - } - defer func() { - if err := r.Close(); err != nil { - panic(err) - } - }() - - os.MkdirAll(dest, 0755) - - // Closure to address file descriptors issue with all the deferred .Close() methods - extractAndWriteFile := func(f *zip.File) error { - rc, err := f.Open() - if err != nil { - return err - } - defer func() { - if err := rc.Close(); err != nil { - panic(err) - } - }() - - path := filepath.Join(dest, f.Name) - - // Check for ZipSlip (Directory traversal) - if !strings.HasPrefix(path, filepath.Clean(dest)+string(os.PathSeparator)) { - return fmt.Errorf("illegal file path: %s", path) - } - - if f.FileInfo().IsDir() { - os.MkdirAll(path, f.Mode()) - } else { - os.MkdirAll(filepath.Dir(path), f.Mode()) - f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) - if err != nil { - return err - } - defer func() { - if err := f.Close(); err != nil { - panic(err) - } - }() - - _, err = io.Copy(f, rc) - if err != nil { - return err - } - } - return nil - } - - for _, f := range r.File { - err := extractAndWriteFile(f) - if err != nil { - return err - } - } - - return nil -} - -// EdgeControllerLogin will authenticate to the given Edge Controller -func EdgeControllerLogin(url string, cert string, authentication string, out io.Writer, logJSON bool, timeout int, verbose bool) (*gabs.Container, error) { - client := newClient() - - if cert != "" { - client.SetRootCertificate(cert) - } - - resp, err := client. - SetTimeout(time.Duration(time.Duration(timeout)*time.Second)). - SetDebug(verbose). - R(). - SetQueryParam("method", "password"). - SetHeader("Content-Type", "application/json"). - SetBody(authentication). - Post(url + "/authenticate") - - if err != nil { - return nil, fmt.Errorf("unable to authenticate to %v. Error: %v", url, err) - } - - if resp.StatusCode() != http.StatusOK { - return nil, fmt.Errorf("unable to authenticate to %v. Status code: %v, Server returned: %v", url, resp.Status(), prettyPrintResponse(resp)) - } - - if logJSON { - outputJson(out, resp.Body()) - } - - jsonParsed, err := gabs.ParseJSON(resp.Body()) - if err != nil { - return nil, fmt.Errorf("unable to parse response from %v. Server returned: %v", url, resp.String()) - } - - return jsonParsed, nil -} - -func prettyPrintResponse(resp *resty.Response) string { +func PrettyPrintResponse(resp *resty.Response) string { out := resp.String() var prettyJSON bytes.Buffer if err := json.Indent(&prettyJSON, []byte(out), "", " "); err == nil { @@ -615,7 +401,7 @@ func prettyPrintResponse(resp *resty.Response) string { return out } -func outputJson(out io.Writer, data []byte) { +func OutputJson(out io.Writer, data []byte) { var prettyJSON bytes.Buffer if err := json.Indent(&prettyJSON, data, "", " "); err == nil { if _, err := fmt.Fprint(out, prettyJSON.String()); err != nil { @@ -654,11 +440,11 @@ func ControllerDetailEntity(api API, entityType, entityId string, logJSON bool, if resp.StatusCode() != http.StatusOK { return nil, fmt.Errorf("error listing %v in Ziti Edge Controller. Status code: %v, Server returned: %v", - queryUrl, resp.Status(), prettyPrintResponse(resp)) + queryUrl, resp.Status(), PrettyPrintResponse(resp)) } if logJSON { - outputJson(out, resp.Body()) + OutputJson(out, resp.Body()) } jsonParsed, err := gabs.ParseJSON(resp.Body()) @@ -715,11 +501,11 @@ func ControllerList(api API, path string, params url.Values, logJSON bool, out i if resp.StatusCode() != http.StatusOK { return nil, fmt.Errorf("error listing %v in Ziti Edge Controller. Status code: %v, Server returned: %v", - queryUrl, resp.Status(), prettyPrintResponse(resp)) + queryUrl, resp.Status(), PrettyPrintResponse(resp)) } if logJSON { - outputJson(out, resp.Body()) + OutputJson(out, resp.Body()) } jsonParsed, err := gabs.ParseJSON(resp.Body()) @@ -850,7 +636,7 @@ func ControllerCreate(api API, entityType string, body string, out io.Writer, lo url := baseUrl + "/" + entityType if logRequestJson { fmt.Printf("%v to %v\n", "POST", url) - outputJson(out, []byte(body)) + OutputJson(out, []byte(body)) fmt.Println() } @@ -862,11 +648,11 @@ func ControllerCreate(api API, entityType string, body string, out io.Writer, lo if resp.StatusCode() != http.StatusCreated { return nil, fmt.Errorf("error creating %v instance in Ziti Edge Controller at %v. Status code: %v, Server returned: %v", - entityType, baseUrl, resp.Status(), prettyPrintResponse(resp)) + entityType, baseUrl, resp.Status(), PrettyPrintResponse(resp)) } if logResponseJson { - outputJson(out, resp.Body()) + OutputJson(out, resp.Body()) } jsonParsed, err := gabs.ParseJSON(resp.Body()) @@ -900,7 +686,7 @@ func ControllerDelete(api API, entityType string, id string, body string, out io if logRequestJson { fmt.Printf("%v to %v\n", "POST", fullUrl) - outputJson(out, []byte(body)) + OutputJson(out, []byte(body)) fmt.Println() } @@ -916,11 +702,11 @@ func ControllerDelete(api API, entityType string, id string, body string, out io if resp.StatusCode() != http.StatusOK { return fmt.Errorf("error deleting %v instance in Ziti Edge Controller at %v. Status code: %v, Server returned: %v", - entityPath, baseUrl, resp.Status(), prettyPrintResponse(resp)) + entityPath, baseUrl, resp.Status(), PrettyPrintResponse(resp)) } if logResponseJson { - outputJson(out, resp.Body()) + OutputJson(out, resp.Body()) } return nil @@ -947,7 +733,7 @@ func ControllerUpdate(api API, entityType string, body string, out io.Writer, me if logRequestJson { fmt.Printf("%v to %v\n", method, url) - outputJson(out, []byte(body)) + OutputJson(out, []byte(body)) fmt.Println() } @@ -959,11 +745,11 @@ func ControllerUpdate(api API, entityType string, body string, out io.Writer, me if resp.StatusCode() != http.StatusOK && resp.StatusCode() != http.StatusAccepted { return nil, fmt.Errorf("error updating %v instance in Ziti Edge Controller at %v. Status code: %v, Server returned: %v", - entityType, baseUrl, resp.Status(), prettyPrintResponse(resp)) + entityType, baseUrl, resp.Status(), PrettyPrintResponse(resp)) } if logResponseJSON { - outputJson(out, resp.Body()) + OutputJson(out, resp.Body()) } if len(resp.Body()) == 0 { @@ -1009,11 +795,11 @@ func EdgeControllerVerify(entityType, id, body string, out io.Writer, logJSON bo if resp.StatusCode() != http.StatusOK { return fmt.Errorf("error verifying %v instance (%v) in Ziti Edge Controller at %v. Status code: %v, Server returned: %v", - entityType, id, baseUrl, resp.Status(), prettyPrintResponse(resp)) + entityType, id, baseUrl, resp.Status(), PrettyPrintResponse(resp)) } if logJSON { - outputJson(out, resp.Body()) + OutputJson(out, resp.Body()) } return nil @@ -1043,11 +829,11 @@ func EdgeControllerRequest(entityType string, out io.Writer, logJSON bool, timeo if resp.StatusCode() != http.StatusOK { return nil, fmt.Errorf("error performing request [%s] %v instance in Ziti Edge Controller at %v. Status code: %v, Server returned: %v", - request.Method, entityType, baseUrl, resp.Status(), prettyPrintResponse(resp)) + request.Method, entityType, baseUrl, resp.Status(), PrettyPrintResponse(resp)) } if logJSON { - outputJson(out, resp.Body()) + OutputJson(out, resp.Body()) } if resp.Body() == nil { @@ -1068,7 +854,7 @@ func EdgeControllerRequest(entityType string, out io.Writer, logJSON bool, timeo // on the version of the Edge Controller the API may be monolith on `/edge/` and `/` or split into // `/edge/management/` and `/edge/client/`. func EdgeControllerGetManagementApiBasePath(host string, cert string) string { - client := newClient() + client := NewClient() client.SetHostURL(host) diff --git a/ziti/util/updates.go b/ziti/util/updates.go index 52239faae..2c94c4694 100644 --- a/ziti/util/updates.go +++ b/ziti/util/updates.go @@ -18,6 +18,7 @@ package util import ( "fmt" + "github.com/openziti/ziti/common/getziti" "github.com/openziti/ziti/ziti/constants" "os" "strings" @@ -29,12 +30,12 @@ import ( "github.com/openziti/ziti/common/version" ) -func LogReleaseVersionCheck(ziti_component string) { +func LogReleaseVersionCheck(zitiComponent string) { logger := pfxlog.Logger() if strings.ToLower(os.Getenv("ZITI_CHECK_VERSION")) == "true" { logger.Debug("ZITI_CHECK_VERSION is true. starting version check") developmentSemver, _ := semver.Parse("0.0.0") - latestGithubRelease, err := GetHighestVersionGitHubReleaseInfo(false, constants.ZITI) + latestGithubRelease, err := getziti.GetHighestVersionGitHubReleaseInfo(constants.ZITI, false) if err != nil { logger.Debugf("failed to find latest GitHub version with error: %s", err) return // soft-fail version check if GitHub API is unavailable @@ -50,7 +51,7 @@ func LogReleaseVersionCheck(ziti_component string) { if currentBuildSemver.EQ(developmentSemver) { logger.Debugf( "this build of %s is unreleased v%s", - ziti_component, + zitiComponent, developmentSemver, ) } else if latestGithubRelease.SemVer.GT(currentBuildSemver) { @@ -66,20 +67,20 @@ https://github.com/openziti/%s/releases/latest/ ********************************************************************************* `, green("v"+latestGithubRelease.SemVer.String()), - ziti_component, + zitiComponent, yellow("v"+currentBuildSemver.String()), constants.ZITI, ) logger.Debugf( "this v%s build of %s is superseded by v%s", currentBuildSemver, - ziti_component, + zitiComponent, latestGithubRelease, ) } else if latestGithubRelease.SemVer.EQ(currentBuildSemver) { logger.Debugf( "this build of %s is the latest release v%s", - ziti_component, + zitiComponent, currentBuildSemver, ) }