diff --git a/coredump-handler/coredump-handler.go b/coredump-handler/coredump-handler.go index 2b99847..914a5b1 100644 --- a/coredump-handler/coredump-handler.go +++ b/coredump-handler/coredump-handler.go @@ -10,58 +10,77 @@ import ( "flag" "fmt" "io" + "math" "os" "regexp" "strconv" "strings" - "syscall" "github.com/containerd/containerd" "github.com/containerd/containerd/namespaces" "github.com/coreos/go-systemd/v22/journal" + "github.com/shirou/gopsutil/disk" ) -const chunkSize = 1024 * 1024 * 1024 // 1GB var coredump_config types.Coredump_config func argsJudge() error { - if coredump_config.Initial_ns_pid == "" || coredump_config.Process_ns_pid == "" || coredump_config.Corepipe_config_path == "" || coredump_config.Timestamp == 0 || coredump_config.Process_exe_path == "" || coredump_config.GID == "" || coredump_config.Hostname == "" || coredump_config.UID == "" || coredump_config.Signal == -1 { - err := fmt.Sprintf("Failed to initialize command line parameters. -P=%s -p=%s -E=%s -configpath=%s -t=%d -g=%s -h=%s -s=%d -u=%s", coredump_config.Initial_ns_pid, coredump_config.Process_ns_pid, coredump_config.Process_exe_path, coredump_config.Corepipe_config_path, coredump_config.Timestamp, coredump_config.GID, coredump_config.Hostname, coredump_config.Signal, coredump_config.UID) + + if coredump_config.Initial_ns_pid == "" || + coredump_config.Process_ns_pid == "" || + coredump_config.Corepipe_config_path == "" || + coredump_config.Timestamp == 0 || + coredump_config.Process_exe_path == "" || + coredump_config.GID == "" || + coredump_config.Hostname == "" || + coredump_config.UID == "" || + coredump_config.Signal == -1 { + err := fmt.Sprintf("Failed to initialize command line parameters. -P=%s -p=%s -E=%s -configpath=%s -t=%d -g=%s -h=%s -s=%d -u=%s", + coredump_config.Initial_ns_pid, + coredump_config.Process_ns_pid, + coredump_config.Process_exe_path, + coredump_config.Corepipe_config_path, + coredump_config.Timestamp, + coredump_config.GID, + coredump_config.Hostname, + coredump_config.Signal, + coredump_config.UID) return errors.New(err) } return nil } + func isDiskSufficient(pipe_config types.Pipeconfig) (bool, error) { - percent, err := strconv.ParseFloat(pipe_config.Total_file_mem_limit[:len(pipe_config.Total_file_mem_limit)-1], 64) + percent, err := strconv.ParseInt(pipe_config.Total_file_mem_limit[:len(pipe_config.Total_file_mem_limit)-1], 10, 32) if err != nil { return false, err } - percent = percent / 100.0 - var stat syscall.Statfs_t - wd, err := syscall.Getwd() + // var stat syscall.Statfs_t + wd := pipe_config.Storage if err != nil { fmt.Println(err) return false, err } - syscall.Statfs(wd, &stat) - // 剩余空间的大小为块的数量 * 每个块的大小 - // stat.Bfree表示可用的块的数量,stat.Bsize表示每个块的大小 - usedSpace := (int64(stat.Blocks) - int64(stat.Bfree)) - totalSpace := int64(stat.Blocks) - usage := float64(usedSpace) / float64(totalSpace) + diskinfo, err := disk.Usage(wd) + if err != nil { + return false, err + } + data, err := json.MarshalIndent(diskinfo, "", " ") + if err != nil { + info := fmt.Sprintf("diskinfo:%s", string(data)) + journal.Print(journal.PriInfo, info) + } + usage := int64(math.Floor(diskinfo.UsedPercent + 0.5)) + info := fmt.Sprintf("usage:%d,limited:%d", usage, percent) + journal.Print(journal.PriInfo, info) if usage >= percent { return false, nil } return true, nil } + func createCoreDumpDir(pipe_config *types.Pipeconfig, args types.Coredump_config) error { - if _, err := os.Stat(pipe_config.Storage); os.IsNotExist(err) { - // 目录不存在,创建目录 - if err := os.MkdirAll(pipe_config.Storage, os.ModePerm); err != nil { - return err - } - } - pipe_config.Storage = fmt.Sprintf("%s/%s_%s_%d_coredump", pipe_config.Storage, args.Initial_ns_pid, args.Process_ns_pid, args.Timestamp) + pipe_config.Storage = fmt.Sprintf("%s/coredump_%s_%s_%d", pipe_config.Storage, args.Initial_ns_pid, args.Process_ns_pid, args.Timestamp) dirName := pipe_config.Storage if _, err := os.Stat(dirName); os.IsNotExist(err) { // 目录不存在,创建目录 @@ -114,7 +133,7 @@ func getImageName(container_id string, sock_path string) (string, error) { return imageRef.Name(), nil } func writeCoreConfig(config types.Coredump_config) error { - filename := fmt.Sprintf("%s_%s_%d_coredump.config", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp) + filename := fmt.Sprintf("%s_%s_%d.info", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp) file, err := os.Create(filename) if err != nil { return err @@ -127,7 +146,7 @@ func writeCoreConfig(config types.Coredump_config) error { return nil } func writeCoreDumpToFile(config types.Coredump_config) error { - filename := fmt.Sprintf("%s_%s_%d_coredump.info", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp) + filename := fmt.Sprintf("%s_%s_%d.coredump", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp) file, err := os.Create(filename) if err != nil { return err @@ -147,7 +166,7 @@ func writeCoreDumpToFile(config types.Coredump_config) error { return nil } func writeMiniDumpToFile(config types.Coredump_config) error { - filename := fmt.Sprintf("%s_%s_%d_minidump.info", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp) + filename := fmt.Sprintf("%s_%s_%d.minidump", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp) file, err := os.Create(filename) if err != nil { return err @@ -168,7 +187,7 @@ func writeMiniDumpToFile(config types.Coredump_config) error { } func compress(config types.Coredump_config) error { // Create a new zip archive. - filename := fmt.Sprintf("%s_%s_%d_coredump.info", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp) + filename := fmt.Sprintf("%s_%s_%d.coredump", config.Initial_ns_pid, config.Process_ns_pid, config.Timestamp) zipfile, err := os.Create(filename + ".zip") if err != nil { return err @@ -228,6 +247,14 @@ func main() { if pipe_config.Storage_type == 0 { return } + //生成coredump存放文件夹 + if _, err := os.Stat(pipe_config.Storage); os.IsNotExist(err) { + // 目录不存在,创建目录 + if err := os.MkdirAll(pipe_config.Storage, os.ModePerm); err != nil { + journal.Print(journal.PriErr, err.Error()) + return + } + } //判断硬盘使用率 flag, err := isDiskSufficient(pipe_config) if err != nil { @@ -269,13 +296,13 @@ func main() { if err != nil { journal.Print(journal.PriErr, err.Error()) } - coredump_config.Storage = fmt.Sprintf("%s/%s_%s_%d_coredump.info", pipe_config.Storage, coredump_config.Initial_ns_pid, coredump_config.Process_ns_pid, coredump_config.Timestamp) - } else if pipe_config.Compress == true { + coredump_config.Storage = fmt.Sprintf("%s/%s_%s_%d.coredump", pipe_config.Storage, coredump_config.Initial_ns_pid, coredump_config.Process_ns_pid, coredump_config.Timestamp) + } else { err = compress(coredump_config) if err != nil { journal.Print(journal.PriErr, err.Error()) } - coredump_config.Storage = fmt.Sprintf("%s/%s_%s_%d_coredump.info.zip", pipe_config.Storage, coredump_config.Initial_ns_pid, coredump_config.Process_ns_pid, coredump_config.Timestamp) + coredump_config.Storage = fmt.Sprintf("%s/%s_%s_%d.coredump.zip", pipe_config.Storage, coredump_config.Initial_ns_pid, coredump_config.Process_ns_pid, coredump_config.Timestamp) } //将image name写入coredump config err = writeCoreConfig(coredump_config) diff --git a/coredump-tool/coredump-tool.go b/coredump-tool/coredump-tool.go index b8aae94..46abc72 100644 --- a/coredump-tool/coredump-tool.go +++ b/coredump-tool/coredump-tool.go @@ -5,7 +5,6 @@ import ( "coredump-tools/types" "encoding/json" "errors" - "flag" "fmt" "os" "os/exec" @@ -14,6 +13,7 @@ import ( "time" "github.com/google/uuid" + "github.com/urfave/cli/v2" "golang.org/x/term" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -115,6 +115,10 @@ func debugInpod(conf *rest.Config, clientset *kubernetes.Clientset, config types Name: "src-debuginfo-dir", MountPath: "/usr/src/debug", }, + { + Name: "mrzcpd", + MountPath: "/opt/tsg/mrzcpd", + }, }, SecurityContext: &v1.SecurityContext{ Privileged: &[]bool{true}[0], @@ -146,6 +150,14 @@ func debugInpod(conf *rest.Config, clientset *kubernetes.Clientset, config types }, }, }, + { + Name: "mrzcpd", + VolumeSource: v1.VolumeSource{ + HostPath: &v1.HostPathVolumeSource{ + Path: "/opt/tsg/mrzcpd", + }, + }, + }, }, RestartPolicy: v1.RestartPolicyNever, }, @@ -230,7 +242,7 @@ func WalkDirectory(dir string) { } if !info.IsDir() { - if strings.HasSuffix(info.Name(), ".config") { + if strings.HasSuffix(info.Name(), ".info") { data, err := os.ReadFile(path) if err != nil { return err @@ -276,76 +288,111 @@ func list(pid string) { fmt.Println("Total", total, "coredumps") } -// Help 打印使用帮助 -func Help() { - fmt.Println("Usage: coredump-ctl [list | debug | help] [options] ") - fmt.Println("list options:") - fmt.Println(" -dir string") - fmt.Println(" Directory path") - fmt.Println(" -p string") - fmt.Println(" Pid to matching") - fmt.Println("debug options:") - fmt.Println(" -dir string") - fmt.Println(" Directory path") - fmt.Println(" -p string") - fmt.Println(" Pid to matching") - fmt.Println(" -command string") - fmt.Println(" exe command when attach to pod") -} +// // Help 打印使用帮助 +// func Help() { +// fmt.Println("Usage: coredump-ctl [list | debug | help] [options] ") +// fmt.Println("list options:") +// fmt.Println(" -dir string") +// fmt.Println(" Directory path") +// fmt.Println(" -p string") +// fmt.Println(" Pid to matching") +// fmt.Println("debug options:") +// fmt.Println(" -dir string") +// fmt.Println(" Directory path") +// fmt.Println(" -p string") +// fmt.Println(" Pid to matching") +// fmt.Println(" -command string") +// fmt.Println(" exe command when attach to pod") +// } func main() { - listCmd := flag.NewFlagSet("list", flag.ExitOnError) - debugCmd := flag.NewFlagSet("debug", flag.ExitOnError) - helpCmd := flag.NewFlagSet("help", flag.ExitOnError) - var dirPath, pid, command string - listCmd.StringVar(&pid, "p", "", "Pid to matching") - debugCmd.StringVar(&pid, "p", "", "Pid to matching") - listCmd.StringVar(&dirPath, "dir", "", "Directory path") - debugCmd.StringVar(&dirPath, "dir", "", "Directory path") - debugCmd.StringVar(&command, "command", "", "") - if len(os.Args) == 1 { - Help() - os.Exit(1) + var ( + pid string + dirPath string + command string + ) + app := &cli.App{ + Name: "coredump", + Usage: "Manage coredump files in Kubernetes clusters", + Commands: []*cli.Command{ + { + Name: "list", + Aliases: []string{"ls"}, + Usage: "List all coredump files", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "pid", + Aliases: []string{"p"}, + Usage: "Pid to match", + Value: "", + Destination: &pid, + }, + &cli.StringFlag{ + Name: "dir", + Usage: "Directory path", + Value: "/var/lib/coredump", + Destination: &dirPath, + }, + }, + Action: func(c *cli.Context) error { + fmt.Println(dirPath) + WalkDirectory(dirPath) + list(pid) + return nil + }, + }, + { + Name: "debug", + Usage: "Start a debugging session for a coredump", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "pid", + Aliases: []string{"p"}, + Usage: "Pid to match", + Value: "", + Destination: &pid, + }, + &cli.StringFlag{ + Name: "dir", + Usage: "Directory path", + Value: "/var/lib/coredump", + Destination: &dirPath, + }, + &cli.StringFlag{ + Name: "command", + Usage: "Debugger command (default: gdb)", + Value: "gdb", + Destination: &command, + }, + }, + Action: func(c *cli.Context) error { + WalkDirectory(dirPath) + for _, config := range configs { + if strings.Compare(config.Initial_ns_pid, pid) == 0 || pid == "" { + err := debug(config, command) + if err != nil { + fmt.Println(err) + } else { + break + } + } + } + return nil + }, + }, + { + Name: "help", + Usage: "Show help message", + Action: func(c *cli.Context) error { + cli.ShowAppHelp(c) + return nil + }, + }, + }, } - switch os.Args[1] { - case "list": - listCmd.Parse(os.Args[2:]) - case "debug": - debugCmd.Parse(os.Args[2:]) - case "help": - helpCmd.Parse(os.Args[2:]) - Help() - default: - fmt.Printf("%q is not a valid command.\n", os.Args[1]) - os.Exit(1) - } - if listCmd.Parsed() { - if dirPath == "" { - dirPath = "/var/lib/coredump" - } - WalkDirectory(dirPath) - list(pid) - return - } - if debugCmd.Parsed() { - if dirPath == "" { - dirPath = "/var/lib/coredump" - } - if command == "" { - command = "gdb" - } - WalkDirectory(dirPath) - for _, config := range configs { - fmt.Println(config) - if strings.Compare(config.Initial_ns_pid, pid) == 0 || pid == "" { - err := debug(config, command) - if err != nil { - fmt.Println(err) - } else { - break - } - } - } - return + + err := app.Run(os.Args) + if err != nil { + fmt.Println(err) } } diff --git a/coredump.conf b/coredump.conf index d35613e..0c19de9 100644 --- a/coredump.conf +++ b/coredump.conf @@ -1,2 +1,2 @@ #Type Path Mode User Group Age Argument -d /var/tmp/*_coredump 0755 - - 7d - +d /var/lib/coredump/coredump_* 0755 - - 7d - diff --git a/go.mod b/go.mod index ca33e44..134c9c3 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,9 @@ require ( github.com/containerd/containerd v1.7.0 github.com/coreos/go-systemd/v22 v22.5.0 github.com/google/uuid v1.3.0 - golang.org/x/crypto v0.1.0 + github.com/shirou/gopsutil v2.21.11+incompatible + github.com/urfave/cli/v2 v2.25.3 + golang.org/x/term v0.5.0 k8s.io/api v0.26.2 k8s.io/apimachinery v0.26.2 k8s.io/client-go v0.26.2 @@ -22,12 +24,14 @@ require ( github.com/containerd/fifo v1.1.0 // indirect github.com/containerd/ttrpc v1.2.1 // indirect github.com/containerd/typeurl/v2 v2.1.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/cyphar/filepath-securejoin v0.2.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect github.com/emicklei/go-restful/v3 v3.10.1 // indirect github.com/go-logr/logr v1.2.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect github.com/go-openapi/swag v0.19.14 // indirect @@ -56,8 +60,11 @@ require ( github.com/opencontainers/runtime-spec v1.1.0-rc.1 // indirect github.com/opencontainers/selinux v1.11.0 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + github.com/yusufpapurcu/wmi v1.2.2 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/otel v1.14.0 // indirect go.opentelemetry.io/otel/trace v1.14.0 // indirect @@ -66,7 +73,6 @@ require ( golang.org/x/oauth2 v0.4.0 // indirect golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.5.0 // indirect golang.org/x/text v0.7.0 // indirect golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect golang.org/x/tools v0.5.0 // indirect diff --git a/go.sum b/go.sum index 4eaad9e..8001ce5 100644 --- a/go.sum +++ b/go.sum @@ -31,6 +31,8 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= @@ -55,6 +57,8 @@ github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= 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= @@ -169,7 +173,11 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/shirou/gopsutil v2.21.11+incompatible h1:lOGOyCG67a5dv2hq5Z1BLDUqqKp3HkbjPcz5j6XMS0U= +github.com/shirou/gopsutil v2.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= @@ -191,10 +199,16 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.25.3 h1:VJkt6wvEBOoSjPFQvOkv6iWIrsJyCrKGtCtxXWwmGeY= +github.com/urfave/cli/v2 v2.25.3/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +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/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM= @@ -204,8 +218,6 @@ go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+go golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -242,6 +254,7 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=