diff --git a/.dockerignore b/.dockerignore
index 64e6abb..982102c 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -7,3 +7,4 @@ resource/frontend
resource/runner/problem/*
resource/runner/tmp/*
resource/runner/user/*
+resource/runner/framework/rootfs/*
diff --git a/.github/workflows/container.yml b/.github/workflows/container.yml
index 93c0e4d..9d82b10 100644
--- a/.github/workflows/container.yml
+++ b/.github/workflows/container.yml
@@ -28,8 +28,11 @@ jobs:
run: echo -n "$SENTRY_DSN" > dsn.txt
env:
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
+ - name: Build Rootfs Image
+ run: ./build_image.sh rootfs
+ env:
+ DOCKER: podman
- name: Build Base Image
- if: startsWith(github.ref, 'refs/tags/')
run: ./build_image.sh base
env:
DOCKER: podman
diff --git a/.idea/.gitignore b/.idea/.gitignore
index 13566b8..a9d7db9 100644
--- a/.idea/.gitignore
+++ b/.idea/.gitignore
@@ -6,3 +6,5 @@
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
+# GitHub Copilot persisted chat sessions
+/copilot/chatSessions
diff --git a/.idea/woj-server.iml b/.idea/woj-server.iml
index b91b798..0786f3b 100644
--- a/.idea/woj-server.iml
+++ b/.idea/woj-server.iml
@@ -6,6 +6,8 @@
+
+
diff --git a/Base.Dockerfile b/Base.Dockerfile
new file mode 100644
index 0000000..c2865f8
--- /dev/null
+++ b/Base.Dockerfile
@@ -0,0 +1,16 @@
+# builder
+FROM docker.io/library/golang:alpine
+
+#ENV GOPROXY=https://goproxy.cn
+ENV CGO_ENABLED=0
+WORKDIR /builder
+
+RUN apk add --no-cache git make
+RUN go install github.com/swaggo/swag/cmd/swag@latest
+
+COPY go.mod /builder/go.mod
+COPY go.sum /builder/go.sum
+RUN go mod download
+
+COPY . /builder
+RUN make build
diff --git a/Makefile b/Makefile
index 2d01027..bea8a55 100644
--- a/Makefile
+++ b/Makefile
@@ -9,11 +9,10 @@ LDFLAGS += -X $(PKG_BASE)/cmd.BuildTime=$(BUILD_TIME)
LDFLAGS += -X $(PKG_BASE)/cmd.Version=$(VERSION)
LDFLAGS += -X $(PKG_BASE)/cmd.GitCommit=$(GIT_COMMIT)
LDFLAGS += -X $(PKG_BASE)/cmd.SentryDSN=$(shell cat dsn.txt)
-LDFLAGS += -X $(PKG_BASE)/internal/service/runner.ContainerImageFull=$(CONTAINER_IMAGE_FULL)
-LDFLAGS += -X $(PKG_BASE)/internal/service/runner.ContainerImageRun=$(CONTAINER_IMAGE_RUN)
LDFLAGS += -s -w
-GOBUILD := $(GO) build -ldflags '$(LDFLAGS)'
+GOBUILD := $(GO) build
+GOFLAGS := -ldflags '$(LDFLAGS)'
GOBIN := $(shell go env GOPATH)/bin
.PHONY: all build clean dep swagger fmt coverage test
@@ -23,7 +22,7 @@ default: all
all: clean build
build: swagger dep
- $(GOBUILD) -o woj ./cmd/woj
+ $(GOBUILD) $(GOFLAGS) -o woj ./cmd/woj
clean:
rm -f woj coverage.out coverage.html
diff --git a/Runner.Dockerfile b/Runner.Dockerfile
index 43bdeee..c4a32e4 100644
--- a/Runner.Dockerfile
+++ b/Runner.Dockerfile
@@ -1,37 +1,33 @@
-# builder
-FROM docker.io/library/golang:alpine AS builder
-
-#ENV GOPROXY=https://goproxy.cn
-ENV CGO_ENABLED=0
-WORKDIR /builder
-
-RUN apk add --no-cache git make
-RUN go install github.com/swaggo/swag/cmd/swag@latest
-
ARG IMAGE_PREFIX=git.0x7f.app/woj
-ENV CONTAINER_IMAGE_FULL=${IMAGE_PREFIX}/ubuntu-full:latest
-ENV CONTAINER_IMAGE_RUN=${IMAGE_PREFIX}/ubuntu-run:latest
+ARG VERSION=latest
-COPY go.mod /builder/go.mod
-COPY go.sum /builder/go.sum
-RUN go mod download
+# Base image
+FROM ${IMAGE_PREFIX}/woj-server-base:${VERSION} AS base
-COPY . /builder
-RUN make build
+# Rootfs: debian-full
+FROM ${IMAGE_PREFIX}/debian-full:${VERSION} AS rootfs-full
+# Rootfs: debian-full
+FROM ${IMAGE_PREFIX}/debian-run:${VERSION} AS rootfs-run
-# main image
+# Main image
FROM docker.io/library/alpine
WORKDIR /app
-RUN apk --no-cache add tzdata ca-certificates bash tini \
- containerd nerdctl
+RUN apk --no-cache add tzdata ca-certificates bash tini
# sources
-COPY --from=builder /builder/resource/runner /app/resource/runner
-COPY --from=builder /builder/config.docker.yaml /app
-COPY --from=builder /builder/docker-entrypoint.sh /app
-COPY --from=builder /builder/woj /app
+COPY --from=base /builder/resource/runner /app/resource/runner
+COPY --from=base /builder/config.docker.yaml /app
+COPY --from=base /builder/docker-entrypoint.sh /app
+COPY --from=base /builder/woj /app
+
+# rootfs
+COPY --from=rootfs-full / /app/resource/runner/framework/rootfs/full
+COPY --from=rootfs-run / /app/resource/runner/framework/rootfs/run
+
+# nsjail
+COPY --from=rootfs-full /woj/framework/scripts/nsjail /app/resource/runner/framework/scripts/nsjail
# reap zombies from containerd-shim
ENTRYPOINT ["/sbin/tini", "/app/docker-entrypoint.sh"]
diff --git a/Server.Dockerfile b/Server.Dockerfile
index 4884884..18a8a48 100644
--- a/Server.Dockerfile
+++ b/Server.Dockerfile
@@ -1,34 +1,23 @@
-# Go builder
-FROM docker.io/library/golang:alpine AS go-builder
+ARG IMAGE_PREFIX=git.0x7f.app/woj
+ARG VERSION=latest
-#ENV GOPROXY=https://goproxy.cn
-ENV CGO_ENABLED=0
-WORKDIR /builder
-
-RUN apk add --no-cache git make
-RUN go install github.com/swaggo/swag/cmd/swag@latest
-
-COPY go.mod /builder/go.mod
-COPY go.sum /builder/go.sum
-RUN go mod download
-
-COPY . /builder
-RUN make build
+# Base image
+FROM ${IMAGE_PREFIX}/woj-server-base:${VERSION} AS base
# UI Builder
-FROM git.0x7f.app/woj/woj-ui:1.1.0 AS ui-builder
+FROM ${IMAGE_PREFIX}/woj-ui:${VERSION} AS ui
RUN find /app -type f -name "*.map" -delete
-# main image
+# Main image
FROM docker.io/library/alpine
WORKDIR /app
RUN apk --no-cache add tzdata ca-certificates bash
-COPY --from=go-builder /builder/config.docker.yaml /app
-COPY --from=go-builder /builder/docker-entrypoint.sh /app
-COPY --from=go-builder /builder/woj /app
+COPY --from=base /builder/config.docker.yaml /app
+COPY --from=base /builder/docker-entrypoint.sh /app
+COPY --from=base /builder/woj /app
-COPY --from=ui-builder /app /app/resource/frontend
+COPY --from=ui /app /app/resource/frontend
ENTRYPOINT ["/app/docker-entrypoint.sh"]
diff --git a/build_image.sh b/build_image.sh
index 3260371..6bb08c4 100755
--- a/build_image.sh
+++ b/build_image.sh
@@ -10,64 +10,74 @@ log_info "VERSION: $VERSION"
IMAGE_PREFIX=${IMAGE_PREFIX:-"git.0x7f.app/woj"}
function docker_build() {
- tag_name="$IMAGE_PREFIX/$1"
+ tag_name="$IMAGE_PREFIX/$1:$VERSION"
docker_file="$2"
shift 2
- $DOCKER build -t "$tag_name" -f "$docker_file" --build-arg "IMAGE_PREFIX=$IMAGE_PREFIX" "$@" . ||
+ $DOCKER build -t "$tag_name" -f "$docker_file" --build-arg "IMAGE_PREFIX=$IMAGE_PREFIX" --build-arg "VERSION=$VERSION" "$@" . ||
{ log_error "[!] Failed to build $tag_name"; exit 1; }
}
function docker_push() {
- full_name="$IMAGE_PREFIX/$1"
- $DOCKER push "$full_name" ||
- { log_error "[!] Failed to push $full_name"; exit 1; }
+ tag_name="$IMAGE_PREFIX/$1"
+ $DOCKER push "$tag_name" ||
+ { log_error "[!] Failed to push $tag_name"; exit 1; }
}
-function build_base() {
- log_info "[+] Building Base Images"
+function build_rootfs() {
+ log_info "[+] Building Rootfs Images"
pushd resource/runner || exit 1
- docker_build "ubuntu-full:latest" "scripts/ubuntu-full.Dockerfile"
- docker_build "ubuntu-run:latest" "scripts/ubuntu-run.Dockerfile"
+ docker_build "debian-full" "scripts/debian-full.Dockerfile"
+ docker_build "debian-run" "scripts/debian-run.Dockerfile"
popd || exit 1
}
-function push_base() {
- log_info "[+] Pushing Base Images"
- docker_push "ubuntu-full:latest"
- docker_push "ubuntu-run:latest"
+function push_rootfs() {
+ log_info "[+] Pushing Rootfs Images"
+ docker_push "debian-full:$VERSION"
+ docker_push "debian-run:$VERSION"
+}
+
+function build_base() {
+ log_info "[+] Building Base"
+ docker_build "woj-server-base" "Base.Dockerfile"
}
function build_server() {
log_info "[+] Building Server"
- docker_build "woj-server:latest" "Server.Dockerfile"
+ docker_build "woj-server" "Server.Dockerfile"
}
function build_runner() {
log_info "[+] Building Runner"
- if [[ "$DOCKER" == "docker" ]]; then
- # docker do not support --cap-add during build time
- docker_build "woj-runner:latest" "Runner.Dockerfile" --allow security.insecure
- else
- # podman
- docker_build "woj-runner:latest" "Runner.Dockerfile" --cap-add=sys_admin --security-opt label=disable
- fi
+ docker_build "woj-runner" "Runner.Dockerfile"
+}
+
+function push_base() {
+ log_info "[+] Pushing Base Images"
+ docker_push "woj-server-base:$VERSION"
+ $DOCKER tag "$IMAGE_PREFIX/woj-server-base:$VERSION" "$IMAGE_PREFIX/woj-server-base:latest"
+ docker_push "woj-server-base:latest"
}
function push_server() {
log_info "[+] Pushing Server Images"
+ docker_push "woj-server"
+ $DOCKER tag "$IMAGE_PREFIX/woj-server:$VERSION" "$IMAGE_PREFIX/woj-server:latest"
docker_push "woj-server:latest"
- $DOCKER tag "$IMAGE_PREFIX/woj-server:latest" "$IMAGE_PREFIX/woj-server:$VERSION"
- docker_push "woj-server:$VERSION"
}
function push_runner() {
log_info "[+] Pushing Runner Images"
+ docker_push "woj-runner"
+ $DOCKER tag "$IMAGE_PREFIX/woj-runner:$VERSION" "$IMAGE_PREFIX/woj-runner:latest"
docker_push "woj-runner:latest"
- $DOCKER tag "$IMAGE_PREFIX/woj-runner:latest" "$IMAGE_PREFIX/woj-runner:$VERSION"
- docker_push "woj-runner:$VERSION"
}
-if [ "$1" == "base" ]; then
+if [ "$1" == "rootfs" ]; then
+ build_rootfs
+ push_rootfs
+ exit 0
+elif [ "$1" == "base" ]; then
build_base
push_base
exit 0
@@ -80,6 +90,8 @@ elif [ "$1" == "runner" ]; then
push_runner
exit 0
elif [ "$1" == "all" ]; then
+ build_rootfs
+ push_rootfs
build_base
push_base
build_server
@@ -88,6 +100,6 @@ elif [ "$1" == "all" ]; then
push_runner
exit 0
else
- log_error "Usage: $0 [base|server|runner|all]"
+ log_error "Usage: $0 [rootfs|base|server|runner|all]"
exit 1
fi
diff --git a/config.docker.yaml b/config.docker.yaml
index 283918f..0797be1 100644
--- a/config.docker.yaml
+++ b/config.docker.yaml
@@ -38,7 +38,7 @@ Storage:
Bucket: ${STORAGE_BUCKET}
Runner:
- Address: ${RUNNER_ADDRESS}
+ CGroup: ${CGROUP_PATH}
Metrics:
Namespace: ${METRICS_NAMESPACE}
diff --git a/docker-compose.yml b/docker-compose.yml
index f0afdfc..74fc6c1 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -44,7 +44,7 @@ services:
- STORAGE_SECRET_KEY=secret_key
- STORAGE_BUCKET=woj
- DEVELOPMENT=true
- - START_CONTAINERD=true
+ - SETUP_CGROUP=true
volumes:
- runner:/app/resource/runner/user
- container:/var/lib/containerd
@@ -59,14 +59,13 @@ services:
storage:
image: quay.io/minio/minio:latest
restart: unless-stopped
- healthcheck:
- test: [ "CMD", "curl", "-f", "http://127.0.0.1:9000/minio/health/live" ]
- interval: 5s
entrypoint: sh
command: -c 'mkdir -p /data/woj && minio server /data'
environment:
MINIO_ROOT_USER: "access_key"
MINIO_ROOT_PASSWORD: "secret_key"
+ ports:
+ - "9000:9000"
volumes:
- storage:/data
@@ -76,6 +75,8 @@ services:
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 5s
+ ports:
+ - "6379:6379"
volumes:
- cache:/data
@@ -89,6 +90,8 @@ services:
- POSTGRES_USER=dev
- POSTGRES_PASSWORD=password
- POSTGRES_DB=dev
+ ports:
+ - "5432:5432"
volumes:
- db:/var/lib/postgresql/data
diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh
index 3faeaac..dea0112 100755
--- a/docker-entrypoint.sh
+++ b/docker-entrypoint.sh
@@ -74,7 +74,7 @@ function extract_storage() {
}
function extract_runner() {
- check_env "RUNNER_ADDRESS" "/run/containerd/containerd.sock" true
+ check_env "CGROUP_PATH" "/sys/fs/cgroup/nsjail" true
}
function extract_metrics() {
@@ -111,13 +111,13 @@ function generate_config() {
# dump env vars
log_info "creating config.yaml"
- . /tmp/tmp.yaml || (log_error "failed to create config.yaml" && exit 1)
+ . /tmp/tmp.yaml || { log_error "failed to create config.yaml"; exit 1; }
# cleanup
rm -f /tmp/tmp.yaml
}
-startup_containerd() {
+setup_cgroups() {
# taken from https://github.com/moby/moby/blob/ee6cbc540e9c62feb143c2a8d3f0c86d2a468767/hack/dind#L59-L69
# cgroup v2: enable nesting
if [ -f /sys/fs/cgroup/cgroup.controllers ]; then
@@ -130,13 +130,14 @@ startup_containerd() {
sed -e 's/ / +/g' -e 's/^/+/' < /sys/fs/cgroup/cgroup.controllers \
> /sys/fs/cgroup/cgroup.subtree_control
fi
- nohup containerd > /tmp/containerd.log 2>&1 &
- sleep 5 # wait for containerd
- log_info 'containerd started'
+
+ # create nsjail group
+ mkdir -p /sys/fs/cgroup/nsjail
+ sed -e 's/ / +/g' -e 's/^/+/' < /sys/fs/cgroup/nsjail/cgroup.controllers > /sys/fs/cgroup/nsjail/cgroup.subtree_control
}
-if [ -n "$START_CONTAINERD" ]; then
- startup_containerd
+if [ -n "$SETUP_CGROUP" ]; then
+ setup_cgroups
fi
generate_config
diff --git a/go.mod b/go.mod
index 9570580..8448df0 100644
--- a/go.mod
+++ b/go.mod
@@ -4,134 +4,95 @@ go 1.22.0
require (
github.com/TheZeroSlave/zapsentry v1.20.2
- github.com/containerd/cgroups/v3 v3.0.3
- github.com/containerd/containerd v1.7.13
- github.com/containerd/typeurl/v2 v2.1.1
github.com/coreos/go-oidc/v3 v3.9.0
github.com/getsentry/sentry-go v0.27.0
- github.com/gin-contrib/cors v1.5.0
+ github.com/gin-contrib/cors v1.7.0
github.com/gin-contrib/pprof v1.4.0
- github.com/gin-contrib/zap v0.2.0
+ github.com/gin-contrib/zap v1.1.0
github.com/gin-gonic/contrib v0.0.0-20221130124618-7e01895a63f2
github.com/gin-gonic/gin v1.9.1
github.com/golang-jwt/jwt/v4 v4.5.0
github.com/hibiken/asynq v0.24.1
github.com/jackc/pgtype v1.14.2
- github.com/minio/minio-go/v7 v7.0.67
- github.com/opencontainers/runtime-spec v1.2.0
- github.com/prometheus/client_golang v1.18.0
- github.com/redis/go-redis/v9 v9.5.0
+ github.com/minio/minio-go/v7 v7.0.69
+ github.com/prometheus/client_golang v1.19.0
+ github.com/redis/go-redis/v9 v9.5.1
github.com/samber/do v1.6.0
github.com/swaggo/files v1.0.1
github.com/swaggo/gin-swagger v1.6.0
github.com/swaggo/swag v1.16.3
github.com/urfave/cli/v2 v2.27.1
- go.uber.org/zap v1.26.0
- golang.org/x/crypto v0.19.0
- golang.org/x/oauth2 v0.17.0
+ go.uber.org/zap v1.27.0
+ golang.org/x/crypto v0.21.0
+ golang.org/x/oauth2 v0.18.0
golang.org/x/text v0.14.0
gopkg.in/yaml.v3 v3.0.1
- gorm.io/driver/postgres v1.5.6
+ gorm.io/driver/postgres v1.5.7
gorm.io/gorm v1.25.7
moul.io/zapgorm2 v1.3.0
)
require (
- github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect
- github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20231105174938-2b5cbb29f3e2 // indirect
github.com/KyleBanks/depth v1.2.1 // indirect
- github.com/Microsoft/go-winio v0.6.1 // indirect
- github.com/Microsoft/hcsshim v0.12.0-rc.3 // indirect
github.com/beorn7/perks v1.0.1 // indirect
- github.com/bytedance/sonic v1.11.0 // indirect
+ github.com/bytedance/sonic v1.11.3 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
github.com/chenzhuoyu/iasm v0.9.1 // indirect
- github.com/containerd/continuity v0.4.3 // indirect
- github.com/containerd/errdefs v0.1.0 // indirect
- github.com/containerd/fifo v1.1.0 // indirect
- github.com/containerd/log v0.1.0 // indirect
- github.com/containerd/ttrpc v1.2.3 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
- github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
- github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
- github.com/go-jose/go-jose/v3 v3.0.1 // indirect
- github.com/go-logr/logr v1.4.1 // indirect
- github.com/go-logr/stdr v1.2.2 // indirect
- github.com/go-openapi/jsonpointer v0.20.2 // indirect
- github.com/go-openapi/jsonreference v0.20.4 // indirect
- github.com/go-openapi/spec v0.20.14 // indirect
- github.com/go-openapi/swag v0.22.9 // indirect
+ github.com/go-jose/go-jose/v3 v3.0.3 // indirect
+ github.com/go-openapi/jsonpointer v0.21.0 // indirect
+ github.com/go-openapi/jsonreference v0.21.0 // indirect
+ github.com/go-openapi/spec v0.21.0 // indirect
+ github.com/go-openapi/swag v0.23.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
- github.com/go-playground/validator/v10 v10.18.0 // indirect
+ github.com/go-playground/validator/v10 v10.19.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
- github.com/gogo/protobuf v1.3.2 // indirect
- github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
- github.com/golang/protobuf v1.5.3 // indirect
- github.com/google/go-cmp v0.6.0 // indirect
+ github.com/golang/protobuf v1.5.4 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/jackc/pgio v1.0.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20231201235250-de7065d80cb9 // indirect
github.com/jackc/pgx/v4 v4.18.1 // indirect
- github.com/jackc/pgx/v5 v5.5.3 // indirect
+ github.com/jackc/pgx/v5 v5.5.5 // indirect
github.com/jackc/puddle/v2 v2.2.1 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
- github.com/klauspost/compress v1.17.6 // indirect
- github.com/klauspost/cpuid/v2 v2.2.6 // indirect
+ github.com/klauspost/compress v1.17.7 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.7 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/minio/md5-simd v1.1.2 // indirect
github.com/minio/sha256-simd v1.0.1 // indirect
- github.com/moby/locker v1.0.1 // indirect
- github.com/moby/sys/mountinfo v0.7.1 // indirect
- github.com/moby/sys/sequential v0.5.0 // indirect
- github.com/moby/sys/signal v0.7.0 // indirect
- github.com/moby/sys/user v0.1.0 // 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
- github.com/opencontainers/image-spec v1.1.0 // indirect
- github.com/opencontainers/selinux v1.11.0 // indirect
github.com/pelletier/go-toml/v2 v2.1.1 // indirect
- github.com/pkg/errors v0.9.1 // indirect
github.com/prometheus/client_model v0.6.0 // indirect
- github.com/prometheus/common v0.47.0 // indirect
- github.com/prometheus/procfs v0.12.0 // indirect
+ github.com/prometheus/common v0.50.0 // indirect
+ github.com/prometheus/procfs v0.13.0 // indirect
github.com/robfig/cron/v3 v3.0.1 // indirect
github.com/rs/xid v1.5.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
- github.com/sirupsen/logrus v1.9.3 // indirect
github.com/spf13/cast v1.6.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
- github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e // indirect
- go.opencensus.io v0.24.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0 // indirect
- go.opentelemetry.io/otel v1.23.1 // indirect
- go.opentelemetry.io/otel/metric v1.23.1 // indirect
- go.opentelemetry.io/otel/trace v1.23.1 // indirect
+ github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/arch v0.7.0 // indirect
- golang.org/x/mod v0.15.0 // indirect
- golang.org/x/net v0.21.0 // indirect
+ golang.org/x/net v0.22.0 // indirect
golang.org/x/sync v0.6.0 // indirect
- golang.org/x/sys v0.17.0 // indirect
+ golang.org/x/sys v0.18.0 // indirect
golang.org/x/time v0.5.0 // indirect
- golang.org/x/tools v0.18.0 // indirect
+ golang.org/x/tools v0.19.0 // indirect
google.golang.org/appengine v1.6.8 // indirect
- google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9 // indirect
- google.golang.org/grpc v1.61.1 // indirect
- google.golang.org/protobuf v1.32.0 // indirect
+ google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
)
diff --git a/go.sum b/go.sum
index 4e84f5e..83bb21c 100644
--- a/go.sum
+++ b/go.sum
@@ -1,18 +1,7 @@
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU=
-github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
-github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20231105174938-2b5cbb29f3e2 h1:dIScnXFlF784X79oi7MzVT6GWqr/W1uUt0pB5CsDs9M=
-github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20231105174938-2b5cbb29f3e2/go.mod h1:gCLVsLfv1egrcZu+GoJATN5ts75F2s62ih/457eWzOw=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
-github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
-github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
-github.com/Microsoft/hcsshim v0.12.0-rc.2 h1:gfKebjq3Mq17Ys+4cjE8vc2h6tZVeqCGb9a7vBVqpAk=
-github.com/Microsoft/hcsshim v0.12.0-rc.2/go.mod h1:G2TZhBED5frlh/hsuxV5CDh/ylkSFknPAMPpQg9owQw=
-github.com/Microsoft/hcsshim v0.12.0-rc.3 h1:5GNGrobGs/sN/0nFO21W9k4lFn+iXXZAE8fCZbmdRak=
-github.com/Microsoft/hcsshim v0.12.0-rc.3/go.mod h1:WuNfcaYNaw+KpCEsZCIM6HCEmu0c5HfXpi+dDSmveP0=
github.com/TheZeroSlave/zapsentry v1.20.2 h1:llgC91ZJdoU/OzGxYpUlEhKinf65mw9hJ2KkZ7+cGIk=
github.com/TheZeroSlave/zapsentry v1.20.2/go.mod h1:D1YMfSuu6xnkhwFXxrronesmsiyDhIqo+86I3Ok+r64=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
@@ -26,11 +15,8 @@ github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=
-github.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=
-github.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=
-github.com/bytedance/sonic v1.11.0 h1:FwNNv6Vu4z2Onf1++LNzxB/QhitD8wuTdpZzMTGITWo=
-github.com/bytedance/sonic v1.11.0/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/bytedance/sonic v1.11.3 h1:jRN+yEjakWh8aK5FzrciUHG8OFXK+4/KrAX/ysEtHAA=
+github.com/bytedance/sonic v1.11.3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
@@ -40,31 +26,7 @@ github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpV
github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=
github.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=
github.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
-github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM=
-github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0=
-github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0=
-github.com/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMPAuPqgU0=
-github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk=
-github.com/containerd/containerd v1.7.13 h1:wPYKIeGMN8vaggSKuV1X0wZulpMz4CrgEsZdaCyB6Is=
-github.com/containerd/containerd v1.7.13/go.mod h1:zT3up6yTRfEUa6+GsITYIJNgSVL9NQ4x4h1RPzk0Wu4=
-github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8=
-github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ=
-github.com/containerd/errdefs v0.1.0 h1:m0wCRBiu1WJT/Fr+iOoQHMQS/eP5myQ8lCv4Dz5ZURM=
-github.com/containerd/errdefs v0.1.0/go.mod h1:YgWiiHtLmSeBrvpw+UfPijzbLaB77mEG1WwJTDETIV0=
-github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY=
-github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o=
-github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
-github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
-github.com/containerd/ttrpc v1.2.2 h1:9vqZr0pxwOF5koz6N0N3kJ0zDHokrcPxIR/ZR2YFtOs=
-github.com/containerd/ttrpc v1.2.2/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak=
-github.com/containerd/ttrpc v1.2.3 h1:4jlhbXIGvijRtNC8F/5CpuJZ7yKOBFGFOOXg1bkISz0=
-github.com/containerd/ttrpc v1.2.3/go.mod h1:ieWsXucbb8Mj9PH0rXCw1i8IunRbbAiDkpXkbfflWBM=
-github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY=
-github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4=
-github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0=
github.com/coreos/go-oidc/v3 v3.9.0 h1:0J/ogVOd4y8P0f0xUh8l9t07xRP/d8tccvjHl2dcsSo=
github.com/coreos/go-oidc/v3 v3.9.0/go.mod h1:rTKz2PYwftcrtoCzV5g5kvfJoWcm0Mk8AF8y1iAQro4=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
@@ -78,34 +40,24 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
-github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8=
-github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
-github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
-github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
-github.com/getsentry/sentry-go v0.26.0 h1:IX3++sF6/4B5JcevhdZfdKIHfyvMmAq/UnqcyT2H6mA=
-github.com/getsentry/sentry-go v0.26.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
-github.com/gin-contrib/cors v1.5.0 h1:DgGKV7DDoOn36DFkNtbHrjoRiT5ExCe+PC9/xp7aKvk=
-github.com/gin-contrib/cors v1.5.0/go.mod h1:TvU7MAZ3EwrPLI2ztzTt3tqgvBCq+wn8WpZmfADjupI=
+github.com/gin-contrib/cors v1.7.0 h1:wZX2wuZ0o7rV2/1i7gb4Jn+gW7HBqaP91fizJkBUJOA=
+github.com/gin-contrib/cors v1.7.0/go.mod h1:cI+h6iOAyxKRtUtC6iF/Si1KSFvGm/gK+kshxlCi8ro=
github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4=
github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk=
github.com/gin-contrib/pprof v1.4.0 h1:XxiBSf5jWZ5i16lNOPbMTVdgHBdhfGRD5PZ1LWazzvg=
github.com/gin-contrib/pprof v1.4.0/go.mod h1:RrehPJasUVBPK6yTUwOl8/NP6i0vbUgmxtis+Z5KE90=
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-contrib/zap v0.2.0 h1:HLvt3rZXyC8XC+s2lHzMFow3UDqiEbfrBWJyHHS6L8A=
-github.com/gin-contrib/zap v0.2.0/go.mod h1:eqfbe9ZmI+GgTZF6nRiC2ZwDeM4DK1Viwc8OxTCphh0=
+github.com/gin-contrib/zap v1.1.0 h1:GWzL9+zmK8OJdiycaK2SK1/D3SZIYpieJDD0QCNAU1o=
+github.com/gin-contrib/zap v1.1.0/go.mod h1:KzROP9rAL7ofFd1P8lx7Oo2lerwPWNL5vv4f6U/mAk8=
github.com/gin-gonic/contrib v0.0.0-20221130124618-7e01895a63f2 h1:dyuNlYlG1faymw39NdJddnzJICy6587tiGSVioWhYoE=
github.com/gin-gonic/contrib v0.0.0-20221130124618-7e01895a63f2/go.mod h1:iqneQ2Df3omzIVTkIfn7c1acsVnMGiSLn4XF5Blh3Yg=
github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk=
@@ -113,23 +65,18 @@ github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
-github.com/go-jose/go-jose/v3 v3.0.1 h1:pWmKFVtt+Jl0vBZTIpz/eAKwsm6LkIxDVVbFHKkchhA=
-github.com/go-jose/go-jose/v3 v3.0.1/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8=
+github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k=
+github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
-github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
-github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-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-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
-github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
-github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU=
-github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4=
-github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do=
-github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw=
-github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE=
-github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE=
+github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
+github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
+github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
+github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
+github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
+github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
+github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
+github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
@@ -140,52 +87,26 @@ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
-github.com/go-playground/validator/v10 v10.17.0 h1:SmVVlfAOtlZncTxRuinDPomC2DkXJ4E5T9gDA0AIH74=
-github.com/go-playground/validator/v10 v10.17.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
-github.com/go-playground/validator/v10 v10.18.0 h1:BvolUXjp4zuvkZ5YN5t7ebzbhlUtPsPm2S9NAZ5nl9U=
-github.com/go-playground/validator/v10 v10.18.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
+github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4=
+github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
-github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
-github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
-github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
-github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
-github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -230,8 +151,6 @@ github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCM
github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=
github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
-github.com/jackc/pgtype v1.14.1 h1:LyDar7M2K0tShCWqzJ/ctzF1QC3Wzc9c8a6cHE0PFdc=
-github.com/jackc/pgtype v1.14.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
github.com/jackc/pgtype v1.14.2 h1:QBdZQTKpPdBlw2AdKwHEyqUcm/lrl2cwWAHjCMyln/o=
github.com/jackc/pgtype v1.14.2/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
@@ -240,14 +159,11 @@ github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQ
github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
github.com/jackc/pgx/v4 v4.18.1 h1:YP7G1KABtKpB5IHrO9vYwSrCOhs7p3uqhvhhQBptya0=
github.com/jackc/pgx/v4 v4.18.1/go.mod h1:FydWkUyadDmdNH/mHnGob881GawxeEm7TcMCzkb+qQE=
-github.com/jackc/pgx/v5 v5.5.2 h1:iLlpgp4Cp/gC9Xuscl7lFL1PhhW+ZLtXZcrfCt4C3tA=
-github.com/jackc/pgx/v5 v5.5.2/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
-github.com/jackc/pgx/v5 v5.5.3 h1:Ces6/M3wbDXYpM8JyyPD57ivTtJACFZJd885pdIaV2s=
-github.com/jackc/pgx/v5 v5.5.3/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
+github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw=
+github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
-github.com/jackc/puddle v1.3.0 h1:eHK/5clGOatcjX3oWGBO/MpxpbHzSwud5EWTSCI+MX0=
github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
@@ -260,16 +176,13 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
-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.17.5 h1:d4vBd+7CHydUqpFBgUEKkSdtSugf9YFmSkvUYPquI5E=
-github.com/klauspost/compress v1.17.5/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
-github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI=
-github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
+github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg=
+github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
-github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
+github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
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=
@@ -284,8 +197,6 @@ 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/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
-github.com/leodido/go-urn v1.3.0 h1:jX8FDLfW4ThVXctBNZ+3cIWnCSnrACDV73r76dy0aQQ=
-github.com/leodido/go-urn v1.3.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
@@ -305,40 +216,15 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
-github.com/minio/minio-go/v7 v7.0.66 h1:bnTOXOHjOqv/gcMuiVbN9o2ngRItvqE774dG9nq0Dzw=
-github.com/minio/minio-go/v7 v7.0.66/go.mod h1:DHAgmyQEGdW3Cif0UooKOyrT3Vxs82zNdV6tkKhRtbs=
-github.com/minio/minio-go/v7 v7.0.67 h1:BeBvZWAS+kRJm1vGTMJYVjKUNoo0FoEt/wUWdUtfmh8=
-github.com/minio/minio-go/v7 v7.0.67/go.mod h1:+UXocnUeZ3wHvVh5s95gcrA4YjMIbccT6ubB+1m054A=
+github.com/minio/minio-go/v7 v7.0.69 h1:l8AnsQFyY1xiwa/DaQskY4NXSLA2yrGsW5iD9nRPVS0=
+github.com/minio/minio-go/v7 v7.0.69/go.mod h1:XAvOPJQ5Xlzk5o3o/ArO2NMbhSGkimC+bpW/ngRKDmQ=
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
-github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg=
-github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
-github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g=
-github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI=
-github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc=
-github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo=
-github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI=
-github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg=
-github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg=
-github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU=
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/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.0-rc6 h1:XDqvyKsJEbRtATzkgItUqBA7QHk58yxX1Ov9HERHNqU=
-github.com/opencontainers/image-spec v1.1.0-rc6/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=
-github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
-github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=
-github.com/opencontainers/runtime-spec v1.1.1-0.20230823135140-4fec88fd00a4 h1:EctkgBjZ1y4q+sibyuuIgiKpa0QSd2elFtSSdNvBVow=
-github.com/opencontainers/runtime-spec v1.1.1-0.20230823135140-4fec88fd00a4/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
-github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk=
-github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
-github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU=
-github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec=
-github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI=
github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
@@ -350,25 +236,17 @@ 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 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk=
-github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA=
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
-github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
+github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=
+github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=
github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos=
github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8=
-github.com/prometheus/common v0.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y=
-github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ=
-github.com/prometheus/common v0.47.0 h1:p5Cz0FNHo7SnWOmWmoRozVcjEp0bIVU8cV7OShpjL1k=
-github.com/prometheus/common v0.47.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=
-github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
-github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
-github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
+github.com/prometheus/common v0.50.0 h1:YSZE6aa9+luNa2da6/Tik0q0A5AbR+U003TItK57CPQ=
+github.com/prometheus/common v0.50.0/go.mod h1:wHFBCEVWVmHMUpg7pYcOm2QUR/ocQdYSJVQJKnHc3xQ=
+github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o=
+github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g=
github.com/redis/go-redis/v9 v9.0.3/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=
-github.com/redis/go-redis/v9 v9.4.0 h1:Yzoz33UZw9I/mFhx4MNrB6Fk+XHO1VukNcCa1+lwyKk=
-github.com/redis/go-redis/v9 v9.4.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
-github.com/redis/go-redis/v9 v9.5.0 h1:Xe9TKMmZv939gwTBcvc0n1tzK5l2re0pKw/W/tN3amw=
-github.com/redis/go-redis/v9 v9.5.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
+github.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=
+github.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
@@ -381,8 +259,6 @@ github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
-github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww=
-github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/samber/do v1.6.0 h1:Jy/N++BXINDB6lAx5wBlbpHlUdl0FKpLWgGEV9YWqaU=
@@ -392,9 +268,6 @@ github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9Nz
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
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.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
-github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
@@ -412,14 +285,13 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
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.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
-github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE=
github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg=
github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M=
github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo=
-github.com/swaggo/swag v1.16.2 h1:28Pp+8DkQoV+HLzLx8RGJZXNGKbFqnuvSbAAtoxiY04=
-github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E=
github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg=
github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
@@ -428,34 +300,13 @@ github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
-github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk=
github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho=
github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
-github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e h1:+SOyEddqYF09QP7vr7CgJ1eti3pY9Fn3LHO1M1r/0sI=
-github.com/xrash/smetrics v0.0.0-20231213231151-1d8dd44e695e/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
-github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 h1:+qGGcbkzsfDQNPPe9UDgpxAWQrhbbBXOYJFQDq/dtJw=
+github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQutDLsQv2Deui4iYQ6DWTxR14g6m8Wv88+Xqk=
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/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
-go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
-go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0 h1:doUP+ExOpH3spVTLS0FcWGLnQrPct/hD/bCPbDRUEAU=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0/go.mod h1:rdENBZMT2OE6Ne/KLwpiXudnAsbdrdBaqBvTN8M8BgA=
-go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y=
-go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI=
-go.opentelemetry.io/otel v1.23.1 h1:Za4UzOqJYS+MUczKI320AtqZHZb7EqxO00jAHE0jmQY=
-go.opentelemetry.io/otel v1.23.1/go.mod h1:Td0134eafDLcTS4y+zQ26GE8u3dEuRBiBCTUIRHaikA=
-go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg=
-go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY=
-go.opentelemetry.io/otel/metric v1.23.1 h1:PQJmqJ9u2QaJLBOELl1cxIdPcpbwzbkjfEyelTl2rlo=
-go.opentelemetry.io/otel/metric v1.23.1/go.mod h1:mpG2QPlAfnK8yNhNJAxDZruU9Y1/HubbC+KyH8FaCWI=
-go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0=
-go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo=
-go.opentelemetry.io/otel/trace v1.23.1 h1:4LrmmEd8AU2rFvU1zegmvqW7+kWarxtNOPyeL6HmYY8=
-go.opentelemetry.io/otel/trace v1.23.1/go.mod h1:4IpnpJFwr1mo/6HL8XIPJaE9y0+u1KcVmuW7dwFSVrI=
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.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
@@ -463,8 +314,8 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
-go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
-go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
@@ -477,8 +328,8 @@ go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
-go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
-go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
+go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
+go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc=
golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
@@ -486,7 +337,6 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
@@ -494,60 +344,37 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/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.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
-golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
-golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
-golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-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-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
-golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.3.0/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.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
-golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8=
-golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
+golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
-golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
-golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
-golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ=
-golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o=
-golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ=
-golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
+golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
+golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI=
+golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -558,30 +385,27 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/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-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.1.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.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
-golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
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/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -590,78 +414,39 @@ 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.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
-golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc=
-golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps=
-golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ=
-golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw=
+golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
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=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe h1:USL2DhxfgRchafRvt/wYyyQNzwgL7ZiURcozOE/Pkvo=
-google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro=
-google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJTh+ah5wIMsBW5c4tQwGTN3thOW9Y=
-google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe h1:bQnxqljG/wqi4NTXu2+DJ3n7APcEA882QZ1JvhQAq9o=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9 h1:hZB7eLIaYlW9qXRfCq/qDaPdbeY3757uARz5Vvfv+cY=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:YUWgXUFRPfoYK1IHMuxH5K6nPEXSCzIMljnQ59lLRCk=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0=
-google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs=
-google.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY=
-google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
-google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
+google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
+google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -678,17 +463,11 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gorm.io/driver/postgres v1.5.4 h1:Iyrp9Meh3GmbSuyIAGyjkN+n9K+GHX9b9MqsTL4EJCo=
-gorm.io/driver/postgres v1.5.4/go.mod h1:Bgo89+h0CRcdA33Y6frlaHHVuTdOf87pmyzwW9C/BH0=
-gorm.io/driver/postgres v1.5.6 h1:ydr9xEd5YAM0vxVDY0X139dyzNz10spDiDlC7+ibLeU=
-gorm.io/driver/postgres v1.5.6/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA=
+gorm.io/driver/postgres v1.5.7 h1:8ptbNJTDbEmhdr62uReG5BGkdQyeasu/FZHxI0IMGnM=
+gorm.io/driver/postgres v1.5.7/go.mod h1:3e019WlBaYI5o5LIdNV+LyxCMNtLOQETBXL2h4chKpA=
gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
-gorm.io/gorm v1.25.6 h1:V92+vVda1wEISSOMtodHVRcUIOPYa2tgQtyF+DfFx+A=
-gorm.io/gorm v1.25.6/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.25.7 h1:VsD6acwRjz2zFxGO50gPO6AkNs7KKnvfzUjHQhZDz/A=
gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
moul.io/zapgorm2 v1.3.0 h1:+CzUTMIcnafd0d/BvBce8T4uPn6DQnpIrz64cyixlkk=
moul.io/zapgorm2 v1.3.0/go.mod h1:nPVy6U9goFKHR4s+zfSo1xVFaoU7Qgd5DoCdOfzoCqs=
diff --git a/internal/model/config.go b/internal/model/config.go
index d77fbe5..e6b5453 100644
--- a/internal/model/config.go
+++ b/internal/model/config.go
@@ -50,7 +50,7 @@ type ConfigStorage struct {
}
type ConfigRunner struct {
- Address string `yaml:"Address"`
+ CGroup string `yaml:"CGroup"`
}
type ConfigMetrics struct {
diff --git a/internal/service/runner/common.go b/internal/service/runner/common.go
index 47b0dcd..fca5cb1 100644
--- a/internal/service/runner/common.go
+++ b/internal/service/runner/common.go
@@ -11,15 +11,14 @@ import (
)
var (
- Prefix = "./resource/runner"
- ProblemDir = "./problem/"
- UserDir = "./user/"
- TmpDir = "./tmp/"
-)
+ Prefix = "./resource/runner"
-var (
- ContainerImageFull string
- ContainerImageRun string
+ ProblemDir = "./problem/"
+ UserDir = "./user/"
+ TmpDir = "./tmp/"
+ NSJailFile = "./framework/scripts/nsjail"
+ RootfsFullDir = "./framework/rootfs/full"
+ RootfsRunDir = "./framework/rootfs/run"
)
type JudgeMetaRun struct {
@@ -48,13 +47,9 @@ func init() {
ProblemDir = path.Join(Prefix, ProblemDir)
UserDir = path.Join(Prefix, UserDir)
TmpDir = path.Join(Prefix, TmpDir)
-
- if ContainerImageFull == "" {
- ContainerImageFull = "git.0x7f.app/woj/ubuntu-full:latest"
- }
- if ContainerImageRun == "" {
- ContainerImageRun = "git.0x7f.app/woj/ubuntu-run:latest"
- }
+ NSJailFile = path.Join(Prefix, NSJailFile)
+ RootfsFullDir = path.Join(Prefix, RootfsFullDir)
+ RootfsRunDir = path.Join(Prefix, RootfsRunDir)
}
func (s *service) ProblemExists(meta *JudgeMeta) bool {
diff --git a/internal/service/runner/compile.go b/internal/service/runner/compile.go
index a434786..003fb99 100644
--- a/internal/service/runner/compile.go
+++ b/internal/service/runner/compile.go
@@ -5,7 +5,6 @@ import (
"git.0x7f.app/WOJ/woj-server/internal/e"
"git.0x7f.app/WOJ/woj-server/pkg/file"
"git.0x7f.app/WOJ/woj-server/pkg/utils"
- "github.com/opencontainers/runtime-spec/specs-go"
"go.uber.org/zap"
"io"
"os"
@@ -53,7 +52,7 @@ func (s *service) Compile(meta *JudgeMeta) (*JudgeStatus, e.Status) {
Env: []string{fmt.Sprintf("USER_PROG=%s", meta.Run.User), fmt.Sprintf("LANG=%s", meta.Run.Lang)},
},
Runtime: RuntimeArgs{
- Image: ContainerImageFull,
+ Rootfs: RootfsFullDir,
Pid: int64(meta.Cfg.Lang.Runtime.Compile.NProcLimit + 2), // bash + make
Memory: uint64(meta.Cfg.Lang.Runtime.Compile.MemoryLimit * 1024 * 1024),
Timeout: time.Duration((meta.Cfg.Lang.Runtime.Compile.TimeLimit+1000)/1000) * time.Second,
@@ -63,28 +62,25 @@ func (s *service) Compile(meta *JudgeMeta) (*JudgeStatus, e.Status) {
Limit: 4 * 1024, // 4 KB
},
}
- args.Runtime.Mount = []specs.Mount{
+ args.Runtime.Mount = []MountInfo{
{
Source: judgeDir,
Destination: "/woj/problem/judge",
- Type: "bind",
- Options: []string{"rbind", "ro"},
+ Readonly: true,
},
{
Source: sourceFile,
Destination: fmt.Sprintf("/woj/user/%s.%s", meta.Run.User, meta.Run.Lang),
- Type: "bind",
- Options: []string{"rbind", "ro"},
+ Readonly: true,
},
{
Source: targetFile,
Destination: fmt.Sprintf("/woj/user/%s.out", meta.Run.User),
- Type: "bind",
- Options: []string{"rbind"},
+ Readonly: false,
},
}
- id := s.ContainerRunPool(args)
+ id := s.JailRunPool(args)
ret := s.pool.WaitForTask(id)
return ret.Error
}).
diff --git a/internal/service/runner/container.go b/internal/service/runner/container.go
deleted file mode 100644
index 4a9c473..0000000
--- a/internal/service/runner/container.go
+++ /dev/null
@@ -1,182 +0,0 @@
-package runner
-
-import (
- "context"
- "errors"
- "fmt"
- "git.0x7f.app/WOJ/woj-server/pkg/file"
- "git.0x7f.app/WOJ/woj-server/pkg/utils"
- cgv1 "github.com/containerd/cgroups/v3/cgroup1/stats"
- cgv2 "github.com/containerd/cgroups/v3/cgroup2/stats"
- "github.com/containerd/containerd"
- "github.com/containerd/containerd/cio"
- "github.com/containerd/containerd/oci"
- "github.com/containerd/typeurl/v2"
- "github.com/opencontainers/runtime-spec/specs-go"
- "go.uber.org/zap"
- "io"
- "os"
- "syscall"
- "time"
-)
-
-type ProgramArgs struct {
- Args []string
- Env []string
-}
-
-type RuntimeArgs struct {
- Image string
- Pid int64
- Memory uint64
- Timeout time.Duration
- Mount []specs.Mount
-}
-
-func (r *RuntimeArgs) Normalize() {
- r.Pid = utils.If(r.Pid <= 0, 64, r.Pid)
- r.Memory = utils.If(r.Memory <= 0, 128*1024*1024, r.Memory)
- r.Timeout = utils.If(r.Timeout <= 0, time.Minute, r.Timeout)
-}
-
-type IOArgs struct {
- Output *os.File
- // Limit is the max size of output in chars.
- // if Limit = 0, output to stderr if verbose, discard output if not.
- // if Limit < 0, discard output.
- Limit int64
-}
-
-type RunArgs struct {
- Program ProgramArgs
- Runtime RuntimeArgs
- IO IOArgs
-}
-
-func (s *service) ContainerRun(arg *RunArgs) (RuntimeStatus, error) {
- identifier := fmt.Sprintf("%d", s.container.count.Add(1))
-
- // prepare args
- arg.Runtime.Normalize()
-
- // prepare output
- var writer io.Writer = nil
- if arg.IO.Limit == 0 && s.verbose {
- writer = os.Stderr
- } else if arg.IO.Limit > 0 && arg.IO.Output != nil {
- writer = &file.LimitedWriter{
- File: arg.IO.Output,
- Limit: arg.IO.Limit,
- }
- }
-
- // debug log
- s.log.Debug("container started", zap.String("identifier", identifier), zap.Any("args", arg))
- defer func(identifier string) {
- s.log.Debug("container finished", zap.String("identifier", identifier))
- }(identifier)
-
- // get image
- image, err := s.container.client.GetImage(s.container.ctx, arg.Runtime.Image)
- // TODO: we could cache the image struct
- if err != nil {
- return RuntimeStatus{}, err
- }
-
- // create container
- // TODO: new container is taking too long, could we cache the container struct?
- container, err := s.container.client.NewContainer(s.container.ctx, "task-"+identifier,
- // TODO: should we use RO snapshot?
- containerd.WithNewSnapshot("snapshot-"+identifier, image),
- containerd.WithNewSpec(
- oci.WithImageConfig(image),
- oci.WithMemoryLimit(arg.Runtime.Memory),
- oci.WithPidsLimit(arg.Runtime.Pid),
- oci.WithMounts(arg.Runtime.Mount),
- oci.WithProcessArgs(arg.Program.Args...),
- oci.WithEnv(arg.Program.Env),
- ),
- )
- if err != nil {
- return RuntimeStatus{}, err
- }
- defer func(container containerd.Container, ctx context.Context, opts ...containerd.DeleteOpts) {
- _ = container.Delete(ctx, opts...)
- }(container, s.container.ctx, containerd.WithSnapshotCleanup)
-
- // create task
- task, err := container.NewTask(s.container.ctx, cio.NewCreator(cio.WithStreams(nil, writer, writer)))
- if err != nil {
- return RuntimeStatus{}, err
- }
- defer func(task containerd.Task, ctx context.Context, opts ...containerd.ProcessDeleteOpts) {
- _, _ = task.Delete(ctx, opts...)
- }(task, s.container.ctx, containerd.WithProcessKill)
-
- // wait
- ctx2, cancel := context.WithTimeout(s.container.ctx, arg.Runtime.Timeout)
- defer cancel()
- exitStatusC, err := task.Wait(ctx2)
- if err != nil {
- return RuntimeStatus{}, err
- }
-
- // start
- err = task.Start(s.container.ctx)
- if err != nil {
- return RuntimeStatus{}, err
- }
-
- // kill on timeout
- status := <-exitStatusC
- code, _, _ := status.Result()
- if code == containerd.UnknownExitStatus {
- // containerd is C/S architecture, timeout means grpc timeout, resulting in unknown exit status
- // manually kill the task
- s.log.Debug("container timeout", zap.String("identifier", identifier))
- err := task.Kill(s.container.ctx, syscall.SIGKILL)
- if err != nil {
- return RuntimeStatus{}, err
- }
- }
-
- // get metrics
- metric, err := task.Metrics(s.container.ctx)
- if err != nil {
- return RuntimeStatus{}, err
- }
-
- // modified from github.com/containerd/containerd/cmd/ctr/commands/tasks/metrics.go
- var data interface{}
- switch {
- case typeurl.Is(metric.Data, (*cgv1.Metrics)(nil)):
- data = &cgv1.Metrics{}
- case typeurl.Is(metric.Data, (*cgv2.Metrics)(nil)):
- data = &cgv2.Metrics{}
- default:
- return RuntimeStatus{}, errors.New("cannot convert metric data to cgroups.Metrics")
- }
- if err := typeurl.UnmarshalTo(metric.Data, data); err != nil {
- return RuntimeStatus{}, err
- }
-
- runtime := RuntimeStatus{}
- switch v := data.(type) {
- case *cgv1.Metrics:
- runtime.CpuTime = int(v.CPU.Usage.Total / 1000000) // nanoseconds to milliseconds
- runtime.Memory = int(v.Memory.Usage.Max / 1024) // bytes to kilobytes
- runtime.RealTime = 0 // not supported
- case *cgv2.Metrics:
- runtime.CpuTime = int(v.CPU.UsageUsec / 1000) // microseconds to milliseconds
- runtime.Memory = int(v.Memory.MaxUsage / 1024) // bytes to kilobytes
- runtime.RealTime = 0 // not supported
- default:
- return RuntimeStatus{}, errors.New("cannot convert metric data to cgroups.{v1/v2}.Metrics")
- }
-
- return runtime, nil
-}
-
-func (s *service) ContainerRunPool(arg *RunArgs) uint64 {
- return s.pool.AddTask(func() (interface{}, error) { return s.ContainerRun(arg) })
-}
diff --git a/internal/service/runner/deps.go b/internal/service/runner/deps.go
index db6a683..ce8fe63 100644
--- a/internal/service/runner/deps.go
+++ b/internal/service/runner/deps.go
@@ -1,82 +1,16 @@
package runner
import (
- "compress/gzip"
- "errors"
"git.0x7f.app/WOJ/woj-server/internal/e"
"git.0x7f.app/WOJ/woj-server/pkg/file"
- "git.0x7f.app/WOJ/woj-server/pkg/utils"
- "github.com/containerd/containerd"
- "go.uber.org/zap"
- "os"
"path/filepath"
)
-type depConfig struct {
- tarball string
- image string
-}
-
-func (s *service) LoadImageFromTarball(path string) error {
- if !file.Exist(path) {
- return errors.New("tarball not exists")
- }
-
- f, err := os.Open(path)
- if err != nil {
- return err
- }
- defer func(f *os.File) {
- _ = f.Close()
- }(f)
-
- g, err := gzip.NewReader(f)
- if err != nil {
- return err
- }
- defer func(g *gzip.Reader) {
- _ = g.Close()
- }(g)
-
- _, err = s.container.client.Import(s.container.ctx, g)
- return err
-}
-
-func (s *service) LoadImageFromRegistry(image string) error {
- _, err := s.container.client.Pull(s.container.ctx, image, containerd.WithPullUnpack)
- return err
-}
-
-func (s *service) LoadImage(cfg *depConfig) e.Status {
- err := utils.NewTryErr().
- Try(func() error { return s.LoadImageFromTarball(cfg.tarball) }).
- Or(func() error { return s.LoadImageFromRegistry(cfg.image) }).
- Done()
-
- if err != nil {
- s.log.Warn("[deps] load image failed", zap.Error(err))
- return e.RunnerDepsBuildFailed
- }
-
- return e.Success
-}
-
func (s *service) EnsureDeps() e.Status {
- // full
- fullImage := &depConfig{
- tarball: filepath.Join(TmpDir, "ubuntu-full.tar.gz"),
- image: ContainerImageFull,
- }
- if s.LoadImage(fullImage) != e.Success {
- return e.RunnerDepsBuildFailed
- }
-
- // tiny
- tinyImage := &depConfig{
- tarball: filepath.Join(TmpDir, "ubuntu-tiny.tar.gz"),
- image: ContainerImageRun,
- }
- if s.LoadImage(tinyImage) != e.Success {
+ // A very SIMPLE check
+ full := filepath.Join(RootfsFullDir, "woj")
+ run := filepath.Join(RootfsRunDir, "woj")
+ if !file.Exist(full) || !file.Exist(run) {
return e.RunnerDepsBuildFailed
}
diff --git a/internal/service/runner/status.go b/internal/service/runner/judge_status.go
similarity index 100%
rename from internal/service/runner/status.go
rename to internal/service/runner/judge_status.go
diff --git a/internal/service/runner/new_problem.go b/internal/service/runner/new_problem.go
index cddb298..f202e07 100644
--- a/internal/service/runner/new_problem.go
+++ b/internal/service/runner/new_problem.go
@@ -6,7 +6,6 @@ import (
"git.0x7f.app/WOJ/woj-server/pkg/down"
"git.0x7f.app/WOJ/woj-server/pkg/file"
"git.0x7f.app/WOJ/woj-server/pkg/unzip"
- "github.com/opencontainers/runtime-spec/specs-go"
"go.uber.org/zap"
"os"
"path/filepath"
@@ -58,28 +57,26 @@ func (s *service) PrebuildProblem(meta *JudgeMeta, config *Config, force bool) e
Args: []string{"sh", "-c", "cd /woj/problem/judge && make -f prebuild.Makefile prebuild && touch .mark.prebuild"},
},
Runtime: RuntimeArgs{
- Image: ContainerImageFull,
+ Rootfs: RootfsFullDir,
Pid: int64(config.Prebuild.NProcLimit + 3), // sh + bash + make
Memory: uint64(config.Prebuild.MemoryLimit * 1024 * 1024),
Timeout: time.Duration((config.Prebuild.TimeLimit+1000)/1000) * time.Second,
},
}
- args.Runtime.Mount = []specs.Mount{
+ args.Runtime.Mount = []MountInfo{
{
Source: dataDir,
Destination: "/woj/problem/data",
- Type: "bind",
- Options: []string{"rbind"},
+ Readonly: false,
},
{
Source: judgeDir,
Destination: "/woj/problem/judge",
- Type: "bind",
- Options: []string{"rbind"},
+ Readonly: false,
},
}
- id := s.ContainerRunPool(args)
+ id := s.JailRunPool(args)
ret := s.pool.WaitForTask(id)
if ret.Error != nil {
diff --git a/internal/service/runner/nsjail.go b/internal/service/runner/nsjail.go
new file mode 100644
index 0000000..cffe586
--- /dev/null
+++ b/internal/service/runner/nsjail.go
@@ -0,0 +1,177 @@
+package runner
+
+import (
+ "bufio"
+ "fmt"
+ "git.0x7f.app/WOJ/woj-server/pkg/file"
+ "git.0x7f.app/WOJ/woj-server/pkg/utils"
+ "go.uber.org/zap"
+ "io"
+ "os"
+ "os/exec"
+ "runtime"
+ "strconv"
+ "time"
+)
+
+type ProgramArgs struct {
+ Args []string
+ Env []string
+}
+
+func (p *ProgramArgs) EnvArgs() []string {
+ var env []string
+ for _, e := range p.Env {
+ env = append(env, "-E", e)
+ }
+ return env
+}
+
+type MountInfo struct {
+ Source string
+ Destination string
+ Readonly bool
+}
+
+func (m *MountInfo) Args() []string {
+ mapping := m.Source + ":" + m.Destination
+ if m.Readonly {
+ return []string{"-R", mapping}
+ } else {
+ return []string{"-B", mapping}
+ }
+}
+
+type RuntimeArgs struct {
+ Rootfs string
+ CPU int
+ Pid int64
+ Memory uint64 // Memory is in bytes
+ Timeout time.Duration
+ Mount []MountInfo
+}
+
+func (r *RuntimeArgs) Args() []string {
+ cpus := runtime.NumCPU()
+ cpus = utils.If(r.CPU < cpus, r.CPU, cpus)
+ cpus = utils.If(r.CPU == 0, 1, cpus)
+
+ args := []string{
+ "-c", r.Rootfs,
+ "--cgroup_pids_max", strconv.FormatInt(r.Pid, 10),
+ "--cgroup_mem_max", strconv.FormatUint(r.Memory, 10),
+ "--max_cpus", strconv.FormatInt(int64(cpus), 10),
+ "-t", strconv.FormatInt(int64(r.Timeout.Seconds()), 10),
+ }
+ for _, m := range r.Mount {
+ args = append(args, m.Args()...)
+ }
+ return args
+}
+
+type IOArgs struct {
+ Output *os.File
+ // Limit is the max size of output in chars.
+ // if Limit = 0, output to stderr if verbose, discard output if not.
+ // if Limit < 0, discard output.
+ Limit int64
+}
+
+type RunArgs struct {
+ Program ProgramArgs
+ Runtime RuntimeArgs
+ IO IOArgs
+}
+
+func (s *service) JailRun(arg *RunArgs) (RuntimeStatus, error) {
+ // check cgroup creation
+ if arg.Runtime.Pid == 0 && arg.Runtime.Memory == 0 {
+ s.log.Warn("cgroup pid and memory not set, resource tracing by cgroup will not work")
+ }
+
+ // create stats file
+ statFile, err := os.CreateTemp("", "jail-stats-*")
+ if err != nil {
+ s.log.Warn("create stats file failed", zap.Error(err))
+ return RuntimeStatus{}, err
+ }
+ _ = statFile.Close()
+
+ // prepare output
+ var writer io.Writer = nil
+ if arg.IO.Limit == 0 && s.verbose {
+ writer = os.Stderr
+ } else if arg.IO.Limit > 0 && arg.IO.Output != nil {
+ writer = &file.LimitedWriter{
+ File: arg.IO.Output,
+ Limit: arg.IO.Limit,
+ }
+ }
+
+ // build args
+ args := []string{
+ "--quiet",
+ "--use_cgroupv2",
+ "-T", "/tmp",
+ "-E", "PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin",
+ // following envs must sync with resource/runner
+ "-E", "WOJ_LAUNCHER=/woj/framework/scripts/woj_launcher",
+ "-E", "TEMPLATE=/woj/framework/template",
+ "-E", "TESTLIB=/woj/framework/template/testlib",
+ "-E", "PREFIX=/woj",
+ }
+ args = append(args, "--cgroupv2_mount", s.cgroup)
+ args = append(args, "--dump_stats", "--dump_stats_file", statFile.Name())
+ args = append(args, arg.Program.EnvArgs()...)
+ args = append(args, arg.Runtime.Args()...)
+ args = append(args, "--")
+ args = append(args, arg.Program.Args...)
+
+ // run
+ s.log.Debug("jail run", zap.Strings("args", args))
+ cmd := exec.Command(NSJailFile, args...)
+ cmd.Dir = Prefix
+ if s.verbose {
+ cmd.Stdout = writer
+ cmd.Stderr = writer
+ }
+ err = cmd.Run()
+ if err != nil {
+ s.log.Warn("jail run failed", zap.Error(err))
+ return RuntimeStatus{}, err
+ }
+
+ // re-open stat file
+ statFile, err = os.Open(statFile.Name())
+ if err != nil {
+ s.log.Error("open stats file failed", zap.Error(err))
+ return RuntimeStatus{}, err
+ }
+ defer func(statFile *os.File) {
+ _ = statFile.Close()
+ _ = os.Remove(statFile.Name())
+ }(statFile)
+
+ // collect metrics
+ status := RuntimeStatus{}
+ scanner := bufio.NewScanner(statFile)
+ for scanner.Scan() {
+ var key string
+ var value int
+ _, _ = fmt.Sscanf(scanner.Text(), "%s %d", &key, &value)
+ switch key {
+ case "usage_usec":
+ status.RealTime = value / 1000
+ case "user_usec":
+ status.CpuTime = value / 1000
+ case "memory.peak":
+ status.Memory = value / 1024
+ }
+ }
+
+ return status, nil
+}
+
+func (s *service) JailRunPool(arg *RunArgs) uint64 {
+ return s.pool.AddTask(func() (interface{}, error) { return s.JailRun(arg) })
+}
diff --git a/internal/service/runner/container_test.go b/internal/service/runner/nsjail_test.go
similarity index 50%
rename from internal/service/runner/container_test.go
rename to internal/service/runner/nsjail_test.go
index 7ba5ceb..9af54f8 100644
--- a/internal/service/runner/container_test.go
+++ b/internal/service/runner/nsjail_test.go
@@ -8,13 +8,13 @@ func BenchmarkContainerRun(b *testing.B) {
srv := GetService(false).(*service)
args := &RunArgs{
- Program: ProgramArgs{Args: []string{"sh", "-c", "echo hello world"}},
- Runtime: RuntimeArgs{Image: ContainerImageRun},
+ Program: ProgramArgs{Args: []string{"/bin/sh", "-c", "echo hello world"}},
+ Runtime: RuntimeArgs{Rootfs: RootfsRunDir, Memory: 16 * 1024 * 1024},
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
- _, err := srv.ContainerRun(args)
+ _, err := srv.JailRun(args)
if err != nil {
b.Error(err)
}
@@ -25,18 +25,21 @@ func BenchmarkContainerRunPool(b *testing.B) {
srv := GetService(false).(*service)
args := &RunArgs{
- Program: ProgramArgs{Args: []string{"sh", "-c", "echo hello world"}},
- Runtime: RuntimeArgs{Image: ContainerImageRun},
+ Program: ProgramArgs{Args: []string{"/bin/sh", "-c", "echo hello world"}},
+ Runtime: RuntimeArgs{Rootfs: RootfsRunDir, Memory: 16 * 1024 * 1024},
}
b.ResetTimer()
var ids []uint64
for i := 0; i < b.N; i++ {
- id := srv.ContainerRunPool(args)
+ id := srv.JailRunPool(args)
ids = append(ids, id)
}
for _, id := range ids {
- srv.pool.WaitForTask(id)
+ buf := srv.pool.WaitForTask(id)
+ if buf.Error != nil {
+ b.Error(buf.Error)
+ }
}
}
diff --git a/internal/service/runner/config.go b/internal/service/runner/problem_config.go
similarity index 100%
rename from internal/service/runner/config.go
rename to internal/service/runner/problem_config.go
diff --git a/internal/service/runner/run_judge.go b/internal/service/runner/run_judge.go
index 896813a..3d60e01 100644
--- a/internal/service/runner/run_judge.go
+++ b/internal/service/runner/run_judge.go
@@ -5,7 +5,6 @@ import (
"git.0x7f.app/WOJ/woj-server/internal/e"
"git.0x7f.app/WOJ/woj-server/pkg/file"
"git.0x7f.app/WOJ/woj-server/pkg/utils"
- "github.com/opencontainers/runtime-spec/specs-go"
"go.uber.org/zap"
"os"
"path/filepath"
@@ -53,7 +52,7 @@ func (s *service) ProblemRun(meta *JudgeMeta) ProblemRunResults {
dataDir := filepath.Join(ProblemDir, fmt.Sprintf("%d", meta.Run.Version), "data", "input")
runtimeArgs := RuntimeArgs{
- Image: ContainerImageRun,
+ Rootfs: RootfsRunDir,
// sh, woj_launcher:program, woj_launcher:killer, woj_launcher:stat
Pid: int64(meta.Cfg.Lang.Runtime.Run.NProcLimit + 4),
Memory: uint64(meta.Cfg.Lang.Runtime.Run.MemoryLimit * 1024 * 1024),
@@ -84,30 +83,26 @@ func (s *service) ProblemRun(meta *JudgeMeta) ProblemRunResults {
},
Runtime: runtimeArgs,
}
- args.Runtime.Mount = []specs.Mount{
+ args.Runtime.Mount = []MountInfo{
{
Source: testCase,
Destination: fmt.Sprintf("/woj/problem/data/input/%d.input", id),
- Type: "bind",
- Options: []string{"rbind", "ro"},
+ Readonly: true,
},
{
Source: utils.If(meta.Cfg.Lang.JudgeInterpreter() != "", sourcePath, targetPath),
Destination: fmt.Sprintf("/woj/user/%s", utils.If(meta.Cfg.Lang.JudgeInterpreter() != "", sourceFile, targetFile)),
- Type: "bind",
- Options: []string{"rbind", "ro"},
+ Readonly: true,
},
{
Source: ansFile,
Destination: fmt.Sprintf("/woj/user/%d.out.usr", id),
- Type: "bind",
- Options: []string{"rbind"},
+ Readonly: false,
},
{
Source: ifoFile,
Destination: fmt.Sprintf("/woj/user/%d.info", id),
- Type: "bind",
- Options: []string{"rbind"},
+ Readonly: false,
},
}
@@ -123,7 +118,7 @@ func (s *service) ProblemRun(meta *JudgeMeta) ProblemRunResults {
return nil, err
}
- return s.ContainerRun(args)
+ return s.JailRun(args)
}
}(task.Id)
@@ -164,7 +159,7 @@ func (s *service) ProblemJudge(meta *JudgeMeta) {
script := meta.Cfg.Lang.JudgeScript()
runtimeArgs := RuntimeArgs{
- Image: ContainerImageFull,
+ Rootfs: RootfsFullDir,
Pid: int64(meta.Cfg.Lang.Runtime.Check.NProcLimit + 2), // bash + make
Memory: uint64(meta.Cfg.Lang.Runtime.Check.MemoryLimit * 1024 * 1024),
Timeout: time.Duration((meta.Cfg.Lang.Runtime.Check.TimeLimit+1000)/1000) * time.Second,
@@ -190,30 +185,26 @@ func (s *service) ProblemJudge(meta *JudgeMeta) {
},
Runtime: runtimeArgs,
}
- args.Runtime.Mount = []specs.Mount{
+ args.Runtime.Mount = []MountInfo{
{
Source: judgeDir,
Destination: "/woj/problem/judge",
- Type: "bind",
- Options: []string{"rbind", "ro"},
+ Readonly: true,
},
{
Source: dataDir,
Destination: "/woj/problem/data",
- Type: "bind",
- Options: []string{"rbind", "ro"},
+ Readonly: true,
},
{
Source: ansFile,
Destination: fmt.Sprintf("/woj/user/%d.out.usr", id),
- Type: "bind",
- Options: []string{"rbind"},
+ Readonly: true,
},
{
Source: jdgFile,
Destination: fmt.Sprintf("/woj/user/%d.judge", id),
- Type: "bind",
- Options: []string{"rbind"},
+ Readonly: false,
},
}
@@ -227,7 +218,7 @@ func (s *service) ProblemJudge(meta *JudgeMeta) {
return nil, err
}
- return s.ContainerRun(args)
+ return s.JailRun(args)
}
}(task.Id)
diff --git a/internal/service/runner/service.go b/internal/service/runner/service.go
index 4941bbf..394ce67 100644
--- a/internal/service/runner/service.go
+++ b/internal/service/runner/service.go
@@ -1,18 +1,14 @@
package runner
import (
- "context"
"git.0x7f.app/WOJ/woj-server/internal/e"
"git.0x7f.app/WOJ/woj-server/internal/misc/config"
"git.0x7f.app/WOJ/woj-server/internal/misc/log"
"git.0x7f.app/WOJ/woj-server/pkg/pool"
"git.0x7f.app/WOJ/woj-server/pkg/utils"
- "github.com/containerd/containerd"
- "github.com/containerd/containerd/namespaces"
"github.com/samber/do"
"go.uber.org/zap"
"runtime"
- "sync/atomic"
)
var _ Service = (*service)(nil)
@@ -48,31 +44,18 @@ func NewService(i *do.Injector) (Service, error) {
srv := &service{
log: do.MustInvoke[log.Service](i).GetLogger("runner"),
pool: pool.NewTaskPool(concurrency, concurrency),
+ cgroup: cfg.Runner.CGroup,
verbose: cfg.Development,
}
- var err error
- srv.container.client, err = containerd.New(cfg.Runner.Address)
- if err != nil {
- srv.log.Error("failed to connect to containerd", zap.Error(err))
- return nil, err
- }
-
- srv.container.ctx = namespaces.WithNamespace(context.Background(), "woj")
- srv.container.count.Store(0)
-
srv.pool.Start()
return srv, nil
}
type service struct {
- log *zap.Logger
- pool *pool.TaskPool
- container struct {
- client *containerd.Client
- ctx context.Context
- count atomic.Uint64
- }
+ log *zap.Logger
+ pool *pool.TaskPool
+ cgroup string
verbose bool
}
@@ -82,10 +65,5 @@ func (s *service) HealthCheck() error {
func (s *service) Shutdown() error {
s.pool.Stop()
- if s.container.client != nil {
- // TODO: wait and kill all containers
- _ = s.container.client.Close()
- }
-
return nil
}
diff --git a/internal/service/runner/service_test.go b/internal/service/runner/service_test.go
index 8341ebb..ebfa729 100644
--- a/internal/service/runner/service_test.go
+++ b/internal/service/runner/service_test.go
@@ -23,8 +23,8 @@ func GetService(dev bool) Service {
injector := do.New()
cfg := &FakeConfigService{conf: model.Config{
- Runner: model.ConfigRunner{Address: "/run/containerd/containerd.sock"},
Development: dev,
+ Runner: model.ConfigRunner{CGroup: "/sys/fs/cgroup/nsjail"},
}}
do.ProvideValue[config.Service](injector, cfg)
diff --git a/resource/deploy/runner.yaml b/resource/deploy/runner.yaml
index aaf6916..2ad9f82 100644
--- a/resource/deploy/runner.yaml
+++ b/resource/deploy/runner.yaml
@@ -35,7 +35,7 @@ spec:
spec:
containers:
- name: runner
- image: git.0x7f.app/woj/woj-runner:1.3.0
+ image: git.0x7f.app/woj/woj-runner:1.3.1-dev
imagePullPolicy: IfNotPresent
args:
- runner
@@ -61,7 +61,7 @@ spec:
key: MINIO_ROOT_PASSWORD
- name: STORAGE_BUCKET
value: "woj"
- - name: START_CONTAINERD
+ - name: SETUP_CGROUP
value: "true"
securityContext:
privileged: true
diff --git a/resource/deploy/server.yaml b/resource/deploy/server.yaml
index d37cfdd..2e37061 100644
--- a/resource/deploy/server.yaml
+++ b/resource/deploy/server.yaml
@@ -20,7 +20,7 @@ spec:
spec:
containers:
- name: server
- image: git.0x7f.app/woj/woj-server:1.3.0
+ image: git.0x7f.app/woj/woj-server:1.3.1-dev
imagePullPolicy: IfNotPresent
args:
- server
diff --git a/resource/runner/framework/rootfs/.gitignore b/resource/runner/framework/rootfs/.gitignore
new file mode 100644
index 0000000..5ff7aef
--- /dev/null
+++ b/resource/runner/framework/rootfs/.gitignore
@@ -0,0 +1,2 @@
+/full
+/run
\ No newline at end of file
diff --git a/resource/runner/framework/scripts/.gitignore b/resource/runner/framework/scripts/.gitignore
index 7b0fd4d..2865740 100644
--- a/resource/runner/framework/scripts/.gitignore
+++ b/resource/runner/framework/scripts/.gitignore
@@ -1,5 +1,6 @@
# bin
-/libwoj_sandbox.so
/woj_launcher
+/nsjail
# source
/woj-sandbox
+/nsjail-src
\ No newline at end of file
diff --git a/resource/runner/framework/scripts/setup.sh b/resource/runner/framework/scripts/setup.sh
index 07acf19..d93893b 100755
--- a/resource/runner/framework/scripts/setup.sh
+++ b/resource/runner/framework/scripts/setup.sh
@@ -1,14 +1,43 @@
#!/usr/bin/env bash
-set -x
-rm -rf woj-sandbox
-git clone https://git.0x7f.app/WOJ/woj-sandbox.git >/dev/null 2>&1 || exit 1
-cd woj-sandbox && ./build_libseccomp.sh || exit 1
+COLOR_RED="\e[0;31m"
+COLOR_GREEN="\e[0;32m"
+COLOR_NONE="\e[0m"
+function log_info() { echo -e "${COLOR_GREEN}$*${COLOR_NONE}" 1>&2; }
+function log_error() { echo -e "${COLOR_RED}$*${COLOR_NONE}" 1>&2; }
-mkdir -p build && cd build || exit 1
-cmake .. -DCMAKE_BUILD_TYPE=Release || exit 1
-make -j || exit 1
+function build_woj_launcher {
+ rm -rf woj-sandbox
-cd ../..
-cp woj-sandbox/build/woj_launcher . || exit 1
-rm -rf woj-sandbox || exit 1
+ git clone https://git.0x7f.app/WOJ/woj-sandbox.git woj-sandbox >/dev/null 2>&1 || { log_error "Failed to clone woj-sandbox"; exit 1; }
+ cd woj-sandbox || { log_error "Failed to enter woj-sandbox"; exit 1; }
+ ./build_libseccomp.sh || { log_error "Failed to build libseccomp"; exit 1; }
+ mkdir -p build || { log_error "Failed to create build directory"; exit 1; }
+ cd build || { log_error "Failed to enter build directory"; exit 1; }
+ cmake .. -DCMAKE_BUILD_TYPE=Release || { log_error "Failed to configure woj-sandbox"; exit 1; }
+ make -j || { log_error "Failed to build woj-sandbox"; exit 1; }
+
+ cd ../..
+ rm -f woj_launcher
+ cp woj-sandbox/build/woj_launcher .
+ rm -rf woj-sandbox
+}
+
+function build_nsjail {
+ rm -rf nsjail-src
+
+ git clone https://git.0x7f.app/woj/nsjail nsjail-src >/dev/null 2>&1 || { log_error "Failed to clone nsjail"; exit 1; }
+ cd nsjail-src || { log_error "Failed to enter nsjail"; exit 1; }
+ make -j || { log_error "Failed to build nsjail"; exit 1; }
+
+ cd ..
+ rm -f nsjail
+ cp nsjail-src/nsjail .
+ rm -rf nsjail-src
+}
+
+log_info "Building woj_launcher..."
+build_woj_launcher
+
+log_info "Building nsjail..."
+build_nsjail
diff --git a/resource/runner/problem/example/judge/custom.Makefile b/resource/runner/problem/example/judge/custom.Makefile
index 11096ea..4e867ea 100644
--- a/resource/runner/problem/example/judge/custom.Makefile
+++ b/resource/runner/problem/example/judge/custom.Makefile
@@ -10,7 +10,7 @@ include ${TEMPLATE}/c.mk ${TEMPLATE}/Judger.mk
# 环境变量:
# USER_PROG=... <-- 一段随机字符串
# LANG=... <-- 用户提交的程序的语言,如 c, cpp
-# 其余通用环境变量,详见 ubuntu-full.Dockerfile
+# 其余通用环境变量,详见 nsjail.go
# 执行限制:
# 目前版本硬编码限制:时间 60s,内存 256mb
# 3. run: 运行用户程序
@@ -28,7 +28,7 @@ include ${TEMPLATE}/c.mk ${TEMPLATE}/Judger.mk
# 环境变量:
# TEST_NUM=... <-- 当前测试点编号
# CMP=... <-- 在 config.json 中配置的比较器,如 NCMP
-# 其余通用环境变量,详见 ubuntu-full.Dockerfile
+# 其余通用环境变量,详见 nsjail.go
compile:
$(CC) $(CFLAGS) -o $(PREFIX)/user/$(USER_PROG).out $(PREFIX)/user/$(USER_PROG).$(LANG) $(PREFIX)/problem/judge/gadget.c
diff --git a/resource/runner/problem/example/judge/prebuild.Makefile b/resource/runner/problem/example/judge/prebuild.Makefile
index aa3fbc5..9f73291 100644
--- a/resource/runner/problem/example/judge/prebuild.Makefile
+++ b/resource/runner/problem/example/judge/prebuild.Makefile
@@ -9,7 +9,7 @@ include ${TEMPLATE}/c.mk ${TEMPLATE}/Judger.mk
# └── judge 映射到题目目录的 ./judge
# 环境变量:
# PREFIX=/woj
-# 其余通用环境变量,详见 ubuntu-full.Dockerfile
+# 其余通用环境变量,详见 nsjail.go
# 执行限制:
# 目前版本硬编码限制:时间 300s,内存 1g
diff --git a/resource/runner/scripts/common.sh b/resource/runner/scripts/common.sh
index 76a2ef5..c461cfd 100755
--- a/resource/runner/scripts/common.sh
+++ b/resource/runner/scripts/common.sh
@@ -10,5 +10,5 @@ function log_warn() { echo -e "${COLOR_YELLOW}$*${COLOR_NONE}" 1>&2; }
function log_error() { echo -e "${COLOR_RED}$*${COLOR_NONE}" 1>&2; }
if [ -z "$DOCKER" ]; then
- DOCKER="nerdctl"
+ DOCKER="podman"
fi
diff --git a/resource/runner/scripts/debian-full.Dockerfile b/resource/runner/scripts/debian-full.Dockerfile
new file mode 100644
index 0000000..78d5888
--- /dev/null
+++ b/resource/runner/scripts/debian-full.Dockerfile
@@ -0,0 +1,25 @@
+FROM docker.io/library/debian:bookworm-slim
+WORKDIR /woj
+
+# Install dependencies & languages: c/cpp/python3/pypy3
+RUN apt-get update && apt-get upgrade -y && apt-get install -y software-properties-common \
+ && apt-get install -y \
+ git parallel wget curl \
+ autoconf bison cmake flex gperf libnl-route-3-dev libprotobuf-dev libtool m4 make pkg-config protobuf-compiler \
+ gcc g++ clang \
+ python3 pypy3 \
+ && apt-get clean && rm -rf /var/lib/apt/lists
+# Install golang
+RUN wget https://go.dev/dl/go1.22.1.linux-amd64.tar.gz && rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.1.linux-amd64.tar.gz && rm go1.22.1.linux-amd64.tar.gz
+# Install Rust
+RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
+# Setup PATH
+ENV PATH=/usr/local/go/bin:/root/.cargo/bin:$PATH
+
+# Copy source code
+RUN mkdir -p /woj/framework && mkdir -p /woj/problem
+COPY framework /woj/framework
+
+# Build
+RUN cd /woj/framework/template && ./setup.sh
+RUN cd /woj/framework/scripts && ./setup.sh
diff --git a/resource/runner/scripts/ubuntu-run.Dockerfile b/resource/runner/scripts/debian-run.Dockerfile
similarity index 60%
rename from resource/runner/scripts/ubuntu-run.Dockerfile
rename to resource/runner/scripts/debian-run.Dockerfile
index c14bbca..c16e404 100644
--- a/resource/runner/scripts/ubuntu-run.Dockerfile
+++ b/resource/runner/scripts/debian-run.Dockerfile
@@ -1,7 +1,8 @@
ARG IMAGE_PREFIX=git.0x7f.app/woj
+ARG VERSION=latest
-FROM ${IMAGE_PREFIX}/ubuntu-full:latest AS builder
-FROM docker.io/library/ubuntu:22.04
+FROM ${IMAGE_PREFIX}/debian-full:${VERSION} AS builder
+FROM docker.io/library/debian:bookworm-slim
RUN apt-get update && apt-get upgrade -y \
&& apt-get install -y python3 pypy3 \
@@ -11,3 +12,4 @@ WORKDIR /woj
RUN mkdir -p /woj/framework/scripts
COPY --from=builder /woj/framework/scripts/woj_launcher /woj/framework/scripts/
+COPY --from=builder /woj/framework/scripts/nsjail /woj/framework/scripts/
diff --git a/resource/runner/scripts/import.sh b/resource/runner/scripts/import.sh
index 4b79de4..67fdc9c 100755
--- a/resource/runner/scripts/import.sh
+++ b/resource/runner/scripts/import.sh
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
WORKSPACE=$(cd "$(dirname "$0")"/.. && pwd)
-. "$WORKSPACE"/scripts/common.sh
+. "$WORKSPACE/scripts/common.sh"
if [ -z "$WOJ_ENDPOINT" ]; then
read -p "Enter HTTP API Endpoint: " -r endpoint
diff --git a/resource/runner/scripts/ubuntu-full.Dockerfile b/resource/runner/scripts/ubuntu-full.Dockerfile
deleted file mode 100644
index d3b344c..0000000
--- a/resource/runner/scripts/ubuntu-full.Dockerfile
+++ /dev/null
@@ -1,30 +0,0 @@
-FROM docker.io/library/ubuntu:22.04
-WORKDIR /woj
-
-# Install dependencies & languages
-RUN apt-get update && apt-get upgrade -y && apt-get install -y software-properties-common \
- && add-apt-repository ppa:pypy/ppa && apt-get update \
- && apt-get install -y \
- git parallel wget curl \
- gcc g++ clang make cmake autoconf m4 libtool gperf \
- python3 pypy3 \
- && apt-get clean && rm -rf /var/lib/apt/lists
-RUN wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz && rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz && rm go1.22.0.linux-amd64.tar.gz
-RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
-ENV PATH=/usr/local/go/bin:/root/.cargo/bin:$PATH
-
-# Copy source code
-RUN mkdir -p /woj/framework && mkdir -p /woj/problem
-COPY framework /woj/framework
-
-# Build
-RUN cd /woj/framework/template && ./setup.sh
-RUN cd /woj/framework/scripts && ./setup.sh
-
-# Environment
-ENV WOJ_LAUNCHER=/woj/framework/scripts/woj_launcher
-ENV WOJ_SANDBOX=/woj/framework/scripts/libwoj_sandbox.so
-ENV TEMPLATE=/woj/framework/template
-ENV TESTLIB=/woj/framework/template/testlib
-ENV PREFIX=/woj
-