Skip to content

Commit 97bc4ad

Browse files
mdlayherstv0g
andauthored
FreeBSD kernel support (#128)
* internal/freebsd: add initial version of FreeBSD support * internal/wguser: Replace deprecated io/ioutil package with io * internal/freebsd: prepare CI to run tests on FreeBSD * test: sort AllowedIPs before diffing them * test: skip integration test configure_peers_update_only on FreeBSD * test: increase test timeout for slow FreeBSD tests * add FreeBSD support to README Signed-off-by: Steffen Vogel <[email protected]> * *: tidy * go.mod: bump dependencies * .builds: try to fix OpenBSD Signed-off-by: Matt Layher <[email protected]> Co-authored-by: Steffen Vogel <[email protected]>
1 parent 473347a commit 97bc4ad

33 files changed

+1081
-76
lines changed

.builds/freebsd.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
image: freebsd/latest
22
packages:
33
- go
4+
- bash
5+
- sudo
6+
- wireguard
47
sources:
58
- https://github.com/WireGuard/wgctrl-go
69
environment:
710
GO111MODULE: "on"
811
GOBIN: "/home/build/go/bin"
12+
CGO_ENABLED: "1"
913
tasks:
1014
- setup-wireguard: |
1115
./wgctrl-go/.cibuild.sh

.builds/openbsd.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,15 @@ tasks:
1414
go version
1515
go install honnef.co/go/tools/cmd/staticcheck@latest
1616
cd wgctrl-go/
17-
diff -u <(echo -n) <(/usr/local/go/bin/gofmt -d -s .)
1817
go vet ./...
1918
$GOBIN/staticcheck ./...
2019
# The race detector is not supported on OpenBSD.
2120
go test -v ./...
2221
# 32-bit sanity checking for different kernel structure sizes.
2322
GOARCH=386 go build ./...
2423
go test -c .
25-
# TODO: re-enable once Go 1.18 is available in openbsd/latest and wireguard-go can be built
24+
doas bash -c 'WGCTRL_INTEGRATION=yesreallydoit ./wgctrl.test -test.v -test.run TestIntegration'
25+
# TODO: re-enable once Go 1.19 is available in openbsd/latest and wireguard-go can be built
2626
exit 0
2727
# Use wireguard-go for additional testing.
2828
doas /usr/local/bin/wireguard-go tun0
29-
doas bash -c 'WGCTRL_INTEGRATION=yesreallydoit ./wgctrl.test -test.v -test.run TestIntegration'

.cibuild.sh

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,22 @@ KERNEL=$(uname -s)
1010
SUDO="sudo"
1111
if [ "${KERNEL}" == "OpenBSD" ]; then
1212
SUDO="doas"
13-
# TODO: wireguard-go only builds using Go 1.18. However, openbsd/latest
14-
# currently has an older version. Re-enable once Go 1.18 is available.
13+
14+
# Configure a WireGuard interface.
15+
doas ifconfig wg0 create
16+
doas ifconfig wg0 up
17+
18+
# TODO: wireguard-go only builds using Go 1.19+. However, openbsd/latest
19+
# currently has an older version.
1520
exit 0
1621
fi
1722

23+
if [ "${KERNEL}" == "FreeBSD" ]; then
24+
# Configure a WireGuard interface.
25+
sudo ifconfig wg create name wg0
26+
sudo ifconfig wg0 up
27+
fi
28+
1829
if [ "${KERNEL}" == "Linux" ]; then
1930
# Configure a WireGuard interface.
2031
sudo ip link add wg0 type wireguard

.github/workflows/linux-integration-test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
build:
1313
strategy:
1414
matrix:
15-
go-version: [1.18]
15+
go-version: [1.19]
1616
runs-on: ubuntu-latest
1717

1818
steps:

.github/workflows/linux-test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
build:
1313
strategy:
1414
matrix:
15-
go-version: [1.18]
15+
go-version: [1.19]
1616
runs-on: ubuntu-latest
1717

1818
steps:

.github/workflows/static-analysis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
build:
1313
strategy:
1414
matrix:
15-
go-version: [1.18]
15+
go-version: [1.19]
1616
runs-on: ubuntu-latest
1717

1818
steps:

CONTRIBUTING.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
Contributing
2-
============
1+
# Contributing
32

43
The `wgctrl` project makes use of the [GitHub Flow](https://guides.github.com/introduction/flow/)
54
for contributions.

LICENSE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# MIT License
22

3-
Copyright (C) 2018-2019 Matt Layher
3+
Copyright (C) 2018-2022 Matt Layher
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
66

README.md

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,16 @@ For more information on WireGuard, please see <https://www.wireguard.com/>.
77

88
MIT Licensed.
99

10-
```text
11-
go get golang.zx2c4.com/wireguard/wgctrl
12-
```
13-
1410
## Overview
1511

1612
`wgctrl` can control multiple types of WireGuard devices, including:
1713

18-
- Linux kernel module devices, via generic netlink
19-
- userspace devices (e.g. wireguard-go), via the userspace configuration protocol
20-
- both UNIX-like and Windows operating systems are supported
21-
- **Experimental:** OpenBSD kernel module devices (read-only), via ioctl interface
22-
- See <https://git.zx2c4.com/wireguard-openbsd/about/> for details.
14+
- Kernel module devices
15+
- Linux: via generic netlink
16+
- FreeBSD: via ioctl interface
17+
- OpenBSD: via ioctl interface (read-only)
18+
- Windows: via ioctl interface
19+
- Userspace devices via the userspace configuration protocol
2320

2421
As new operating systems add support for in-kernel WireGuard implementations,
2522
this package should also be extended to support those native implementations.

client_integration_test.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package wgctrl_test
22

33
import (
4+
"bytes"
45
"errors"
56
"fmt"
67
"net"
78
"os"
9+
"sort"
810
"strings"
911
"testing"
1012
"time"
@@ -68,7 +70,7 @@ func TestIntegrationClient(t *testing.T) {
6870
for _, tt := range tests {
6971
t.Run(tt.name, func(t *testing.T) {
7072
// Panic if a specific test takes too long.
71-
timer := time.AfterFunc(1*time.Minute, func() {
73+
timer := time.AfterFunc(5*time.Minute, func() {
7274
panic("test took too long")
7375
})
7476
defer timer.Stop()
@@ -187,6 +189,15 @@ func testConfigure(t *testing.T, c *wgctrl.Client, d *wgtypes.Device) {
187189
}},
188190
}
189191

192+
// Sort AllowedIPs as different implementations might return
193+
// them in different order
194+
for i := range dn.Peers {
195+
ips := dn.Peers[i].AllowedIPs
196+
sort.Slice(ips, func(i, j int) bool {
197+
return bytes.Compare(ips[i].IP, ips[j].IP) > 0
198+
})
199+
}
200+
190201
if diff := cmp.Diff(d, dn); diff != "" {
191202
t.Fatalf("unexpected Device from Device (-want +got):\n%s", diff)
192203
}
@@ -354,6 +365,12 @@ func testConfigurePeersUpdateOnly(t *testing.T, c *wgctrl.Client, d *wgtypes.Dev
354365
}
355366

356367
if err := c.ConfigureDevice(d.Name, cfg); err != nil {
368+
if d.Type == wgtypes.FreeBSDKernel && err == wgtypes.ErrUpdateOnlyNotSupported {
369+
// TODO(stv0g): remove as soon as the FreeBSD kernel module supports it
370+
t.Skip("FreeBSD kernel devices do not support UpdateOnly flag")
371+
}
372+
373+
357374
t.Fatalf("failed to configure second time on %q: %v", d.Name, err)
358375
}
359376

doc.go

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,6 @@
22
//
33
// For more information on WireGuard, please see https://www.wireguard.com/.
44
//
5-
// go get golang.zx2c4.com/wireguard/wgctrl
6-
//
7-
//
8-
// Overview
9-
//
10-
// wgctrl can control multiple types of WireGuard devices, including:
11-
//
12-
// - Linux kernel module devices, via generic netlink
13-
// - userspace devices (e.g. wireguard-go), via the userspace configuration protocol
14-
// - both UNIX-like and Windows operating systems are supported
15-
// - **Experimental:** OpenBSD kernel module devices, via ioctl interface
16-
// See <https://git.zx2c4.com/wireguard-openbsd/about/> for details. Specify
17-
// environment variable WGCTRL_OPENBSD_KERNEL=1 to enable this interface.
18-
//
19-
// As new operating systems add support for in-kernel WireGuard implementations,
20-
// this package should also be extended to support those native implementations.
21-
//
22-
// If you are aware of any efforts on this front, please file an issue:
23-
// https://github.com/WireGuard/wgctrl-go/issues/new.
24-
//
255
// This package implements WireGuard configuration protocol operations, enabling
266
// the configuration of existing WireGuard devices. Operations such as creating
277
// WireGuard devices, or applying IP addresses to those devices, are out of scope

go.mod

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
module golang.zx2c4.com/wireguard/wgctrl
22

3-
go 1.17
3+
go 1.19
44

55
require (
6-
github.com/google/go-cmp v0.5.7
6+
github.com/google/go-cmp v0.5.9
77
github.com/mdlayher/genetlink v1.2.0
8-
github.com/mdlayher/netlink v1.6.0
8+
github.com/mdlayher/netlink v1.6.2
99
github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721
10-
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4
11-
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad
12-
golang.zx2c4.com/wireguard v0.0.0-20220407013110-ef5c587f782d
10+
golang.org/x/crypto v0.1.0
11+
golang.org/x/sys v0.1.0
12+
golang.zx2c4.com/wireguard v0.0.0-20220920152132-bb719d3a6e2c
1313
)
1414

1515
require (
1616
github.com/josharian/native v1.0.0 // indirect
1717
github.com/mdlayher/socket v0.2.3 // indirect
18-
golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2 // indirect
19-
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
18+
golang.org/x/net v0.1.0 // indirect
19+
golang.org/x/sync v0.1.0 // indirect
2020
)

go.sum

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,50 @@
11
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
2-
github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
32
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
3+
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
4+
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
45
github.com/josharian/native v1.0.0 h1:Ts/E8zCSEsG17dUqv7joXJFybuMLjQfWE04tsBODTxk=
56
github.com/josharian/native v1.0.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
67
github.com/mdlayher/genetlink v1.2.0 h1:4yrIkRV5Wfk1WfpWTcoOlGmsWgQj3OtQN9ZsbrE+XtU=
78
github.com/mdlayher/genetlink v1.2.0/go.mod h1:ra5LDov2KrUCZJiAtEvXXZBxGMInICMXIwshlJ+qRxQ=
8-
github.com/mdlayher/netlink v1.6.0 h1:rOHX5yl7qnlpiVkFWoqccueppMtXzeziFjWAjLg6sz0=
99
github.com/mdlayher/netlink v1.6.0/go.mod h1:0o3PlBmGst1xve7wQ7j/hwpNaFaH4qCRyWCdcZk8/vA=
10+
github.com/mdlayher/netlink v1.6.2 h1:D2zGSkvYsJ6NreeED3JiVTu1lj2sIYATqSaZlhPzUgQ=
11+
github.com/mdlayher/netlink v1.6.2/go.mod h1:O1HXX2sIWSMJ3Qn1BYZk1yZM+7iMki/uYGGiwGyq/iU=
1012
github.com/mdlayher/socket v0.1.1/go.mod h1:mYV5YIZAfHh4dzDVzI8x8tWLWCliuX8Mon5Awbj+qDs=
1113
github.com/mdlayher/socket v0.2.3 h1:XZA2X2TjdOwNoNPVPclRCURoX/hokBY8nkTmRZFEheM=
1214
github.com/mdlayher/socket v0.2.3/go.mod h1:bz12/FozYNH/VbvC3q7TRIK/Y6dH1kCKsXaUeXi/FmY=
1315
github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721 h1:RlZweED6sbSArvlE924+mUcZuXKLBHA35U7LN621Bws=
1416
github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721/go.mod h1:Ickgr2WtCLZ2MDGd4Gr0geeCH5HybhRJbonOgQpvSxc=
1517
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
16-
golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
17-
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA=
18-
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
18+
golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
19+
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
1920
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
2021
golang.org/x/net v0.0.0-20210928044308-7d9f5e0b762b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
21-
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
2222
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
23-
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
24-
golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2 h1:6mzvA99KwZxbOrxww4EvWVQUnN1+xEu9tafK5ZxkYeA=
25-
golang.org/x/net v0.0.0-20220418201149-a630d4f3e7a2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
26-
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
23+
golang.org/x/net v0.0.0-20220923203811-8be639271d50/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
24+
golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0=
25+
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
2726
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
27+
golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
28+
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
29+
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
2830
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
2931
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
3032
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
3133
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3234
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
33-
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3435
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3536
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
36-
golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3737
golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
38-
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
39-
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
38+
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
39+
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
40+
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
4041
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
4142
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
4243
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
4344
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
4445
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
4546
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
4647
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
47-
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
4848
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
49-
golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI=
50-
golang.zx2c4.com/wireguard v0.0.0-20220407013110-ef5c587f782d h1:q4JksJ2n0fmbXC0Aj0eOs6E0AcPqnKglxWXWFqGD6x0=
51-
golang.zx2c4.com/wireguard v0.0.0-20220407013110-ef5c587f782d/go.mod h1:bVQfyl2sCM/QIIGHpWbFGfHPuDvqnCNkT6MQLTCjO/U=
49+
golang.zx2c4.com/wireguard v0.0.0-20220920152132-bb719d3a6e2c h1:Okh6a1xpnJslG9Mn84pId1Mn+Q8cvpo4HCeeFWHo0cA=
50+
golang.zx2c4.com/wireguard v0.0.0-20220920152132-bb719d3a6e2c/go.mod h1:enML0deDxY1ux+B6ANGiwtg0yAJi1rctkTpcHNAVPyg=

0 commit comments

Comments
 (0)