mao-service-discovery 1.6.0-commit-2023-07-24-04-32-53.0 → 1.6.0-commit-2023-07-24-06-22-14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MaoServerDiscovery +0 -0
- package/package.json +1 -1
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/codeql-analysis.yml +0 -75
- package/.github/workflows/docker-image.yml +0 -24
- package/.github/workflows/docker-publish.yml +0 -94
- package/.github/workflows/go.yml +0 -29
- package/.github/workflows/go_static.yml +0 -29
- package/.github/workflows/npm-publish-release.yml +0 -36
- package/.github/workflows/npm-publish.yml +0 -41
- package/Dockerfile +0 -19
- package/LICENSE +0 -201
- package/MODULES.md +0 -39
- package/README.md +0 -54
- package/bak/index.html +0 -42
- package/bak/receiveProcessIcmpLoopV4V6.bak +0 -73
- package/bak/test/test-icmp-ka-module.go +0 -297
- package/bak/test/test-tech.go +0 -110
- package/bak/using_etcd/main.go +0 -165
- package/cmd/api/aux-data-module.go +0 -14
- package/cmd/api/config-module.go +0 -11
- package/cmd/api/email-module.go +0 -14
- package/cmd/api/gateway-module.go +0 -23
- package/cmd/api/grpc-ka-module.go +0 -29
- package/cmd/api/icmp-ka-module.go +0 -26
- package/cmd/api/restful-server-module.go +0 -13
- package/cmd/api/topo-module.go +0 -31
- package/cmd/api/wechat-module.go +0 -18
- package/cmd/general_client.go +0 -366
- package/cmd/lib/AuxDataProcessor/aux-data-processor-module.go +0 -64
- package/cmd/lib/AuxDataProcessor/env-temp-processor.go +0 -63
- package/cmd/lib/AuxDataProcessor/env-temp-processor_test.go +0 -30
- package/cmd/lib/Config/config-yaml-module.go +0 -303
- package/cmd/lib/Config/config-yaml-module_test.go +0 -308
- package/cmd/lib/Email/login-auth.go +0 -35
- package/cmd/lib/Email/login-auth_test.go +0 -13
- package/cmd/lib/Email/smtp-email-module.go +0 -229
- package/cmd/lib/Email/smtp-email-module_test.go +0 -12
- package/cmd/lib/GrpcKa/grpc-detect-module.go +0 -269
- package/cmd/lib/GrpcKa/grpc-detect-module_test.go +0 -26
- package/cmd/lib/IcmpKa/icmp-detect-module.go +0 -545
- package/cmd/lib/IcmpKa/icmp-detect-module_test.go +0 -23
- package/cmd/lib/InfluxDB/influxdb-util.go +0 -72
- package/cmd/lib/MaoCommon/gps.go +0 -15
- package/cmd/lib/MaoCommon/service-registry-util.go +0 -59
- package/cmd/lib/MaoCommon/service-registry.go +0 -14
- package/cmd/lib/MaoCommon/service-registry_test.go +0 -30
- package/cmd/lib/MaoEnhancedGolang/smtp.go +0 -438
- package/cmd/lib/Restful/restful-server-impl.go +0 -87
- package/cmd/lib/Soap/soap-tplink-util.go +0 -186
- package/cmd/lib/Soap/soap-tplink-util_test.go +0 -45
- package/cmd/lib/Soap/tplink-gateway-module.go +0 -200
- package/cmd/server.go +0 -327
- package/go.mod +0 -38
- package/go.sum +0 -222
- package/grpc.maojianwei.com/server/discovery/api/generate_api_from_protobuf.sh +0 -1
- package/grpc.maojianwei.com/server/discovery/api/mao-server-discovery.pb.go +0 -403
- package/grpc.maojianwei.com/server/discovery/api/mao-server-discovery.proto +0 -35
- package/grpc.maojianwei.com/server/discovery/api/mao-server-discovery_grpc.pb.go +0 -207
- package/incubator/OnosTopoShow/onos-topo-module.go +0 -347
- package/incubator/Wechat/wechat-message-module.go +0 -267
- package/incubator/Wechat/wechat-message-module_test.go +0 -108
- package/main.go +0 -383
- package/notebook/notebook.txt +0 -8
- package/resource/index-email.html +0 -67
- package/resource/index-icmp.html +0 -41
- package/resource/index-onos.html +0 -38
- package/resource/index-server.html +0 -57
- package/resource/index-wechat.html +0 -64
- package/resource/jquery-3.6.0.min.js +0 -2
- package/screenshot/2-cli-output.png +0 -0
- package/screenshot/2-cli-parameters.png +0 -0
- package/screenshot/2-json-format.png +0 -0
- package/screenshot/2-readable-format.png +0 -0
- package/screenshot/client-server-mode-1.png +0 -0
- package/screenshot/client-server-mode-2.png +0 -0
- package/screenshot/client-server-mode-production.png +0 -0
- package/screenshot/show_using_etcd.png +0 -0
- package/statically_linked_compilation.sh +0 -2
- package/util/mao_log.go +0 -42
- package/util/mao_log_test.go +0 -73
- package/util/mao_util.go +0 -53
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
package Email
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
MaoApi "MaoServerDiscovery/cmd/api"
|
|
5
|
-
"MaoServerDiscovery/cmd/lib/MaoCommon"
|
|
6
|
-
"MaoServerDiscovery/cmd/lib/MaoEnhancedGolang"
|
|
7
|
-
"MaoServerDiscovery/util"
|
|
8
|
-
"crypto/tls"
|
|
9
|
-
"fmt"
|
|
10
|
-
"github.com/gin-gonic/gin"
|
|
11
|
-
"strings"
|
|
12
|
-
"time"
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
const (
|
|
16
|
-
MODULE_NAME = "SMTP-Email-module"
|
|
17
|
-
|
|
18
|
-
URL_EMAIL_HOMEPAGE = "/configEmail"
|
|
19
|
-
URL_EMAIL_CONFIG = "/addEmailInfo"
|
|
20
|
-
URL_EMAIL_SHOW = "/getEmailInfo"
|
|
21
|
-
|
|
22
|
-
EMAIL_INFO_CONFIG_PATH = "/email"
|
|
23
|
-
|
|
24
|
-
SUBJECT_FIX_PREFIX = "MaoReport: "
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
type SmtpEmailModule struct {
|
|
28
|
-
|
|
29
|
-
username string
|
|
30
|
-
password string // Attention: password can't be outputted !!!
|
|
31
|
-
smtpServerAddrPort string // addr:port, default port for smtp is 25.
|
|
32
|
-
sender string
|
|
33
|
-
receiver []string
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
// input the message
|
|
37
|
-
sendEmailChannel chan *MaoApi.EmailMessage
|
|
38
|
-
lastSendTimestamp time.Time
|
|
39
|
-
|
|
40
|
-
// same as the other module, it is expected to be global
|
|
41
|
-
//checkInterval uint32
|
|
42
|
-
|
|
43
|
-
needShutdown bool
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
func (s *SmtpEmailModule) RequireShutdown() {
|
|
47
|
-
s.needShutdown = true
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
func (s *SmtpEmailModule) SendEmail(message *MaoApi.EmailMessage) {
|
|
52
|
-
s.sendEmailChannel <- message
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
func (s *SmtpEmailModule) checkEmailInfo() bool {
|
|
56
|
-
|
|
57
|
-
// password may be empty?
|
|
58
|
-
if s.username == "" || s.smtpServerAddrPort == "" || s.sender == "" || len(s.receiver) == 0 {
|
|
59
|
-
// can adapt to "s.receiver == nil"
|
|
60
|
-
return false
|
|
61
|
-
}
|
|
62
|
-
return true
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
func (s *SmtpEmailModule) sendEmail(m *MaoApi.EmailMessage) {
|
|
67
|
-
|
|
68
|
-
if !s.checkEmailInfo() {
|
|
69
|
-
util.MaoLogM(util.WARN, MODULE_NAME, "Fail to send email, please config email info first.")
|
|
70
|
-
return
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Set up authentication information everytime, that allows to update:
|
|
74
|
-
// username, password, smtpServerAddrPort, sender, receiver
|
|
75
|
-
auth := AuthLOGIN(s.username, s.password)
|
|
76
|
-
|
|
77
|
-
// TODO: how to build multiple receivers string?
|
|
78
|
-
// TODO: support multiple receivers
|
|
79
|
-
msg := fmt.Sprintf("To: %s\r\n" +
|
|
80
|
-
"Subject: %s%s\r\n" + "\r\n" +
|
|
81
|
-
"%s\r\n",
|
|
82
|
-
s.receiver[0], SUBJECT_FIX_PREFIX, m.Subject, m.Content)
|
|
83
|
-
|
|
84
|
-
//msg := []byte("To: @.com\r\n" +
|
|
85
|
-
// "Subject: MaoReport: beijing tower\r\n" +
|
|
86
|
-
// "\r\n" +
|
|
87
|
-
// "This is the email body.\r\n")
|
|
88
|
-
|
|
89
|
-
// TODO: make it configurable
|
|
90
|
-
tlsConfig := &tls.Config{
|
|
91
|
-
InsecureSkipVerify: true,
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Connect to the server, authenticate, set the sender and recipient,
|
|
95
|
-
// and send the email all in one step.
|
|
96
|
-
err := MaoEnhancedGolang.SendMail(s.smtpServerAddrPort, auth, s.sender, s.receiver, []byte(msg), tlsConfig)
|
|
97
|
-
if err != nil {
|
|
98
|
-
util.MaoLogM(util.WARN, MODULE_NAME, "Fail to send email, %s", err.Error())
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
func (s *SmtpEmailModule) sendEmailLoop() {
|
|
103
|
-
checkInterval := time.Duration(1000) * time.Millisecond
|
|
104
|
-
checkShutdownTimer := time.NewTimer(checkInterval)
|
|
105
|
-
for {
|
|
106
|
-
select {
|
|
107
|
-
case message := <-s.sendEmailChannel:
|
|
108
|
-
if time.Now().Sub(s.lastSendTimestamp) < 10 * time.Second {
|
|
109
|
-
freezeTimer := time.NewTimer(time.Duration(10) * time.Second)
|
|
110
|
-
sent := false
|
|
111
|
-
for !sent {
|
|
112
|
-
select {
|
|
113
|
-
case <-freezeTimer.C:
|
|
114
|
-
util.MaoLogM(util.INFO, MODULE_NAME, "Sending email, pending: %d", len(s.sendEmailChannel))
|
|
115
|
-
s.sendEmail(message)
|
|
116
|
-
s.lastSendTimestamp = time.Now()
|
|
117
|
-
sent = true
|
|
118
|
-
case <-checkShutdownTimer.C:
|
|
119
|
-
util.MaoLogM(util.DEBUG, MODULE_NAME, "CheckShutdown while freezing, event queue len %d", len(s.sendEmailChannel))
|
|
120
|
-
if s.needShutdown {
|
|
121
|
-
util.MaoLogM(util.WARN, MODULE_NAME, "Exit while freezing, the sendEmailChannel len: %d", len(s.sendEmailChannel))
|
|
122
|
-
return
|
|
123
|
-
}
|
|
124
|
-
checkShutdownTimer.Reset(checkInterval)
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
} else {
|
|
128
|
-
util.MaoLogM(util.INFO, MODULE_NAME, "Sending email, pending: %d", len(s.sendEmailChannel))
|
|
129
|
-
s.sendEmail(message)
|
|
130
|
-
s.lastSendTimestamp = time.Now()
|
|
131
|
-
}
|
|
132
|
-
case <-checkShutdownTimer.C:
|
|
133
|
-
util.MaoLogM(util.DEBUG, MODULE_NAME, "CheckShutdown, event queue len %d", len(s.sendEmailChannel))
|
|
134
|
-
if s.needShutdown {
|
|
135
|
-
if len(s.sendEmailChannel) != 0 {
|
|
136
|
-
util.MaoLogM(util.WARN, MODULE_NAME, "Exiting, but the sendEmailChannel is not empty, len: %d", len(s.sendEmailChannel))
|
|
137
|
-
}
|
|
138
|
-
util.MaoLogM(util.INFO, MODULE_NAME, "Exit.")
|
|
139
|
-
return
|
|
140
|
-
}
|
|
141
|
-
checkShutdownTimer.Reset(checkInterval)
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
func (s *SmtpEmailModule) InitSmtpEmailModule() bool {
|
|
147
|
-
s.sendEmailChannel = make(chan *MaoApi.EmailMessage, 1024)
|
|
148
|
-
s.needShutdown = false
|
|
149
|
-
|
|
150
|
-
go s.sendEmailLoop()
|
|
151
|
-
|
|
152
|
-
s.configRestControlInterface()
|
|
153
|
-
|
|
154
|
-
return true
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
func (s *SmtpEmailModule) configRestControlInterface() {
|
|
158
|
-
restfulServer := MaoCommon.ServiceRegistryGetRestfulServerModule()
|
|
159
|
-
if restfulServer == nil {
|
|
160
|
-
util.MaoLogM(util.WARN, MODULE_NAME, "Fail to get RestfulServerModule, unable to register restful apis.")
|
|
161
|
-
return
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
restfulServer.RegisterUiPage(URL_EMAIL_HOMEPAGE, s.showEmailPage)
|
|
165
|
-
restfulServer.RegisterGetApi(URL_EMAIL_SHOW, s.showEmailInfo)
|
|
166
|
-
restfulServer.RegisterPostApi(URL_EMAIL_CONFIG, s.processEmailInfo)
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
func (s *SmtpEmailModule) showEmailPage(c *gin.Context) {
|
|
170
|
-
c.HTML(200, "index-email.html", nil)
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
func (s *SmtpEmailModule) showEmailInfo(c *gin.Context) {
|
|
174
|
-
data := make(map[string]interface{})
|
|
175
|
-
data["username"] = s.username
|
|
176
|
-
data["smtpServerAddrPort"] = s.smtpServerAddrPort
|
|
177
|
-
data["sender"] = s.sender
|
|
178
|
-
data["receiver"] = s.receiver
|
|
179
|
-
|
|
180
|
-
// Attention: password can't be outputted !!!
|
|
181
|
-
c.JSON(200, data)
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
func (s *SmtpEmailModule) processEmailInfo(c *gin.Context) {
|
|
185
|
-
|
|
186
|
-
// TODO: check email address, limit the length of username/password/email. Prevent injection attack
|
|
187
|
-
|
|
188
|
-
username, ok := c.GetPostForm("username")
|
|
189
|
-
if ok {
|
|
190
|
-
s.username = username
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
password, ok := c.GetPostForm("password")
|
|
194
|
-
if ok {
|
|
195
|
-
s.password = password
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
smtpServerAddrPort, ok := c.GetPostForm("smtpServerAddrPort")
|
|
199
|
-
if ok {
|
|
200
|
-
s.smtpServerAddrPort = smtpServerAddrPort
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
sender, ok := c.GetPostForm("sender")
|
|
204
|
-
if ok {
|
|
205
|
-
s.sender = sender
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
receiverStr, ok := c.GetPostForm("receiver")
|
|
209
|
-
if ok {
|
|
210
|
-
receivers := strings.Fields(receiverStr)
|
|
211
|
-
s.receiver = receivers
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
configModule := MaoCommon.ServiceRegistryGetConfigModule()
|
|
215
|
-
if configModule == nil {
|
|
216
|
-
util.MaoLogM(util.WARN, MODULE_NAME, "Fail to get config module instance, can't save email info")
|
|
217
|
-
} else {
|
|
218
|
-
data := make(map[string]interface{})
|
|
219
|
-
data["username"] = s.username
|
|
220
|
-
data["smtpServerAddrPort"] = s.smtpServerAddrPort
|
|
221
|
-
data["sender"] = s.sender
|
|
222
|
-
data["receiver"] = s.receiver
|
|
223
|
-
|
|
224
|
-
// Attention: password can't be outputted !!!
|
|
225
|
-
configModule.PutConfig(EMAIL_INFO_CONFIG_PATH, data)
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
s.showEmailPage(c)
|
|
229
|
-
}
|
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
package GrpcKa
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
MaoApi "MaoServerDiscovery/cmd/api"
|
|
5
|
-
"MaoServerDiscovery/cmd/lib/MaoCommon"
|
|
6
|
-
pb "MaoServerDiscovery/grpc.maojianwei.com/server/discovery/api"
|
|
7
|
-
"MaoServerDiscovery/util"
|
|
8
|
-
"errors"
|
|
9
|
-
"fmt"
|
|
10
|
-
"google.golang.org/grpc"
|
|
11
|
-
"google.golang.org/grpc/peer"
|
|
12
|
-
"net"
|
|
13
|
-
"sort"
|
|
14
|
-
"sync"
|
|
15
|
-
"time"
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
const (
|
|
19
|
-
MODULE_NAME = "GRPC-Detect-module"
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
type GrpcDetectModule struct {
|
|
23
|
-
serverInfo sync.Map
|
|
24
|
-
mergeChannel chan *MaoApi.GrpcServiceNode
|
|
25
|
-
rttMergeChannel chan *MaoApi.GrpcServiceNode
|
|
26
|
-
|
|
27
|
-
server *grpc.Server
|
|
28
|
-
pb.UnimplementedMaoServerDiscoveryServer
|
|
29
|
-
|
|
30
|
-
checkInterval uint32 // milliseconds
|
|
31
|
-
leaveTimeout uint32 // milliseconds
|
|
32
|
-
refreshShowingInterval uint32 // milliseconds
|
|
33
|
-
|
|
34
|
-
// used for web showing, i.e. external get operation
|
|
35
|
-
// used for processing aux data
|
|
36
|
-
serverInfoMirror []*MaoApi.GrpcServiceNode
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// implement pb.UnimplementedMaoServerDiscoveryServer
|
|
40
|
-
func (g *GrpcDetectModule) Report(reportStream pb.MaoServerDiscovery_ReportServer) error {
|
|
41
|
-
util.MaoLogM(util.DEBUG, MODULE_NAME, "Triggered new report session")
|
|
42
|
-
ctx := reportStream.Context()
|
|
43
|
-
peerCtx, okbool := peer.FromContext(ctx)
|
|
44
|
-
if !okbool {
|
|
45
|
-
util.MaoLogM(util.WARN, MODULE_NAME, "Fail to get peerCtx, @Report")
|
|
46
|
-
return errors.New("Fail to get peerCtx, @Report")
|
|
47
|
-
}
|
|
48
|
-
//peerMetadata, okbool := metadata.FromIncomingContext(ctx)
|
|
49
|
-
//if !okbool {
|
|
50
|
-
// util.MaoLogM(util.WARN, MODULE_NAME, "Fail to get peerMetadata")
|
|
51
|
-
// return errors.New("Fail to get peerMetadata")
|
|
52
|
-
//}
|
|
53
|
-
//transportstream := grpc.ServerTransportStreamFromContext(ctx)
|
|
54
|
-
|
|
55
|
-
util.MaoLogM(util.INFO, MODULE_NAME, "New server comming: %s", peerCtx.Addr.String())
|
|
56
|
-
_ = g.dealRecv(reportStream)
|
|
57
|
-
return nil
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
func (g *GrpcDetectModule) dealRecv(reportStream pb.MaoServerDiscovery_ReportServer) error {
|
|
61
|
-
ctx := reportStream.Context()
|
|
62
|
-
peerCtx, okbool := peer.FromContext(ctx)
|
|
63
|
-
var clientAddr string
|
|
64
|
-
if !okbool {
|
|
65
|
-
clientAddr = "Client-<unknown>"
|
|
66
|
-
}
|
|
67
|
-
clientAddr = peerCtx.Addr.String()
|
|
68
|
-
|
|
69
|
-
var count uint64 = 1
|
|
70
|
-
for {
|
|
71
|
-
report, err := reportStream.Recv()
|
|
72
|
-
if err != nil {
|
|
73
|
-
util.MaoLogM(util.ERROR, MODULE_NAME, "Report err: <%s> %s", clientAddr, err)
|
|
74
|
-
return err
|
|
75
|
-
}
|
|
76
|
-
util.MaoLogM(util.DEBUG, MODULE_NAME, "Report get: <%s> %s, %v", clientAddr, report.GetHostname(), report.GetIps())
|
|
77
|
-
if report.GetOk() {
|
|
78
|
-
g.mergeChannel <- &MaoApi.GrpcServiceNode{
|
|
79
|
-
ReportTimes: count,
|
|
80
|
-
Hostname: report.GetHostname(),
|
|
81
|
-
Ips: report.GetIps(),
|
|
82
|
-
ServerDateTime: report.GetNowDatetime(),
|
|
83
|
-
OtherData: report.GetAuxData(),
|
|
84
|
-
RealClientAddr: clientAddr,
|
|
85
|
-
LocalLastSeen: time.Now(),
|
|
86
|
-
Alive: true,
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
count++
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
func (g *GrpcDetectModule) RttMeasure(rttMeasureStream pb.MaoServerDiscovery_RttMeasureServer) error {
|
|
95
|
-
util.MaoLogM(util.DEBUG, MODULE_NAME, "Triggered new RTT measure session")
|
|
96
|
-
ctx := rttMeasureStream.Context()
|
|
97
|
-
peerCtx, okbool := peer.FromContext(ctx)
|
|
98
|
-
if !okbool {
|
|
99
|
-
util.MaoLogM(util.WARN, MODULE_NAME, "Fail to get peerCtx, @RttMeasure")
|
|
100
|
-
return errors.New("Fail to get peerCtx, @RttMeasure")
|
|
101
|
-
}
|
|
102
|
-
//peerMetadata, okbool := metadata.FromIncomingContext(ctx)
|
|
103
|
-
//transportstream := grpc.ServerTransportStreamFromContext(ctx)
|
|
104
|
-
|
|
105
|
-
util.MaoLogM(util.INFO, MODULE_NAME, "New RTT measure session for %s", peerCtx.Addr.String())
|
|
106
|
-
_ = g.doRttMeasure(rttMeasureStream, peerCtx.Addr.String())
|
|
107
|
-
return nil
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
func (g *GrpcDetectModule) doRttMeasure(rttMeasureStream pb.MaoServerDiscovery_RttMeasureServer, clientAddr string) error {
|
|
111
|
-
var count uint64 = 0
|
|
112
|
-
for {
|
|
113
|
-
count++
|
|
114
|
-
|
|
115
|
-
echoRequest := pb.RttEchoRequest{Seq: count}
|
|
116
|
-
t1 := time.Now()
|
|
117
|
-
if err := rttMeasureStream.Send(&echoRequest); err != nil {
|
|
118
|
-
util.MaoLogM(util.ERROR, MODULE_NAME, "Fail to send Rtt echo request to %s, %s", clientAddr, err)
|
|
119
|
-
return err
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// gRPC is based on TCP now, so we don't need to do timeout setting.
|
|
123
|
-
// And, if the TCP connection broke, Recv() will return with error.
|
|
124
|
-
echoResponse, err := rttMeasureStream.Recv()
|
|
125
|
-
if err != nil {
|
|
126
|
-
util.MaoLogM(util.ERROR, MODULE_NAME, "Fail to recv Rtt echo response from %s, %s", clientAddr, err)
|
|
127
|
-
return err
|
|
128
|
-
}
|
|
129
|
-
t2 := time.Now()
|
|
130
|
-
if echoResponse.Ack == echoRequest.Seq {
|
|
131
|
-
duration := t2.Sub(t1) // nanosecond
|
|
132
|
-
g.rttMergeChannel <- &MaoApi.GrpcServiceNode{
|
|
133
|
-
Hostname: echoResponse.GetHostname(),
|
|
134
|
-
RttDuration: duration,
|
|
135
|
-
}
|
|
136
|
-
util.MaoLogM(util.DEBUG, MODULE_NAME, "Calculated RTT delay %s for %s", duration.String(), echoResponse.GetHostname())
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
time.Sleep(1 * time.Second)
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
func (g *GrpcDetectModule) runGrpcServer(listener net.Listener) {
|
|
144
|
-
util.MaoLogM(util.INFO, MODULE_NAME, "Server running %s ...", listener.Addr().String())
|
|
145
|
-
if err := g.server.Serve(listener); err != nil {
|
|
146
|
-
util.MaoLogM(util.ERROR, MODULE_NAME, "%s", err)
|
|
147
|
-
}
|
|
148
|
-
util.MaoLogM(util.INFO, MODULE_NAME, "Serve over")
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
func (g *GrpcDetectModule) controlLoop() {
|
|
155
|
-
checkTimer := time.NewTimer(time.Duration(g.checkInterval) * time.Millisecond)
|
|
156
|
-
for {
|
|
157
|
-
select {
|
|
158
|
-
case serverNode := <-g.rttMergeChannel:
|
|
159
|
-
value, ok := g.serverInfo.Load(serverNode.Hostname)
|
|
160
|
-
if ok && value != nil {
|
|
161
|
-
server := value.(*MaoApi.GrpcServiceNode)
|
|
162
|
-
server.RttDuration = serverNode.RttDuration
|
|
163
|
-
}
|
|
164
|
-
case serverNode := <-g.mergeChannel:
|
|
165
|
-
value, ok := g.serverInfo.Load(serverNode.Hostname)
|
|
166
|
-
if ok && value != nil {
|
|
167
|
-
server := value.(*MaoApi.GrpcServiceNode)
|
|
168
|
-
if !server.Alive && serverNode.Alive {
|
|
169
|
-
emailModule := MaoCommon.ServiceRegistryGetEmailModule()
|
|
170
|
-
if emailModule == nil {
|
|
171
|
-
util.MaoLogM(util.WARN, MODULE_NAME, "Fail to get EmailModule, can't send UP notification")
|
|
172
|
-
} else {
|
|
173
|
-
emailModule.SendEmail(&MaoApi.EmailMessage{
|
|
174
|
-
Subject: "Grpc UP notification",
|
|
175
|
-
Content: fmt.Sprintf("Service: %s\r\nUp Time: %s\r\nDetail: %v\r\n",
|
|
176
|
-
serverNode.Hostname, time.Now().String(), serverNode),
|
|
177
|
-
})
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
server.ReportTimes = serverNode.ReportTimes
|
|
181
|
-
server.Hostname = serverNode.Hostname
|
|
182
|
-
server.Ips = serverNode.Ips
|
|
183
|
-
server.ServerDateTime = serverNode.ServerDateTime
|
|
184
|
-
server.OtherData = serverNode.OtherData
|
|
185
|
-
server.RealClientAddr = serverNode.RealClientAddr
|
|
186
|
-
server.LocalLastSeen = serverNode.LocalLastSeen
|
|
187
|
-
server.Alive = serverNode.Alive
|
|
188
|
-
} else {
|
|
189
|
-
// Attention, serverNode instance is not created always. 2023.07.24
|
|
190
|
-
// TODO: other place may need to be check.
|
|
191
|
-
g.serverInfo.Store(serverNode.Hostname, serverNode)
|
|
192
|
-
}
|
|
193
|
-
case <-checkTimer.C:
|
|
194
|
-
// aliveness checking
|
|
195
|
-
g.serverInfo.Range(func(key, value interface{}) bool {
|
|
196
|
-
service := value.(*MaoApi.GrpcServiceNode)
|
|
197
|
-
if service.Alive && time.Since(service.LocalLastSeen) > time.Duration(g.leaveTimeout) * time.Millisecond {
|
|
198
|
-
service.Alive = false
|
|
199
|
-
g.mergeChannel <- service
|
|
200
|
-
|
|
201
|
-
emailModule := MaoCommon.ServiceRegistryGetEmailModule()
|
|
202
|
-
if emailModule == nil {
|
|
203
|
-
util.MaoLogM(util.WARN, MODULE_NAME, "Fail to get EmailModule, can't send DOWN notification")
|
|
204
|
-
} else {
|
|
205
|
-
emailModule.SendEmail(&MaoApi.EmailMessage{
|
|
206
|
-
Subject: "Grpc DOWN notification",
|
|
207
|
-
Content: fmt.Sprintf("Service: %s\r\nDOWN Time: %s\r\nDetail: %v\r\n",
|
|
208
|
-
service.Hostname, time.Now().String(), service),
|
|
209
|
-
})
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
return true
|
|
213
|
-
})
|
|
214
|
-
checkTimer.Reset(time.Duration(g.checkInterval) * time.Millisecond)
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
func (g *GrpcDetectModule) refreshShowingService() {
|
|
222
|
-
for {
|
|
223
|
-
time.Sleep(time.Duration(g.refreshShowingInterval) * time.Millisecond)
|
|
224
|
-
serversTmp := make([]*MaoApi.GrpcServiceNode, 0)
|
|
225
|
-
g.serverInfo.Range(func(_, value interface{}) bool {
|
|
226
|
-
serversTmp = append(serversTmp, value.(*MaoApi.GrpcServiceNode))
|
|
227
|
-
return true
|
|
228
|
-
})
|
|
229
|
-
g.serverInfoMirror = serversTmp
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
func (g *GrpcDetectModule) GetServiceInfo() []*MaoApi.GrpcServiceNode {
|
|
234
|
-
servers := g.serverInfoMirror
|
|
235
|
-
sort.Slice(servers, func(i, j int) bool {
|
|
236
|
-
return servers[i].Hostname < servers[j].Hostname
|
|
237
|
-
})
|
|
238
|
-
return servers
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
func (g *GrpcDetectModule) InitGrpcModule(addrPort string) bool {
|
|
244
|
-
g.mergeChannel = make(chan *MaoApi.GrpcServiceNode, 1024)
|
|
245
|
-
g.rttMergeChannel = make(chan *MaoApi.GrpcServiceNode, 1024)
|
|
246
|
-
|
|
247
|
-
g.checkInterval = 500
|
|
248
|
-
g.leaveTimeout = 5000
|
|
249
|
-
g.refreshShowingInterval = 1000
|
|
250
|
-
g.serverInfoMirror = make([]*MaoApi.GrpcServiceNode, 0)
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
listener, err := net.Listen("tcp", addrPort)
|
|
254
|
-
if err != nil {
|
|
255
|
-
util.MaoLogM(util.WARN, MODULE_NAME, "Fail to create listener at %s, err: %s", addrPort, err.Error())
|
|
256
|
-
return false
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
g.server = grpc.NewServer()
|
|
260
|
-
pb.RegisterMaoServerDiscoveryServer(g.server, g)
|
|
261
|
-
go g.runGrpcServer(listener)
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
go g.controlLoop()
|
|
265
|
-
go g.refreshShowingService()
|
|
266
|
-
|
|
267
|
-
return true
|
|
268
|
-
}
|
|
269
|
-
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
package GrpcKa
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
MaoApi "MaoServerDiscovery/cmd/api"
|
|
5
|
-
"fmt"
|
|
6
|
-
"log"
|
|
7
|
-
"testing"
|
|
8
|
-
"time"
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
func TestGrpcDetectModule_GetServiceInfo(t *testing.T) {
|
|
12
|
-
serverNode := &MaoApi.GrpcServiceNode{
|
|
13
|
-
ReportTimes: 666,
|
|
14
|
-
Hostname: "qingdao-hostname",
|
|
15
|
-
Ips: nil,
|
|
16
|
-
ServerDateTime: time.Now().String(),
|
|
17
|
-
OtherData: "OtherDataOtherData",
|
|
18
|
-
RealClientAddr: "1.1.1.1",
|
|
19
|
-
LocalLastSeen: time.Now(),
|
|
20
|
-
Alive: true,
|
|
21
|
-
}
|
|
22
|
-
s := fmt.Sprintf("Service: %s\r\nUp Time: %s\r\nDetail: %v\r\n",
|
|
23
|
-
serverNode.Hostname, time.Now().String(), serverNode)
|
|
24
|
-
|
|
25
|
-
log.Println(s)
|
|
26
|
-
}
|