diff --git a/.circleci/config.yml b/.circleci/config.yml index 97ccf32..064245c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,28 +1,15 @@ version: 2 -templates: - golang-template: &golang-template - docker: - - image: ghcr.io/hugelgupf/vmtest/ci-amd64:main - working_directory: /home/circleci/go/src/github.com/hugelgupf/p9 - environment: - - CGO_ENABLED: 0 - workflows: version: 2 build: jobs: - tidy - - build: - requires: - - tidy - - test: - requires: - - tidy jobs: tidy: - <<: *golang-template + docker: + - image: cimg/go:1.21.5 steps: - checkout - run: go env @@ -42,23 +29,3 @@ jobs: - run: name: gofmt command: test -z "$(gofmt -s -l $(find -name '*.go'))" - - test: - <<: *golang-template - steps: - - checkout - - run: go env - - run: go test -timeout 15m -v ./... - - run: CGO_ENABLED=1 go test -race -timeout 15m -v ./... - - build: - <<: *golang-template - steps: - - checkout - - run: go env - - run: | - go install github.com/mitchellh/gox@latest - - # Exclude darwin/arm(64?). - gox -osarch="darwin/amd64" ./... - gox -parallel=2 -os="windows linux freebsd netbsd openbsd solaris" -arch="386 amd64 arm arm64 ppc64 ppc64le s390x mips mipsle mips64 mips64le" ./... diff --git a/.github/workflows/p9.yml b/.github/workflows/p9.yml index 772e108..f6a71fc 100644 --- a/.github/workflows/p9.yml +++ b/.github/workflows/p9.yml @@ -6,51 +6,157 @@ on: pull_request: branches: [ main ] -jobs: +# Cancel running workflows on new push to a PR. +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: build: name: Build strategy: matrix: + goos: ['linux', 'windows', 'openbsd', 'freebsd', 'netbsd'] + goarch: ['386', 'amd64', 'arm', 'arm64'] + include: + - goos: 'darwin' + goarch: 'arm64' + - goos: 'solaris' + goarch: 'amd64' + - goos: 'linux' + goarch: 'mips' + - goos: 'linux' + goarch: 'mips64' + - goos: 'linux' + goarch: 'mipsle' + - goos: 'linux' + goarch: 'mips64le' + - goos: 'linux' + goarch: 'ppc64' + - goos: 'linux' + goarch: 'ppc64le' + - goos: 'linux' + goarch: 'riscv64' + exclude: + - goos: 'netbsd' + goarch: 'arm64' + + runs-on: ubuntu-latest + env: + GOOS: ${{ matrix.goos }} + GOARCH: ${{ matrix.goarch }} + steps: + - uses: actions/checkout@v4 + - name: Setup Go + uses: actions/setup-go@v4 + with: + go-version: '1.21.x' + - name: Build + run: go build -v ./... + + test: + name: Unit test + strategy: + matrix: + go-version: ['1.21.x'] platform: [ubuntu-latest, macos-latest, windows-latest] - runs-on: ${{ matrix.platform }} + runs-on: ${{ matrix.platform }} steps: - - name: Set up Go 1.x - uses: actions/setup-go@v2 - with: - go-version: ^1.18 - id: go - - - name: Check out code into the Go module directory - uses: actions/checkout@v3 - - - name: Build - run: go build -v ./... - - - name: Test - run: go test -v ./... + - uses: actions/checkout@v4 + - name: Setup Go ${{ matrix.go-version }} + uses: actions/setup-go@v4 + with: + go-version: ${{ matrix.go-version }} + + - name: Build + run: go build -v ./... + + - name: Test + run: go test -v -covermode atomic -coverpkg ./... -coverprofile cover.out ./... + + - name: Archive coverage artifacts + uses: actions/upload-artifact@v3 + with: + name: coverage + path: cover.out + + - name: Race + run: go test -race -timeout 15m -v ./... + + - uses: codecov/codecov-action@v4-beta + env: + CODECOV_TOKEN: '19f1ec66-d755-4010-bc76-0c8091d231c3' + with: + flags: ${{ matrix.platform }}-unit + fail_ci_if_error: true + verbose: true + fuzz: name: Fuzz runs-on: [ubuntu-latest] - needs: [build] steps: - - name: Build Fuzzers - id: build - uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master - with: - oss-fuzz-project-name: 'p9' - dry-run: false - - - name: Run Fuzzers - uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master - with: - oss-fuzz-project-name: 'p9' - fuzz-seconds: 600 - dry-run: false - - - name: Upload Crash - uses: actions/upload-artifact@v1 - if: failure() && steps.build.outcome == 'success' - with: - name: artifacts - path: ./out/artifacts + - name: Build Fuzzers + id: build + uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master + with: + oss-fuzz-project-name: 'p9' + dry-run: false + + - name: Run Fuzzers + uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master + with: + oss-fuzz-project-name: 'p9' + fuzz-seconds: 600 + dry-run: false + + - name: Upload Crash + uses: actions/upload-artifact@v1 + if: failure() && steps.build.outcome == 'success' + with: + name: artifacts + path: ./out/artifacts + + vmtest: + name: VM tests + runs-on: ubuntu-latest + strategy: + matrix: + go-version: [ '1.21.x' ] + vmarch: [ 'amd64', 'arm', 'arm64' ] + include: + # QEMU's -M virt only supports GOARM=5, so add goarm=5 only for + # arm configs + - vmarch: arm + goarm: '5' + + env: + GO_VERSION: ${{ matrix.go-version }} + VMTEST_ARCH: ${{ matrix.vmarch }} + GOARM: ${{ matrix.goarm }} + + steps: + - uses: actions/checkout@v4 + - name: Setup Go ${{ matrix.go-version }} + uses: actions/setup-go@v4 + with: + go-version: ${{ matrix.go-version }} + + - name: Build runvm tool + run: go install github.com/hugelgupf/vmtest/tools/runvmtest@latest + + - name: Test + run: | + mkdir gocov + GOCOVERDIR=$(pwd)/gocov \ + VMTEST_GO_PROFILE=vmcoverage.txt runvmtest -- \ + go test -v -coverpkg=./... -covermode=atomic \ + -coverprofile=coverage.txt ./... + + - uses: codecov/codecov-action@v4-beta + env: + CODECOV_TOKEN: '19f1ec66-d755-4010-bc76-0c8091d231c3' + with: + flags: ubuntu-vm-${{ matrix.vmarch }} + fail_ci_if_error: true + verbose: true + env_vars: GO_VERSION,VMTEST_ARCH diff --git a/fsimpl/composefs/composefs_integration_test.go b/fsimpl/composefs/composefs_integration_test.go index 3417776..27aef69 100644 --- a/fsimpl/composefs/composefs_integration_test.go +++ b/fsimpl/composefs/composefs_integration_test.go @@ -72,25 +72,27 @@ func TestLinuxClient(t *testing.T) { // Run the read tests from fsimpl/test/rovmtests. vmtest.RunGoTestsInVM(t, []string{"github.com/hugelgupf/p9/fsimpl/test/rovmtests"}, - vmtest.WithMergedInitramfs(uroot.Opts{ - Commands: uroot.BusyBoxCmds( - "github.com/u-root/u-root/cmds/core/dhclient", - ), - ExtraFiles: []string{ - fmt.Sprintf("%s:etc/want.json", filepath.Join(dir, "want.json")), - }, - }), - vmtest.WithQEMUFn( - qemu.WithAppendKernel(fmt.Sprintf("P9_PORT=%d P9_TARGET=192.168.0.2", serverPort)), - // 192.168.0.0/24 - vmdriver.HostNetwork(&net.IPNet{ - IP: net.IP{192, 168, 0, 0}, - Mask: net.CIDRMask(24, 32), - }), - qemu.WithVMTimeout(30*time.Second), - qemu.WithTask(func(ctx context.Context, n *qemu.Notifications) error { - return s.ServeContext(ctx, serverSocket) + vmtest.WithVMOpt( + vmtest.WithMergedInitramfs(uroot.Opts{ + Commands: uroot.BusyBoxCmds( + "github.com/u-root/u-root/cmds/core/dhclient", + ), + ExtraFiles: []string{ + fmt.Sprintf("%s:etc/want.json", filepath.Join(dir, "want.json")), + }, }), + vmtest.WithQEMUFn( + qemu.WithAppendKernel(fmt.Sprintf("P9_PORT=%d P9_TARGET=192.168.0.2", serverPort)), + // 192.168.0.0/24 + vmdriver.HostNetwork(&net.IPNet{ + IP: net.IP{192, 168, 0, 0}, + Mask: net.CIDRMask(24, 32), + }), + qemu.WithVMTimeout(30*time.Second), + qemu.WithTask(func(ctx context.Context, n *qemu.Notifications) error { + return s.ServeContext(ctx, serverSocket) + }), + ), ), ) } diff --git a/fsimpl/localfs/localfs_integration_test.go b/fsimpl/localfs/localfs_integration_test.go index 80db613..49d87b2 100644 --- a/fsimpl/localfs/localfs_integration_test.go +++ b/fsimpl/localfs/localfs_integration_test.go @@ -9,6 +9,8 @@ import ( "io/ioutil" "net" "os" + "os/exec" + "runtime" "testing" "time" @@ -31,33 +33,43 @@ func TestIntegration(t *testing.T) { tempDir := t.TempDir() s := p9.NewServer(Attacher(tempDir), p9.WithServerLogger(ulogtest.Logger{TB: t})) + dd, err := exec.LookPath("dd") + if err != nil { + t.Errorf("Cannot run test without dd binary") + } + // Run the read-write tests from fsimpl/test/rwvm. vmtest.RunGoTestsInVM(t, []string{"github.com/hugelgupf/p9/fsimpl/test/rwvmtests"}, - vmtest.WithMergedInitramfs(uroot.Opts{ - Commands: uroot.BusyBoxCmds( - "github.com/u-root/u-root/cmds/core/ls", - "github.com/u-root/u-root/cmds/core/dhclient", - ), - ExtraFiles: []string{ - "/usr/bin/dd:bin/dd", - }, - }), - vmtest.WithQEMUFn( - qemu.WithAppendKernel(fmt.Sprintf("P9_PORT=%d P9_TARGET=192.168.0.2", serverPort)), - // 192.168.0.0/24 - vmdriver.HostNetwork(&net.IPNet{ - IP: net.IP{192, 168, 0, 0}, - Mask: net.CIDRMask(24, 32), - }), - qemu.WithVMTimeout(30*time.Second), - qemu.WithTask(func(ctx context.Context, n *qemu.Notifications) error { - return s.ServeContext(ctx, serverSocket) + vmtest.WithVMOpt( + vmtest.WithMergedInitramfs(uroot.Opts{ + Commands: uroot.BusyBoxCmds( + "github.com/u-root/u-root/cmds/core/ls", + "github.com/u-root/u-root/cmds/core/dhclient", + ), + ExtraFiles: []string{ + dd + ":bin/dd", + }, }), + vmtest.WithQEMUFn( + qemu.WithAppendKernel(fmt.Sprintf("P9_PORT=%d P9_TARGET=192.168.0.2", serverPort)), + // 192.168.0.0/24 + vmdriver.HostNetwork(&net.IPNet{ + IP: net.IP{192, 168, 0, 0}, + Mask: net.CIDRMask(24, 32), + }), + qemu.WithVMTimeout(30*time.Second), + qemu.WithTask(func(ctx context.Context, n *qemu.Notifications) error { + return s.ServeContext(ctx, serverSocket) + }), + ), ), ) } func TestBenchmark(t *testing.T) { + // Uses host's dd binary. + vmtest.SkipIfNotArch(t, qemu.Arch(runtime.GOARCH)) + // Needs to definitely be in a tmpfs for performance testing. tempDir, err := ioutil.TempDir("/dev/shm", "localfs-") if err != nil { @@ -76,26 +88,28 @@ func TestBenchmark(t *testing.T) { // Run the read-write tests from fsimpl/test/rwvm. vmtest.RunGoTestsInVM(t, []string{"github.com/hugelgupf/p9/fsimpl/test/benchmark"}, - vmtest.WithMergedInitramfs(uroot.Opts{ - Commands: uroot.BusyBoxCmds( - "github.com/u-root/u-root/cmds/core/ls", - "github.com/u-root/u-root/cmds/core/dhclient", - ), - ExtraFiles: []string{ - "/usr/bin/dd:bin/dd", - }, - }), - vmtest.WithQEMUFn( - qemu.WithAppendKernel(fmt.Sprintf("P9_PORT=%d P9_TARGET=192.168.0.2", serverPort)), - // 192.168.0.0/24 - vmdriver.HostNetwork(&net.IPNet{ - IP: net.IP{192, 168, 0, 0}, - Mask: net.CIDRMask(24, 32), - }), - qemu.WithVMTimeout(30*time.Second), - qemu.WithTask(func(ctx context.Context, n *qemu.Notifications) error { - return s.ServeContext(ctx, serverSocket) + vmtest.WithVMOpt( + vmtest.WithMergedInitramfs(uroot.Opts{ + Commands: uroot.BusyBoxCmds( + "github.com/u-root/u-root/cmds/core/ls", + "github.com/u-root/u-root/cmds/core/dhclient", + ), + ExtraFiles: []string{ + "/usr/bin/dd:bin/dd", + }, }), + vmtest.WithQEMUFn( + qemu.WithAppendKernel(fmt.Sprintf("P9_PORT=%d P9_TARGET=192.168.0.2", serverPort)), + // 192.168.0.0/24 + vmdriver.HostNetwork(&net.IPNet{ + IP: net.IP{192, 168, 0, 0}, + Mask: net.CIDRMask(24, 32), + }), + qemu.WithVMTimeout(30*time.Second), + qemu.WithTask(func(ctx context.Context, n *qemu.Notifications) error { + return s.ServeContext(ctx, serverSocket) + }), + ), ), ) } diff --git a/fsimpl/staticfs/staticfs_integration_test.go b/fsimpl/staticfs/staticfs_integration_test.go index 9dfb344..7340b3d 100644 --- a/fsimpl/staticfs/staticfs_integration_test.go +++ b/fsimpl/staticfs/staticfs_integration_test.go @@ -76,25 +76,27 @@ func TestLinuxClient(t *testing.T) { // Run the read tests from fsimpl/test/rovmtests. vmtest.RunGoTestsInVM(t, []string{"github.com/hugelgupf/p9/fsimpl/test/rovmtests"}, - vmtest.WithMergedInitramfs(uroot.Opts{ - Commands: uroot.BusyBoxCmds( - "github.com/u-root/u-root/cmds/core/dhclient", - ), - ExtraFiles: []string{ - fmt.Sprintf("%s:etc/want.json", filepath.Join(dir, "want.json")), - }, - }), - vmtest.WithQEMUFn( - qemu.WithAppendKernel(fmt.Sprintf("P9_PORT=%d P9_TARGET=192.168.0.2", serverPort)), - // 192.168.0.0/24 - vmdriver.HostNetwork(&net.IPNet{ - IP: net.IP{192, 168, 0, 0}, - Mask: net.CIDRMask(24, 32), - }), - qemu.WithVMTimeout(30*time.Second), - qemu.WithTask(func(ctx context.Context, n *qemu.Notifications) error { - return s.ServeContext(ctx, serverSocket) + vmtest.WithVMOpt( + vmtest.WithMergedInitramfs(uroot.Opts{ + Commands: uroot.BusyBoxCmds( + "github.com/u-root/u-root/cmds/core/dhclient", + ), + ExtraFiles: []string{ + fmt.Sprintf("%s:etc/want.json", filepath.Join(dir, "want.json")), + }, }), + vmtest.WithQEMUFn( + qemu.WithAppendKernel(fmt.Sprintf("P9_PORT=%d P9_TARGET=192.168.0.2", serverPort)), + // 192.168.0.0/24 + vmdriver.HostNetwork(&net.IPNet{ + IP: net.IP{192, 168, 0, 0}, + Mask: net.CIDRMask(24, 32), + }), + qemu.WithVMTimeout(30*time.Second), + qemu.WithTask(func(ctx context.Context, n *qemu.Notifications) error { + return s.ServeContext(ctx, serverSocket) + }), + ), ), ) } diff --git a/fsimpl/test/rwvmtests/rw_linux_test.go b/fsimpl/test/rwvmtests/rw_linux_test.go index c3703f2..4765c25 100644 --- a/fsimpl/test/rwvmtests/rw_linux_test.go +++ b/fsimpl/test/rwvmtests/rw_linux_test.go @@ -19,9 +19,9 @@ import ( "github.com/hugelgupf/p9/fsimpl/localfs" "github.com/hugelgupf/p9/fsimpl/xattr" "github.com/hugelgupf/p9/p9" + "github.com/hugelgupf/vmtest/guest" "github.com/u-root/u-root/pkg/mount" "github.com/u-root/u-root/pkg/sh" - "github.com/u-root/u-root/pkg/testutil" "github.com/u-root/uio/ulog/ulogtest" "golang.org/x/sys/unix" ) @@ -37,7 +37,7 @@ func TestMain(m *testing.M) { } func TestMountHostDirectory(t *testing.T) { - testutil.SkipIfNotRoot(t) + guest.SkipIfNotInVM(t) targetDir := "/target" if err := os.MkdirAll(targetDir, 0755); err != nil { @@ -197,7 +197,7 @@ func TestMountHostDirectory(t *testing.T) { } func TestGuestServer(t *testing.T) { - testutil.SkipIfNotRoot(t) + guest.SkipIfNotInVM(t) tmp := t.TempDir() mp, err := mount.Mount("", tmp, "tmpfs", "", 0) diff --git a/go.mod b/go.mod index bced852..7f760ec 100644 --- a/go.mod +++ b/go.mod @@ -1,40 +1,41 @@ module github.com/hugelgupf/p9 -go 1.20 +go 1.21 + +toolchain go1.21.0 require ( github.com/hugelgupf/socketpair v0.0.0-20230822150718-707395b1939a - github.com/hugelgupf/vmtest v0.0.0-20231218014634-279c76daf0d0 - github.com/u-root/u-root v0.11.1-0.20230807200058-f87ad7ccb594 + github.com/hugelgupf/vmtest v0.0.0-20240115033909-46506b2af5ea + github.com/u-root/u-root v0.12.1-0.20240114161452-ab3534910ced github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 - golang.org/x/exp v0.0.0-20230810033253-352e893a4cad - golang.org/x/sys v0.13.0 + golang.org/x/exp v0.0.0-20231219180239-dc181d75b848 + golang.org/x/sys v0.15.0 ) require ( github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 // indirect - github.com/creack/pty v1.1.18 // indirect + github.com/creack/pty v1.1.21 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/google/goterm v0.0.0-20200907032337-555d40f16ae2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/insomniacslk/dhcp v0.0.0-20230731140434-0f9eb93a696c // indirect + github.com/insomniacslk/dhcp v0.0.0-20231206064809-8c70d406f6d2 // indirect github.com/josharian/native v1.1.0 // indirect - github.com/klauspost/compress v1.16.7 // indirect + github.com/klauspost/compress v1.17.4 // indirect github.com/klauspost/pgzip v1.2.6 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mdlayher/packet v1.1.2 // indirect - github.com/mdlayher/socket v0.4.1 // indirect + github.com/mdlayher/socket v0.5.0 // indirect github.com/pierrec/lz4/v4 v4.1.18 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/u-root/gobusybox/src v0.0.0-20230806212452-e9366a5b9fdc // indirect + github.com/u-root/gobusybox/src v0.0.0-20231228173702-b69f654846aa // indirect github.com/ulikunitz/xz v0.5.11 // indirect github.com/vishvananda/netlink v1.2.1-beta.2 // indirect github.com/vishvananda/netns v0.0.4 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/tools v0.12.0 // indirect - google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/sync v0.5.0 // indirect + golang.org/x/tools v0.16.1 // indirect src.elv.sh v0.16.0-rc1.0.20220116211855-fda62502ad7f // indirect ) diff --git a/go.sum b/go.sum index 47047f5..a359682 100644 --- a/go.sum +++ b/go.sum @@ -2,15 +2,15 @@ github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63n github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/creack/pty v1.1.15/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= -github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= +github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/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/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/goexpect v0.0.0-20210430020637-ab937bf7fd6f h1:7MmqygqdeJtziBUpm4Z9ThROFZUaVGaePMfcDnluf1E= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/goterm v0.0.0-20200907032337-555d40f16ae2 h1:CVuJwN34x4xM2aT4sIKhmeib40NeBPhRihNjQmpJsA4= github.com/google/goterm v0.0.0-20200907032337-555d40f16ae2/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -20,41 +20,42 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hugelgupf/socketpair v0.0.0-20230822150718-707395b1939a h1:Nq7wDsqsVBUBfGn8yB1M028ShWTKTtZBcafaTJ35N0s= github.com/hugelgupf/socketpair v0.0.0-20230822150718-707395b1939a/go.mod h1:71Bqb5Fh9zPHF8jwdmMEmJObzr25Mx5pWLbDBMMEn6E= -github.com/hugelgupf/vmtest v0.0.0-20231218014634-279c76daf0d0 h1:HE5g3tZ3zVn95eJ5aU04TifYouujrAZwCDK2aY1aJPk= -github.com/hugelgupf/vmtest v0.0.0-20231218014634-279c76daf0d0/go.mod h1:d2FMzS0rIF+3Daufcw660EZfTJihdNPeEwBBJgO4Ap0= -github.com/insomniacslk/dhcp v0.0.0-20230731140434-0f9eb93a696c h1:P/3mFnHCv1A/ej4m8pF5EB6FUt9qEL2Q9lfrcUNwCYs= -github.com/insomniacslk/dhcp v0.0.0-20230731140434-0f9eb93a696c/go.mod h1:7474bZ1YNCvarT6WFKie4kEET6J0KYRDC4XJqqXzQW4= +github.com/hugelgupf/vmtest v0.0.0-20240115033909-46506b2af5ea h1:rSO4GiZ/EThUOkl1kFLB+DOGxa3oEgT8d8ZhrYbDIW8= +github.com/hugelgupf/vmtest v0.0.0-20240115033909-46506b2af5ea/go.mod h1:3YxP4j/kQh5BzoobzCeSIVZOlz4te/CGVRxS9/NrwGU= +github.com/insomniacslk/dhcp v0.0.0-20231206064809-8c70d406f6d2 h1:9K06NfxkBh25x56yVhWWlKFE8YpicaSfHwoV8SFbueA= +github.com/insomniacslk/dhcp v0.0.0-20231206064809-8c70d406f6d2/go.mod h1:3A9PQ1cunSDF/1rbTq99Ts4pVnycWg+vlPkfeD2NLFI= github.com/josharian/native v1.0.1-0.20221213033349-c1e37c09b531/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA= github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mdlayher/packet v1.1.2 h1:3Up1NG6LZrsgDVn6X4L9Ge/iyRyxFEFD9o6Pr3Q1nQY= github.com/mdlayher/packet v1.1.2/go.mod h1:GEu1+n9sG5VtiRE4SydOmX5GTwyyYlteZiFU+x0kew4= -github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U= -github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= +github.com/mdlayher/socket v0.5.0 h1:ilICZmJcQz70vrWVes1MFera4jGiWNocSkykwwoy3XI= +github.com/mdlayher/socket v0.5.0/go.mod h1:WkcBFfvyG8QENs5+hfQPl1X6Jpd2yeLIYgrGFmJiJxI= github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= 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/rekby/gpt v0.0.0-20200219180433-a930afbc6edc h1:goZGTwEEn8mWLcY012VouWZWkJ8GrXm9tS3VORMxT90= +github.com/rekby/gpt v0.0.0-20200219180433-a930afbc6edc/go.mod h1:scrOqOnnHVKCHENvFw8k9ajCb88uqLQDA4BvuJNJ2ew= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/u-root/gobusybox/src v0.0.0-20230806212452-e9366a5b9fdc h1:udgfN9Qy573qgHWMEORFgy6YXNDiN/Fd5LlKdlp+/Mo= -github.com/u-root/gobusybox/src v0.0.0-20230806212452-e9366a5b9fdc/go.mod h1:lYt+LVfZBBwDZ3+PHk4k/c/TnKOkjJXiJO73E32Mmpc= -github.com/u-root/u-root v0.11.1-0.20230807200058-f87ad7ccb594 h1:1AIJqOtdEufYfGb3eRpdaqWONzBOpAwrg1fehbWg+Mg= -github.com/u-root/u-root v0.11.1-0.20230807200058-f87ad7ccb594/go.mod h1:PQzg9XJGp6Y1hRmTUruSO7lR7kKR6FpoSObf5n5bTfE= -github.com/u-root/uio v0.0.0-20210528151154-e40b768296a7/go.mod h1:LpEX5FO/cB+WF4TYGY1V5qktpaZLkKkSegbr0V4eYXA= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/u-root/gobusybox/src v0.0.0-20231228173702-b69f654846aa h1:unMPGGK/CRzfg923allsikmvk2l7beBeFPUNC4RVX/8= +github.com/u-root/gobusybox/src v0.0.0-20231228173702-b69f654846aa/go.mod h1:Zj4Tt22fJVn/nz/y6Ergm1SahR9dio1Zm/D2/S0TmXM= +github.com/u-root/u-root v0.12.1-0.20240114161452-ab3534910ced h1:G0F7Hmwph1OjozbAUBLKJ94CmY1OlH1cGMydXgB24j0= +github.com/u-root/u-root v0.12.1-0.20240114161452-ab3534910ced/go.mod h1:jtkuv6BVn5jo/WAHgQ1k9XfzHEe1hZmq9yDUvbgL+Iw= github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 h1:YcojQL98T/OO+rybuzn2+5KrD5dBwXIvYBvQ2cD3Avg= github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= @@ -64,60 +65,30 @@ github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhg github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8= github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad h1:g0bG7Z4uG+OgH2QDODnjp6ggkk1bJDsINcuWmJN1iJU= -golang.org/x/exp v0.0.0-20230810033253-352e893a4cad/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/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.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/exp v0.0.0-20231219180239-dc181d75b848 h1:+iq7lrkxmFNBM7xx+Rae2W6uyPfhPeDWD+n+JgppptE= +golang.org/x/exp v0.0.0-20231219180239-dc181d75b848/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +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/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/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-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.11-0.20220322213029-87a8611856c1/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= -golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= -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-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= src.elv.sh v0.16.0-rc1.0.20220116211855-fda62502ad7f h1:pjVeIo9Ba6K1Wy+rlwX91zT7A+xGEmxiNRBdN04gDTQ= src.elv.sh v0.16.0-rc1.0.20220116211855-fda62502ad7f/go.mod h1:kPbhv5+fBeUh85nET3wWhHGUaUQ64nZMJ8FwA5v5Olg=