Skip to content

Commit 290fbb3

Browse files
committed
feat(image): add OciPull based on the example from #169
1 parent ec148e3 commit 290fbb3

File tree

4 files changed

+166
-8
lines changed

4 files changed

+166
-8
lines changed

cmd/image/image.go

Lines changed: 113 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
package image
22

33
import (
4+
"archive/tar"
5+
"context"
6+
"errors"
47
"fmt"
58
"log/slog"
9+
"path/filepath"
610

711
pb "github.com/cheggaaa/pb/v3"
812
"github.com/mholt/archiver"
913
lz4 "github.com/pierrec/lz4/v4"
1014

15+
"github.com/google/go-containerregistry/pkg/authn"
16+
"github.com/google/go-containerregistry/pkg/name"
17+
"github.com/google/go-containerregistry/pkg/v1/mutate"
18+
"github.com/google/go-containerregistry/pkg/v1/remote"
19+
1120
//nolint:gosec
1221
"crypto/md5"
1322
"io"
@@ -25,7 +34,42 @@ func NewImage(log *slog.Logger) *Image {
2534
return &Image{log: log}
2635
}
2736

28-
// Pull a image from s3
37+
func (i *Image) OciPull(ctx context.Context, imageRef, mountDir, username, password string) error {
38+
// Parse the image reference (e.g., docker.io/library/alpine:latest)
39+
ref, err := name.ParseReference(imageRef)
40+
if err != nil {
41+
return fmt.Errorf("parsing image reference: %w", err)
42+
}
43+
44+
// Choose authentication method
45+
var auth = authn.Anonymous
46+
if username != "" || password != "" {
47+
auth = &authn.Basic{
48+
Username: username,
49+
Password: password,
50+
}
51+
}
52+
53+
i.log.Info("pull oci image", "image", imageRef)
54+
img, err := remote.Image(ref, remote.WithAuth(auth))
55+
if err != nil {
56+
return fmt.Errorf("fetching remote image: %w", err)
57+
}
58+
59+
// Flatten layers and create a tar stream
60+
rc := mutate.Extract(img)
61+
defer rc.Close()
62+
63+
i.log.Info(fmt.Sprintf("untar oci image into %s", mountDir), "image", imageRef)
64+
if err := i.untar(rc, mountDir); err != nil {
65+
return fmt.Errorf("extracting tar: %w", err)
66+
}
67+
68+
i.log.Info("pull oci image done", "image", imageRef)
69+
return nil
70+
}
71+
72+
// Pull an image from s3
2973
func (i *Image) Pull(image, destination string) error {
3074
i.log.Info("pull image", "image", image)
3175
md5destination := destination + ".md5"
@@ -171,3 +215,71 @@ func (i *Image) download(source, dest string) error {
171215

172216
return nil
173217
}
218+
219+
func (i *Image) untar(r io.Reader, dest string) error {
220+
tr := tar.NewReader(r)
221+
for {
222+
hdr, err := tr.Next()
223+
if errors.Is(err, io.EOF) {
224+
break
225+
}
226+
if err != nil {
227+
return fmt.Errorf("reading tar: %w", err)
228+
}
229+
230+
target := filepath.Join(dest, hdr.Name)
231+
232+
fmt.Printf("extracting:%s\n", target)
233+
234+
if strings.HasSuffix(target, ".log") {
235+
fmt.Printf("skipping:%s\n", target)
236+
continue
237+
}
238+
239+
switch hdr.Typeflag {
240+
case tar.TypeDir:
241+
if err := os.MkdirAll(target, os.FileMode(hdr.Mode)); err != nil {
242+
return fmt.Errorf("creating dir: %w", err)
243+
}
244+
if err := os.Lchown(target, hdr.Uid, hdr.Gid); err != nil && !errors.Is(err, os.ErrPermission) {
245+
return fmt.Errorf("chown dir: %w", err)
246+
}
247+
248+
case tar.TypeReg:
249+
if err := os.MkdirAll(filepath.Dir(target), 0755); err != nil {
250+
return fmt.Errorf("creating parent dir: %w", err)
251+
}
252+
f, err := os.OpenFile(target, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.FileMode(hdr.Mode))
253+
if err != nil {
254+
return fmt.Errorf("creating file: %w", err)
255+
}
256+
if _, err := io.Copy(f, tr); err != nil {
257+
f.Close()
258+
return fmt.Errorf("copying file: %w", err)
259+
}
260+
f.Close()
261+
262+
if err := os.Chmod(target, os.FileMode(hdr.Mode)); err != nil {
263+
return fmt.Errorf("chmod: %w", err)
264+
}
265+
if err := os.Lchown(target, hdr.Uid, hdr.Gid); err != nil && !errors.Is(err, os.ErrPermission) {
266+
return fmt.Errorf("chown file: %w", err)
267+
}
268+
269+
case tar.TypeSymlink:
270+
if err := os.MkdirAll(filepath.Dir(target), 0755); err != nil {
271+
return fmt.Errorf("creating parent dir: %w", err)
272+
}
273+
if err := os.Symlink(hdr.Linkname, target); err != nil {
274+
return fmt.Errorf("creating symlink: %w", err)
275+
}
276+
if err := os.Lchown(target, hdr.Uid, hdr.Gid); err != nil && !errors.Is(err, os.ErrPermission) {
277+
return fmt.Errorf("chown symlink: %w", err)
278+
}
279+
280+
default:
281+
// skip unsupported or special files
282+
}
283+
}
284+
return nil
285+
}

cmd/install.go

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cmd
22

33
import (
4+
"context"
45
"encoding/base64"
56
"fmt"
67
"os"
@@ -31,14 +32,26 @@ func (h *hammer) Install(machine *models.V1MachineResponse) (*api.Bootinfo, erro
3132

3233
image := machine.Allocation.Image.URL
3334

34-
err = img.NewImage(h.log).Pull(image, h.osImageDestination)
35-
if err != nil {
36-
return nil, err
37-
}
35+
if strings.HasPrefix(image, "oci://") {
36+
ctx := context.Background()
37+
// TODO: where to get oci credentials from?
38+
username := os.Getenv("REGISTRY_USERNAME")
39+
password := os.Getenv("REGISTRY_PASSWORD")
3840

39-
err = img.NewImage(h.log).Burn(h.chrootPrefix, image, h.osImageDestination)
40-
if err != nil {
41-
return nil, err
41+
err = img.NewImage(h.log).OciPull(ctx, image, h.osImageDestination, username, password)
42+
if err != nil {
43+
return nil, err
44+
}
45+
} else {
46+
err = img.NewImage(h.log).Pull(image, h.osImageDestination)
47+
if err != nil {
48+
return nil, err
49+
}
50+
51+
err = img.NewImage(h.log).Burn(h.chrootPrefix, image, h.osImageDestination)
52+
if err != nil {
53+
return nil, err
54+
}
4255
}
4356

4457
info, err := h.install(h.chrootPrefix, machine, s.RootUUID)

go.mod

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,14 @@ require (
4444
github.com/avast/retry-go/v4 v4.6.1 // indirect
4545
github.com/beorn7/perks v1.0.1 // indirect
4646
github.com/cespare/xxhash/v2 v2.3.0 // indirect
47+
github.com/containerd/stargz-snapshotter/estargz v0.16.3 // indirect
4748
github.com/coreos/go-oidc/v3 v3.15.0 // indirect
4849
github.com/creack/pty v1.1.24 // indirect
4950
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
5051
github.com/dennwc/varint v1.0.0 // indirect
52+
github.com/docker/cli v28.2.2+incompatible // indirect
53+
github.com/docker/distribution v2.8.3+incompatible // indirect
54+
github.com/docker/docker-credential-helpers v0.9.3 // indirect
5155
github.com/dsnet/compress v0.0.1 // indirect
5256
github.com/fatih/color v1.18.0 // indirect
5357
github.com/frankban/quicktest v1.14.6 // indirect
@@ -84,13 +88,15 @@ require (
8488
github.com/gogo/protobuf v1.3.2 // indirect
8589
github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
8690
github.com/golang/snappy v1.0.0 // indirect
91+
github.com/google/go-containerregistry v0.20.6 // indirect
8792
github.com/gorilla/mux v1.8.1 // indirect
8893
github.com/grafana/loki/pkg/push v0.0.0-20250903093132-95ced86f69c5 // indirect
8994
github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect
9095
github.com/jaypipes/pcidb v1.1.1 // indirect
9196
github.com/josharian/intern v1.0.0 // indirect
9297
github.com/jpillora/backoff v1.0.0 // indirect
9398
github.com/json-iterator/go v1.1.12 // indirect
99+
github.com/klauspost/compress v1.18.0 // indirect
94100
github.com/lestrrat-go/blackmagic v1.0.4 // indirect
95101
github.com/lestrrat-go/httpcc v1.0.1 // indirect
96102
github.com/lestrrat-go/httprc v1.0.6 // indirect
@@ -105,13 +111,16 @@ require (
105111
github.com/mdlayher/lldp v0.0.0-20150915211757-afd9f83164c5 // indirect
106112
github.com/metal-stack/metal-lib v0.23.4 // indirect
107113
github.com/metal-stack/security v0.9.4 // indirect
114+
github.com/mitchellh/go-homedir v1.1.0 // indirect
108115
github.com/mitchellh/mapstructure v1.5.0 // indirect
109116
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
110117
github.com/modern-go/reflect2 v1.0.2 // indirect
111118
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
112119
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
113120
github.com/nwaples/rardecode v1.1.3 // indirect
114121
github.com/oklog/ulid v1.3.1 // indirect
122+
github.com/opencontainers/go-digest v1.0.0 // indirect
123+
github.com/opencontainers/image-spec v1.1.1 // indirect
115124
github.com/opentracing/opentracing-go v1.2.0 // indirect
116125
github.com/pierrec/lz4 v2.6.1+incompatible // indirect
117126
github.com/pkg/errors v0.9.1 // indirect
@@ -125,9 +134,11 @@ require (
125134
github.com/samber/slog-common v0.19.0 // indirect
126135
github.com/segmentio/asm v1.2.0 // indirect
127136
github.com/sethvargo/go-password v0.3.1 // indirect
137+
github.com/sirupsen/logrus v1.9.3 // indirect
128138
github.com/stmcginnis/gofish v0.20.0 // indirect
129139
github.com/u-root/uio v0.0.0-20240224005618-d2acac8f3701 // indirect
130140
github.com/ulikunitz/xz v0.5.15 // indirect
141+
github.com/vbatts/tar-split v0.12.1 // indirect
131142
github.com/vishvananda/netns v0.0.5 // indirect
132143
github.com/vmware/goipmi v0.0.0-20181114221114-2333cd82d702 // indirect
133144
github.com/yusufpapurcu/wmi v1.2.4 // indirect

go.sum

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF
3838
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
3939
github.com/cheggaaa/pb/v3 v3.1.7 h1:2FsIW307kt7A/rz/ZI2lvPO+v3wKazzE4K/0LtTWsOI=
4040
github.com/cheggaaa/pb/v3 v3.1.7/go.mod h1:/Ji89zfVPeC/u5j8ukD0MBPHt2bzTYp74lQ7KlgFWTQ=
41+
github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8=
42+
github.com/containerd/stargz-snapshotter/estargz v0.16.3/go.mod h1:uyr4BfYfOj3G9WBVE8cOlQmXAbPN9VEQpBBeJIuOipU=
4143
github.com/coreos/go-oidc/v3 v3.15.0 h1:R6Oz8Z4bqWR7VFQ+sPSvZPQv4x8M+sJkDO5ojgwlyAg=
4244
github.com/coreos/go-oidc/v3 v3.15.0/go.mod h1:HaZ3szPaZ0e4r6ebqvsLWlk2Tn+aejfmrfah6hnSYEU=
4345
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
@@ -51,6 +53,12 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvw
5153
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40=
5254
github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE=
5355
github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA=
56+
github.com/docker/cli v28.2.2+incompatible h1:qzx5BNUDFqlvyq4AHzdNB7gSyVTmU4cgsyN9SdInc1A=
57+
github.com/docker/cli v28.2.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
58+
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
59+
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
60+
github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8=
61+
github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo=
5462
github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q=
5563
github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo=
5664
github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
@@ -137,6 +145,8 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8
137145
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
138146
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
139147
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
148+
github.com/google/go-containerregistry v0.20.6 h1:cvWX87UxxLgaH76b4hIvya6Dzz9qHB31qAwjAohdSTU=
149+
github.com/google/go-containerregistry v0.20.6/go.mod h1:T0x8MuoAoKX/873bkeSfLD2FAkwCDf9/HZgsFJ02E2Y=
140150
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
141151
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
142152
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
@@ -232,6 +242,8 @@ github.com/metal-stack/v v1.0.3 h1:Sh2oBlnxrCUD+mVpzfC8HiqL045YWkxs0gpTvkjppqs=
232242
github.com/metal-stack/v v1.0.3/go.mod h1:YTahEu7/ishwpYKnp/VaW/7nf8+PInogkfGwLcGPdXg=
233243
github.com/mholt/archiver v2.1.0+incompatible h1:1ivm7KAHPtPere1YDOdrY6xGdbMNGRWThZbYh5lWZT0=
234244
github.com/mholt/archiver v2.1.0+incompatible/go.mod h1:Dh2dOXnSdiLxRiPoVfIr/fI1TwETms9B8CTWfeh7ROU=
245+
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
246+
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
235247
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
236248
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
237249
github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg=
@@ -251,6 +263,10 @@ github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
251263
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
252264
github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU=
253265
github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ=
266+
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
267+
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
268+
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
269+
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
254270
github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
255271
github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
256272
github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM=
@@ -297,12 +313,15 @@ github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
297313
github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
298314
github.com/sethvargo/go-password v0.3.1 h1:WqrLTjo7X6AcVYfC6R7GtSyuUQR9hGyAj/f1PYQZCJU=
299315
github.com/sethvargo/go-password v0.3.1/go.mod h1:rXofC1zT54N7R8K/h1WDUdkf9BOx5OptoxrMBcrXzvs=
316+
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
317+
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
300318
github.com/stmcginnis/gofish v0.20.0 h1:hH2V2Qe898F2wWT1loApnkDUrXXiLKqbSlMaH3Y1n08=
301319
github.com/stmcginnis/gofish v0.20.0/go.mod h1:PzF5i8ecRG9A2ol8XT64npKUunyraJ+7t0kYMpQAtqU=
302320
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
303321
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
304322
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
305323
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
324+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
306325
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
307326
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
308327
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
@@ -315,6 +334,8 @@ github.com/u-root/uio v0.0.0-20240224005618-d2acac8f3701/go.mod h1:P3a5rG4X7tI17
315334
github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
316335
github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY=
317336
github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
337+
github.com/vbatts/tar-split v0.12.1 h1:CqKoORW7BUWBe7UL/iqTVvkTBOF8UvOMKOIZykxnnbo=
338+
github.com/vbatts/tar-split v0.12.1/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA=
318339
github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW6bV0=
319340
github.com/vishvananda/netlink v1.3.1/go.mod h1:ARtKouGSTGchR8aMwmkzC0qiNPrrWO5JS/XMVl45+b4=
320341
github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY=
@@ -380,6 +401,7 @@ golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7w
380401
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
381402
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
382403
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
404+
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
383405
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
384406
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
385407
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

0 commit comments

Comments
 (0)