Skip to content

Commit

Permalink
Merge pull request #292 from 030/270-logging-7
Browse files Browse the repository at this point in the history
fix(logging): [#270] Optional write to syslog and/or file and default…
  • Loading branch information
030 authored Dec 17, 2022
2 parents c7b77a9 + f1ec137 commit 474e6ef
Show file tree
Hide file tree
Showing 9 changed files with 69 additions and 144 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
*.log

cmd/n3dr/n3dr
cmd/n3dr/n3dr.sha512.txt

dip
3 changes: 3 additions & 0 deletions cmd/n3dr/repositoriesV2.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ Examples:
# Backup all artifacts:
n3dr repositoriesV2 --backup --directory-prefix /tmp/some-dir
# Backup all artifacts, set log level to trace and write it to a file and syslog:
n3dr repositoriesV2 --backup --directory-prefix /tmp/some-dir --logFile some-file.log --logLevel trace --syslog
# Backup all artifacts that reside in a Nexus3 server in a certain dir and store these in a zip file:
n3dr repositoriesV2 --backup --directory-prefix /tmp/some-dir --directory-prefix-zip /tmp/some-dir/some-zip --zip
Expand Down
142 changes: 40 additions & 102 deletions cmd/n3dr/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,15 @@ import (
"crypto/x509"
_ "embed"
"fmt"
"io"
"net/http"
"os"
"path/filepath"
"runtime"

"github.com/030/logging/pkg/logging"
cli "github.com/030/n3dr/internal/app/n3dr/artifactsv2"
homedir "github.com/mitchellh/go-homedir"
log "github.com/sirupsen/logrus"
"github.com/sirupsen/logrus/hooks/writer"
"github.com/spf13/cobra"
jww "github.com/spf13/jwalterweatherman"
"github.com/spf13/viper"
)

Expand All @@ -26,9 +23,9 @@ var logo string
var regex string

var (
apiVersion, awsBucket, awsId, awsRegion, awsSecret, basePathPrefix, cfgFile, n3drRepo, n3drURL, n3drPass, n3drUser, Version, zipName, downloadDirName, downloadDirNameZip, dockerHost, logLevel string
anonymous, awsS3, debug, dockerPortSecure, logFile, https, insecureSkipVerify, showLogo, skipErrors, zip bool
dockerPort int32
apiVersion, awsBucket, awsId, awsRegion, awsSecret, basePathPrefix, cfgFile, dockerHost, downloadDirName, downloadDirNameZip, logFile, logLevel, n3drPass, n3drRepo, n3drURL, n3drUser, Version, zipName string
anonymous, awsS3, dockerPortSecure, https, insecureSkipVerify, showLogo, skipErrors, syslog, zip bool
dockerPort int32
)

var rootCmd = &cobra.Command{
Expand All @@ -37,6 +34,27 @@ var rootCmd = &cobra.Command{
Long: `N3DR is a tool that is capable of backing up all artifacts from a certain
Nexus3 repository and restoring them.`,
Version: Version,
PersistentPreRun: func(cmd *cobra.Command, args []string) {
if logFile == "" {
logFile = viper.GetString("logFile")
}

if logLevel == "info" {
value := viper.GetString("logLevel")
if value != "" {
logLevel = value
}
}

if !syslog {
syslog = viper.GetBool("syslog")
}

l := logging.Logging{File: logFile, Level: logLevel, Syslog: syslog}
if _, err := l.Setup(); err != nil {
log.Fatal(err)
}
},
}

func execute() {
Expand All @@ -49,29 +67,28 @@ func execute() {
func init() {
cobra.OnInitialize(initConfig)

rootCmd.PersistentFlags().BoolVar(&anonymous, "anonymous", false, "Skip authentication")
rootCmd.PersistentFlags().StringVarP(&apiVersion, "apiVersion", "v", "v1", "nexus3 APIVersion, e.g. v1 or beta")
rootCmd.PersistentFlags().BoolVarP(&awsS3, "awsS3", "", false, "whether the backup zip should be uploaded to AWS S3")
rootCmd.PersistentFlags().StringVarP(&basePathPrefix, "basePathPrefix", "", "", "the nexus basePathPrefix. Default: \"\"")
rootCmd.PersistentFlags().StringVar(&dockerHost, "dockerHost", "", "The docker host, e.g. localhost")
rootCmd.PersistentFlags().Int32Var(&dockerPort, "dockerPort", 0, "The docker connector port, e.g. 8082")
rootCmd.PersistentFlags().BoolVar(&dockerPortSecure, "dockerPortSecure", false, "Whether the docker connector port should be secure")
rootCmd.PersistentFlags().StringVar(&downloadDirName, "directory-prefix", "", "directory to store downloaded artifacts")
rootCmd.PersistentFlags().StringVar(&downloadDirNameZip, "directory-prefix-zip", "", "directory to store the zipped artifacts")
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/"+cli.DefaultCfgFileWithExt+")")
rootCmd.PersistentFlags().BoolVarP(&debug, "debug", "d", false, "enable debug logging")
rootCmd.PersistentFlags().BoolVarP(&zip, "zip", "z", false, "add downloaded artifacts to a ZIP archive")
rootCmd.PersistentFlags().StringVarP(&zipName, "zipName", "i", "", "the name of the zip file")
rootCmd.PersistentFlags().BoolVarP(&https, "https", "", true, "https true or false")
rootCmd.PersistentFlags().BoolVar(&insecureSkipVerify, "insecureSkipVerify", false, "Skip repository certificate check")
rootCmd.PersistentFlags().StringVar(&logFile, "logFile", "", "define the path to the logFile")
rootCmd.PersistentFlags().StringVar(&logLevel, "logLevel", "info", "change the log level (default: info, options: trace, debug, info, warn, error or none)")
rootCmd.PersistentFlags().StringVarP(&n3drPass, "n3drPass", "p", "", "nexus3 password")
rootCmd.PersistentFlags().StringVarP(&n3drURL, "n3drURL", "n", "", "nexus3 URL")
rootCmd.PersistentFlags().StringVarP(&n3drUser, "n3drUser", "u", "", "nexus3 user")
rootCmd.PersistentFlags().StringVar(&downloadDirName, "directory-prefix", "", "directory to store downloaded artifacts")
rootCmd.PersistentFlags().StringVar(&downloadDirNameZip, "directory-prefix-zip", "", "directory to store the zipped artifacts")
rootCmd.PersistentFlags().StringVarP(&apiVersion, "apiVersion", "v", "v1", "nexus3 APIVersion, e.g. v1 or beta")
rootCmd.PersistentFlags().BoolVar(&anonymous, "anonymous", false, "Skip authentication")
rootCmd.PersistentFlags().BoolVarP(&skipErrors, "skipErrors", "s", false, "Skip errors")
rootCmd.PersistentFlags().BoolVarP(&https, "https", "", true, "https true or false")
rootCmd.PersistentFlags().StringVarP(&basePathPrefix, "basePathPrefix", "", "", "the nexus basePathPrefix. Default: \"\"")
rootCmd.PersistentFlags().BoolVarP(&showLogo, "showLogo", "", true, "show N3DR logo or not. Default: true")
rootCmd.PersistentFlags().StringVar(&dockerHost, "dockerHost", "", "The docker host, e.g. localhost")
rootCmd.PersistentFlags().Int32Var(&dockerPort, "dockerPort", 0, "The docker connector port, e.g. 8082")
rootCmd.PersistentFlags().BoolVar(&dockerPortSecure, "dockerPortSecure", false, "Whether the docker connector port should be secure")
rootCmd.PersistentFlags().StringVar(&logLevel, "logLevel", "", "change the log level")
rootCmd.PersistentFlags().BoolVar(&logFile, "logFile", false, "write the log to syslog")
rootCmd.PersistentFlags().StringVarP(&regex, "regex", "x", ".*", "only download artifacts that match a regular expression, e.g. 'some/group42'")
rootCmd.PersistentFlags().BoolVarP(&skipErrors, "skipErrors", "s", false, "Skip errors")
rootCmd.PersistentFlags().BoolVar(&syslog, "syslog", false, "whether the logs should be written to syslog")
rootCmd.PersistentFlags().BoolVarP(&zip, "zip", "z", false, "add downloaded artifacts to a ZIP archive")
rootCmd.PersistentFlags().StringVarP(&zipName, "zipName", "i", "", "the name of the zip file")
}

func n3drHiddenHome() (string, error) {
Expand Down Expand Up @@ -120,11 +137,6 @@ func ascii() {
}

func initConfig() {
if err := logging(); err != nil {
log.Fatal(err)
}
enableDebug()

cf, err := configFilePath()
if err != nil {
log.Fatal(err)
Expand Down Expand Up @@ -231,77 +243,3 @@ func insecureCerts() error {
}
return nil
}

func logging() (err error) {
if logLevel == "" {
logLevel, err = valueInConfigFile("logLevel")
if err != nil {
log.Warn("'logLevel' not found in configFile")
}
logLevel = "info"
}

if logLevel != "" {
log.SetFormatter(&log.TextFormatter{
FullTimestamp: true,
})
}

if logFile {
log.SetOutput(io.Discard)

log.SetFormatter(&log.TextFormatter{
DisableColors: true,
})

if runtime.GOOS != "windows" {
logFileSyslog()
}
}

log.AddHook(&writer.Hook{
Writer: os.Stderr,
LogLevels: []log.Level{log.ErrorLevel},
})

switch logLevel {
case "trace":
jww.SetLogThreshold(jww.LevelTrace)
jww.SetStdoutThreshold(jww.LevelTrace)
log.SetLevel(log.TraceLevel)
case "debug":
jww.SetLogThreshold(jww.LevelDebug)
jww.SetStdoutThreshold(jww.LevelDebug)
log.SetLevel(log.DebugLevel)
case "info":
jww.SetLogThreshold(jww.LevelInfo)
jww.SetStdoutThreshold(jww.LevelInfo)
log.SetLevel(log.InfoLevel)
case "warn":
jww.SetLogThreshold(jww.LevelWarn)
jww.SetStdoutThreshold(jww.LevelWarn)
log.SetLevel(log.WarnLevel)
case "error":
jww.SetLogThreshold(jww.LevelError)
jww.SetStdoutThreshold(jww.LevelError)
log.SetLevel(log.ErrorLevel)
case "none":
log.SetOutput(io.Discard)
default:
return fmt.Errorf("logLevel: '%s' is invalid and should have been 'trace', 'debug', 'info', 'warn', 'error' or 'none'", logLevel)
}

return nil
}

func enableDebug() {
log.SetReportCaller(true)
if debug {
log.SetLevel(log.DebugLevel)

// Added to be able to debug viper (used to read the config file)
// Viper is using a different logger
jww.SetLogThreshold(jww.LevelTrace)
jww.SetStdoutThreshold(jww.LevelDebug)
}
}
17 changes: 0 additions & 17 deletions cmd/n3dr/root_unix.go

This file was deleted.

7 changes: 0 additions & 7 deletions cmd/n3dr/root_windows.go

This file was deleted.

3 changes: 3 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@

### Fix
- [[#263](https://github.com/030/n3dr/issues/263)] Remove deprecated commands.
- **logging:** [[#270](https://github.com/030/n3dr/issues/270)] Optional write to syslog and/or file and default loglevel set to info.

### BREAKING CHANGE

The `--debug` and `-d` shorthand have been replaced by `--logLevel debug`.

The `backup`, `upload` and `repositories` commands have been removed.


Expand Down
3 changes: 1 addition & 2 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ Available Commands:
Flags:
-v, --apiVersion string The Nexus3 APIVersion, e.g. v1 or beta
(default "v1")
-d, --debug Enable debug logging
-h, --help help for n3dr
--insecureSkipVerify Skip repository certificate check
-p, --n3drPass string The Nexus3 password
Expand Down Expand Up @@ -407,7 +406,7 @@ removeLocalFile: true
Use the `--npm` parameter to backup NPM artifacts.

```bash
go run main.go backup -npm -n some-url -r some-npm-repo -d --npm
go run main.go backup -npm -n some-url -r some-npm-repo --npm
```

## logo
Expand Down
13 changes: 7 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ module github.com/030/n3dr
go 1.19

require (
github.com/030/logging v0.1.1
github.com/030/mij v1.0.2
github.com/030/p2iwd v0.2.0
github.com/030/p2iwd v1.0.1
github.com/aws/aws-sdk-go v1.44.134
github.com/go-openapi/errors v0.20.3
github.com/go-openapi/runtime v0.24.2
Expand All @@ -16,7 +17,6 @@ require (
github.com/mitchellh/go-homedir v1.1.0
github.com/sirupsen/logrus v1.9.0
github.com/spf13/cobra v1.6.1
github.com/spf13/jwalterweatherman v1.1.0
github.com/spf13/viper v1.14.0
github.com/stretchr/testify v1.8.1
)
Expand Down Expand Up @@ -49,24 +49,25 @@ require (
github.com/oklog/ulid v1.3.1 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pelletier/go-toml/v2 v2.0.5 // indirect
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
github.com/pierrec/lz4 v2.6.1+incompatible // indirect
github.com/pierrec/lz4/v4 v4.1.17 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rogpeppe/go-internal v1.8.0 // indirect
github.com/spf13/afero v1.9.2 // indirect
github.com/spf13/afero v1.9.3 // indirect
github.com/spf13/cast v1.5.0 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.4.1 // indirect
github.com/therootcompany/xz v1.0.1 // indirect
github.com/tidwall/gjson v1.14.3 // indirect
github.com/tidwall/gjson v1.14.4 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
github.com/ulikunitz/xz v0.5.10 // indirect
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
go.mongodb.org/mongo-driver v1.11.0 // indirect
golang.org/x/net v0.2.0 // indirect
golang.org/x/sys v0.2.0 // indirect
golang.org/x/sys v0.3.0 // indirect
golang.org/x/text v0.4.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
Expand Down
22 changes: 12 additions & 10 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,12 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/030/logging v0.1.1 h1:hHrYVrzSCU5Nwwcw5x3zCJYZwqViLtouFmmNiJy0uYY=
github.com/030/logging v0.1.1/go.mod h1:/mKnkDW/Mo5PPWWiH31T4dVwabWVd45p8oYBXUtd0sg=
github.com/030/mij v1.0.2 h1:fJ6URW86neK1J0XXZ6VPdrN1ulv37hLgadIj7k3CuYg=
github.com/030/mij v1.0.2/go.mod h1:UZDCXdouLCtNrTS/UPUXzHkL09iNS6BFK6rVatYpSSo=
github.com/030/p2iwd v0.2.0 h1:NapOR3P8c9g4n9K78J7ze3GOf8IcD0OWGeSgR9EIWi8=
github.com/030/p2iwd v0.2.0/go.mod h1:j0uQwkrgcKeF3CO+t/K9ulXyd7IwYbYsKK6DsNhQYUw=
github.com/030/p2iwd v1.0.1 h1:u/e9LHdjvT1q4GZt6lctegzmMXaOgZExKPeuk6vYv6Q=
github.com/030/p2iwd v1.0.1/go.mod h1:WZSZJPkKSOti/dhuTjnsGXOD+lsaNJG9LC/0pfsUlgs=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
Expand Down Expand Up @@ -284,8 +286,8 @@ github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYr
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg=
github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas=
github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM=
github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc=
Expand All @@ -310,8 +312,8 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw=
github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk=
github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
Expand Down Expand Up @@ -342,8 +344,8 @@ github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs
github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
github.com/therootcompany/xz v1.0.1 h1:CmOtsn1CbtmyYiusbfmhmkpAAETj0wBIH6kCYaX+xzw=
github.com/therootcompany/xz v1.0.1/go.mod h1:3K3UH1yCKgBneZYhuQUvJ9HPD19UEXEI0BWbMn8qNMY=
github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw=
github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=
github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
Expand Down Expand Up @@ -533,8 +535,8 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
Expand Down

0 comments on commit 474e6ef

Please sign in to comment.