diff --git a/CHANGELOG.md b/CHANGELOG.md index ce21c087..02056416 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ ## Ergo CHANGELOG +- v2.0.3 + - 新增code命令,支持初始化crds/go项目 + - plugin增强, 参考helm repo + - v2.0.2 - repo新增redis,etcd,mongodb,consul,minio,postgresql,rabbitmq diff --git a/README.md b/README.md index 26bce77f..99b6b336 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ ergo upgrade ## 命令支持 +- [x] code 初始化项目 - [x] completion - [x] debian - [x] `init` 初始化debian @@ -40,12 +41,19 @@ ergo upgrade - [x] `nc` nc - [x] `exec` 执行命令 - [x] plugin + - [x] `install` 安装插件 - [x] `list` 列出ergo插件 + - [x] `ls-remote` 列出远程插件 + - [x] `repo` 插件仓库管理, 类似helm仓库 + - [x] `add` 添加插件仓库 + - [x] `list` 列出插件仓库列表 + - [x] `del` 移除插件仓库 + - [x] `update` 更新插件索引 - [x] repo - [x] `list` 列出支持的软件包 - [x] `install` 安装软件包 - - [x] containerd - - [x] mysql,redis,etcd,mongodb,consul,minio,postgresql,rabbitmq + - [x] `containerd` + - [x] `mysql`等 - [x] `dump` dump安装脚本 - [x] upgrade - [x] version @@ -70,17 +78,30 @@ echo $@ # 使用 ergo doge haha haha + +# 插件仓库列表 +ergo plugin repo list +[info] 上次变更时间: 2021-10-13 15:37:18.782145 +0800 CST +NAME URL +local https://gitee.com/ysbot/ergoplugindemo/raw/master/default.yaml + +# 列出远程插件 +ergo plugin ls-remote +[done] √ "local"已经更新索引: /Users/ysicing/.ergo/.config/local.index.yaml +[done] √ sync done. +Repo NAME URL Desc Available +local demo-linux https://gitee.com/ysbot/ergoplugindemo/raw/master/demo demo false +local demo-darwin https://gitee.com/ysbot/ergoplugindemo/raw/master/demo demo true ``` #### 其他开源项目 > 感谢以下项目 -- [sealos](https://github.com/fanux/sealos) -- [zzz](https://github.com/sohaha/zzz) -- [devspace](https://github.com/loft-sh/devspace) -- [CDK](https://github.com/cdk-team/CDK) -- [kubectl](https://k8s.io/kubectl) +- [loft-sh/devspace](https://github.com/loft-sh/devspace) +- [cdk-team/CDK](https://github.com/cdk-team/CDK) +- [kubernetes/kubectl](https://github.com/kubernetes/kubernetes) +- [helm/helm](https://github.com/helm/helm) ## 🎉🎉 赞助商 diff --git a/cmd/boot/boot.go b/cmd/boot/boot.go index 8c0fd927..081993bb 100644 --- a/cmd/boot/boot.go +++ b/cmd/boot/boot.go @@ -17,6 +17,7 @@ var rootDirs = []string{ common.DefaultDataDir, common.DefaultDumpDir, common.DefaultBinDir, + common.DefaultCfgDir, } func initRootDirectory() error { diff --git a/cmd/cloud.go b/cmd/cloud.go new file mode 100644 index 00000000..61d2fe66 --- /dev/null +++ b/cmd/cloud.go @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2021 ysicing + */ + +package cmd + +import ( + "context" + "fmt" + "github.com/ergoapi/util/file" + "github.com/gosuri/uitable" + "github.com/manifoldco/promptui" + "github.com/spf13/cobra" + "github.com/ysicing/ergo/common" + "github.com/ysicing/ergo/pkg/ergo/cloud" + "github.com/ysicing/ergo/pkg/ergo/cloud/aliyun" + "github.com/ysicing/ergo/pkg/ergo/cloud/qcloud" + "github.com/ysicing/ergo/pkg/util/factory" + "helm.sh/helm/v3/pkg/cli/output" + "os" + "sigs.k8s.io/yaml" +) + +// NewCloudCommand 云服务商支持 +func newCloudCommand(f factory.Factory) *cobra.Command { + cloud := &cobra.Command{ + Use: "cloud [flags]", + Short: "云服务商支持", + } + cloud.AddCommand(newCloudCofig(f)) + cloud.AddCommand(newCloudDns(f)) + return cloud +} + +func newCloudCofig(f factory.Factory) *cobra.Command { + cmd := &cobra.Command{} + return cmd +} + +func newCloudDns(f factory.Factory) *cobra.Command { + cmd := &cobra.Command{ + Use: "dns [flags]", + Short: "dns", + } + cmd.AddCommand(newDnsList(f)) + return cmd +} + +func newDnsList(f factory.Factory) *cobra.Command { + l := f.GetLog() + cmd := &cobra.Command{ + Use: "domain", + Short: "域名列表", + Run: func(cobraCmd *cobra.Command, args []string) { + templates := &promptui.SelectTemplates{ + Label: "{{ . }}", + Active: "\U0001F449 {{ .Value | cyan }}", + Inactive: " {{ .Value | cyan }}", + Selected: "\U0001F389 {{ .Value | red | cyan }}", + } + cloudprompt := promptui.Select{ + Label: "选择云服务商", + Items: cloud.CloudType, + Size: 4, + Templates: templates, + } + selectid, _, _ := cloudprompt.Run() + ct := cloud.CloudType[selectid] + var domainlist cloud.DomainList + if ct.Key == "all" || ct.Key == cloud.ProviderQcloud.Value() { + l.Debugf("load qcloud domain") + // 腾讯云 + p, err := qcloud.NewDns(qcloud.WithLog(l), qcloud.WithApi(os.Getenv("TX_Key"), os.Getenv("TX_Secret"))) + if err != nil { + l.Errorf("create qcloud api client err: %v", err) + } else { + pd, err := p.DomainList(context.Background()) + if err == nil { + domainlist = append(domainlist, pd...) + } else { + l.Errorf("do qcloud dns api err: %v", err) + } + } + } + if ct.Key == "all" || ct.Key == cloud.ProviderAliyun.Value() { + l.Debugf("load aliyun domain") + // 阿里云 + p, err := aliyun.NewDns(aliyun.WithLog(l), aliyun.WithApi(os.Getenv("Ali_Key"), os.Getenv("Ali_Secret"))) + if err != nil { + l.Errorf("create aliyun api client err: %v", err) + } else { + pd, err := p.DomainList(context.Background()) + if err == nil { + domainlist = append(domainlist, pd...) + } else { + l.Errorf("do aliyun dns api err: %v", err) + } + } + } + table := uitable.New() + table.AddRow("服务商", "域名") + for _, re := range domainlist { + table.AddRow(re.Provider, re.Name) + } + output.EncodeTable(os.Stdout, table) + domainfile := fmt.Sprintf("%v/.domain", common.GetDefaultCfgDir()) + if file.CheckFileExists(domainfile) { + file.RemoveFiles(domainfile) + } + resp, _ := yaml.Marshal(domainlist) + file.Writefile(domainfile, string(resp)) + l.Donef("域名缓存成功: %v", domainfile) + }, + } + return cmd +} diff --git a/cmd/code.go b/cmd/code.go new file mode 100644 index 00000000..7e4899fe --- /dev/null +++ b/cmd/code.go @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2021 ysicing + */ + +package cmd + +import ( + "github.com/manifoldco/promptui" + "github.com/spf13/cobra" + "github.com/ysicing/ergo/pkg/ergo/codegen" + "github.com/ysicing/ergo/pkg/util/factory" + "github.com/ysicing/ergo/pkg/util/log" + "strings" +) + +type CodeOptions struct { + Log log.Logger +} + +func newCodeGenCmd(f factory.Factory) *cobra.Command { + c := &CodeOptions{ + Log: f.GetLog(), + } + cmd := &cobra.Command{ + Use: "code [flags]", + Short: "初始化项目", + Run: func(cobraCmd *cobra.Command, args []string) { + c.Init() + }, + } + return cmd +} + +func (code CodeOptions) Init() { + searcher := func(input string, index int) bool { + p := codegen.CodeType[index] + name := strings.Replace(strings.ToLower(p.Key), " ", "", -1) + input = strings.Replace(strings.ToLower(input), " ", "", -1) + return strings.Contains(name, input) + } + templates := &promptui.SelectTemplates{ + Label: "{{ . }}", + Active: "\U0001F449 {{ .Key | cyan }}", + Inactive: " {{ .Key | cyan }}", + Selected: "\U0001F389 {{ .Key | red | cyan }}", + } + codetype := promptui.Select{ + Label: "选择代码类型", + Items: codegen.CodeType, + Searcher: searcher, + Size: 4, + Templates: templates, + } + codetypeid, _, _ := codetype.Run() + selectcodetypevalue := codegen.CodeType[codetypeid].Key + code.Log.Infof("\U0001F389 选择 %v", selectcodetypevalue) + codefunc := codegen.CodeGen{Log: code.Log} + if selectcodetypevalue == "go" { + code.Log.Infof("Start downloading the template...") + if err := codefunc.GoClone(); err != nil { + code.Log.Fatal(err) + return + } + } else { + code.Log.Infof("Start Gen Crds template...") + if err := codefunc.GenCrds(); err != nil { + code.Log.Fatal(err) + return + } + } +} diff --git a/cmd/command/cloud.go b/cmd/command/cloud.go deleted file mode 100644 index 84fb9bf8..00000000 --- a/cmd/command/cloud.go +++ /dev/null @@ -1,291 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package command - -import ( - "fmt" - "github.com/spf13/cobra" - "github.com/ysicing/ergo/pkg/ergo/cloud/dns" - "github.com/ysicing/ergo/pkg/ergo/cloud/ecs" - lighthouseapi "github.com/ysicing/ergo/pkg/ergo/cloud/lighthouse" - "github.com/ysicing/ext/utils/exmisc" - "k8s.io/klog/v2" - "os" - "strings" -) - -var ( - provider string // 云服务商 - region string // 地域 - key string - secret string - domain string - dnstype string - value string - vmid string -) - -// NewCloudCommand 云服务商支持 -func NewCloudCommand() *cobra.Command { - cloud := &cobra.Command{ - Use: "cloud", - Short: "云服务商支持", - } - cloud.AddCommand(NewCloudVM(), NewCloudLighthouse(), NewCloudDns()) - cloud.PersistentFlags().StringVar(&provider, "p", "ali", "云服务商ali, qcloud") - cloud.PersistentFlags().StringVar(®ion, "region", "", "数据中心") - cloud.PersistentFlags().StringVar(&key, "key", "", "api key") - cloud.PersistentFlags().StringVar(&secret, "secret", "", "api secret") - return cloud -} - -func NewCloudVM() *cobra.Command { - vm := &cobra.Command{ - Use: "vm", - Short: "vm操作", - Long: "ECS,CVM", - } - vm.AddCommand(vmlist(), vmreset()) - return vm -} - -func vmlist() *cobra.Command { - vmlist := &cobra.Command{ - Use: "list", - Short: "列出机器", - Run: func(cmd *cobra.Command, args []string) { - if provider == "ali" || provider == "aliyun" { - ecs := new(ecs.ECS) - if err := ecs.List(); err != nil { - fmt.Println(err.Error()) - } - } - if provider == "tx" || provider == "qcloud" { - cvm := ecs.CVM{ - Region: region, - SecretKey: secret, - SecretID: key, - } - if err := cvm.List(); err != nil { - fmt.Println(err.Error()) - } - } - }, - } - return vmlist -} - -func vmreset() *cobra.Command { - vmlist := &cobra.Command{ - Use: "reset", - Short: "重装系统", - PreRun: func(cmd *cobra.Command, args []string) { - if len(vmid) == 0 { - fmt.Println("vmid不允许为空") - os.Exit(-1) - } - }, - Run: func(cmd *cobra.Command, args []string) { - if provider == "ali" || provider == "aliyun" { - ecs := new(ecs.ECS) - if err := ecs.Reset(); err != nil { - fmt.Println(err.Error()) - } - } - if provider == "tx" || provider == "qcloud" { - cvm := ecs.CVM{ - Region: region, - SecretKey: secret, - SecretID: key, - } - if err := cvm.Reset(vmid); err != nil { - fmt.Println(err.Error()) - } - } - }, - } - vmlist.PersistentFlags().StringVar(&vmid, "vmid", "", "机器ip") - return vmlist -} - -func NewCloudLighthouse() *cobra.Command { - lighthouse := &cobra.Command{ - Use: "lighthouse", - Aliases: []string{"vmlite", "qlvm"}, - Short: "轻量操作", - Long: "Lighthouse", - } - lighthouse.AddCommand(lighthouselist(), lighthousereset(), lighthousebind()) - return lighthouse -} - -func lighthouselist() *cobra.Command { - vmlist := &cobra.Command{ - Use: "list", - Short: "列出机器", - Run: func(cmd *cobra.Command, args []string) { - if provider == "tx" || provider == "qcloud" { - lighthouse := lighthouseapi.Lighthouse{ - Region: region, - SecretKey: secret, - SecretID: key, - } - if err := lighthouse.List(); err != nil { - fmt.Println(err.Error()) - } - } - }, - } - return vmlist -} - -func lighthousereset() *cobra.Command { - lighthouselist := &cobra.Command{ - Use: "reset", - Short: "重装系统", - PreRun: func(cmd *cobra.Command, args []string) { - if len(vmid) == 0 { - fmt.Println("vmid不允许为空") - os.Exit(-1) - } - }, - Run: func(cmd *cobra.Command, args []string) { - if provider == "tx" || provider == "qcloud" { - lighthouse := lighthouseapi.Lighthouse{ - Region: region, - SecretKey: secret, - SecretID: key, - } - if err := lighthouse.Reset(vmid); err != nil { - fmt.Println(err.Error()) - } - } - }, - } - lighthouselist.PersistentFlags().StringVar(&vmid, "vmid", "", "机器ip") - return lighthouselist -} - -func lighthousebind() *cobra.Command { - lighthouselist := &cobra.Command{ - Use: "bind", - Short: "绑定密钥", - PreRun: func(cmd *cobra.Command, args []string) { - if len(vmid) == 0 { - fmt.Println("vmid不允许为空") - os.Exit(-1) - } - }, - Run: func(cmd *cobra.Command, args []string) { - if provider == "tx" || provider == "qcloud" { - lighthouse := lighthouseapi.Lighthouse{ - Region: region, - SecretKey: secret, - SecretID: key, - } - if err := lighthouse.BindKey(vmid); err != nil { - fmt.Println(err.Error()) - } - } - }, - } - lighthouselist.PersistentFlags().StringVar(&vmid, "vmid", "", "机器ip") - return lighthouselist -} - -func NewCloudDns() *cobra.Command { - dns := &cobra.Command{ - Use: "dns", - Short: "dns解析操作", - } - dns.AddCommand(dnsshow(), dnsupdate()) - return dns -} - -func dnsshow() *cobra.Command { - dnsshow := &cobra.Command{ - Use: "show", - Short: "列出解析记录", - Long: `ergo cloud dns show ysicing.net ops, show 域名 搜索关键字(可省略)`, - Run: func(cmd *cobra.Command, args []string) { - if provider == "ali" || provider == "aliyun" { - alidns := dns.NewAliDns(region, key, secret) - if len(args) < 1 { - fmt.Println("缺失域名: ") - os.Exit(-1) - } - skey := "" - if len(args) >= 2 { - skey = args[1] - } - res := alidns.DomainRecords(args[0], skey) - for _, record := range res { - if record.Type == "MX" { - continue - } - if record.Status == "ENABLE" { - klog.Infof("%v %v.%v ---> %v %v", record.Type, record.RR, record.DomainName, record.Value, exmisc.SGreen("*")) - } else { - klog.Infof("%v %v.%v ---> %v %v", record.Type, record.RR, record.DomainName, record.Value, exmisc.SRed("x")) - } - } - } else { - fmt.Println("暂不支持") - os.Exit(0) - } - }, - } - return dnsshow -} - -func dnsupdate() *cobra.Command { - dnsupdate := &cobra.Command{ - Use: "renew", - Short: "更新解析,不存在则新加", - PreRun: func(cmd *cobra.Command, args []string) { - if len(domain) == 0 || len(strings.Split(domain, ".")) <= 2 { - fmt.Println("域名不允许为空或者不支持二级域如 ysicing.net ") - os.Exit(-1) - } - }, - Run: func(cmd *cobra.Command, args []string) { - if provider == "ali" || provider == "aliyun" { - alidns := dns.NewAliDns(region, key, secret) - d := strings.Split(domain, ".") // ops.ysicing.net - dd := fmt.Sprintf("%v.%v", d[len(d)-2], d[len(d)-1]) - dpre := strings.ReplaceAll(domain, fmt.Sprintf(".%v", dd), "") - res := alidns.DomainRecords(dd, dpre) - if key == "" { - key = "A" - } - if res != nil { - fmt.Println("已存在记录") - for _, record := range res { - if record.Type == "MX" { - continue - } - if record.RR == dpre { - err := alidns.UpdateDomainRecord(record.RecordID, record.RR, key, value) - if err == nil { - fmt.Println("更新成功") - } - } - } - return - } - err := alidns.AddDomainRecord(dd, dpre, key, value) - if err == nil { - fmt.Println("添加成功") - } - } else { - fmt.Println("暂不支持") - os.Exit(0) - } - }, - } - dnsupdate.PersistentFlags().StringVar(&domain, "domain", "", "域名") - dnsupdate.PersistentFlags().StringVar(&key, "type", "A", "类型") - dnsupdate.PersistentFlags().StringVar(&value, "value", "", "解析值") - return dnsupdate -} diff --git a/cmd/command/codegen.go b/cmd/command/codegen.go deleted file mode 100644 index 176d2df3..00000000 --- a/cmd/command/codegen.go +++ /dev/null @@ -1,79 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package command - -import ( - "github.com/manifoldco/promptui" - "github.com/spf13/cobra" - "github.com/ysicing/ergo/pkg/ergo/codegen" - "github.com/ysicing/ext/utils/exfile" - "k8s.io/klog/v2" - "strings" -) - -var ( - mirror bool -) - -func NewCodeGen() *cobra.Command { - cg := &cobra.Command{ - Use: "codegen", - Short: "初始化项目", - Aliases: []string{"cg", "code"}, - Run: codegenv1, - } - cg.PersistentFlags().BoolVar(&mirror, "mirror", false, "使用gitee源") - return cg -} - -func codegenv1(cmd *cobra.Command, args []string) { - argsL := len(args) - tmp := "" - if argsL >= 2 { - tmp = args[1] - } else { - prompt := promptui.Select{ - Label: "Select Go Template", - Items: []string{"ysicing/go-example"}, - } - _, result, err := prompt.Run() - if err == nil { - tmp = result + ":master" // "ysicing/go-example:" + result - } - } - temples := strings.Split(tmp, ":") - branch := "master" - name := tmp - if len(temples) >= 2 { - branch = temples[1] - name = temples[0] - // name = strings.Join(temples[:2], "/") - } - dir := "" - if argsL > 0 { - dir = exfile.RealPath(args[0]) - } else { - dir = "." - if len(temples) >= 2 { - dir = temples[1] - // for _, v := range []string{"main", "master"} { - // if dir == v { - // dir = name - // break - // } - // } - } - dir = exfile.RealPath(dir) - } - if name == "" { - return - } - klog.Infof("Start downloading the template...") - err := codegen.Clone(dir, name, branch, mirror) - if err != nil { - klog.Fatal(err) - return - } - klog.Infof("Init Done: %s", dir) -} diff --git a/cmd/command/compose.go b/cmd/command/compose.go deleted file mode 100644 index fbfef774..00000000 --- a/cmd/command/compose.go +++ /dev/null @@ -1,51 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package command - -import ( - "github.com/spf13/cobra" - "k8s.io/klog/v2" - "os" -) - -func NewComposeCommand() *cobra.Command { - compose := &cobra.Command{ - Use: "compose", - Short: "docker-compose部署维护", - Aliases: []string{"dc", "docker-compose"}, - } - compose.AddCommand(NewComposeList()) - compose.AddCommand(NewComposeNew()) - compose.PersistentFlags().StringVar(&SSHConfig.User, "user", "root", "用户") - compose.PersistentFlags().StringVar(&SSHConfig.Password, "pass", "", "密码") - compose.PersistentFlags().StringVar(&SSHConfig.PkFile, "pk", "", "私钥") - compose.PersistentFlags().StringVar(&ip, "ip", "", "执行机器IP") - compose.PersistentFlags().BoolVar(&klocal, "local", true, "本地模式") - return compose -} - -func NewComposeList() *cobra.Command { - list := &cobra.Command{ - Use: "list", - Short: "列出支持项目", - Run: func(cmd *cobra.Command, args []string) { - - }, - } - return list -} - -func NewComposeNew() *cobra.Command { - list := &cobra.Command{ - Use: "new", - Short: "部署服务", - Run: func(cmd *cobra.Command, args []string) { - if len(args) == 0 { - klog.Errorf("请确定安装服务名") - os.Exit(-1) - } - }, - } - return list -} diff --git a/cmd/command/global.go b/cmd/command/global.go deleted file mode 100644 index 9a60a244..00000000 --- a/cmd/command/global.go +++ /dev/null @@ -1,17 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package command - -import sshutil "github.com/ysicing/ergo/pkg/util/ssh" - -var ( - SSHConfig sshutil.SSH - IPS []string - RunLocal bool // 本地运行 -) - -type GlobalFlags struct { - Debug bool - CfgFile string -} diff --git a/cmd/command/helm.go b/cmd/command/helm.go deleted file mode 100644 index 7e300d3f..00000000 --- a/cmd/command/helm.go +++ /dev/null @@ -1,87 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package command - -import ( - "fmt" - "github.com/spf13/cobra" - "github.com/ysicing/ergo/pkg/ergo/helm" - "github.com/ysicing/ext/utils/exmisc" - "k8s.io/klog/v2" - "os" -) - -var isuninstall, isgithub bool -var ip string - -// NewHelmCommand() helm of ergo -func NewHelmCommand() *cobra.Command { - helm := &cobra.Command{ - Use: "helm", - Short: "helm安装或者卸载", - } - helm.AddCommand(NewHelmInitCommand()) - helm.AddCommand(NewHelmInstallCommand()) - helm.AddCommand(NewHelmListCommand()) - helm.PersistentFlags().StringVar(&SSHConfig.User, "user", "root", "用户") - helm.PersistentFlags().StringVar(&SSHConfig.Password, "pass", "", "密码") - helm.PersistentFlags().StringVar(&SSHConfig.PkFile, "pk", "", "私钥") - helm.PersistentFlags().StringVar(&ip, "ip", "", "机器IP") - helm.PersistentFlags().BoolVar(&RunLocal, "local", false, "本地模式") - return helm -} - -func NewHelmInitCommand() *cobra.Command { - helminit := &cobra.Command{ - Use: "init", - Short: "helm初始化", - Run: helminitfunc, - } - return helminit -} - -func NewHelmListCommand() *cobra.Command { - helminit := &cobra.Command{ - Use: "list", - Short: "支持helm", - Run: func(cmd *cobra.Command, args []string) { - fmt.Println("目前支持如下: ") - list := []string{"nginx-ingress-controller", "metallb", "cronhpa", "tkn", "metrics-server", "etcd", "kubernetes_dashboard", "cert-manager"} - for _, l := range list { - if l == "metallb" { - fmt.Println("ergo helm install ", exmisc.SGreen(l), "or ergo helm install ", exmisc.SGreen("slb")) - } else if l == "nginx-ingress-controller" { - fmt.Println("ergo helm install ", exmisc.SGreen(l), "or ergo helm install ", exmisc.SGreen("default-ingress")) - } else { - fmt.Println("ergo helm install ", exmisc.SGreen(l)) - } - } - }, - } - return helminit -} - -func NewHelmInstallCommand() *cobra.Command { - helmin := &cobra.Command{ - Use: "install", - Aliases: []string{"deploy", "create"}, - Short: "helm安装或者卸载", - Run: helmfunc, - } - helmin.PersistentFlags().BoolVarP(&isuninstall, "uninstall", "x", false, "卸载") - helmin.PersistentFlags().BoolVarP(&isgithub, "githubmirror", "g", true, "github(默认) or gitee") - return helmin -} - -func helminitfunc(cmd *cobra.Command, args []string) { - helm.HelmInit(SSHConfig, ip, RunLocal) -} - -func helmfunc(cmd *cobra.Command, args []string) { - if len(args) < 1 { - klog.Error("参数不全, 命令类似: ergo helm nginx-ingress-controller") - os.Exit(-1) - } - helm.HelmInstall(SSHConfig, ip, args[0], RunLocal, isuninstall, isgithub) -} diff --git a/cmd/command/k8s.go b/cmd/command/k8s.go deleted file mode 100644 index 9c77f4f6..00000000 --- a/cmd/command/k8s.go +++ /dev/null @@ -1,188 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package command - -import ( - "fmt" - "github.com/spf13/cobra" - "github.com/ysicing/ergo/pkg/ergo/helm" - "github.com/ysicing/ergo/pkg/ergo/k8s" - sshutil "github.com/ysicing/ergo/pkg/util/ssh" - "github.com/ysicing/ext/utils/convert" - "github.com/ysicing/ext/utils/exfile" - "github.com/ysicing/ext/utils/exmisc" - "github.com/ysicing/ext/utils/extime" - "k8s.io/klog/v2" - "os" -) - -var ( - km []string - kw []string - kpass string - kv string - klocal bool - kinit bool - kakms bool - kakd bool -) - -// NewK8sCommand helm of ergo -func NewK8sCommand() *cobra.Command { - k8s := &cobra.Command{ - Use: "k8s", - Short: "k8s安装", - } - k8s.AddCommand(NewK8sInitCommand()) - k8s.AddCommand(NewK8sJoinCommand()) - k8s.AddCommand(NewK8sMasterSchedule()) - k8s.PersistentFlags().StringVar(&SSHConfig.User, "user", "root", "用户") - k8s.PersistentFlags().StringVar(&SSHConfig.Pass, "pass", "", "密码") - k8s.PersistentFlags().StringVar(&SSHConfig.PkFile, "pk", "", "私钥") - k8s.PersistentFlags().StringVar(&ip, "ip", "", "执行机器IP") - k8s.PersistentFlags().BoolVar(&klocal, "local", true, "本地模式") - k8s.PersistentFlags().StringSliceVar(&km, "km", []string{}, "k8s master") - k8s.PersistentFlags().StringSliceVar(&kw, "kw", []string{}, "k8s worker") - k8s.PersistentFlags().StringVar(&kpass, "kpass", "", "k8s节点密码") - k8s.PersistentFlags().StringVar(&kv, "kv", "1.18.20", "k8s版本") - return k8s -} - -// NewK8sInitCommand k8s init of ergo -func NewK8sInitCommand() *cobra.Command { - k8sinit := &cobra.Command{ - Use: "init", - Short: "初始化集群", - PreRun: k8spre, - Run: k8sinitfunc, - } - k8sinit.PersistentFlags().BoolVar(&kakms, "metrics-server", true, "启用metrics-server") - k8sinit.PersistentFlags().BoolVar(&kakd, "kubernetes_dashboard", true, "启用kubernetes_dashboard") - return k8sinit -} - -// NewK8sJoinCommand k8s init of ergo -func NewK8sJoinCommand() *cobra.Command { - k8sjoin := &cobra.Command{ - Use: "join", - Short: "扩容集群", - PreRun: k8spre, - Run: k8sjoinfunc, - } - return k8sjoin -} - -func NewK8sMasterSchedule() *cobra.Command { - k8sMasterSchedule := &cobra.Command{ - Use: "schedule", - Short: "Master节点可以调度pods", - Run: k8sschedulefunc, - } - return k8sMasterSchedule -} - -func k8spre(cmd *cobra.Command, args []string) { - kvs := []string{"1.18.20"} - if !convert.StringArrayContains(kvs, kv) { - klog.Infof("暂不支持 %v", exmisc.SRed(kv)) - klog.Infof("目前仅支持如下版本: ") - for _, kv := range kvs { - klog.Infof("%v", exmisc.SGreen(kv)) - } - klog.Infof("其他大版本支持敬请期待") - os.Exit(0) - return - } - klog.Infof("开始安装: %v", exmisc.SGreen(kv)) -} - -func k8sfunc(cmd *cobra.Command, args []string) { - var kms, kws, kpassword, kargs string - for _, m := range km { - kms = kms + fmt.Sprintf(" --master %v ", m) - } - for _, w := range kw { - kws = kws + fmt.Sprintf(" --node %v ", w) - } - if len(kpass) == 0 && len(SSHConfig.Pass) == 0 { - kpassword = " --passwd vagrant" - } - if len(kpass) != 0 { - kpassword = fmt.Sprintf(" --passwd %v ", kpass) - } else if len(SSHConfig.Pass) != 0 { - kpassword = fmt.Sprintf(" --passwd %v ", SSHConfig.Pass) - } - if kinit { - kargs = kms + kws + kpassword - } else { - kargs = kms + kws - } - k8s.InstallK8s(SSHConfig, ip, klocal, kinit, kargs, kv) -} - -func k8sinitfunc(cmd *cobra.Command, args []string) { - var kms, kws, kpassword, kargs string - for _, m := range km { - kms = kms + fmt.Sprintf(" --master %v ", m) - } - for _, w := range kw { - kws = kws + fmt.Sprintf(" --node %v ", w) - } - if len(kpass) == 0 && len(SSHConfig.Pass) == 0 { - kpassword = " --passwd vagrant" - } - if len(kpass) != 0 { - kpassword = fmt.Sprintf(" --passwd %v ", kpass) - } else if len(SSHConfig.Pass) != 0 { - kpassword = fmt.Sprintf(" --passwd %v ", SSHConfig.Pass) - } - - kargs = kms + kws + kpassword + " --lvscare-image registry.cn-beijing.aliyuncs.com/k7scn/lvscare " - if err := k8s.InstallK8s(SSHConfig, ip, klocal, true, kargs, kv); err == nil { - if len(ip) == 0 { - ip = km[0] - } - if len(SSHConfig.Pass) == 0 { - if len(kpass) != 0 { - SSHConfig.Pass = kpass - } else { - SSHConfig.Pass = "vagrant" - } - SSHConfig.User = "root" - } - if kakms { - helm.HelmInstall(SSHConfig, ip, "kms", false, false, false) - } - if kakd { - helm.HelmInstall(SSHConfig, ip, "kd", false, false, false) - } - } -} - -func k8sjoinfunc(cmd *cobra.Command, args []string) { - var kms, kws, kargs string - for _, m := range km { - kms = kms + fmt.Sprintf(" --master %v ", m) - } - for _, w := range kw { - kws = kws + fmt.Sprintf(" --node %v ", w) - } - kargs = kms + kws - k8s.InstallK8s(SSHConfig, ip, klocal, false, kargs, kv) -} - -func k8sschedulefunc(cmd *cobra.Command, args []string) { - runschedule := "kubectl taint nodes --all node-role.kubernetes.io/master-" - tempfile := fmt.Sprintf("/tmp/%v.k8s.tmp.sh", extime.NowUnix()) - err := exfile.WriteFile(tempfile, runschedule) - if err != nil { - klog.Errorf("write file %v, err: %v", tempfile, err) - os.Exit(-1) - } - if klocal { - sshutil.RunCmd("/bin/bash", tempfile) - } else { - klog.Infof("请在master节点执行.") - } -} diff --git a/cmd/command/ops.go b/cmd/command/ops.go deleted file mode 100644 index 350b95f4..00000000 --- a/cmd/command/ops.go +++ /dev/null @@ -1,139 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package command - -//import ( -// "github.com/manifoldco/promptui" -// "github.com/spf13/cobra" -// base2 "github.com/ysicing/ergo/pkg/ergo/ops/exec" -// "github.com/ysicing/ergo/pkg/util/common" -// "github.com/ysicing/ext/utils/convert" -// "k8s.io/klog/v2" -// "os" -// "sync" -//) -// -//var target string -// -//func NewOPSCommand() *cobra.Command { -// ops := &cobra.Command{ -// Use: "ops", -// Short: "运维工具", -// } -// // 系统 -// ops.AddCommand(opsinstall()) -// ops.AddCommand(opsexec()) -// // 网络 -// ops.AddCommand(netmtr()) -// return ops -//} -// -//func opsinstall() *cobra.Command { -// opsins := &cobra.Command{ -// Use: "install", -// Short: "debian系安装常用软件", -// PreRun: opspreinstallfunc, -// Run: opsinstallfunc, -// } -// opsins.PersistentFlags().StringVar(&SSHConfig.User, "user", "root", "用户") -// opsins.PersistentFlags().StringVar(&SSHConfig.Password, "pass", "", "密码") -// opsins.PersistentFlags().StringVar(&SSHConfig.PkFile, "pk", "", "私钥") -// opsins.PersistentFlags().StringSliceVar(&IPS, "ip", nil, "机器IP") -// opsins.PersistentFlags().BoolVar(&RunLocal, "local", false, "本地模式") -// return opsins -//} -// -//func opsexec() *cobra.Command { -// opsexec := &cobra.Command{ -// Use: "exec", -// Short: "执行shell", -// Run: opsexecfunc, -// } -// opsexec.PersistentFlags().StringVar(&SSHConfig.User, "user", "root", "用户") -// opsexec.PersistentFlags().StringVar(&SSHConfig.Password, "pass", "", "密码") -// opsexec.PersistentFlags().StringVar(&SSHConfig.PkFile, "pk", "", "私钥") -// opsexec.PersistentFlags().StringSliceVar(&IPS, "ip", nil, "机器IP") -// return opsexec -//} -// -//func opsinstallfunc(cmd *cobra.Command, args []string) { -// var wg sync.WaitGroup -// var intallpackage string -// var err error -// if len(args) == 0 { -// prompt := promptui.Select{ -// Label: "Select 安装包", -// Items: []string{"docker", "mysql", "etcd", "redis", "w", "adminer", "prom", "grafana", "go", "node-exporter"}, -// } -// _, intallpackage, err = prompt.Run() -// if err != nil { -// intallpackage = "" -// } -// } else { -// intallpackage = args[0] -// } -// -// if RunLocal { -// wg.Add(1) -// go base2.InstallPackage(SSHConfig, "", intallpackage, &wg, RunLocal) -// } else { -// for _, ip := range IPS { -// wg.Add(1) -// go base2.InstallPackage(SSHConfig, ip, intallpackage, &wg, RunLocal) -// } -// } -// wg.Wait() -//} -// -//func opsexecfunc(cmd *cobra.Command, args []string) { -// var wg sync.WaitGroup -// for _, ip := range IPS { -// wg.Add(1) -// base2.ExecSh(SSHConfig, ip, &wg, args...) -// } -// wg.Wait() -//} -// -//func opspreinstallfunc(cmd *cobra.Command, args []string) { -// if len(args) != 0 { -// skipkey := []string{"docker", "go", "golang", "w", "node-exporter"} -// if !convert.StringArrayContains(skipkey, args[0]) { -// // check docker -// var num int -// if !RunLocal { -// for _, ip := range IPS { -// if !base2.CheckCmd(SSHConfig, ip, "docker") { -// klog.Error("%v 需要安装docker", ip) -// num++ -// } -// } -// } else { -// if err := common.RunCmd("which", "docker"); err != nil { -// klog.Error("本机", " 需要安装docker") -// num++ -// } -// } -// if num != 0 { -// os.Exit(0) -// } -// } -// } -//} -// -//func netmtr() *cobra.Command { -// nt := &cobra.Command{ -// Use: "mtr", -// Short: "mtr", -// PreRun: func(cmd *cobra.Command, args []string) { -// if len(target) == 0 { -// target = "www.baidu.com" -// } -// }, -// Run: func(cmd *cobra.Command, args []string) { -// klog.Info(target) -// }, -// } -// nt.Flags().StringVar(&target, "t", "", "目标ip或者域名") -// return nt -//} diff --git a/cmd/debian.go b/cmd/debian.go index b375bc66..a7fa85db 100644 --- a/cmd/debian.go +++ b/cmd/debian.go @@ -6,7 +6,7 @@ package cmd import ( "github.com/spf13/cobra" "github.com/ysicing/ergo/cmd/flags" - vm2 "github.com/ysicing/ergo/pkg/ergo/vm" + "github.com/ysicing/ergo/pkg/ergo/vm" "github.com/ysicing/ergo/pkg/util/factory" sshutil "github.com/ysicing/ergo/pkg/util/ssh" "sync" @@ -64,7 +64,7 @@ func (cmd *DebianCmd) Init(f factory.Factory) error { // cmd.log = f.GetLog() cmd.sshcfg.Log = f.GetLog() if cmd.local || len(cmd.ips) == 0 { - vm2.RunLocalShell("init", cmd.sshcfg.Log) + vm.RunLocalShell("init", cmd.sshcfg.Log) return nil } @@ -72,7 +72,7 @@ func (cmd *DebianCmd) Init(f factory.Factory) error { var wg sync.WaitGroup for _, ip := range cmd.ips { wg.Add(1) - go vm2.RunInit(cmd.sshcfg, ip, &wg) + go vm.RunInit(cmd.sshcfg, ip, &wg) } wg.Wait() return nil @@ -82,14 +82,14 @@ func (cmd *DebianCmd) UpCore(f factory.Factory) error { cmd.sshcfg.Log = f.GetLog() // 本地 if cmd.local || len(cmd.ips) == 0 { - vm2.RunLocalShell("upcore", cmd.sshcfg.Log) + vm.RunLocalShell("upcore", cmd.sshcfg.Log) return nil } cmd.sshcfg.Log.Debugf("ssh: %v, ips: %v", cmd.sshcfg, cmd.ips) var wg sync.WaitGroup for _, ip := range cmd.ips { wg.Add(1) - go vm2.RunUpgradeCore(cmd.sshcfg, ip, &wg) + go vm.RunUpgradeCore(cmd.sshcfg, ip, &wg) } wg.Wait() return nil diff --git a/cmd/plugin.go b/cmd/plugin.go index 1aed18f9..f383b545 100644 --- a/cmd/plugin.go +++ b/cmd/plugin.go @@ -4,23 +4,17 @@ package cmd import ( - "bytes" - "fmt" + "github.com/gosuri/uitable" "github.com/spf13/cobra" "github.com/ysicing/ergo/common" + "github.com/ysicing/ergo/pkg/ergo/plugin" "github.com/ysicing/ergo/pkg/util/factory" - "github.com/ysicing/ergo/pkg/util/log" - "io/ioutil" + "helm.sh/helm/v3/cmd/helm/require" + "helm.sh/helm/v3/pkg/cli/output" "os" - "path/filepath" - "runtime" "strings" ) -var ( - ValidPluginFilenamePrefixes = []string{"ergo"} -) - // newPluginCmd ergo plugin func newPluginCmd(f factory.Factory) *cobra.Command { cmd := &cobra.Command{ @@ -29,20 +23,49 @@ func newPluginCmd(f factory.Factory) *cobra.Command { Short: "Provides utilities for interacting with plugins", } cmd.AddCommand(NewCmdPluginList(f)) + cmd.AddCommand(NewCmdPluginListRemote(f)) + cmd.AddCommand(NewCmdPluginRepo(f)) + cmd.AddCommand(NewCmdPluginInstall(f)) return cmd } -type PluginListOptions struct { - Verifier PathVerifier - Log log.Logger - NameOnly bool +func NewCmdPluginListRemote(f factory.Factory) *cobra.Command { + o := &plugin.ListRemoteOptions{ + Log: f.GetLog(), + RepoCfg: common.GetDefaultPluginRepoCfg(), + } + cmd := &cobra.Command{ + Use: "ls-remote", + Short: "List remote versions available for install", + Run: func(cmd *cobra.Command, args []string) { + o.Run() + }, + } + return cmd +} - PluginPaths []string +func NewCmdPluginInstall(f factory.Factory) *cobra.Command { + o := &plugin.RepoInstallOption{ + Log: f.GetLog(), + RepoCfg: common.GetDefaultPluginRepoCfg(), + } + cmd := &cobra.Command{ + Use: "install [Repo] [Name]", + Short: "install plugin", + Aliases: []string{"i"}, + Args: require.ExactArgs(2), + RunE: func(cobraCmd *cobra.Command, args []string) error { + o.Repo = args[0] + o.Name = args[1] + return o.Run() + }, + } + return cmd } // NewCmdPluginList provides a way to list all plugin executables visible to ergo func NewCmdPluginList(f factory.Factory) *cobra.Command { - o := &PluginListOptions{ + o := &plugin.ListOptions{ Log: f.GetLog(), } cmd := &cobra.Command{ @@ -57,177 +80,101 @@ func NewCmdPluginList(f factory.Factory) *cobra.Command { return cmd } -func (o *PluginListOptions) Complete(cmd *cobra.Command) error { - o.Verifier = &CommandOverrideVerifier{ - root: cmd.Root(), - seenPlugins: make(map[string]string), +func NewCmdPluginRepo(f factory.Factory) *cobra.Command { + cmd := &cobra.Command{ + Use: "repo [flags]", + Short: "Provides utilities for interacting with plugin repos", } - o.PluginPaths = filepath.SplitList(os.Getenv("PATH")) - return nil + cmd.AddCommand(NewCmdPluginRepoList(f)) + cmd.AddCommand(NewCmdPluginRepoAdd(f)) + cmd.AddCommand(NewCmdPluginRepoDel(f)) + cmd.AddCommand(NewCmdPluginRepoUpdate(f)) + return cmd } -func (o *PluginListOptions) Run() error { - pluginsFound := false - isFirstFile := true - var pluginErrors []error - pluginWarnings := 0 +var listoutput string - for _, dir := range uniquePathsList(o.PluginPaths) { - if len(strings.TrimSpace(dir)) == 0 { - continue - } - - files, err := ioutil.ReadDir(dir) - if err != nil { - if _, ok := err.(*os.PathError); ok { - o.Log.Warnf("Unable to read directory %q from your PATH: %v. Skipping...", dir, err) - continue - } - - pluginErrors = append(pluginErrors, fmt.Errorf("error: unable to read directory %q in your PATH: %v", dir, err)) - continue - } - - for _, f := range files { - if f.IsDir() { - continue - } - if !hasValidPrefix(f.Name(), ValidPluginFilenamePrefixes) { - continue - } - - if isFirstFile { - fmt.Fprintf(os.Stdout, "The following compatible plugins are available:\n") - pluginsFound = true - isFirstFile = false - } - - pluginPath := f.Name() - if !o.NameOnly { - pluginPath = filepath.Join(dir, pluginPath) +func NewCmdPluginRepoList(f factory.Factory) *cobra.Command { + log := f.GetLog() + cmd := &cobra.Command{ + Use: "list", + Short: "list plugin repositories", + Aliases: []string{"ls"}, + Run: func(cobraCmd *cobra.Command, args []string) { + f, err := plugin.LoadFile(common.GetDefaultPluginRepoCfg()) + if err != nil || len(f.Repositories) == 0 { + log.Warnf("no repositories to show") + return } - pluginname := strings.Split(f.Name(), "-")[1] - o.Log.Infof("%s %s", pluginname, pluginPath) - if errs := o.Verifier.Verify(filepath.Join(dir, f.Name())); len(errs) != 0 { - for _, err := range errs { - o.Log.Warnf(" - %s\n", err) - pluginWarnings++ + switch strings.ToLower(listoutput) { + case "json": + output.EncodeJSON(os.Stdout, f.Repositories) + case "yaml": + output.EncodeYAML(os.Stdout, f.Repositories) + default: + log.Infof("上次变更时间: %v", f.Generated) + table := uitable.New() + table.AddRow("NAME", "URL") + for _, re := range f.Repositories { + table.AddRow(re.Name, re.Url) } + output.EncodeTable(os.Stdout, table) } - } - } - - if !pluginsFound { - pluginErrors = append(pluginErrors, fmt.Errorf("error: unable to find any ergo plugins in your PATH")) - } - - if pluginWarnings > 0 { - if pluginWarnings == 1 { - pluginErrors = append(pluginErrors, fmt.Errorf("error: one plugin warning was found")) - } else { - pluginErrors = append(pluginErrors, fmt.Errorf("error: %v plugin warnings were found", pluginWarnings)) - } - } - if len(pluginErrors) > 0 { - errs := bytes.NewBuffer(nil) - return fmt.Errorf("%s", errs.String()) + }, } - - return nil -} - -// PathVerifier receives a path and determines if it is valid or not -type PathVerifier interface { - // Verify determines if a given path is valid - Verify(path string) []error -} - -type CommandOverrideVerifier struct { - root *cobra.Command - seenPlugins map[string]string + cmd.PersistentFlags().StringVarP(&listoutput, "output", "o", "", "prints the output in the specified format. Allowed values: table, json, yaml (default table)") + return cmd } -func (v *CommandOverrideVerifier) Verify(path string) []error { - if v.root == nil { - return []error{fmt.Errorf("unable to verify path with nil root")} - } - - // extract the plugin binary name - segs := strings.Split(path, "/") - binName := segs[len(segs)-1] - - cmdPath := strings.Split(binName, "-") - if len(cmdPath) > 1 { - // the first argument is always "ergo" for a plugin binary - cmdPath = cmdPath[1:] - } - - var errors []error - - if isExec, err := isExecutable(path); err == nil && !isExec { - errors = append(errors, fmt.Errorf("warning: %s identified as a ergo plugin, but it is not executable", path)) - } else if err != nil { - errors = append(errors, fmt.Errorf("error: unable to identify %s as an executable file: %v", path, err)) +func NewCmdPluginRepoAdd(f factory.Factory) *cobra.Command { + o := &plugin.RepoAddOption{ + Log: f.GetLog(), + RepoCfg: common.GetDefaultPluginRepoCfg(), } - - if existingPath, ok := v.seenPlugins[binName]; ok { - errors = append(errors, fmt.Errorf("warning: %s is overshadowed by a similarly named plugin: %s", path, existingPath)) - } else { - v.seenPlugins[binName] = path - } - - if cmd, _, err := v.root.Find(cmdPath); err == nil { - errors = append(errors, fmt.Errorf("warning: %s overwrites existing command: %q", binName, cmd.CommandPath())) + cmd := &cobra.Command{ + Use: "add [NAME] [URL]", + Short: "add plugin repo", + Args: require.ExactArgs(2), + RunE: func(cobraCmd *cobra.Command, args []string) error { + o.Name = args[0] + o.Url = args[1] + return o.Run() + }, } - - return errors + return cmd } -func isExecutable(fullPath string) (bool, error) { - info, err := os.Stat(fullPath) - if err != nil { - return false, err - } - - if runtime.GOOS == "windows" { - fileExt := strings.ToLower(filepath.Ext(fullPath)) - - switch fileExt { - case ".bat", ".cmd", ".com", ".exe", ".ps1": - return true, nil - } - return false, nil +func NewCmdPluginRepoDel(f factory.Factory) *cobra.Command { + o := &plugin.RepoDelOption{ + Log: f.GetLog(), + RepoCfg: common.GetDefaultPluginRepoCfg(), } - - if m := info.Mode(); !m.IsDir() && m&0111 != 0 { - return true, nil + cmd := &cobra.Command{ + Use: "del [REPO1 [REPO2 ...]]", + Short: "del plugin repo", + Aliases: []string{"rm"}, + Args: require.MinimumNArgs(1), + RunE: func(cobraCmd *cobra.Command, args []string) error { + o.Names = args + return o.Run() + }, } - - return false, nil + return cmd } -// uniquePathsList deduplicates a given slice of strings without -// sorting or otherwise altering its order in any way. -func uniquePathsList(paths []string) []string { - seen := map[string]bool{} - var newPaths []string - for _, p := range paths { - if seen[p] { - continue - } - seen[p] = true - newPaths = append(newPaths, p) +func NewCmdPluginRepoUpdate(f factory.Factory) *cobra.Command { + o := &plugin.RepoUpdateOption{ + Log: f.GetLog(), + RepoCfg: common.GetDefaultPluginRepoCfg(), } - newPaths = append(newPaths, common.GetDefaultBinDir()) - return newPaths -} - -func hasValidPrefix(filepath string, validPrefixes []string) bool { - for _, prefix := range validPrefixes { - if !strings.HasPrefix(filepath, prefix+"-") { - continue - } - return true + cmd := &cobra.Command{ + Use: "update [REPO1 [REPO2 ...]]", + Short: "update plugin repo", + Aliases: []string{"up"}, + RunE: func(cobraCmd *cobra.Command, args []string) error { + o.Names = args + return o.Run() + }, } - return false + return cmd } diff --git a/cmd/root.go b/cmd/root.go index ccc927f2..994d1734 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -9,6 +9,7 @@ import ( "github.com/spf13/cobra" "github.com/ysicing/ergo/cmd/flags" "github.com/ysicing/ergo/common" + "github.com/ysicing/ergo/pkg/ergo/plugin" "github.com/ysicing/ergo/pkg/util/factory" "os" "os/exec" @@ -59,12 +60,14 @@ func BuildRoot(f factory.Factory) *cobra.Command { rootCmd.AddCommand(newOPSCmd(f)) rootCmd.AddCommand(newRepoCmd(f)) rootCmd.AddCommand(newPluginCmd(f)) + rootCmd.AddCommand(newCodeGenCmd(f)) + rootCmd.AddCommand(newCloudCommand(f)) // Add plugin commands args := os.Args if len(args) > 1 { - pluginHandler := NewDefaultPluginHandler(ValidPluginFilenamePrefixes) + pluginHandler := NewDefaultPluginHandler(plugin.ValidPluginFilenamePrefixes) cmdPathPieces := args[1:] if _, _, err := rootCmd.Find(cmdPathPieces); err != nil { diff --git a/common/func.go b/common/func.go index 04f25019..5c844782 100644 --- a/common/func.go +++ b/common/func.go @@ -3,7 +3,10 @@ package common -import "github.com/ergoapi/util/zos" +import ( + "fmt" + "github.com/ergoapi/util/zos" +) func GetDefaultLogDir() string { home := zos.GetHomeDir() @@ -34,3 +37,12 @@ func GetDefaultBinDir() string { home := zos.GetHomeDir() return home + "/" + DefaultBinDir } + +func GetDefaultCfgDir() string { + home := zos.GetHomeDir() + return home + "/" + DefaultCfgDir +} + +func GetDefaultPluginRepoCfg() string { + return fmt.Sprintf("%v/plugin.repo.yaml", GetDefaultCfgDir()) +} diff --git a/common/vars.go b/common/vars.go index 69e7e765..5cb7cca6 100644 --- a/common/vars.go +++ b/common/vars.go @@ -15,4 +15,5 @@ const ( DefaultDataDir = ".ergo/data" DefaultDumpDir = ".ergo/dump" DefaultBinDir = ".ergo/bin" + DefaultCfgDir = ".ergo/.config" ) diff --git a/go.mod b/go.mod index 38c8e909..9065bb4f 100644 --- a/go.mod +++ b/go.mod @@ -3,17 +3,21 @@ module github.com/ysicing/ergo go 1.16 require ( + github.com/ProtonMail/go-crypto v0.0.0-20210920160938-87db9fbc61c7 // indirect github.com/aliyun/alibaba-cloud-sdk-go v1.61.1016 github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 github.com/blang/semver v3.5.1+incompatible github.com/ergoapi/util v0.0.7 github.com/fatih/color v1.13.0 // indirect + github.com/go-git/go-git/v5 v5.4.2 github.com/go-logr/logr v1.1.0 // indirect + github.com/gofrs/flock v0.8.1 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/gopasspw/gopass v1.12.8 github.com/gosuri/uitable v0.0.4 github.com/json-iterator/go v1.1.12 // indirect github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 + github.com/kevinburke/ssh_config v1.1.0 // indirect github.com/manifoldco/promptui v0.8.0 github.com/mattn/go-colorable v0.1.11 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect @@ -23,18 +27,19 @@ require ( github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 github.com/pkg/sftp v1.13.4 github.com/rhysd/go-github-selfupdate v1.2.3 + github.com/sergi/go-diff v1.2.0 // indirect github.com/shirou/gopsutil/v3 v3.21.8 github.com/sirupsen/logrus v1.8.1 - github.com/sohaha/zlsgo v0.1.65 github.com/spf13/cobra v1.2.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.8.1 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.222 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.268 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.222 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.268 // indirect github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/lighthouse v1.0.222 github.com/ulikunitz/xz v0.5.10 // indirect github.com/wangle201210/githubapi v0.0.0-20200804144924-cde7bbdc36ab - github.com/ysicing/ext v0.0.0-20201215110233-f154cb6815c6 + github.com/xanzy/ssh-agent v0.3.1 // indirect golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 golang.org/x/net v0.0.0-20211011170408-caeb26a5c8c0 // indirect golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1 // indirect @@ -44,8 +49,8 @@ require ( gopkg.in/natefinch/lumberjack.v2 v2.0.0 helm.sh/helm/v3 v3.7.0 k8s.io/apimachinery v0.22.2 - k8s.io/klog/v2 v2.20.0 + k8s.io/klog/v2 v2.20.0 // indirect k8s.io/kubectl v0.22.2 k8s.io/utils v0.0.0-20210820185131-d34e5cb4466e // indirect - sigs.k8s.io/yaml v1.3.0 + sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index b36e5003..5a06db30 100644 --- a/go.sum +++ b/go.sum @@ -65,11 +65,12 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ 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/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= @@ -83,6 +84,8 @@ github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugX github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.0 h1:Elr9Wn+sGKPlkaBvwu4mTrxtmOp3F3yV9qhaHbXGjwU= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= @@ -90,21 +93,26 @@ github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg3 github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.18 h1:cYnKADiM1869gvBpos3YCteeT6sZLB48lB5dmMMs8Tg= github.com/Microsoft/hcsshim v0.8.18/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/ProtonMail/go-crypto v0.0.0-20210920160938-87db9fbc61c7 h1:DSqTh6nEes/uO8BlNcGk8PzZsxY2sN9ZL//veWBdTRI= +github.com/ProtonMail/go-crypto v0.0.0-20210920160938-87db9fbc61c7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= +github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -113,29 +121,28 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/aliyun/alibaba-cloud-sdk-go v1.61.1016 h1:XUZJvSEGwL6co52LyuDMCPhP+2xxBXcSEKi+7tOlx9s= github.com/aliyun/alibaba-cloud-sdk-go v1.61.1016/go.mod h1:pUKYbK5JQ+1Dfxk80P0qxGqe5dkxDoabbZS7zOcouyA= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.34.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ= github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= @@ -147,18 +154,23 @@ github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnweb github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/caspr-io/yamlpath v0.0.0-20200722075116-502e8d113a9b/go.mod h1:4rP9T6iHCuPAIDKdNaZfTuuqSIoQQvFctNWIAUI1rlg= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= @@ -172,7 +184,6 @@ github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmE github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -181,7 +192,6 @@ github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:z github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= @@ -195,6 +205,7 @@ github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1 github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1 h1:iJnMvco9XGvKUvNQkv88bE4uJXxRQH18efbKo9w5vHQ= github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= @@ -215,6 +226,7 @@ github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09Zvgq github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.4 h1:uPF0og3ByFzDnaStfiQj3fVGTEtaSNyU+bW7GR/nqGA= github.com/containerd/containerd v1.5.4/go.mod h1:sx18RgvW6ABJ4iYUw7Q5x7bgFOAB9B6G7+yO0XBc4zw= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -222,6 +234,7 @@ github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0 h1:UFRRY5JemiAhPZrr/uE0n8fMTLcZsUvySPr1+D7pgr8= github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= @@ -266,9 +279,7 @@ github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/ github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.12+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= @@ -305,34 +316,41 @@ github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8l github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/distribution/distribution/v3 v3.0.0-20210804104954-38ab4c606ee3 h1:rEK0juuU5idazw//KzUcL3yYwUU3DIe2OnfJwjDBqno= github.com/distribution/distribution/v3 v3.0.0-20210804104954-38ab4c606ee3/go.mod h1:gt38b7cvVKazi5XkHvINNytZXgTEntyhtyM3HQz46Nk= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v20.10.7+incompatible h1:pv/3NqibQKphWZiAskMzdz8w0PRbtTaEB+f6NwdU7Is= github.com/docker/cli v20.10.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v17.12.0-ce-rc1.0.20200618181300-9dc6525e6118+incompatible h1:iWPIG7pWIsCwT6ZtHnTUpoVMnete7O/pzd9HFE3+tn8= github.com/docker/docker v17.12.0-ce-rc1.0.20200618181300-9dc6525e6118+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -343,6 +361,7 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/ergoapi/util v0.0.7 h1:LPV58EJpQSrj4XjBZ/ro4o/E0exSUvYsDTQAfPL46xE= github.com/ergoapi/util v0.0.7/go.mod h1:3SqkBz3WzRJ4SCSrlLS0Ij5wBKO9TTQMg752ud4KCSg= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= @@ -350,31 +369,41 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7 h1:LofdAjjjqCSXMwLGgOgnE+rdPuvX9DxCqaHwKy7i/ko= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= +github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2SubfXjIWgci8= +github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= +github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4= +github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= @@ -389,22 +418,19 @@ github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.0.0-rc1.0.20201106042948-366879b11047/go.mod h1:5vuHXNtFf+1fp29A6Sp2CbognqHbLhHevgQvkyMooXo= github.com/gobuffalo/logger v1.0.3/go.mod h1:SoeejUwldiS7ZsyCBphOGURmWdwUFXs0J7TCjEhjKxM= github.com/gobuffalo/packd v1.0.0/go.mod h1:6VTc4htmJRFB7u1m/4LeMTWjFoYrUiBkU9Fdec9hrhI= github.com/gobuffalo/packr/v2 v2.8.1/go.mod h1:c/PLlOuTU+p3SybaJATW3H6lX/iK7xEz5OeMf+NnJpg= @@ -417,11 +443,11 @@ github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godror/godror v0.24.2/go.mod h1:wZv/9vPiUib6tkoDl+AZ/QLf5YZgMravZ7jxH2eQWAE= github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= @@ -437,6 +463,7 @@ github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -464,12 +491,12 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= +github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k= github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= -github.com/gomodule/redigo v1.8.3/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -511,6 +538,7 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -522,24 +550,25 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= +github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/gopasspw/gopass v1.12.8 h1:CLgXa3DsB53Iurl0TmCoYDcpurPDflMgpF/pWX54VDs= github.com/gopasspw/gopass v1.12.8/go.mod h1:W3HrbqzxFvwh5s6gBnatstm70gnB2/gENirqhLeinkw= github.com/gopasspw/pinentry v0.0.2/go.mod h1:lR1WuNI96rXXBCgM601Ima3acnX3ZSPthIAuG6lHa68= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16vt0PJo= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -549,9 +578,7 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -566,7 +593,6 @@ github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerX github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -580,21 +606,22 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf h1:WfD7VjIE6z8dIvMsI4/s+1qr5EL+zoIGev1BQj1eoJ8= github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf/go.mod h1:hyb9oH7vZsitZCiBt0ZvifOrB+qc8PS5IiilCIb87rg= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -603,14 +630,13 @@ github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeY github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jsimonetti/pwscheme v0.0.0-20160922125227-76804708ecad/go.mod h1:alT8eQtqtVCsVweGnMnfJcjNkTcmWbuVn+lYaBtBl9E= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -628,11 +654,15 @@ github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1 github.com/karrick/godirwalk v1.15.8/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= 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/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= +github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13 h1:eSvu8Tmq6j2psUJqJrLcWH6K3w5Dwc+qipbaA6eVEN4= github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -653,16 +683,13 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a h1:weJVJJRzAJBFRlAiJQROKQs8oC9vOxvm4rZmBBk0ONw= github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= @@ -670,6 +697,7 @@ github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPK github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/manifoldco/promptui v0.8.0 h1:R95mMF+McvXZQ7j1g8ucVZE1gLP3Sv6j9vlF9kyRqQo= github.com/manifoldco/promptui v0.8.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ= @@ -678,6 +706,8 @@ github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2 github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/martinhoefling/goxkcdpwgen v0.0.0-20190331205820-7dc3d102eca3/go.mod h1:4HvZROUEazha3RDnoBcxQlwcIbQfwx035roFOMnICSE= +github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -697,9 +727,9 @@ github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4 github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.11/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-sqlite3 v1.14.3/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= 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= @@ -728,10 +758,12 @@ github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1 h1:1O+1cHA1aujwEwwVMa2Xm2l+gIpUHyd3+D+d7LZh1kM= github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= @@ -745,7 +777,9 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/muesli/crunchy v0.4.0 h1:qdiml8gywULHBsztiSAf6rrE6EyuNasNKZ104mAaahM= @@ -755,19 +789,10 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= @@ -775,7 +800,6 @@ github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6 github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -784,24 +808,25 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc93 h1:x2UMpOOVf3kQ8arv/EsDGwim8PTNqzL1/EYDr/+scOM= github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= @@ -811,35 +836,23 @@ github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.m github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.12.0/go.mod h1:fUqqXB5vEgVCZ131L+9say31RAri6aF6KDViawhxKK8= github.com/pkg/sftp v1.13.4 h1:Lb0RYJCmgUcBgZosfoi9Y9sbl6+LJgOIgk/2Y4YjMFg= github.com/pkg/sftp v1.13.4/go.mod h1:LzqnAvaD5TWeNBsZpfKxSYn1MbjWwOsCIAFFJbpIsK8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -848,34 +861,28 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.8.0/go.mod h1:O9VU6huf47PktckDQfMTX0Y8tY0/7TSWwj+ITvv0TnM= +github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -884,9 +891,9 @@ github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rhysd/go-github-selfupdate v1.2.3 h1:iaa+J202f+Nc+A8zi75uccC8Wg3omaM7HDeimXA22Ag= github.com/rhysd/go-github-selfupdate v1.2.3/go.mod h1:mp/N8zj6jFfBQy/XMYoWsmfzxazpPAODuqarmPDe2Rg= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= @@ -906,12 +913,13 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/closestmatch v0.0.0-20190308193919-1fbe626be92e/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil/v3 v3.21.8 h1:nKct+uP0TV8DjjNiHanKf8SAuub+GNsbrOtM9Nl9biA= github.com/shirou/gopsutil/v3 v3.21.8/go.mod h1:YWp/H8Qs5fVmf17v7JNZzA0mPJ+mS2e9JdiUF9LlKzQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -931,11 +939,8 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/sohaha/zlsgo v0.1.65 h1:Eb8Hx6A+xsE3VkP2FodDikZLIsGNbhPupjbrYGThIMA= -github.com/sohaha/zlsgo v0.1.65/go.mod h1:8jszf9qU6E2SJTQjxJ1LYKI717Zwa5YZx1gG0dxsukA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= @@ -966,12 +971,10 @@ github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -990,11 +993,14 @@ github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tcnksm/go-gitconfig v0.1.2 h1:iiDhRitByXAEyjgBqsKi9QU4o2TNtv9kPP3RgPgXBPw= github.com/tcnksm/go-gitconfig v0.1.2/go.mod h1:/8EhP4H7oJZdIPyT+/UIsG87kTzrzM4UsLGSItWYCpE= -github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.222 h1:xnffNoK4IP82m8PD+j9IiygzovPqs2zOANr401dSD74= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.222/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.268 h1:DvPYmsX7rc4m3En27c85xeV7jwxuI2jojTQkvm4uQqM= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.268/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.222 h1:zzLAaWLjKx6hIy7pGpd6n32Ks4t8cJUS2yI1Ga8nhGU= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.222/go.mod h1:AqyM/ZZMD7q5mHBqNY9YImbSpEpoEe7E/vrTbUWX+po= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.268 h1:m5AhFk57uEcN3hwrYHQFZ2H11RgVz65lTfD5/vXMW1w= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.268/go.mod h1:CuOaLxOQr477GhMWAQPYQFUJrsZbW+ZqkAgP2uHDZXg= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/lighthouse v1.0.222 h1:y6GsLaCdXZf9H6V+rQC1jQiFCYVuxEGAv5kNJguKxLc= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/lighthouse v1.0.222/go.mod h1:r8txjlw4DjLDZFOpnPC/hOFHr1VckZc0jjBK6XIFLP0= github.com/tklauser/go-sysconf v0.3.9 h1:JeUVdAOWhhxVcU6Eqr/ATFHgXk/mmiItdKeJPev3vTo= @@ -1005,8 +1011,6 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.10 h1:t92gobL9l3HE202wg3rlk19F6X+JOxl9BBrCCMYEYd8= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -1027,32 +1031,36 @@ github.com/wangle201210/githubapi v0.0.0-20200804144924-cde7bbdc36ab h1:hrH9dIGD github.com/wangle201210/githubapi v0.0.0-20200804144924-cde7bbdc36ab/go.mod h1:d7doaMnxIG6+QBlwFcvkwE2hG/yT+6rZ8+lH1aFgOK4= github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +github.com/xanzy/ssh-agent v0.3.1 h1:AmzO1SSWxw73zxFZPRwaMN1MohDw8UyHnmuxyceTEGo= +github.com/xanzy/ssh-agent v0.3.1/go.mod h1:QIE4lCeL7nkC25x+yA3LBIYfwCc1TFziCtG7cBAac6w= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20170218160415-a3153f7040e9/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -github.com/ysicing/ext v0.0.0-20201215110233-f154cb6815c6 h1:+BSAqgpJOMgeqtGcbP4UJq1mlxrGG5GEcWNi7AejYDU= -github.com/ysicing/ext v0.0.0-20201215110233-f154cb6815c6/go.mod h1:H05X9J/TnWz1rDmNzU9MQMIgq9B/0w/GkytudqaX3VA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= @@ -1062,14 +1070,13 @@ go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3M go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= @@ -1083,26 +1090,21 @@ go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -1118,12 +1120,12 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -1171,7 +1173,6 @@ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1212,6 +1213,7 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -1243,6 +1245,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1280,7 +1283,6 @@ golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1313,7 +1315,6 @@ golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1331,6 +1332,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1366,7 +1368,6 @@ golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/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-20180828015842-6cd1fcedba52/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-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1386,8 +1387,6 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1397,7 +1396,6 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1433,7 +1431,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1457,7 +1454,6 @@ google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBz google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1473,7 +1469,6 @@ google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -1513,15 +1508,13 @@ google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= @@ -1541,6 +1534,7 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1568,7 +1562,6 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= @@ -1584,6 +1577,7 @@ gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76 gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1600,9 +1594,6 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/sqlite v1.1.3/go.mod h1:AKDgRWk8lcSQSw+9kxCJnX/yySj8G3rdwYlU57cB45c= -gorm.io/gorm v1.20.1/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -gorm.io/gorm v1.20.8/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= @@ -1610,7 +1601,6 @@ gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= helm.sh/helm/v3 v3.7.0 h1:jRZCCdrOEfJI1LgStRAbmDJQkAwZkFy6gr4OlwrE2Ro= helm.sh/helm/v3 v3.7.0/go.mod h1:DajHtQTe8KrjNmvy5gxWkosFKaADrS3uRS5EkDtsmI4= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1636,6 +1626,7 @@ k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= k8s.io/apiserver v0.22.1/go.mod h1:2mcM6dzSt+XndzVQJX21Gx0/Klo7Aen7i0Ai6tIa400= k8s.io/cli-runtime v0.22.1/go.mod h1:YqwGrlXeEk15Yn3em2xzr435UGwbrCw5x+COQoTYfoo= +k8s.io/cli-runtime v0.22.2 h1:fsd9rFk9FSaVq4SUq1fM27c8CFGsYZUJ/3BkgmjYWuY= k8s.io/cli-runtime v0.22.2/go.mod h1:tkm2YeORFpbgQHEK/igqttvPTRIHFRz5kATlw53zlMI= k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= @@ -1665,6 +1656,7 @@ k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/klog/v2 v2.20.0 h1:tlyxlSvd63k7axjhuchckaRJm+a92z5GSOrTOQY5sHw= k8s.io/klog/v2 v2.20.0/go.mod h1:Gm8eSIfQN6457haJuPaMxZw4wyP5k+ykPFlrhQDvhvw= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e h1:KLHHjkdQFomZy8+06csTWZ0m1343QqxZhR2LJ1OxCYM= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kubectl v0.22.1/go.mod h1:mjAOgEbMNMtZWxnfM6jd+nPjPsaoLqO5xanc78WcSbw= k8s.io/kubectl v0.22.2 h1:KMyYNZoBshaL3XKx04X07DtpoD4vMrdkfiN/G2Qx/PU= @@ -1677,8 +1669,10 @@ k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210820185131-d34e5cb4466e h1:ldQh+neBabomh7+89dTpiFAB8tGdfVmuIzAHbvtl+9I= k8s.io/utils v0.0.0-20210820185131-d34e5cb4466e/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +oras.land/oras-go v0.4.0 h1:u6+7D+raZDYHwlz/uOwNANiRmyYDSSMW7A9E1xXycUQ= oras.land/oras-go v0.4.0/go.mod h1:VJcU+VE4rkclUbum5C0O7deEZbBYnsnpbGSACwTjOcg= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/letsencrypt v0.0.3 h1:H7xDfhkaFFSYEJlKeq38RwX2jYcnTeHuDQyT+mMNMwM= rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= @@ -1686,9 +1680,11 @@ rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/kustomize/api v0.8.11 h1:LzQzlq6Z023b+mBtc6v72N2mSHYmN8x7ssgbf/hv0H8= sigs.k8s.io/kustomize/api v0.8.11/go.mod h1:a77Ls36JdfCWojpUqR6m60pdGY1AYFix4AH83nJtY1g= sigs.k8s.io/kustomize/cmd/config v0.9.13/go.mod h1:7547FLF8W/lTaDf0BDqFTbZxM9zqwEJqCKN9sSR0xSs= sigs.k8s.io/kustomize/kustomize/v4 v4.2.0/go.mod h1:MOkR6fmhwG7hEDRXBYELTi5GSFcLwfqwzTRHW3kv5go= +sigs.k8s.io/kustomize/kyaml v0.11.0 h1:9KhiCPKaVyuPcgOLJXkvytOvjMJLoxpjodiycb4gHsA= sigs.k8s.io/kustomize/kyaml v0.11.0/go.mod h1:GNMwjim4Ypgp/MueD3zXHLRJEjz7RvtPae0AwlvEMFM= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= @@ -1698,4 +1694,3 @@ sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/pkg/ergo/cloud/aliyun/dns.go b/pkg/ergo/cloud/aliyun/dns.go new file mode 100644 index 00000000..3f0de194 --- /dev/null +++ b/pkg/ergo/cloud/aliyun/dns.go @@ -0,0 +1,51 @@ +// AGPL License +// Copyright (c) 2021 ysicing + +package aliyun + +import ( + "context" + "fmt" + "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" + "github.com/aliyun/alibaba-cloud-sdk-go/services/alidns" + "github.com/ysicing/ergo/pkg/ergo/cloud" +) + +func (p *provider) getDnsClient() *alidns.Client { + client, _ := alidns.NewClientWithAccessKey( + "cn-beijing", + p.apikey, + p.apisecret, + ) + return client +} + +func NewDns(opts ...Option) (cloud.DnsCloud, error) { + p := new(provider) + for _, opt := range opts { + opt(p) + } + return p, nil +} + +func (p *provider) DomainList(ctx context.Context) (cloud.DomainList, error) { + c := p.getDnsClient() + request := alidns.CreateDescribeDomainsRequest() + request.Scheme = "https" + request.PageSize = requests.NewInteger(100) + + response, err := c.DescribeDomains(request) + if err != nil { + return nil, fmt.Errorf("An API error has returned: %s", err) + } + var dls cloud.DomainList + p.zlog.Debugf("DomainTotal %v", response.TotalCount) + for _, d := range response.Domains.Domain { + domain := cloud.Domain{ + Name: d.DomainName, + Provider: cloud.ProviderAliyun.Value(), + } + dls = append(dls, domain) + } + return dls, nil +} diff --git a/pkg/ergo/cloud/aliyun/option.go b/pkg/ergo/cloud/aliyun/option.go new file mode 100644 index 00000000..ab61133a --- /dev/null +++ b/pkg/ergo/cloud/aliyun/option.go @@ -0,0 +1,27 @@ +// AGPL License +// Copyright (c) 2021 ysicing + +package aliyun + +import "github.com/ysicing/ergo/pkg/util/log" + +type Option func(*provider) + +func WithApi(key, secret string) Option { + return func(p *provider) { + p.apikey = key + p.apisecret = secret + } +} + +func WithRegion(region string) Option { + return func(p *provider) { + p.region = region + } +} + +func WithLog(log log.Logger) Option { + return func(p *provider) { + p.zlog = log + } +} diff --git a/pkg/ergo/cloud/aliyun/provider.go b/pkg/ergo/cloud/aliyun/provider.go new file mode 100644 index 00000000..8e35c66c --- /dev/null +++ b/pkg/ergo/cloud/aliyun/provider.go @@ -0,0 +1,17 @@ +// AGPL License +// Copyright (c) 2021 ysicing + +package aliyun + +import ( + "github.com/ysicing/ergo/pkg/util/log" + "sync" +) + +type provider struct { + init sync.Once + region string + apikey string + apisecret string + zlog log.Logger +} diff --git a/pkg/ergo/cloud/dns/ali.go b/pkg/ergo/cloud/dns/ali.go index 402f946b..331b6ad4 100644 --- a/pkg/ergo/cloud/dns/ali.go +++ b/pkg/ergo/cloud/dns/ali.go @@ -7,7 +7,6 @@ import ( "encoding/json" "github.com/aliyun/alibaba-cloud-sdk-go/services/alidns" "github.com/spf13/viper" - "k8s.io/klog/v2" "log" ) @@ -25,7 +24,7 @@ func NewAliDns(region, akey, asecret string) *AliDns { } client, err := alidns.NewClientWithAccessKey(region, akey, asecret) if err != nil { - klog.Fatal(err) + log.Fatal(err) return nil } return &AliDns{client: client} diff --git a/pkg/ergo/cloud/provider.go b/pkg/ergo/cloud/provider.go new file mode 100644 index 00000000..bacde09d --- /dev/null +++ b/pkg/ergo/cloud/provider.go @@ -0,0 +1,46 @@ +// AGPL License +// Copyright (c) 2021 ysicing + +package cloud + +import "context" + +type ProviderType string + +func (s ProviderType) Value() string { + return string(s) +} + +const ( + ProviderAliyun = ProviderType("aliyun") + ProviderQcloud = ProviderType("qcloud") +) + +var CloudType = []struct { + Key string + Value string +}{ + { + Key: "aliyun", + Value: "阿里云", + }, { + Key: "qcloud", + Value: "腾讯云", + }, + { + Key: "all", + Value: "所有云服务商", + }, +} + +// DnsCloud cloud dns +type DnsCloud interface { + DomainList(ctx context.Context) (DomainList, error) +} + +type Domain struct { + Name string `json:"name" yaml:"name"` + Provider string `json:"provider" yaml:"provider"` +} + +type DomainList []Domain diff --git a/pkg/ergo/cloud/qcloud/dns.go b/pkg/ergo/cloud/qcloud/dns.go new file mode 100644 index 00000000..e189c3b3 --- /dev/null +++ b/pkg/ergo/cloud/qcloud/dns.go @@ -0,0 +1,55 @@ +// AGPL License +// Copyright (c) 2021 ysicing + +package qcloud + +import ( + "context" + "fmt" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" + "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile" + dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323" + "github.com/ysicing/ergo/pkg/ergo/cloud" +) + +func NewDns(opts ...Option) (cloud.DnsCloud, error) { + p := new(provider) + for _, opt := range opts { + opt(p) + } + return p, nil +} + +func (p *provider) getDomainClient() *dnspod.Client { + credential := common.NewCredential( + p.apikey, + p.apisecret, + ) + cpf := profile.NewClientProfile() + cpf.HttpProfile.Endpoint = "dnspod.tencentcloudapi.com" + client, _ := dnspod.NewClient(credential, "", cpf) + return client +} + +func (p *provider) DomainList(ctx context.Context) (cloud.DomainList, error) { + c := p.getDomainClient() + request := dnspod.NewDescribeDomainListRequest() + response, err := c.DescribeDomainList(request) + if _, ok := err.(*errors.TencentCloudSDKError); ok { + return nil, fmt.Errorf("api error has returned: %s", err) + } + if err != nil { + return nil, err + } + var dls cloud.DomainList + p.zlog.Debugf("DomainTotal %v", *response.Response.DomainCountInfo.DomainTotal) + for _, d := range response.Response.DomainList { + domain := cloud.Domain{ + Name: *d.Name, + Provider: cloud.ProviderQcloud.Value(), + } + dls = append(dls, domain) + } + return dls, nil +} diff --git a/pkg/ergo/cloud/qcloud/option.go b/pkg/ergo/cloud/qcloud/option.go new file mode 100644 index 00000000..1a3d95bb --- /dev/null +++ b/pkg/ergo/cloud/qcloud/option.go @@ -0,0 +1,27 @@ +// AGPL License +// Copyright (c) 2021 ysicing + +package qcloud + +import "github.com/ysicing/ergo/pkg/util/log" + +type Option func(*provider) + +func WithApi(key, secret string) Option { + return func(p *provider) { + p.apikey = key + p.apisecret = secret + } +} + +func WithRegion(region string) Option { + return func(p *provider) { + p.region = region + } +} + +func WithLog(log log.Logger) Option { + return func(p *provider) { + p.zlog = log + } +} diff --git a/pkg/ergo/cloud/qcloud/provider.go b/pkg/ergo/cloud/qcloud/provider.go new file mode 100644 index 00000000..cf14a691 --- /dev/null +++ b/pkg/ergo/cloud/qcloud/provider.go @@ -0,0 +1,17 @@ +// AGPL License +// Copyright (c) 2021 ysicing + +package qcloud + +import ( + "github.com/ysicing/ergo/pkg/util/log" + "sync" +) + +type provider struct { + init sync.Once + region string + apikey string + apisecret string + zlog log.Logger +} diff --git a/pkg/ergo/codegen/init.go b/pkg/ergo/codegen/init.go index 5135bc94..57f947e5 100644 --- a/pkg/ergo/codegen/init.go +++ b/pkg/ergo/codegen/init.go @@ -4,47 +4,150 @@ package codegen import ( - "errors" + "bytes" "fmt" - "github.com/sohaha/zlsgo/zshell" - "github.com/ysicing/ext/utils/exfile" + "github.com/ergoapi/util/file" + "github.com/ergoapi/util/zos" + "github.com/ergoapi/util/ztime" + "github.com/go-git/go-git/v5" + "github.com/manifoldco/promptui" + "github.com/ysicing/ergo/common" + "github.com/ysicing/ergo/pkg/util/log" + "github.com/ysicing/ergo/pkg/util/ssh" + "os" + "strings" + "text/template" ) -// COPY zzz https://github.com/sohaha/zzz/blob/master/cmd/init.go +var CodeType = []struct { + Key string + Value string +}{ + { + Key: "go", + Value: "go", + }, + { + Key: "crd", + Value: "crd", + }, +} + +type CodeGen struct { + Log log.Logger +} + +var Project = []struct { + Name string + Url string + Slug string + Branch string +}{{ + Name: "ysicing/go-example", + Url: "https://github.com/ysicing/go-example.git", + Slug: "github.com/ysicing", + Branch: "master", +}, +} -type ( - stInitConf struct { - Command []string - Dir string +func (code CodeGen) GoClone() error { + project := promptui.Select{ + Label: "项目", + Items: Project, + Searcher: func(input string, index int) bool { + p := Project[index] + name := strings.Replace(strings.ToLower(p.Name), " ", "", -1) + input = strings.Replace(strings.ToLower(input), " ", "", -1) + return strings.Contains(name, input) + }, + Size: 4, + Templates: &promptui.SelectTemplates{ + Label: "{{ . }}", + Active: "\U0001F449 {{ .Name | cyan }}", + Inactive: " {{ .Name | cyan }}", + Selected: "\U0001F389 {{ .Name | red | cyan }}", + }, } -) + pid, _, _ := project.Run() + p := Project[pid] + gopath := zos.GetEnv("GOPATH", zos.GetHomeDir()+"/go") + code.Log.Debugf("GoPath: %v", gopath) + nameprompt := promptui.Prompt{ + Label: "项目名, eg: ysicing/goexample", + } + name, _ := nameprompt.Run() + if name == "" { + s := strings.Split(p.Url, "/") + name = fmt.Sprintf("%v/%v", s[len(s)-2], s[len(s)-1]) + name = strings.ReplaceAll(name, ".git", "") + } + dir := fmt.Sprintf("%v/%v/%v", gopath, "github.com", name) + if _, err := git.PlainClone(dir, false, &git.CloneOptions{ + URL: p.Url, + RemoteName: p.Branch, + SingleBranch: true, + Depth: 1, + RecurseSubmodules: git.DefaultSubmoduleRecursionDepth, + Progress: os.Stdout, + }); err != nil { + return err + } + file.Rmdir(dir + "/.git") + code.Log.Donef("\U0001F389 Start Git Clone %v %v", p.Url, dir) + return nil +} + +type Crds struct { + Path string + Name string + Domain string + License string + Owner string + Multigroup bool +} + +const crdshell = `#!/bin/bash +mkdir -p {{ .Path }} +pushd {{ .Path }} +kubebuilder init --domain {{ .Domain }} --repo {{ .Domain }}/{{ .Owner }}/{{ .Name }} --license {{ .License }} --owner "{{ .Owner }}" --project-name {{ .Name }} --skip-go-version-check +kubebuilder edit --multigroup={{ .Multigroup }} +kubebuilder create api --group apps --version v1beta1 --kind Dubbo +# 已存在资源 +kubebuilder create api --group core --version v1 --kind Service --resource=false +popd +` -var conf stInitConf - -func Clone(dir, name, branch string, mirror bool) (err error) { - var url string - url = "https://github.com/" + name - if mirror { - url = "https://gitee.com/" + name - } - code := 0 - outStr := "" - errStr := "" - cmd := fmt.Sprintf("git clone -b %s --depth=1 %s %s", branch, url, dir) - code, outStr, errStr, err = zshell.Run(cmd) - if code != 0 { - if outStr != "" { - err = errors.New(outStr) - } else if errStr != "" { - err = errors.New(errStr) - } else { - err = errors.New("download failed, please check if the network is normal") - } - } - if err != nil { - return - } - exfile.Rmdir(dir + "/.git") - - return +func (code CodeGen) GenCrds() error { + var c Crds + domainpt := promptui.Prompt{ + Label: "Domain", + } + c.Domain, _ = domainpt.Run() + namept := promptui.Prompt{ + Label: "Name", + } + c.Name, _ = namept.Run() + if len(c.Name) == 0 { + c.Name = zos.GenUUID() + } + gopath := zos.GetEnv("GOPATH", zos.GetHomeDir()+"/go") + code.Log.Debugf("GoPath: %v", gopath) + c.Path = fmt.Sprintf("%v/%v/%v", gopath, c.Domain, c.Name) + c.License = "apache2" + c.Owner = zos.GetUser().Username + c.Multigroup = true + var b bytes.Buffer + t := template.Must(template.New("crds").Parse(crdshell)) + t.Execute(&b, c) + tmpfile := fmt.Sprintf("%v/crds.%v", common.GetDefaultTmpDir(), ztime.NowUnixString()) + file.Writefile(tmpfile, b.String()) + if err := ssh.RunCmd("/bin/bash", tmpfile); err != nil { + code.Log.WriteString(b.String()) + code.Log.Failf("init crd project %v, tmpfile: %v, err: %v", c.Path, tmpfile, err) + return err + } + file.RemoveFiles(tmpfile) + code.Log.Debugf("clean tmp file: %v", tmpfile) + code.Log.Donef("init crd project: %v", c.Path) + return nil } diff --git a/pkg/ergo/config/config.go b/pkg/ergo/config/config.go deleted file mode 100644 index 4ed4d408..00000000 --- a/pkg/ergo/config/config.go +++ /dev/null @@ -1,31 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package config - -import ( - "github.com/ysicing/ext/utils/exfile" - "k8s.io/klog/v2" - "sigs.k8s.io/yaml" -) - -//Config 配置文件 -type Config struct { - global Global `yaml:"global"` -} - -// Global 全局 -type Global struct{} - -func exampleConfig() Config { - return Config{global: Global{}} -} - -// WriteDefaultConfig 生成默认配置文件 -func WriteDefaultConfig(path string) { - cfg, _ := yaml.Marshal(exampleConfig()) - err := exfile.WriteFile(path, string(cfg)) - if err != nil { - klog.Errorf("write default config %v, err: %v", path, err) - } -} diff --git a/pkg/ergo/helm/crdsvc.go b/pkg/ergo/helm/crdsvc.go deleted file mode 100644 index 0aeb55c6..00000000 --- a/pkg/ergo/helm/crdsvc.go +++ /dev/null @@ -1,55 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package helm - -const ali_kubernetes_cronhpa_controller = ` -#!/bin/bash - -kubectl apply -f https://gitee.com/ysicing/helminit/raw/master/yaml/ali_kubernetes_cronhpa_controller.yaml -` - -const xali_kubernetes_cronhpa_controller = ` -#!/bin/bash - -kubectl delete -f https://gitee.com/ysicing/helminit/raw/master/yaml/ali_kubernetes_cronhpa_controller.yaml -` - -const tekton = ` -#!/bin/bash - -kubectl apply -f https://gitee.com/ysicing/helminit/raw/master/yaml/tekton-releases-v0.17.1.yaml -` - -const xtekton = ` -#!/bin/bash - -kubectl delete -f https://gitee.com/ysicing/helminit/raw/master/yaml/tekton-releases-v0.17.1.yaml -` - -const metrics_server = ` -#!/bin/bash - -kubectl apply -f https://gitee.com/ysicing/helminit/raw/master/yaml/metrics-server-0.4.1.yaml -` - -const xmetrics_server = ` -#!/bin/bash - -kubectl delete -f https://gitee.com/ysicing/helminit/raw/master/yaml/metrics-server-0.4.1.yaml -` - -const kubernetes_dashboard = ` -#!/bin/bash - -kubectl apply -f https://gitee.com/ysicing/helminit/raw/master/yaml/k8s-dashboard.2.1.0.yaml - -echo "登录节点使用kdtoken获取token" -echo "访问使用kubectl port-forward --namespace kubernetes-dashboard service/kubernetes-dashboard 10443:443" -` - -const xkubernetes_dashboard = ` -#!/bin/bash - -kubectl delete -f https://gitee.com/ysicing/helminit/raw/master/yaml/k8s-dashboard.2.1.0.yaml -` diff --git a/pkg/ergo/helm/helmsvc.go b/pkg/ergo/helm/helmsvc.go deleted file mode 100644 index af64fb1c..00000000 --- a/pkg/ergo/helm/helmsvc.go +++ /dev/null @@ -1,83 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package helm - -// https://github.com/bitnami/charts/tree/master/bitnami/nginx-ingress-controller - -const nginxIngressController = ` -#!/bin/bash - -helminit - -kubectl create ns nginx-ingress - -helm upgrade -i nginx-ingress-controller -f %v/master/nginx-ingress-controller/values.yaml -n nginx-ingress bitnami/nginx-ingress-controller --version 7.4.1 - -# helm upgrade -i nginx-ingress-controller -f https://gitee.com/ysicing/helminit/raw/master/nginx-ingress-controller/values.yaml -n nginx-ingress bitnami/nginx-ingress-controller --version 7.4.1 - -# helm upgrade -i nginx-ingress-controller -f https://raw.githubusercontent.com/ysicing/helminit/master/nginx-ingress-controller/values.yaml -n nginx-ingress bitnami/nginx-ingress-controller --version 7.4.1 - -# helm upgrade -i flagger -f %v/master/flagger/values.yaml flagger/flagger -n nginx-ingress --version 1.6.2 -` - -const xnginxIngressController = ` -#!/bin/bash - -helm delete nginx-ingress-controller -n nginx-ingress -helm delete flagger -n nginx-ingress -` - -// https://github.com/bitnami/charts/tree/master/bitnami/metallb - -const metallb = ` -#!/bin/bash - -helminit - -kubectl create ns metallb-system - -helm upgrade -i metallb -f %v/master/metallb/values.yaml -n metallb-system bitnami/metallb --version 2.2.0 -` - -const xmetallb = ` -#!/bin/bash - -helm delete metallb -n metallb-system -` - -const etcd = ` -#!/bin/bash - -helminit - -kubectl create ns ops - -helm upgrade -i etcd -f %v/master/etcd/values.yaml -n ops bitnami/etcd --version 5.6.0 -` - -const xetcd = ` -#!/bin/bash - -helm delete etcd -n ops -` - -const cm = ` -#!/bin/bash - -helminit - -kubectl create ns cert-manager -helminit || ( - helm repo add jetstack https://charts.jetstack.io - helm repo update -) - -helm upgrade -i cert-manager -n cert-manager -f %v/master/cert-manager/values.yaml --version v1.1.0 jetstack/cert-manager -` - -const xcm = ` -#!/bin/bash - -helm delete cert-manager -n cert-manager -` diff --git a/pkg/ergo/helm/install.go b/pkg/ergo/helm/install.go deleted file mode 100644 index 8823d887..00000000 --- a/pkg/ergo/helm/install.go +++ /dev/null @@ -1,155 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package helm - -import ( - "fmt" - sshutil "github.com/ysicing/ergo/pkg/util/ssh" - "github.com/ysicing/ext/utils/exfile" - "github.com/ysicing/ext/utils/exmisc" - "github.com/ysicing/ext/utils/extime" - "k8s.io/klog/v2" - "os" -) - -const ( - helminit = `#!/bin/bash - -[ -f "/usr/local/bin/helminit" ] || ( -cat > /usr/local/bin/helminit < 0 && uninstall[0] { - xinstall = true - } - switch packagename { - case "nginx-ingress-controller", "default-ingress": - if xinstall { - return xnginxIngressController, nil - } - return nginxIngressController, nil - case "lb", "slb", "metallb": - if xinstall { - return xmetallb, nil - } - return metallb, nil - case "cronhpa", "ali-cronhpa", "kubernetes-cronhpa-controller": - if xinstall { - return xali_kubernetes_cronhpa_controller, nil - } - return ali_kubernetes_cronhpa_controller, nil - case "tkn", "tekton": - if xinstall { - return xtekton, nil - } - return tekton, nil - case "kubernetes_dashboard", "kd": - if xinstall { - return xkubernetes_dashboard, nil - } - return kubernetes_dashboard, nil - case "metrics-server", "ms", "kms": - if xinstall { - return xmetrics_server, nil - } - return metrics_server, nil - case "etcd": - if xinstall { - return xetcd, nil - } - return etcd, nil - case "cm", "cert-manager": - if xinstall { - return xcm, nil - } - return cm, nil - default: - return "", fmt.Errorf("%v 不支持哟", exmisc.SRed(packagename)) - } -} - -type Mirror struct { - URL string -} - -func HelmInstall(ssh sshutil.SSH, ip string, packagename string, local bool, isinstall bool, isgithub bool) { - helm, err := gethelm(packagename, isinstall) - if err != nil { - fmt.Println(err.Error()) - return - } - url := GiteeMirror - if isgithub { - url = GithubMirror - } - data := fmt.Sprintf(helm, url) - if len(ip) != 0 { - if err := ssh.CmdAsync(ip, data); err != nil { - fmt.Println(err.Error()) - return - } - } else { - tempfile := fmt.Sprintf("/tmp/%v.%v.tmp.sh", packagename, extime.NowUnix()) - err := exfile.WriteFile(tempfile, data) - if err != nil { - klog.Errorf("write file %v, err: %v", tempfile, err) - os.Exit(-1) - } - if err := sshutil.RunCmd("/bin/bash", tempfile); err != nil { - fmt.Println(err.Error()) - return - } - } -} - -// HelmInit helminit -func HelmInit(ssh sshutil.SSH, ip string, local bool) { - if !local { - if err := ssh.CmdAsync(ip, helminit); err != nil { - fmt.Println(err.Error()) - return - } - } else { - tempfile := fmt.Sprintf("/tmp/helmint.%v.tmp.sh", extime.NowUnix()) - err := exfile.WriteFile(tempfile, helminit) - if err != nil { - klog.Errorf("write file %v, err: %v", tempfile, err) - os.Exit(-1) - } - if err := sshutil.RunCmd("/bin/bash", tempfile); err != nil { - fmt.Println(err.Error()) - return - } - } -} diff --git a/pkg/ergo/k8s/k8s.go b/pkg/ergo/k8s/k8s.go deleted file mode 100644 index f86100ca..00000000 --- a/pkg/ergo/k8s/k8s.go +++ /dev/null @@ -1,51 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package k8s - -import ( - "fmt" - sshutil "github.com/ysicing/ergo/pkg/util/ssh" - "github.com/ysicing/ext/utils/exfile" - "github.com/ysicing/ext/utils/exos" - "github.com/ysicing/ext/utils/extime" - "k8s.io/klog/v2" - "os" -) - -const ( - k8ssh = `docker run -it --net=host --rm -v %v:/root registry.cn-beijing.aliyuncs.com/k7scn/k7s:%v %v %v` -) - -// 安装k8s -func InstallK8s(ssh sshutil.SSH, ip string, local bool, init bool, args, kv string) error { - var sealcfgpath, runk8s string - sealcfgpath = "/root" - if local { - sealcfgpath = exos.GetUser().HomeDir - } - if init { - runk8s = fmt.Sprintf(k8ssh, sealcfgpath, kv, "init", args) - } else { - runk8s = fmt.Sprintf(k8ssh, sealcfgpath, kv, "join", args) - } - klog.V(5).Infof(runk8s) - if !local { - if err := ssh.CmdAsync(ip, runk8s); err != nil { - klog.V(5).Infof("err: %v", err) - return err - } - } else { - tempfile := fmt.Sprintf("/tmp/%v.k8s.tmp.sh", extime.NowUnix()) - err := exfile.WriteFile(tempfile, runk8s) - if err != nil { - klog.Errorf("write file %v, err: %v", tempfile, err) - os.Exit(-1) - } - if err := sshutil.RunCmd("/bin/bash", tempfile); err != nil { - klog.V(5).Infof("err: %v", err) - return err - } - } - return nil -} diff --git a/pkg/ergo/ops/exec/install.go b/pkg/ergo/ops/exec/install.go deleted file mode 100644 index 454b7edd..00000000 --- a/pkg/ergo/ops/exec/install.go +++ /dev/null @@ -1,67 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package exec - -import ( - "fmt" - "github.com/ergoapi/util/file" - "github.com/ergoapi/util/ztime" - sshutil "github.com/ysicing/ergo/pkg/util/ssh" - "k8s.io/klog/v2" - "os" - "sync" -) - -func getpackagessh(packagename string) (string, error) { - switch packagename { - case "w": - return "w", nil - case "docker": - return dockersh, nil - case "mysql": - return mysql, nil - case "redis": - return redis, nil - case "etcd": - return etcd, nil - case "adminer": - return adminer, nil - case "prom": - return prom, nil - case "grafana": - return grafana, nil - case "go": - return goscript, nil - case "node-exporter": - return nodeexpoter, nil - default: - return "", fmt.Errorf("不支持: %v", packagename) - } -} - -func InstallPackage(ssh sshutil.SSH, ip string, packagename string, wg *sync.WaitGroup, local bool) { - defer wg.Done() - runsh, err := getpackagessh(packagename) - if err != nil { - fmt.Println(err.Error()) - return - } - if !local { - if err := ssh.CmdAsync(ip, runsh); err != nil { - fmt.Println(err.Error()) - return - } - } else { - tempfile := fmt.Sprintf("/tmp/%v.tmp.sh", ztime.NowUnix()) - err := file.Writefile(tempfile, runsh) - if err != nil { - klog.Errorf("write file %v, err: %v", tempfile, err) - os.Exit(-1) - } - if err := sshutil.RunCmd("/bin/bash", tempfile); err != nil { - fmt.Println(err.Error()) - return - } - } -} diff --git a/pkg/ergo/ops/exec/types.go b/pkg/ergo/ops/exec/types.go deleted file mode 100644 index 8b54af1e..00000000 --- a/pkg/ergo/ops/exec/types.go +++ /dev/null @@ -1,272 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package exec - -const dockersh = ` - -curl -fsSL https://gitee.com/godu/install/raw/master/docker/get-docker.sh | bash -s docker --mirror Aliyun -mkdir /etc/docker -cat > /etc/docker/daemon.json < ~/svc/db/docker-compose.yaml < ~/svc/redis/docker-compose.yaml < ~/svc/etcd/docker-compose.yaml < ~/svc/adminer/docker-compose.yaml < ~/svc/prom/prometheus.yml < ~/svc/prom/docker-compose.yaml < ~/svc/grafana/docker-compose.yaml <> /root/.bashrc < /etc/systemd/system/node-exporter.service < + +package plugin + +type Plugin struct { + Name string `yaml:"name" json:"name"` + Os string `yaml:"os" json:"os"` + Arch string `yaml:"arch" json:"arch"` + Url string `yaml:"url" json:"url"` + Desc string `yaml:"desc" json:"desc"` + Bin string `yaml:"bin" json:"bin"` + Repo Repo +} + +type Repo struct { + Name string `yaml:"name" json:"name"` + Url string `yaml:"url" json:"url"` +} diff --git a/pkg/ergo/plugin/list.go b/pkg/ergo/plugin/list.go new file mode 100644 index 00000000..e546d1ff --- /dev/null +++ b/pkg/ergo/plugin/list.go @@ -0,0 +1,204 @@ +// AGPL License +// Copyright (c) 2021 ysicing + +package plugin + +import ( + "bytes" + "fmt" + "github.com/spf13/cobra" + "github.com/ysicing/ergo/common" + "github.com/ysicing/ergo/pkg/util/log" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "strings" +) + +var ( + ValidPluginFilenamePrefixes = []string{"ergo"} +) + +type ListOptions struct { + Verifier PathVerifier + Log log.Logger + NameOnly bool + + PluginPaths []string +} + +func (o *ListOptions) Complete(cmd *cobra.Command) error { + o.Verifier = &CommandOverrideVerifier{ + root: cmd.Root(), + seenPlugins: make(map[string]string), + } + o.PluginPaths = filepath.SplitList(os.Getenv("PATH")) + return nil +} + +func (o *ListOptions) Run() error { + pluginsFound := false + isFirstFile := true + var pluginErrors []error + pluginWarnings := 0 + + for _, dir := range uniquePathsList(o.PluginPaths) { + if len(strings.TrimSpace(dir)) == 0 { + continue + } + + files, err := ioutil.ReadDir(dir) + if err != nil { + if _, ok := err.(*os.PathError); ok { + o.Log.Warnf("Unable to read directory %q from your PATH: %v. Skipping...", dir, err) + continue + } + + pluginErrors = append(pluginErrors, fmt.Errorf("error: unable to read directory %q in your PATH: %v", dir, err)) + continue + } + + for _, f := range files { + if f.IsDir() { + continue + } + if !hasValidPrefix(f.Name(), ValidPluginFilenamePrefixes) { + continue + } + + if isFirstFile { + fmt.Fprintf(os.Stdout, "The following compatible plugins are available:\n") + pluginsFound = true + isFirstFile = false + } + + pluginPath := f.Name() + if !o.NameOnly { + pluginPath = filepath.Join(dir, pluginPath) + } + pluginname := strings.Split(f.Name(), "-")[1] + o.Log.Infof("%s %s", pluginname, pluginPath) + if errs := o.Verifier.Verify(filepath.Join(dir, f.Name())); len(errs) != 0 { + for _, err := range errs { + o.Log.Warnf(" - %s\n", err) + pluginWarnings++ + } + } + } + } + + if !pluginsFound { + pluginErrors = append(pluginErrors, fmt.Errorf("error: unable to find any ergo plugins in your PATH")) + } + + if pluginWarnings > 0 { + if pluginWarnings == 1 { + pluginErrors = append(pluginErrors, fmt.Errorf("error: one plugin warning was found")) + } else { + pluginErrors = append(pluginErrors, fmt.Errorf("error: %v plugin warnings were found", pluginWarnings)) + } + } + if len(pluginErrors) > 0 { + errs := bytes.NewBuffer(nil) + return fmt.Errorf("%s", errs.String()) + } + + return nil +} + +// PathVerifier receives a path and determines if it is valid or not +type PathVerifier interface { + // Verify determines if a given path is valid + Verify(path string) []error +} + +type CommandOverrideVerifier struct { + root *cobra.Command + seenPlugins map[string]string +} + +func (v *CommandOverrideVerifier) Verify(path string) []error { + if v.root == nil { + return []error{fmt.Errorf("unable to verify path with nil root")} + } + + // extract the plugin binary name + segs := strings.Split(path, "/") + binName := segs[len(segs)-1] + + cmdPath := strings.Split(binName, "-") + if len(cmdPath) > 1 { + // the first argument is always "ergo" for a plugin binary + cmdPath = cmdPath[1:] + } + + var errors []error + + if isExec, err := isExecutable(path); err == nil && !isExec { + errors = append(errors, fmt.Errorf("warning: %s identified as a ergo plugin, but it is not executable", path)) + } else if err != nil { + errors = append(errors, fmt.Errorf("error: unable to identify %s as an executable file: %v", path, err)) + } + + if existingPath, ok := v.seenPlugins[binName]; ok { + errors = append(errors, fmt.Errorf("warning: %s is overshadowed by a similarly named plugin: %s", path, existingPath)) + } else { + v.seenPlugins[binName] = path + } + + if cmd, _, err := v.root.Find(cmdPath); err == nil { + errors = append(errors, fmt.Errorf("warning: %s overwrites existing command: %q", binName, cmd.CommandPath())) + } + + return errors +} + +func isExecutable(fullPath string) (bool, error) { + info, err := os.Stat(fullPath) + if err != nil { + return false, err + } + + if runtime.GOOS == "windows" { + fileExt := strings.ToLower(filepath.Ext(fullPath)) + + switch fileExt { + case ".bat", ".cmd", ".com", ".exe", ".ps1": + return true, nil + } + return false, nil + } + + if m := info.Mode(); !m.IsDir() && m&0111 != 0 { + return true, nil + } + + return false, nil +} + +// uniquePathsList deduplicates a given slice of strings without +// sorting or otherwise altering its order in any way. +func uniquePathsList(paths []string) []string { + seen := map[string]bool{} + var newPaths []string + for _, p := range paths { + if seen[p] { + continue + } + seen[p] = true + newPaths = append(newPaths, p) + } + newPaths = append(newPaths, common.GetDefaultBinDir()) + return newPaths +} + +func hasValidPrefix(filepath string, validPrefixes []string) bool { + for _, prefix := range validPrefixes { + if !strings.HasPrefix(filepath, prefix+"-") { + continue + } + return true + } + return false +} diff --git a/pkg/ergo/plugin/repo.go b/pkg/ergo/plugin/repo.go new file mode 100644 index 00000000..00fcd70a --- /dev/null +++ b/pkg/ergo/plugin/repo.go @@ -0,0 +1,348 @@ +// AGPL License +// Copyright (c) 2021 ysicing + +package plugin + +import ( + "context" + "fmt" + "github.com/ergoapi/util/file" + "github.com/ergoapi/util/zos" + "github.com/gofrs/flock" + "github.com/ysicing/ergo/common" + "github.com/ysicing/ergo/pkg/util/log" + "github.com/ysicing/ergo/pkg/util/ssh" + "io/ioutil" + "net/http" + "net/url" + "os" + "path/filepath" + "sigs.k8s.io/yaml" + "strings" + "time" +) + +type File struct { + Generated time.Time `json:"generated"` + Repositories []*Repo `json:"repositories"` +} + +type PFile struct { + Plugins []*Plugin `json:"plugins"` +} + +func NewFile() *File { + return &File{ + Generated: time.Now(), + Repositories: []*Repo{}, + } +} + +func LoadFile(path string) (*File, error) { + f := log.GetInstance() + f.Debugf("path: %v", path) + r := new(File) + b, err := ioutil.ReadFile(path) + if err != nil { + f.Debugf("couldn't load repositories file (%s), err: %v", path, err) + return r, fmt.Errorf("couldn't load repositories file (%s)", path) + } + err = yaml.Unmarshal(b, r) + if err != nil { + f.Debugf("yaml unmarshal err: %v", err) + return nil, err + } + return r, nil +} + +func LoadIndexFile(path string) (*PFile, error) { + f := log.GetInstance() + f.Debugf("path: %v", path) + r := new(PFile) + b, err := ioutil.ReadFile(path) + if err != nil { + f.Debugf("couldn't load plugin index file (%s), err: %v", path, err) + return r, fmt.Errorf("couldn't load plugin index file (%s)", path) + } + err = yaml.Unmarshal(b, r) + if err != nil { + f.Debugf("yaml unmarshal err: %v", err) + return nil, err + } + return r, nil +} + +// Add adds one or more repo entries to a repo file. +func (r *File) Add(re ...*Repo) { + r.Repositories = append(r.Repositories, re...) +} + +// Update attempts to replace one or more repo entries in a repo file. If an +// entry with the same name doesn't exist in the repo file it will add it. +func (r *File) Update(re ...*Repo) { + r.Generated = time.Now() + for _, target := range re { + r.update(target) + } +} + +func (r *File) update(e *Repo) { + for j, repo := range r.Repositories { + if repo.Name == e.Name { + r.Repositories[j] = e + return + } + } + r.Add(e) +} + +// Has returns true if the given name is already a repository name. +func (r *File) Has(name string) bool { + entry := r.Get(name) + return entry != nil +} + +// Get returns an entry with the given name if it exists, otherwise returns nil +func (r *File) Get(name string) *Repo { + for _, entry := range r.Repositories { + if entry.Name == name { + return entry + } + } + return nil +} + +// Remove removes the entry from the list of repositories. +func (r *File) Remove(name string) bool { + cp := []*Repo{} + found := false + for _, rf := range r.Repositories { + if rf.Name == name { + found = true + continue + } + cp = append(cp, rf) + } + r.Repositories = cp + return found +} + +// WriteFile writes a repositories file to the given path. +func (r *File) WriteFile(path string, perm os.FileMode) error { + data, err := yaml.Marshal(r) + if err != nil { + return err + } + if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { + return err + } + return ioutil.WriteFile(path, data, perm) +} + +// Has returns true if the given name is already a repository name. +func (r *PFile) Has(name string) bool { + entry := r.Get(name) + return entry != nil +} + +// Get returns an entry with the given name if it exists, otherwise returns nil +func (r *PFile) Get(name string) *Plugin { + for _, entry := range r.Plugins { + if entry.Name == name { + return entry + } + } + return nil +} + +type RepoAddOption struct { + Log log.Logger + Name string + Url string + RepoCfg string +} + +func (o *RepoAddOption) Run() error { + // Ensure the file directory exists as it is required for file locking + err := os.MkdirAll(filepath.Dir(o.RepoCfg), os.ModePerm) + if err != nil && !os.IsExist(err) { + o.Log.Errorf("create plugin file err: %v", err) + return err + } + // Acquire a file lock for process synchronization + repoFileExt := filepath.Ext(o.RepoCfg) + var lockPath string + if len(repoFileExt) > 0 && len(repoFileExt) < len(o.RepoCfg) { + lockPath = strings.Replace(o.RepoCfg, repoFileExt, ".lock", 1) + } else { + lockPath = o.RepoCfg + ".lock" + } + fileLock := flock.New(lockPath) + lockCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + locked, err := fileLock.TryLockContext(lockCtx, time.Second) + if err == nil && locked { + defer fileLock.Unlock() + } + if err != nil { + o.Log.Warnf("其他进程正在更新") + return err + } + b, err := ioutil.ReadFile(o.RepoCfg) + if err != nil && !os.IsNotExist(err) { + return err + } + var f File + if err := yaml.Unmarshal(b, &f); err != nil { + o.Log.Errorf("解析 %v 失败: %v", o.RepoCfg, err) + return err + } + c := Repo{ + Name: o.Name, + Url: o.Url, + } + + if f.Has(o.Name) { + existing := f.Get(o.Name) + if c != *existing { + o.Log.Warnf("Repo(%s)已经存在", o.Name) + return nil + } + o.Log.Warnf("已经存在%q相同的配置, skipping", o.Name) + return nil + } + + f.Update(&c) + if err := f.WriteFile(o.RepoCfg, 0644); err != nil { + return err + } + o.Log.Donef("%q 添加成功", o.Name) + return nil +} + +type RepoDelOption struct { + Log log.Logger + Names []string + RepoCfg string +} + +func (o *RepoDelOption) Run() error { + r, err := LoadFile(o.RepoCfg) + if err != nil || len(r.Repositories) == 0 { + o.Log.Warn("no repositories configured") + return nil + } + + for _, name := range o.Names { + if !r.Remove(name) { + o.Log.Warnf("不存在 %q", name) + continue + } + r.Generated = time.Now() + if err := r.WriteFile(o.RepoCfg, 0644); err != nil { + return err + } + index := fmt.Sprintf("%v/%v.index.yaml", common.GetDefaultCfgDir(), name) + if file.CheckFileExists(index) { + file.RemoveFiles(index) + o.Log.Debugf("%q清理索引文件", name) + } + o.Log.Donef("%q已经被移除", name) + } + return nil +} + +type RepoUpdateOption struct { + Log log.Logger + Names []string + RepoCfg string +} + +func (o *RepoUpdateOption) Run() error { + r, err := LoadFile(o.RepoCfg) + if err != nil || len(r.Repositories) == 0 { + return fmt.Errorf("no repositories configured") + } + + updateall := len(o.Names) == 0 + + if updateall { + for _, repo := range r.Repositories { + o.Names = append(o.Names, repo.Name) + } + } + + for _, name := range o.Names { + repo := r.Get(name) + if repo == nil { + return fmt.Errorf("不存在 %q", name) + } + index := fmt.Sprintf("%v/%v.index.yaml", common.GetDefaultCfgDir(), repo.Name) + if file.CheckFileExists(index) { + file.RemoveFiles(index) + } + _, err := url.Parse(repo.Url) + if err != nil { + o.Log.Warnf("%v invalid chart URL format: %s", repo.Name, repo.Url) + // TODO + continue + } + err = httpget(repo.Url, index) + if err != nil { + o.Log.Failf("%q已经更新索引失败: %v", name, err) + } else { + o.Log.Donef("%q已经更新索引: %v", name, index) + } + } + return nil +} + +func httpget(url, indexFile string) error { + resp, err := http.Get(url) + if err != nil { + return err + } + defer resp.Body.Close() + data, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + return ioutil.WriteFile(indexFile, data, common.FileMode0755) +} + +type RepoInstallOption struct { + Log log.Logger + Name string + Repo string + RepoCfg string +} + +func (r *RepoInstallOption) Run() error { + r.Log.Debugf("repo: %v, name: %v", r.Repo, r.Name) + pluginfilepath := fmt.Sprintf("%v/%v.index.yaml", common.GetDefaultCfgDir(), r.Repo) + pf, err := LoadIndexFile(pluginfilepath) + if err != nil { + r.Log.Errorf("加载%s, 失败: %v", r.Repo, err) + return nil + } + plugin := pf.Get(r.Name) + if plugin == nil { + r.Log.Errorf("%v 插件不存在: %v", r.Repo, r.Name) + return nil + } + if plugin.Os != "" && plugin.Os != zos.GetOS() { + r.Log.Errorf("%v/%v 插件不支持当前系统: %v", r.Repo, r.Name, plugin.Os) + return nil + } + // 下载插件 + binfile := fmt.Sprintf("%v/ergo-%v", common.GetDefaultBinDir(), plugin.Bin) + if err := httpget(plugin.Url, binfile); err != nil { + r.Log.Error("下载插件失败") + return nil + } + os.Chmod(binfile, common.FileMode0755) + r.Log.Done("插件安装完成, 加载插件列表") + args := os.Args + ssh.RunCmd(args[0], "plugin", "list") + return nil +} diff --git a/pkg/ergo/plugin/sync.go b/pkg/ergo/plugin/sync.go new file mode 100644 index 00000000..6ceb67d9 --- /dev/null +++ b/pkg/ergo/plugin/sync.go @@ -0,0 +1,68 @@ +// AGPL License +// Copyright (c) 2021 ysicing + +package plugin + +import ( + "fmt" + "github.com/ergoapi/util/file" + "github.com/ergoapi/util/zos" + "github.com/gosuri/uitable" + "github.com/ysicing/ergo/common" + "github.com/ysicing/ergo/pkg/util/log" + "github.com/ysicing/ergo/pkg/util/ssh" + "helm.sh/helm/v3/pkg/cli/output" + "os" +) + +type ListRemoteOptions struct { + Log log.Logger + RepoCfg string +} + +func (p *ListRemoteOptions) Run() { + p.Log.Debugf("Detect Plugin Repo Cfg: %v", p.RepoCfg) + args := os.Args + if !file.CheckFileExists(p.RepoCfg) { + p.Log.Debugf("not found, will gen default repo") + if err := ssh.RunCmd(args[0], "plugin", "repo", "add", "local", "https://gitee.com/ysbot/ergoplugindemo/raw/master/default.yaml"); err != nil { + return + } + + } + + err := ssh.RunCmd(args[0], "plugin", "repo", "update") + if err != nil { + return + } + p.Log.Done("sync done.") + r, err := LoadFile(p.RepoCfg) + if err != nil || len(r.Repositories) == 0 { + p.Log.Warn("no found remote plugin") + return + } + var res []*Plugin + for _, i := range r.Repositories { + index := fmt.Sprintf("%v/%v.index.yaml", common.GetDefaultCfgDir(), i.Name) + if !file.CheckFileExists(index) { + p.Log.Debugf("not found %n index", i.Name) + continue + } + pf, err := LoadIndexFile(index) + if err != nil { + p.Log.Errorf("load plugin index file %v err: %v", index, err) + continue + } + // res = append(res, pf.Plugins...) + for _, r := range pf.Plugins { + r.Repo = *i + res = append(res, r) + } + } + table := uitable.New() + table.AddRow("Repo", "NAME", "URL", "Desc", "Available") + for _, re := range res { + table.AddRow(re.Repo.Name, re.Name, re.Url, re.Desc, re.Os == zos.GetOS()) + } + output.EncodeTable(os.Stdout, table) +} diff --git a/pkg/ergo/repo/install.go b/pkg/ergo/repo/install.go index 6721e59c..22b004ce 100644 --- a/pkg/ergo/repo/install.go +++ b/pkg/ergo/repo/install.go @@ -4,11 +4,11 @@ package repo import ( + "github.com/ergoapi/util/file" "github.com/ergoapi/util/ztime" "github.com/ysicing/ergo/common" "github.com/ysicing/ergo/pkg/util/log" sshutil "github.com/ysicing/ergo/pkg/util/ssh" - "github.com/ysicing/ext/utils/exfile" "strings" ) @@ -92,5 +92,5 @@ func dump(name, mode, dumpbody string, log log.Logger) error { } dumpfile := common.GetDefaultDumpDir() + "/" + name + "." + ztime.GetTodayMin() + ".dump" log.Infof("dump file: %v", dumpfile) - return exfile.WriteFile(dumpfile, dumpbody+"\n") + return file.Writefile(dumpfile, dumpbody+"\n") } diff --git a/pkg/ergo/vm/debian.go b/pkg/ergo/vm/debian.go deleted file mode 100644 index ddb49921..00000000 --- a/pkg/ergo/vm/debian.go +++ /dev/null @@ -1,84 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package vm - -import ( - "bytes" - "fmt" - "github.com/ysicing/ext/utils/exhash" - "github.com/ysicing/ext/utils/exos" - "github.com/ysicing/ext/utils/extime" - "html/template" - "strings" -) - -type Debian struct { - md MetaData -} - -func (d Debian) Template() string { - var b bytes.Buffer - tpl := DefaultDebianTpl - - if d.md.Cpus == "" { - d.md.Cpus = DefaultCpus - } - if d.md.Memory == "" { - d.md.Memory = DefaultMemory - } - if d.md.Instance == "" { - d.md.Instance = DefaultInstance - } - if d.md.Name == "" { - d.md.Name = exhash.GenMd5(extime.NowUnixString()) - } - if exos.IsMacOS() && exos.GetUserName() == "ysicing" { - d.md.Box = "file://builds/virtualbox-debian.10.6.1.box" - } else { - d.md.Box = DefaultBox - } - d.md.IP = fmt.Sprintf("%v.1", getIpPre(d.md.IP)) - t := template.Must(template.New("debian").Parse(tpl)) - t.Execute(&b, &d.md) - return b.String() -} - -// getIpPre 获取IP前缀 -func getIpPre(ip string) string { - ip = strings.ReplaceAll(ip, "/24", "") - ips := strings.Split(ip, ".") - return strings.Join(ips[:3], ".") -} - -const DefaultDebianTpl = ` -# -*- mode: ruby -*- -# vi: set ft=ruby : -Vagrant.configure("2") do |config| - config.vm.box_check_update = false - config.vm.provider 'virtualbox' do |vb| - vb.customize [ "guestproperty", "set", :id, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold", 1000 ] - end - $num_instances = {{.Instance}} - (1..$num_instances).each do |i| - config.vm.define "{{.Name}}#{i}" do |node| - node.vm.box = "{{.Box}}" - node.vm.hostname = "{{.Name}}#{i}" - node.vm.network "public_network", use_dhcp_assigned_default_route: true, bridge: 'en0: Wi-Fi (Wireless)' - # node.vm.provision "shell", run: "always", inline: "ntpdate ntp.api.bz" - node.vm.network "private_network", ip: "{{.IP}}#{i}" - node.vm.provision "shell", run: "always", inline: "echo hello from {{.Name}}#{i}" - node.vm.provider "virtualbox" do |vb| - vb.gui = false - vb.memory = {{.Memory}} - vb.cpus = {{.Cpus}} - vb.name = "{{.Name}}#{i}" - vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] - vb.customize ["modifyvm", :id, "--ioapic", "on"] - # cpu 使用率50% - vb.customize ["modifyvm", :id, "--cpuexecutioncap", "50"] - end - end - end -end -` diff --git a/pkg/ergo/vm/vm.go b/pkg/ergo/vm/vm.go deleted file mode 100644 index b83fb55c..00000000 --- a/pkg/ergo/vm/vm.go +++ /dev/null @@ -1,38 +0,0 @@ -// MIT License -// Copyright (c) 2020 ysicing - -package vm - -const ( - DEBIAN = "debian" - DefaultCpus = "2" - DefaultMemory = "4096" - DefaultInstance = "1" - DefaultVmDir = "vm" - DefaultBox = "ysicing/debian" -) - -var ( - Cpus string - Memory string - Instance string - Name string - Path string -) - -type MetaData struct { - Cpus string - Memory string - Instance string - Name string - IP string - Box string -} - -type Vbox interface { - Template() string -} - -func NewVM(data MetaData) Vbox { - return &Debian{md: data} -} diff --git a/pkg/util/logo/logo.go b/pkg/util/logo/logo.go index ca045f84..0be33c8e 100644 --- a/pkg/util/logo/logo.go +++ b/pkg/util/logo/logo.go @@ -4,9 +4,9 @@ package logo import ( + "github.com/ergoapi/util/exhash" goansi "github.com/k0kubun/go-ansi" "github.com/mgutz/ansi" - "github.com/ysicing/ext/utils/exhash" ) var stdout = goansi.NewAnsiStdout() diff --git a/version.txt b/version.txt index f93ea0ca..6acdb442 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.0.2 \ No newline at end of file +2.0.3 \ No newline at end of file