Skip to content

Commit e114286

Browse files
committed
feat: managed identity support
Signed-off-by: Sertac Ozercan <[email protected]>
1 parent fda6426 commit e114286

File tree

7 files changed

+91
-30
lines changed

7 files changed

+91
-30
lines changed

Dockerfile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
FROM golang:1.19 AS builder
1+
FROM golang:1.22-bookworm AS builder
22

33
COPY . /builder
44
WORKDIR /builder
55

66
RUN make build
77

8-
FROM alpine:3
8+
FROM gcr.io/distroless/static-debian12:latest
99

1010
WORKDIR /app
1111

1212
EXPOSE 8080
1313
COPY --from=builder /builder/bin .
1414

15-
ENTRYPOINT ["/app/azure-openai-proxy"]
15+
ENTRYPOINT ["/app/azure-openai-proxy"]

Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,7 @@ fmt:
1010
vet:
1111
go vet ./...
1212

13+
image:
14+
docker build -t azure-openai-proxy:latest .
15+
1316
.PHONY: build fmt vet

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ AZURE_OPENAI_MODEL_MAPPER: gpt-3.5-turbo=gpt-35-turbo
5454

5555
![Screenshot of the overview UI for an OpenAI Resource in the Azure portal with the endpoint & access keys location circled in red.](assets/images/endpoint.png)
5656

57-
API Key: This value can be found in the **Keys & Endpoint** section when examining your resource from the Azure portal. You can use either `KEY1` or `KEY2`.
57+
API Key: This value can be found in the **Keys & Endpoint** section when examining your resource from the Azure portal. You can use either `KEY1` or `KEY2`. If you want to use [Azure Managed Identity](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview), you can leave it blank or use `msi` as the key (if a key is required) and it will use managed identity to authenticate.
5858

5959
### Proxy
6060

@@ -81,7 +81,7 @@ AZURE_OPENAI_SOCKS_PROXY=socks5://127.0.0.1:1080
8181
### Use Docker
8282

8383
````shell
84-
# config by environment
84+
# config by environment
8585
docker run -d -p 8080:8080 --name=azure-openai-proxy \
8686
--env AZURE_OPENAI_ENDPOINT=your_azure_endpoint \
8787
--env AZURE_OPENAI_API_VER=your_azure_api_ver \

azure/init.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@ package azure
22

33
import (
44
"fmt"
5-
"github.com/spf13/viper"
6-
"github.com/stulzq/azure-openai-proxy/constant"
7-
"github.com/stulzq/azure-openai-proxy/util"
85
"log"
96
"net/url"
107
"path/filepath"
118
"strings"
9+
10+
"github.com/spf13/viper"
11+
"github.com/stulzq/azure-openai-proxy/constant"
12+
"github.com/stulzq/azure-openai-proxy/util"
1213
)
1314

1415
const (
15-
AuthHeaderKey = "api-key"
16+
AuthHeaderKey = "Authorization"
17+
APIKeyHeaderKey = "api-key"
1618
)
1719

1820
var (

azure/proxy.go

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,27 @@ package azure
22

33
import (
44
"bytes"
5+
"context"
56
"encoding/json"
67
"fmt"
7-
"github.com/stulzq/azure-openai-proxy/util"
88
"io"
99
"log"
1010
"net/http"
1111
"net/http/httputil"
1212
"strings"
1313

14+
"github.com/Azure/azure-sdk-for-go/sdk/azcore"
15+
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
16+
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
17+
"github.com/stulzq/azure-openai-proxy/util"
18+
1419
"github.com/bytedance/sonic"
1520
"github.com/gin-gonic/gin"
1621
"github.com/pkg/errors"
1722
)
1823

24+
const cognitiveservicesScope = "https://cognitiveservices.azure.com/.default"
25+
1926
func ProxyWithConverter(requestConverter RequestConverter) gin.HandlerFunc {
2027
return func(c *gin.Context) {
2128
Proxy(c, requestConverter)
@@ -43,7 +50,7 @@ func ModelProxy(c *gin.Context) {
4350
}
4451

4552
// Set the auth header
46-
req.Header.Set(AuthHeaderKey, deployment.ApiKey)
53+
req.Header.Set(APIKeyHeaderKey, deployment.ApiKey)
4754

4855
// Send the request
4956
client := &http.Client{}
@@ -69,14 +76,14 @@ func ModelProxy(c *gin.Context) {
6976
}
7077

7178
// Parse the response body as JSON
72-
var deplotmentInfo DeploymentInfo
73-
err = json.Unmarshal(body, &deplotmentInfo)
79+
var deploymentInfo DeploymentInfo
80+
err = json.Unmarshal(body, &deploymentInfo)
7481
if err != nil {
7582
log.Printf("error parsing response body for deployment %s: %v", deployment.DeploymentName, err)
7683
results <- nil
7784
return
7885
}
79-
results <- deplotmentInfo.Data
86+
results <- deploymentInfo.Data
8087
}(deployment)
8188
}
8289

@@ -152,18 +159,37 @@ func Proxy(c *gin.Context, requestConverter RequestConverter) {
152159
return
153160
}
154161

155-
// get auth token from header or deployemnt config
162+
// get auth token from header or deployment config
156163
token := deployment.ApiKey
157-
if token == "" {
164+
if token == "" && token != "msi" {
158165
rawToken := req.Header.Get("Authorization")
159166
token = strings.TrimPrefix(rawToken, "Bearer ")
167+
req.Header.Set(APIKeyHeaderKey, token)
168+
req.Header.Del("Authorization")
169+
}
170+
// get azure token using managed identity
171+
var azureToken azcore.AccessToken
172+
if token == "" || token == "msi" {
173+
cred, err := azidentity.NewManagedIdentityCredential(nil)
174+
if err != nil {
175+
util.SendError(c, errors.Wrap(err, "failed to create managed identity credential"))
176+
}
177+
178+
azureToken, err = cred.GetToken(context.TODO(), policy.TokenRequestOptions{
179+
Scopes: []string{cognitiveservicesScope},
180+
})
181+
if err != nil {
182+
util.SendError(c, errors.Wrap(err, "failed to get token"))
183+
}
184+
185+
req.Header.Del(APIKeyHeaderKey)
186+
req.Header.Set(AuthHeaderKey, "Bearer "+azureToken.Token)
160187
}
161-
if token == "" {
188+
189+
if token == "" && azureToken.Token == ""{
162190
util.SendError(c, errors.New("token is empty"))
163191
return
164192
}
165-
req.Header.Set(AuthHeaderKey, token)
166-
req.Header.Del("Authorization")
167193

168194
originURL := req.URL.String()
169195
req, err = requestConverter.Convert(req, deployment)

go.mod

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,20 @@ module github.com/stulzq/azure-openai-proxy
33
go 1.21
44

55
require (
6+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1
7+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2
68
github.com/bytedance/sonic v1.10.2
79
github.com/gin-gonic/gin v1.9.1
810
github.com/pkg/errors v0.9.1
911
github.com/spf13/pflag v1.0.5
1012
github.com/spf13/viper v1.18.2
11-
github.com/stretchr/testify v1.8.4
12-
golang.org/x/net v0.19.0
13+
github.com/stretchr/testify v1.9.0
14+
golang.org/x/net v0.22.0
1315
)
1416

1517
require (
18+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect
19+
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect
1620
github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect
1721
github.com/chenzhuoyu/iasm v0.9.1 // indirect
1822
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
@@ -23,16 +27,20 @@ require (
2327
github.com/go-playground/universal-translator v0.18.1 // indirect
2428
github.com/go-playground/validator/v10 v10.16.0 // indirect
2529
github.com/goccy/go-json v0.10.2 // indirect
30+
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
31+
github.com/google/uuid v1.6.0 // indirect
2632
github.com/hashicorp/hcl v1.0.0 // indirect
2733
github.com/json-iterator/go v1.1.12 // indirect
2834
github.com/klauspost/cpuid/v2 v2.2.6 // indirect
35+
github.com/kylelemons/godebug v1.1.0 // indirect
2936
github.com/leodido/go-urn v1.2.4 // indirect
3037
github.com/magiconair/properties v1.8.7 // indirect
3138
github.com/mattn/go-isatty v0.0.20 // indirect
3239
github.com/mitchellh/mapstructure v1.5.0 // indirect
3340
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
3441
github.com/modern-go/reflect2 v1.0.2 // indirect
3542
github.com/pelletier/go-toml/v2 v2.1.1 // indirect
43+
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
3644
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
3745
github.com/sagikazarmark/locafero v0.4.0 // indirect
3846
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
@@ -44,9 +52,9 @@ require (
4452
github.com/ugorji/go/codec v1.2.12 // indirect
4553
go.uber.org/multierr v1.11.0 // indirect
4654
golang.org/x/arch v0.6.0 // indirect
47-
golang.org/x/crypto v0.17.0 // indirect
55+
golang.org/x/crypto v0.21.0 // indirect
4856
golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 // indirect
49-
golang.org/x/sys v0.15.0 // indirect
57+
golang.org/x/sys v0.18.0 // indirect
5058
golang.org/x/text v0.14.0 // indirect
5159
google.golang.org/protobuf v1.31.0 // indirect
5260
gopkg.in/ini.v1 v1.67.0 // indirect

go.sum

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM=
2+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo=
3+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 h1:FDif4R1+UUR+00q6wquyX90K7A8dN+R5E8GEadoP7sU=
4+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2/go.mod h1:aiYBYui4BJ/BJCAIKs92XiPyQfTaBWqvHujDwKb6CBU=
5+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ=
6+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc=
7+
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
8+
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
19
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
210
github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=
311
github.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE=
@@ -13,6 +21,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
1321
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1422
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
1523
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
24+
github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=
25+
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
1626
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
1727
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
1828
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
@@ -33,11 +43,15 @@ github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqR
3343
github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
3444
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
3545
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
46+
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
47+
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
3648
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
3749
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
3850
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
3951
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
4052
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
53+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
54+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
4155
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
4256
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
4357
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
@@ -50,6 +64,8 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
5064
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
5165
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
5266
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
67+
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
68+
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
5369
github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
5470
github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
5571
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
@@ -65,6 +81,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
6581
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
6682
github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI=
6783
github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
84+
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
85+
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
6886
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
6987
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
7088
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -95,8 +113,9 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
95113
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
96114
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
97115
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
98-
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
99116
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
117+
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
118+
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
100119
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
101120
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
102121
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
@@ -108,16 +127,17 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8
108127
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
109128
golang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=
110129
golang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
111-
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
112-
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
130+
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
131+
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
113132
golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=
114133
golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
115-
golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
116-
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
134+
golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
135+
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
136+
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
117137
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
118138
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
119-
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
120-
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
139+
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
140+
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
121141
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
122142
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
123143
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -129,6 +149,8 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogR
129149
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
130150
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
131151
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
152+
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
153+
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
132154
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
133155
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
134156
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 commit comments

Comments
 (0)