lxz 4 mesiacov pred
rodič
commit
226f6e8366

+ 20 - 0
.idea/remote-targets.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteTargetsManager">
+    <targets>
+      <target name="WSL - Ubuntu-22.04" type="wsl" uuid="201b13e4-02a8-45c1-8dba-08b68d6c550b">
+        <config>
+          <option name="distributionMsId" value="Ubuntu-22.04" />
+          <option name="projectRootOnTarget" value="{exitCode=0, timeout=false, cancelled=false, stdout=/tmp/tmp.XCKwA91fRC&#10;, stderr=}/demo" />
+        </config>
+        <ContributedStateBase type="GoLanguageRuntime">
+          <config>
+            <option name="goPath" value="/home/lxz/goprojects" />
+            <option name="goRoot" value="/snap/bin/go" />
+            <option name="goVersion" value="go1.23.4 linux/amd64" />
+          </config>
+        </ContributedStateBase>
+      </target>
+    </targets>
+  </component>
+</project>

+ 10 - 10
DHCP/api/api.go

@@ -3,8 +3,8 @@ package api
 import (
 	"dhcp/api/request"
 	"dhcp/global"
+	"dhcp/internal/dhcpServer/backend"
 	"dhcp/internal/ip"
-	"dhcp/internal/service"
 	"dhcp/model"
 	"dhcp/result"
 	"github.com/gin-gonic/gin"
@@ -35,7 +35,7 @@ func DHCPServerStart(c *gin.Context) {
 		})
 		return
 	}
-	re := service.StartDHCPService(c.Request.Context(), global.Log, req)
+	re := backend.StartDHCPService(c.Request.Context(), global.Log, req)
 	c.JSON(200, re)
 }
 
@@ -49,7 +49,7 @@ func DHCPServerDelete(c *gin.Context) {
 		})
 		return
 	}
-	re := service.DeleteDHCPService(c.Request.Context(), global.Log, req)
+	re := backend.DeleteDHCPService(c.Request.Context(), global.Log, req)
 	c.JSON(200, re)
 }
 
@@ -63,13 +63,13 @@ func DHCPServerStop(c *gin.Context) {
 		})
 		return
 	}
-	re := service.StopDHCPService(c.Request.Context(), global.Log, req)
+	re := backend.StopDHCPService(c.Request.Context(), global.Log, req)
 	c.JSON(200, re)
 }
 
 func DHCPServerInfo(c *gin.Context) {
 	var d []request.DHCPService
-	for _, v := range service.DHCPServiceInfoMap {
+	for _, v := range backend.DHCPServiceInfoMap {
 		d = append(d, v)
 	}
 	c.JSON(200, result.Result{
@@ -94,18 +94,18 @@ func AddDHCPInfo(c *gin.Context) {
 		})
 		return
 	}
-	re := service.AddDHCPInfo(req)
+	re := backend.AddDHCPInfo(req)
 	c.JSON(200, re)
 }
 
 func GetDHCPInfo(c *gin.Context) {
-	re := service.GetDHCPInfo()
+	re := backend.GetDHCPInfo()
 	c.JSON(200, re)
 }
 
 func DeleteDHCPInfo(c *gin.Context) {
 	req := c.Query("mac")
-	re := service.DeleteDHCPInfo(req)
+	re := backend.DeleteDHCPInfo(req)
 	c.JSON(200, re)
 }
 
@@ -119,12 +119,12 @@ func UpdateDHCPInfo(c *gin.Context) {
 		})
 		return
 	}
-	re := service.UpdateDHCPInfo(req)
+	re := backend.UpdateDHCPInfo(req)
 	c.JSON(200, re)
 }
 
 func GetDHCPInfoByMac(c *gin.Context) {
 	req := c.Query("mac")
-	re := service.GetDHCPInfoByMac(req)
+	re := backend.GetDHCPInfoByMac(req)
 	c.JSON(200, re)
 }

+ 25 - 0
DHCP/initialize/initDB.go

@@ -0,0 +1,25 @@
+package initialize
+
+import (
+	"dhcp/global"
+	"dhcp/model"
+	"github.com/glebarez/sqlite"
+	"gorm.io/gorm"
+	"os"
+	"path/filepath"
+)
+
+func InitDB() {
+	executablePath, err := os.Executable()
+	if err != nil {
+		panic(err)
+	}
+	dbPath := filepath.Join(filepath.Dir(executablePath), "dhcp.db")
+	db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
+	if err != nil {
+		panic(err)
+	}
+	db.AutoMigrate(&model.DHCP{})
+
+	global.DB = db
+}

+ 2 - 3
DHCP/internal/service/dhcp.go → DHCP/internal/dhcpServer/backend/dhcp.go

@@ -1,10 +1,9 @@
-package service
+package backend
 
 import (
 	"context"
 	"dhcp/api/request"
 	"dhcp/code"
-	"dhcp/internal/dhcpServer/backend"
 	"dhcp/internal/dhcpServer/handler/proxy"
 	"dhcp/internal/dhcpServer/server"
 	"dhcp/internal/ip"
@@ -139,7 +138,7 @@ func dhcpHandler(ctx context.Context, c *DhcpConfig, log logr.Logger) (server.Ha
 	if err != nil {
 		return nil, fmt.Errorf("invalid bind address: %w", err)
 	}
-	br := backend.NewBackend()
+	br := NewBackend()
 	dh := &proxy.Handler{
 		Backend: br,
 		IPAddr:  pktIP,

+ 1 - 1
DHCP/internal/service/dhcpInfo.go → DHCP/internal/dhcpServer/backend/dhcpInfo.go

@@ -1,4 +1,4 @@
-package service
+package backend
 
 import (
 	"dhcp/code"

+ 2 - 3
DHCP/internal/dhcpServer/backend/generateIP.go

@@ -3,7 +3,6 @@ package backend
 import (
 	"dhcp/global"
 	"dhcp/internal/dao"
-	"dhcp/internal/service"
 	"dhcp/model"
 	"math/rand"
 	"net"
@@ -60,7 +59,7 @@ func CreateRecord(mac string, ip string) {
 func GenerateIP(mac string, ifName string) (model.DHCP, error) {
 	var m sync.Mutex
 
-	dh := service.DHCPServiceInfoMap[ifName]
+	dh := DHCPServiceInfoMap[ifName]
 	d := DHCPTemplate{
 		DhcpInterface:   dh.BindInterface,
 		IPAddressRanges: dh.NetworkSegment,
@@ -152,7 +151,7 @@ func isIPInSubnet(ip, ifName string) bool {
 	}
 
 	// Parse the subnet
-	_, ipNet, err := net.ParseCIDR(service.DHCPServiceInfoMap[ifName].NetworkSegment)
+	_, ipNet, err := net.ParseCIDR(DHCPServiceInfoMap[ifName].NetworkSegment)
 	if err != nil {
 		return false
 	}

+ 102 - 38
demo3.1/main.go

@@ -1,54 +1,118 @@
 package main
 
 import (
+	"bytes"
 	"fmt"
+	"os"
 	"strconv"
+	"strings"
+	"text/template"
 )
 
-// 假设的 VXLAN 信息结构体
-type VXLANInfo struct {
-	VxLANPortName string
-	VID           uint32
-	GroupIp       string
-	LocalIp       string
+// 定义接口结构
+type InterfaceConfig struct {
+	Name    string
+	MAC     string
+	IP      string
+	Prefix  string
+	Mask    string
+	Gateway string
 }
 
-// 假设的全局配置结构体
-type SysBasicConf struct {
-	BusinessOvsName string
+// 定义模板内容
+const netplanTemplate = `network:
+  version: 2
+  ethernets:
+{{- range . }}
+    {{ .Name }}:
+      match:
+        macaddress: {{ .MAC }}
+      dhcp4: no
+      addresses:
+        - {{ .IP }}/{{ .Prefix }}
+      gateway4: {{ .Gateway }}
+      nameservers:
+        addresses:
+          - 8.8.8.8
+          - 8.8.4.4
+{{- end }}
+`
+
+// GenerateNetCardConfig 生成网卡配置
+func GenerateNetCardConfig(netCardConfig []InterfaceConfig) (string, error) {
+	// 创建模板
+	for k, config := range netCardConfig {
+		Prefix, err := maskToCIDR(config.Mask)
+		if err != nil {
+			return "", err
+		}
+		netCardConfig[k].Prefix = strconv.Itoa(Prefix)
+	}
+
+	tmpl, err := template.New("netplan").Parse(netplanTemplate)
+	if err != nil {
+		fmt.Println("Error parsing template:", err)
+		return "", err
+	}
+
+	// 使用 bytes.Buffer 来捕获模板的输出
+	var output bytes.Buffer
+
+	// 执行模板并将结果写入到 output
+	err = tmpl.Execute(&output, netCardConfig)
+	if err != nil {
+		fmt.Println("Error executing template:", err)
+		return "", err
+	}
+
+	// 将生成的字符串打印出来
+	return output.String(), nil
 }
 
-var Global = SysBasicConf{
-	BusinessOvsName: "eth0", // 示例值,根据实际情况修改
+// 将子网掩码转换为CIDR前缀
+func maskToCIDR(mask string) (int, error) {
+	parts := strings.Split(mask, ".")
+	cidr := 0
+	for _, part := range parts {
+		num, err := strconv.Atoi(part)
+		if err != nil {
+			return 0, err
+		}
+		bits := fmt.Sprintf("%08b", num)
+		cidr += strings.Count(bits, "1")
+	}
+	return cidr, nil
 }
 
 func main() {
-	// 示例 VXLAN 信息
-	vxLANInfo := VXLANInfo{
-		VxLANPortName: "vxlan0",
-		VID:           1000,
-		GroupIp:       "239.1.1.1",
-		LocalIp:       "192.168.1.1",
+	// 定义接口配置
+	netCardConfig := []InterfaceConfig{
+		{
+			Name:    "ens33",
+			MAC:     "00:0c:29:0e:4f:8e",
+			IP:      "192.168.1.1",
+			Mask:    "255.255.255.0",
+			Gateway: "192.168.1.1",
+		},
+		{
+			Name:    "ens37",
+			MAC:     "00:0c:29:0e:4f:90",
+			IP:      "192.168.2.1",
+			Mask:    "255.255.255.0",
+			Gateway: "192.168.2.1",
+		},
 	}
-
-	// 构建命令参数
-	commandArg := []string{}
-	commandArg = append(commandArg, "ip")
-	commandArg = append(commandArg, "link")
-	commandArg = append(commandArg, "add")
-	commandArg = append(commandArg, vxLANInfo.VxLANPortName)
-	commandArg = append(commandArg, "type")
-	commandArg = append(commandArg, "vxlan")
-	commandArg = append(commandArg, "id")
-	commandArg = append(commandArg, strconv.Itoa(int(vxLANInfo.VID)))
-	commandArg = append(commandArg, "group")
-	commandArg = append(commandArg, vxLANInfo.GroupIp)
-	commandArg = append(commandArg, "local")
-	commandArg = append(commandArg, vxLANInfo.LocalIp)
-	commandArg = append(commandArg, "dstport")
-	commandArg = append(commandArg, "4789")
-	commandArg = append(commandArg, "dev")
-	commandArg = append(commandArg, Global.BusinessOvsName)
-
-	fmt.Println("commandArg:", commandArg)
+	// 生成网卡配置
+	config, err := GenerateNetCardConfig(netCardConfig)
+	if err != nil {
+		fmt.Println("生成网络配置文件失败:", err)
+		return
+	}
+	create, err := os.Create("network-config")
+	if err != nil {
+		fmt.Println("创建配置文件失败:", err)
+		return
+	}
+	defer create.Close()
+	_, _ = create.WriteString(config)
 }

+ 25 - 0
demo3.1/network-config

@@ -0,0 +1,25 @@
+network:
+  version: 2
+  ethernets:
+    ens33:
+      match:
+        macaddress: 00:0c:29:0e:4f:8e
+      dhcp4: no
+      addresses:
+        - 192.168.1.1/24
+      gateway4: 192.168.1.1
+      nameservers:
+        addresses:
+          - 8.8.8.8
+          - 8.8.4.4
+    ens37:
+      match:
+        macaddress: 00:0c:29:0e:4f:90
+      dhcp4: no
+      addresses:
+        - 192.168.2.1/24
+      gateway4: 192.168.2.1
+      nameservers:
+        addresses:
+          - 8.8.8.8
+          - 8.8.4.4

+ 6 - 27
demo3.2/main.go

@@ -79,36 +79,15 @@ package main
 
 import (
 	"fmt"
-	"os"
-	"path/filepath"
+	"time"
 )
-import "github.com/pin/tftp/v3"
 
-func getCurrentDir() (string, error) {
-	// 获取当前程序的路径
-	exePath, err := os.Executable()
-	if err != nil {
-		return "", err
-	}
-
-	// 获取程序所在的目录
-	dir := filepath.Dir(exePath)
-
-	return dir, nil
+func getCurrentTimeInCST() time.Time {
+	return time.Now().In(time.FixedZone("CST", 8*3600))
 }
 
 func main() {
-	c, err := tftp.NewClient("28.0.0.1:69")
-	if err != nil {
-		fmt.Printf("Error: %v\n", err)
-		return
-	}
-	wt, err := c.Receive("snp.efi", "octet")
-	file, err := os.Create("C:\\Users\\lx\\GolandProjects\\demo3\\demo3.2\\ipxe.efi")
-	// Optionally obtain transfer size before actual data.
-	if n, ok := wt.(tftp.IncomingTransfer).Size(); ok {
-		fmt.Printf("Transfer size: %d\n", n)
-	}
-	n, err := wt.WriteTo(file)
-	fmt.Printf("%d bytes received\n", n)
+
+	cstTime := getCurrentTimeInCST()
+	fmt.Println("当前东八区时间:", cstTime)
 }

+ 9 - 85
demo3.3/main.go

@@ -1,97 +1,21 @@
 package main
 
 import (
-	"encoding/json"
 	"fmt"
-	"io/ioutil"
-	"log"
 	"time"
-
-	"github.com/dtm-labs/client/dtmcli"
-	"github.com/dtm-labs/client/dtmcli/logger"
-	"github.com/dtm-labs/client/workflow"
-	"github.com/gin-gonic/gin"
-	"github.com/lithammer/shortuuid/v3"
 )
 
-const qsBusiAPI = "/api/busi_start"
-const qsBusiPort = 8082
-
-var qsBusi = fmt.Sprintf("http://localhost:%d%s", qsBusiPort, qsBusiAPI)
-
 func main() {
-	QsStartSvr()
-	_ = QsFireRequest()
-	time.Sleep(3 * time.Second)
-}
-
-// QsStartSvr quick start: start server
-func QsStartSvr() {
-	app := gin.New()
-	qsAddRoute(app)
-	log.Printf("quick start examples listening at %d", qsBusiPort)
-	go func() {
-		_ = app.Run(fmt.Sprintf(":%d", qsBusiPort))
-	}()
-	time.Sleep(100 * time.Millisecond)
-}
-
-func qsAddRoute(app *gin.Engine) {
-	app.POST(qsBusiAPI+"/TransIn", func(c *gin.Context) {
-		log.Printf("TransIn")
-		c.JSON(200, "")
-		// c.JSON(409, "") // Status 409 for Failure. Won't be retried
-	})
-	app.POST(qsBusiAPI+"/TransInCompensate", func(c *gin.Context) {
-		log.Printf("TransInCompensate")
-		c.JSON(200, "")
-	})
-	app.POST(qsBusiAPI+"/TransOut", func(c *gin.Context) {
-		log.Printf("TransOut")
-		c.JSON(200, "")
-	})
-	app.POST(qsBusiAPI+"/TransOutCompensate", func(c *gin.Context) {
-		log.Printf("TransOutCompensate")
-		c.JSON(200, "")
-	})
-	app.POST(qsBusiAPI+"/workflowResume", func(ctx *gin.Context) {
-		log.Printf("workflowResume")
-		data, err := ioutil.ReadAll(ctx.Request.Body)
-		logger.FatalIfError(err)
-		workflow.ExecuteByQS(ctx.Request.URL.Query(), data)
-	})
-}
+	// Unix 时间戳(秒级)
+	timestamp := int64(1733777199)
 
-const dtmServer = "http://localhost:36789/api/dtmsvr"
+	// 将 Unix 时间戳转换为 time.Time 对象
+	t := time.Unix(timestamp, 0) // 第二个参数是纳秒,这里设置为 0
 
-// QsFireRequest quick start: fire request
-func QsFireRequest() string {
-	workflow.InitHTTP(dtmServer, qsBusi+"/workflowResume")
-	wfName := "workflow-http"
-	err := workflow.Register(wfName, func(wf *workflow.Workflow, data []byte) error {
-		var req gin.H
-		err := json.Unmarshal(data, &req)
-		logger.FatalIfError(err)
-		_, err = wf.NewBranch().OnRollback(func(bb *dtmcli.BranchBarrier) error {
-			_, err := wf.NewRequest().SetBody(req).Post(qsBusi + "/TransOutCompensate")
-			return err
-		}).NewRequest().SetBody(req).Post(qsBusi + "/TransOut")
-		if err != nil {
-			return err
-		}
-		_, err = wf.NewBranch().OnRollback(func(bb *dtmcli.BranchBarrier) error {
-			_, err := wf.NewRequest().SetBody(req).Post(qsBusi + "/TransInCompensate")
-			return err
-		}).NewRequest().SetBody(req).Post(qsBusi + "/TransIn")
-		return err
-	})
-	logger.FatalIfError(err)
+	// 格式化输出为 "2006-01-02 15:04:05 UTC" 格式
+	fmt.Println("UTC 时间:", t.UTC().Format("2006-01-02 15:04:05 UTC"))
 
-	gid := shortuuid.New()
-	req := &gin.H{"amount": 30} // the payload of requests
-	data, err := json.Marshal(req)
-	logger.FatalIfError(err)
-	err = workflow.Execute(wfName, gid, data)
-	logger.Infof("workflow.Execute result is: %v", err)
-	return gid
+	// 转换为本地时间
+	localTime := t.Local()
+	fmt.Println("本地时间:", localTime.Format("2006-01-02 15:04:05"))
 }

+ 9 - 60
demo3.5/main.go

@@ -1,76 +1,25 @@
 package main
 
 import (
-	"fmt"
 	"github.com/gin-gonic/gin"
-	"github.com/go-ping/ping"
-	"runtime"
 )
 
-var (
-	Count = 5 // ping次数,默认5次
-	linux = true
-)
-
-func init() {
-
-	if runtime.GOOS != "linux" {
-		linux = false
-	}
-}
-
 func main() {
 	r := gin.Default()
-	r.GET("/ping/:ip", func(c *gin.Context) {
-		ip := c.Param("ip")
-		tcpPing, err := TcpPing(ip)
-		if err != nil {
+	r.POST("/test", func(c *gin.Context) {
+		var req struct {
+			Test []string `json:"test"`
+		}
+		if err := c.ShouldBindJSON(&req); err != nil {
 			c.JSON(200, gin.H{
-				"message": "ping error",
+				"msg": "参数错误",
 			})
+			return
 		}
 		c.JSON(200, gin.H{
-			"averageDelay": tcpPing,
+			"msg": req.Test,
 		})
 	})
-	r.Run(":8080")
-
-}
-
-func TcpPing(addr string) (string, error) {
-	pinger, err := ping.NewPinger(addr)
-	if err != nil {
-		return "", err
-	}
-	if !linux {
-		pinger.SetPrivileged(true)
-	}
-
-	pinger.Count = Count
-
-	//pinger.OnRecv = func(pkt *ping.Packet) {
-	//	fmt.Printf("%d bytes from %s: icmp_seq=%d time=%v\n",
-	//		pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt)
-	//}
-
-	//pinger.OnDuplicateRecv = func(pkt *ping.Packet) {
-	//	fmt.Printf("%d bytes from %s: icmp_seq=%d time=%v ttl=%v (DUP!)\n",
-	//		pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt, pkt.Ttl)
-	//}
-
-	//pinger.OnFinish = func(stats *ping.Statistics) {
-	//	fmt.Printf("\n--- %s ping statistics ---\n", stats.Addr)
-	//	fmt.Printf("%d packets transmitted, %d packets received, %v%% packet loss\n",
-	//		stats.PacketsSent, stats.PacketsRecv, stats.PacketLoss)
-	//	fmt.Printf("round-trip min/avg/max/stddev = %v/%v/%v/%v\n",
-	//		stats.MinRtt, stats.AvgRtt, stats.MaxRtt, stats.StdDevRtt)
-	//}
+	r.Run(":9999")
 
-	fmt.Printf("PING %s (%s):\n", pinger.Addr(), pinger.IPAddr())
-	err = pinger.Run() // Blocks until finished.
-	if err != nil {
-		return "", err
-	}
-	stats := pinger.Statistics() // get send/receive/rtt stats
-	return stats.AvgRtt.String(), nil
 }

+ 98 - 116
etcd/test.go

@@ -1,11 +1,8 @@
 package main
 
 import (
-	"fmt"
+	"context"
 	"go.etcd.io/etcd/client/v3"
-	"go.etcd.io/etcd/client/v3/concurrency"
-	"log"
-	"strings"
 	"time"
 )
 
@@ -67,118 +64,103 @@ func main() {
 		panic(err)
 	}
 	defer cli.Close()
-	session, err := concurrency.NewSession(cli, concurrency.WithTTL(5))
-	if err != nil {
-		panic(err)
-	}
-	m := concurrency.NewMutex(session, "lock/test")
-	for i := 0; i < 10; i++ {
-		err = m.TryLock(ctx)
-		if err != nil {
-			fmt.Printf("Failed to lock: %v\n", err)
-			time.Sleep(1 * time.Second)
-			continue
-		}
-		fmt.Println("Locked")
-		time.Sleep(1 * time.Second)
-		m.Unlock(ctx)
-		fmt.Println("Unlocked")
-	}
-}
-
-// 保持租约
-func keepAlive(cli *clientv3.Client, leaseID clientv3.LeaseID) {
-	alive, err := cli.KeepAlive(ctx, leaseID)
-	if err != nil {
-		fmt.Printf("Failed to keep alive: %v\n", err)
-		return
-	}
-	//监听KeepAlive的响应
-	go func() {
-		for {
-			ka := <-alive
-			if ka == nil {
-				log.Println("租约已失效或KeepAlive通道已关闭")
-				return
-			}
-			log.Printf("续租成功: %v\n", ka)
-		}
-	}()
-}
-
-// 新增键值对
-func put(cli *clientv3.Client, key, value string) error {
-	_, err := cli.Put(ctx, key, value)
-	if err != nil {
-		log.Fatal(err)
-		return err
-	}
-	return nil
-}
-
-// 新增键值对,带有过期时间
-func putWithTTL(cli *clientv3.Client, key, value string, ttl int64) (int64, error) {
-	leaseResp, err := cli.Grant(ctx, ttl)
-	if err != nil {
-		log.Fatal(err)
-		return 0, err
-	}
-	_, err = cli.Put(ctx, key, value, clientv3.WithLease(leaseResp.ID))
-	if err != nil {
-		log.Fatal(err)
-		return 0, err
-	}
-	return int64(leaseResp.ID), nil
-}
+	_, _ = cli.Delete(context.Background(), "/hstack/server/nodes", clientv3.WithPrefix())
 
-// 监听键值变化
-func watch(cli *clientv3.Client, key string) {
-
-	watchCh := cli.Watch(ctx, key, clientv3.WithPrefix())
-
-	go func() {
-
-		for event := range watchCh {
-			if event.Err() != nil {
-				fmt.Printf("Failed to watch: %v\n", event.Err())
-				return
-			}
-			if len(event.Events) == 0 {
-				fmt.Println("No events")
-				return
-			}
-			fmt.Printf("Event: %s %q : %q\n", event.Events[0].Type, event.Events[0].Kv.Key, event.Events[0].Kv.Value)
-			if event.Events[0].Type == clientv3.EventTypeDelete {
-				fmt.Println("删除")
-				fmt.Printf(" %v\n", event.Events[0])
-			}
-		}
-	}()
 }
 
-// 获取键的值
-func get(cli *clientv3.Client, key string) (string, error) {
-	resp, err := cli.Get(ctx, key)
-	if err != nil {
-		log.Fatal(err)
-		return "", err
-	}
-	if resp.Count == 0 {
-		return "", fmt.Errorf("key %s not found", key)
-	}
-	return string(resp.Kvs[0].Value), nil
-}
-
-// 获取当前前缀下所有的键并截取前缀
-func getAndCutPrefix(cli *clientv3.Client, prefix string) ([]string, error) {
-	resp, err := cli.Get(ctx, prefix, clientv3.WithPrefix())
-	if err != nil {
-		log.Fatal(err)
-		return nil, err
-	}
-	keys := make([]string, 0)
-	for _, kv := range resp.Kvs {
-		keys = append(keys, strings.TrimPrefix(string(kv.Key), prefix))
-	}
-	return keys, nil
-}
+//// 保持租约
+//func keepAlive(cli *clientv3.Client, leaseID clientv3.LeaseID) {
+//	alive, err := cli.KeepAlive(ctx, leaseID)
+//	if err != nil {
+//		fmt.Printf("Failed to keep alive: %v\n", err)
+//		return
+//	}
+//	//监听KeepAlive的响应
+//	go func() {
+//		for {
+//			ka := <-alive
+//			if ka == nil {
+//				log.Println("租约已失效或KeepAlive通道已关闭")
+//				return
+//			}
+//			log.Printf("续租成功: %v\n", ka)
+//		}
+//	}()
+//}
+//
+//// 新增键值对
+//func put(cli *clientv3.Client, key, value string) error {
+//	_, err := cli.Put(ctx, key, value)
+//	if err != nil {
+//		log.Fatal(err)
+//		return err
+//	}
+//	return nil
+//}
+//
+//// 新增键值对,带有过期时间
+//func putWithTTL(cli *clientv3.Client, key, value string, ttl int64) (int64, error) {
+//	leaseResp, err := cli.Grant(ctx, ttl)
+//	if err != nil {
+//		log.Fatal(err)
+//		return 0, err
+//	}
+//	_, err = cli.Put(ctx, key, value, clientv3.WithLease(leaseResp.ID))
+//	if err != nil {
+//		log.Fatal(err)
+//		return 0, err
+//	}
+//	return int64(leaseResp.ID), nil
+//}
+//
+//// 监听键值变化
+//func watch(cli *clientv3.Client, key string) {
+//
+//	watchCh := cli.Watch(ctx, key, clientv3.WithPrefix())
+//
+//	go func() {
+//
+//		for event := range watchCh {
+//			if event.Err() != nil {
+//				fmt.Printf("Failed to watch: %v\n", event.Err())
+//				return
+//			}
+//			if len(event.Events) == 0 {
+//				fmt.Println("No events")
+//				return
+//			}
+//			fmt.Printf("Event: %s %q : %q\n", event.Events[0].Type, event.Events[0].Kv.Key, event.Events[0].Kv.Value)
+//			if event.Events[0].Type == clientv3.EventTypeDelete {
+//				fmt.Println("删除")
+//				fmt.Printf(" %v\n", event.Events[0])
+//			}
+//		}
+//	}()
+//}
+//
+//// 获取键的值
+//func get(cli *clientv3.Client, key string) (string, error) {
+//	resp, err := cli.Get(ctx, key)
+//	if err != nil {
+//		log.Fatal(err)
+//		return "", err
+//	}
+//	if resp.Count == 0 {
+//		return "", fmt.Errorf("key %s not found", key)
+//	}
+//	return string(resp.Kvs[0].Value), nil
+//}
+//
+//// 获取当前前缀下所有的键并截取前缀
+//func getAndCutPrefix(cli *clientv3.Client, prefix string) ([]string, error) {
+//	resp, err := cli.Get(ctx, prefix, clientv3.WithPrefix())
+//	if err != nil {
+//		log.Fatal(err)
+//		return nil, err
+//	}
+//	keys := make([]string, 0)
+//	for _, kv := range resp.Kvs {
+//		keys = append(keys, strings.TrimPrefix(string(kv.Key), prefix))
+//	}
+//	return keys, nil
+//}

+ 0 - 1
fileupload/main.go

@@ -19,7 +19,6 @@ var mu sync.Mutex // 使用互斥锁来确保并发时的进度文件读写安
 
 func main() {
 	router := gin.Default()
-
 	// 确保上传和进度记录目录存在
 	err := os.MkdirAll(uploadPath, os.ModePerm)
 	if err != nil {

+ 2 - 10
go.mod

@@ -3,16 +3,14 @@ module demo
 go 1.22
 
 require (
-	github.com/dtm-labs/client v1.18.7
 	github.com/fsnotify/fsnotify v1.7.0
 	github.com/gin-gonic/gin v1.10.0
 	github.com/go-ping/ping v1.1.0
 	github.com/google/wire v0.6.0
-	github.com/lithammer/shortuuid/v3 v3.0.7
-	github.com/pin/tftp/v3 v3.1.0
 	github.com/spf13/viper v1.19.0
 	github.com/streadway/amqp v1.1.0
 	github.com/tjfoc/gmsm v1.4.1
+	github.com/vishvananda/netlink v1.3.0
 	github.com/wagslane/go-rabbitmq v0.14.2
 	go.etcd.io/etcd/client/v3 v3.5.15
 	go.mongodb.org/mongo-driver v1.16.0
@@ -30,14 +28,10 @@ require (
 	github.com/armon/go-metrics v0.4.1 // indirect
 	github.com/bytedance/sonic v1.11.6 // indirect
 	github.com/bytedance/sonic/loader v0.1.1 // indirect
-	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/cloudwego/base64x v0.1.4 // indirect
 	github.com/cloudwego/iasm v0.2.0 // indirect
 	github.com/coreos/go-semver v0.3.0 // indirect
 	github.com/coreos/go-systemd/v22 v22.3.2 // indirect
-	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
-	github.com/dtm-labs/dtmdriver v0.0.6 // indirect
-	github.com/dtm-labs/logger v0.0.1 // indirect
 	github.com/fatih/color v1.14.1 // indirect
 	github.com/felixge/httpsnoop v1.0.4 // indirect
 	github.com/gabriel-vasile/mimetype v1.4.3 // indirect
@@ -47,8 +41,6 @@ require (
 	github.com/go-playground/locales v0.14.1 // indirect
 	github.com/go-playground/universal-translator v0.18.1 // indirect
 	github.com/go-playground/validator/v10 v10.20.0 // indirect
-	github.com/go-redis/redis/v8 v8.11.5 // indirect
-	github.com/go-resty/resty/v2 v2.7.0 // indirect
 	github.com/go-sql-driver/mysql v1.7.0 // indirect
 	github.com/goccy/go-json v0.10.2 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
@@ -83,7 +75,6 @@ require (
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/montanaflynn/stats v0.7.1 // indirect
-	github.com/natefinch/lumberjack v2.0.0+incompatible // indirect
 	github.com/nats-io/nats.go v1.34.0 // indirect
 	github.com/nats-io/nkeys v0.4.7 // indirect
 	github.com/nats-io/nuid v1.0.1 // indirect
@@ -100,6 +91,7 @@ require (
 	github.com/subosito/gotenv v1.6.0 // indirect
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/ugorji/go/codec v1.2.12 // indirect
+	github.com/vishvananda/netns v0.0.4 // indirect
 	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
 	github.com/xdg-go/scram v1.1.2 // indirect
 	github.com/xdg-go/stringprep v1.0.4 // indirect

+ 6 - 120
go.sum

@@ -1,5 +1,4 @@
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM=
 cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4=
 cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg=
@@ -11,21 +10,17 @@ cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/Btme
 cloud.google.com/go/longrunning v0.5.5 h1:GOE6pZFdSrTb4KAiKnXsJBtlE6mEyaW44oKyMILWnOg=
 cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
-github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
 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=
 github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=
 github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=
 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 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/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
@@ -36,12 +31,6 @@ github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3z
 github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
-github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
-github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
-github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
 github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
@@ -50,11 +39,6 @@ github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJ
 github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
 github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
-github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
 github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI=
@@ -63,19 +47,9 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
-github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
-github.com/dtm-labs/client v1.18.7 h1:JOvw1loWhjY5w0gyasHs+BeEyWFBgHvSNl/MNsVQZIA=
-github.com/dtm-labs/client v1.18.7/go.mod h1:szt/7b2fY5ho4N3SAbEChjWvI7l0RMHjrjfF6KoD0pg=
-github.com/dtm-labs/dtmdriver v0.0.6 h1:Iz6xnO+hE2TKDHI2TX4BKCzMtgXYgeQFBEGvvaNhbs8=
-github.com/dtm-labs/dtmdriver v0.0.6/go.mod h1:V5E1uFsExb6Do32ezpB8bMX6be+izLhkcboniLP5shU=
-github.com/dtm-labs/logger v0.0.1 h1:187UPkYviyOXelmkbew+Q94mg/BFjxJEsHfyHawu5YQ=
-github.com/dtm-labs/logger v0.0.1/go.mod h1:0woMQZ6ljx9wZIl7hW8cuV2PRQmwEKxhqYtab7zVNWg=
 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=
-github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
@@ -86,13 +60,10 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2
 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
 github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
-github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
 github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
 github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
 github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
 github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
 github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
@@ -116,14 +87,9 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn
 github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
 github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8=
 github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
-github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
-github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
-github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY=
-github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I=
 github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
 github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
 github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
 github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
@@ -151,7 +117,6 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS
 github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
 github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
-github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
 github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
@@ -162,14 +127,11 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=
 github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
 github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
@@ -183,7 +145,6 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfF
 github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
 github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA=
 github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4=
-github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
 github.com/hashicorp/consul/api v1.28.2 h1:mXfkRHrpHN4YY3RqL09nXU1eHKLNiuAN4kHvDQ16k/8=
 github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE=
 github.com/hashicorp/consul/sdk v0.16.0 h1:SE9m0W6DEfgIVCJX7xU+iv/hUl4m/nxqMTnCdMxDpJ8=
@@ -230,8 +191,6 @@ github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR
 github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0=
 github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=
 github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=
-github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
 github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
 github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
@@ -243,7 +202,6 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 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.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
 github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
 github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
@@ -261,8 +219,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
 github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
-github.com/lithammer/shortuuid/v3 v3.0.7 h1:trX0KTHy4Pbwo/6ia8fscyHoGA+mf1jWbPJVuvyJQQ8=
-github.com/lithammer/shortuuid/v3 v3.0.7/go.mod h1:vMk8ke37EmiewwolSO1NLW8vP4ZaKlRuDIi8tWWmAts=
 github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
 github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
@@ -297,39 +253,20 @@ 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/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE=
 github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM=
-github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk=
 github.com/nats-io/nats.go v1.34.0 h1:fnxnPCNiwIG5w08rlMcEKTUw4AV/nKyGCOJE8TdhSPk=
 github.com/nats-io/nats.go v1.34.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8=
 github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=
 github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=
 github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
 github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
-github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
-github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
-github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
-github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
-github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
-github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
-github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
-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.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
-github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
-github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
 github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
 github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
-github.com/pin/tftp/v3 v3.1.0 h1:rQaxd4pGwcAJnpId8zC+O2NX3B2/NscjDZQaqEjuE7c=
-github.com/pin/tftp/v3 v3.1.0/go.mod h1:xwQaN4viYL019tM4i8iecm++5cGxSqen6AJEOEyEI0w=
 github.com/pkg/errors v0.8.0/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=
@@ -353,7 +290,6 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT
 github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
 github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw=
 github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o=
-github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
 github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
 github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
@@ -388,8 +324,6 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
@@ -400,7 +334,6 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT
 github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
 github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
-github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho=
 github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE=
 github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
@@ -408,21 +341,22 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS
 github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
 github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
 github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/vishvananda/netlink v1.3.0 h1:X7l42GfcV4S6E4vHTsw48qbrV+9PVojNfIhZcwQdrZk=
+github.com/vishvananda/netlink v1.3.0/go.mod h1:i6NetklAujEcC6fK0JPjT8qSwWyO0HLn4UKG+hGqeJs=
+github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
+github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
 github.com/wagslane/go-rabbitmq v0.14.2 h1:3l75Unsy0b8sb3ILqJxMTXkQLUPI67BOuubV9YBjGLE=
 github.com/wagslane/go-rabbitmq v0.14.2/go.mod h1:6sCLt2wZoxyC73G7u/yD6/RX/yYf+x5D8SQk8nsa4Lc=
 github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
 github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
-github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
 github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
 github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
-github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
 github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
 github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
 github.com/yuin/goldmark v1.1.27/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/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 go.etcd.io/etcd/api/v3 v3.5.15 h1:3KpLJir1ZEBrYuV2v+Twaa/e2MdDCEZ/70H+lzEiwsk=
 go.etcd.io/etcd/api/v3 v3.5.15/go.mod h1:N9EhGzXq58WuMllgH9ZvnEr7SI9pS0k0+DHZezGp7jM=
@@ -432,7 +366,6 @@ go.etcd.io/etcd/client/v2 v2.305.12 h1:0m4ovXYo1CHaA/Mp3X/Fak5sRNIWf01wk/X1/G3sG
 go.etcd.io/etcd/client/v2 v2.305.12/go.mod h1:aQ/yhsxMu+Oht1FOupSr60oBvcS9cKXHrzBpDsPTf9E=
 go.etcd.io/etcd/client/v3 v3.5.15 h1:23M0eY4Fd/inNv1ZfU3AxrbbOdW79r9V9Rl62Nm6ip4=
 go.etcd.io/etcd/client/v3 v3.5.15/go.mod h1:CLSJxrYjvLtHsrPKsy7LmZEE+DK2ktfd2bN4RhBMwlU=
-go.mongodb.org/mongo-driver v1.9.1/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
 go.mongodb.org/mongo-driver v1.16.0 h1:tpRsfBJMROVHKpdGyc1BBEzzjDUWjItxbVSZ8Ls4BQ4=
 go.mongodb.org/mongo-driver v1.16.0/go.mod h1:oB6AhJQvFQL4LEHyXi6aJzQJtBiTQHiAd83l0GdFaiw=
 go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
@@ -449,15 +382,10 @@ go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB
 go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc=
 go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
 go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
-go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
-go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
-go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
-go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
 go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
 go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
-go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
 go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
 go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
 golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
@@ -469,7 +397,6 @@ golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3
 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.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
 golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
@@ -481,38 +408,28 @@ golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqR
 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=
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/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-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=
 golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
-golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
-golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
@@ -521,7 +438,6 @@ golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
 golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
 golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI=
 golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -540,49 +456,39 @@ golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 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=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/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-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-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-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
 golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
@@ -592,7 +498,6 @@ golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
@@ -609,13 +514,10 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
@@ -632,7 +534,6 @@ google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAs
 google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
 google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJTh+ah5wIMsBW5c4tQwGTN3thOW9Y=
 google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s=
@@ -645,10 +546,7 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac
 google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
 google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
-google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
 google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
-google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
 google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk=
 google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
@@ -662,33 +560,21 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
 google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
 gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
-gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo=

+ 32 - 0
go/error/main.go

@@ -0,0 +1,32 @@
+package main
+
+import (
+	"errors"
+	"fmt"
+)
+
+func main() {
+	var err error
+	err = errors.New("this is an error")
+	if err != nil {
+		fmt.Println(err.Error())
+	}
+	if true {
+		err := newError()
+		defer func() {
+			if err != nil {
+				fmt.Println(err.Error(), "1")
+			}
+		}()
+	}
+
+	err = errors.New("this is another error")
+	if err != nil {
+		fmt.Println(err.Error())
+	}
+}
+
+func newError() error {
+	var err error
+	return err
+}

+ 20 - 89
gorm/main.go

@@ -16,111 +16,42 @@ type User struct {
 	Test  Test
 }
 
+type Model struct {
+	ID        uint `gorm:"primarykey"`
+	CreatedAt *time.Time
+	UpdatedAt *time.Time
+	DeletedAt gorm.DeletedAt `gorm:"index"`
+}
+
 type Test struct {
-	gorm.Model
-	Name   string
-	UserID *uint
+	Model
+	Name string
 }
 
 func main() {
 
-	user := User{
-		Name:  "John Doe",
-		Email: "john.doe@example.com",
-		Test: Test{
-			Name: "test",
-		},
+	t := Test{
+		Name: "test",
 	}
-	Created(&user)
+	Created(&t)
 	// 打印成功创建的消息
-	fmt.Printf("User created with ID: %d\n", user.ID)
+	fmt.Printf("User created with ID: %d\n", t.ID)
 
 }
 
-func Created(u *User) {
-	dsn := "root:lxz664278@tcp(106.54.33.152:33369)/hstack?charset=utf8mb4&parseTime=True&loc=Local"
+func Created(u *Test) {
+	dsn := "root:lxz664278@tcp(106.54.33.152:33369)/gorm?charset=utf8mb4"
 	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
 		Logger: logger.Default.LogMode(logger.Info),
+		NowFunc: func() time.Time {
+			location, _ := time.LoadLocation("America/New_York")
+			return time.Now().In(location)
+		},
 	})
 	if err != nil {
 		panic("failed to connect database")
 	}
-	info, _ := GetNodePartInfo(&Node{Model: Model{ID: 2}}, *db)
-	fmt.Println(info)
-}
-
-func GetNodePartInfo(node *Node, DBConn gorm.DB) (*Node, error) {
-	var result = new(Node)
 
-	tx := DBConn.Model(Node{}).Select([]string{
-		"id", "node_tag",
-		"max_v_cpu", "use_v_cpu",
-		"max_mem", "use_mem",
-		"max_gpu", "use_gpu",
-		"max_vpc", "use_vpc",
-		"stat"}).Where("id=?", node.ID).Find(result)
-	if tx.Error != nil {
-		return nil, tx.Error
-	}
-	if result.ID <= 0 {
-		result = nil
-	}
-	return result, nil
-}
-
-// Node 节点信息
-type Node struct {
-	Model
-	NodeName               string `json:"node_name" gorm:"node_name" `                     // 节点名称
-	ZoneId                 int    `json:"zone_id" gorm:"zone_id" `                         // 所属资源区ID
-	ZoneName               string `json:"zone_name" gorm:"zone_name" `                     // 所属资源区名
-	BmcIP                  string `json:"bmc_ip" gorm:"bmc_ip" `                           // BMC IP
-	BmcUser                string `json:"bmc_user" gorm:"bmc_user" `                       // BMC 用户名
-	BmcPass                string `json:"bmc_pass" gorm:"bmc_pass" `                       // BMC 密码
-	MgrIp                  string `json:"mgr_ip" gorm:"mgr_ip" `                           // 管理IP
-	NodeIp                 string `json:"node_ip" gorm:"node_ip" `                         // 节点IP
-	ListenPort             int    `json:"listen_port" gorm:"listen_port" `                 // 监听端口
-	SSHPort                int    `json:"ssh_port" gorm:"ssh_port" `                       // SSH端口号
-	RootUser               string `json:"root_user" gorm:"root_user" `                     // root用户
-	RootPass               string `json:"root_pass" gorm:"root_pass" `                     // root密码
-	RootSecretKey          string `json:"root_secret_key" gorm:"root_secret_key" `         // Root账号密钥
-	SecretKeyPass          string `json:"secret_key_pass" gorm:"secret_key_pass" `         // 密钥密码
-	NodeMode               int    `json:"node_mode" gorm:"node_mode" `                     // 节点模式
-	NodeTag                string `json:"node_tag" gorm:"node_tag" `                       // 节点标记
-	MaxVCpu                int    `json:"max_v_cpu" gorm:"max_v_cpu" `                     // 最大可虚拟化CPU数量
-	UseVCpu                int    `json:"use_v_cpu" gorm:"use_v_cpu" `                     // 已使用虚拟化CPU数量
-	Cpu                    int    `json:"cpu" gorm:"cpu" `                                 // CPU数量
-	CpuType                int    `json:"cpu_type" gorm:"cpu_type" `                       // CPU类型 (x86_64:1;amd64:2;arm:3;other:4)
-	MaxMem                 int64  `json:"max_mem" gorm:"max_mem" `                         // 最大内存
-	UseMem                 int64  `json:"use_mem" gorm:"use_mem" `                         // 已使用内存
-	MaxGpu                 int    `json:"max_gpu" gorm:"max_gpu" `                         // 最大GPU数
-	UseGpu                 int    `json:"use_gpu" gorm:"use_gpu" `                         // 已使用GPU数
-	NodeWidget             int    `json:"node_widget" gorm:"node_widget" `                 // 节点权重
-	NodeLoadStat           int    `json:"node_load_stat" gorm:"node_load_stat" `           // 节点负载状态
-	MaxVPC                 int    `json:"max_vpc" gorm:"column:max_vpc;default:5" `        // 节点创建的最大VPC数量
-	UseVPC                 int    `json:"use_vpc" gorm:"column:use_vpc;default:0" `        // 节点已创建的VPC
-	RunStat                int    `json:"run_stat" gorm:"run_stat" `                       // 节点运行状态
-	AutoSyncNodeStat       int    `json:"auto_sync_node_stat" gorm:"auto_sync_node_stat" ` // 自动同步节点状态
-	PcieIdList             []int  `json:"pcie_id_list" gorm:"-" `                          // PCIE设备ID列表
-	HPCInitCommandIdList   []int  `json:"hpc_init_command_id_list" gorm:"-" `              // hpc命令ID数组
-	CloudInitCommandIdList []int  `json:"cloud_init_command_id_list" gorm:"-" `            // 云命令ID数组
-}
-type Model struct {
-	ID           int            `json:"id" gorm:"column:id;primarykey" `                                               // 主键ID
-	CreatedAt    *time.Time     `json:"created_at" gorm:"column:created_at;autoCreateTime:nano" swaggerignore:"true" ` // 创建时间
-	UpdatedAt    *time.Time     `json:"updated_at" gorm:"column:updated_at;autoUpdateTime:nano" swaggerignore:"true"`  // 更新时间
-	DeletedAt    gorm.DeletedAt `json:"deleted_at" gorm:"column:deleted_at;index" swaggerignore:"true"`                // 删除时间
-	CreateUser   string         `json:"create_user" gorm:"create_user" swaggerignore:"true"`                           // 创建用户
-	CreateUserId int            `json:"create_user_id" gorm:"create_user_id" swaggerignore:"true"`                     // 创建用户ID
-	UpdateUser   string         `json:"update_user" gorm:"update_user" swaggerignore:"true"`                           // 更新用户
-	UpdateUserId int            `json:"update_user_id" gorm:"update_user_id" swaggerignore:"true"`                     // 更新用户ID
-	DeleteUser   string         `json:"delete_user" gorm:"delete_user" swaggerignore:"true" `                          // 删除用户
-	DeleteUserId int            `json:"delete_user_id" gorm:"delete_user_id" swaggerignore:"true"`                     // 删除用户ID
-	Remark       string         `json:"remark" gorm:"remark" swaggerignore:"true"`                                     // 备注
-	Stat         int            `json:"stat" gorm:"stat" swaggerignore:"true"`                                         // 状态
-	ExpireAt     *time.Time     `json:"expire_at" gorm:"expire_at" swaggerignore:"true"`                               // 过期时间
-}
+	db.Model(Test{}).Create(u)
 
-func (Node) TableName() string {
-	return "node"
 }

+ 25 - 0
network-config

@@ -0,0 +1,25 @@
+network:
+  version: 2
+  ethernets:
+    ens33:
+      match:
+        macaddress: 00:0c:29:0e:4f:8e
+      dhcp4: no
+      addresses:
+        - 192.168.1.1/24
+      gateway4: 192.168.1.1
+      nameservers:
+        addresses:
+          - 8.8.8.8
+          - 8.8.4.4
+    ens37:
+      match:
+        macaddress: 00:0c:29:0e:4f:90
+      dhcp4: no
+      addresses:
+        - 192.168.2.1/24
+      gateway4: 192.168.2.1
+      nameservers:
+        addresses:
+          - 8.8.8.8
+          - 8.8.4.4

+ 0 - 0
ipgen/main.go → network/ipgen/main.go


+ 17 - 0
network/netlink/main.go

@@ -0,0 +1,17 @@
+package main
+
+import (
+	"github.com/vishvananda/netlink"
+)
+
+func main() {
+	la := netlink.NewLinkAttrs()
+	la.Name = "veth0"
+	veth := netlink.Veth{
+		LinkAttrs: la,
+		PeerName:  "veth1",
+	}
+	if err := netlink.LinkAdd(&veth); err != nil {
+		panic(err)
+	}
+}

+ 39 - 0
network/ping/main.go

@@ -0,0 +1,39 @@
+package main
+
+import (
+	"fmt"
+	"github.com/go-ping/ping"
+	"time"
+)
+
+func main() {
+	// 定义目标地址
+	host := "106.54.33.152"
+
+	// 创建一个 Pinger
+	pinger, err := ping.NewPinger(host)
+	if err != nil {
+		fmt.Printf("Error: %v\n", err)
+		return
+	}
+	pinger.SetPrivileged(true)
+	// 设置参数
+	pinger.Count = 4                 // 发送 4 个 ICMP 包
+	pinger.Timeout = 5 * time.Second // 超时时间
+
+	// 开始 ping
+	fmt.Printf("Pinging %s...\n", host)
+	err = pinger.Run() // 阻塞直到完成
+	if err != nil {
+		fmt.Printf("Error: %v\n", err)
+		return
+	}
+
+	// 获取结果
+	stats := pinger.Statistics() // 获取统计数据
+	fmt.Printf("Ping statistics for %s:\n", host)
+	fmt.Printf("Packets: Sent = %d, Received = %d, Lost = %d (%.2f%% loss)\n",
+		stats.PacketsSent, stats.PacketsRecv, stats.PacketLoss)
+	fmt.Printf("Round-trip times: Min = %v, Max = %v, Avg = %v\n",
+		stats.MinRtt, stats.MaxRtt, stats.AvgRtt)
+}

+ 88 - 0
rabbitmq/go-rabbitmq/agent/test.go

@@ -0,0 +1,88 @@
+package main
+
+import (
+	"encoding/json"
+	"fmt"
+	rabbitmq "github.com/wagslane/go-rabbitmq"
+	"log"
+)
+
+type Message struct {
+	ID     string `json:"id"`
+	Method string `json:"method"`
+	Body   []byte `json:"body"`
+}
+
+var FuncMap = make(map[string]func(message *Message))
+
+var MQUrl = "amqp://lxz:lxz664278@106.54.33.152:5672/lxz"
+var ExchangeName = "Agent_exchange1"
+var QueueName = "Agent_queue1"
+
+var ResultExchangeName = "Agent_exchange1"
+
+func InitMQ(RoutingKey string) {
+
+	conn, err := rabbitmq.NewConn(
+		MQUrl,
+		//rabbitmq.WithConnectionOptionsLogging,
+	)
+	if err != nil {
+		panic(err)
+	}
+
+	consumer, err := rabbitmq.NewConsumer(
+		conn,
+		QueueName,
+		rabbitmq.WithConsumerOptionsRoutingKey(RoutingKey),
+		rabbitmq.WithConsumerOptionsExchangeDeclare,
+		rabbitmq.WithConsumerOptionsExchangeName(ExchangeName),
+		rabbitmq.WithConsumerOptionsExchangeKind("direct"),
+	)
+	if err != nil {
+		InitMQ(RoutingKey)
+		return
+	}
+
+	err = consumer.Run(func(d rabbitmq.Delivery) (action rabbitmq.Action) {
+		// 处理消息
+		message, err := processMessage(d.Body)
+		if err != nil {
+			return
+		}
+		//log.Println("消息:", message)
+		//调用函数
+		if _, ok := FuncMap[message.Method]; !ok {
+			return
+		}
+		FuncMap[message.Method](message)
+		return rabbitmq.Ack
+	})
+	if err != nil {
+		log.Println("消费消息错误:", err)
+		InitMQ(RoutingKey)
+	}
+	return
+}
+
+func processMessage(msg []byte) (*Message, error) {
+	var message Message
+	err := json.Unmarshal(msg, &message)
+	if err != nil {
+		log.Printf("反序列化消息错误:%s\n", err)
+		return nil, err
+	}
+	return &message, nil
+}
+
+func main() {
+	go InitMQ("1")
+	go InitMQ("2")
+	FuncMap["test1"] = func(message *Message) {
+		fmt.Println(message.ID + message.Method)
+	}
+	FuncMap["test2"] = func(message *Message) {
+		fmt.Println(message.ID + message.Method)
+	}
+	select {}
+}

+ 56 - 0
rabbitmq/go-rabbitmq/main.go

@@ -1,4 +1,60 @@
 package main
 
+import (
+	"demo/rabbitmq/go-rabbitmq/ra"
+	"encoding/json"
+	"github.com/wagslane/go-rabbitmq"
+)
+
 func main() {
+
+	conn, _ := rabbitmq.NewConn(
+		ra.MQUrl,
+		rabbitmq.WithConnectionOptionsLogging,
+	)
+	defer conn.Close()
+	pub, err := ra.NewPublisher(conn)
+	if err != nil {
+
+	}
+	defer pub.Close()
+	//go func() {
+	//	for i := 0; i < 100; i++ {
+	//		fmt.Println("1:" + strconv.Itoa(i))
+	//		ra.SendMessage(
+	//			ra.Message{
+	//				ID:     strconv.Itoa(i),
+	//				Method: "test1",
+	//				Body:   []byte(""),
+	//			}, "1", pub)
+	//	}
+	//
+	//}()
+	//go func() {
+	//
+	//	for i := 0; i < 100; i++ {
+	//		fmt.Println("2:" + strconv.Itoa(i))
+	//		ra.SendMessage(
+	//			ra.Message{
+	//				ID:     strconv.Itoa(i),
+	//				Method: "test2",
+	//				Body:   []byte(""),
+	//			}, "", pub)
+	//	}
+	//
+	//}()
+	//time.Sleep(time.Second * 10)
+
+	var m = map[string]interface{}{
+		"code":   200,
+		"msg":    "success",
+		"status": false,
+	}
+	b, _ := json.Marshal(m)
+	ra.SendMessage(
+		ra.Message{
+			ID:     "ddf5379f-9299-405a-841b-01d19a4ea81d",
+			Method: "createVM",
+			Body:   b,
+		}, "", pub)
 }

+ 6 - 16
rabbitmq/go-rabbitmq/ra/test.go

@@ -17,8 +17,8 @@ type Message struct {
 var FuncMap = make(map[string]func(message *Message))
 
 var MQUrl = "amqp://lxz:lxz664278@106.54.33.152:5672/lxz"
-var ExchangeName = "Agent_exchange"
-var QueueName = "Agent_queue"
+var ExchangeName = "Agent_exchange1"
+var QueueName = "Agent_queue1"
 var RoutingKey = "192.168.2.122"
 
 var ResultExchangeName = "Server_exchange"
@@ -77,7 +77,7 @@ func processMessage(msg []byte) (*Message, error) {
 	return &message, nil
 }
 
-func newPublisher(conn *rabbitmq.Conn) (*rabbitmq.Publisher, error) {
+func NewPublisher(conn *rabbitmq.Conn) (*rabbitmq.Publisher, error) {
 	pub, err := rabbitmq.NewPublisher(
 		conn,
 	)
@@ -86,27 +86,17 @@ func newPublisher(conn *rabbitmq.Conn) (*rabbitmq.Publisher, error) {
 	}
 
 	pub.NotifyReturn(func(r rabbitmq.Return) {
-		log.Printf("message returned from server: %s", string(r.Body))
+		//log.Printf("message returned from server: %s", string(r.Body))
 	})
 
 	pub.NotifyPublish(func(c rabbitmq.Confirmation) {
-		log.Printf("message confirmed from server. tag: %v, ack: %v", c.DeliveryTag, c.Ack)
+		//log.Printf("message confirmed from server. tag: %v, ack: %v", c.DeliveryTag, c.Ack)
 	})
 	return pub, nil
 }
 
-func SendMessage(message Message, key string) error {
+func SendMessage(message Message, key string, pub *rabbitmq.Publisher) error {
 
-	conn, err := rabbitmq.NewConn(
-		MQUrl,
-		rabbitmq.WithConnectionOptionsLogging,
-	)
-	defer conn.Close()
-
-	pub, err := newPublisher(conn)
-	if err != nil {
-		return err
-	}
 	marshal, err := json.Marshal(message)
 	if err != nil {
 		log.Printf("序列化消息错误: %s\n", err)