summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlinxin <[email protected]>2024-08-28 18:17:12 +0800
committerlinxin <[email protected]>2024-11-06 15:32:29 +0800
commit794794a89946b3b9aed74b6f7bd1ebc5d36c21f1 (patch)
tree1d440d3a6b963e2dab4d2343dfb509e16fc5eda6
parent82e4f4b089277aaafbe7dc892264872284182371 (diff)
✨ feat: add archive feature to coredump-tool
-rw-r--r--coredump-tool/coredump-tool.go115
1 files changed, 110 insertions, 5 deletions
diff --git a/coredump-tool/coredump-tool.go b/coredump-tool/coredump-tool.go
index 4d67190..0e1f4d6 100644
--- a/coredump-tool/coredump-tool.go
+++ b/coredump-tool/coredump-tool.go
@@ -1,13 +1,16 @@
package main
import (
+ "archive/tar"
"bufio"
"bytes"
+ "compress/gzip"
"context"
"coredump-tools/types"
"encoding/json"
"errors"
"fmt"
+ "io"
"os"
"os/exec"
"path/filepath"
@@ -36,6 +39,7 @@ var (
dirPath string
command string
prestartPath string
+ outFilePath string
)
// WalkDirectory search file with suffix name ".info"
@@ -220,11 +224,6 @@ func debugInpod(conf *rest.Config, clientset *kubernetes.Clientset, config types
fmt.Println(id.String())
podName := fmt.Sprintf("coredump-debug-%s", id.String())
containerName := "debug"
- imageversion, err := getImageVersion()
- if err != nil {
- return "", err
- }
- image := fmt.Sprintf("registry.gdnt-cloud.website/tsg-init:%s", imageversion)
volumeMounts := []v1.VolumeMount{
{
Name: "host-dir",
@@ -268,13 +267,20 @@ func debugInpod(conf *rest.Config, clientset *kubernetes.Clientset, config types
var containerCommands []string
var containerCommand string
var gdbcommand []string
+ var image string
if _, err := os.Stat(config.Binary_file); err != nil {
fmt.Println(err)
containerCommand = "tail -f"
gdbcommand = []string{"gdb", config.Process_exe_path, "/host" + config.Storage, "-cd", filepath.Dir(config.Process_exe_path)}
+ image = config.Image_name
} else {
containerCommand = fmt.Sprintf("mkdir -p /tmp/sysroot && cd /tmp/sysroot ; unzip -o /host%s ; ldconfig -r /tmp/sysroot ; tail -f ", config.Binary_file)
gdbcommand = []string{"gdb", "/tmp/sysroot" + config.Process_exe_path, "/host" + config.Storage, "-cd", filepath.Dir("/tmp/sysroot" + config.Process_exe_path), "-iex", "set sysroot /tmp/sysroot", "-iex", "set solib-search-path /tmp/sysroot/usr/lib:/tmp/sysroot/usr/lib64:/tmp/sysroot/opt/tsg/mrzcpd/icelake-server/lib:/tmp/sysroot/opt/tsg/mrzcpd/corei7/lib:/tmp/sysroot/opt/tsg/mrzcpd/znver1/lib"}
+ imageversion, err := getImageVersion()
+ if err != nil {
+ return "", err
+ }
+ image = fmt.Sprintf("registry.gdnt-cloud.website/tsg-init:%s", imageversion)
}
if prestartPath != "" {
prestartVolumeMount := v1.VolumeMount{
@@ -396,6 +402,63 @@ func debugInpod(conf *rest.Config, clientset *kubernetes.Clientset, config types
return podName, nil
}
+func archive(source string, target string) {
+
+ dir := filepath.Base(source)
+ if target == "" {
+ target = dir + ".tar.gz"
+ }
+ tarfile, err := os.Create(target)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ defer tarfile.Close()
+
+ gzipWriter := gzip.NewWriter(tarfile)
+ defer gzipWriter.Close()
+
+ tarWriter := tar.NewWriter(gzipWriter)
+ defer tarWriter.Close()
+
+ filepath.Walk(source, func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+
+ header, err := tar.FileInfoHeader(info, "")
+ if err != nil {
+ return err
+ }
+
+ header.Name = filepath.ToSlash(filepath.Join(dir, strings.TrimPrefix(path, source)))
+ if info.IsDir() {
+ header.Name += "/"
+ }
+ fmt.Printf("Header.Name: %v\n", header.Name)
+
+ if err := tarWriter.WriteHeader(header); err != nil {
+ return err
+ }
+
+ if !info.IsDir() {
+ file, err := os.Open(path)
+ if err != nil {
+ return err
+ }
+ defer file.Close()
+
+ if _, err := io.Copy(tarWriter, file); err != nil {
+ return err
+ }
+ }
+
+ return nil
+ })
+
+ fmt.Println("Tarball created successfully!")
+}
+
func command_init() cli.App {
return cli.App{
Name: "coredump",
@@ -454,6 +517,48 @@ func command_init() cli.App {
},
},
{
+ Name: "archive",
+ Aliases: []string{"a"},
+ Usage: "store coredump file in an archive",
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "pid",
+ Aliases: []string{"p"},
+ Usage: "Pid to match",
+ Value: "",
+ Destination: &pid,
+ },
+ &cli.StringFlag{
+ Name: "dir",
+ Aliases: []string{"d"},
+ Usage: "Coredump directory path(default: /var/lib/coredump)",
+ Value: "/var/lib/coredump",
+ Destination: &dirPath,
+ },
+ &cli.StringFlag{
+ Name: "output",
+ Aliases: []string{"o"},
+ Usage: "store file path",
+ Value: "",
+ Destination: &outFilePath,
+ },
+ },
+ Action: func(c *cli.Context) error {
+ if pid == "" {
+ archive(dirPath, outFilePath)
+ } else {
+ WalkDirectory(dirPath)
+ for _, c := range configs {
+ if strings.Compare(c.Initial_ns_pid, pid) == 0 {
+ dirPath, _ := filepath.Split(c.Storage)
+ archive(dirPath, outFilePath)
+ }
+ }
+ }
+ return nil
+ },
+ },
+ {
Name: "debug",
Usage: "Start a debugging session for a coredump",
Flags: []cli.Flag{