Skip to content

Commit 88300a3

Browse files
⬆️ Added bulk mode & removed default TTL (#73)
This commit contains the following changes, mostly related to the bulk mode: - adds a bulk mode to handle change sets as a zonefile import; - removed default TTL as it was interfering with records that had the same TTL as the zone; the zone TTL is used instead in the situations where the default TTL was used before; - improved logs - updated tests and documentation
1 parent 317d401 commit 88300a3

29 files changed

+9673
-173
lines changed

README.md

Lines changed: 81 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
# ExternalDNS - UNOFFICIAL Hetzner Webhook
22

3-
> [!WARNING]
4-
> **This software is experimental.**
3+
> [!IMPORTANT]
4+
> Support for the legacy DNS is going to be discontinued by Hetzner in May 2026.
5+
> The legacy provider will be pulled from this provider in version **v1.0.0**.
6+
> No new features will be added to the legacy DNS driver and only important
7+
> bugfixes will be backported.
58
69
> [!NOTE]
7-
> The latest version is **v0.10.0**.
10+
> The latest version is **v0.11.0**.
811
912
[ExternalDNS](https://github.com/kubernetes-sigs/external-dns) is a Kubernetes
1013
add-on for automatically DNS records for Kubernetes services using different
@@ -16,7 +19,7 @@ you to manage your Hetzner domains inside your kubernetes cluster.
1619
This webhook supports both the old DNS API and the new Cloud DNS interface.
1720

1821
> [!TIP]
19-
> If you are upgrading to **0.8.x** from previous versions read the
22+
> If you are upgrading to **v0.11.x** from previous versions read the
2023
> [Upgrading from previous versions](#upgrading-from-previous-versions) section.
2124
2225

@@ -80,7 +83,7 @@ provider:
8083
webhook:
8184
image:
8285
repository: ghcr.io/mconfalonieri/external-dns-hetzner-webhook
83-
tag: v0.10.0
86+
tag: v0.11.0
8487
env:
8588
- name: HETZNER_API_KEY
8689
valueFrom:
@@ -140,7 +143,7 @@ extraArgs:
140143

141144
sidecars:
142145
- name: hetzner-webhook
143-
image: ghcr.io/mconfalonieri/external-dns-hetzner-webhook:v0.10.0
146+
image: ghcr.io/mconfalonieri/external-dns-hetzner-webhook:v0.11.0
144147
ports:
145148
- containerPort: 8888
146149
name: webhook
@@ -215,8 +218,66 @@ requires an escape sequence for the slash part. By default this will be:
215218

216219
This can be changed using the **SLASH_ESC_SEQ** environment variable.
217220

221+
## Bulk mode
222+
223+
The Cloud API now supports a new way of updating the records for a zone called
224+
**bulk mode**. This mode is activated by setting the `BULK_MODE` environment
225+
variable to `true`. It works by exporting the zonefile, editing it and then
226+
uploading the modified version. It is meant to be used in environments with a
227+
high number of record changes per zone and a relatively long interval between
228+
the updates, a combination that could cause the exhaustion of the permitted API
229+
calls.
230+
231+
> [!WARNING]
232+
> Beware that this method of updating the records is potentially destructive
233+
> and subject to "race conditions" if manual edits are applied while the zone
234+
> is being updated. Theoretically, unsupported records won't be affected, but
235+
> this method is to be considered **HIGHLY EXPERIMENTAL**, and bugs are likely
236+
> to be found.
237+
238+
It comes with some limitations.
239+
240+
1. [Hetzner labels](#hetzner-labels) are not supported, as there is no way to
241+
import them in the zonefile. Record comments are unsupported as well.
242+
2. All the records must be **not protected** as they will all be overwritten
243+
during the import operation, **including the SOA**. This is why the bulk
244+
mode should be used with care.
245+
3. The SOA serial number is updated on each import, but the logic of the
246+
serial number only accepts the standard 10-digits serial number and will
247+
refuse to update it if the serial of the day is 99. Most configurations
248+
will be OK with this limitation.
249+
4. If the zones managed by this webhook are also manipuilated by other
250+
software the following situation, although unlikely, could happen:
251+
252+
1. the webhook downloads the zonefile for a zone
253+
2. the other software manipulates some record on the same zone
254+
3. the webhook uploads the zonefile, missing the changes applied by the
255+
other software
256+
4. since the upload rewrites the zonefile, those changes are now lost.
257+
258+
Please check the [Zone file import](https://docs.hetzner.cloud/reference/cloud#tag/zones/zone-file-import)
259+
section of the Hetzner documentation for more details.
260+
218261
## Upgrading from previous versions
219262

263+
### 0.10.x to 0.11.x
264+
265+
The configuration is compatible with previous versions; however the
266+
**DEFAULT_TTL** parameter was removed and this environment variable will
267+
therefore not affect the configuration. The default TTL will be the one defined
268+
in the zone.
269+
270+
A **BULK_MODE** parameter was added. When set to `true`, the webhook will
271+
export and manipulate the zonefiles instead of the single recordsets. This will
272+
reduce the API calls when updating zones with lots of changes and a relatively
273+
long interval.
274+
275+
> [!WARNING]
276+
> The bulk mode is experimental and comes with some limitations. Please read
277+
> the [Bulk mode](#bulk-mode) section before activating it.
278+
>
279+
280+
220281
### 0.9.x to 0.10.x
221282

222283
The configuration is fully compatible. There is a new configuration parameter
@@ -281,11 +342,11 @@ Hetzner DNS API.
281342
| --------------- | -------------------------------------- | -------------------------- |
282343
| HETZNER_API_KEY | Hetzner API token | Mandatory |
283344
| BATCH_SIZE | Number of zones per call | Default: `100`, max: `100` |
284-
| DEFAULT_TTL | Default record TTL | Default: `7200` |
285345
| USE_CLOUD_API | Use the new cloud API | Default: `false` |
286346
| SLASH_ESC_SEQ | Escape sequence for label annotations | Default: `--slash--` |
287347
| MAX_FAIL_COUNT | Number of failed calls before shutdown | Default: `-1` (disabled) |
288-
| ZONE_CACHE_TTL | TTL for the zone cache in seconds | Default: `0` (disabled) |
348+
| ZONE_CACHE_TTL | TTL for the zone cache in seconds | Default: `0` (disabled) |
349+
| BULK_MODE | Enables bulk mode | Default: `false` |
289350

290351
> [!IMPORTANT]
291352
> Please notice that when **USE_CLOUD_API** is set to `true`, the token stored
@@ -315,10 +376,11 @@ These variables control the sockets that this application listens to.
315376

316377
Please notice that the following variables were **deprecated**:
317378

318-
| Variable | Description |
319-
| ----------- | -------------------------------- |
320-
| HEALTH_HOST | Metrics hostname (deprecated) |
321-
| HEALTH_PORT | Metrics port (deprecated) |
379+
| Variable | Description |
380+
| ----------- | -------------------------------------- |
381+
| HEALTH_HOST | Metrics hostname (deprecated) |
382+
| HEALTH_PORT | Metrics port (deprecated) |
383+
| DEFAULT_TTL | The default TTL is taken from the zone |
322384

323385

324386
### Domain filtering
@@ -448,6 +510,13 @@ The actions supported by the Cloud API provider are:
448510
- `update_rrset` (this is the method used to update labels)
449511
- `delete_rrset`
450512

513+
In case `BULK_MODE` is set to true, the following actions will be used instead:
514+
515+
- `get_zones`
516+
- `get_rrsets`
517+
- `import_zonefile`
518+
- `export_zonefile`
519+
451520
The label `zone` can assume one of the zone names as its value.
452521

453522
## Development

README.md.gotmpl renamed to README.tmpl.md

Lines changed: 78 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
# ExternalDNS - UNOFFICIAL Hetzner Webhook
22

3-
> [!WARNING]
4-
> **This software is experimental.**
3+
> [!IMPORTANT]
4+
> Support for the legacy DNS is going to be discontinued by Hetzner in May 2026.
5+
> The legacy provider will be pulled from this provider in version **v1.0.0**.
6+
> No new features will be added to the legacy DNS driver and only important
7+
> bugfixes will be backported.
58
69
> [!NOTE]
710
> The latest version is **{{ .Version }}**.
@@ -16,7 +19,7 @@ you to manage your Hetzner domains inside your kubernetes cluster.
1619
This webhook supports both the old DNS API and the new Cloud DNS interface.
1720

1821
> [!TIP]
19-
> If you are upgrading to **0.8.x** from previous versions read the
22+
> If you are upgrading to **v0.11.x** from previous versions read the
2023
> [Upgrading from previous versions](#upgrading-from-previous-versions) section.
2124
2225

@@ -215,8 +218,66 @@ requires an escape sequence for the slash part. By default this will be:
215218

216219
This can be changed using the **SLASH_ESC_SEQ** environment variable.
217220

221+
## Bulk mode
222+
223+
The Cloud API now supports a new way of updating the records for a zone called
224+
**bulk mode**. This mode is activated by setting the `BULK_MODE` environment
225+
variable to `true`. It works by exporting the zonefile, editing it and then
226+
uploading the modified version. It is meant to be used in environments with a
227+
high number of record changes per zone and a relatively long interval between
228+
the updates, a combination that could cause the exhaustion of the permitted API
229+
calls.
230+
231+
> [!WARNING]
232+
> Beware that this method of updating the records is potentially destructive
233+
> and subject to "race conditions" if manual edits are applied while the zone
234+
> is being updated. Theoretically, unsupported records won't be affected, but
235+
> this method is to be considered **HIGHLY EXPERIMENTAL**, and bugs are likely
236+
> to be found.
237+
238+
It comes with some limitations.
239+
240+
1. [Hetzner labels](#hetzner-labels) are not supported, as there is no way to
241+
import them in the zonefile. Record comments are unsupported as well.
242+
2. All the records must be **not protected** as they will all be overwritten
243+
during the import operation, **including the SOA**. This is why the bulk
244+
mode should be used with care.
245+
3. The SOA serial number is updated on each import, but the logic of the
246+
serial number only accepts the standard 10-digits serial number and will
247+
refuse to update it if the serial of the day is 99. Most configurations
248+
will be OK with this limitation.
249+
4. If the zones managed by this webhook are also manipuilated by other
250+
software the following situation, although unlikely, could happen:
251+
252+
1. the webhook downloads the zonefile for a zone
253+
2. the other software manipulates some record on the same zone
254+
3. the webhook uploads the zonefile, missing the changes applied by the
255+
other software
256+
4. since the upload rewrites the zonefile, those changes are now lost.
257+
258+
Please check the [Zone file import](https://docs.hetzner.cloud/reference/cloud#tag/zones/zone-file-import)
259+
section of the Hetzner documentation for more details.
260+
218261
## Upgrading from previous versions
219262

263+
### 0.10.x to 0.11.x
264+
265+
The configuration is compatible with previous versions; however the
266+
**DEFAULT_TTL** parameter was removed and this environment variable will
267+
therefore not affect the configuration. The default TTL will be the one defined
268+
in the zone.
269+
270+
A **BULK_MODE** parameter was added. When set to `true`, the webhook will
271+
export and manipulate the zonefiles instead of the single recordsets. This will
272+
reduce the API calls when updating zones with lots of changes and a relatively
273+
long interval.
274+
275+
> [!WARNING]
276+
> The bulk mode is experimental and comes with some limitations. Please read
277+
> the [Bulk mode](#bulk-mode) section before activating it.
278+
>
279+
280+
220281
### 0.9.x to 0.10.x
221282

222283
The configuration is fully compatible. There is a new configuration parameter
@@ -281,11 +342,11 @@ Hetzner DNS API.
281342
| --------------- | -------------------------------------- | -------------------------- |
282343
| HETZNER_API_KEY | Hetzner API token | Mandatory |
283344
| BATCH_SIZE | Number of zones per call | Default: `100`, max: `100` |
284-
| DEFAULT_TTL | Default record TTL | Default: `7200` |
285345
| USE_CLOUD_API | Use the new cloud API | Default: `false` |
286346
| SLASH_ESC_SEQ | Escape sequence for label annotations | Default: `--slash--` |
287347
| MAX_FAIL_COUNT | Number of failed calls before shutdown | Default: `-1` (disabled) |
288-
| ZONE_CACHE_TTL | TTL for the zone cache in seconds | Default: `0` (disabled) |
348+
| ZONE_CACHE_TTL | TTL for the zone cache in seconds | Default: `0` (disabled) |
349+
| BULK_MODE | Enables bulk mode | Default: `false` |
289350

290351
> [!IMPORTANT]
291352
> Please notice that when **USE_CLOUD_API** is set to `true`, the token stored
@@ -315,10 +376,11 @@ These variables control the sockets that this application listens to.
315376

316377
Please notice that the following variables were **deprecated**:
317378

318-
| Variable | Description |
319-
| ----------- | -------------------------------- |
320-
| HEALTH_HOST | Metrics hostname (deprecated) |
321-
| HEALTH_PORT | Metrics port (deprecated) |
379+
| Variable | Description |
380+
| ----------- | -------------------------------------- |
381+
| HEALTH_HOST | Metrics hostname (deprecated) |
382+
| HEALTH_PORT | Metrics port (deprecated) |
383+
| DEFAULT_TTL | The default TTL is taken from the zone |
322384

323385

324386
### Domain filtering
@@ -448,6 +510,13 @@ The actions supported by the Cloud API provider are:
448510
- `update_rrset` (this is the method used to update labels)
449511
- `delete_rrset`
450512

513+
In case `BULK_MODE` is set to true, the following actions will be used instead:
514+
515+
- `get_zones`
516+
- `get_rrsets`
517+
- `import_zonefile`
518+
- `export_zonefile`
519+
451520
The label `zone` can assume one of the zone names as its value.
452521

453522
## Development

go.mod

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
module external-dns-hetzner-webhook
22

3-
go 1.25
3+
go 1.25.0
44

55
toolchain go1.25.7
66

77
require (
8+
codeberg.org/miekg/dns v0.6.28
89
github.com/codingconcepts/env v0.0.0-20240618133406-5b0845441187
910
github.com/sirupsen/logrus v1.9.4
1011
github.com/stretchr/testify v1.11.1
@@ -47,7 +48,8 @@ require (
4748
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
4849
go.yaml.in/yaml/v2 v2.4.3 // indirect
4950
go.yaml.in/yaml/v3 v3.0.4 // indirect
50-
golang.org/x/oauth2 v0.33.0 // indirect
51+
golang.org/x/crypto v0.48.0 // indirect
52+
golang.org/x/oauth2 v0.34.0 // indirect
5153
golang.org/x/term v0.40.0 // indirect
5254
golang.org/x/time v0.14.0 // indirect
5355
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
@@ -75,12 +77,12 @@ require (
7577
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
7678
github.com/prometheus/client_golang v1.23.2
7779
github.com/prometheus/client_model v0.6.2 // indirect
78-
github.com/prometheus/common v0.67.2 // indirect
79-
github.com/prometheus/procfs v0.18.0 // indirect
80+
github.com/prometheus/common v0.67.5 // indirect
81+
github.com/prometheus/procfs v0.19.2 // indirect
8082
golang.org/x/net v0.50.0
8183
golang.org/x/sys v0.41.0 // indirect
8284
golang.org/x/text v0.34.0 // indirect
83-
google.golang.org/protobuf v1.36.10 // indirect
85+
google.golang.org/protobuf v1.36.11 // indirect
8486
gopkg.in/yaml.v3 v3.0.1 // indirect
8587
k8s.io/klog/v2 v2.130.1 // indirect
8688
sigs.k8s.io/external-dns v0.20.0

go.sum

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
codeberg.org/miekg/dns v0.6.28 h1:fVgRtnDXtRRnYAy/jznvCiU0HC2izwudAaCD7qq88dM=
2+
codeberg.org/miekg/dns v0.6.28/go.mod h1:baZDrslaQO95dQsCNN5KJDJHRkENDhNS6NuRpXJ9huA=
13
github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY=
24
github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE=
35
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0=
@@ -108,10 +110,10 @@ github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h
108110
github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=
109111
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
110112
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
111-
github.com/prometheus/common v0.67.2 h1:PcBAckGFTIHt2+L3I33uNRTlKTplNzFctXcWhPyAEN8=
112-
github.com/prometheus/common v0.67.2/go.mod h1:63W3KZb1JOKgcjlIr64WW/LvFGAqKPj0atm+knVGEko=
113-
github.com/prometheus/procfs v0.18.0 h1:2QTA9cKdznfYJz7EDaa7IiJobHuV7E1WzeBwcrhk0ao=
114-
github.com/prometheus/procfs v0.18.0/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw=
113+
github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4=
114+
github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw=
115+
github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws=
116+
github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw=
115117
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
116118
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
117119
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
@@ -144,15 +146,17 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
144146
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
145147
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
146148
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
147-
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
148-
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
149+
go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=
150+
go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
149151
go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
150152
go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=
151153
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
152154
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
153155
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
154156
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
155157
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
158+
golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=
159+
golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=
156160
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
157161
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
158162
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -161,8 +165,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
161165
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
162166
golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60=
163167
golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM=
164-
golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo=
165-
golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
168+
golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=
169+
golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
166170
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
167171
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
168172
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -189,8 +193,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
189193
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
190194
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
191195
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
192-
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
193-
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
196+
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
197+
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
194198
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
195199
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
196200
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=

go.work

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
go 1.25
1+
go 1.25.0
22

33
toolchain go1.25.3
44

0 commit comments

Comments
 (0)