diff --git a/api/logger.go b/api/logger.go index e898746..1d8e9df 100644 --- a/api/logger.go +++ b/api/logger.go @@ -1,7 +1,7 @@ package api import ( - "github.com/labstack/echo" + "github.com/labstack/echo/v4" "github.com/rs/zerolog/log" "strconv" "time" diff --git a/api/rate_limiter.go b/api/rate_limiter.go index 96a59bd..a18e928 100644 --- a/api/rate_limiter.go +++ b/api/rate_limiter.go @@ -2,7 +2,7 @@ package api import ( "github.com/inexio/thola/core/tholaerr" - "github.com/labstack/echo" + "github.com/labstack/echo/v4" "github.com/rs/zerolog/log" "github.com/spf13/viper" "github.com/ulule/limiter/v3" diff --git a/api/request_handler.go b/api/request_handler.go index 1d9a2ac..9aa7075 100644 --- a/api/request_handler.go +++ b/api/request_handler.go @@ -8,8 +8,8 @@ import ( "github.com/inexio/thola/core/database" "github.com/inexio/thola/core/request" "github.com/inexio/thola/core/tholaerr" - "github.com/labstack/echo" - "github.com/labstack/echo/middleware" + "github.com/labstack/echo/v4" + "github.com/labstack/echo/v4/middleware" "github.com/rs/zerolog/log" "github.com/spf13/viper" "net/http" diff --git a/api/request_id.go b/api/request_id.go index 9cfa4f8..3c88fb4 100644 --- a/api/request_id.go +++ b/api/request_id.go @@ -1,7 +1,7 @@ package api import ( - "github.com/labstack/echo" + "github.com/labstack/echo/v4" "github.com/rs/xid" ) diff --git a/api/statistics/statistics.go b/api/statistics/statistics.go index 49d29f5..e53edcf 100644 --- a/api/statistics/statistics.go +++ b/api/statistics/statistics.go @@ -1,7 +1,7 @@ package statistics import ( - "github.com/labstack/echo" + "github.com/labstack/echo/v4" "math" "net/http" "sync" diff --git a/cmd/check_cpu_load.go b/cmd/check_cpu_load.go index 121f5f7..d0e2bca 100644 --- a/cmd/check_cpu_load.go +++ b/cmd/check_cpu_load.go @@ -19,7 +19,6 @@ var checkCpuLoad = &cobra.Command{ Short: "Check the cpu load of a device", Long: "Checks the cpu load of a device.\n\n" + "The usage will be printed as performance data.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { r := request.CheckCPULoadRequest{ CheckDeviceRequest: getCheckDeviceRequest(args[0]), diff --git a/cmd/check_hardware_health.go b/cmd/check_hardware_health.go index 5f7d05e..003178f 100644 --- a/cmd/check_hardware_health.go +++ b/cmd/check_hardware_health.go @@ -14,7 +14,6 @@ var checkHardwareHealthCMD = &cobra.Command{ Use: "hardware-health [host]", Short: "Check hardware-health of a device.", Long: "Check hardware-health of a device and return various performance data.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { r := request.CheckHardwareHealthRequest{ CheckDeviceRequest: getCheckDeviceRequest(args[0]), diff --git a/cmd/check_identify.go b/cmd/check_identify.go index bc9eac1..5010139 100644 --- a/cmd/check_identify.go +++ b/cmd/check_identify.go @@ -63,7 +63,6 @@ var checkIdentifyCMD = &cobra.Command{ Short: "Check identify properties with given expectations", Long: "Check identify properties with given expectations.\n\n" + "You can set the expectations with the flags.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { var nilString *string vendor := cmd.Flags().Lookup("vendor").Value.String() diff --git a/cmd/check_interface_metrics.go b/cmd/check_interface_metrics.go index 438bf65..39cc553 100644 --- a/cmd/check_interface_metrics.go +++ b/cmd/check_interface_metrics.go @@ -29,7 +29,6 @@ var checkInterfaceMetricsCMD = &cobra.Command{ Use: "interface-metrics [host]", Short: "Reads all interface metrics and prints them as performance data", Long: "Reads all interface metrics and prints them as performance data.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { r := request.CheckInterfaceMetricsRequest{ CheckDeviceRequest: getCheckDeviceRequest(args[0]), diff --git a/cmd/check_memory_usage.go b/cmd/check_memory_usage.go index f5b0dd5..444962a 100644 --- a/cmd/check_memory_usage.go +++ b/cmd/check_memory_usage.go @@ -19,7 +19,6 @@ var checkMemoryUsage = &cobra.Command{ Short: "Check the memory usage of a device", Long: "Checks the memory usage of a device.\n\n" + "The usage will be printed as performance data.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { r := request.CheckMemoryUsageRequest{ CheckDeviceRequest: getCheckDeviceRequest(args[0]), diff --git a/cmd/check_sbc.go b/cmd/check_sbc.go index 5b66ab5..6066e7a 100644 --- a/cmd/check_sbc.go +++ b/cmd/check_sbc.go @@ -18,7 +18,6 @@ var checkSBCCMD = &cobra.Command{ Use: "sbc [host]", Short: "Read out sbc specific metrics as performance data", Long: "Read out sbc specific metrics as performance data.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { r := request.CheckSBCRequest{ CheckDeviceRequest: getCheckDeviceRequest(args[0]), diff --git a/cmd/check_snmp.go b/cmd/check_snmp.go index f2cf466..6f655c7 100644 --- a/cmd/check_snmp.go +++ b/cmd/check_snmp.go @@ -15,7 +15,6 @@ var checkSNMPCMD = &cobra.Command{ Short: "Check whether a device is reachable over snmp", Long: "Check whether a device is reachable over snmp.\n\n" + "All configured SNMP options will be tried.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { r := request.CheckSNMPRequest{ CheckDeviceRequest: getCheckDeviceRequest(args[0]), diff --git a/cmd/check_ups.go b/cmd/check_ups.go index 2fed912..93ca73b 100644 --- a/cmd/check_ups.go +++ b/cmd/check_ups.go @@ -41,7 +41,6 @@ var checkUPSCMD = &cobra.Command{ Short: "Checks whether a UPS device has its main voltage applied", Long: "Checks whether a UPS device has its main voltage applied.\n\n" + "All UPS statistics will be printed as performance data.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { r := request.CheckUPSRequest{ CheckDeviceRequest: getCheckDeviceRequest(args[0]), diff --git a/cmd/device_init.go b/cmd/device_init.go index 06bb2e0..a9cfb21 100644 --- a/cmd/device_init.go +++ b/cmd/device_init.go @@ -48,6 +48,7 @@ func buildDeviceFlagSet() *flag.FlagSet { func addDeviceFlags(cmd *cobra.Command) { cmd.PersistentFlags().AddFlagSet(deviceFlagSet) + cmd.Args = cobra.ExactArgs(1) } func bindDeviceFlags(cmd *cobra.Command) error { diff --git a/cmd/identify.go b/cmd/identify.go index a97beb5..9bd2f3f 100644 --- a/cmd/identify.go +++ b/cmd/identify.go @@ -15,7 +15,6 @@ var identifyCMD = &cobra.Command{ Short: "Automatically identify devices", Long: "Automatically identify devices.\n\n" + "It returns properties like vendor, model, serial number,...", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { r := request.IdentifyRequest{ BaseRequest: getBaseRequest(args[0]), diff --git a/cmd/read_available_components.go b/cmd/read_available_components.go index 8d962ce..1e67829 100644 --- a/cmd/read_available_components.go +++ b/cmd/read_available_components.go @@ -13,7 +13,6 @@ var readAvailableComponentsCMD = &cobra.Command{ Use: "available-components [host]", Short: "Returns the available components for the device", Long: "Returns the available components for the device.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { request := request.ReadAvailableComponentsRequest{ ReadRequest: getReadRequest(args[0]), diff --git a/cmd/read_count_interfaces.go b/cmd/read_count_interfaces.go index c1811e9..d1d14bd 100644 --- a/cmd/read_count_interfaces.go +++ b/cmd/read_count_interfaces.go @@ -13,7 +13,6 @@ var readCountInterfacesCMD = &cobra.Command{ Use: "count-interfaces [host]", Short: "Count interfaces of a device", Long: "Count the interfaces of a device.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { request := request.ReadCountInterfacesRequest{ ReadRequest: getReadRequest(args[0]), diff --git a/cmd/read_cpu_load.go b/cmd/read_cpu_load.go index 68e338b..a73f74b 100644 --- a/cmd/read_cpu_load.go +++ b/cmd/read_cpu_load.go @@ -13,7 +13,6 @@ var readCPULoadCMD = &cobra.Command{ Use: "cpu-load [host]", Short: "Read out the CPU load of a device", Long: "Read out the CPU load of a device.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { request := request.ReadCPULoadRequest{ ReadRequest: getReadRequest(args[0]), diff --git a/cmd/read_hardware_health.go b/cmd/read_hardware_health.go index 676429c..f38f6fb 100644 --- a/cmd/read_hardware_health.go +++ b/cmd/read_hardware_health.go @@ -13,7 +13,6 @@ var readHardwareHealth = &cobra.Command{ Use: "hardware-health [host]", Short: "Read out the hardware health of a device", Long: "Read out the hardware health of a device.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { request := request.ReadHardwareHealthRequest{ ReadRequest: getReadRequest(args[0]), diff --git a/cmd/read_interfaces.go b/cmd/read_interfaces.go index 1f03625..08d2622 100644 --- a/cmd/read_interfaces.go +++ b/cmd/read_interfaces.go @@ -14,7 +14,6 @@ var readInterfacesCMD = &cobra.Command{ Short: "Read out interface information of a device", Long: "Read out interface information of a device.\n\n" + "Also reads special values based on the interface type.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { request := request.ReadInterfacesRequest{ ReadRequest: getReadRequest(args[0]), diff --git a/cmd/read_memory_usage.go b/cmd/read_memory_usage.go index 2e0161b..e363798 100644 --- a/cmd/read_memory_usage.go +++ b/cmd/read_memory_usage.go @@ -13,7 +13,6 @@ var readMemoryUsageCMD = &cobra.Command{ Use: "memory-usage [host]", Short: "Read out the memory usage of a device", Long: "Read out the memory usage of a device.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { request := request.ReadMemoryUsageRequest{ ReadRequest: getReadRequest(args[0]), diff --git a/cmd/read_sbc.go b/cmd/read_sbc.go index bb2059f..7132c71 100644 --- a/cmd/read_sbc.go +++ b/cmd/read_sbc.go @@ -13,7 +13,6 @@ var readSBCCMD = &cobra.Command{ Use: "sbc [host]", Short: "Read out SBC specific information of a device", Long: "Read out SPC specific information of a device like global call per second or active local contacts, including information per agent and per realm.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { request := request.ReadSBCRequest{ ReadRequest: getReadRequest(args[0]), diff --git a/cmd/read_ups.go b/cmd/read_ups.go index 62d7bc1..82ff87a 100644 --- a/cmd/read_ups.go +++ b/cmd/read_ups.go @@ -13,7 +13,6 @@ var readUPSCMD = &cobra.Command{ Use: "ups [host]", Short: "Read out UPS information of a device", Long: "Read out UPS information of a device like battery capacity and current usage.", - Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { request := request.ReadUPSRequest{ ReadRequest: getReadRequest(args[0]), diff --git a/core/database/database.go b/core/database/database.go index d95a5ba..885a935 100644 --- a/core/database/database.go +++ b/core/database/database.go @@ -57,7 +57,7 @@ func initDB(ctx context.Context) error { badgerDB := badgerDatabase{} u, err := user.Current() if err != nil { - return err + return errors.Wrap(err, "failed to get username") } badgerDB.db, err = badger.Open(badger.DefaultOptions(filepath.Join(os.TempDir(), "thola-"+u.Username+"-cache")).WithLogger(nil)) if err != nil { diff --git a/go.mod b/go.mod index 8d3ccbf..f1d9764 100644 --- a/go.mod +++ b/go.mod @@ -12,8 +12,7 @@ require ( github.com/huandu/go-sqlbuilder v1.8.0 github.com/inexio/go-monitoringplugin v1.0.0 github.com/jmoiron/sqlx v1.2.0 - github.com/labstack/echo v3.3.10+incompatible - github.com/labstack/gommon v0.3.0 // indirect + github.com/labstack/echo/v4 v4.2.0 github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db github.com/mitchellh/mapstructure v1.3.3 github.com/pkg/errors v0.9.1 @@ -26,7 +25,6 @@ require ( github.com/spf13/viper v1.7.1 github.com/stretchr/testify v1.7.0 github.com/ulule/limiter/v3 v3.5.0 - github.com/valyala/fasttemplate v1.2.1 // indirect golang.org/x/text v0.3.3 gopkg.in/yaml.v2 v2.3.0 ) diff --git a/go.sum b/go.sum index 82b4ba3..6d21fcb 100644 --- a/go.sum +++ b/go.sum @@ -178,8 +178,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg= -github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= +github.com/labstack/echo/v4 v4.2.0 h1:jkCSsjXmBmapVXF6U4BrSz/cgofWM0CU3Q74wQvXkIc= +github.com/labstack/echo/v4 v4.2.0/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= @@ -189,8 +189,9 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= @@ -332,8 +333,9 @@ golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -372,6 +374,7 @@ golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -405,9 +408,11 @@ golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -417,6 +422,8 @@ golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=