|
@@ -1,11 +1,14 @@
|
|
|
package task
|
|
|
|
|
|
import (
|
|
|
+ "fmt"
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
|
"github.com/gogf/gf/v2/os/glog"
|
|
|
+ "golang.org/x/crypto/ssh"
|
|
|
"golang.org/x/net/context"
|
|
|
"net"
|
|
|
"nodeMonitor/internal/model"
|
|
|
+ "nodeMonitor/internal/model/entity"
|
|
|
"nodeMonitor/internal/service"
|
|
|
"nodeMonitor/library/nettools"
|
|
|
"sync"
|
|
@@ -26,9 +29,22 @@ func Ping(ctx context.Context) {
|
|
|
//glog.Debug(ctx, target)
|
|
|
go PingTask(ctx, target.Host, &wg, target.PingType, target.Port, target.Id)
|
|
|
}
|
|
|
+
|
|
|
wg.Wait()
|
|
|
+ go PingStatus(ctx)
|
|
|
+}
|
|
|
+
|
|
|
+func PingStatus(ctx context.Context) {
|
|
|
+
|
|
|
+ nodeList, err := service.Node().GetNode(ctx)
|
|
|
+ if err != nil {
|
|
|
+ glog.Debug(ctx, err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, target := range nodeList {
|
|
|
+ CheckNodeStatus(ctx, target)
|
|
|
+ }
|
|
|
|
|
|
- go CheckNodeStatus(ctx)
|
|
|
}
|
|
|
|
|
|
func PingTask(ctx context.Context, t string, wg *sync.WaitGroup, pingType int, hostPort int, serverid int) {
|
|
@@ -70,7 +86,7 @@ func PingTask(ctx context.Context, t string, wg *sync.WaitGroup, pingType int, h
|
|
|
}
|
|
|
stat.RevcPk = stat.RevcPk + 1
|
|
|
} else {
|
|
|
- glog.Debug(ctx, "[func:StartPing IcmpPing] ID:", i, " IP:", addr, "| err:", rest.Error())
|
|
|
+ //glog.Debug(ctx, "[func:StartPing IcmpPing] ID:", i, " IP:", addr, "| err:", rest.Error())
|
|
|
lossPK = lossPK + 1
|
|
|
}
|
|
|
stat.SendPk = stat.SendPk + 1
|
|
@@ -83,7 +99,7 @@ func PingTask(ctx context.Context, t string, wg *sync.WaitGroup, pingType int, h
|
|
|
} else {
|
|
|
stat.AvgDelay = 0.0
|
|
|
}
|
|
|
- glog.Debug(ctx, "[func:IcmpPing] Finish Addr:", addr, " MaxDelay:", stat.MaxDelay, " MinDelay:", stat.MinDelay, " AvgDelay:", stat.AvgDelay, " Revc:", stat.RevcPk, " LossPK:", stat.LossPk)
|
|
|
+ //glog.Debug(ctx, "[func:IcmpPing] Finish Addr:", addr, " MaxDelay:", stat.MaxDelay, " MinDelay:", stat.MinDelay, " AvgDelay:", stat.AvgDelay, " Revc:", stat.RevcPk, " LossPK:", stat.LossPk)
|
|
|
} else {
|
|
|
stat.AvgDelay = 0.00
|
|
|
stat.MinDelay = 0.00
|
|
@@ -91,7 +107,7 @@ func PingTask(ctx context.Context, t string, wg *sync.WaitGroup, pingType int, h
|
|
|
stat.SendPk = 0
|
|
|
stat.RevcPk = 0
|
|
|
stat.LossPk = 100
|
|
|
- glog.Debug(ctx, "[func:IcmpPing] Finish Addr:", addr, " Unable to resolve destination host")
|
|
|
+ //glog.Debug(ctx, "[func:IcmpPing] Finish Addr:", addr, " Unable to resolve destination host")
|
|
|
}
|
|
|
|
|
|
//添加到数据库
|
|
@@ -116,43 +132,89 @@ func AddPingLog(ctx context.Context, pingres model.PingSt, addr string, serverid
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func CheckNodeStatus(ctx context.Context) {
|
|
|
+func CheckNodeStatus(ctx context.Context, target *entity.Node) {
|
|
|
|
|
|
- nodeList, err := service.Node().GetNode(ctx)
|
|
|
+ glog.Debug(ctx, "start url req .....")
|
|
|
+ //获取不通的IP进程url请求
|
|
|
+ status, err := service.Ping().GetStatus(ctx, target.Id)
|
|
|
if err != nil {
|
|
|
- glog.Debug(ctx, err.Error())
|
|
|
+ glog.Error(ctx, err.Error())
|
|
|
return
|
|
|
}
|
|
|
- for _, target := range nodeList {
|
|
|
- glog.Debug(ctx, "start url req .....")
|
|
|
- //获取不通的IP进程url请求
|
|
|
- status, err := service.Ping().GetStatus(ctx, target.Id)
|
|
|
+ if status {
|
|
|
+
|
|
|
+ if target.UrlStatus == 200 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ client := g.Client()
|
|
|
+ client.SetTimeout(30 * time.Second)
|
|
|
+ r, err := client.Get(ctx, target.Url)
|
|
|
if err != nil {
|
|
|
- glog.Error(ctx, err.Error())
|
|
|
+ glog.Debug(ctx, err.Error())
|
|
|
+ SSHTaskCommand(ctx, target.Host, target.Port)
|
|
|
return
|
|
|
}
|
|
|
- if status {
|
|
|
-
|
|
|
- if target.UrlStatus == 200 {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- r, err := g.Client().Get(ctx, target.Url)
|
|
|
+ defer r.Close()
|
|
|
+ glog.Debug(ctx, "req :", target.Url, "status :", r.Status)
|
|
|
+ if r.StatusCode == 200 {
|
|
|
+ err := service.Node().UpdateNodeUrlStatus(ctx, model.NodeCreateInput{Host: target.Host, UrlStatus: r.StatusCode})
|
|
|
if err != nil {
|
|
|
- glog.Error(ctx, err.Error())
|
|
|
+ glog.Debug(ctx, err.Error())
|
|
|
return
|
|
|
}
|
|
|
- defer r.Close()
|
|
|
- glog.Debug(ctx, "req :", target.Url, "status :", r.Status)
|
|
|
- if r.StatusCode == 200 {
|
|
|
- err := service.Node().UpdateNodeUrlStatus(ctx, model.NodeCreateInput{Host: target.Host, UrlStatus: r.StatusCode})
|
|
|
- if err != nil {
|
|
|
- glog.Debug(ctx, err.Error())
|
|
|
- return
|
|
|
- }
|
|
|
- }
|
|
|
+ } else {
|
|
|
+ SSHTaskCommand(ctx, target.Host, target.Port)
|
|
|
}
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+func SSHTaskCommand(ctx context.Context, host string, port int) {
|
|
|
+
|
|
|
+ sshPassword, err := g.Cfg().Get(ctx, "node.sshPassword")
|
|
|
+ if err != nil {
|
|
|
+ glog.Debug(ctx, err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ sshUsername, err := g.Cfg().Get(ctx, "node.sshUsername")
|
|
|
+ if err != nil {
|
|
|
+ glog.Debug(ctx, err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ sshCommand, err := g.Cfg().Get(ctx, "node.sshCommand")
|
|
|
+ if err != nil {
|
|
|
+ glog.Debug(ctx, err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ s2 := fmt.Sprintf("%s:%d\n", host, port)
|
|
|
+ // 建立SSH客户端连接
|
|
|
+ client, err := ssh.Dial("tcp", s2, &ssh.ClientConfig{
|
|
|
+ User: sshUsername.String(),
|
|
|
+ Auth: []ssh.AuthMethod{ssh.Password(sshPassword.String())},
|
|
|
+ HostKeyCallback: ssh.InsecureIgnoreHostKey(),
|
|
|
+ })
|
|
|
+ if err != nil {
|
|
|
+ //log.Fatalf("SSH dial error: %s", err.Error())
|
|
|
+ glog.Debug(ctx, "SSH dial error:", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
+ // 建立新会话
|
|
|
+ session, err := client.NewSession()
|
|
|
+ defer session.Close()
|
|
|
+ if err != nil {
|
|
|
+ //log.Fatalf("new session error: %s", err.Error())
|
|
|
+ glog.Debug(ctx, "new session error:", err.Error())
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
+ result, err := session.Output(sshCommand.String())
|
|
|
+ if err != nil {
|
|
|
+ //fmt.Fprintf(os.Stdout, "Failed to run command, Err:%s", err.Error())
|
|
|
+ //os.Exit(0)
|
|
|
+ glog.Debug(ctx, err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ glog.Debug(ctx, result)
|
|
|
}
|