README.md
Rendering markdown...
package main
import (
"archive/tar"
"compress/gzip"
"encoding/json"
"flag"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"crypto/tls"
"os"
"path/filepath"
"strings"
"time"
)
type Session struct {
ID string `json:"id"`
DateStart string `json:"date_start"`
Protocol string `json:"protocol"`
}
func main() {
//忽略SSL证书告警
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
// 获取命令行参数
url := flag.String("url", "", "URL")
flag.Parse()
if *url == "" {
log.Fatal("请传入有效的URL")
}
// 发送请求获取JSON数据
resp, err := client.Get(*url + "/api/v1/terminal/sessions/?limit=1")
if err != nil {
log.Fatal("请求失败:", err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal("读取响应失败:", err)
}
// 解析JSON数据
var sessionData map[string]interface{}
err = json.Unmarshal(body, &sessionData)
if err != nil {
log.Fatal("解析JSON失败:", err)
}
// 获取session信息
results := sessionData["results"].([]interface{})
if len(results) == 0 {
log.Fatal("未找到session信息")
}
session := results[0].(map[string]interface{})
sessionID := session["id"].(string)
dateStart := session["date_start"].(string)
protocol := session["protocol"].(string)
// 将时间格式转换为YYYY-MM-DD
parsedTime, err := time.Parse("2006/01/02 15:04:05 -0700", dateStart)
if err != nil {
log.Fatal("时间转换失败:", err)
}
dateStartFormatted := parsedTime.Format("2006-01-02")
// 保存返回的JSON数据
jsonBytes, err := json.Marshal(session)
if err != nil {
log.Fatal("序列化JSON失败:", err)
}
err = ioutil.WriteFile(sessionID+".json", jsonBytes, 0644)
if err != nil {
log.Fatal("保存JSON文件失败:", err)
}
// 根据协议定义replay_url
var replayURL string
if strings.ToLower(protocol) == "rdp" {
replayURL = ".replay.gz"
} else {
replayURL = ".cast.gz"
}
// 发送请求获取replay内容并保存
replayURL1 := "/media/xpack/../replay/" + dateStartFormatted + "/" + sessionID + replayURL
resp, err = client.Get(*url + replayURL1)
if err != nil {
log.Fatal("请求replay失败:", err)
}
defer resp.Body.Close()
cacheBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal("读取replay内容失败:", err)
}
// 创建输出文件
file, err := os.Create(sessionID + replayURL)
if err != nil {
fmt.Println("无法创建输出文件:", err)
return
}
defer file.Close()
// 创建gzip.Writer,并设置文件名
gzipWriter := gzip.NewWriter(file)
gzipWriter.Header.Name = sessionID
// 写入需要压缩的数据
_, err = gzipWriter.Write([]byte(cacheBytes))
if err != nil {
fmt.Println("写入压缩数据时发生错误:", err)
return
}
// 关闭gzip.Writer,在关闭之前会将压缩数据写入到输出文件
err = gzipWriter.Close()
if err != nil {
fmt.Println("关闭gzip.Writer时发生错误:", err)
return
}
// 创建tar文件
tarFile, err := os.Create(sessionID + ".tar")
if err != nil {
log.Fatal("创建tar文件失败:", err)
}
defer tarFile.Close()
tarWriter := tar.NewWriter(tarFile)
defer tarWriter.Close()
// 添加sessionID.json到tar文件
err = addFileToTar(sessionID+".json", tarWriter)
if err != nil {
log.Fatal("添加文件到tar失败:", err)
}
// 添加sessionID.replay.gz到tar文件
err = addFileToTar(sessionID+replayURL, tarWriter)
if err != nil {
log.Fatal("添加文件到tar失败:", err)
}
fmt.Println("脚本执行成功!")
}
// 添加文件到tar
func addFileToTar(filePath string, tarWriter *tar.Writer) error {
file, err := os.Open(filePath)
if err != nil {
return err
}
defer file.Close()
stat, err := file.Stat()
if err != nil {
return err
}
header := &tar.Header{
Name: filepath.Base(filePath),
Mode: int64(stat.Mode()),
Size: stat.Size(),
ModTime: stat.ModTime(),
}
err = tarWriter.WriteHeader(header)
if err != nil {
return err
}
_, err = io.Copy(tarWriter, file)
if err != nil {
return err
}
return nil
}