diff --git a/README.md b/README.md
index bb3e119..f74d166 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,6 @@ It allows using rootless containers, running GUIs, quickly mounting your current
Even though **dogi** was originally inspired by [rocker](https://github.com/osrf/rocker) and solves a similar problem (or the same), it aims to do so with minimum user effort. Additionally, it provides the ability to interact with the `docker` client directly ([transparent](#design-principles)).
-## Quickstart
```bash
# install binary
@@ -35,6 +34,22 @@ Some [optional setup steps](#optional-setup-steps) might be required.
**NOTE:** You can also install from source: `CGO_ENABLED=0 go install -a github.com/ntorresalberto/dogi@latest`
+### Requirements
+
+**dogi** relies on the docker engine CLI for its operations. Before using dogi, make sure:
+
+* You have installed [docker engine via the official guide](https://docs.docker.com/engine/install/ubuntu/). Docker installed through snap won't work, because **dogi** sometimes creates files and uses `/tmp`.
+* You have the correct permissions to call docker cli withotu sudo. This can be setup with the [post-installation steps](https://docs.docker.com/engine/install/linux-postinstall/).
+* In order to use docker (and **dogi**) with GPU support, you must first [follow the installation prerequisites instructions](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#prerequisites), and the [configuration instructions](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#configuration). Otherwise, the following bug will appears :
+
+```
+docker : Error response from daemon: unknown or invalid runtime name: nvidia
+```
+
+## Quickstart
+
+
+
---
- [Examples](#examples)
@@ -115,7 +130,7 @@ You should find **dogi** useful if you:
- **transparent**: **dogi** forwards any unrecognized arguments to docker, in case you ever need to do anything not currently supported.
- **simple**: aims to cover the most common use cases with the least user intervention (you shouldn't need to pass any extra flags/options most of the time). If you don't agree with the defaults, [please say so](https://github.com/ntorresalberto/dogi/issues/new).
-- **secure**: there are [many ways](http://wiki.ros.org/docker/Tutorials/GUI) to expose the xorg server to containers, **dogi** tries to do it in the most secure way. Additionally, it proposes an easy way to avoid the potentially dangerous practice of root containers.
+- **secure**: there are [many ways](http://wiki.ros.org/docker/Tutorials/GUI) to expose the xorg server to containers, **dogi** tries to do it in the most secure way. Additionally, it proposes an easy way to avoid the potentially dangerous practice of root containers.
- **minimalist**: **dogi** thrives to have the least amount of dependencies and not do more than it needs.
> Many (open source) hackers are proud if they achieve large amounts of code, because they believe the more lines of code they've written, the more progress they have made. The more progress they have made, the more skilled they are. This is simply a delusion.
@@ -124,7 +139,8 @@ You should find **dogi** useful if you:
### Limitations
-- Only supports ubuntu-based images (because of apt commands used)
+- Only supports debian-based images like ubuntu (because of apt commands used) and more recently fedora.
+
- Only supports X11 environments for GUI applications (because of xorg socket communication)
@@ -174,4 +190,3 @@ source .bashrc
This error is usually caused by a container running an older version of glibc than your host system (where you compiled `dogi`).
A possible cause of this is you didn't use `CGO_ENABLED=0` in the `go install`, as specified in #quickstart.
-
diff --git a/assets/apt-cacher/Dockerfile b/assets/apt-cacher/Dockerfile
index 5dddcc4..ce7f918 100644
--- a/assets/apt-cacher/Dockerfile
+++ b/assets/apt-cacher/Dockerfile
@@ -11,9 +11,19 @@
# add this to container:
# echo 'Acquire::http { Proxy "http://localhost:3142"; };' >> /etc/apt/apt.conf.d/01proxy
# echo 'Acquire::http { Proxy "http://172.17.0.2:3142"; };' >> /etc/apt/apt.conf.d/01proxy
-FROM ubuntu:22.04
+FROM ubuntu:22.04
VOLUME ["/var/cache/apt-cacher-ng"]
+
+# TODO left commented until we can confirm this is a workaround
+# ## Added : Try to clean everything (for bug : apt-get BADSIG GPG)
+# RUN apt-get clean && \
+# cd /var/lib/apt &&\
+# mv lists lists.old &&\
+# mkdir -p lists/partial && \
+# apt-get clean &&\
+# apt-get update -qq -y
+
RUN apt-get update && apt-get install -y apt-cacher-ng \
&& sed -i 's/\# PassThroughPattern: \.\*/PassThroughPattern: \.\*/g' /etc/apt-cacher-ng/acng.conf
diff --git a/cmd/root.go b/cmd/root.go
index 981203f..aebeb35 100644
--- a/cmd/root.go
+++ b/cmd/root.go
@@ -118,8 +118,12 @@ var (
noUSBPtr bool
noNethostPtr bool
noCacherPtr bool
+ noPIDIPCHostPtr bool
workDirPtr string
contNamePtr string
+ devAccPtr string
+ devRMWPtr string
+ tempDirPtr string
logger = log.New(os.Stdout, appname+": ", log.Lmsgprefix)
dockerRunArgs = []string{
"--interactive",
@@ -186,7 +190,7 @@ Examples:
func panicKey(key string, mapWithoutKey map[string]string) {
if _, ok := mapWithoutKey[key]; ok {
- panic(fmt.Errorf("%s should not exist in this dictionary\n", key))
+ panic(fmt.Errorf("%s should not exist in this dictionary", key))
}
}
diff --git a/cmd/run.go b/cmd/run.go
index 77a856d..017ec7b 100644
--- a/cmd/run.go
+++ b/cmd/run.go
@@ -222,6 +222,13 @@ func imageDistro(imageName string) string {
out, err := exec.Command("docker", "run", "--rm", "--tty",
"--entrypoint=cat",
imageName, "/etc/os-release").Output()
+ if err != nil {
+ logger.Println("Error: failed to verify image distro:")
+ logger.Printf("image: %s\n", imageName)
+ logger.Printf("error: %s\n", err.Error())
+ logger.Printf("Please share this log the %s devs at:\n", appname)
+ logger.Fatalf("https://github.com/ntorresalberto/dogi/issues/new")
+ }
check(err)
for _, val := range supportedDistros() {
@@ -248,10 +255,9 @@ func setAptCacher() string {
{
logger.Printf("build apt cacher image: %s\n", imgName)
// build apt-cache-ng image
- dir, err := os.MkdirTemp("", "dogi_apt-cache")
+ //dir, err := os.MkdirTemp("", "dogi_apt-cache")
+ dir, err := os.MkdirTemp(tempDirPtr, "dogi_apt-cache")
check(err)
- defer os.RemoveAll(dir) // clean up
-
tmpfn := filepath.Join(dir, "Dockerfile")
check(os.WriteFile(tmpfn, []byte(assets.AptCacheDockerfile), 0666))
logger.Printf("temp dir: %s\n", dir)
@@ -265,6 +271,8 @@ func setAptCacher() string {
fmt.Println(string(out))
panic(err)
}
+
+ check(os.RemoveAll(dir)) // clean up
}
// launch apt-cacher container
@@ -311,8 +319,9 @@ func setAptCacher() string {
}
// find out apt-cacher ip
+ // is it possible to have multiple IPs for this container?
out, err := exec.Command("docker", "container",
- "inspect", "-f", "{{ .NetworkSettings.IPAddress }}", contName).Output()
+ "inspect", "-f", "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}", contName).Output()
if err != nil {
logger.Printf("container %s not found, launching...", contName)
_, err = exec.Command("docker",
@@ -337,7 +346,7 @@ func setAptCacher() string {
aptCacherConf := fmt.Sprintf("Acquire::http { Proxy \"http://%s:3142\"; };", ip)
- aptCacherFile, err := os.CreateTemp("", fmt.Sprintf(".%s_%s_*", appname, baseName))
+ aptCacherFile, err := os.CreateTemp(tempDirPtr, fmt.Sprintf(".%s_%s_*", appname, baseName))
check(err)
logger.Printf("apt-cacher file: %s", aptCacherFile.Name())
check(os.WriteFile(aptCacherFile.Name(), []byte(aptCacherConf), 0666))
@@ -478,6 +487,11 @@ const runExamples = `
- Launch an 3D accelerated GUI (opengl)
{{.appname}} run ubuntu -- bash -c "sudo apt install -y mesa-utils && glxgears"
+
+ - Add access to a webcam (ex : /dev/video0) :
+
+ {{.appname}} run ubuntu --device-access "/dev/video0"
+
`
var (
@@ -529,8 +543,14 @@ Examples:
bashCmdPath, err := exec.LookPath("bash")
check(err)
+ // if tempdir is not provided, use OS default
+ if tempDirPtr == "" {
+ tempDirPtr = os.TempDir()
+ }
+
// create xauth magic cookie file
- xauthfile, err := os.CreateTemp("", fmt.Sprintf(".%s*.xauth", appname))
+ xauthfile, err := os.CreateTemp(tempDirPtr, fmt.Sprintf(".%s*.xauth", appname))
+
check(err)
logger.Println("temp xauth file:", xauthfile.Name())
addCopyToContainerFile(xauthfile.Name(), "/.xauth")
@@ -559,7 +579,7 @@ Examples:
logger.Printf("workdir: %s\n", workDirPtr)
mountStrs := []string{fmt.Sprintf("--volume=%s:%s", workDirPtr, workDirPtr)}
- cidFile := fmt.Sprintf("%s/.%s%v.cid", os.TempDir(), appname, rand.Int63())
+ cidFile := fmt.Sprintf("%s/.%s%v.cid", tempDirPtr, appname, rand.Int63())
mountStrs = append(mountStrs, fmt.Sprintf("--cidfile=%s", cidFile))
mountStrs = append(mountStrs, fmt.Sprintf("--volume=%s:%s", cidFile, cidFileContainer))
@@ -619,6 +639,13 @@ Examples:
dockerRunArgs = append(dockerRunArgs, "--network=host")
}
+ if !noPIDIPCHostPtr {
+ // useful for https://github.com/eProsima/Fast-DDS/issues/2956
+ logger.Println("add --pid=host --ipc=host, to disable use --no-pid-ipc-host")
+ dockerRunArgs = append(dockerRunArgs, "--pid=host")
+ dockerRunArgs = append(dockerRunArgs, "--ipc=host")
+ }
+
if privilegedPtr {
logger.Println("adding --privileged")
dockerRunArgs = append(dockerRunArgs, "--privileged")
@@ -708,6 +735,24 @@ Examples:
"--volume=/dev/bus/usb:/dev/bus/usb")
dockerRunArgs = append(dockerRunArgs,
"--device-cgroup-rule=c 189:* rmw")
+
+ // add commands to add rules to specific usb devices (as stated by https://stackoverflow.com/a/62758958)
+ if devRMWPtr != "" {
+ var indexes = strings.Split(devRMWPtr, ";")
+ for i := 0; i < len(indexes); i++ {
+ var s = "--device-cgroup-rule=c " + indexes[i] + ":* rmw"
+ dockerRunArgs = append(dockerRunArgs, s)
+ }
+ }
+ // add rules to mount specific usb devices
+ if devAccPtr != "" {
+ var indexes = strings.Split(devAccPtr, ";")
+ for i := 0; i < len(indexes); i++ {
+ var s = "--device=" + indexes[i]
+ dockerRunArgs = append(dockerRunArgs, s)
+ }
+ }
+
}
if !noUserPtr && userObj.Uid == "0" {
@@ -735,7 +780,9 @@ Examples:
// TODO: createUser file won't be removed because
// process is replaced at Exec, is there a way?
- createUserFile, err := os.CreateTemp("",
+ // createUserFile, err := os.CreateTemp("",
+ // fmt.Sprintf(".%s*.sh", appname))
+ createUserFile, err := os.CreateTemp(tempDirPtr,
fmt.Sprintf(".%s*.sh", appname))
check(err)
logger.Println("create user script:", createUserFile.Name())
@@ -813,4 +860,9 @@ func init() {
runCmd.Flags().BoolVar(&noRMPtr, "no-rm", false, "don't launch with --rm (container will exist after exiting)")
runCmd.Flags().BoolVar(&noUSBPtr, "no-usb", false, "don't mount usb devices")
runCmd.Flags().BoolVar(&noNethostPtr, "no-nethost", false, "don't launch with --network=host")
+ runCmd.Flags().StringVar(&devRMWPtr, "device-rmw", "", "add rmw rules to the following devices (as stated in https://stackoverflow.com/a/62758958). Format : ;")
+ runCmd.Flags().StringVar(&devAccPtr, "device-access", "", "mount the following devices to container (through --device option). Format : ;")
+ runCmd.Flags().StringVar(&tempDirPtr, "temp-dir", "", "temporary directory to use for dogi (default: $TMPDIR or /tmp, through empty command). Can be modified if there are access issues with this particular folder.")
+ runCmd.Flags().BoolVar(&noPIDIPCHostPtr, "no-pid-ipc-host", false, "don't launch with --pid=host --ipc=host.")
+
}
diff --git a/go.mod b/go.mod
index 2382e09..bb01965 100644
--- a/go.mod
+++ b/go.mod
@@ -1,20 +1,20 @@
module github.com/ntorresalberto/dogi
-go 1.17
+go 1.25.6
require (
- github.com/AlecAivazis/survey/v2 v2.3.6
- github.com/spf13/cobra v1.7.0
+ github.com/AlecAivazis/survey/v2 v2.3.7
+ github.com/spf13/cobra v1.10.2
)
require (
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
- github.com/mattn/go-colorable v0.1.13 // indirect
- github.com/mattn/go-isatty v0.0.19 // indirect
+ github.com/mattn/go-colorable v0.1.14 // indirect
+ github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
- github.com/spf13/pflag v1.0.5 // indirect
- golang.org/x/sys v0.8.0 // indirect
- golang.org/x/term v0.8.0 // indirect
- golang.org/x/text v0.9.0 // indirect
+ github.com/spf13/pflag v1.0.10 // indirect
+ golang.org/x/sys v0.40.0 // indirect
+ golang.org/x/term v0.39.0 // indirect
+ golang.org/x/text v0.33.0 // indirect
)
diff --git a/go.sum b/go.sum
index 9d53d87..abd4b9d 100644
--- a/go.sum
+++ b/go.sum
@@ -1,8 +1,8 @@
-github.com/AlecAivazis/survey/v2 v2.3.6 h1:NvTuVHISgTHEHeBFqt6BHOe4Ny/NwGZr7w+F8S9ziyw=
-github.com/AlecAivazis/survey/v2 v2.3.6/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI=
+github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ=
+github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo=
github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s=
github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w=
-github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI=
github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -15,67 +15,58 @@ github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
-github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
-github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
+github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
+github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
-github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-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/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
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/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I=
-github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0=
-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/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
+github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
+github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
+github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
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/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
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/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.8.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-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
-golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
+golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
-golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
-golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY=
+golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww=
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.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
-golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE=
+golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=
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.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
-gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=