From d73272b8e0b87a350ae375baf75cdcbcb2017d22 Mon Sep 17 00:00:00 2001 From: yusing Date: Fri, 16 Jan 2026 21:27:37 +0800 Subject: [PATCH] Rebased from main: Old CPU / Old docker version compatibility --- .github/workflows/docker-image-compat.yml | 20 +++++++ .github/workflows/docker-image-nightly.yml | 1 + agent/go.mod | 11 +++- agent/go.sum | 33 ++++++++-- .../agent/stream/tests/server_flow_test.go | 1 - agent/pkg/agentproxy/config.go | 6 +- agent/pkg/handler/check_health.go | 4 +- agent/pkg/handler/handler.go | 4 +- go.mod | 26 +++++--- go.sum | 36 ++++++++--- goutils | 2 +- internal/agentpool/http_requests.go | 4 +- internal/api/handler.go | 4 -- internal/api/v1/docker/container.go | 13 ++-- internal/api/v1/docker/containers.go | 7 +-- internal/api/v1/docker/info.go | 9 ++- internal/api/v1/docker/logs.go | 6 +- internal/api/v1/docker/restart.go | 12 +--- internal/api/v1/docker/start.go | 6 +- internal/api/v1/docker/stop.go | 6 +- internal/api/v1/metrics/all_system_info.go | 3 +- internal/auth/userpass.go | 4 +- internal/dnsproviders/go.mod | 7 --- internal/dnsproviders/go.sum | 15 ----- internal/docker/client.go | 4 +- internal/docker/container.go | 23 ++++--- internal/docker/container_helper.go | 2 +- internal/docker/container_test.go | 2 +- internal/docker/list_containers.go | 8 +-- internal/health/check/docker.go | 7 +-- internal/homepage/icons/list/list_icons.go | 6 +- .../integrations/qbittorrent/client.go | 4 +- .../homepage/integrations/qbittorrent/logs.go | 5 +- internal/idlewatcher/debug.go | 4 +- internal/idlewatcher/events.go | 5 +- internal/idlewatcher/provider/docker.go | 30 ++++------ internal/jsonstore/README.md | 8 +-- internal/jsonstore/jsonstore.go | 11 ++-- internal/metrics/period/entries.go | 4 +- internal/metrics/period/poller.go | 3 +- .../metrics/systeminfo/system_info_test.go | 7 +-- internal/metrics/uptime/uptime.go | 6 +- .../net/gphttp/middleware/captcha/hcaptcha.go | 4 +- internal/net/gphttp/middleware/middleware.go | 4 +- internal/net/gphttp/middleware/test_utils.go | 4 +- internal/net/types/url.go | 5 +- internal/notif/body.go | 12 ++-- internal/notif/gotify.go | 6 +- internal/notif/webhook.go | 8 +-- internal/proxmox/client.go | 4 +- internal/proxmox/node.go | 4 +- internal/route/provider/docker_labels_test.go | 4 +- internal/route/provider/docker_test.go | 17 +++--- internal/route/rules/rules.go | 2 +- internal/route/types/scheme.go | 4 +- internal/serialization/serialization.go | 10 ++-- internal/types/docker.go | 9 +-- internal/types/health.go | 5 +- internal/types/idlewatcher.go | 2 +- internal/watcher/docker_watcher.go | 60 +++++++------------ internal/watcher/events/events.go | 2 +- 61 files changed, 277 insertions(+), 268 deletions(-) create mode 100644 .github/workflows/docker-image-compat.yml diff --git a/.github/workflows/docker-image-compat.yml b/.github/workflows/docker-image-compat.yml new file mode 100644 index 00000000..8d12cdf9 --- /dev/null +++ b/.github/workflows/docker-image-compat.yml @@ -0,0 +1,20 @@ +name: Docker Image CI (compat) + +on: + push: + branches: + - compat + +jobs: + build-compat: + uses: ./.github/workflows/docker-image.yml + with: + image_name: ${{ github.repository_owner }}/godoxy + tag: latest-compat + target: main + build-compat-agent: + uses: ./.github/workflows/docker-image.yml + with: + image_name: ${{ github.repository_owner }}/godoxy-agent + tag: latest-compat + target: agent diff --git a/.github/workflows/docker-image-nightly.yml b/.github/workflows/docker-image-nightly.yml index 20c5497d..34b1a33d 100644 --- a/.github/workflows/docker-image-nightly.yml +++ b/.github/workflows/docker-image-nightly.yml @@ -8,6 +8,7 @@ on: - "**" # matches every branch - "!dependabot/*" - "!main" # excludes main + - "!compat" # excludes compat branch jobs: build-nightly: diff --git a/agent/go.mod b/agent/go.mod index f326550c..9179ab5b 100644 --- a/agent/go.mod +++ b/agent/go.mod @@ -14,8 +14,9 @@ replace ( exclude github.com/containerd/nerdctl/mod/tigron v0.0.0 +exclude github.com/yusing/godoxy/internal/utils v0.0.0-20250927032450-e2aeef3a863f + require ( - github.com/bytedance/sonic v1.14.2 github.com/gin-gonic/gin v1.11.0 github.com/gorilla/websocket v1.5.3 github.com/pion/dtls/v3 v3.0.10 @@ -31,6 +32,7 @@ require ( github.com/Microsoft/go-winio v0.6.2 // indirect github.com/andybalholm/brotli v1.2.0 // indirect github.com/bytedance/gopkg v0.1.3 // indirect + github.com/bytedance/sonic v1.14.2 // indirect github.com/bytedance/sonic/loader v0.4.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudwego/base64x v0.1.6 // indirect @@ -39,6 +41,7 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/distribution/reference v0.6.0 // indirect github.com/docker/cli v29.1.4+incompatible // indirect + github.com/docker/docker v28.5.2+incompatible // indirect github.com/docker/go-connections v0.6.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/ebitengine/purego v0.9.1 // indirect @@ -63,7 +66,8 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/moby/api v1.52.0 // indirect - github.com/moby/moby/client v0.2.1 // indirect + github.com/moby/sys/sequential v0.6.0 // indirect + github.com/moby/term v0.5.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect @@ -71,6 +75,7 @@ require ( github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pion/logging v0.2.4 // indirect github.com/pion/transport/v4 v4.0.1 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/puzpuzpuz/xsync/v4 v4.3.0 // indirect @@ -92,6 +97,7 @@ require ( go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 // indirect go.opentelemetry.io/otel v1.39.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect go.opentelemetry.io/otel/metric v1.39.0 // indirect go.opentelemetry.io/otel/trace v1.39.0 // indirect golang.org/x/arch v0.23.0 // indirect @@ -99,6 +105,7 @@ require ( golang.org/x/net v0.49.0 // indirect golang.org/x/sys v0.40.0 // indirect golang.org/x/text v0.33.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b // indirect google.golang.org/protobuf v1.36.11 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/agent/go.sum b/agent/go.sum index f5cbbb1c..ca61ee7e 100644 --- a/agent/go.sum +++ b/agent/go.sum @@ -1,3 +1,5 @@ +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/PuerkitoBio/goquery v1.11.0 h1:jZ7pwMQXIITcUXNH83LLk+txlaEy6NVOfTuP43xxfqw= @@ -24,6 +26,8 @@ github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/coreos/go-oidc/v3 v3.17.0 h1:hWBGaQfbi0iVviX4ibC7bk8OKT5qNr4klBaCHVNvehc= github.com/coreos/go-oidc/v3 v3.17.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSwyXJqZH+sI8= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -39,6 +43,8 @@ github.com/djherbis/times v1.6.0 h1:w2ctJ92J8fBvWPxugmXIv7Nz7Q3iDMKNx9v5ocVH20c= github.com/djherbis/times v1.6.0/go.mod h1:gOHeRAz2h+VJNZ5Gmc/o7iD9k4wW7NMVqieYCY99oc0= github.com/docker/cli v29.1.4+incompatible h1:AI8fwZhqsAsrqZnVv9h6lbexeW/LzNTasf6A4vcNN8M= github.com/docker/cli v29.1.4+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= +github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -95,6 +101,8 @@ github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aN github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gotify/server/v2 v2.8.0 h1:E3UDDn/3rFZi1sjZfbuhXNnxJP3ACZhdcw/iySegPRA= github.com/gotify/server/v2 v2.8.0/go.mod h1:6ci5adxcE2hf1v+2oowKiQmixOxXV8vU+CRLKP6sqZA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 h1:NmZ1PKzSTQbuGHw9DGPFomqkkLWMC+vZCkfs+FHv1Vg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3/go.mod h1:zQrxl1YP88HQlA6i9c63DSVPFklWpGX4OWAc9bFuaH4= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 h1:9Nu54bhS/H/Kgo2/7xNSUuC5G28VR8ljfrLKU2G4IjU= @@ -130,13 +138,19 @@ github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3N github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/moby/api v1.52.0 h1:00BtlJY4MXkkt84WhUZPRqt5TvPbgig2FZvTbe3igYg= github.com/moby/moby/api v1.52.0/go.mod h1:8mb+ReTlisw4pS6BRzCMts5M49W5M7bKt1cJy/YbAqc= -github.com/moby/moby/client v0.2.1 h1:1Grh1552mvv6i+sYOdY+xKKVTvzJegcVMhuXocyDz/k= -github.com/moby/moby/client v0.2.1/go.mod h1:O+/tw5d4a1Ha/ZA/tPxIZJapJRUS6LNZ1wiVRxYHyUE= +github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= +github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= +github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= +github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= +github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= +github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= 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 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= @@ -155,6 +169,7 @@ github.com/pion/transport/v4 v4.0.1 h1:sdROELU6BZ63Ab7FrOLn13M6YdJLY20wldXW2Cu2k github.com/pion/transport/v4 v4.0.1/go.mod h1:nEuEA4AD5lPdcIegQDpVLgNoDGreqM/YqmEx3ovP4jM= github.com/pires/go-proxyproto v0.8.1 h1:9KEixbdJfhrbtjpz/ZwCdWDD2Xem0NZ38qMYaASJgp0= github.com/pires/go-proxyproto v0.8.1/go.mod h1:ZKAAyp3cgy5Y5Mo4n9AlScrkCZwUy0g3Jf+slqQVcuU= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= @@ -220,6 +235,10 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 h1:ssfIgGN go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0/go.mod h1:GQ/474YrbE4Jx8gZ4q5I4hrhUzM6UPzyrqJYV2AqPoQ= go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4= go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= @@ -228,6 +247,8 @@ go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2W go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= +go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= +go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= @@ -258,6 +279,12 @@ golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= +google.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b h1:uA40e2M6fYRBf0+8uN5mLlqUtV192iiksiICIBkYJ1E= +google.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b/go.mod h1:Xa7le7qx2vmqB/SzWUBa7KdMjpdpAHlh5QCSnjessQk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260114163908-3f89685c29c3 h1:C4WAdL+FbjnGlpp2S+HMVhBeCq2Lcib4xZqfPNF6OoQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260114163908-3f89685c29c3/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= +google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -268,5 +295,3 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= -pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= -pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= diff --git a/agent/pkg/agent/stream/tests/server_flow_test.go b/agent/pkg/agent/stream/tests/server_flow_test.go index f797a2b4..c962d4ea 100644 --- a/agent/pkg/agent/stream/tests/server_flow_test.go +++ b/agent/pkg/agent/stream/tests/server_flow_test.go @@ -102,7 +102,6 @@ func TestUDPServer_RejectInvalidClient(t *testing.T) { srv := startUDPServer(t, certs) - // Try to connect with a client cert from a different CA _, err = stream.NewUDPClient(srv.Addr.String(), dstAddr, certs.CaCert, invalidClientCert) require.Error(t, err, "expected error when connecting with client cert from different CA") diff --git a/agent/pkg/agentproxy/config.go b/agent/pkg/agentproxy/config.go index a32c083f..d4ffd1d9 100644 --- a/agent/pkg/agentproxy/config.go +++ b/agent/pkg/agentproxy/config.go @@ -2,11 +2,11 @@ package agentproxy import ( "encoding/base64" + "encoding/json" "net/http" "strconv" "time" - "github.com/bytedance/sonic" route "github.com/yusing/godoxy/internal/route/types" ) @@ -53,7 +53,7 @@ func proxyConfigFromHeaders(h http.Header) (cfg Config, err error) { return cfg, err } - err = sonic.Unmarshal(cfgJSON, &cfg) + err = json.Unmarshal(cfgJSON, &cfg) return cfg, err } @@ -67,7 +67,7 @@ func (cfg *Config) SetAgentProxyConfigHeadersLegacy(h http.Header) { func (cfg *Config) SetAgentProxyConfigHeaders(h http.Header) { h.Set(HeaderXProxyHost, cfg.Host) h.Set(HeaderXProxyScheme, string(cfg.Scheme)) - cfgJSON, _ := sonic.Marshal(cfg.HTTPConfig) + cfgJSON, _ := json.Marshal(cfg.HTTPConfig) cfgBase64 := base64.StdEncoding.EncodeToString(cfgJSON) h.Set(HeaderXProxyConfig, cfgBase64) } diff --git a/agent/pkg/handler/check_health.go b/agent/pkg/handler/check_health.go index 848167b5..270cff80 100644 --- a/agent/pkg/handler/check_health.go +++ b/agent/pkg/handler/check_health.go @@ -1,6 +1,7 @@ package handler import ( + "encoding/json" "net" "net/http" "net/url" @@ -8,7 +9,6 @@ import ( "strings" "time" - "github.com/bytedance/sonic" healthcheck "github.com/yusing/godoxy/internal/health/check" "github.com/yusing/godoxy/internal/types" ) @@ -73,7 +73,7 @@ func CheckHealth(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) - sonic.ConfigDefault.NewEncoder(w).Encode(result) + json.NewEncoder(w).Encode(result) } func parseMsOrDefault(msStr string) time.Duration { diff --git a/agent/pkg/handler/handler.go b/agent/pkg/handler/handler.go index 9ddf3225..39bfa7ab 100644 --- a/agent/pkg/handler/handler.go +++ b/agent/pkg/handler/handler.go @@ -1,9 +1,9 @@ package handler import ( + "encoding/json" "net/http" - "github.com/bytedance/sonic" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" "github.com/yusing/godoxy/agent/pkg/agent" @@ -51,7 +51,7 @@ func NewAgentHandler() http.Handler { Runtime: env.Runtime, } w.Header().Set("Content-Type", "application/json") - sonic.ConfigDefault.NewEncoder(w).Encode(agentInfo) + json.NewEncoder(w).Encode(agentInfo) }) mux.HandleEndpoint("GET", agent.EndpointHealth, CheckHealth) mux.HandleEndpoint("GET", agent.EndpointSystemInfo, metricsHandler.ServeHTTP) diff --git a/go.mod b/go.mod index 92368aa4..47c348e5 100644 --- a/go.mod +++ b/go.mod @@ -13,9 +13,12 @@ replace ( github.com/yusing/goutils/server => ./goutils/server ) +exclude github.com/luthermonson/go-proxmox v0.3.0 + require ( github.com/PuerkitoBio/goquery v1.11.0 // parsing HTML for extract fav icon; modify_html middleware github.com/coreos/go-oidc/v3 v3.17.0 // oidc authentication + github.com/docker/docker v28.5.2+incompatible // docker daemon github.com/fsnotify/fsnotify v1.9.0 // file watcher github.com/gin-gonic/gin v1.11.0 // api server github.com/go-acme/lego/v4 v4.31.0 // acme client @@ -37,14 +40,12 @@ require ( require ( github.com/bytedance/gopkg v0.1.3 // xxhash64 for fast hash - github.com/bytedance/sonic v1.14.2 // fast json parsing + github.com/bytedance/sonic v1.14.2 // indirect; fast json parsing github.com/docker/cli v29.1.4+incompatible // needs docker/cli/cli/connhelper connection helper for docker client github.com/goccy/go-yaml v1.19.2 // yaml parsing for different config files - github.com/golang-jwt/jwt/v5 v5.3.0 // jwt authentication - github.com/luthermonson/go-proxmox v0.3.2 // proxmox API client - github.com/moby/moby/api v1.52.0 // docker API - github.com/moby/moby/client v0.2.1 // docker client - github.com/oschwald/maxminddb-golang v1.13.1 // maxminddb for geoip database + github.com/golang-jwt/jwt/v5 v5.3.0 + github.com/luthermonson/go-proxmox v0.3.2 + github.com/oschwald/maxminddb-golang v1.13.1 github.com/quic-go/quic-go v0.59.0 // http3 support github.com/shirou/gopsutil/v4 v4.25.12 // system information github.com/spf13/afero v1.15.0 // afero for file system operations @@ -115,11 +116,11 @@ require ( github.com/ovh/go-ovh v1.9.0 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/quic-go/qpack v0.6.0 // indirect github.com/samber/lo v1.52.0 // indirect github.com/samber/slog-common v0.19.0 // indirect - github.com/samber/slog-zerolog/v2 v2.9.0 // indirect github.com/scaleway/scaleway-sdk-go v1.0.0-beta.36 // indirect github.com/sirupsen/logrus v1.9.4 // indirect github.com/sony/gobreaker v1.0.0 // indirect @@ -144,7 +145,10 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect ) +require github.com/moby/moby/api v1.52.0 + require ( + github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect github.com/akamai/AkamaiOPEN-edgegrid-golang/v11 v11.1.0 // indirect github.com/andybalholm/brotli v1.2.0 // indirect github.com/boombuler/barcode v1.1.0 // indirect @@ -154,6 +158,7 @@ require ( github.com/cloudwego/base64x v0.1.6 // indirect github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/errdefs/pkg v0.3.0 // indirect + github.com/containerd/log v0.1.0 // indirect github.com/fatih/color v1.18.0 // indirect github.com/fatih/structs v1.1.0 // indirect github.com/gin-contrib/sse v1.1.0 // indirect @@ -163,11 +168,14 @@ require ( github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/google/go-querystring v1.2.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 // indirect github.com/klauspost/compress v1.18.3 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect github.com/linode/linodego v1.64.0 // indirect github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3 // indirect + github.com/moby/sys/atomicwriter v0.1.0 // indirect + github.com/morikuni/aec v1.0.0 // indirect github.com/nrdcg/goinwx v0.12.0 // indirect github.com/nrdcg/oci-go-sdk/common/v1065 v1065.106.0 // indirect github.com/nrdcg/oci-go-sdk/dns/v1065 v1065.106.0 // indirect @@ -177,14 +185,16 @@ require ( github.com/pion/transport/v4 v4.0.1 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/pquerna/otp v1.5.0 // indirect + github.com/samber/slog-zerolog/v2 v2.9.0 // indirect github.com/stretchr/objx v0.5.3 // indirect github.com/tklauser/go-sysconf v0.3.16 // indirect github.com/tklauser/numcpus v0.11.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.3.1 // indirect - github.com/ulikunitz/xz v0.5.15 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/vultr/govultr/v3 v3.26.1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 // indirect + go.opentelemetry.io/proto/otlp v1.9.0 // indirect golang.org/x/arch v0.23.0 // indirect ) diff --git a/go.sum b/go.sum index 5f3aeeed..63978d1d 100644 --- a/go.sum +++ b/go.sum @@ -23,6 +23,8 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourceg github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.9.0/go.mod h1:wVEOJfGTj0oPAUGA1JuRAvz/lxXQsWW16axmHPP47Bk= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs= @@ -65,6 +67,8 @@ github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -78,6 +82,8 @@ github.com/djherbis/times v1.6.0 h1:w2ctJ92J8fBvWPxugmXIv7Nz7Q3iDMKNx9v5ocVH20c= github.com/djherbis/times v1.6.0/go.mod h1:gOHeRAz2h+VJNZ5Gmc/o7iD9k4wW7NMVqieYCY99oc0= github.com/docker/cli v29.1.4+incompatible h1:AI8fwZhqsAsrqZnVv9h6lbexeW/LzNTasf6A4vcNN8M= github.com/docker/cli v29.1.4+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= +github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -159,6 +165,8 @@ github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aN github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gotify/server/v2 v2.8.0 h1:E3UDDn/3rFZi1sjZfbuhXNnxJP3ACZhdcw/iySegPRA= github.com/gotify/server/v2 v2.8.0/go.mod h1:6ci5adxcE2hf1v+2oowKiQmixOxXV8vU+CRLKP6sqZA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 h1:NmZ1PKzSTQbuGHw9DGPFomqkkLWMC+vZCkfs+FHv1Vg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3/go.mod h1:zQrxl1YP88HQlA6i9c63DSVPFklWpGX4OWAc9bFuaH4= github.com/h2non/gock v1.2.0 h1:K6ol8rfrRkUOefooBC8elXoaNGYkpp7y2qcxGG6BzUE= github.com/h2non/gock v1.2.0/go.mod h1:tNhoxHYW2W42cYkYb1WqzdbYIieALC99kpYr7rH/BQk= github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw= @@ -218,13 +226,19 @@ github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3N github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/moby/api v1.52.0 h1:00BtlJY4MXkkt84WhUZPRqt5TvPbgig2FZvTbe3igYg= github.com/moby/moby/api v1.52.0/go.mod h1:8mb+ReTlisw4pS6BRzCMts5M49W5M7bKt1cJy/YbAqc= -github.com/moby/moby/client v0.2.1 h1:1Grh1552mvv6i+sYOdY+xKKVTvzJegcVMhuXocyDz/k= -github.com/moby/moby/client v0.2.1/go.mod h1:O+/tw5d4a1Ha/ZA/tPxIZJapJRUS6LNZ1wiVRxYHyUE= +github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= +github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= +github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= +github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= +github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= +github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= 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 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/nrdcg/goacmedns v0.2.0 h1:ADMbThobzEMnr6kg2ohs4KGa3LFqmgiBA22/6jUWJR0= github.com/nrdcg/goacmedns v0.2.0/go.mod h1:T5o6+xvSLrQpugmwHvrSNkzWht0UGAwj2ACBMhh73Cg= github.com/nrdcg/goinwx v0.12.0 h1:ujdUqDBnaRSFwzVnImvPHYw3w3m9XgmGImNUw1GyMb4= @@ -257,6 +271,7 @@ github.com/pires/go-proxyproto v0.8.1 h1:9KEixbdJfhrbtjpz/ZwCdWDD2Xem0NZ38qMYaAS github.com/pires/go-proxyproto v0.8.1/go.mod h1:ZKAAyp3cgy5Y5Mo4n9AlScrkCZwUy0g3Jf+slqQVcuU= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/xattr v0.4.9 h1:5883YPCtkSd8LFbs13nXplj9g9tlrwoJRjgpgMu1/fE= github.com/pkg/xattr v0.4.9/go.mod h1:di8WF84zAKk8jzR1UBTEWh9AUlIZZ7M/JNt8e9B6ktU= @@ -314,8 +329,8 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY= github.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= -github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= -github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= +github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.69.0 h1:fNLLESD2SooWeh2cidsuFtOcrEi4uB4m1mPrkJMZyVI= @@ -343,6 +358,10 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 h1:ssfIgGN go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0/go.mod h1:GQ/474YrbE4Jx8gZ4q5I4hrhUzM6UPzyrqJYV2AqPoQ= go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4= go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= @@ -351,6 +370,8 @@ go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2W go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= +go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= +go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= @@ -402,6 +423,7 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -453,8 +475,8 @@ google.golang.org/api v0.260.0 h1:XbNi5E6bOVEj/uLXQRlt6TKuEzMD7zvW/6tNwltE4P4= google.golang.org/api v0.260.0/go.mod h1:Shj1j0Phr/9sloYrKomICzdYgsSDImpTxME8rGLaZ/o= google.golang.org/genproto v0.0.0-20251202230838-ff82c1b0f217 h1:GvESR9BIyHUahIb0NcTum6itIWtdoglGX+rnGxm2934= google.golang.org/genproto v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:yJ2HH4EHEDTd3JiLmhds6NkJ17ITVYOdV3m3VKOnws0= -google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls= -google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto= +google.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b h1:uA40e2M6fYRBf0+8uN5mLlqUtV192iiksiICIBkYJ1E= +google.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b/go.mod h1:Xa7le7qx2vmqB/SzWUBa7KdMjpdpAHlh5QCSnjessQk= google.golang.org/genproto/googleapis/rpc v0.0.0-20260114163908-3f89685c29c3 h1:C4WAdL+FbjnGlpp2S+HMVhBeCq2Lcib4xZqfPNF6OoQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20260114163908-3f89685c29c3/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= @@ -474,5 +496,3 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= -pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= -pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= diff --git a/goutils b/goutils index 326c1f1e..b12ef77f 160000 --- a/goutils +++ b/goutils @@ -1 +1 @@ -Subproject commit 326c1f1eb3620d36b482c453ca25971d4f251194 +Subproject commit b12ef77f3743c13360e0da8c2992ba35e5a98b27 diff --git a/internal/agentpool/http_requests.go b/internal/agentpool/http_requests.go index 6b5735cf..6694165c 100644 --- a/internal/agentpool/http_requests.go +++ b/internal/agentpool/http_requests.go @@ -2,12 +2,12 @@ package agentpool import ( "context" + "encoding/json" "fmt" "io" "net/http" "time" - "github.com/bytedance/sonic" "github.com/gorilla/websocket" "github.com/valyala/fasthttp" "github.com/yusing/godoxy/agent/pkg/agent" @@ -63,7 +63,7 @@ func (cfg *Agent) DoHealthCheck(timeout time.Duration, query string) (ret Health ret.Detail = fmt.Sprintf("HTTP %d %s", status, resp.Body()) return ret, nil } else { - err = sonic.Unmarshal(resp.Body(), &ret) + err = json.Unmarshal(resp.Body(), &ret) if err != nil { return ret, err } diff --git a/internal/api/handler.go b/internal/api/handler.go index 3a3d2bf2..067ffc90 100644 --- a/internal/api/handler.go +++ b/internal/api/handler.go @@ -2,10 +2,8 @@ package api import ( "net/http" - "reflect" "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/codec/json" "github.com/gorilla/websocket" "github.com/rs/zerolog/log" apiV1 "github.com/yusing/godoxy/internal/api/v1" @@ -47,8 +45,6 @@ func NewHandler() *gin.Engine { r.Use(ErrorLoggingMiddleware()) r.Use(NoCache()) - log.Debug().Msg("gin codec json.API: " + reflect.TypeOf(json.API).Name()) - r.GET("/api/v1/version", apiV1.Version) if auth.IsEnabled() { diff --git a/internal/api/v1/docker/container.go b/internal/api/v1/docker/container.go index b2f8bcdb..f320500d 100644 --- a/internal/api/v1/docker/container.go +++ b/internal/api/v1/docker/container.go @@ -4,7 +4,6 @@ import ( "net/http" "github.com/gin-gonic/gin" - "github.com/moby/moby/client" "github.com/yusing/godoxy/internal/docker" apitypes "github.com/yusing/goutils/apitypes" ) @@ -43,22 +42,22 @@ func GetContainer(c *gin.Context) { defer dockerClient.Close() - cont, err := dockerClient.ContainerInspect(c.Request.Context(), id, client.ContainerInspectOptions{}) + cont, err := dockerClient.ContainerInspect(c.Request.Context(), id) if err != nil { c.Error(apitypes.InternalServerError(err, "failed to inspect container")) return } var state ContainerState - if cont.Container.State != nil { - state = cont.Container.State.Status + if cont.State != nil { + state = cont.State.Status } c.JSON(http.StatusOK, &Container{ Server: dockerCfg.URL, - Name: cont.Container.Name, - ID: cont.Container.ID, - Image: cont.Container.Image, + Name: cont.Name, + ID: cont.ID, + Image: cont.Image, State: state, }) } diff --git a/internal/api/v1/docker/containers.go b/internal/api/v1/docker/containers.go index a07c24eb..4d6c1d05 100644 --- a/internal/api/v1/docker/containers.go +++ b/internal/api/v1/docker/containers.go @@ -4,9 +4,8 @@ import ( "context" "sort" + "github.com/docker/docker/api/types/container" "github.com/gin-gonic/gin" - "github.com/moby/moby/api/types/container" - "github.com/moby/moby/client" gperr "github.com/yusing/goutils/errs" _ "github.com/yusing/goutils/apitypes" @@ -40,12 +39,12 @@ func GetContainers(ctx context.Context, dockerClients DockerClients) ([]Containe errs := gperr.NewBuilder("failed to get containers") containers := make([]Container, 0) for server, dockerClient := range dockerClients { - conts, err := dockerClient.ContainerList(ctx, client.ContainerListOptions{All: true}) + conts, err := dockerClient.ContainerList(ctx, container.ListOptions{All: true}) if err != nil { errs.Add(err) continue } - for _, cont := range conts.Items { + for _, cont := range conts { containers = append(containers, Container{ Server: server, Name: cont.Names[0], diff --git a/internal/api/v1/docker/info.go b/internal/api/v1/docker/info.go index b96fc1d3..f5f79248 100644 --- a/internal/api/v1/docker/info.go +++ b/internal/api/v1/docker/info.go @@ -4,9 +4,8 @@ import ( "context" "sort" + dockerSystem "github.com/docker/docker/api/types/system" "github.com/gin-gonic/gin" - dockerSystem "github.com/moby/moby/api/types/system" - "github.com/moby/moby/client" gperr "github.com/yusing/goutils/errs" strutils "github.com/yusing/goutils/strings" @@ -65,13 +64,13 @@ func GetDockerInfo(ctx context.Context, dockerClients DockerClients) ([]dockerIn i := 0 for name, dockerClient := range dockerClients { - info, err := dockerClient.Info(ctx, client.InfoOptions{}) + info, err := dockerClient.Info(ctx) if err != nil { errs.Add(err) continue } - info.Info.Name = name - dockerInfos[i] = toDockerInfo(info.Info) + info.Name = name + dockerInfos[i] = toDockerInfo(info) i++ } diff --git a/internal/api/v1/docker/logs.go b/internal/api/v1/docker/logs.go index 96c98130..bfaf6ddc 100644 --- a/internal/api/v1/docker/logs.go +++ b/internal/api/v1/docker/logs.go @@ -6,9 +6,9 @@ import ( "fmt" "net/http" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/pkg/stdcopy" "github.com/gin-gonic/gin" - "github.com/moby/moby/api/pkg/stdcopy" - "github.com/moby/moby/client" "github.com/rs/zerolog/log" "github.com/yusing/godoxy/internal/docker" apitypes "github.com/yusing/goutils/apitypes" @@ -70,7 +70,7 @@ func Logs(c *gin.Context) { } defer dockerClient.Close() - opts := client.ContainerLogsOptions{ + opts := container.LogsOptions{ ShowStdout: queryParams.Stdout, ShowStderr: queryParams.Stderr, Since: queryParams.Since, diff --git a/internal/api/v1/docker/restart.go b/internal/api/v1/docker/restart.go index bc638d6f..6df9ad47 100644 --- a/internal/api/v1/docker/restart.go +++ b/internal/api/v1/docker/restart.go @@ -4,23 +4,17 @@ import ( "net/http" "github.com/gin-gonic/gin" - "github.com/moby/moby/client" "github.com/yusing/godoxy/internal/docker" apitypes "github.com/yusing/goutils/apitypes" ) -type RestartRequest struct { - ID string `json:"id" binding:"required"` - client.ContainerRestartOptions -} - // @x-id "restart" // @BasePath /api/v1 // @Summary Restart container // @Description Restart container by container id // @Tags docker // @Produce json -// @Param request body RestartRequest true "Request" +// @Param request body StopRequest true "Request" // @Success 200 {object} apitypes.SuccessResponse // @Failure 400 {object} apitypes.ErrorResponse "Invalid request" // @Failure 403 {object} apitypes.ErrorResponse @@ -28,7 +22,7 @@ type RestartRequest struct { // @Failure 500 {object} apitypes.ErrorResponse // @Router /docker/restart [post] func Restart(c *gin.Context) { - var req RestartRequest + var req StopRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, apitypes.Error("invalid request", err)) return @@ -48,7 +42,7 @@ func Restart(c *gin.Context) { defer client.Close() - _, err = client.ContainerRestart(c.Request.Context(), req.ID, req.ContainerRestartOptions) + err = client.ContainerRestart(c.Request.Context(), req.ID, req.StopOptions) if err != nil { c.Error(apitypes.InternalServerError(err, "failed to restart container")) return diff --git a/internal/api/v1/docker/start.go b/internal/api/v1/docker/start.go index 331d3488..ff7501cc 100644 --- a/internal/api/v1/docker/start.go +++ b/internal/api/v1/docker/start.go @@ -3,15 +3,15 @@ package dockerapi import ( "net/http" + "github.com/docker/docker/api/types/container" "github.com/gin-gonic/gin" - "github.com/moby/moby/client" "github.com/yusing/godoxy/internal/docker" apitypes "github.com/yusing/goutils/apitypes" ) type StartRequest struct { ID string `json:"id" binding:"required"` - client.ContainerStartOptions + container.StartOptions } // @x-id "start" @@ -48,7 +48,7 @@ func Start(c *gin.Context) { defer client.Close() - _, err = client.ContainerStart(c.Request.Context(), req.ID, req.ContainerStartOptions) + err = client.ContainerStart(c.Request.Context(), req.ID, req.StartOptions) if err != nil { c.Error(apitypes.InternalServerError(err, "failed to start container")) return diff --git a/internal/api/v1/docker/stop.go b/internal/api/v1/docker/stop.go index e663d387..0263f3ea 100644 --- a/internal/api/v1/docker/stop.go +++ b/internal/api/v1/docker/stop.go @@ -3,15 +3,15 @@ package dockerapi import ( "net/http" + "github.com/docker/docker/api/types/container" "github.com/gin-gonic/gin" - "github.com/moby/moby/client" "github.com/yusing/godoxy/internal/docker" apitypes "github.com/yusing/goutils/apitypes" ) type StopRequest struct { ID string `json:"id" binding:"required"` - client.ContainerStopOptions + container.StopOptions } // @x-id "stop" @@ -48,7 +48,7 @@ func Stop(c *gin.Context) { defer client.Close() - _, err = client.ContainerStop(c.Request.Context(), req.ID, req.ContainerStopOptions) + err = client.ContainerStop(c.Request.Context(), req.ID, req.StopOptions) if err != nil { c.Error(apitypes.InternalServerError(err, "failed to stop container")) return diff --git a/internal/api/v1/metrics/all_system_info.go b/internal/api/v1/metrics/all_system_info.go index fee4fc56..ea5430aa 100644 --- a/internal/api/v1/metrics/all_system_info.go +++ b/internal/api/v1/metrics/all_system_info.go @@ -7,7 +7,6 @@ import ( "sync/atomic" "time" - "github.com/bytedance/sonic" "github.com/gin-gonic/gin" "github.com/rs/zerolog/log" "github.com/yusing/godoxy/agent/pkg/agent" @@ -237,7 +236,7 @@ func marshalSystemInfo(ws *websocket.Manager, agentName string, systemInfo any) defer bufFromPool.release(bufFromPool.RawMessage) } - err := sonic.ConfigDefault.NewEncoder(buf).Encode(map[string]any{ + err := json.NewEncoder(buf).Encode(map[string]any{ agentName: systemInfo, }) if err != nil { diff --git a/internal/auth/userpass.go b/internal/auth/userpass.go index f68987eb..7bf981a9 100644 --- a/internal/auth/userpass.go +++ b/internal/auth/userpass.go @@ -1,11 +1,11 @@ package auth import ( + "encoding/json" "fmt" "net/http" "time" - "github.com/bytedance/sonic" "github.com/golang-jwt/jwt/v5" "github.com/yusing/godoxy/internal/common" gperr "github.com/yusing/goutils/errs" @@ -109,7 +109,7 @@ type UserPassAuthCallbackRequest struct { func (auth *UserPassAuth) PostAuthCallbackHandler(w http.ResponseWriter, r *http.Request) { var creds UserPassAuthCallbackRequest - err := sonic.ConfigDefault.NewDecoder(r.Body).Decode(&creds) + err := json.NewDecoder(r.Body).Decode(&creds) if err != nil { http.Error(w, "invalid request", http.StatusBadRequest) return diff --git a/internal/dnsproviders/go.mod b/internal/dnsproviders/go.mod index f088ed19..1d4a3bae 100644 --- a/internal/dnsproviders/go.mod +++ b/internal/dnsproviders/go.mod @@ -23,12 +23,8 @@ require ( github.com/akamai/AkamaiOPEN-edgegrid-golang/v11 v11.1.0 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/boombuler/barcode v1.1.0 // indirect - github.com/bytedance/gopkg v0.1.3 // indirect - github.com/bytedance/sonic v1.14.2 // indirect - github.com/bytedance/sonic/loader v0.4.0 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/cloudwego/base64x v0.1.6 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/fatih/structs v1.1.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect @@ -53,7 +49,6 @@ require ( github.com/gotify/server/v2 v2.8.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-retryablehttp v0.7.8 // indirect - github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect @@ -78,7 +73,6 @@ require ( github.com/sony/gobreaker v1.0.0 // indirect github.com/stretchr/objx v0.5.3 // indirect github.com/stretchr/testify v1.11.1 // indirect - github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/vultr/govultr/v3 v3.26.1 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect github.com/yusing/gointernals v0.1.16 // indirect @@ -89,7 +83,6 @@ require ( go.opentelemetry.io/otel/metric v1.39.0 // indirect go.opentelemetry.io/otel/trace v1.39.0 // indirect go.uber.org/ratelimit v0.3.1 // indirect - golang.org/x/arch v0.23.0 // indirect golang.org/x/crypto v0.47.0 // indirect golang.org/x/mod v0.32.0 // indirect golang.org/x/net v0.49.0 // indirect diff --git a/internal/dnsproviders/go.sum b/internal/dnsproviders/go.sum index b27a2c2d..6d439dd5 100644 --- a/internal/dnsproviders/go.sum +++ b/internal/dnsproviders/go.sum @@ -37,18 +37,10 @@ github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZx github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.1.0 h1:ChaYjBR63fr4LFyGn8E8nt7dBSt3MiU3zMOZqFvVkHo= github.com/boombuler/barcode v1.1.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= -github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= -github.com/bytedance/sonic v1.14.2 h1:k1twIoe97C1DtYUo+fZQy865IuHia4PR5RPiuGPPIIE= -github.com/bytedance/sonic v1.14.2/go.mod h1:T80iDELeHiHKSc0C9tubFygiuXoGzrkjKzX2quAx980= -github.com/bytedance/sonic/loader v0.4.0 h1:olZ7lEqcxtZygCK9EKYKADnpQoYkRQxaeY2NYzevs+o= -github.com/bytedance/sonic/loader v0.4.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= -github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -119,8 +111,6 @@ github.com/jarcoal/httpmock v1.4.1 h1:0Ju+VCFuARfFlhVXFc2HxlcQkfB+Xq12/EotHko+x2 github.com/jarcoal/httpmock v1.4.1/go.mod h1:ftW1xULwo+j0R0JJkJIIi7UKigZUXCLLanykgjwBXL0= github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU= github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= -github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= -github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -188,11 +178,8 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/vultr/govultr/v3 v3.26.1 h1:G/M0rMQKwVSmL+gb0UgETbW5mcQi0Vf/o/ZSGdBCxJw= github.com/vultr/govultr/v3 v3.26.1/go.mod h1:9WwnWGCKnwDlNjHjtt+j+nP+0QWq6hQXzaHgddqrLWY= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= @@ -221,8 +208,6 @@ go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/ratelimit v0.3.1 h1:K4qVE+byfv/B3tC+4nYWP7v/6SimcO7HzHekoMNBma0= go.uber.org/ratelimit v0.3.1/go.mod h1:6euWsTB6U/Nb3X++xEUXA8ciPJvr19Q/0h1+oDcJhRk= -golang.org/x/arch v0.23.0 h1:lKF64A2jF6Zd8L0knGltUnegD62JMFBiCPBmQpToHhg= -golang.org/x/arch v0.23.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A= golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= diff --git a/internal/docker/client.go b/internal/docker/client.go index 428d6483..b8c94593 100644 --- a/internal/docker/client.go +++ b/internal/docker/client.go @@ -14,7 +14,7 @@ import ( "unsafe" "github.com/docker/cli/cli/connhelper" - "github.com/moby/moby/client" + "github.com/docker/docker/client" "github.com/rs/zerolog/log" "github.com/yusing/godoxy/agent/pkg/agent" "github.com/yusing/godoxy/internal/agentpool" @@ -198,7 +198,7 @@ func NewClient(cfg types.DockerProviderConfig, unique ...bool) (*SharedClient, e opt = append(opt, client.WithTLSClientConfig(cfg.TLS.CAFile, cfg.TLS.CertFile, cfg.TLS.KeyFile)) } - client, err := client.New(opt...) + client, err := client.NewClientWithOpts(opt...) if err != nil { return nil, err } diff --git a/internal/docker/container.go b/internal/docker/container.go index a7f01665..5fc305b5 100644 --- a/internal/docker/container.go +++ b/internal/docker/container.go @@ -11,9 +11,8 @@ import ( "strconv" "strings" + "github.com/docker/docker/api/types/container" "github.com/docker/go-connections/nat" - "github.com/moby/moby/api/types/container" - "github.com/moby/moby/client" "github.com/yusing/godoxy/agent/pkg/agent" "github.com/yusing/godoxy/internal/agentpool" "github.com/yusing/godoxy/internal/serialization" @@ -99,18 +98,18 @@ func UpdatePorts(ctx context.Context, c *types.Container) error { } defer dockerClient.Close() - inspect, err := dockerClient.ContainerInspect(ctx, c.ContainerID, client.ContainerInspectOptions{}) + inspect, err := dockerClient.ContainerInspect(ctx, c.ContainerID) if err != nil { return err } - for port := range inspect.Container.Config.ExposedPorts { - proto, portStr := nat.SplitProtoPort(port.String()) + for port := range inspect.Config.ExposedPorts { + proto, portStr := nat.SplitProtoPort(string(port)) portInt, _ := nat.ParsePort(portStr) if portInt == 0 { continue } - c.PublicPortMapping[portInt] = container.PortSummary{ + c.PublicPortMapping[portInt] = container.Port{ PublicPort: uint16(portInt), //nolint:gosec PrivatePort: uint16(portInt), //nolint:gosec Type: proto, @@ -211,8 +210,8 @@ func setPrivateHostname(c *types.Container, helper containerHelper) { } if c.Network != "" { v, ok := helper.NetworkSettings.Networks[c.Network] - if ok && v.IPAddress.IsValid() { - c.PrivateHostname = v.IPAddress.String() + if ok { + c.PrivateHostname = v.IPAddress return } // try {project_name}_{network_name} @@ -220,9 +219,9 @@ func setPrivateHostname(c *types.Container, helper containerHelper) { oldNetwork, newNetwork := c.Network, fmt.Sprintf("%s_%s", proj, c.Network) if newNetwork != oldNetwork { v, ok = helper.NetworkSettings.Networks[newNetwork] - if ok && v.IPAddress.IsValid() { + if ok { c.Network = newNetwork // update network to the new one - c.PrivateHostname = v.IPAddress.String() + c.PrivateHostname = v.IPAddress return } } @@ -233,9 +232,9 @@ func setPrivateHostname(c *types.Container, helper containerHelper) { } // fallback to first network if no network is specified for k, v := range helper.NetworkSettings.Networks { - if v.IPAddress.IsValid() { + if v.IPAddress != "" { c.Network = k // update network to the first network - c.PrivateHostname = v.IPAddress.String() + c.PrivateHostname = v.IPAddress return } } diff --git a/internal/docker/container_helper.go b/internal/docker/container_helper.go index 171e55e7..e5a9c0f0 100644 --- a/internal/docker/container_helper.go +++ b/internal/docker/container_helper.go @@ -3,7 +3,7 @@ package docker import ( "strings" - "github.com/moby/moby/api/types/container" + "github.com/docker/docker/api/types/container" "github.com/yusing/ds/ordered" "github.com/yusing/godoxy/internal/types" strutils "github.com/yusing/goutils/strings" diff --git a/internal/docker/container_test.go b/internal/docker/container_test.go index f34d0147..def1357b 100644 --- a/internal/docker/container_test.go +++ b/internal/docker/container_test.go @@ -3,7 +3,7 @@ package docker import ( "testing" - "github.com/moby/moby/api/types/container" + "github.com/docker/docker/api/types/container" "github.com/yusing/godoxy/internal/types" expect "github.com/yusing/goutils/testing" ) diff --git a/internal/docker/list_containers.go b/internal/docker/list_containers.go index 4cb2b083..25bb721d 100644 --- a/internal/docker/list_containers.go +++ b/internal/docker/list_containers.go @@ -3,12 +3,12 @@ package docker import ( "context" - "github.com/moby/moby/api/types/container" - "github.com/moby/moby/client" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/client" "github.com/yusing/godoxy/internal/types" ) -var listOptions = client.ContainerListOptions{ +var listOptions = container.ListOptions{ // created|restarting|running|removing|paused|exited|dead // Filters: filters.NewArgs( // filters.Arg("status", "created"), @@ -31,7 +31,7 @@ func ListContainers(ctx context.Context, dockerCfg types.DockerProviderConfig) ( if err != nil { return nil, err } - return containers.Items, nil + return containers, nil } func IsErrConnectionFailed(err error) bool { diff --git a/internal/health/check/docker.go b/internal/health/check/docker.go index 5d1d4cff..e5509b60 100644 --- a/internal/health/check/docker.go +++ b/internal/health/check/docker.go @@ -2,13 +2,12 @@ package healthcheck import ( "context" + "encoding/json" "errors" "net/http" "time" - "github.com/bytedance/sonic" "github.com/moby/moby/api/types/container" - "github.com/moby/moby/client" "github.com/yusing/godoxy/internal/docker" "github.com/yusing/godoxy/internal/types" httputils "github.com/yusing/goutils/http" @@ -44,7 +43,7 @@ func Docker(ctx context.Context, state *DockerHealthcheckState, timeout time.Dur defer cancel() // the actual inspect response is intercepted and returned as RequestInterceptedError - _, err := state.client.ContainerInspect(ctx, state.containerId, client.ContainerInspectOptions{}) + _, err := state.client.ContainerInspect(ctx, state.containerId) var interceptedErr *httputils.RequestInterceptedError if !httputils.AsRequestInterceptedError(err, &interceptedErr) { @@ -106,7 +105,7 @@ func interceptDockerInspectResponse(resp *http.Response) (intercepted bool, err } var state container.State - err = sonic.Unmarshal(body, &state) + err = json.Unmarshal(body, &state) release(body) if err != nil { return false, err diff --git a/internal/homepage/icons/list/list_icons.go b/internal/homepage/icons/list/list_icons.go index 36992596..1ccefea5 100644 --- a/internal/homepage/icons/list/list_icons.go +++ b/internal/homepage/icons/list/list_icons.go @@ -2,12 +2,12 @@ package iconlist import ( "context" + "encoding/json" "net/http" "slices" "strings" "time" - "github.com/bytedance/sonic" "github.com/lithammer/fuzzysearch/fuzzy" "github.com/rs/zerolog/log" "github.com/yusing/godoxy/internal/common" @@ -270,7 +270,7 @@ func UpdateWalkxCodeIcons(m IconMap) error { } data := make(map[string][]string) - err = sonic.Unmarshal(body, &data) + err = json.Unmarshal(body, &data) release(body) if err != nil { return err @@ -349,7 +349,7 @@ func UpdateSelfhstIcons(m IconMap) error { } data := make([]SelfhStIcon, 0) - err = sonic.Unmarshal(body, &data) //nolint:musttag + err = json.Unmarshal(body, &data) //nolint:musttag release(body) if err != nil { return err diff --git a/internal/homepage/integrations/qbittorrent/client.go b/internal/homepage/integrations/qbittorrent/client.go index 4ec5df01..3b225ee0 100644 --- a/internal/homepage/integrations/qbittorrent/client.go +++ b/internal/homepage/integrations/qbittorrent/client.go @@ -2,11 +2,11 @@ package qbittorrent import ( "context" + "encoding/json" "io" "net/http" "net/url" - "github.com/bytedance/sonic" "github.com/yusing/godoxy/internal/homepage/widgets" gperr "github.com/yusing/goutils/errs" ) @@ -59,7 +59,7 @@ func jsonRequest[T any](ctx context.Context, client *Client, endpoint string, qu } defer resp.Body.Close() - err = sonic.ConfigDefault.NewDecoder(resp.Body).Decode(&result) + err = json.NewDecoder(resp.Body).Decode(&result) if err != nil { return result, err } diff --git a/internal/homepage/integrations/qbittorrent/logs.go b/internal/homepage/integrations/qbittorrent/logs.go index 03e1ed15..408d0b75 100644 --- a/internal/homepage/integrations/qbittorrent/logs.go +++ b/internal/homepage/integrations/qbittorrent/logs.go @@ -2,11 +2,10 @@ package qbittorrent import ( "context" + "encoding/json" "net/url" "strconv" "time" - - "github.com/bytedance/sonic" ) const endpointLogs = "/api/v2/log/main" @@ -45,7 +44,7 @@ func (l *LogEntry) Level() string { } func (l *LogEntry) MarshalJSON() ([]byte, error) { - return sonic.Marshal(map[string]any{ + return json.Marshal(map[string]any{ "id": l.ID, "timestamp": l.Timestamp, "level": l.Level(), diff --git a/internal/idlewatcher/debug.go b/internal/idlewatcher/debug.go index f2b085c0..5be84fe2 100644 --- a/internal/idlewatcher/debug.go +++ b/internal/idlewatcher/debug.go @@ -1,10 +1,10 @@ package idlewatcher import ( + "encoding/json" "iter" "strconv" - "github.com/bytedance/sonic" strutils "github.com/yusing/goutils/strings" ) @@ -14,7 +14,7 @@ type watcherDebug struct { func (w watcherDebug) MarshalJSON() ([]byte, error) { state := w.state.Load() - return sonic.Marshal(map[string]any{ + return json.Marshal(map[string]any{ "name": w.Name(), "state": map[string]string{ "status": string(state.status), diff --git a/internal/idlewatcher/events.go b/internal/idlewatcher/events.go index 39d6e23b..a3b9cfd8 100644 --- a/internal/idlewatcher/events.go +++ b/internal/idlewatcher/events.go @@ -1,11 +1,10 @@ package idlewatcher import ( + "encoding/json" "fmt" "io" "time" - - "github.com/bytedance/sonic" ) type WakeEvent struct { @@ -40,7 +39,7 @@ func (w *Watcher) newWakeEvent(eventType WakeEventType, message string, err erro } func (e *WakeEvent) WriteSSE(w io.Writer) error { - data, err := sonic.Marshal(e) + data, err := json.Marshal(e) if err != nil { return err } diff --git a/internal/idlewatcher/provider/docker.go b/internal/idlewatcher/provider/docker.go index 5c491ff2..0a0510af 100644 --- a/internal/idlewatcher/provider/docker.go +++ b/internal/idlewatcher/provider/docker.go @@ -3,8 +3,7 @@ package provider import ( "context" - "github.com/moby/moby/api/types/container" - "github.com/moby/moby/client" + "github.com/docker/docker/api/types/container" "github.com/yusing/godoxy/internal/docker" idlewatcher "github.com/yusing/godoxy/internal/idlewatcher/types" "github.com/yusing/godoxy/internal/types" @@ -18,7 +17,7 @@ type DockerProvider struct { containerID string } -var startOptions = client.ContainerStartOptions{} +var startOptions = container.StartOptions{} func NewDockerProvider(dockerCfg types.DockerProviderConfig, containerID string) (idlewatcher.Provider, error) { client, err := docker.NewClient(dockerCfg) @@ -33,41 +32,34 @@ func NewDockerProvider(dockerCfg types.DockerProviderConfig, containerID string) } func (p *DockerProvider) ContainerPause(ctx context.Context) error { - _, err := p.client.ContainerPause(ctx, p.containerID, client.ContainerPauseOptions{}) - return err + return p.client.ContainerPause(ctx, p.containerID) } func (p *DockerProvider) ContainerUnpause(ctx context.Context) error { - _, err := p.client.ContainerUnpause(ctx, p.containerID, client.ContainerUnpauseOptions{}) - return err + return p.client.ContainerUnpause(ctx, p.containerID) } func (p *DockerProvider) ContainerStart(ctx context.Context) error { - _, err := p.client.ContainerStart(ctx, p.containerID, startOptions) - return err + return p.client.ContainerStart(ctx, p.containerID, startOptions) } func (p *DockerProvider) ContainerStop(ctx context.Context, signal types.ContainerSignal, timeout int) error { - _, err := p.client.ContainerStop(ctx, p.containerID, client.ContainerStopOptions{ + return p.client.ContainerStop(ctx, p.containerID, container.StopOptions{ Signal: string(signal), Timeout: &timeout, }) - return err } func (p *DockerProvider) ContainerKill(ctx context.Context, signal types.ContainerSignal) error { - _, err := p.client.ContainerKill(ctx, p.containerID, client.ContainerKillOptions{ - Signal: string(signal), - }) - return err + return p.client.ContainerKill(ctx, p.containerID, string(signal)) } func (p *DockerProvider) ContainerStatus(ctx context.Context) (idlewatcher.ContainerStatus, error) { - status, err := p.client.ContainerInspect(ctx, p.containerID, client.ContainerInspectOptions{}) + status, err := p.client.ContainerInspect(ctx, p.containerID) if err != nil { return idlewatcher.ContainerStatusError, err } - switch status.Container.State.Status { + switch status.State.Status { case container.StateRunning: return idlewatcher.ContainerStatusRunning, nil case container.StateExited, container.StateDead, container.StateRestarting: @@ -75,12 +67,12 @@ func (p *DockerProvider) ContainerStatus(ctx context.Context) (idlewatcher.Conta case container.StatePaused: return idlewatcher.ContainerStatusPaused, nil } - return idlewatcher.ContainerStatusError, idlewatcher.ErrUnexpectedContainerStatus.Subject(string(status.Container.State.Status)) + return idlewatcher.ContainerStatusError, idlewatcher.ErrUnexpectedContainerStatus.Subject(status.State.Status) } func (p *DockerProvider) Watch(ctx context.Context) (eventCh <-chan watcher.Event, errCh <-chan gperr.Error) { return p.watcher.EventsWithOptions(ctx, watcher.DockerListOptions{ - Filters: watcher.NewDockerFilters( + Filters: watcher.NewDockerFilter( watcher.DockerFilterContainer, watcher.DockerFilterContainerNameID(p.containerID), watcher.DockerFilterStart, diff --git a/internal/jsonstore/README.md b/internal/jsonstore/README.md index 7c091173..b7a2ef7c 100644 --- a/internal/jsonstore/README.md +++ b/internal/jsonstore/README.md @@ -261,7 +261,7 @@ func loadNS[T store](ns namespace) T { } defer file.Close() - if err := sonic.ConfigDefault.NewDecoder(file).Decode(&store); err != nil { + if err := json.NewDecoder(file).Decode(&store); err != nil { log.Err(err).Msg("failed to decode store") } @@ -316,7 +316,7 @@ type MapStore[VT any] struct { ```go func (s MapStore[VT]) MarshalJSON() ([]byte, error) { - return sonic.Marshal(xsync.ToPlainMap(s.Map)) + return json.Marshal(xsync.ToPlainMap(s.Map)) } ``` @@ -325,7 +325,7 @@ func (s MapStore[VT]) MarshalJSON() ([]byte, error) { ```go func (s *MapStore[VT]) UnmarshalJSON(data []byte) error { tmp := make(map[string]VT) - if err := sonic.Unmarshal(data, &tmp); err != nil { + if err := json.Unmarshal(data, &tmp); err != nil { return err } s.Map = xsync.NewMap[string, VT](xsync.WithPresize(len(tmp))) @@ -349,7 +349,7 @@ The jsonstore package integrates with: Errors are logged but don't prevent store usage: ```go -if err := sonic.Unmarshal(data, &tmp); err != nil { +if err := json.Unmarshal(data, &tmp); err != nil { log.Err(err). Str("path", path). Msg("failed to load store") diff --git a/internal/jsonstore/jsonstore.go b/internal/jsonstore/jsonstore.go index 598a6eea..ae5c024f 100644 --- a/internal/jsonstore/jsonstore.go +++ b/internal/jsonstore/jsonstore.go @@ -6,7 +6,6 @@ import ( "path/filepath" "reflect" - "github.com/bytedance/sonic" "github.com/puzpuzpuz/xsync/v4" "github.com/rs/zerolog/log" "github.com/yusing/godoxy/internal/common" @@ -66,7 +65,7 @@ func loadNS[T store](ns namespace) T { } } else { defer file.Close() - if err := sonic.ConfigDefault.NewDecoder(file).Decode(&store); err != nil { + if err := json.NewDecoder(file).Decode(&store); err != nil { log.Err(err). Str("path", path). Msg("failed to load store") @@ -113,12 +112,12 @@ func (s *MapStore[VT]) Initialize() { } func (s MapStore[VT]) MarshalJSON() ([]byte, error) { - return sonic.Marshal(xsync.ToPlainMap(s.Map)) + return json.Marshal(xsync.ToPlainMap(s.Map)) } func (s *MapStore[VT]) UnmarshalJSON(data []byte) error { tmp := make(map[string]VT) - if err := sonic.Unmarshal(data, &tmp); err != nil { + if err := json.Unmarshal(data, &tmp); err != nil { return err } s.Map = xsync.NewMap[string, VT](xsync.WithPresize(len(tmp))) @@ -134,10 +133,10 @@ func (obj *ObjectStore[Ptr]) Initialize() { } func (obj ObjectStore[Ptr]) MarshalJSON() ([]byte, error) { - return sonic.Marshal(obj.ptr) + return json.Marshal(obj.ptr) } func (obj *ObjectStore[Ptr]) UnmarshalJSON(data []byte) error { obj.Initialize() - return sonic.Unmarshal(data, obj.ptr) + return json.Unmarshal(data, obj.ptr) } diff --git a/internal/metrics/period/entries.go b/internal/metrics/period/entries.go index cb6dd3ae..4864d3b3 100644 --- a/internal/metrics/period/entries.go +++ b/internal/metrics/period/entries.go @@ -3,8 +3,6 @@ package period import ( "encoding/json" "time" - - "github.com/bytedance/sonic" ) type Entries[T any] struct { @@ -75,7 +73,7 @@ type entriesJSON[T any] struct { } func (e *Entries[T]) MarshalJSON() ([]byte, error) { - return sonic.Marshal(entriesJSON[T]{ + return json.Marshal(entriesJSON[T]{ Entries: e.Get(), Interval: e.interval, }) diff --git a/internal/metrics/period/poller.go b/internal/metrics/period/poller.go index 390b735f..8f2ca4ed 100644 --- a/internal/metrics/period/poller.go +++ b/internal/metrics/period/poller.go @@ -10,7 +10,6 @@ import ( "sync" "time" - "github.com/bytedance/sonic" "github.com/rs/zerolog/log" gperr "github.com/yusing/goutils/errs" "github.com/yusing/goutils/synk" @@ -98,7 +97,7 @@ func (p *Poller[T, AggregateT]) save() error { } defer f.Close() - err = sonic.ConfigDefault.NewEncoder(f).Encode(p.period) + err = json.NewEncoder(f).Encode(p.period) if err != nil { return err } diff --git a/internal/metrics/systeminfo/system_info_test.go b/internal/metrics/systeminfo/system_info_test.go index 5e464294..a7cc6244 100644 --- a/internal/metrics/systeminfo/system_info_test.go +++ b/internal/metrics/systeminfo/system_info_test.go @@ -6,7 +6,6 @@ import ( "reflect" "testing" - "github.com/bytedance/sonic" "github.com/shirou/gopsutil/v4/disk" "github.com/shirou/gopsutil/v4/mem" "github.com/shirou/gopsutil/v4/net" @@ -82,12 +81,12 @@ var ( func TestSystemInfo(t *testing.T) { // Test marshaling - data, err := sonic.Marshal(testInfo) + data, err := json.Marshal(testInfo) expect.NoError(t, err) // Test unmarshaling back var decoded SystemInfo - err = sonic.Unmarshal(data, &decoded) + err = json.Unmarshal(data, &decoded) expect.NoError(t, err) // Compare original and decoded @@ -127,7 +126,7 @@ func TestSerialize(t *testing.T) { for _, query := range allQueries { t.Run(string(query), func(t *testing.T) { _, result := aggregate(entries, url.Values{"aggregate": []string{string(query)}}) - s, err := sonic.Marshal(result) + s, err := json.Marshal(result) expect.NoError(t, err) var v []map[string]any expect.NoError(t, json.Unmarshal(s, &v)) diff --git a/internal/metrics/uptime/uptime.go b/internal/metrics/uptime/uptime.go index 18baf000..3fa74b56 100644 --- a/internal/metrics/uptime/uptime.go +++ b/internal/metrics/uptime/uptime.go @@ -2,11 +2,11 @@ package uptime import ( "context" + "encoding/json" "net/url" "slices" "time" - "github.com/bytedance/sonic" "github.com/lithammer/fuzzysearch/fuzzy" "github.com/yusing/godoxy/internal/metrics/period" metricsutils "github.com/yusing/godoxy/internal/metrics/utils" @@ -50,7 +50,7 @@ func getStatuses(ctx context.Context, _ StatusByAlias) (StatusByAlias, error) { } func (s *Status) MarshalJSON() ([]byte, error) { - return sonic.Marshal(map[string]any{ + return json.Marshal(map[string]any{ "status": s.Status.String(), "latency": s.Latency, "timestamp": s.Timestamp, @@ -164,5 +164,5 @@ func (rs RouteStatuses) aggregate(limit int, offset int) Aggregated { } func (result Aggregated) MarshalJSON() ([]byte, error) { - return sonic.Marshal([]RouteAggregate(result)) + return json.Marshal([]RouteAggregate(result)) } diff --git a/internal/net/gphttp/middleware/captcha/hcaptcha.go b/internal/net/gphttp/middleware/captcha/hcaptcha.go index 351572a4..e6da96d8 100644 --- a/internal/net/gphttp/middleware/captcha/hcaptcha.go +++ b/internal/net/gphttp/middleware/captcha/hcaptcha.go @@ -3,6 +3,7 @@ package captcha import ( "bytes" "context" + "encoding/json" "errors" "net" "net/http" @@ -11,7 +12,6 @@ import ( _ "embed" - "github.com/bytedance/sonic" gperr "github.com/yusing/goutils/errs" ) @@ -70,7 +70,7 @@ func (p *HcaptchaProvider) Verify(r *http.Request) error { Success bool `json:"success"` Error []string `json:"error-codes"` } - if err := sonic.ConfigDefault.NewDecoder(resp.Body).Decode(&respData); err != nil { + if err := json.NewDecoder(resp.Body).Decode(&respData); err != nil { return err } diff --git a/internal/net/gphttp/middleware/middleware.go b/internal/net/gphttp/middleware/middleware.go index 77fb38af..ca519070 100644 --- a/internal/net/gphttp/middleware/middleware.go +++ b/internal/net/gphttp/middleware/middleware.go @@ -1,12 +1,12 @@ package middleware import ( + "encoding/json" "maps" "net/http" "reflect" "sort" - "github.com/bytedance/sonic" "github.com/rs/zerolog" "github.com/rs/zerolog/log" "github.com/yusing/godoxy/internal/serialization" @@ -152,7 +152,7 @@ func (m *Middleware) MarshalJSON() ([]byte, error) { commonOptions any } - return sonic.MarshalIndent(map[string]any{ + return json.MarshalIndent(map[string]any{ "name": m.name, "options": allOptions{ commonOptions: m.commonOptions, diff --git a/internal/net/gphttp/middleware/test_utils.go b/internal/net/gphttp/middleware/test_utils.go index 105540e1..e3226c6a 100644 --- a/internal/net/gphttp/middleware/test_utils.go +++ b/internal/net/gphttp/middleware/test_utils.go @@ -3,12 +3,12 @@ package middleware import ( "bytes" _ "embed" + "encoding/json" "io" "maps" "net/http" "net/http/httptest" - "github.com/bytedance/sonic" "github.com/yusing/godoxy/internal/common" nettypes "github.com/yusing/godoxy/internal/net/types" gperr "github.com/yusing/goutils/errs" @@ -24,7 +24,7 @@ func init() { return } tmp := map[string]string{} - err := sonic.Unmarshal(testHeadersRaw, &tmp) + err := json.Unmarshal(testHeadersRaw, &tmp) if err != nil { panic(err) } diff --git a/internal/net/types/url.go b/internal/net/types/url.go index bddc6b07..573ede69 100644 --- a/internal/net/types/url.go +++ b/internal/net/types/url.go @@ -1,9 +1,8 @@ package nettypes import ( + "encoding/json" urlPkg "net/url" - - "github.com/bytedance/sonic" ) type URL struct { @@ -47,7 +46,7 @@ func (u *URL) MarshalJSON() (text []byte, err error) { if u == nil { return []byte("null"), nil } - return sonic.Marshal(u.URL.String()) + return json.Marshal(u.URL.String()) } func (u *URL) Equals(other *URL) bool { diff --git a/internal/notif/body.go b/internal/notif/body.go index d87bddbe..970699a3 100644 --- a/internal/notif/body.go +++ b/internal/notif/body.go @@ -2,9 +2,9 @@ package notif import ( "bytes" + "encoding/json" "strings" - "github.com/bytedance/sonic" gperr "github.com/yusing/goutils/errs" ) @@ -69,7 +69,7 @@ func (f FieldsBody) Format(format LogFormat) ([]byte, error) { } return msg.Bytes(), nil case LogFormatRawJSON: - return sonic.Marshal(f) + return json.Marshal(f) } return f.Format(LogFormatMarkdown) } @@ -87,7 +87,7 @@ func (l ListBody) Format(format LogFormat) ([]byte, error) { } return msg.Bytes(), nil case LogFormatRawJSON: - return sonic.Marshal(l) + return json.Marshal(l) } return l.Format(LogFormatMarkdown) } @@ -97,7 +97,7 @@ func (m MessageBody) Format(format LogFormat) ([]byte, error) { case LogFormatPlain, LogFormatMarkdown: return []byte(m), nil case LogFormatRawJSON: - return sonic.Marshal(m) + return json.Marshal(m) } return []byte(m), nil } @@ -105,7 +105,7 @@ func (m MessageBody) Format(format LogFormat) ([]byte, error) { func (m MessageBodyBytes) Format(format LogFormat) ([]byte, error) { switch format { case LogFormatRawJSON: - return sonic.Marshal(string(m)) + return json.Marshal(string(m)) } return m, nil } @@ -113,7 +113,7 @@ func (m MessageBodyBytes) Format(format LogFormat) ([]byte, error) { func (e errorBody) Format(format LogFormat) ([]byte, error) { switch format { case LogFormatRawJSON: - return sonic.Marshal(e.Error) + return json.Marshal(e.Error) case LogFormatPlain: return gperr.Plain(e.Error), nil case LogFormatMarkdown: diff --git a/internal/notif/gotify.go b/internal/notif/gotify.go index 140f6fac..1a70b6f7 100644 --- a/internal/notif/gotify.go +++ b/internal/notif/gotify.go @@ -1,10 +1,10 @@ package notif import ( + "encoding/json" "fmt" "io" - "github.com/bytedance/sonic" "github.com/gotify/server/v2/model" "github.com/rs/zerolog" gperr "github.com/yusing/goutils/errs" @@ -65,7 +65,7 @@ func (client *GotifyClient) MarshalMessage(logMsg *LogMessage) ([]byte, error) { } } - data, err := sonic.Marshal(msg) + data, err := json.Marshal(msg) if err != nil { return nil, err } @@ -76,7 +76,7 @@ func (client *GotifyClient) MarshalMessage(logMsg *LogMessage) ([]byte, error) { // fmtError implements Provider. func (client *GotifyClient) fmtError(respBody io.Reader) error { var errm model.Error - err := sonic.ConfigDefault.NewDecoder(respBody).Decode(&errm) + err := json.NewDecoder(respBody).Decode(&errm) if err != nil { return fmt.Errorf("failed to decode err response: %w", err) } diff --git a/internal/notif/webhook.go b/internal/notif/webhook.go index e0f236de..4f073d99 100644 --- a/internal/notif/webhook.go +++ b/internal/notif/webhook.go @@ -2,11 +2,11 @@ package notif import ( _ "embed" + "encoding/json" "io" "net/http" "strings" - "github.com/bytedance/sonic" gperr "github.com/yusing/goutils/errs" ) @@ -99,7 +99,7 @@ func (webhook *Webhook) fmtError(respBody io.Reader) error { } func (webhook *Webhook) MarshalMessage(logMsg *LogMessage) ([]byte, error) { - title, err := sonic.Marshal(logMsg.Title) + title, err := json.Marshal(logMsg.Title) if err != nil { return nil, err } @@ -118,7 +118,7 @@ func (webhook *Webhook) MarshalMessage(logMsg *LogMessage) ([]byte, error) { return nil, err } if webhook.MIMEType == MimeTypeJSON { - message, err = sonic.Marshal(string(message)) + message, err = json.Marshal(string(message)) if err != nil { return nil, err } @@ -147,5 +147,5 @@ func validateJSONPayload(payload string) bool { "$color", "", ) payload = replacer.Replace(payload) - return sonic.Valid([]byte(payload)) + return json.Valid([]byte(payload)) } diff --git a/internal/proxmox/client.go b/internal/proxmox/client.go index 49130d21..d8303ddc 100644 --- a/internal/proxmox/client.go +++ b/internal/proxmox/client.go @@ -2,9 +2,9 @@ package proxmox import ( "context" + "encoding/json" "fmt" - "github.com/bytedance/sonic" "github.com/luthermonson/go-proxmox" ) @@ -44,7 +44,7 @@ func (c *Client) Name() string { } func (c *Client) MarshalJSON() ([]byte, error) { - return sonic.Marshal(map[string]any{ + return json.Marshal(map[string]any{ "version": c.Version, "cluster": map[string]any{ "name": c.Cluster.Name, diff --git a/internal/proxmox/node.go b/internal/proxmox/node.go index 1772c836..e4804e7e 100644 --- a/internal/proxmox/node.go +++ b/internal/proxmox/node.go @@ -2,10 +2,10 @@ package proxmox import ( "context" + "encoding/json" "fmt" "strings" - "github.com/bytedance/sonic" "github.com/luthermonson/go-proxmox" "github.com/yusing/goutils/pool" ) @@ -43,7 +43,7 @@ func (n *Node) String() string { } func (n *Node) MarshalJSON() ([]byte, error) { - return sonic.Marshal(map[string]any{ + return json.Marshal(map[string]any{ "name": n.name, "id": n.id, }) diff --git a/internal/route/provider/docker_labels_test.go b/internal/route/provider/docker_labels_test.go index a7064235..57a2d1d9 100644 --- a/internal/route/provider/docker_labels_test.go +++ b/internal/route/provider/docker_labels_test.go @@ -3,8 +3,8 @@ package provider import ( "testing" + "github.com/docker/docker/api/types/container" "github.com/goccy/go-yaml" - "github.com/moby/moby/api/types/container" "github.com/yusing/godoxy/internal/docker" "github.com/yusing/godoxy/internal/types" expect "github.com/yusing/goutils/testing" @@ -26,7 +26,7 @@ func TestParseDockerLabels(t *testing.T) { Names: []string{"container"}, Labels: labels, State: "running", - Ports: []container.PortSummary{ + Ports: []container.Port{ {Type: "tcp", PrivatePort: 1234, PublicPort: 1234}, }, }, types.DockerProviderConfig{URL: "unix:///var/run/docker.sock"}), diff --git a/internal/route/provider/docker_test.go b/internal/route/provider/docker_test.go index 50dc59f4..91c16bda 100644 --- a/internal/route/provider/docker_test.go +++ b/internal/route/provider/docker_test.go @@ -1,13 +1,12 @@ package provider import ( - "net/netip" "testing" "time" - "github.com/moby/moby/api/types/container" - "github.com/moby/moby/api/types/network" - "github.com/moby/moby/client" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/network" + "github.com/docker/docker/client" D "github.com/yusing/godoxy/internal/docker" "github.com/yusing/godoxy/internal/route" routeTypes "github.com/yusing/godoxy/internal/route/types" @@ -276,7 +275,7 @@ func TestPrivateIPLocalhost(t *testing.T) { NetworkSettings: &container.NetworkSettingsSummary{ Networks: map[string]*network.EndpointSettings{ "network": { - IPAddress: netip.MustParseAddr(testDockerIP), + IPAddress: testDockerIP, }, }, }, @@ -294,7 +293,7 @@ func TestPrivateIPRemote(t *testing.T) { NetworkSettings: &container.NetworkSettingsSummary{ Networks: map[string]*network.EndpointSettings{ "network": { - IPAddress: netip.MustParseAddr(testDockerIP), + IPAddress: testDockerIP, }, }, }, @@ -316,11 +315,11 @@ func TestStreamDefaultValues(t *testing.T) { NetworkSettings: &container.NetworkSettingsSummary{ Networks: map[string]*network.EndpointSettings{ "network": { - IPAddress: netip.MustParseAddr(privIP), + IPAddress: privIP, }, }, }, - Ports: []container.PortSummary{ + Ports: []container.Port{ {Type: "udp", PrivatePort: privPort, PublicPort: pubPort}, }, } @@ -373,7 +372,7 @@ func TestImplicitExcludeDatabase(t *testing.T) { t.Run("exposed port detection", func(t *testing.T) { r, ok := makeRoutes(&container.Summary{ Names: dummyNames, - Ports: []container.PortSummary{ + Ports: []container.Port{ {Type: "tcp", PrivatePort: 5432, PublicPort: 5432}, }, })["a"] diff --git a/internal/route/rules/rules.go b/internal/route/rules/rules.go index 0fbf9b88..ebaf5fab 100644 --- a/internal/route/rules/rules.go +++ b/internal/route/rules/rules.go @@ -244,7 +244,7 @@ func (rules Rules) BuildHandler(up http.HandlerFunc) http.HandlerFunc { } func appendRuleError(rm *httputils.ResponseModifier, rule *Rule, err error) { - rm.AppendError("rule: %s, error: %w", rule.Name, err) + // rm.AppendError("rule: %s, error: %w", rule.Name, err) } func isTerminatingHandler(handler CommandHandler) bool { diff --git a/internal/route/types/scheme.go b/internal/route/types/scheme.go index b7044ab3..8c22e8e4 100644 --- a/internal/route/types/scheme.go +++ b/internal/route/types/scheme.go @@ -1,9 +1,9 @@ package route import ( + "encoding/json" "strconv" - "github.com/bytedance/sonic" gperr "github.com/yusing/goutils/errs" ) @@ -57,7 +57,7 @@ func (s Scheme) MarshalJSON() ([]byte, error) { func (s *Scheme) UnmarshalJSON(data []byte) error { var v string - if err := sonic.Unmarshal(data, &v); err != nil { + if err := json.Unmarshal(data, &v); err != nil { return err } return s.Parse(v) diff --git a/internal/serialization/serialization.go b/internal/serialization/serialization.go index bd16526e..57de6c6c 100644 --- a/internal/serialization/serialization.go +++ b/internal/serialization/serialization.go @@ -1,6 +1,7 @@ package serialization import ( + "encoding/json" "errors" "os" "reflect" @@ -10,7 +11,6 @@ import ( "time" "unsafe" - "github.com/bytedance/sonic" "github.com/go-playground/validator/v10" "github.com/goccy/go-yaml" "github.com/puzpuzpuz/xsync/v4" @@ -32,8 +32,8 @@ func ToSerializedObject[VT any](m map[string]VT) SerializedObject { } func init() { - strutils.SetJSONMarshaler(sonic.Marshal) - strutils.SetJSONUnmarshaler(sonic.Unmarshal) + strutils.SetJSONMarshaler(json.Marshal) + strutils.SetJSONUnmarshaler(json.Unmarshal) strutils.SetYAMLMarshaler(yaml.Marshal) strutils.SetYAMLUnmarshaler(yaml.Unmarshal) } @@ -677,7 +677,7 @@ func loadSerialized[T any](path string, dst *T, deserialize func(data []byte, ds } func SaveJSON[T any](path string, src *T, perm os.FileMode) error { - data, err := sonic.Marshal(src) + data, err := json.Marshal(src) if err != nil { return err } @@ -685,7 +685,7 @@ func SaveJSON[T any](path string, src *T, perm os.FileMode) error { } func LoadJSONIfExist[T any](path string, dst *T) error { - err := loadSerialized(path, dst, sonic.Unmarshal) + err := loadSerialized(path, dst, json.Unmarshal) if os.IsNotExist(err) { return nil } diff --git a/internal/types/docker.go b/internal/types/docker.go index b33f53e4..330780c6 100644 --- a/internal/types/docker.go +++ b/internal/types/docker.go @@ -1,8 +1,9 @@ package types import ( - "github.com/bytedance/sonic" - "github.com/moby/moby/api/types/container" + "encoding/json" + + "github.com/docker/docker/api/types/container" "github.com/yusing/ds/ordered" "github.com/yusing/godoxy/internal/agentpool" gperr "github.com/yusing/goutils/errs" @@ -11,7 +12,7 @@ import ( type ( LabelMap = map[string]any - PortMapping = map[int]container.PortSummary + PortMapping = map[int]container.Port Container struct { DockerCfg DockerProviderConfig `json:"docker_cfg"` Image *ContainerImage `json:"image"` @@ -69,5 +70,5 @@ func (e *ContainerError) Unwrap() error { func (e *ContainerError) MarshalJSON() ([]byte, error) { err := e.errs.Error().(gperr.PlainError) - return sonic.Marshal(string(err.Plain())) + return json.Marshal(string(err.Plain())) } diff --git a/internal/types/health.go b/internal/types/health.go index be45b3f5..1281a423 100644 --- a/internal/types/health.go +++ b/internal/types/health.go @@ -7,7 +7,6 @@ import ( "strconv" "time" - "github.com/bytedance/sonic" "github.com/yusing/goutils/task" ) @@ -162,7 +161,7 @@ func (s HealthStatus) MarshalJSON() ([]byte, error) { func (s *HealthStatus) UnmarshalJSON(data []byte) error { var v string - if err := sonic.Unmarshal(data, &v); err != nil { + if err := json.Unmarshal(data, &v); err != nil { return fmt.Errorf("failed to unmarshal health status: %w", err) } @@ -178,7 +177,7 @@ func (jsonRepr *HealthJSONRepr) MarshalJSON() ([]byte, error) { if url == "http://:0" { url = "" } - return sonic.Marshal(HealthJSON{ + return json.Marshal(HealthJSON{ Name: jsonRepr.Name, Config: jsonRepr.Config, Started: jsonRepr.Started.Unix(), diff --git a/internal/types/idlewatcher.go b/internal/types/idlewatcher.go index 478d7d6f..624341d0 100644 --- a/internal/types/idlewatcher.go +++ b/internal/types/idlewatcher.go @@ -17,7 +17,7 @@ type ( IdlewatcherConfigBase struct { // 0: no idle watcher. // Positive: idle watcher with idle timeout. - // Negative: idle watcher as a dependency. + // Negative: idle watcher as a dependency. IdleTimeout time.Duration `json:"idle_timeout" json_ext:"duration"` IdleTimeout time.Duration `json:"idle_timeout"` WakeTimeout time.Duration `json:"wake_timeout"` StopTimeout time.Duration `json:"stop_timeout"` diff --git a/internal/watcher/docker_watcher.go b/internal/watcher/docker_watcher.go index 77b8d2c7..47ebb3a8 100644 --- a/internal/watcher/docker_watcher.go +++ b/internal/watcher/docker_watcher.go @@ -5,8 +5,9 @@ import ( "errors" "time" - dockerEvents "github.com/moby/moby/api/types/events" - "github.com/moby/moby/client" + dockerEvents "github.com/docker/docker/api/types/events" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/client" "github.com/rs/zerolog/log" "github.com/yusing/godoxy/internal/docker" "github.com/yusing/godoxy/internal/types" @@ -18,42 +19,23 @@ type ( DockerWatcher struct { cfg types.DockerProviderConfig } - DockerListOptions = client.EventsListOptions - DockerFilters = client.Filters + DockerListOptions = dockerEvents.ListOptions ) -type DockerFilter struct { - Term string - Values []string -} - -func NewDockerFilter(term string, values ...string) DockerFilter { - return DockerFilter{ - Term: term, - Values: values, - } -} - -func NewDockerFilters(filters ...DockerFilter) client.Filters { - f := make(client.Filters, len(filters)) - for _, filter := range filters { - f.Add(filter.Term, filter.Values...) - } - return f -} - // https://docs.docker.com/reference/api/engine/version/v1.47/#tag/System/operation/SystemPingHead var ( - DockerFilterContainer = NewDockerFilter("type", string(dockerEvents.ContainerEventType)) - DockerFilterStart = NewDockerFilter("event", string(dockerEvents.ActionStart)) - DockerFilterStop = NewDockerFilter("event", string(dockerEvents.ActionStop)) - DockerFilterDie = NewDockerFilter("event", string(dockerEvents.ActionDie)) - DockerFilterDestroy = NewDockerFilter("event", string(dockerEvents.ActionDestroy)) - DockerFilterKill = NewDockerFilter("event", string(dockerEvents.ActionKill)) - DockerFilterPause = NewDockerFilter("event", string(dockerEvents.ActionPause)) - DockerFilterUnpause = NewDockerFilter("event", string(dockerEvents.ActionUnPause)) + DockerFilterContainer = filters.Arg("type", string(dockerEvents.ContainerEventType)) + DockerFilterStart = filters.Arg("event", string(dockerEvents.ActionStart)) + DockerFilterStop = filters.Arg("event", string(dockerEvents.ActionStop)) + DockerFilterDie = filters.Arg("event", string(dockerEvents.ActionDie)) + DockerFilterDestroy = filters.Arg("event", string(dockerEvents.ActionDestroy)) + DockerFilterKill = filters.Arg("event", string(dockerEvents.ActionKill)) + DockerFilterPause = filters.Arg("event", string(dockerEvents.ActionPause)) + DockerFilterUnpause = filters.Arg("event", string(dockerEvents.ActionUnPause)) - optionsDefault = DockerListOptions{Filters: NewDockerFilters( + NewDockerFilter = filters.NewArgs + + optionsDefault = DockerListOptions{Filters: NewDockerFilter( DockerFilterContainer, DockerFilterStart, // DockerFilterStop, @@ -72,8 +54,8 @@ var ( } ) -func DockerFilterContainerNameID(nameOrID string) DockerFilter { - return NewDockerFilter("container", nameOrID) +func DockerFilterContainerNameID(nameOrID string) filters.KeyValuePair { + return filters.Arg("container", nameOrID) } func NewDockerWatcher(dockerCfg types.DockerProviderConfig) DockerWatcher { @@ -103,15 +85,15 @@ func (w DockerWatcher) EventsWithOptions(ctx context.Context, options DockerList client.Close() }() - chs := client.Events(ctx, options) + cEventCh, cErrCh := client.Events(ctx, options) defer log.Debug().Str("host", client.DaemonHost()).Msg("docker watcher closed") for { select { case <-ctx.Done(): return - case msg := <-chs.Messages: + case msg := <-cEventCh: w.handleEvent(msg, eventCh) - case err := <-chs.Err: + case err := <-cErrCh: if err == nil { continue } @@ -140,7 +122,7 @@ func (w DockerWatcher) EventsWithOptions(ctx context.Context, options DockerList // connection successful, trigger reload (reload routes) eventCh <- reloadTrigger // reopen event channel - chs = client.Events(ctx, options) + cEventCh, cErrCh = client.Events(ctx, options) } } }() diff --git a/internal/watcher/events/events.go b/internal/watcher/events/events.go index f088f0c0..4fe137cd 100644 --- a/internal/watcher/events/events.go +++ b/internal/watcher/events/events.go @@ -3,7 +3,7 @@ package events import ( "fmt" - dockerEvents "github.com/moby/moby/api/types/events" + dockerEvents "github.com/docker/docker/api/types/events" ) type (