Forráskód Böngészése

添加ping恢复自动执行 ssh命令

alroyso 9 hónapja
szülő
commit
93cd077e25

+ 7 - 1
README.MD

@@ -15,4 +15,10 @@ gf build main.go -n nodeMonitor -a amd64 -s linux
 gf build main.go -n nodeMonitorTask -a amd64 -s linux
 
 
-gf build tak_main.go -n nodeMonitorTask -a amd64 -s linux -p /bin
+gf build tak_main.go -n nodeMonitorTask -a amd64 -s linux -p /bin
+
+
+
+o6g6lij1
+85734bd4
+http://166.88.61.180:8888/b5b84fbd/

+ 1 - 0
api/v1/node.go

@@ -29,6 +29,7 @@ type NodeEditReq struct {
 	Host        string `p:"host" v:"required#节点不能为空"`
 	Port        int    `p:"port"`
 	Url         string `p:"url"`
+	UrlRecover  string `p:"url_recover"`
 	PingType    int    `p:"pingType"`
 	UrlStatus   int    `p:"urlstatus"`
 	IsNotice    int    `p:"isNotice"`

+ 7 - 6
api/v1/pingconfig.go

@@ -14,12 +14,13 @@ type PingConfigGetRes struct {
 }
 
 type PingConfigEditReq struct {
-	g.Meta    `path:"/edit" tags:"edit" method:"post" summary:"编辑节点配置"`
-	NodeDie   int    `p:"nodedie"`
-	NodeCount int    `p:"nodecount"`
-	NodeLoos  int    `p:"nodeloos"`
-	PingTime  int    `p:"pingtime"`
-	PingName  string `p:"pingname"`
+	g.Meta      `path:"/edit" tags:"edit" method:"post" summary:"编辑节点配置"`
+	NodeDie     int    `p:"nodedie"`
+	NodeCount   int    `p:"nodecount"`
+	NodeLoos    int    `p:"nodeloos"`
+	PingTime    int    `p:"pingtime"`
+	PingName    string `p:"pingname"`
+	NodeRecover int    `p:"noderecover"`
 }
 type PingConfigEditRes struct {
 }

+ 4 - 7
go.mod

@@ -3,19 +3,16 @@ module nodeMonitor
 go 1.15
 
 require (
-	github.com/BurntSushi/toml v1.3.2 // indirect
-	github.com/fatih/color v1.16.0 // indirect
 	github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1
 	github.com/gogf/gf/contrib/drivers/mysql/v2 v2.6.3
-	github.com/gogf/gf/v2 v2.6.3
+	github.com/gogf/gf/contrib/nosql/redis/v2 v2.7.1
+	github.com/gogf/gf/v2 v2.7.1
 	github.com/gorilla/websocket v1.5.1
-	github.com/grokify/html-strip-tags-go v0.1.0 // indirect
-	github.com/magiconair/properties v1.8.7 // indirect
 	github.com/miekg/dns v1.1.50
 	github.com/rivo/uniseg v0.4.7 // indirect
 	github.com/robfig/cron v1.2.0
 	github.com/tiger1103/gfast-token v1.0.1
 	go.opentelemetry.io/otel/sdk v1.24.0 // indirect
-	golang.org/x/crypto v0.19.0
-	golang.org/x/net v0.21.0
+	golang.org/x/crypto v0.22.0
+	golang.org/x/net v0.24.0
 )

+ 21 - 5
go.sum

@@ -2,7 +2,13 @@ github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi
 github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
 github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
+github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
+github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
+github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
 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=
@@ -12,6 +18,7 @@ github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/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/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
 github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
@@ -37,9 +44,12 @@ github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGi
 github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8=
 github.com/gogf/gf/contrib/drivers/mysql/v2 v2.6.3 h1:dRGGKKiT9FEnxhfHFerojy34uCKHgReKgpMbAOtqhsY=
 github.com/gogf/gf/contrib/drivers/mysql/v2 v2.6.3/go.mod h1:sGdaCPgN1AY0tho+WYAgYdUHJkXwuDf76M3ASgHXWRQ=
+github.com/gogf/gf/contrib/nosql/redis/v2 v2.7.1 h1:AqwPDOuxidBX8gnGj65tp4Whh5/6GT1HyzlmbdXJH7Y=
+github.com/gogf/gf/contrib/nosql/redis/v2 v2.7.1/go.mod h1:+OrkFvkcxtfw8A1zMXOfZ4JLM7iKzpmUYChp6PNWPFY=
 github.com/gogf/gf/v2 v2.2.1/go.mod h1:thvkyb43RWUu/m05sRm4CbH9r7t7/FrW2M56L9Ystwk=
-github.com/gogf/gf/v2 v2.6.3 h1:DoqeuwU98wotpFoDSQEx8RZbmJdK8KdGiJtzJeqpyIo=
 github.com/gogf/gf/v2 v2.6.3/go.mod h1:x2XONYcI4hRQ/4gMNbWHmZrNzSEIg20s2NULbzom5k0=
+github.com/gogf/gf/v2 v2.7.1 h1:Ukp7vzwh6VKnivEEx/xiMc61dL1HVZqCCHl//3GBRxc=
+github.com/gogf/gf/v2 v2.7.1/go.mod h1:3oyGjyLHtSSo8kQ57Nj1TPdUNc0e2HS0A2J+KkXoW+I=
 github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs=
 github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -100,6 +110,8 @@ github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAl
 github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/redis/go-redis/v9 v9.2.1 h1:WlYJg71ODF0dVspZZCpYmoF1+U1Jjk9Rwd7pq6QmlCg=
+github.com/redis/go-redis/v9 v9.2.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
 github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
@@ -140,8 +152,9 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
-golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
 golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
+golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
+golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
 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=
@@ -162,8 +175,9 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
 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=
 golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
-golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
 golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
+golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
+golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -202,15 +216,17 @@ 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.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
 golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
+golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 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=
 golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
 golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
-golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=
 golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
+golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q=
+golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=

+ 1 - 1
hack/config.yaml

@@ -21,7 +21,7 @@ gfcli:
       extra: ""
   gen:
     dao:
-      - link: "mysql:nodemonitor:m4A6zLaDnRCNd4xw@tcp(43.129.242.146:33060)/nodemonitor?loc=Local&parseTime=true"
+      - link: "mysql:nodemonitor:m4A6zLaDnRCNd4xw@tcp(166.88.61.180:33060)/nodemonitor?loc=Local&parseTime=true"
         # tables: "sys_user"
         # removePrefix: "gf_"
         descriptionTag: true

+ 52 - 40
internal/cmd/cmd.go

@@ -2,13 +2,19 @@ package cmd
 
 import (
 	"context"
+	"fmt"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/net/ghttp"
 	"github.com/gogf/gf/v2/net/goai"
 	"github.com/gogf/gf/v2/os/gcmd"
+	"github.com/gogf/gf/v2/os/gcron"
+	"github.com/gogf/gf/v2/os/glog"
 	"nodeMonitor/internal/consts"
 	"nodeMonitor/internal/router"
+	"nodeMonitor/internal/service"
+	"nodeMonitor/internal/task"
 	"nodeMonitor/internal/websocket"
+	"time"
 )
 
 var (
@@ -31,10 +37,10 @@ var (
 			// Custom enhance API document.
 			enhanceOpenAPIDoc(s)
 
-			//err = StartPingStart(ctx)
-			//if err != nil {
-			//	return err
-			//}
+			err = startPingStatus(ctx)
+			if err != nil {
+				return err
+			}
 			//
 			//defer func() {
 			//
@@ -64,39 +70,45 @@ func enhanceOpenAPIDoc(s *ghttp.Server) {
 	}
 }
 
-//func test(ctx context.Context) {
-//	taskStatusTime, err := g.Cfg().Get(ctx, "node.taskStatusTime")
-//	if err != nil {
-//		glog.Debug(ctx, err.Error())
-//		return
-//	}
-//
-//	s := fmt.Sprintf("0 */%d * * * *", taskStatusTime.Int())
-//	t, err := task.GetCronNextTime(s, time.Now())
-//	glog.Info(ctx, "NextTime:", t, err)
-//
-//	for i := 0; i < 3; i++ {
-//		glog.Info(ctx, "执行任务:", i)
-//	}
-//}
-//
-//func TestCrom(ctx context.Context) error {
-//	taskStatusTime, err := g.Cfg().Get(ctx, "node.taskStatusTime")
-//	if err != nil {
-//		glog.Debug(ctx, err.Error())
-//		return err
-//	}
-//
-//	taskName, err := g.Cfg().Get(ctx, "node.taskName")
-//	if err != nil {
-//		glog.Debug(ctx, err.Error())
-//		return err
-//	}
-//	s := fmt.Sprintf("0 */%d * * * *", taskStatusTime.Int())
-//	t, err := task.GetCronNextTime(s, time.Now())
-//	glog.Info(ctx, "NextTime:", t, err)
-//	_, err = gcron.AddSingleton(ctx, s, func(ctx context.Context) {
-//		go test(ctx)
-//	}, taskName.String())
-//	return nil
-//}
+func startPingStatus(ctx context.Context) error {
+	taskStatusTime, err := g.Cfg().Get(ctx, "node.taskStatusTime")
+	if err != nil {
+		glog.Error(ctx, err.Error())
+		return err
+	}
+
+	taskName, err := g.Cfg().Get(ctx, "node.taskName")
+	if err != nil {
+		glog.Error(ctx, err.Error())
+		return err
+	}
+
+	s := fmt.Sprintf("0 */%d * * * *", taskStatusTime.Int())
+	t, err := task.GetCronNextTime(s, time.Now())
+	if err != nil {
+		glog.Error(ctx, err.Error())
+		return err
+	}
+	glog.Info(ctx, "NextTime:", t, err)
+	logMsg := "NextTime:" + t.String()
+	service.TaskLog().Create(ctx, "gcron", logMsg)
+	_, err = gcron.AddSingleton(ctx, s, func(ctx context.Context) {
+		taskStatusTime, err := g.Cfg().Get(ctx, "node.taskStatusTime")
+		if err != nil {
+			glog.Error(ctx, err.Error())
+			return
+		}
+
+		s := fmt.Sprintf("0 */%d * * * *", taskStatusTime.Int())
+		t, err := task.GetCronNextTime(s, time.Now())
+		if err != nil {
+			glog.Error(ctx, err.Error())
+			return
+		}
+		glog.Info(ctx, "NextTime:", t, err)
+		logMsg := "PingStatus NextTime:" + t.String()
+		service.TaskLog().Create(ctx, "gcron", logMsg)
+		task.PingStatus(ctx, t)
+	}, taskName.String())
+	return nil
+}

+ 8 - 0
internal/consts/context.go

@@ -4,3 +4,11 @@ var (
 	// CtxKey 上下文变量存储键名,前后端系统共享
 	CtxKey = "GFastContext"
 )
+
+type NodeStatus int
+
+const (
+	Normal NodeStatus = iota
+	Down
+	Recovered
+)

+ 9 - 8
internal/controller/Node.go

@@ -64,14 +64,15 @@ func (c *sNode) Del(ctx context.Context, req *v1.NodeDelReq) (res *v1.NodeDelRes
 
 func (c *sNode) Edit(ctx context.Context, req *v1.NodeEditReq) (res *v1.NodeEditRes, err error) {
 	err = service.Node().UpdateNode(ctx, model.NodeEditInput{
-		Id:        req.Id,
-		Name:      req.Name,
-		Host:      req.Host,
-		Port:      req.Port,
-		Url:       req.Url,
-		PingType:  req.PingType,
-		UrlStatus: req.UrlStatus,
-		IsNotice:  req.IsNotice,
+		Id:         req.Id,
+		Name:       req.Name,
+		Host:       req.Host,
+		Port:       req.Port,
+		Url:        req.Url,
+		UrlRecover: req.UrlRecover,
+		PingType:   req.PingType,
+		UrlStatus:  req.UrlStatus,
+		IsNotice:   req.IsNotice,
 	})
 
 	err = service.NodeConfig().Edit(ctx, model.NodeConfigAndEditCreateInput{

+ 6 - 5
internal/controller/pingconfig.go

@@ -20,11 +20,12 @@ func (c *sPingConfig) Get(ctx context.Context, req *v1.PingConfigGetReq) (res *v
 }
 func (c *sPingConfig) Edit(ctx context.Context, req *v1.PingConfigEditReq) (res *v1.PingConfigEditRes, err error) {
 	err = service.PingConfig().Edit(ctx, model.PingConfigEditInput{
-		NodeDie:   req.NodeDie,
-		NodeCount: req.NodeCount,
-		NodeLoos:  req.NodeLoos,
-		PingTime:  req.PingTime,
-		PingName:  req.PingName,
+		NodeDie:     req.NodeDie,
+		NodeCount:   req.NodeCount,
+		NodeLoos:    req.NodeLoos,
+		PingTime:    req.PingTime,
+		PingName:    req.PingName,
+		NodeRecover: req.NodeRecover,
 	})
 	return
 }

+ 8 - 7
internal/logic/node/node.go

@@ -90,13 +90,14 @@ func (c *sNode) UpdateNode(ctx context.Context, input model.NodeEditInput) error
 	_, err := dao.Node.Ctx(ctx).Where(g.Map{
 		"id": input.Id,
 	}).Update(g.Map{
-		"host":       input.Host,
-		"name":       input.Name,
-		"port":       input.Port,
-		"url":        input.Url,
-		"ping_type":  input.PingType,
-		"url_status": input.UrlStatus,
-		"is_notice":  input.IsNotice,
+		"host":        input.Host,
+		"name":        input.Name,
+		"port":        input.Port,
+		"url":         input.Url,
+		"url_Recover": input.UrlRecover,
+		"ping_type":   input.PingType,
+		"url_status":  input.UrlStatus,
+		"is_notice":   input.IsNotice,
 	})
 	return err
 }

+ 9 - 0
internal/logic/nodeStatus/nodeStatus.go

@@ -0,0 +1,9 @@
+package nodeStatus
+
+type (
+	sNodeStatus struct{}
+)
+
+func init() {
+
+}

+ 5 - 4
internal/logic/pingconfig/pingconfig.go

@@ -32,10 +32,11 @@ func (c *sPingConfig) Edit(ctx context.Context, input model.PingConfigEditInput)
 			}
 	*/
 	_, err := dao.Pingconfig.Ctx(ctx).Where("ping_name", input.PingName).Update(g.Map{
-		"node_die":   input.NodeDie,
-		"node_count": input.NodeCount,
-		"node_loos":  input.NodeLoos,
-		"ping_time":  input.PingTime,
+		"node_die":     input.NodeDie,
+		"node_count":   input.NodeCount,
+		"node_loos":    input.NodeLoos,
+		"ping_time":    input.PingTime,
+		"node_recover": input.NodeRecover,
 	})
 	return err
 }

+ 93 - 5
internal/logic/pinglog/pinglog.go

@@ -6,6 +6,7 @@ import (
 	"github.com/gogf/gf/v2/os/glog"
 	"github.com/gogf/gf/v2/os/gtime"
 	"golang.org/x/net/context"
+	"nodeMonitor/internal/consts"
 	"nodeMonitor/internal/dao"
 	"nodeMonitor/internal/model"
 	"nodeMonitor/internal/model/do"
@@ -38,14 +39,45 @@ func (c *sPing) Create(ctx context.Context, ping model.PingSt, setverid int) err
 	})
 }
 
+func (c *sPing) GetHyStatus(ctx context.Context, ping model.PingSt, serverid int) (bool, error) {
+
+	pingConfig, err := service.PingConfig().Get(ctx)
+	if err != nil {
+		glog.Debug(ctx, err.Error())
+		return false, err
+	}
+
+	// 查询节点上一次有离线记录的时间
+	var lastDownTime *gtime.Time
+	err = dao.Pinglog.Ctx(ctx).
+		Where("avgdelay = 0").
+		Where("losspk > ?", pingConfig.NodeLoos).
+		Where("maxdelay = 0").
+		Where("serverid = ?", serverid).
+		OrderDesc("create_at").
+		Limit(1).
+		Scan(&lastDownTime)
+	if err != nil {
+		glog.Debug(ctx, err.Error())
+		return false, err
+	}
+
+	// 如果没有找到上一次的离线记录,返回 false
+	if lastDownTime == nil {
+		return false, nil
+	}
+
+	return true, nil
+}
+
 // GetStatus 查询节点状态
 // SELECT *  FROM pinglog WHERE create_at >= DATE_SUB(NOW(),INTERVAL 10 MINUTE) and avgdelay = 0  and losspk >= 0 and maxdelay = 0 and `serverid` = '1'gf
-func (c *sPing) GetStatus(ctx context.Context, serverid int) (bool, error) {
+func (c *sPing) GetStatus(ctx context.Context, serverid int) (consts.NodeStatus, error) {
 	//查询10分钟内的数据
 	startTime, err := g.Cfg().Get(ctx, "node.startTime")
 	if err != nil {
 		glog.Debug(ctx, err.Error())
-		return false, err
+		return consts.Normal, err
 	}
 	//查询的数据超过3次就是不ok了
 	//loos, err := g.Cfg().Get(ctx, "node.loos")
@@ -54,15 +86,71 @@ func (c *sPing) GetStatus(ctx context.Context, serverid int) (bool, error) {
 	//	return false, err
 	//}
 
+	// 获取 ping 配置
 	pingConfig, err := service.PingConfig().Get(ctx)
 	if err != nil {
 		glog.Debug(ctx, err.Error())
-		return false, err
+		return consts.Normal, err
+	}
+
+	// 查询最近10分钟内的 ping 日志,判断节点是否不通
+	failCount, err := dao.Pinglog.Ctx(ctx).
+		Where("create_at > DATE_SUB(NOW(), INTERVAL ? MINUTE)", startTime).
+		Where("avgdelay = 0").
+		Where("losspk > ?", pingConfig.NodeLoos).
+		Where("maxdelay = 0").
+		Where("serverid = ?", serverid).
+		Count()
+	if err != nil {
+		glog.Debug(ctx, err.Error())
+		return consts.Normal, err
+	}
+
+	// 如果节点当前是离线状态
+	if failCount >= pingConfig.NodeDie {
+		// Node is down
+		return consts.Down, nil
+	}
+
+	// 查询节点上一次有离线记录的时间
+	var lastDownTime *gtime.Time
+	err = dao.Pinglog.Ctx(ctx).
+		Where("avgdelay = 0").
+		Where("losspk > ?", pingConfig.NodeLoos).
+		Where("maxdelay = 0").
+		Where("serverid = ?", serverid).
+		OrderDesc("create_at").
+		Limit(1).
+		Scan(&lastDownTime)
+	if err != nil {
+		glog.Debug(ctx, err.Error())
+		return consts.Normal, err
+	}
+
+	// 如果没有找到上一次的离线记录,返回 Normal
+	if lastDownTime == nil {
+		return consts.Normal, nil
+	}
+
+	// 查询最近10分钟内的 ping 日志,判断节点是否恢复
+	successCount, err := dao.Pinglog.Ctx(ctx).
+		Where("create_at > ?", lastDownTime).
+		Where("avgdelay > 0").
+		Where("serverid = ?", serverid).
+		Count()
+	if err != nil {
+		glog.Debug(ctx, err.Error())
+		return consts.Normal, err
+	}
+
+	// 如果节点之前是离线状态且现在恢复了,返回 Recovered
+	if successCount >= pingConfig.NodeRecover {
+		return consts.Recovered, nil
 	}
 
-	count, err := dao.Pinglog.Ctx(ctx).Where("create_at > DATE_SUB(NOW(),INTERVAL ? MINUTE)", startTime.Int()).Where("avgdelay = 0").Where("losspk > ?", pingConfig.NodeLoos).Where("maxdelay = 0 ").Where("serverid = ?", serverid).Count()
+	// 返回正常状态
+	return consts.Normal, nil
 
-	return count >= pingConfig.NodeDie, err
 }
 
 func (c *sPing) ClearLog(ctx context.Context) {

+ 30 - 27
internal/model/node.go

@@ -24,22 +24,24 @@ type NodeConfigAndEditCreateInput struct {
 
 // node_count //node_loos
 type PingConfigEditInput struct {
-	NodeDie   int
-	NodeCount int
-	NodeLoos  int
-	PingTime  int
-	PingName  string
+	NodeDie     int
+	NodeCount   int
+	NodeLoos    int
+	PingTime    int
+	PingName    string
+	NodeRecover int
 }
 
 type NodeEditInput struct {
-	Id        int
-	Name      string
-	Host      string
-	Port      int
-	Url       string
-	PingType  int
-	UrlStatus int
-	IsNotice  int
+	Id         int
+	Name       string
+	Host       string
+	Port       int
+	Url        string
+	UrlRecover string
+	PingType   int
+	UrlStatus  int
+	IsNotice   int
 }
 
 type NodeDelInput struct {
@@ -83,20 +85,21 @@ type EntityNodeConfigInfo struct {
 }
 
 type NodeInfo struct {
-	g.Meta    `orm:"table:node"`
-	Id        int         `json:"id"        description:"ID主键自动添加"`             // ID主键自动添加
-	Name      string      `json:"name"      description:"服务器名称"`                // 服务器名称
-	Host      string      `json:"host"      description:"服务器IP"`                // 服务器IP
-	Port      int         `json:"port"      description:"服务器端口"`                // 服务器端口
-	Url       string      `json:"url"       description:"服务器切换地址"`              // 服务器切换地址
-	UpdateAt  *gtime.Time `json:"updateAt"  description:"更新时间"`                 // 更新时间
-	CreateAt  *gtime.Time `json:"createAt"  description:"创建时间"`                 // 创建时间
-	PingType  int         `json:"pingType"  description:"服务器延迟类型 0 icmp 1 tcp"` // 服务器延迟类型 0 icmp 1 tcp
-	UrlStatus int         `json:"urlStatus" description:"用于表示url是否执行完成"`        // 用于表示url是否执行完成
-	NodeMs    int         `json:"nodeMs"    description:"服务器延迟"`                // 服务器延迟
-	UrlCount  int         `json:"urlCount"  description:"用于服务器切换IP执行次数"`        // 用于服务器切换IP执行次数
-	UrlRet    string      `json:"urlRet"    description:"切换服务器放回结果"`            // 切换服务器放回结果
-	IsNotice  int         `json:"isNotice"  description:"是否通知到电报"`              // 是否通知到电报
+	g.Meta     `orm:"table:node"`
+	Id         int         `json:"id"        description:"ID主键自动添加"`             // ID主键自动添加
+	Name       string      `json:"name"      description:"服务器名称"`                // 服务器名称
+	Host       string      `json:"host"      description:"服务器IP"`                // 服务器IP
+	Port       int         `json:"port"      description:"服务器端口"`                // 服务器端口
+	Url        string      `json:"url"       description:"服务器切换地址"`              // 服务器切换地址
+	UrlRecover string      `json:"UrlRecover" description:"服务器恢复地址"`             // 服务器切换地址
+	UpdateAt   *gtime.Time `json:"updateAt"  description:"更新时间"`                 // 更新时间
+	CreateAt   *gtime.Time `json:"createAt"  description:"创建时间"`                 // 创建时间
+	PingType   int         `json:"pingType"  description:"服务器延迟类型 0 icmp 1 tcp"` // 服务器延迟类型 0 icmp 1 tcp
+	UrlStatus  int         `json:"urlStatus" description:"用于表示url是否执行完成"`        // 用于表示url是否执行完成
+	NodeMs     int         `json:"nodeMs"    description:"服务器延迟"`                // 服务器延迟
+	UrlCount   int         `json:"urlCount"  description:"用于服务器切换IP执行次数"`        // 用于服务器切换IP执行次数
+	UrlRet     string      `json:"urlRet"    description:"切换服务器放回结果"`            // 切换服务器放回结果
+	IsNotice   int         `json:"isNotice"  description:"是否通知到电报"`              // 是否通知到电报
 }
 
 // 组合模型,用户信息

+ 0 - 41
internal/task/cmd/cmd.go

@@ -70,47 +70,6 @@ func StartPingStart(ctx context.Context) error {
 		_, err = gcron.AddSingleton(ctx, s, func(ctx context.Context) {
 			go task.Ping(ctx)
 		}, "ping_status")
-	} else if nodePing.Int() == 0 {
-
-		taskStatusTime, err := g.Cfg().Get(ctx, "node.taskStatusTime")
-		if err != nil {
-			glog.Error(ctx, err.Error())
-			return err
-		}
-
-		taskName, err := g.Cfg().Get(ctx, "node.taskName")
-		if err != nil {
-			glog.Error(ctx, err.Error())
-			return err
-		}
-
-		s := fmt.Sprintf("0 */%d * * * *", taskStatusTime.Int())
-		t, err := task.GetCronNextTime(s, time.Now())
-		if err != nil {
-			glog.Error(ctx, err.Error())
-			return err
-		}
-		glog.Info(ctx, "NextTime:", t, err)
-		logMsg := "NextTime:" + t.String()
-		service.TaskLog().Create(ctx, "gcron", logMsg)
-		_, err = gcron.AddSingleton(ctx, s, func(ctx context.Context) {
-			taskStatusTime, err := g.Cfg().Get(ctx, "node.taskStatusTime")
-			if err != nil {
-				glog.Error(ctx, err.Error())
-				return
-			}
-
-			s := fmt.Sprintf("0 */%d * * * *", taskStatusTime.Int())
-			t, err := task.GetCronNextTime(s, time.Now())
-			if err != nil {
-				glog.Error(ctx, err.Error())
-				return
-			}
-			glog.Info(ctx, "NextTime:", t, err)
-			logMsg := "PingStatus NextTime:" + t.String()
-			service.TaskLog().Create(ctx, "gcron", logMsg)
-			go task.PingStatus(ctx, t)
-		}, taskName.String())
 	}
 
 	return nil

+ 119 - 115
internal/task/ping.go

@@ -9,6 +9,7 @@ import (
 	"golang.org/x/crypto/ssh"
 	"golang.org/x/net/context"
 	"net"
+	"nodeMonitor/internal/consts"
 	"nodeMonitor/internal/model"
 	"nodeMonitor/internal/model/entity"
 	"nodeMonitor/internal/service"
@@ -137,7 +138,7 @@ func AddPingLog(ctx context.Context, pingres model.PingSt, addr string, serverid
 func CheckNodeStatus(ctx context.Context, nextTime time.Time) {
 	glog.Info(ctx, nextTime)
 	var wg sync.WaitGroup
-	nodeList, err := service.Node().FindNodeMs(ctx)
+	nodeList, err := service.Node().GetNode(ctx)
 	if err != nil {
 		glog.Error(ctx, err.Error())
 		return
@@ -152,130 +153,149 @@ func CheckNodeStatus(ctx context.Context, nextTime time.Time) {
 			return
 		}
 
-		if status {
-			service.TaskLog().Create(ctx, "CheckNodeStatus", fmt.Sprintf("当前节点不正常开启执行urlAndSSH...%d --- %s\n", target.Id, target.Host))
-			go URLTaskCommand(ctx, target, false, &wg)
-		} else {
-			service.TaskLog().Create(ctx, "CheckNodeStatus", fmt.Sprintf("当前节点正常...%d --- 节点 %s 恢复正常\n", target.Id, target.Host))
-			go URLTaskCommand(ctx, target, true, &wg)
-
+		switch status {
+		case consts.Down:
+			logAndCreateTaskLog(ctx, "task_url", fmt.Sprintf("当前节点%s 下线", target.Host))
+			go processNode(ctx, target, false, &wg)
+		case consts.Recovered:
+			logAndCreateTaskLog(ctx, "task_url", fmt.Sprintf("当前节点%s 恢复", target.Host))
+			go processNode(ctx, target, true, &wg)
+		case consts.Normal:
+			logAndCreateTaskLog(ctx, "task_url", fmt.Sprintf("当前节点%s 正常无需操作", target.Host))
 		}
-		// 更新节点的历史状态 //  nodeStatusHistory[target.Id] = status
 
 	}
 
 	wg.Wait()
 }
 
-func URLTaskCommand(ctx context.Context, target *entity.Node, isRecovery bool, wg *sync.WaitGroup) {
-	taskLogMsg := ""
-	//获取不通的IP进程url请求
-	glog.Info(ctx, "获取不通的IP进程url请求")
-	//taskLogMsg = taskLogMsg + ":" + "获取不通的IP进程url请求"
-	glog.Info(ctx, "查询到15分钟的数据")
-	taskLogMsg = taskLogMsg + target.Name + ":" + "查询到15分钟的数据"
-	//service.TaskLog().Create(ctx, "task_url", "查询到15分钟的数据")
-	node, err := service.Node().GetNodeUrlCount(ctx, target.Id)
+func processNode(ctx context.Context, target *entity.Node, isRecovery bool, wg *sync.WaitGroup) {
+	defer wg.Done()
+
+	if isRecovery {
+		// 恢复节点执行过程
+		handleRecovery(ctx, target, "")
+	} else {
+		handleOffline(ctx, target, "")
+	}
+
+}
+
+func GetCronNextTime(cronStr string, t time.Time) (nextTime time.Time, err error) {
+	p := cron.NewParser(cron.Second | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
+	s, err := p.Parse(cronStr)
 	if err != nil {
-		glog.Error(ctx, err.Error())
-		service.TaskLog().Create(ctx, "task_url", err.Error())
 		return
 	}
+	nextTime = s.Next(t)
+	return
+}
 
-	nodeconfig, err := service.NodeConfig().Get(ctx, target.Id)
+func ClearLog(ctx context.Context) {
+	service.Ping().ClearLog(ctx)
+	service.Node().UpdateAllNodeMs(ctx)
+	service.TaskLog().ClearTasLog(ctx)
+}
+
+func handleRecovery(ctx context.Context, target *entity.Node, taskLogMsg string) {
+	client := g.Client()
+	client.SetTimeout(30 * time.Second)
+
+	s := fmt.Sprintf("url_log ---- 开始请求恢复 %s\n", target.UrlRecover)
+	taskLogMsg += ":" + s
+	logAndCreateTaskLog(ctx, "task_url", taskLogMsg)
+
+	response, err := client.Get(ctx, target.UrlRecover)
 	if err != nil {
-		glog.Error(ctx, err.Error())
-		err := service.TaskLog().Create(ctx, "task_ssh", err.Error())
-		if err != nil {
-			glog.Info(ctx, "task_log:", err.Error())
-		}
+		handleRequestError(ctx, "task_url", err, taskLogMsg)
 		return
 	}
+	defer response.Close()
 
-	if target.Url != "" {
-		urlcount := node.UrlCount
-		urlret := ""
-		ipstatus := 0
-		glog.Info(ctx, "start url req .....")
+	processResponse(ctx, response, target.UrlRecover, taskLogMsg)
 
-		client := g.Client()
-		client.SetTimeout(30 * time.Second)
-		var response *gclient.Response
-		if isRecovery {
+	if target.IsNotice == 1 {
+		taskLogMsg = "当前节点已经恢复,已经执行节点切换命令"
+		notifyTelegram(ctx, target.Name, taskLogMsg)
+	}
+}
 
-			s := fmt.Sprintf("url_log ---- 开始请求%s\n", nodeconfig.Sshcommand)
-			taskLogMsg = taskLogMsg + ":" + s
-			glog.Info(ctx, s)
-			service.TaskLog().Create(ctx, "task_url", taskLogMsg)
+func handleOffline(ctx context.Context, target *entity.Node, taskLogMsg string) {
+	glog.Info(ctx, "获取不通的IP进程url请求")
+	taskLogMsg += target.Name + ":" + "查询到15分钟的数据"
+	glog.Info(ctx, "查询到15分钟的数据")
 
-			response, err = client.Get(ctx, nodeconfig.Sshcommand)
-		} else {
+	client := g.Client()
+	client.SetTimeout(30 * time.Second)
 
-			s := fmt.Sprintf("url_log ---- 开始请求%s\n", target.Url)
-			taskLogMsg = taskLogMsg + ":" + s
-			glog.Info(ctx, s)
-			service.TaskLog().Create(ctx, "task_url", taskLogMsg)
-			response, err = client.Get(ctx, target.Url)
-		}
+	s := fmt.Sprintf("url_log ---- 开始请求 %s\n", target.Url)
+	taskLogMsg += ":" + s
+	logAndCreateTaskLog(ctx, "task_url", taskLogMsg)
 
-		if err != nil {
-			s := fmt.Sprintf("url_log ---- 请求错误%s\n", err.Error())
-			taskLogMsg = taskLogMsg + ":" + s
-			service.TaskLog().Create(ctx, "task_url", taskLogMsg)
-			glog.Info(ctx, s)
-			glog.Error(ctx, err.Error())
-			return
-		}
+	response, err := client.Get(ctx, target.Url)
+	if err != nil {
+		handleRequestError(ctx, "task_url", err, taskLogMsg)
+		return
+	}
+	defer response.Close()
 
-		defer response.Close()
-		taskLogMsg = taskLogMsg + ":" + fmt.Sprintf("%s --- %s\n", target.Url, response.Status)
-		//service.TaskLog().Create(ctx, "task_url", fmt.Sprintf("%s --- %s\n", target.Url, r.Status))
-		glog.Info(ctx, "req :", target.Url, "status :", response.Status)
-		//如果成功是放回IP,如果不成功是返回空
-		if response.StatusCode == 200 {
-			urlret = response.ReadAllString()
-			s := fmt.Sprintf("url_log ---- url结果和状态%s --- %d\n", urlret, response.StatusCode)
-			taskLogMsg = taskLogMsg + ":" + s
-			service.TaskLog().Create(ctx, "task_url", taskLogMsg)
-		}
-		urlcount++
-		s := fmt.Sprintf("url_log --- url执行次数%d\n", urlcount)
-		taskLogMsg = taskLogMsg + ":" + s
-		glog.Info(ctx, s)
-		service.TaskLog().Create(ctx, "url_log", taskLogMsg)
-		err = service.Node().UPdateNodeUrlCount(ctx, target.Id, urlcount, urlret, ipstatus)
-		if err != nil {
-			glog.Error(ctx, err.Error())
-			return
-		}
+	processResponse(ctx, response, target.Url, taskLogMsg)
 
-	} else {
-		if target.IsNotice == 1 {
-
-			s := fmt.Sprintf("telegram_log --- %s 节点需要更新换IP,立即执行\n", target.Name)
-			glog.Info(ctx, s)
-			taskLogMsg = taskLogMsg + ":" + s
-			//service.TaskLog().Create(ctx, "telegram_log", s)
-			not := fmt.Sprintf(" @new_pumpcloud	%s 节点需要更新换IP,请帮我立即更换,谢谢!\n", target.Name)
-			service.TaskLog().Create(ctx, "telegram_log", taskLogMsg)
-			//taskLogMsg = taskLogMsg + ":" + s
-			err := telegram.SetTelegramMess(ctx, not)
-			if err != nil {
-				glog.Error(ctx, err.Error())
-				s := fmt.Sprintf("telegram_log --- 电报发送: %s", err.Error())
-				taskLogMsg = taskLogMsg + ":" + s
-				//service.TaskLog().Create(ctx, "telegram_log", s)
-				service.TaskLog().Create(ctx, "telegram_log", taskLogMsg)
-				return
-			}
-			//service.TaskLog().Create(ctx, "telegram_log", taskLogMsg)
-		}
+	// 更新 URL 计数和结果
+	urlcount := target.UrlCount + 1
+	urlret := response.ReadAllString()
+	ipstatus := 0
+
+	err = service.Node().UPdateNodeUrlCount(ctx, target.Id, urlcount, urlret, ipstatus)
+	if err != nil {
+		logAndCreateTaskLog(ctx, "task_url", err.Error())
+		return
 	}
 
-	go SSHTaskCommand(ctx, target, target.Host, target.Port, target.Id)
+	if target.IsNotice == 1 {
+		taskLogMsg = "当前节点已经离线,已经执行节点切换命令"
+		notifyTelegram(ctx, target.Name, taskLogMsg)
+	}
+}
 
-	wg.Done()
+func handleRequestError(ctx context.Context, taskType string, err error, taskLogMsg string) {
+	s := fmt.Sprintf("url_log ---- 请求错误: %s\n", err.Error())
+	taskLogMsg += ":" + s
+	logAndCreateTaskLog(ctx, taskType, taskLogMsg)
+}
+
+func processResponse(ctx context.Context, response *gclient.Response, url string, taskLogMsg string) {
+	taskLogMsg += ":" + fmt.Sprintf("%s --- %s\n", url, response.Status)
+	glog.Info(ctx, "req :", url, "status :", response.Status)
+
+	if response.StatusCode == 200 {
+		urlret := response.ReadAllString()
+		s := fmt.Sprintf("url_log ---- url结果和状态: %s --- %d\n", urlret, response.StatusCode)
+		taskLogMsg += ":" + s
+		logAndCreateTaskLog(ctx, "task_url", taskLogMsg)
+	}
+}
+
+func notifyTelegram(ctx context.Context, nodeName string, taskLogMsg string) {
+
+	not := fmt.Sprintf(" @new_pumpcloud %s---%s\n", nodeName, taskLogMsg)
+	err := telegram.SetTelegramMess(ctx, not)
+	if err != nil {
+		s := fmt.Sprintf("telegram_log --- 电报发送错误: %s\n", err.Error())
+		taskLogMsg += ":" + s
+		logAndCreateTaskLog(ctx, "telegram_log", taskLogMsg)
+		return
+	}
+
+	logAndCreateTaskLog(ctx, "telegram_log", taskLogMsg)
+}
 
+func logAndCreateTaskLog(ctx context.Context, taskType string, message string) {
+	glog.Info(ctx, message)
+	err := service.TaskLog().Create(ctx, taskType, message)
+	if err != nil {
+		glog.Error(ctx, "task_log error: ", err.Error())
+	}
 }
 
 func SSHTaskCommand(ctx context.Context, target *entity.Node, host string, port int, serverid int) {
@@ -376,19 +396,3 @@ func SSHTaskCommand(ctx context.Context, target *entity.Node, host string, port
 
 	//wg.Done()
 }
-
-func GetCronNextTime(cronStr string, t time.Time) (nextTime time.Time, err error) {
-	p := cron.NewParser(cron.Second | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
-	s, err := p.Parse(cronStr)
-	if err != nil {
-		return
-	}
-	nextTime = s.Next(t)
-	return
-}
-
-func ClearLog(ctx context.Context) {
-	service.Ping().ClearLog(ctx)
-	service.Node().UpdateAllNodeMs(ctx)
-	service.TaskLog().ClearTasLog(ctx)
-}

+ 1 - 0
main.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
+	_ "github.com/gogf/gf/contrib/nosql/redis/v2"
 	"github.com/gogf/gf/v2/os/gctx"
 	"nodeMonitor/internal/cmd"
 	_ "nodeMonitor/internal/logic"

+ 3 - 3
manifest/config/config.yaml

@@ -31,9 +31,9 @@ database:
     Path: "resource/log/sql"
 
   default:
-    link: "mysql:nodemonitor:m4A6zLaDnRCNd4xw@tcp(156.234.193.212:33060)/nodemonitor?loc=Local&parseTime=true" #156.234.193.212
+    link: "mysql:nodemonitor:m4A6zLaDnRCNd4xw@tcp(166.88.61.180:33060)/nodemonitor?loc=Local&parseTime=true" #156.234.193.212
     #link: "mysql:root:123456@tcp(127.0.0.1:3306)/nodeMonitor?loc=Local&parseTime=true"
-    debug: true
+    debug: false
     charset: "utf8mb4" #数据库编码
     dryRun: false #空跑
     maxIdle: 10 #连接池最大闲置的连接数
@@ -44,7 +44,7 @@ node:
   startTime: 15 #用于查询15分钟内的数据 单位分钟
   taskName: "ping_task" #任务名称
   taskStatusName: "ping_status_task" #任务名称
-  nodePing: 2 #用于表示是不是检测PING的节点
+  nodePing: 0 #用于表示是不是检测PING的节点
   taskStatusTime: 30 #单位分钟
   rootUsername: "admin"
   rootPassword: "qoqoiwooqp@#"